44#define DEBUG_TYPE "aarch64-ccmp"
46STATISTIC(NumConsidered,
"Number of ccmps considered");
47STATISTIC(NumPhiRejs,
"Number of ccmps rejected (PHI)");
48STATISTIC(NumPhysRejs,
"Number of ccmps rejected (Physregs)");
49STATISTIC(NumPhi2Rejs,
"Number of ccmps rejected (PHI2)");
50STATISTIC(NumHeadBranchRejs,
"Number of ccmps rejected (Head branch)");
51STATISTIC(NumCmpBranchRejs,
"Number of ccmps rejected (CmpBB branch)");
52STATISTIC(NumCmpTermRejs,
"Number of ccmps rejected (CmpBB is cbz...)");
53STATISTIC(NumImmRangeRejs,
"Number of ccmps rejected (Imm out of range)");
55 "Number of ccmps rejected (Folded zero- or sign-extension)");
56STATISTIC(NumLiveDstRejs,
"Number of ccmps rejected (Cmp dest live)");
57STATISTIC(NumMultNZCVUses,
"Number of ccmps rejected (NZCV used)");
58STATISTIC(NumUnknNZCVDefs,
"Number of ccmps rejected (NZCV def unknown)");
60STATISTIC(NumSpeculateRejs,
"Number of ccmps rejected (Can't speculate)");
62STATISTIC(NumConverted,
"Number of ccmp instructions created");
63STATISTIC(NumCompBranches,
"Number of cb/cbz/cbnz branches converted");
166 bool trivialTailPHIs();
169 void updateTailPHIs();
172 bool isDeadDef(
unsigned DstReg);
196 bool canConvert(MachineBasicBlock *
MBB);
200 void convert(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks);
204 int expectedCodeSizeDelta()
const;
211 MI->getOpcode() == TargetOpcode::COPY) {
212 if (
MI->getOperand(1).getReg().isPhysical())
214 Reg =
MI->getOperand(1).getReg();
221bool SSACCmpConv::trivialTailPHIs() {
222 for (
auto &
I : *Tail) {
225 unsigned HeadReg = 0, CmpBBReg = 0;
227 for (
unsigned oi = 1, oe =
I.getNumOperands(); oi != oe; oi += 2) {
228 MachineBasicBlock *
MBB =
I.getOperand(oi + 1).getMBB();
231 assert((!HeadReg || HeadReg ==
Reg) &&
"Inconsistent PHI operands");
235 assert((!CmpBBReg || CmpBBReg ==
Reg) &&
"Inconsistent PHI operands");
239 if (HeadReg != CmpBBReg)
247void SSACCmpConv::updateTailPHIs() {
248 for (
auto &
I : *Tail) {
252 for (
unsigned oi =
I.getNumOperands(); oi > 2; oi -= 2) {
254 if (
I.getOperand(oi - 1).getMBB() == CmpBB) {
255 I.removeOperand(oi - 1);
256 I.removeOperand(oi - 2);
264bool SSACCmpConv::isDeadDef(
unsigned DstReg) {
266 if (DstReg == AArch64::WZR || DstReg == AArch64::XZR)
268 if (!Register::isVirtualRegister(DstReg))
281 assert(
Cond.size() == 1 &&
"Unknown Cond array format");
293 assert(
Cond.size() == 3 &&
"Unknown Cond array format");
298 assert(
Cond.size() == 3 &&
"Unknown Cond array format");
303 case AArch64::CBWPri:
304 case AArch64::CBXPri:
305 case AArch64::CBWPrr:
306 case AArch64::CBXPrr:
307 assert(
Cond.size() == 5 &&
"Unknown Cond array format");
313 case AArch64::CBBAssertExt:
314 case AArch64::CBHAssertExt:
315 assert(
Cond.size() == 7 &&
"Unknown Cond array format");
322MachineInstr *SSACCmpConv::findConvertibleCompare(MachineBasicBlock *
MBB) {
327 if (!
I->readsRegister(AArch64::NZCV,
nullptr)) {
328 switch (
I->getOpcode()) {
335 case AArch64::CBWPrr:
336 case AArch64::CBXPrr:
340 case AArch64::CBWPri:
341 case AArch64::CBXPri: {
342 assert(
I->getOperand(2).isImm() &&
"Expected immediate operand");
352 case AArch64::CBBAssertExt:
353 case AArch64::CBHAssertExt: {
354 assert(
I->getOperand(4).isImm() &&
"Expected immediate operand");
355 assert(
I->getOperand(5).isImm() &&
"Expected immediate operand");
358 LLVM_DEBUG(
dbgs() <<
"Folded extend can't be folded into ccmp: " << *
I);
373 assert(!
I->isTerminator() &&
"Spurious terminator");
374 switch (
I->getOpcode()) {
376 case AArch64::SUBSWri:
377 case AArch64::SUBSXri:
379 case AArch64::ADDSWri:
380 case AArch64::ADDSXri:
383 if (
I->getOperand(3).getImm() || !
isUInt<5>(
I->getOperand(2).getImm())) {
389 case AArch64::SUBSWrr:
390 case AArch64::SUBSXrr:
391 case AArch64::ADDSWrr:
392 case AArch64::ADDSXrr:
393 if (isDeadDef(
I->getOperand(0).getReg()))
395 LLVM_DEBUG(
dbgs() <<
"Can't convert compare with live destination: "
399 case AArch64::FCMPSrr:
400 case AArch64::FCMPDrr:
401 case AArch64::FCMPESrr:
402 case AArch64::FCMPEDrr:
434bool SSACCmpConv::canSpeculateInstrs(MachineBasicBlock *
MBB,
435 const MachineInstr *CmpMI) {
443 const AArch64Options &CLOpts =
450 if (
I.isDebugInstr())
453 if (++
InstrCount > CLOpts.ccmp_limit && !CLOpts.stress_ccmp) {
455 << CLOpts.ccmp_limit <<
" instructions.\n");
474 bool DontMoveAcrossStore =
true;
475 if (!
I.isSafeToMove(DontMoveAcrossStore)) {
481 if (&
I != CmpMI &&
I.modifiesRegister(AArch64::NZCV,
TRI)) {
492bool SSACCmpConv::canConvert(MachineBasicBlock *
MBB) {
494 Tail = CmpBB =
nullptr;
498 MachineBasicBlock *Succ0 = Head->
succ_begin()[0];
499 MachineBasicBlock *Succ1 = Head->
succ_begin()[1];
527 if (!trivialTailPHIs()) {
533 if (!
Tail->livein_empty()) {
548 LLVM_DEBUG(
dbgs() <<
"Can't handle live-in physregs in CmpBB.\n");
555 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
566 dbgs() <<
"analyzeBranch didn't find conditional branch in Head.\n");
593 dbgs() <<
"analyzeBranch didn't find conditional branch in CmpBB.\n");
598 if (!
parseCond(CmpBBCond, CmpBBTailCC)) {
609 <<
", CmpBB->Tail on "
612 CmpMI = findConvertibleCompare(CmpBB);
616 if (!canSpeculateInstrs(CmpBB, CmpMI)) {
623void SSACCmpConv::convert(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks) {
652 Head2Tail + Head2CmpBB * CmpBB2Tail);
671 if (HeadCond[0].
getImm() == -1) {
673 TII->insertCmpForCondBr(*Head, Head->
end(), TermDL, HeadCond);
681 unsigned FirstOp = 1;
682 bool isZBranch =
false;
686 case AArch64::SUBSWri:
Opc = AArch64::CCMPWi;
break;
687 case AArch64::SUBSWrr:
Opc = AArch64::CCMPWr;
break;
688 case AArch64::SUBSXri:
Opc = AArch64::CCMPXi;
break;
689 case AArch64::SUBSXrr:
Opc = AArch64::CCMPXr;
break;
690 case AArch64::ADDSWri:
Opc = AArch64::CCMNWi;
break;
691 case AArch64::ADDSWrr:
Opc = AArch64::CCMNWr;
break;
692 case AArch64::ADDSXri:
Opc = AArch64::CCMNXi;
break;
693 case AArch64::ADDSXrr:
Opc = AArch64::CCMNXr;
break;
694 case AArch64::FCMPSrr:
Opc = AArch64::FCCMPSrr; FirstOp = 0;
break;
695 case AArch64::FCMPDrr:
Opc = AArch64::FCCMPDrr; FirstOp = 0;
break;
696 case AArch64::FCMPESrr:
Opc = AArch64::FCCMPESrr; FirstOp = 0;
break;
697 case AArch64::FCMPEDrr:
Opc = AArch64::FCCMPEDrr; FirstOp = 0;
break;
700 Opc = AArch64::CCMPWi;
706 Opc = AArch64::CCMPXi;
710 case AArch64::CBWPri:
711 Opc = AArch64::CCMPWi;
714 case AArch64::CBXPri:
715 Opc = AArch64::CCMPXi;
718 case AArch64::CBWPrr:
719 case AArch64::CBBAssertExt:
720 case AArch64::CBHAssertExt:
721 Opc = AArch64::CCMPWr;
724 case AArch64::CBXPrr:
725 Opc = AArch64::CCMPXr;
736 const MCInstrDesc &MCID =
TII->get(
Opc);
738 TII->getRegClass(MCID, 0));
741 TII->getRegClass(MCID, 1));
765 case AArch64::CBWPri:
766 case AArch64::CBXPri:
767 case AArch64::CBBAssertExt:
768 case AArch64::CBHAssertExt:
769 case AArch64::CBWPrr:
770 case AArch64::CBXPrr:
774 MachineBasicBlock *BrTarget =
TII->getBranchDestBlock(*CmpMI);
787int SSACCmpConv::expectedCodeSizeDelta()
const {
792 if (HeadCond[0].
getImm() == -1) {
793 switch (HeadCond[1].
getImm()) {
798 case AArch64::CBWPri:
799 case AArch64::CBXPri:
800 case AArch64::CBWPrr:
801 case AArch64::CBXPrr:
807 case AArch64::CBBAssertExt:
808 case AArch64::CBHAssertExt:
809 assert(HeadCond[5].isImm() &&
"Expected immediate operand");
828 case AArch64::CBWPri:
829 case AArch64::CBXPri:
830 case AArch64::CBBAssertExt:
831 case AArch64::CBHAssertExt:
832 case AArch64::CBWPrr:
833 case AArch64::CBXPrr:
844class AArch64ConditionalComparesImpl {
845 const MachineBranchProbabilityInfo *MBPI;
846 const TargetInstrInfo *
TII;
847 const TargetRegisterInfo *
TRI;
848 const AArch64Subtarget *STI;
851 MachineRegisterInfo *MRI;
852 MachineDominatorTree *DomTree;
853 MachineLoopInfo *
Loops;
854 MachineTraceMetrics *Traces;
859 AArch64ConditionalComparesImpl(
const MachineBranchProbabilityInfo *MBPI,
860 MachineDominatorTree *DomTree,
861 MachineLoopInfo *
Loops,
862 MachineTraceMetrics *Traces)
863 : MBPI(MBPI), DomTree(DomTree),
Loops(
Loops), Traces(Traces) {}
868 bool tryConvert(MachineBasicBlock *);
871 void invalidateTraces();
875class AArch64ConditionalComparesLegacy :
public MachineFunctionPass {
878 AArch64ConditionalComparesLegacy() : MachineFunctionPass(
ID) {
882 void getAnalysisUsage(AnalysisUsage &AU)
const override;
884 StringRef getPassName()
const override {
885 return "AArch64 Conditional Compares";
890char AArch64ConditionalComparesLegacy::ID = 0;
893 "AArch64 CCMP Pass",
false,
false)
901 return new AArch64ConditionalComparesLegacy();
904void AArch64ConditionalComparesLegacy::getAnalysisUsage(
917void AArch64ConditionalComparesImpl::updateDomTree(
922 for (MachineBasicBlock *RemovedMBB : Removed) {
924 assert(Node != HeadNode &&
"Cannot erase the head node");
925 assert(
Node->getIDom() == HeadNode &&
"CmpBB should be dominated by Head");
926 while (!
Node->isLeaf())
933void AArch64ConditionalComparesImpl::updateLoops(
937 for (MachineBasicBlock *RemovedMBB : Removed)
938 Loops->removeBlock(RemovedMBB);
942void AArch64ConditionalComparesImpl::invalidateTraces() {
950bool AArch64ConditionalComparesImpl::shouldConvert() {
955 MinInstr = Traces->
getEnsemble(MachineTraceStrategy::TS_MinInstrCount);
962 int CodeSizeDelta = CmpConv.expectedCodeSizeDelta();
963 LLVM_DEBUG(
dbgs() <<
"Code size delta: " << CodeSizeDelta <<
'\n');
966 if (CodeSizeDelta < 0)
968 if (CodeSizeDelta > 0) {
969 LLVM_DEBUG(
dbgs() <<
"Code size is increasing, give up on this one.\n");
981 unsigned DelayLimit = STI->getMispredictionPenalty() * 3 / 4;
986 unsigned CmpBBDepth =
989 <<
"\nCmpBB depth: " << CmpBBDepth <<
'\n');
990 if (CmpBBDepth > HeadDepth + DelayLimit) {
991 LLVM_DEBUG(
dbgs() <<
"Branch delay would be larger than " << DelayLimit
1004 if (ResDepth > HeadDepth) {
1011bool AArch64ConditionalComparesImpl::tryConvert(MachineBasicBlock *
MBB) {
1015 SmallVector<MachineBasicBlock *, 4> RemovedBlocks;
1016 CmpConv.convert(RemovedBlocks);
1018 updateDomTree(RemovedBlocks);
1019 updateLoops(RemovedBlocks);
1020 for (MachineBasicBlock *
MBB : RemovedBlocks)
1027 LLVM_DEBUG(
dbgs() <<
"********** AArch64 Conditional Compares **********\n"
1028 <<
"********** Function: " << MF.
getName() <<
'\n');
1038 CmpConv.runOnMachineFunction(MF, MBPI);
1046 if (tryConvert(
I->getBlock()))
1052bool AArch64ConditionalComparesLegacy::runOnMachineFunction(
1057 const MachineBranchProbabilityInfo *MBPI =
1058 &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
1059 MachineDominatorTree *DomTree =
1060 &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
1061 MachineLoopInfo *
Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
1062 MachineTraceMetrics *Traces =
1063 &getAnalysis<MachineTraceMetricsWrapperPass>().getMTM();
1065 AArch64ConditionalComparesImpl Impl(MBPI, DomTree,
Loops, Traces);
1066 return Impl.run(MF);
1080 AArch64ConditionalComparesImpl Impl(MBPI, DomTree,
Loops, Traces);
static Register lookThroughCopies(Register Reg, MachineRegisterInfo *MRI)
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.
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)
const AArch64Options & getCLOpts() const
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 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...
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.