19 #define DEBUG_TYPE "branchfolding"
41 STATISTIC(NumDeadBlocks,
"Number of dead blocks removed");
42 STATISTIC(NumBranchOpts,
"Number of branches optimized");
43 STATISTIC(NumTailMerge ,
"Number of block tails merged");
44 STATISTIC(NumHoist ,
"Number of times common instructions are hoisted");
52 cl::desc(
"Max number of predecessors to consider tail merging"),
59 cl::desc(
"Min number of instructions to consider tail merging"),
82 "Control Flow Optimizer",
false,
false)
88 MF.getTarget().getInstrInfo(),
89 MF.getTarget().getRegisterInfo(),
90 getAnalysisIfAvailable<MachineModuleInfo>());
96 case cl::BOU_UNSET: EnableTailMerge = defaultEnableTailMerge;
break;
101 EnableHoistCommonCode = CommonHoist;
107 assert(MBB->
pred_empty() &&
"MBB must be dead!");
108 DEBUG(
dbgs() <<
"\nRemoving MBB: " << *MBB);
116 TriedMerging.erase(MBB);
134 while (I != MBB->
end()) {
135 if (!I->isImplicitDef())
137 unsigned Reg = I->getOperand(0).getReg();
140 ImpDefRegs.
insert(*SubRegs);
143 if (ImpDefRegs.
empty())
147 while (I != MBB->
end()) {
151 for (
unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
155 unsigned Reg = MO.
getReg();
156 if (ImpDefRegs.
count(Reg))
163 while (I != FirstTerm) {
166 MBB->
erase(ImpDefMI);
178 if (!tii)
return false;
180 TriedMerging.clear();
195 bool MadeChange =
false;
201 MadeChange |= OptimizeImpDefsBlock(MBB);
204 bool MadeChangeThisIteration =
true;
205 while (MadeChangeThisIteration) {
206 MadeChangeThisIteration = TailMergeBlocks(MF);
207 MadeChangeThisIteration |= OptimizeBranches(MF);
208 if (EnableHoistCommonCode)
209 MadeChangeThisIteration |= HoistCommonCode(MF);
210 MadeChange |= MadeChangeThisIteration;
227 for (
unsigned op = 0, e = I->getNumOperands(); op != e; ++op) {
229 if (!Op.
isJTI())
continue;
238 for (
unsigned i = 0, e = JTIsLive.size(); i != e; ++i)
239 if (!JTIsLive.test(i)) {
259 unsigned OperandHash = 0;
280 Hash += ((OperandHash << 3) | Op.
getType()) << (i&31);
288 if (I == MBB->
begin())
293 while (I->isDebugValue()) {
312 unsigned TailLen = 0;
313 while (I1 != MBB1->
begin() && I2 != MBB2->
begin()) {
316 while (I1->isDebugValue()) {
317 if (I1==MBB1->
begin()) {
318 while (I2->isDebugValue()) {
319 if (I2==MBB2->
begin())
331 while (I2->isDebugValue()) {
332 if (I2==MBB2->
begin()) {
340 if (!I1->isIdenticalTo(I2) ||
356 if (I1 == MBB1->
begin() && I2 != MBB2->
begin()) {
358 while (I2->isDebugValue()) {
359 if (I2 == MBB2->
begin())
365 if (I2 == MBB2->
begin() && I1 != MBB1->
begin()) {
367 while (I1->isDebugValue()) {
368 if (I1 == MBB1->
begin())
381 if (!CurMBB->
empty())
385 for (
unsigned int i = 0, e = TRI->
getNumRegs(); i != e; i++)
386 if (RegsLiveAtExit[i])
400 MaintainLiveIns(CurMBB, NewDest);
428 NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
431 MaintainLiveIns(&CurMBB, NewMBB);
441 for (; I != E; ++
I) {
442 if (I->isDebugValue())
446 else if (I->mayLoad() || I->mayStore())
465 if (I != MF->
end() &&
468 if (TBB == NextBB && !Cond.
empty() && !FBB) {
486 if (getBlock()->getNumber() < o.getBlock()->getNumber())
488 if (getBlock()->getNumber() > o.getBlock()->getNumber())
492 #ifndef _GLIBCXX_DEBUG
505 unsigned NumTerms = 0;
507 if (I == MBB->
begin()) {
512 if (!I->isTerminator())
break;
524 unsigned minCommonTailLength,
525 unsigned &CommonTailLen,
531 if (CommonTailLen == 0)
534 <<
" and BB#" << MBB2->
getNumber() <<
" is " << CommonTailLen
539 if (MBB1 == PredBB || MBB2 == PredBB) {
542 if (CommonTailLen > NumTerms)
558 unsigned EffectiveTailLen = CommonTailLen;
559 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
565 if (EffectiveTailLen >= minCommonTailLength)
573 if (EffectiveTailLen >= 2 &&
592 unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
593 unsigned minCommonTailLength,
596 unsigned maxCommonTailLength = 0U;
599 MPIterator HighestMPIter =
prior(MergePotentials.end());
600 for (MPIterator CurMPIter =
prior(MergePotentials.end()),
601 B = MergePotentials.begin();
602 CurMPIter != B && CurMPIter->getHash() == CurHash;
604 for (MPIterator I =
prior(CurMPIter); I->getHash() == CurHash ; --
I) {
605 unsigned CommonTailLen;
608 CommonTailLen, TrialBBI1, TrialBBI2,
610 if (CommonTailLen > maxCommonTailLength) {
612 maxCommonTailLength = CommonTailLen;
613 HighestMPIter = CurMPIter;
614 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
616 if (HighestMPIter == CurMPIter &&
617 CommonTailLen == maxCommonTailLength)
618 SameTails.push_back(SameTailElt(I, TrialBBI2));
624 return maxCommonTailLength;
629 void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
632 MPIterator CurMPIter, B;
633 for (CurMPIter =
prior(MergePotentials.end()), B = MergePotentials.begin();
634 CurMPIter->getHash() == CurHash;
638 if (SuccBB && CurMBB != PredBB)
643 if (CurMPIter->getHash() != CurHash)
645 MergePotentials.erase(CurMPIter, MergePotentials.end());
652 unsigned maxCommonTailLength,
653 unsigned &commonTailIndex) {
655 unsigned TimeEstimate = ~0U;
656 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
658 if (SameTails[i].getBlock() == PredBB) {
665 SameTails[i].getTailStartPos());
666 if (t <= TimeEstimate) {
673 SameTails[commonTailIndex].getTailStartPos();
679 << maxCommonTailLength);
692 SameTails[commonTailIndex].setBlock(newMBB);
693 SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
712 bool MadeChange =
false;
718 DEBUG(
dbgs() <<
"\nTryTailMergeBlocks: ";
719 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
720 dbgs() <<
"BB#" << MergePotentials[i].getBlock()->getNumber()
721 << (i == e-1 ?
"" :
", ");
724 dbgs() <<
" with successor BB#" << SuccBB->
getNumber() <<
'\n';
726 dbgs() <<
" which has fall-through from BB#"
729 dbgs() <<
"Looking for common tails of at least "
730 << minCommonTailLength <<
" instruction"
731 << (minCommonTailLength == 1 ?
"" :
"s") <<
'\n';
736 std::stable_sort(MergePotentials.begin(), MergePotentials.end());
739 while (MergePotentials.size() > 1) {
740 unsigned CurHash = MergePotentials.back().getHash();
744 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
750 if (SameTails.empty()) {
751 RemoveBlocksWithHash(CurHash, SuccBB, PredBB);
761 unsigned commonTailIndex = SameTails.size();
764 if (SameTails.size() == 2 &&
765 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
766 SameTails[1].tailIsWholeBlock())
768 else if (SameTails.size() == 2 &&
769 SameTails[1].getBlock()->isLayoutSuccessor(
770 SameTails[0].getBlock()) &&
771 SameTails[0].tailIsWholeBlock())
776 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
778 if (MBB == EntryBB && SameTails[i].tailIsWholeBlock())
784 if (SameTails[i].tailIsWholeBlock())
789 if (commonTailIndex == SameTails.size() ||
790 (SameTails[commonTailIndex].getBlock() == PredBB &&
791 !SameTails[commonTailIndex].tailIsWholeBlock())) {
794 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
795 maxCommonTailLength, commonTailIndex)) {
796 RemoveBlocksWithHash(CurHash, SuccBB, PredBB);
806 for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
807 if (commonTailIndex == i)
809 DEBUG(
dbgs() <<
"BB#" << SameTails[i].getBlock()->getNumber()
810 << (i == e-1 ?
"" :
", "));
812 ReplaceTailWithBranchTo(SameTails[i].getTailStartPos(), MBB);
814 MergePotentials.erase(SameTails[i].getMPIter());
825 bool MadeChange =
false;
826 if (!EnableTailMerge)
return MadeChange;
829 MergePotentials.clear();
832 if (TriedMerging.count(I))
835 MergePotentials.push_back(MergePotentialsElt(
HashEndOfMBB(I), I));
841 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
842 TriedMerging.insert(MergePotentials[i].getBlock());
845 if (MergePotentials.size() >= 2)
846 MadeChange |= TryTailMergeBlocks(NULL, NULL);
869 if (I->pred_size() < 2)
continue;
873 MergePotentials.clear();
878 if (TriedMerging.count(PBB))
886 if (!UniquePreds.
insert(PBB))
899 if (!Cond.
empty() && TBB == IBB) {
916 if (IBB != PredNextBB)
919 if (TBB != IBB && FBB != IBB)
921 }
else if (Cond.
empty()) {
925 if (TBB != IBB && IBB != PredNextBB)
931 if (TBB && (Cond.
empty() || FBB)) {
936 TII->
InsertBranch(*PBB, (TBB == IBB) ? FBB : TBB, 0, NewCond, dl);
939 MergePotentials.push_back(MergePotentialsElt(
HashEndOfMBB(PBB), *
P));
946 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
947 TriedMerging.insert(MergePotentials[i].getBlock());
949 if (MergePotentials.size() >= 2)
950 MadeChange |= TryTailMergeBlocks(IBB, PredBB);
955 if (MergePotentials.size() == 1 &&
956 MergePotentials.begin()->getBlock() != PredBB)
957 FixTail(MergePotentials.begin()->getBlock(), IBB, TII);
968 bool MadeChange =
false;
976 MadeChange |= OptimizeBlock(MBB);
980 RemoveDeadBlock(MBB);
994 MBBI!=MBBE; ++MBBI) {
995 if (!MBBI->isDebugValue())
1005 for (MBBI = MBB->
begin(), MBBE = MBB->
end(); MBBI!=MBBE; ++MBBI) {
1006 if (!MBBI->isDebugValue())
1009 return (MBBI->isBranch());
1032 while (MBB1I->isDebugValue())
1035 while (MBB2I->isDebugValue())
1037 return MBB2I->isCall() && !MBB1I->isCall();
1046 if (I == MBB.
begin())
1049 while (I->isDebugValue() && I != MBB.
begin())
1052 return I->getDebugLoc();
1059 bool MadeChange =
false;
1074 if (FallThrough == MF.
end()) {
1086 MJTI->ReplaceMBBInJumpTables(MBB, FallThrough);
1098 bool PriorUnAnalyzable =
1099 TII->
AnalyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond,
true);
1100 if (!PriorUnAnalyzable) {
1103 !PriorCond.
empty());
1108 if (PriorTBB && PriorTBB == PriorFBB) {
1112 if (PriorTBB != MBB)
1116 goto ReoptimizeBlock;
1129 DEBUG(
dbgs() <<
"\nMerging into block: " << PrevBB
1130 <<
"From MBB: " << *MBB);
1132 if (PrevBB.
begin() != PrevBB.
end()) {
1138 while (PrevBBIter != PrevBB.
begin() && MBBIter != MBB->
end()
1139 && PrevBBIter->isDebugValue() && MBBIter->isDebugValue()) {
1140 if (!MBBIter->isIdenticalTo(PrevBBIter))
1143 ++MBBIter; -- PrevBBIter;
1157 if (PriorTBB == MBB && PriorFBB == 0) {
1161 goto ReoptimizeBlock;
1166 if (PriorFBB == MBB) {
1172 goto ReoptimizeBlock;
1178 if (PriorTBB == MBB) {
1183 TII->
InsertBranch(PrevBB, PriorFBB, 0, NewPriorCond, dl);
1186 goto ReoptimizeBlock;
1201 bool DoTransform =
true;
1208 if (FallThrough == --MF.
end() &&
1210 DoTransform =
false;
1216 DEBUG(
dbgs() <<
"\nMoving MBB: " << *MBB
1217 <<
"To make fallthrough to: " << *PriorTBB <<
"\n");
1236 bool CurUnAnalyzable= TII->
AnalyzeBranch(*MBB, CurTBB, CurFBB, CurCond,
true);
1237 if (!CurUnAnalyzable) {
1246 if (CurTBB && CurFBB && CurFBB == MBB && CurTBB != MBB) {
1254 goto ReoptimizeBlock;
1260 if (CurTBB && CurCond.
empty() && CurFBB == 0 &&
1271 if (!MBB->
empty()) {
1272 bool NonDebugInfoFound =
false;
1275 if (!I->isDebugValue()) {
1276 NonDebugInfoFound =
true;
1280 if (!NonDebugInfoFound)
1292 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1296 if (!PredHasNoFallThrough && PrevBB.
isSuccessor(MBB) &&
1297 PriorTBB != MBB && PriorFBB != MBB) {
1298 if (PriorTBB == 0) {
1299 assert(PriorCond.
empty() && PriorFBB == 0 &&
1300 "Bad branch analysis");
1303 assert(PriorFBB == 0 &&
"Machine CFG out of date!");
1308 TII->
InsertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, pdl);
1313 bool DidChange =
false;
1314 bool HasBranchToSelf =
false;
1320 HasBranchToSelf =
true;
1329 bool NewCurUnAnalyzable = TII->
AnalyzeBranch(*PMBB, NewCurTBB,
1330 NewCurFBB, NewCurCond,
true);
1331 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1335 TII->
InsertBranch(*PMBB, NewCurTBB, 0, NewCurCond, pdl);
1345 MJTI->ReplaceMBBInJumpTables(MBB, CurTBB);
1349 if (!HasBranchToSelf)
return MadeChange;
1372 E = MBB->
pred_end(); PI != E; ++PI) {
1379 !TII->
AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond,
true)
1380 && (!CurFallsThru || !CurTBB || !CurFBB)
1399 goto ReoptimizeBlock;
1404 if (!CurFallsThru) {
1407 E = MBB->
succ_end(); SI != E; ++SI) {
1416 if (SuccBB != MBB && &*SuccPrev != MBB &&
1421 goto ReoptimizeBlock;
1430 if (FallThrough != MF.
end() &&
1431 !TII->
AnalyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond,
true) &&
1450 bool MadeChange =
false;
1453 MadeChange |= HoistCommonCodeInSuccs(MBB);
1464 E = BB->
succ_end(); SI != E; ++SI) {
1466 if (SuccBB != TrueBB)
1489 for (
unsigned i = 0, e = Loc->getNumOperands(); i != e; ++i) {
1493 unsigned Reg = MO.
getReg();
1507 if (Loc == MBB->
begin())
1514 while (PI != MBB->
begin() && Loc->isDebugValue())
1518 for (
unsigned i = 0, e = PI->getNumOperands(); !IsDef && i != e; ++i) {
1525 unsigned Reg = MO.
getReg();
1528 if (Uses.
count(Reg))
1542 bool DontMoveAcrossStore =
true;
1543 if (!PI->isSafeToMove(TII, 0, DontMoveAcrossStore) ||
1550 for (
unsigned i = 0, e = PI->getNumOperands(); i != e; ++i) {
1554 unsigned Reg = MO.
getReg();
1561 if (Uses.
erase(Reg)) {
1563 Uses.
erase(*SubRegs);
1589 if (TBB->
pred_size() > 1 || FBB->pred_size() > 1)
1598 if (Loc == MBB->
end())
1601 bool HasDups =
false;
1608 while (TIB != TIE && FIB != FIE) {
1610 if (TIB->isDebugValue()) {
1611 while (TIB != TIE && TIB->isDebugValue())
1616 if (FIB->isDebugValue()) {
1617 while (FIB != FIE && FIB->isDebugValue())
1630 for (
unsigned i = 0, e = TIB->getNumOperands(); i != e; ++i) {
1639 unsigned Reg = MO.
getReg();
1643 if (Uses.
count(Reg)) {
1665 }
else if (!LocalDefsSet.
count(Reg)) {
1666 if (Defs.
count(Reg)) {
1681 bool DontMoveAcrossStore =
true;
1682 if (!TIB->isSafeToMove(TII, 0, DontMoveAcrossStore))
1686 for (
unsigned i = 0, e = TIB->getNumOperands(); i != e; ++i) {
1690 unsigned Reg = MO.
getReg();
1691 if (!Reg || !LocalDefsSet.
count(Reg))
1694 LocalDefsSet.
erase(*AI);
1698 for (
unsigned i = 0, e = TIB->getNumOperands(); i != e; ++i) {
1702 unsigned Reg = MO.
getReg();
1707 LocalDefsSet.
insert(*AI);
1719 FBB->erase(FBB->begin(), FIB);
1722 for (
unsigned i = 0, e = LocalDefs.
size(); i != e; ++i) {
1723 unsigned Def = LocalDefs[i];
1724 if (LocalDefsSet.
count(Def)) {
1726 FBB->addLiveIn(Def);
unsigned succ_size() const
static unsigned EstimateRuntime(MachineBasicBlock::iterator I, MachineBasicBlock::iterator E)
void push_back(const T &Elt)
const MachineFunction * getParent() const
instr_iterator erase(instr_iterator I)
static cl::opt< unsigned > TailMergeThreshold("tail-merge-threshold", cl::desc("Max number of predecessors to consider tail merging"), cl::init(150), cl::Hidden)
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
MachineBasicBlock * getMBB() const
iterator getFirstTerminator()
virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const
void RemoveJumpTable(unsigned Idx)
void addLiveIn(unsigned Reg)
void operator<(const Optional< T > &X, const Optional< U > &Y)
Poison comparison between two Optional objects. Clients needs to explicitly compare the underlying va...
const_iterator begin(StringRef path)
Get begin iterator over path.
void moveAfter(MachineBasicBlock *NewBefore)
const Function * getFunction() const
BranchFolder(bool defaultEnableTailMerge, bool CommonHoist)
virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const
static DebugLoc getBranchDebugLoc(MachineBasicBlock &MBB)
Address of indexed Jump Table for switch.
const std::vector< MachineJumpTableEntry > & getJumpTables() const
bool isJTI() const
isJTI - Tests if this is a MO_JumpTableIndex operand.
AnalysisUsage & addRequired()
void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New)
const HexagonInstrInfo * TII
#define llvm_unreachable(msg)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
std::vector< MachineBasicBlock * >::iterator succ_iterator
static bool IsEmptyBlock(MachineBasicBlock *MBB)
INITIALIZE_PASS(BranchFolderPass,"branch-folder","Control Flow Optimizer", false, false) bool BranchFolderPass
ID
LLVM Calling Convention Representation.
unsigned getNumOperands() const
void forward()
forward - Move the internal MBB iterator and update register states.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
void transferSuccessors(MachineBasicBlock *fromMBB)
static cl::opt< cl::boolOrDefault > FlagEnableTailMerge("enable-tail-merge", cl::init(cl::BOU_UNSET), cl::Hidden)
static void FixTail(MachineBasicBlock *CurMBB, MachineBasicBlock *SuccBB, const TargetInstrInfo *TII)
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
void RenumberBlocks(MachineBasicBlock *MBBFrom=0)
const MachineJumpTableInfo * getJumpTableInfo() const
void enterBasicBlock(MachineBasicBlock *mbb)
virtual bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
std::vector< MachineBasicBlock * >::iterator pred_iterator
static MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, SmallSet< unsigned, 4 > &Uses, SmallSet< unsigned, 4 > &Defs)
Address of indexed Constant in Constant Pool.
const BasicBlock * getBasicBlock() const
bundle_iterator< MachineInstr, instr_iterator > iterator
initializer< Ty > init(const Ty &Val)
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *bb=0)
LLVM Basic Block Representation.
STATISTIC(NumDeadBlocks,"Number of dead blocks removed")
const MachineOperand & getOperand(unsigned i) const
Abstract Stack Frame Index.
bool tracksLiveness() const
ItTy next(ItTy it, Dist n)
bool getEnableTailMerge() const
const MachineBasicBlock * getLandingPadSuccessor() const
int64_t getOffset() const
static bool IsBetterFallthrough(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2)
static unsigned getHash(const void *V)
succ_iterator succ_begin()
void removeSuccessor(MachineBasicBlock *succ)
void moveBefore(MachineBasicBlock *NewAfter)
pred_iterator pred_begin()
void getRegsUsed(BitVector &used, bool includeReserved)
getRegsUsed - return all registers currently in use in used.
static unsigned CountTerminators(MachineBasicBlock *MBB, MachineBasicBlock::iterator &I)
static cl::opt< unsigned > TailMergeSize("tail-merge-size", cl::desc("Min number of instructions to consider tail merging"), cl::init(3), cl::Hidden)
void setIsKill(bool Val=true)
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
static bool ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2, unsigned minCommonTailLength, unsigned &CommonTailLen, MachineBasicBlock::iterator &I1, MachineBasicBlock::iterator &I2, MachineBasicBlock *SuccBB, MachineBasicBlock *PredBB)
bool isSuccessor(const MachineBasicBlock *MBB) const
virtual bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const
virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const
void invalidateLiveness()
virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
AttributeSet getAttributes() const
Return the attribute list for this Function.
bool count(const T &V) const
count - Return true if the element is in the set.
virtual bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const
MachineOperandType getType() const
bundle_iterator< const MachineInstr, const_instr_iterator > const_iterator
bool hasAddressTaken() const
bool isLandingPad() const
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
MachineRegisterInfo & getRegInfo()
virtual void getAnalysisUsage(AnalysisUsage &AU) const
static bool IsBranchOnlyBlock(MachineBasicBlock *MBB)
static MachineBasicBlock * findFalseBlock(MachineBasicBlock *BB, MachineBasicBlock *TrueBB)
unsigned getReg() const
getReg - Returns the register number.
void erase(iterator MBBI)
void insert(iterator MBBI, MachineBasicBlock *MBB)
static const Function * getParent(const Value *V)
BasicBlockListType::iterator iterator
ItTy prior(ItTy it, Dist n)
char & BranchFolderPassID
static unsigned HashMachineInstr(const MachineInstr *MI)
HashMachineInstr - Compute a hash value for MI and its operands.
virtual bool isPredicated(const MachineInstr *MI) const
const MCRegisterInfo & MRI
bool OptimizeFunction(MachineFunction &MF, const TargetInstrInfo *tii, const TargetRegisterInfo *tri, MachineModuleInfo *mmi)
static unsigned HashEndOfMBB(const MachineBasicBlock *MBB)
HashEndOfMBB - Hash the last instruction in the MBB.
virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, MachineBasicBlock *NewDest) const
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
void addSuccessor(MachineBasicBlock *succ, uint32_t weight=0)
unsigned pred_size() const
bool CorrectExtraCFGEdges(MachineBasicBlock *DestA, MachineBasicBlock *DestB, bool isCond)
bool isBarrier(QueryType Type=AnyInBundle) const
MachineBasicBlock reference.
static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2, MachineBasicBlock::iterator &I1, MachineBasicBlock::iterator &I2)
Address of a global value.
Name of external global symbol.