21 #define DEBUG_TYPE "thumb2-it"
23 STATISTIC(NumITs,
"Number of IT blocks inserted");
24 STATISTIC(NumMovedInsts,
"Number of predicated instructions moved");
39 const char *getPassName()
const override {
40 return "Thumb IT blocks insertion pass";
68 if (!Reg || Reg == ARM::ITSTATE || Reg == ARM::SP)
76 for (
unsigned i = 0, e = LocalUses.
size(); i != e; ++i) {
77 unsigned Reg = LocalUses[i];
83 for (
unsigned i = 0, e = LocalDefs.
size(); i != e; ++i) {
84 unsigned Reg = LocalDefs[i];
98 if (!MO.isReg() || MO.isDef() || !MO.isKill())
100 if (!Uses.
count(MO.getReg()))
130 "Sub-register indices still around?");
164 while (I != E && I->isDebugValue())
167 unsigned NPredReg = 0;
169 if (NCC == CC || NCC == OCC)
176 bool Modified =
false;
184 unsigned PredReg = 0;
209 unsigned Mask = 0, Pos = 3;
216 for (; MBBI != E && Pos &&
218 if (MBBI->isDebugValue())
224 unsigned NPredReg = 0;
226 if (NCC == CC || NCC == OCC) {
227 Mask |= (NCC & 1) << Pos;
234 MoveCopyOutOfITBlock(NMI, CC, OCC, Defs, Uses)) {
237 MBB.
insert(InsertPos, NMI);
252 Mask |= (CC & 1) << 4;
279 if (!AFI->isThumbFunction())
282 bool Modified =
false;
286 Modified |= InsertITInstructions(MBB);
290 AFI->setHasITBlocks(
true);
298 return new Thumb2ITBlockPass();
void push_back(const T &Elt)
static bool isCopy(MachineInstr *MI)
bool isBranch(QueryType Type=AnyInBundle) const
Returns true if this is a conditional, unconditional, or indirect branch.
STATISTIC(NumFunctions,"Total number of functions")
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
Describe properties that are true of each instruction in the target description file.
MachineOperand * findRegisterUseOperand(unsigned Reg, bool isKill=false, const TargetRegisterInfo *TRI=nullptr)
Wrapper for findRegisterUseOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
static void ClearKillFlags(MachineInstr *MI, SmallSet< unsigned, 4 > &Uses)
Clear kill flags for any uses in the given set.
Instructions::iterator instr_iterator
iterator_range< mop_iterator > operands()
ARMCC::CondCodes getITInstrPredicate(const MachineInstr *MI, unsigned &PredReg)
getITInstrPredicate - Valid only in Thumb2 mode.
const ARMBaseInstrInfo * getInstrInfo() const override
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const HexagonInstrInfo * TII
static MachineOperand CreateReg(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Reg
All possible values of the reg field in the ModR/M byte.
const MachineInstrBuilder & addImm(int64_t Val) const
addImm - Add a new immediate operand.
unsigned getNumOperands() const
Access to explicit operands of the instruction.
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
bundle_iterator< MachineInstr, instr_iterator > iterator
bool isReturn(QueryType Type=AnyInBundle) const
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
const MachineOperand & getOperand(unsigned i) const
static void TrackDefUses(MachineInstr *MI, SmallSet< unsigned, 4 > &Defs, SmallSet< unsigned, 4 > &Uses, const TargetRegisterInfo *TRI)
TrackDefUses - Tracking what registers are being defined and used by instructions in the IT block...
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
FunctionPass class - This class is used to implement most global optimizations.
std::pair< NoneType, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
BuildMI - Builder interface.
unsigned getSubReg() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
MCSubRegIterator enumerates all sub-registers of Reg.
void setIsKill(bool Val=true)
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
MachineOperand class - Representation of each machine instruction operand.
MachineInstr * remove(MachineInstr *I)
Remove the unbundled instruction from the instruction list without deleting it.
static unsigned getReg(const void *D, unsigned RC, unsigned RegNo)
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
Representation of each machine instruction.
static CondCodes getOppositeCondition(CondCodes CC)
ARMFunctionInfo - This class is derived from MachineFunctionInfo and contains private ARM-specific in...
const ARMBaseRegisterInfo * getRegisterInfo() const override
unsigned getReg() const
getReg - Returns the register number.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
BasicBlockListType::iterator iterator
FunctionPass * createThumb2ITBlockPass()
createThumb2ITBlockPass - Returns an instance of the Thumb2 IT blocks insertion pass.
bool hasOptionalDef(QueryType Type=IgnoreBundle) const
Set if this instruction has an optional definition, e.g.
void finalizeBundle(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
finalizeBundle - Finalize a machine instruction bundle which includes a sequence of instructions star...
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly. ...