49#define DEBUG_TYPE "early-ifcvt"
55 cl::desc(
"Maximum number of instructions per speculated block."));
64 cl::desc(
"Enable hard-to-predict branch analysis for if-conversion"));
70 cl::desc(
"Limit the number of steps taken when searching for a "
71 "recently loaded value"));
74STATISTIC(NumDiamondsConv,
"Number of diamonds converted");
76STATISTIC(NumTrianglesConv,
"Number of triangles converted");
78 "Number of data dependent conditional branches encountered");
79STATISTIC(NumLikelyBiased,
"Number of branches with a hot path encountered");
123 bool isTriangle()
const {
return TBB ==
Tail || FBB ==
Tail; }
126 MachineBasicBlock *getTPred()
const {
return TBB == Tail ? Head : TBB; }
129 MachineBasicBlock *getFPred()
const {
return FBB == Tail ? Head : FBB; }
136 int CondCycles = 0, TCycles = 0, FCycles = 0;
138 PHIInfo(MachineInstr *phi) : PHI(
phi) {}
149 SmallPtrSet<MachineInstr*, 8> InsertAfter;
152 BitVector ClobberedRegUnits;
155 SparseSet<MCRegUnit, MCRegUnit, MCRegUnitToIndex> LiveRegUnits;
163 bool canSpeculateInstrs(MachineBasicBlock *
MBB);
167 bool canPredicateInstrs(MachineBasicBlock *
MBB);
171 bool InstrDependenciesAllowIfConv(MachineInstr *
I);
175 void PredicateBlock(MachineBasicBlock *
MBB,
bool ReversePredicate);
178 bool findInsertionPoint();
181 void replacePHIInstrs();
184 void rewritePHIOperands();
188 void clearRepeatedKillFlagsFromTBB(MachineBasicBlock *TBB,
189 MachineBasicBlock *FBB);
193 void init(MachineFunction &MF) {
197 LiveRegUnits.clear();
198 LiveRegUnits.setUniverse(TRI->getNumRegUnits());
199 ClobberedRegUnits.clear();
200 ClobberedRegUnits.resize(TRI->getNumRegUnits());
207 bool canConvertIf(MachineBasicBlock *
MBB,
bool Predicate =
false);
211 void convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks,
212 bool Predicate =
false);
236 for (MachineInstr &
MI :
238 if (
MI.isDebugInstr())
262 bool DontMoveAcrossStore =
true;
263 if (!
MI.isSafeToMove(DontMoveAcrossStore)) {
269 if (!InstrDependenciesAllowIfConv(&
MI))
279bool SSAIfConv::InstrDependenciesAllowIfConv(MachineInstr *
I) {
280 for (
const MachineOperand &MO :
I->operands()) {
281 if (MO.isRegMask()) {
292 ClobberedRegUnits.
set(
static_cast<unsigned>(Unit));
303 LLVM_DEBUG(
dbgs() <<
"Can't insert instructions below terminator.\n");
318bool SSAIfConv::canPredicateInstrs(MachineBasicBlock *
MBB) {
333 if (
I->isDebugInstr())
361 if (!InstrDependenciesAllowIfConv(&(*
I)))
368void SSAIfConv::PredicateBlock(MachineBasicBlock *
MBB,
bool ReversePredicate) {
369 auto Condition =
Cond;
370 if (ReversePredicate) {
372 assert(CanRevCond &&
"Reversed predicate is not supported");
379 if (
I->isDebugInstr())
395bool SSAIfConv::findInsertionPoint() {
398 LiveRegUnits.
clear();
406 if (InsertAfter.
count(&*
I)) {
412 for (
const MachineOperand &MO :
I->operands()) {
422 LiveRegUnits.
erase(Unit);
428 while (!Reads.
empty())
430 if (ClobberedRegUnits.
test(
static_cast<unsigned>(Unit)))
431 LiveRegUnits.
insert(Unit);
434 if (
I != FirstTerm &&
I->isTerminator())
439 if (!LiveRegUnits.
empty()) {
441 dbgs() <<
"Would clobber";
442 for (MCRegUnit LRU : LiveRegUnits)
444 dbgs() <<
" live before " << *
I;
463bool SSAIfConv::canConvertIf(MachineBasicBlock *
MBB,
bool Predicate) {
469 MachineBasicBlock *Succ0 = Head->
succ_begin()[0];
470 MachineBasicBlock *Succ1 = Head->
succ_begin()[1];
493 if (!
Tail->livein_empty()) {
506 if (!Predicate && (
Tail->empty() || !
Tail->front().isPHI())) {
520 LLVM_DEBUG(
dbgs() <<
"analyzeBranch didn't find conditional branch.\n");
527 LLVM_DEBUG(
dbgs() <<
"analyzeBranch found an unconditional branch.\n");
533 FBB =
TBB == Succ0 ? Succ1 : Succ0;
537 MachineBasicBlock *TPred = getTPred();
538 MachineBasicBlock *FPred = getFPred();
540 I !=
E &&
I->isPHI(); ++
I) {
542 PHIInfo &PI = PHIs.
back();
544 for (
unsigned i = 1; i != PI.PHI->getNumOperands(); i += 2) {
545 if (PI.PHI->getOperand(i+1).getMBB() == TPred)
546 PI.TReg = PI.PHI->getOperand(i).getReg();
547 if (PI.PHI->getOperand(i+1).getMBB() == FPred)
548 PI.FReg = PI.PHI->getOperand(i).getReg();
550 assert(PI.TReg.isVirtual() &&
"Bad PHI");
551 assert(PI.FReg.isVirtual() &&
"Bad PHI");
554 if (!
TII->canInsertSelect(*Head,
Cond, PI.PHI->getOperand(0).getReg(),
555 PI.TReg, PI.FReg, PI.CondCycles, PI.TCycles,
564 ClobberedRegUnits.
reset();
568 if (FBB !=
Tail && !canPredicateInstrs(FBB))
573 if (FBB !=
Tail && !canSpeculateInstrs(FBB))
579 if (!findInsertionPoint())
596 if (!TReg.isVirtual() || !FReg.
isVirtual())
618 return MO.isReg() && MO.getReg().isPhysical();
623 if (!
TII->produceSameValue(*TDef, *FDef, &MRI))
629 if (TIdx == -1 || FIdx == -1)
638void SSAIfConv::replacePHIInstrs() {
639 assert(
Tail->pred_size() == 2 &&
"Cannot replace PHIs");
641 assert(FirstTerm != Head->
end() &&
"No terminators");
642 DebugLoc HeadDL = FirstTerm->getDebugLoc();
645 for (PHIInfo &PI : PHIs) {
647 Register DstReg = PI.PHI->getOperand(0).getReg();
651 BuildMI(*Head, FirstTerm, HeadDL,
TII->get(TargetOpcode::COPY), DstReg)
654 TII->insertSelect(*Head, FirstTerm, HeadDL, DstReg,
Cond, PI.TReg,
658 PI.PHI->eraseFromParent();
666void SSAIfConv::rewritePHIOperands() {
668 assert(FirstTerm != Head->
end() &&
"No terminators");
669 DebugLoc HeadDL = FirstTerm->getDebugLoc();
672 for (PHIInfo &PI : PHIs) {
681 Register PHIDst = PI.PHI->getOperand(0).getReg();
683 TII->insertSelect(*Head, FirstTerm, HeadDL,
684 DstReg,
Cond, PI.TReg, PI.FReg);
689 for (
unsigned i = PI.PHI->getNumOperands(); i != 1; i -= 2) {
690 MachineBasicBlock *
MBB = PI.PHI->getOperand(i-1).getMBB();
691 if (
MBB == getTPred()) {
692 PI.PHI->getOperand(i-1).setMBB(Head);
693 PI.PHI->getOperand(i-2).setReg(DstReg);
694 }
else if (
MBB == getFPred()) {
695 PI.PHI->removeOperand(i-1);
696 PI.PHI->removeOperand(i-2);
703void SSAIfConv::clearRepeatedKillFlagsFromTBB(MachineBasicBlock *
TBB,
704 MachineBasicBlock *FBB) {
708 SmallDenseSet<Register> FBBKilledRegs;
709 for (MachineInstr &
MI : FBB->
instrs()) {
710 for (MachineOperand &MO :
MI.operands()) {
711 if (MO.isReg() && MO.isKill() && MO.getReg().isVirtual())
712 FBBKilledRegs.
insert(MO.getReg());
716 if (FBBKilledRegs.
empty())
721 for (MachineOperand &MO :
MI.operands()) {
722 if (MO.isReg() && MO.isKill() && FBBKilledRegs.
contains(MO.getReg()))
733void SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks,
735 assert(Head &&
Tail &&
TBB && FBB &&
"Call canConvertIf first.");
748 clearRepeatedKillFlagsFromTBB(
TBB, FBB);
753 PredicateBlock(
TBB,
false);
758 PredicateBlock(FBB,
true);
762 bool ExtraPreds =
Tail->pred_size() != 2;
764 rewritePHIOperands();
804 if (
Tail != &
Tail->getParent()->back())
805 Tail->moveAfter(&
Tail->getParent()->back());
821class EarlyIfConverter {
822 const TargetInstrInfo *
TII =
nullptr;
823 const TargetRegisterInfo *
TRI =
nullptr;
824 const TargetSubtargetInfo *STI =
nullptr;
825 MachineRegisterInfo *MRI =
nullptr;
826 MachineDominatorTree *DomTree =
nullptr;
827 MachineLoopInfo *
Loops =
nullptr;
828 MachineTraceMetrics *Traces =
nullptr;
830 MachineBranchProbabilityInfo *MBPI =
nullptr;
834 EarlyIfConverter(MachineDominatorTree &DT, MachineLoopInfo &LI,
835 MachineTraceMetrics &MTM, MachineBranchProbabilityInfo *MBPI)
836 : DomTree(&DT),
Loops(&LI), Traces(&MTM), MBPI(MBPI) {}
837 EarlyIfConverter() =
delete;
839 bool run(MachineFunction &MF);
842 bool tryConvertIf(MachineBasicBlock *);
843 void invalidateTraces();
844 bool shouldConvertIf();
845 bool isConditionDataDependent();
849class EarlyIfConverterLegacy :
public MachineFunctionPass {
852 EarlyIfConverterLegacy() : MachineFunctionPass(
ID) {}
853 void getAnalysisUsage(AnalysisUsage &AU)
const override;
854 bool runOnMachineFunction(MachineFunction &MF)
override;
855 StringRef getPassName()
const override {
return "Early If-Conversion"; }
859char EarlyIfConverterLegacy::ID = 0;
870void EarlyIfConverterLegacy::getAnalysisUsage(
AnalysisUsage &AU)
const {
884void updateDomTree(MachineDominatorTree *DomTree,
const SSAIfConv &IfConv,
890 for (
auto *
B : Removed) {
892 assert(Node != HeadNode &&
"Cannot erase the head node");
893 while (!
Node->isLeaf()) {
894 assert(
Node->getBlock() == IfConv.Tail &&
"Unexpected children");
902void updateLoops(MachineLoopInfo *
Loops,
906 for (
auto *
B : Removed)
912void EarlyIfConverter::invalidateTraces() {
923 const PseudoSourceValue *PSV = MOp->getPseudoValue();
924 return PSV && PSV->isConstantPool();
930 constexpr int MaxInstructionsToCheck = 64;
935 return ++
Count > MaxInstructionsToCheck ||
MI.isCall();
945bool EarlyIfConverter::doOperandsComeFromMemory(
Register Reg) {
950 SmallPtrSet<const MachineInstr *, 8> VisitedInstrs;
951 SmallVector<const MachineInstr *> Worklist;
952 SmallVector<Register, 16> VisitedRegs;
965 if (!VisitedInstrs.
insert(
MI).second)
969 if (
MI->getParent() != IfConv.Head)
976 !
MI->isDereferenceableInvariantLoad() &&
981 for (
const MachineOperand &MO :
MI->operands()) {
982 if (!MO.isReg() || !MO.isUse())
989 if (!VisitedInstrs.
count(UseDef)) {
1001bool EarlyIfConverter::isConditionDataDependent() {
1002 TargetInstrInfo::MachineBranchPredicate MBP;
1003 if (
TII->analyzeBranchPredicate(*IfConv.Head, MBP,
false))
1014 if (TBBProb != FBBProb) {
1032 if (Delta < 0 && Cyc + Delta > Cyc)
1044 return R <<
ore::NV(
C.Key,
C.Value) << (
C.Value == 1 ?
" cycle" :
" cycles");
1051bool EarlyIfConverter::shouldConvertIf() {
1058 MachineLoop *CurrentLoop =
Loops->getLoopFor(IfConv.Head);
1064 if (CurrentLoop &&
any_of(IfConv.Cond, [&](MachineOperand &MO) {
1065 if (!MO.isReg() || !MO.isUse())
1067 Register Reg = MO.getReg();
1068 if (Reg.isPhysical())
1071 MachineInstr *Def = MRI->getVRegDef(Reg);
1072 return CurrentLoop->isLoopInvariant(*Def) ||
1073 all_of(Def->operands(), [&](MachineOperand &Op) {
1076 if (!Op.isReg() || !Op.isUse())
1078 Register Reg = Op.getReg();
1079 if (Reg.isPhysical())
1082 MachineInstr *Def = MRI->getVRegDef(Reg);
1083 return CurrentLoop->isLoopInvariant(*Def);
1089 MinInstr = Traces->getEnsemble(MachineTraceStrategy::TS_MinInstrCount);
1093 LLVM_DEBUG(
dbgs() <<
"TBB: " << TBBTrace <<
"FBB: " << FBBTrace);
1100 bool DataDependent =
false;
1102 DataDependent = isConditionDataDependent();
1104 unsigned CritLimit = DataDependent ? STI->getMispredictionPenalty()
1105 : STI->getMispredictionPenalty() / 2;
1107 MachineBasicBlock &
MBB = *IfConv.Head;
1111 if (DataDependent) {
1113 return MachineOptimizationRemarkAnalysis(
DEBUG_TYPE,
1114 "DataDependentCondition",
1116 <<
"branch condition is data-dependent (from memory load), "
1117 <<
"using higher CritLimit of " <<
ore::NV(
"CritLimit", CritLimit)
1126 if (IfConv.TBB != IfConv.Tail)
1130 <<
", minimal critical path " << MinCrit <<
'\n');
1131 if (ResLength > MinCrit + CritLimit) {
1134 MachineOptimizationRemarkMissed
R(
DEBUG_TYPE,
"IfConversion",
1136 R <<
"did not if-convert branch: the resulting critical path ("
1137 << Cycles{
"ResLength", ResLength}
1138 <<
") would extend the shorter leg's critical path ("
1139 << Cycles{
"MinCrit", MinCrit} <<
") by more than the threshold of "
1140 << Cycles{
"CritLimit", CritLimit}
1141 <<
", which cannot be hidden by available ILP.";
1151 unsigned BranchDepth =
1158 struct CriticalPathInfo {
1162 CriticalPathInfo
Cond{};
1163 CriticalPathInfo TBlock{};
1164 CriticalPathInfo FBlock{};
1165 bool ShouldConvert =
true;
1166 for (SSAIfConv::PHIInfo &PI : IfConv.PHIs) {
1172 unsigned CondDepth =
adjCycles(BranchDepth, PI.CondCycles);
1173 if (CondDepth > MaxDepth) {
1174 unsigned Extra = CondDepth - MaxDepth;
1175 LLVM_DEBUG(
dbgs() <<
"Condition adds " << Extra <<
" cycles.\n");
1176 if (Extra >
Cond.Extra)
1177 Cond = {Extra, CondDepth};
1178 if (Extra > CritLimit) {
1180 ShouldConvert =
false;
1186 if (TDepth > MaxDepth) {
1187 unsigned Extra = TDepth - MaxDepth;
1189 if (Extra > TBlock.Extra)
1190 TBlock = {Extra, TDepth};
1191 if (Extra > CritLimit) {
1193 ShouldConvert =
false;
1199 if (FDepth > MaxDepth) {
1200 unsigned Extra = FDepth - MaxDepth;
1202 if (Extra > FBlock.Extra)
1203 FBlock = {Extra, FDepth};
1204 if (Extra > CritLimit) {
1206 ShouldConvert =
false;
1214 const CriticalPathInfo
Short = TBlock.Extra > FBlock.Extra ? FBlock : TBlock;
1215 const CriticalPathInfo
Long = TBlock.Extra > FBlock.Extra ? TBlock : FBlock;
1217 if (ShouldConvert) {
1219 MachineOptimizationRemark
R(
DEBUG_TYPE,
"IfConversion",
1221 R <<
"performing if-conversion on branch: the condition adds "
1222 << Cycles{
"CondCycles",
Cond.Extra} <<
" to the critical path";
1223 if (
Short.Extra > 0)
1224 R <<
", and the short leg adds another "
1225 << Cycles{
"ShortCycles",
Short.Extra};
1227 R <<
", and the long leg adds another "
1228 << Cycles{
"LongCycles",
Long.Extra};
1229 R <<
", each staying under the threshold of "
1230 << Cycles{
"CritLimit", CritLimit} <<
".";
1235 MachineOptimizationRemarkMissed
R(
DEBUG_TYPE,
"IfConversion",
1237 R <<
"did not if-convert branch: the condition would add "
1238 << Cycles{
"CondCycles",
Cond.Extra} <<
" to the critical path";
1239 if (
Cond.Extra > CritLimit)
1240 R <<
" exceeding the limit of " << Cycles{
"CritLimit", CritLimit};
1241 if (
Short.Extra > 0) {
1242 R <<
", and the short leg would add another "
1243 << Cycles{
"ShortCycles",
Short.Extra};
1244 if (
Short.Extra > CritLimit)
1245 R <<
" exceeding the limit of " << Cycles{
"CritLimit", CritLimit};
1247 if (
Long.Extra > 0) {
1248 R <<
", and the long leg would add another "
1249 << Cycles{
"LongCycles",
Long.Extra};
1250 if (
Long.Extra > CritLimit)
1251 R <<
" exceeding the limit of " << Cycles{
"CritLimit", CritLimit};
1258 return ShouldConvert;
1263bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *
MBB) {
1265 while (IfConv.canConvertIf(
MBB) && shouldConvertIf()) {
1268 SmallVector<MachineBasicBlock *, 4> RemoveBlocks;
1269 IfConv.convertIf(RemoveBlocks);
1271 updateDomTree(DomTree, IfConv, RemoveBlocks);
1272 updateLoops(
Loops, RemoveBlocks);
1273 for (MachineBasicBlock *
MBB : RemoveBlocks)
1279bool EarlyIfConverter::run(MachineFunction &MF) {
1280 LLVM_DEBUG(
dbgs() <<
"********** EARLY IF-CONVERSION **********\n"
1281 <<
"********** Function: " << MF.
getName() <<
'\n');
1301 if (tryConvertIf(DomNode->getBlock()))
1317 EarlyIfConverter Impl(MDT, LI, MTM, MBPI);
1329bool EarlyIfConverterLegacy::runOnMachineFunction(
MachineFunction &MF) {
1334 getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
1335 MachineLoopInfo &LI = getAnalysis<MachineLoopInfoWrapperPass>().getLI();
1337 getAnalysis<MachineTraceMetricsWrapperPass>().getMTM();
1340 MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
1342 return EarlyIfConverter(MDT, LI, MTM, MBPI).run(MF);
1363 void getAnalysisUsage(AnalysisUsage &AU)
const override;
1364 bool runOnMachineFunction(MachineFunction &MF)
override;
1365 StringRef getPassName()
const override {
return "Early If-predicator"; }
1368 bool tryConvertIf(MachineBasicBlock *);
1369 bool shouldConvertIf();
1374#define DEBUG_TYPE "early-if-predicator"
1376char EarlyIfPredicator::ID = 0;
1386void EarlyIfPredicator::getAnalysisUsage(
AnalysisUsage &AU)
const {
1396bool EarlyIfPredicator::shouldConvertIf() {
1398 if (IfConv.isTriangle()) {
1399 MachineBasicBlock &IfBlock =
1400 (IfConv.TBB == IfConv.Tail) ? *IfConv.FBB : *IfConv.
TBB;
1402 unsigned ExtraPredCost = 0;
1403 unsigned Cycles = 0;
1404 for (MachineInstr &
I : IfBlock) {
1405 unsigned NumCycles = SchedModel.computeInstrLatency(&
I,
false);
1407 Cycles += NumCycles - 1;
1408 ExtraPredCost +=
TII->getPredicationCost(
I);
1414 unsigned TExtra = 0;
1415 unsigned FExtra = 0;
1416 unsigned TCycle = 0;
1417 unsigned FCycle = 0;
1418 for (MachineInstr &
I : *IfConv.TBB) {
1419 unsigned NumCycles = SchedModel.computeInstrLatency(&
I,
false);
1421 TCycle += NumCycles - 1;
1422 TExtra +=
TII->getPredicationCost(
I);
1424 for (MachineInstr &
I : *IfConv.FBB) {
1425 unsigned NumCycles = SchedModel.computeInstrLatency(&
I,
false);
1427 FCycle += NumCycles - 1;
1428 FExtra +=
TII->getPredicationCost(
I);
1431 FCycle, FExtra, TrueProbability);
1436bool EarlyIfPredicator::tryConvertIf(MachineBasicBlock *
MBB) {
1438 while (IfConv.canConvertIf(
MBB,
true) && shouldConvertIf()) {
1440 SmallVector<MachineBasicBlock *, 4> RemoveBlocks;
1441 IfConv.convertIf(RemoveBlocks,
true);
1443 updateDomTree(DomTree, IfConv, RemoveBlocks);
1444 updateLoops(
Loops, RemoveBlocks);
1445 for (MachineBasicBlock *
MBB : RemoveBlocks)
1451bool EarlyIfPredicator::runOnMachineFunction(MachineFunction &MF) {
1452 LLVM_DEBUG(
dbgs() <<
"********** EARLY IF-PREDICATOR **********\n"
1453 <<
"********** Function: " << MF.
getName() <<
'\n');
1461 SchedModel.
init(&STI);
1462 DomTree = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
1463 Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
1464 MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
1474 if (tryConvertIf(DomNode->getBlock()))
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements the BitVector class.
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 defines the DenseSet and SmallDenseSet classes.
static cl::opt< unsigned > MaxNumSteps("early-ifcvt-max-steps", cl::Hidden, cl::init(16), cl::desc("Limit the number of steps taken when searching for a " "recently loaded value"))
static bool hasSameValue(const MachineRegisterInfo &MRI, const TargetInstrInfo *TII, Register TReg, Register FReg)
static unsigned adjCycles(unsigned Cyc, int Delta)
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."))
static bool isConstantPoolLoad(const MachineInstr *MI)
static cl::opt< bool > EnableDataDependentBranchAnalysis("enable-early-ifcvt-data-dependent", cl::Hidden, cl::init(false), cl::desc("Enable hard-to-predict branch analysis for if-conversion"))
static bool callInRange(const MachineInstr *From, const MachineInstr *To)
Check if there are any calls in the range (From, To].
static Register UseReg(const MachineOperand &MO)
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)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallPtrSet class.
This file defines the SparseSet class derived from the version described in Briggs,...
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
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.
bool test(unsigned Idx) const
Returns true if bit Idx is set.
BitVector & reset()
Reset all bits in the bitvector.
BitVector & set()
Set all bits in the bitvector.
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.
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Remove the branching code at the end of the specific MBB.
bool isPredicated(const MachineInstr &MI) const override
Returns true if the instruction is already predicated.
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....
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
Reverses the branch condition of the specified condition list, returning false on success and true if...
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
Insert branch code into the end of the specified MachineBasicBlock.
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const override
Return true if it's profitable to predicate instructions with accumulated instruction latency of "Num...
bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Cond) const override
Convert the instruction into a predicated instruction.
bool isPredicable(const MachineInstr &MI) const override
Return true if the specified instruction can be predicated.
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...
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 addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic 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 void moveAfter(MachineBasicBlock *NewBefore)
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...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
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 MachineBasicBlock & back() const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
bool mayLoadOrStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read or modify memory.
const MachineBasicBlock * getParent() const
LLVM_ABI bool isDereferenceableInvariantLoad() const
Return true if this load instruction never traps and points to a memory location whose value doesn't ...
LLVM_ABI bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by mayLoad / mayStore,...
mop_range uses()
Returns all operands which may be register uses.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI int findRegisterDefOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false) const
Returns the operand index that is a def of the specified register or -1 if it is not found.
Analysis pass that exposes the MachineLoopInfo for a machine function.
A description of a memory reference used in the backend.
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI MachineInstr * getUniqueVRegDef(Register Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
LLVM_ABI unsigned getResourceLength(ArrayRef< const MachineBasicBlock * > Extrablocks={}, ArrayRef< const MCSchedClassDesc * > ExtraInstrs={}, ArrayRef< const MCSchedClassDesc * > RemoveInstrs={}) const
Return the resource length of the trace.
InstrCycles getInstrCycles(const MachineInstr &MI) const
Return the depth and height of MI.
LLVM_ABI unsigned getInstrSlack(const MachineInstr &MI) const
Return the slack of MI.
unsigned getCriticalPath() const
Return the length of the (data dependency) critical path through the trace.
LLVM_ABI unsigned getPHIDepth(const MachineInstr &PHI) const
Return the Depth of a PHI instruction in a trace center block successor.
LLVM_ABI void verifyAnalysis() const
LLVM_ABI void invalidate(const MachineBasicBlock *MBB)
Invalidate cached information about MBB.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Wrapper class representing virtual and physical registers.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
void push_back(const T &Elt)
iterator erase(iterator I)
erase - Erases an existing element identified by a valid iterator.
void clear()
clear - Clears the set.
std::pair< iterator, bool > insert(const ValueT &Val)
insert - Attempts to insert a new element.
bool empty() const
empty - Returns true if the set is empty.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Provide an instruction scheduling machine model to CodeGen passes.
LLVM_ABI void init(const TargetSubtargetInfo *TSInfo, bool EnableSModel=true, bool EnableSItins=true)
Initialize the machine model for instruction scheduling.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual bool enableEarlyIfConversion() const
Enable the use of the early if conversion pass.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
self_iterator getIterator()
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
DXILDebugInfoMap run(Module &M)
DiagnosticInfoOptimizationBase::Argument NV
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 Printable printRegUnit(MCRegUnit Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI char & EarlyIfConverterLegacyID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions.
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
auto post_order(const T &G)
Post-order traversal of a graph.
LLVM_ABI char & EarlyIfPredicatorID
EarlyIfPredicator - This pass performs if-conversion on SSA form by predicating if/else block and ins...
DomTreeNodeBase< MachineBasicBlock > MachineDomTreeNode
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
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 ...
MachineInstr * ConditionDef