44#define DEBUG_TYPE "aarch64-ccmp"
50 cl::desc(
"Maximum number of instructions per speculated block."));
56STATISTIC(NumConsidered,
"Number of ccmps considered");
57STATISTIC(NumPhiRejs,
"Number of ccmps rejected (PHI)");
58STATISTIC(NumPhysRejs,
"Number of ccmps rejected (Physregs)");
59STATISTIC(NumPhi2Rejs,
"Number of ccmps rejected (PHI2)");
60STATISTIC(NumHeadBranchRejs,
"Number of ccmps rejected (Head branch)");
61STATISTIC(NumCmpBranchRejs,
"Number of ccmps rejected (CmpBB branch)");
62STATISTIC(NumCmpTermRejs,
"Number of ccmps rejected (CmpBB is cbz...)");
63STATISTIC(NumImmRangeRejs,
"Number of ccmps rejected (Imm out of range)");
65 "Number of ccmps rejected (Folded zero- or sign-extension)");
66STATISTIC(NumLiveDstRejs,
"Number of ccmps rejected (Cmp dest live)");
67STATISTIC(NumMultNZCVUses,
"Number of ccmps rejected (NZCV used)");
68STATISTIC(NumUnknNZCVDefs,
"Number of ccmps rejected (NZCV def unknown)");
70STATISTIC(NumSpeculateRejs,
"Number of ccmps rejected (Can't speculate)");
72STATISTIC(NumConverted,
"Number of ccmp instructions created");
73STATISTIC(NumCompBranches,
"Number of cb/cbz/cbnz branches converted");
176 bool trivialTailPHIs();
179 void updateTailPHIs();
182 bool isDeadDef(
unsigned DstReg);
206 bool canConvert(MachineBasicBlock *
MBB);
210 void convert(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks);
214 int expectedCodeSizeDelta()
const;
221 MI->getOpcode() == TargetOpcode::COPY) {
222 if (
MI->getOperand(1).getReg().isPhysical())
224 Reg =
MI->getOperand(1).getReg();
231bool SSACCmpConv::trivialTailPHIs() {
232 for (
auto &
I : *Tail) {
235 unsigned HeadReg = 0, CmpBBReg = 0;
237 for (
unsigned oi = 1, oe =
I.getNumOperands(); oi != oe; oi += 2) {
238 MachineBasicBlock *
MBB =
I.getOperand(oi + 1).getMBB();
241 assert((!HeadReg || HeadReg ==
Reg) &&
"Inconsistent PHI operands");
245 assert((!CmpBBReg || CmpBBReg ==
Reg) &&
"Inconsistent PHI operands");
249 if (HeadReg != CmpBBReg)
257void SSACCmpConv::updateTailPHIs() {
258 for (
auto &
I : *Tail) {
262 for (
unsigned oi =
I.getNumOperands(); oi > 2; oi -= 2) {
264 if (
I.getOperand(oi - 1).getMBB() == CmpBB) {
265 I.removeOperand(oi - 1);
266 I.removeOperand(oi - 2);
274bool SSACCmpConv::isDeadDef(
unsigned DstReg) {
276 if (DstReg == AArch64::WZR || DstReg == AArch64::XZR)
278 if (!Register::isVirtualRegister(DstReg))
291 assert(
Cond.size() == 1 &&
"Unknown Cond array format");
303 assert(
Cond.size() == 3 &&
"Unknown Cond array format");
308 assert(
Cond.size() == 3 &&
"Unknown Cond array format");
313 case AArch64::CBWPri:
314 case AArch64::CBXPri:
315 case AArch64::CBWPrr:
316 case AArch64::CBXPrr:
317 assert(
Cond.size() == 5 &&
"Unknown Cond array format");
323 case AArch64::CBBAssertExt:
324 case AArch64::CBHAssertExt:
325 assert(
Cond.size() == 7 &&
"Unknown Cond array format");
332MachineInstr *SSACCmpConv::findConvertibleCompare(MachineBasicBlock *
MBB) {
337 if (!
I->readsRegister(AArch64::NZCV,
nullptr)) {
338 switch (
I->getOpcode()) {
345 case AArch64::CBWPrr:
346 case AArch64::CBXPrr:
350 case AArch64::CBWPri:
351 case AArch64::CBXPri: {
352 assert(
I->getOperand(2).isImm() &&
"Expected immediate operand");
362 case AArch64::CBBAssertExt:
363 case AArch64::CBHAssertExt: {
364 assert(
I->getOperand(4).isImm() &&
"Expected immediate operand");
365 assert(
I->getOperand(5).isImm() &&
"Expected immediate operand");
368 LLVM_DEBUG(
dbgs() <<
"Folded extend can't be folded into ccmp: " << *
I);
383 assert(!
I->isTerminator() &&
"Spurious terminator");
384 switch (
I->getOpcode()) {
386 case AArch64::SUBSWri:
387 case AArch64::SUBSXri:
389 case AArch64::ADDSWri:
390 case AArch64::ADDSXri:
393 if (
I->getOperand(3).getImm() || !
isUInt<5>(
I->getOperand(2).getImm())) {
399 case AArch64::SUBSWrr:
400 case AArch64::SUBSXrr:
401 case AArch64::ADDSWrr:
402 case AArch64::ADDSXrr:
403 if (isDeadDef(
I->getOperand(0).getReg()))
405 LLVM_DEBUG(
dbgs() <<
"Can't convert compare with live destination: "
409 case AArch64::FCMPSrr:
410 case AArch64::FCMPDrr:
411 case AArch64::FCMPESrr:
412 case AArch64::FCMPEDrr:
444bool SSACCmpConv::canSpeculateInstrs(MachineBasicBlock *
MBB,
445 const MachineInstr *CmpMI) {
458 if (
I.isDebugInstr())
482 bool DontMoveAcrossStore =
true;
483 if (!
I.isSafeToMove(DontMoveAcrossStore)) {
489 if (&
I != CmpMI &&
I.modifiesRegister(AArch64::NZCV,
TRI)) {
500bool SSACCmpConv::canConvert(MachineBasicBlock *
MBB) {
502 Tail = CmpBB =
nullptr;
506 MachineBasicBlock *Succ0 = Head->
succ_begin()[0];
507 MachineBasicBlock *Succ1 = Head->
succ_begin()[1];
535 if (!trivialTailPHIs()) {
541 if (!
Tail->livein_empty()) {
556 LLVM_DEBUG(
dbgs() <<
"Can't handle live-in physregs in CmpBB.\n");
563 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
574 dbgs() <<
"analyzeBranch didn't find conditional branch in Head.\n");
601 dbgs() <<
"analyzeBranch didn't find conditional branch in CmpBB.\n");
606 if (!
parseCond(CmpBBCond, CmpBBTailCC)) {
617 <<
", CmpBB->Tail on "
620 CmpMI = findConvertibleCompare(CmpBB);
624 if (!canSpeculateInstrs(CmpBB, CmpMI)) {
631void SSACCmpConv::convert(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks) {
660 Head2Tail + Head2CmpBB * CmpBB2Tail);
679 if (HeadCond[0].
getImm() == -1) {
681 TII->insertCmpForCondBr(*Head, Head->
end(), TermDL, HeadCond);
689 unsigned FirstOp = 1;
690 bool isZBranch =
false;
694 case AArch64::SUBSWri:
Opc = AArch64::CCMPWi;
break;
695 case AArch64::SUBSWrr:
Opc = AArch64::CCMPWr;
break;
696 case AArch64::SUBSXri:
Opc = AArch64::CCMPXi;
break;
697 case AArch64::SUBSXrr:
Opc = AArch64::CCMPXr;
break;
698 case AArch64::ADDSWri:
Opc = AArch64::CCMNWi;
break;
699 case AArch64::ADDSWrr:
Opc = AArch64::CCMNWr;
break;
700 case AArch64::ADDSXri:
Opc = AArch64::CCMNXi;
break;
701 case AArch64::ADDSXrr:
Opc = AArch64::CCMNXr;
break;
702 case AArch64::FCMPSrr:
Opc = AArch64::FCCMPSrr; FirstOp = 0;
break;
703 case AArch64::FCMPDrr:
Opc = AArch64::FCCMPDrr; FirstOp = 0;
break;
704 case AArch64::FCMPESrr:
Opc = AArch64::FCCMPESrr; FirstOp = 0;
break;
705 case AArch64::FCMPEDrr:
Opc = AArch64::FCCMPEDrr; FirstOp = 0;
break;
708 Opc = AArch64::CCMPWi;
714 Opc = AArch64::CCMPXi;
718 case AArch64::CBWPri:
719 Opc = AArch64::CCMPWi;
722 case AArch64::CBXPri:
723 Opc = AArch64::CCMPXi;
726 case AArch64::CBWPrr:
727 case AArch64::CBBAssertExt:
728 case AArch64::CBHAssertExt:
729 Opc = AArch64::CCMPWr;
732 case AArch64::CBXPrr:
733 Opc = AArch64::CCMPXr;
744 const MCInstrDesc &MCID =
TII->get(
Opc);
746 TII->getRegClass(MCID, 0));
749 TII->getRegClass(MCID, 1));
773 case AArch64::CBWPri:
774 case AArch64::CBXPri:
775 case AArch64::CBBAssertExt:
776 case AArch64::CBHAssertExt:
777 case AArch64::CBWPrr:
778 case AArch64::CBXPrr:
782 MachineBasicBlock *BrTarget =
TII->getBranchDestBlock(*CmpMI);
795int SSACCmpConv::expectedCodeSizeDelta()
const {
800 if (HeadCond[0].
getImm() == -1) {
801 switch (HeadCond[1].
getImm()) {
806 case AArch64::CBWPri:
807 case AArch64::CBXPri:
808 case AArch64::CBWPrr:
809 case AArch64::CBXPrr:
815 case AArch64::CBBAssertExt:
816 case AArch64::CBHAssertExt:
817 assert(HeadCond[5].isImm() &&
"Expected immediate operand");
836 case AArch64::CBWPri:
837 case AArch64::CBXPri:
838 case AArch64::CBBAssertExt:
839 case AArch64::CBHAssertExt:
840 case AArch64::CBWPrr:
841 case AArch64::CBXPrr:
852class AArch64ConditionalComparesImpl {
853 const MachineBranchProbabilityInfo *MBPI;
854 const TargetInstrInfo *
TII;
855 const TargetRegisterInfo *
TRI;
856 const TargetSubtargetInfo *STI;
859 MachineRegisterInfo *MRI;
860 MachineDominatorTree *DomTree;
861 MachineLoopInfo *
Loops;
862 MachineTraceMetrics *Traces;
867 AArch64ConditionalComparesImpl(
const MachineBranchProbabilityInfo *MBPI,
868 MachineDominatorTree *DomTree,
869 MachineLoopInfo *
Loops,
870 MachineTraceMetrics *Traces)
871 : MBPI(MBPI), DomTree(DomTree),
Loops(
Loops), Traces(Traces) {}
876 bool tryConvert(MachineBasicBlock *);
879 void invalidateTraces();
883class AArch64ConditionalComparesLegacy :
public MachineFunctionPass {
886 AArch64ConditionalComparesLegacy() : MachineFunctionPass(
ID) {
890 void getAnalysisUsage(AnalysisUsage &AU)
const override;
892 StringRef getPassName()
const override {
893 return "AArch64 Conditional Compares";
898char AArch64ConditionalComparesLegacy::ID = 0;
901 "AArch64 CCMP Pass",
false,
false)
909 return new AArch64ConditionalComparesLegacy();
912void AArch64ConditionalComparesLegacy::getAnalysisUsage(
925void AArch64ConditionalComparesImpl::updateDomTree(
930 for (MachineBasicBlock *RemovedMBB : Removed) {
932 assert(Node != HeadNode &&
"Cannot erase the head node");
933 assert(
Node->getIDom() == HeadNode &&
"CmpBB should be dominated by Head");
934 while (!
Node->isLeaf())
941void AArch64ConditionalComparesImpl::updateLoops(
945 for (MachineBasicBlock *RemovedMBB : Removed)
946 Loops->removeBlock(RemovedMBB);
950void AArch64ConditionalComparesImpl::invalidateTraces() {
958bool AArch64ConditionalComparesImpl::shouldConvert() {
963 MinInstr = Traces->
getEnsemble(MachineTraceStrategy::TS_MinInstrCount);
970 int CodeSizeDelta = CmpConv.expectedCodeSizeDelta();
971 LLVM_DEBUG(
dbgs() <<
"Code size delta: " << CodeSizeDelta <<
'\n');
974 if (CodeSizeDelta < 0)
976 if (CodeSizeDelta > 0) {
977 LLVM_DEBUG(
dbgs() <<
"Code size is increasing, give up on this one.\n");
994 unsigned CmpBBDepth =
997 <<
"\nCmpBB depth: " << CmpBBDepth <<
'\n');
998 if (CmpBBDepth > HeadDepth + DelayLimit) {
999 LLVM_DEBUG(
dbgs() <<
"Branch delay would be larger than " << DelayLimit
1012 if (ResDepth > HeadDepth) {
1019bool AArch64ConditionalComparesImpl::tryConvert(MachineBasicBlock *
MBB) {
1023 SmallVector<MachineBasicBlock *, 4> RemovedBlocks;
1024 CmpConv.convert(RemovedBlocks);
1026 updateDomTree(RemovedBlocks);
1027 updateLoops(RemovedBlocks);
1028 for (MachineBasicBlock *
MBB : RemovedBlocks)
1035 LLVM_DEBUG(
dbgs() <<
"********** AArch64 Conditional Compares **********\n"
1036 <<
"********** Function: " << MF.
getName() <<
'\n');
1046 CmpConv.runOnMachineFunction(MF, MBPI);
1054 if (tryConvert(
I->getBlock()))
1060bool AArch64ConditionalComparesLegacy::runOnMachineFunction(
1065 const MachineBranchProbabilityInfo *MBPI =
1066 &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
1067 MachineDominatorTree *DomTree =
1068 &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
1069 MachineLoopInfo *
Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
1070 MachineTraceMetrics *Traces =
1071 &getAnalysis<MachineTraceMetricsWrapperPass>().getMTM();
1073 AArch64ConditionalComparesImpl Impl(MBPI, DomTree,
Loops, Traces);
1074 return Impl.run(MF);
1088 AArch64ConditionalComparesImpl Impl(MBPI, DomTree,
Loops, Traces);
static Register lookThroughCopies(Register Reg, MachineRegisterInfo *MRI)
static cl::opt< bool > Stress("aarch64-stress-ccmp", cl::Hidden, cl::desc("Turn all knobs to 11"))
static cl::opt< unsigned > BlockInstrLimit("aarch64-ccmp-limit", cl::init(30), cl::Hidden, cl::desc("Maximum number of instructions per speculated block."))
static bool parseCond(ArrayRef< MachineOperand > Cond, AArch64CC::CondCode &CC)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static unsigned InstrCount
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
static cl::opt< bool > Stress("stress-early-ifcvt", cl::Hidden, cl::desc("Turn all knobs to 11"))
static cl::opt< unsigned > BlockInstrLimit("early-ifcvt-limit", cl::init(30), cl::Hidden, cl::desc("Maximum number of instructions per speculated block."))
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
void changeImmediateDominator(DomTreeNodeBase< NodeT > *N, DomTreeNodeBase< NodeT > *NewIDom)
changeImmediateDominator - This method is used to update the dominator tree information when a node's...
void eraseNode(NodeT *BB)
eraseNode - Removes a node from the dominator tree.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
FunctionPass class - This class is used to implement most global optimizations.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Remove the branching code at the end of the specific MBB.
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
unsigned pred_size() const
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
LLVM_ABI void updateTerminator(MachineBasicBlock *PreviousLayoutSuccessor)
Update the terminator instructions in block to account for changes to block layout which may have bee...
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
succ_iterator succ_begin()
bool livein_empty() const
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
unsigned succ_size() const
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
bool hasSuccessorProbabilities() const
Return true if any of the successors have probabilities attached to them.
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
Analysis pass which computes a MachineDominatorTree.
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI MachineInstrBundleIterator< MachineInstr > eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
Analysis pass that exposes the MachineLoopInfo for a machine function.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
bool use_nodbg_empty(Register RegNo) const
use_nodbg_empty - Return true if there are no non-Debug instructions using the specified register.
LLVM_ABI const TargetRegisterClass * constrainRegClass(Register Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
LLVM_ABI LLVM_READONLY MachineInstr * getUniqueVRegDef(Register Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
Trace getTrace(const MachineBasicBlock *MBB)
Get the trace that passes through MBB.
InstrCycles getInstrCycles(const MachineInstr &MI) const
Return the depth and height of MI.
LLVM_ABI unsigned getResourceDepth(bool Bottom) const
Return the resource depth of the top/bottom of the trace center block.
LLVM_ABI Ensemble * getEnsemble(MachineTraceStrategy)
Get the trace ensemble representing the given trace selection strategy.
LLVM_ABI void invalidate(const MachineBasicBlock *MBB)
Invalidate cached information about MBB.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Wrapper class representing virtual and physical registers.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual unsigned getMispredictionPenalty() const
Return the number of extra cycles the processor takes to recover from a branch misprediction.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static const char * getCondCodeName(CondCode Code)
static CondCode getInvertedCondCode(CondCode Code)
static unsigned getNZCVToSatisfyCondCode(CondCode Code)
Given a condition code, return NZCV flags that would satisfy that condition.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
NodeAddr< NodeBase * > Node
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.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI PhysRegInfo AnalyzePhysRegInBundle(const MachineInstr &MI, Register Reg, const TargetRegisterInfo *TRI)
AnalyzePhysRegInBundle - Analyze how the current instruction or bundle uses a physical register.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
FunctionPass * createAArch64ConditionalCompares()
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
DomTreeNodeBase< MachineBasicBlock > MachineDomTreeNode
ArrayRef(const T &OneElt) -> ArrayRef< T >
iterator_range< df_iterator< T > > depth_first(const T &G)
IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It, then continue decrementing it while it points to a debug instruction.
void initializeAArch64ConditionalComparesLegacyPass(PassRegistry &)
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
unsigned Depth
Earliest issue cycle as determined by data dependencies and instruction latencies from the beginning ...
bool Read
Reg or one of its aliases is read.
bool Defined
Reg or one of its aliases is defined.
bool Clobbered
There is a regmask operand indicating Reg is clobbered.