LLVM: lib/CodeGen/InitUndef.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
54
55using namespace llvm;
56
57#define DEBUG_TYPE "init-undef"
58#define INIT_UNDEF_NAME "Init Undef Pass"
59
60namespace {
61
67
68
71
72public:
73 static char ID;
74
77
81 }
82
84
85private:
92};
93
94}
95
96char InitUndef::ID = 0;
99
102 return DefMO.isReg() && DefMO.isEarlyClobber();
103 });
104}
105
107 for (auto &DefMI : MRI->def_instructions(Reg)) {
108 if (DefMI.getOpcode() == TargetOpcode::IMPLICIT_DEF)
109 return true;
110 }
111 return false;
112}
113
115 bool Changed = false;
116 for (auto &UseMO : MI->uses()) {
117 if (!UseMO.isReg())
118 continue;
119 if (UseMO.isTied())
120 continue;
121 if (!UseMO.getReg().isVirtual())
122 continue;
123
125 Changed |= fixupIllOperand(MI, UseMO);
126 }
127 return Changed;
128}
129
132 bool Changed = false;
133
135 if (!UseMO.isReg())
136 continue;
137 if (!UseMO.getReg().isVirtual())
138 continue;
139 if (UseMO.isTied())
140 continue;
141
143 if (NewRegs.count(Reg))
144 continue;
147
148 if (Info.UsedLanes == Info.DefinedLanes)
149 continue;
150
152
153 LaneBitmask NeedDef = Info.UsedLanes & ~Info.DefinedLanes;
154
156 dbgs() << "Instruction has undef subregister.\n";
160 << " Need Def: " << PrintLaneMask(NeedDef) << "\n";
161 });
162
164 TRI->getCoveringSubRegIndexes(TargetRegClass, NeedDef,
165 SubRegIndexNeedInsert);
166
167
168
169
170 if (any_of(SubRegIndexNeedInsert, [&](unsigned Ind) -> bool {
171 return ->getSubRegisterClass(TargetRegClass, Ind);
172 }))
173 continue;
174
176 for (auto ind : SubRegIndexNeedInsert) {
177 Changed = true;
179 TRI->getSubRegisterClass(TargetRegClass, ind);
180 Register TmpInitSubReg = MRI->createVirtualRegister(SubRegClass);
181 LLVM_DEBUG(dbgs() << "Register Class ID" << SubRegClass->getID() << "\n");
183 TII->get(TargetOpcode::INIT_UNDEF), TmpInitSubReg);
184 Register NewReg = MRI->createVirtualRegister(TargetRegClass);
186 TII->get(TargetOpcode::INSERT_SUBREG), NewReg)
188 .addReg(TmpInitSubReg)
190 LatestReg = NewReg;
191 }
192
193 UseMO.setReg(LatestReg);
194 }
195
196 return Changed;
197}
198
200
202 dbgs() << "Emitting PseudoInitUndef Instruction for implicit register "
204
206 LLVM_DEBUG(dbgs() << "Register Class ID" << TargetRegClass->getID() << "\n");
207 Register NewReg = MRI->createVirtualRegister(TargetRegClass);
209 TII->get(TargetOpcode::INIT_UNDEF), NewReg);
213 return true;
214}
215
218 bool Changed = false;
221
222
223
224 unsigned UseOpIdx;
225 if (MI.getNumDefs() != 0 && MI.isRegTiedToUseOperand(0, &UseOpIdx)) {
229 TII->getRegClass(MI.getDesc(), UseOpIdx, TRI, MF);
230 Register NewDest = MRI->createVirtualRegister(RC);
231
232
233 NewRegs.insert(NewDest);
234 BuildMI(MBB, I, I->getDebugLoc(), TII->get(TargetOpcode::IMPLICIT_DEF),
235 NewDest);
236 UseMO.setReg(NewDest);
237 Changed = true;
238 }
239 }
240
242 if (MRI->subRegLivenessEnabled())
243 Changed |= handleSubReg(MF, MI, *DLD);
244 Changed |= handleReg(&MI);
245 }
246 }
247 return Changed;
248}
249
250bool InitUndef::runOnMachineFunction(MachineFunction &MF) {
252
253
254
255 if (->requiresDisjointEarlyClobberAndUndef())
256 return false;
257
260 TRI = MRI->getTargetRegisterInfo();
261
262 bool Changed = false;
263 std::unique_ptr DLD;
264 if (MRI->subRegLivenessEnabled()) {
265 DLD = std::make_unique(MRI, TRI);
266 DLD->computeSubRegisterLaneBitInfo();
267 }
268
270 Changed |= processBasicBlock(MF, BB, DLD.get());
271
272 for (auto *DeadMI : DeadInsts)
273 DeadMI->eraseFromParent();
274 DeadInsts.clear();
275 NewRegs.clear();
276
277 return Changed;
278}
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder MachineInstrBuilder & DefMI
Analysis containing CSE Info
Analysis that tracks defined/used subregister lanes across COPY instructions and instructions that ge...
const HexagonInstrInfo * TII
static bool isEarlyClobberMI(MachineInstr &MI)
static bool findImplictDefMIFromReg(Register Reg, MachineRegisterInfo *MRI)
unsigned const TargetRegisterInfo * TRI
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file defines the SmallSet class.
This file defines the SmallVector class.
Represent the analysis usage information of a pass.
void setPreservesCFG()
This function should be called by the pass, iff they do not:
const VRegInfo & getVRegInfo(unsigned RegIdx) const
static constexpr unsigned NoRegister
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsUndef(bool Val=true)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
Wrapper class representing virtual and physical registers.
static unsigned virtReg2Index(Register Reg)
Convert a virtual register number to a 0-based index.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
TargetInstrInfo - Interface to description of machine instruction set.
unsigned getID() const
Return the register class ID number.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Reg
All possible values of the reg field in the ModR/M byte.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
Contains a bitmask of which lanes of a given virtual register are defined and which ones are actually...