31#define DEBUG_TYPE "thumb2-it"
32#define PASS_NAME "Thumb IT blocks insertion pass"
35STATISTIC(NumMovedInsts,
"Number of predicated instructions moved");
65 RegisterSet &Defs, RegisterSet &
Uses);
69 char Thumb2ITBlock::ID = 0;
84 for (
auto &MO :
MI->operands()) {
87 Register Reg = MO.getReg();
88 if (!Reg || Reg == ARM::ITSTATE || Reg == ARM::SP)
91 LocalUses.push_back(Reg);
93 LocalDefs.push_back(Reg);
96 auto InsertUsesDefs = [&](RegList &Regs, RegisterSet &UsesDefs) {
97 for (unsigned Reg : Regs)
98 UsesDefs.insert_range(TRI->subregs_inclusive(Reg));
101 InsertUsesDefs(LocalDefs, Defs);
102 InsertUsesDefs(LocalUses,
Uses);
110 if (!MO.isReg() || MO.isDef() || !MO.isKill())
112 if (!
Uses.count(MO.getReg()))
119 switch (
MI->getOpcode()) {
133 RegisterSet &Defs, RegisterSet &
Uses) {
139 assert(
MI->getOperand(0).getSubReg() == 0 &&
140 MI->getOperand(1).getSubReg() == 0 &&
141 "Sub-register indices still around?");
147 if (
Uses.count(DstReg) || Defs.count(SrcReg))
166 const MCInstrDesc &MCID =
MI->getDesc();
167 if (
MI->hasOptionalDef() &&
177 while (
I !=
E &&
I->isDebugInstr())
183 if (NCC == CC || NCC == OCC)
189bool Thumb2ITBlock::InsertITInstructions(MachineBasicBlock &
MBB) {
195 MachineInstr *
MI = &*
MBBI;
216 MachineInstr *LastITMI =
MI;
222 unsigned Mask = 0, Pos = 3;
230 for (;
MBBI !=
E && Pos &&
231 (!
MI->isBranch() && !
MI->isReturn()) ; ++
MBBI) {
232 if (
MBBI->isDebugInstr())
235 MachineInstr *NMI = &*
MBBI;
240 if (NCC == CC || NCC == OCC) {
241 Mask |= ((NCC ^ CC) & 1) << Pos;
248 MoveCopyOutOfITBlock(NMI, CC, OCC, Defs,
Uses)) {
282bool Thumb2ITBlock::runOnMachineFunction(MachineFunction &Fn) {
283 const ARMSubtarget &STI = Fn.
getSubtarget<ARMSubtarget>();
286 AFI = Fn.
getInfo<ARMFunctionInfo>();
295 for (
auto &
MBB : Fn )
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Remove Loads Into Fake Uses
This file defines the SmallSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
SmallSet< unsigned, 4 > RegisterSet
static bool isCopy(MachineInstr *MI)
static void ClearKillFlags(MachineInstr *MI, RegisterSet &Uses)
Clear kill flags for any uses in the given set.
static void TrackDefUses(MachineInstr *MI, RegisterSet &Defs, RegisterSet &Uses, const TargetRegisterInfo *TRI)
TrackDefUses - Tracking what registers are being defined and used by instructions in the IT block.
ARMFunctionInfo - This class is derived from MachineFunctionInfo and contains private ARM-specific in...
void setHasITBlocks(bool h)
bool isThumbFunction() const
const ARMBaseInstrInfo * getInstrInfo() const override
const ARMBaseRegisterInfo * getRegisterInfo() const override
FunctionPass class - This class is used to implement most global optimizations.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
MachineInstr * remove(MachineInstr *I)
Remove the unbundled instruction from the instruction list without deleting it.
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
Properties which a MachineFunction may have at a given point in time.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
instr_iterator getInstrIterator() const
Representation of each machine instruction.
LLVM_ABI void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
MachineOperand * findRegisterUseOperand(Register Reg, const TargetRegisterInfo *TRI, bool isKill=false)
Wrapper for findRegisterUseOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
MachineOperand class - Representation of each machine instruction operand.
void setIsKill(bool Val=true)
static MachineOperand CreateReg(Register 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 isRenamable=false)
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.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
self_iterator getIterator()
static CondCodes getOppositeCondition(CondCodes CC)
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI 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...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
ARMCC::CondCodes getITInstrPredicate(const MachineInstr &MI, Register &PredReg)
getITInstrPredicate - Valid only in Thumb2 mode.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionPass * createThumb2ITBlockPass()
createThumb2ITBlockPass - Returns an instance of the Thumb2 IT blocks insertion pass.