57#define DEBUG_TYPE "init-undef"
58#define INIT_UNDEF_NAME "Init Undef Pass"
96char InitUndef::ID = 0;
102 return DefMO.isReg() && DefMO.isEarlyClobber();
107 for (
auto &
DefMI :
MRI->def_instructions(Reg)) {
108 if (
DefMI.getOpcode() == TargetOpcode::IMPLICIT_DEF)
115 bool Changed =
false;
116 for (
auto &UseMO :
MI->uses()) {
121 if (!UseMO.getReg().isVirtual())
123 if (!
TRI->doesRegClassHavePseudoInitUndef(
MRI->getRegClass(UseMO.getReg())))
127 Changed |= fixupIllOperand(
MI, UseMO);
134 bool Changed =
false;
139 if (!UseMO.getReg().isVirtual())
143 if (!
TRI->doesRegClassHavePseudoInitUndef(
MRI->getRegClass(UseMO.getReg())))
147 if (NewRegs.count(Reg))
152 if (
Info.UsedLanes ==
Info.DefinedLanes)
156 TRI->getLargestSuperClass(
MRI->getRegClass(Reg));
161 dbgs() <<
"Instruction has undef subregister.\n";
169 TRI->getCoveringSubRegIndexes(*
MRI, TargetRegClass, NeedDef,
170 SubRegIndexNeedInsert);
173 for (
auto ind : SubRegIndexNeedInsert) {
176 TRI->getSubRegisterClass(TargetRegClass, ind));
177 Register TmpInitSubReg =
MRI->createVirtualRegister(SubRegClass);
180 TII->get(
TII->getUndefInitOpcode(SubRegClass->
getID())),
182 Register NewReg =
MRI->createVirtualRegister(TargetRegClass);
184 TII->get(TargetOpcode::INSERT_SUBREG), NewReg)
191 UseMO.setReg(LatestReg);
200 dbgs() <<
"Emitting PseudoInitUndef Instruction for implicit register "
204 TRI->getLargestSuperClass(
MRI->getRegClass(MO.
getReg()));
206 unsigned Opcode =
TII->getUndefInitOpcode(TargetRegClass->
getID());
207 Register NewReg =
MRI->createVirtualRegister(TargetRegClass);
217 bool Changed =
false;
224 if (
MI.getNumDefs() != 0 &&
MI.isRegTiedToUseOperand(0, &UseOpIdx)) {
228 TII->getRegClass(
MI.getDesc(), UseOpIdx,
TRI, MF);
232 NewRegs.insert(NewDest);
233 BuildMI(
MBB,
I,
I->getDebugLoc(),
TII->get(TargetOpcode::IMPLICIT_DEF),
241 if (
MRI->subRegLivenessEnabled())
242 Changed |= handleSubReg(MF,
MI, DLD);
243 Changed |= handleReg(&
MI);
258 if (!
ST->supportsInitUndef())
262 TII =
ST->getInstrInfo();
263 TRI =
MRI->getTargetRegisterInfo();
265 bool Changed =
false;
270 Changed |= processBasicBlock(MF, BB, DLD);
272 for (
auto *DeadMI : DeadInsts)
273 DeadMI->eraseFromParent();
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:
void computeSubRegisterLaneBitInfo()
Update the DefinedLanes and the UsedLanes for all virtual registers.
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...