71#define DEBUG_TYPE "machine-sink"
75 cl::desc(
"Split critical edges during machine sinking"),
80 cl::desc(
"Use block frequency info to find successors to sink"),
84 "machine-sink-split-probability-threshold",
86 "Percentage threshold for splitting single-instruction critical edge. "
87 "If the branch threshold is higher than this threshold, we allow "
88 "speculative execution of up to 1 instruction to avoid branching to "
89 "splitted critical edge"),
93 "machine-sink-load-instrs-threshold",
94 cl::desc(
"Do not try to find alias store for a load if there is a in-path "
95 "block whose instruction number is higher than this threshold."),
99 "machine-sink-load-blocks-threshold",
100 cl::desc(
"Do not try to find alias store for a load if the block number in "
101 "the straight line is higher than this threshold."),
106 cl::desc(
"Sink instructions into cycles to avoid "
111 "machine-sink-cycle-limit",
113 "The maximum number of instructions considered for cycle sinking."),
116STATISTIC(NumSunk,
"Number of machine instructions sunk");
117STATISTIC(NumCycleSunk,
"Number of machine instructions sunk into a cycle");
120STATISTIC(NumPostRACopySink,
"Number of copies sunk after RA");
126class MachineSinking {
164 using AllSuccsCache =
178 using SinkItem = std::pair<MachineInstr *, MachineBasicBlock *>;
197 CachedRegisterPressure;
199 bool EnableSinkAndFold;
209 : DT(DT), PDT(PDT), CI(CI), PSI(PSI), MBFI(MBFI), MBPI(MBPI),
AA(
AA),
210 RegClassInfo(RegClassInfo), LIS(LIS),
SI(
SI), LV(LV), MLI(MLI),
211 EnableSinkAndFold(EnableSinkAndFold) {}
215 void releaseMemory() {
216 CEBCandidates.
clear();
217 CEMergeCandidates.
clear();
247 AllSuccsCache &AllSuccessors);
257 bool &LocalUse)
const;
260 AllSuccsCache &AllSuccessors);
272 AllSuccsCache &AllSuccessors);
281 AllSuccsCache &AllSuccessors)
const;
284 bool UseCache =
true);
286 bool registerPressureSetExceedsLimit(
unsigned NRegs,
323char MachineSinkingLegacy::ID = 0;
349 if (!TII->isBasicBlockPrologue(*PI))
351 for (auto &MO : MI.operands()) {
354 Register Reg = MO.getReg();
358 if (Reg.isPhysical() &&
359 (TII->isIgnorableUse(MO) || (MRI && MRI->isConstantPhysReg(Reg))))
361 if (PI->modifiesRegister(Reg, TRI))
364 if (PI->readsRegister(Reg, TRI))
367 auto *DefOp = PI->findRegisterDefOperand(Reg, TRI, false, true);
368 if (DefOp && !DefOp->isDead())
377bool MachineSinking::PerformTrivialForwardCoalescing(
MachineInstr &
MI,
399 MI.eraseFromParent();
409bool MachineSinking::PerformSinkAndFold(MachineInstr &
MI,
410 MachineBasicBlock *
MBB) {
411 if (
MI.isCopy() ||
MI.mayLoadOrStore() ||
412 MI.getOpcode() == TargetOpcode::REG_SEQUENCE)
420 bool SawStore =
true;
421 if (!
MI.isSafeToMove(SawStore))
426 if (
MI.isConvergent())
435 for (
const MachineOperand &MO :
MI.operands()) {
436 if (MO.isImm() || MO.isRegMask() || MO.isRegLiveOut() || MO.isMetadata() ||
437 MO.isMCSymbol() || MO.isDbgInstrRef() || MO.isCFIIndex() ||
438 MO.isIntrinsicID() || MO.isPredicate() || MO.isShuffleMask())
457 else if (UsedRegB == 0)
475 using SinkInfo = std::pair<MachineInstr *, ExtAddrMode>;
481 UsedRegA == 0 ? nullptr : MRI->
getRegClass(UsedRegA);
483 UsedRegB == 0 ? nullptr : MRI->
getRegClass(UsedRegB);
486 while (!Worklist.
empty()) {
491 MachineInstr &UseInst = *MO.getParent();
494 if (
const MachineOperand &O = UseInst.
getOperand(0);
O.isReg())
515 return MO.isReg() && MO.getReg() == Reg;
519 if (!
TII->canFoldIntoAddrMode(UseInst,
Reg,
MI, AM))
536 if (RCA ==
nullptr) {
541 unsigned NRegs = !!RCA + !!RCB;
547 if (RCB ==
nullptr) {
548 if (registerPressureSetExceedsLimit(NRegs, RCA,
MBB))
550 }
else if (registerPressureSetExceedsLimit(1, RCA,
MBB) ||
551 registerPressureSetExceedsLimit(1, RCB,
MBB)) {
561 if (SinkInto.
empty())
565 for (
auto &[SinkDst, MaybeAM] : SinkInto) {
566 MachineInstr *
New =
nullptr;
569 if (SinkDst->isCopy()) {
582 Register DstReg = SinkDst->getOperand(0).getReg();
583 TII->reMaterialize(*SinkDst->getParent(), InsertPt, DstReg, 0,
MI);
584 New = &*std::prev(InsertPt);
585 if (!
New->getDebugLoc())
586 New->setDebugLoc(SinkDst->getDebugLoc());
597 New =
TII->emitLdStWithAddr(*SinkDst, MaybeAM);
609 if (SinkDst->mayStore() && !SinkDst->hasOrderedMemoryRef())
610 StoreInstrCache.clear();
611 SinkDst->eraseFromParent();
619 while (!Worklist.
empty()) {
623 assert((
U->isCopy() ||
U->isDebugInstr()) &&
624 "Only debug uses and copies must remain");
626 Worklist.
push_back(
U->getOperand(0).getReg());
632 for (MachineOperand *MO :
Cleanup) {
635 I->eraseFromParent();
642 MI.eraseFromParent();
650bool MachineSinking::AllUsesDominatedByBlock(
Register Reg,
651 MachineBasicBlock *
MBB,
652 MachineBasicBlock *DefMBB,
654 bool &LocalUse)
const {
676 MachineInstr *UseInst = MO.getParent();
677 unsigned OpNo = MO.getOperandNo();
678 MachineBasicBlock *UseBlock = UseInst->getParent();
679 return UseBlock == MBB && UseInst->isPHI() &&
680 UseInst->getOperand(OpNo + 1).getMBB() == DefMBB;
689 unsigned OpNo = &MO - &UseInst->
getOperand(0);
690 MachineBasicBlock *UseBlock = UseInst->
getParent();
691 if (UseInst->
isPHI()) {
695 }
else if (UseBlock == DefMBB) {
711 assert(
MI.mayLoad() &&
"Expected MI that loads!");
715 if (
MI.memoperands_empty())
720 if (PSV->isGOT() || PSV->isConstantPool())
726void MachineSinking::FindCycleSinkCandidates(
727 CycleRef Cycle, MachineBasicBlock *BB,
728 SmallVectorImpl<MachineInstr *> &Candidates) {
729 for (
auto &
MI : *BB) {
731 if (
MI.isMetaInstruction()) {
732 LLVM_DEBUG(
dbgs() <<
"CycleSink: not sinking meta instruction\n");
736 LLVM_DEBUG(
dbgs() <<
"CycleSink: Instruction not a candidate for this "
741 LLVM_DEBUG(
dbgs() <<
"CycleSink: Instruction is not cycle invariant\n");
744 bool DontMoveAcrossStore =
true;
745 if (!
MI.isSafeToMove(DontMoveAcrossStore)) {
746 LLVM_DEBUG(
dbgs() <<
"CycleSink: Instruction not safe to move.\n");
750 LLVM_DEBUG(
dbgs() <<
"CycleSink: Dont sink GOT or constant pool loads\n");
753 if (
MI.isConvergent())
756 const MachineOperand &MO =
MI.getOperand(0);
762 LLVM_DEBUG(
dbgs() <<
"CycleSink: Instruction added as candidate.\n");
774 .getCachedResult<ProfileSummaryAnalysis>(
788 MachineSinking Impl(EnableSinkAndFold, DT, PDT, LV, MLI,
SI, LIS, CI, PSI,
789 MBFI, MBPI,
AA, RegClassInfo);
803 OS << MapClassName2PassName(
name());
804 if (EnableSinkAndFold)
805 OS <<
"<enable-sink-fold>";
815 auto *DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
817 &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
818 auto *CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo();
819 auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
822 ? &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI()
825 &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
826 auto *
AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
828 auto *LISWrapper = getAnalysisIfAvailable<LiveIntervalsWrapperPass>();
829 auto *LIS = LISWrapper ? &LISWrapper->getLIS() :
nullptr;
830 auto *SIWrapper = getAnalysisIfAvailable<SlotIndexesWrapperPass>();
831 auto *
SI = SIWrapper ? &SIWrapper->getSI() :
nullptr;
832 auto *LVWrapper = getAnalysisIfAvailable<LiveVariablesWrapperPass>();
833 auto *LV = LVWrapper ? &LVWrapper->getLV() :
nullptr;
834 auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
835 auto *MLI = MLIWrapper ? &MLIWrapper->getLI() :
nullptr;
837 &getAnalysis<MachineRegisterClassInfoWrapperPass>().getRCI();
839 MachineSinking Impl(EnableSinkAndFold, DT, PDT, LV, MLI,
SI, LIS, CI, PSI,
840 MBFI, MBPI,
AA, RegClassInfo);
852 bool EverMadeChange =
false;
855 bool MadeChange =
false;
858 CEBCandidates.clear();
859 CEMergeCandidates.clear();
866 MachineDomTreeUpdater::UpdateStrategy::Lazy);
867 for (
const auto &Pair : ToSplit) {
868 auto NewSucc = Pair.first->SplitCriticalEdge(
869 Pair.second, {LIS, SI, LV, MLI},
nullptr, &MDTU);
870 if (NewSucc !=
nullptr) {
887 EverMadeChange =
true;
892 SchedModel.
init(STI);
893 bool HasHighPressure;
895 DenseMap<SinkItem, MachineInstr *> SunkInstrs;
897 enum CycleSinkStage { COPY, LOW_LATENCY, AGGRESSIVE, END };
898 for (
unsigned Stage = CycleSinkStage::COPY; Stage != CycleSinkStage::END;
899 ++Stage, SunkInstrs.
clear()) {
900 HasHighPressure =
false;
902 for (
auto Cycle : Cycles) {
908 SmallVector<MachineInstr *, 8> Candidates;
909 FindCycleSinkCandidates(Cycle, Preheader, Candidates);
918 if (Stage == CycleSinkStage::COPY) {
921 <<
"CycleSink: Limit reached of instructions to "
932 if (Stage == CycleSinkStage::LOW_LATENCY &&
933 !
TII->hasLowDefLatency(SchedModel, *
I, 0))
936 if (!aggressivelySinkIntoCycle(Cycle, *
I, SunkInstrs))
938 EverMadeChange =
true;
943 if (!HasHighPressure)
944 HasHighPressure = registerPressureExceedsLimit(*Preheader);
946 if (!HasHighPressure)
951 HasStoreCache.clear();
952 StoreInstrCache.clear();
955 for (
auto I : RegsToClearKillFlags)
957 RegsToClearKillFlags.clear();
960 return EverMadeChange;
963bool MachineSinking::ProcessBlock(MachineBasicBlock &
MBB) {
973 bool MadeChange =
false;
976 AllSuccsCache AllSuccessors;
981 bool ProcessedBegin, SawStore =
false;
983 MachineInstr &
MI = *
I;
991 if (
MI.isDebugOrPseudoInstr() ||
MI.isFakeUse()) {
992 if (
MI.isDebugValue())
997 if (EnableSinkAndFold && PerformSinkAndFold(
MI, &
MBB)) {
1006 if (PerformTrivialForwardCoalescing(
MI, &
MBB)) {
1017 }
while (!ProcessedBegin);
1019 SeenDbgUsers.clear();
1020 SeenDbgVars.clear();
1022 CachedRegisterPressure.clear();
1026void MachineSinking::ProcessDbgInst(MachineInstr &
MI) {
1029 assert(
MI.isDebugValue() &&
"Expected DBG_VALUE for processing");
1031 DebugVariable Var(
MI.getDebugVariable(),
MI.getDebugExpression(),
1032 MI.getDebugLoc()->getInlinedAt());
1033 bool SeenBefore = SeenDbgVars.contains(Var);
1035 for (MachineOperand &MO :
MI.debug_operands()) {
1037 SeenDbgUsers[MO.
getReg()].push_back(SeenDbgUser(&
MI, SeenBefore));
1041 SeenDbgVars.insert(Var);
1044bool MachineSinking::isWorthBreakingCriticalEdge(
1045 MachineInstr &
MI, MachineBasicBlock *From, MachineBasicBlock *To,
1046 MachineBasicBlock *&DeferredFromBlock) {
1052 if (!CEBCandidates.insert(std::make_pair(From, To)).second)
1063 for (
const auto &MO :
MI.all_defs()) {
1068 auto Key = std::make_pair(SrcReg, To);
1069 auto Res = CEMergeCandidates.try_emplace(
Key, From);
1074 DeferredFromBlock = Res.first->second;
1087 for (
const MachineOperand &MO :
MI.all_uses()) {
1113 return TII->shouldBreakCriticalEdgeToSink(
MI);
1116bool MachineSinking::isLegalToBreakCriticalEdge(MachineInstr &
MI,
1117 MachineBasicBlock *FromBB,
1118 MachineBasicBlock *ToBB,
1119 bool BreakPHIEdge) {
1124 CycleRef FromCycle = CI->
getCycle(FromBB);
1125 CycleRef ToCycle = CI->
getCycle(ToBB);
1128 if (FromCycle == ToCycle && FromCycle &&
1171 if (!BreakPHIEdge) {
1173 if (Pred != FromBB && !DT->
dominates(ToBB, Pred))
1180bool MachineSinking::PostponeSplitCriticalEdge(MachineInstr &
MI,
1181 MachineBasicBlock *FromBB,
1182 MachineBasicBlock *ToBB,
1183 bool BreakPHIEdge) {
1184 bool Status =
false;
1185 MachineBasicBlock *DeferredFromBB =
nullptr;
1186 if (isWorthBreakingCriticalEdge(
MI, FromBB, ToBB, DeferredFromBB)) {
1189 if ((!DeferredFromBB ||
1190 ToSplit.count(std::make_pair(DeferredFromBB, ToBB)) ||
1191 isLegalToBreakCriticalEdge(
MI, DeferredFromBB, ToBB, BreakPHIEdge)) &&
1192 isLegalToBreakCriticalEdge(
MI, FromBB, ToBB, BreakPHIEdge)) {
1193 ToSplit.insert(std::make_pair(FromBB, ToBB));
1195 ToSplit.insert(std::make_pair(DeferredFromBB, ToBB));
1203std::vector<unsigned> &
1204MachineSinking::getBBRegisterPressure(
const MachineBasicBlock &
MBB,
1211 auto RP = CachedRegisterPressure.find(&
MBB);
1212 if (UseCache && RP != CachedRegisterPressure.end())
1215 RegionPressure Pressure;
1216 RegPressureTracker RPTracker(Pressure);
1224 MII != MIE; --MII) {
1225 const MachineInstr &
MI = *std::prev(MII);
1226 if (
MI.isDebugOrPseudoInstr())
1228 RegisterOperands RegOpers;
1230 RPTracker.recedeSkipDebugValues();
1231 assert(&*RPTracker.getPos() == &
MI &&
"RPTracker sync error!");
1232 RPTracker.recede(RegOpers);
1235 RPTracker.closeRegion();
1237 if (RP != CachedRegisterPressure.end()) {
1238 CachedRegisterPressure[&
MBB] = RPTracker.getPressure().MaxSetPressure;
1239 return CachedRegisterPressure[&
MBB];
1242 auto It = CachedRegisterPressure.insert(
1243 std::make_pair(&
MBB, RPTracker.getPressure().MaxSetPressure));
1244 return It.first->second;
1247bool MachineSinking::registerPressureSetExceedsLimit(
1249 const MachineBasicBlock &
MBB) {
1250 unsigned Weight = NRegs *
TRI->getRegClassWeight(RC).RegWeight;
1251 const int *PS =
TRI->getRegClassPressureSets(RC);
1252 std::vector<unsigned> BBRegisterPressure = getBBRegisterPressure(
MBB);
1253 for (; *PS != -1; PS++)
1254 if (Weight + BBRegisterPressure[*PS] >=
1261bool MachineSinking::registerPressureExceedsLimit(
1262 const MachineBasicBlock &
MBB) {
1263 std::vector<unsigned> BBRegisterPressure = getBBRegisterPressure(
MBB,
false);
1265 for (
unsigned PS = 0; PS < BBRegisterPressure.size(); ++PS) {
1275bool MachineSinking::isProfitableToSinkTo(
Register Reg, MachineInstr &
MI,
1276 MachineBasicBlock *
MBB,
1277 MachineBasicBlock *SuccToSinkTo,
1278 AllSuccsCache &AllSuccessors) {
1279 assert(SuccToSinkTo &&
"Invalid SinkTo Candidate BB");
1281 if (
MBB == SuccToSinkTo)
1294 bool NonPHIUse =
false;
1296 MachineBasicBlock *UseBlock = UseInst.
getParent();
1297 if (UseBlock == SuccToSinkTo && !UseInst.
isPHI())
1305 bool BreakPHIEdge =
false;
1307 if (MachineBasicBlock *MBB2 =
1308 FindSuccToSinkTo(
MI, SuccToSinkTo, BreakPHIEdge, AllSuccessors))
1309 return isProfitableToSinkTo(
Reg,
MI, SuccToSinkTo, MBB2, AllSuccessors);
1320 for (
const MachineOperand &MO :
MI.operands()) {
1331 !
TII->isIgnorableUse(MO))
1339 bool LocalUse =
false;
1340 if (!AllUsesDominatedByBlock(
Reg, SuccToSinkTo,
MBB, BreakPHIEdge,
1352 if (Cycle != MCycle ||
1361 LLVM_DEBUG(
dbgs() <<
"register pressure exceed limit, not profitable.");
1375SmallVector<MachineBasicBlock *, 4> &
1376MachineSinking::GetAllSortedSuccessors(MachineInstr &
MI, MachineBasicBlock *
MBB,
1377 AllSuccsCache &AllSuccessors)
const {
1379 auto Succs = AllSuccessors.find(
MBB);
1380 if (Succs != AllSuccessors.end())
1381 return Succs->second;
1383 SmallVector<MachineBasicBlock *, 4> AllSuccs(
MBB->
successors());
1394 if (DTChild->getIDom()->getBlock() ==
MI.getParent() &&
1397 AllSuccs.push_back(DTChild->getBlock());
1402 AllSuccs, [&](
const MachineBasicBlock *L,
const MachineBasicBlock *R) {
1406 (!LHSFreq && !RHSFreq))
1408 return LHSFreq < RHSFreq;
1411 auto it = AllSuccessors.insert(std::make_pair(
MBB, AllSuccs));
1413 return it.first->second;
1418MachineSinking::FindSuccToSinkTo(MachineInstr &
MI, MachineBasicBlock *
MBB,
1420 AllSuccsCache &AllSuccessors) {
1421 assert(
MBB &&
"Invalid MachineBasicBlock!");
1428 MachineBasicBlock *SuccToSinkTo =
nullptr;
1429 for (
const MachineOperand &MO :
MI.operands()) {
1444 }
else if (!MO.
isDead()) {
1462 bool LocalUse =
false;
1463 if (!AllUsesDominatedByBlock(
Reg, SuccToSinkTo,
MBB, BreakPHIEdge,
1474 for (MachineBasicBlock *SuccBlock :
1475 GetAllSortedSuccessors(
MI,
MBB, AllSuccessors)) {
1476 bool LocalUse =
false;
1477 if (AllUsesDominatedByBlock(
Reg, SuccBlock,
MBB, BreakPHIEdge,
1479 SuccToSinkTo = SuccBlock;
1490 if (!isProfitableToSinkTo(
Reg,
MI,
MBB, SuccToSinkTo, AllSuccessors))
1497 if (
MBB == SuccToSinkTo)
1502 if (SuccToSinkTo && SuccToSinkTo->
isEHPad())
1512 if (SuccToSinkTo && !
TII->isSafeToSink(
MI, SuccToSinkTo, CI))
1515 return SuccToSinkTo;
1530 auto *
MBB =
MI.getParent();
1531 if (
MBB->pred_size() != 1)
1534 auto *PredMBB = *
MBB->pred_begin();
1535 auto *PredBB = PredMBB->getBasicBlock();
1541 !PredBB->getTerminator()->getMetadata(LLVMContext::MD_make_implicit))
1546 bool OffsetIsScalable;
1547 if (!
TII->getMemOperandWithOffset(
MI, BaseOp,
Offset, OffsetIsScalable,
TRI))
1550 if (!BaseOp->
isReg())
1553 if (!(
MI.mayLoad() && !
MI.isPredicable()))
1556 MachineBranchPredicate MBP;
1557 if (
TII->analyzeBranchPredicate(*PredMBB, MBP,
false))
1560 return MBP.LHS.isReg() && MBP.RHS.isImm() && MBP.RHS.getImm() == 0 &&
1561 (MBP.Predicate == MachineBranchPredicate::PRED_NE ||
1562 MBP.Predicate == MachineBranchPredicate::PRED_EQ) &&
1563 MBP.LHS.getReg() == BaseOp->
getReg();
1580 auto CopyOperands =
TII.isCopyInstr(SinkInst);
1583 SrcMO = CopyOperands->Source;
1584 DstMO = CopyOperands->Destination;
1595 bool arePhysRegs = !
Reg.isVirtual();
1596 if (arePhysRegs != PostRA)
1603 if (DbgMO.getSubReg() != SrcMO->
getSubReg() ||
1604 DbgMO.getSubReg() != DstMO->getSubReg())
1610 if (PostRA &&
Reg != DstMO->getReg())
1614 DbgMO.setReg(SrcMO->
getReg());
1620using MIRegs = std::pair<MachineInstr *, SmallVector<Register, 2>>;
1628 if (SuccToSinkTo.
empty())
1636 SuccToSinkTo.
splice(InsertPos, ParentBlock,
MI,
1643 for (
const auto &DbgValueToSink : DbgValuesToSink) {
1646 SuccToSinkTo.
insert(InsertPos, NewDbgMI);
1648 bool PropagatedAllSunkOps =
true;
1652 PropagatedAllSunkOps =
false;
1657 if (!PropagatedAllSunkOps)
1664bool MachineSinking::hasStoreBetween(MachineBasicBlock *From,
1665 MachineBasicBlock *To, MachineInstr &
MI) {
1671 auto BlockPair = std::make_pair(From, To);
1675 if (
auto It = HasStoreCache.find(BlockPair); It != HasStoreCache.end())
1678 if (
auto It = StoreInstrCache.find(BlockPair); It != StoreInstrCache.end())
1680 return I->mayAlias(AA, MI, false);
1683 bool SawStore =
false;
1684 bool HasAliasedStore =
false;
1685 DenseSet<MachineBasicBlock *> HandledBlocks;
1686 DenseSet<MachineBasicBlock *> HandledDomBlocks;
1693 if (BB == To || BB == From)
1697 if (HandledBlocks.
count(BB))
1700 HandledBlocks.
insert(BB);
1703 if (!HandledDomBlocks.
count(BB))
1704 HandledDomBlocks.
insert(BB);
1710 for (
auto *DomBB : HandledDomBlocks) {
1711 if (DomBB != BB && DT->
dominates(DomBB, BB))
1712 HasStoreCache[std::make_pair(DomBB, To)] =
true;
1713 else if (DomBB != BB && DT->
dominates(BB, DomBB))
1714 HasStoreCache[std::make_pair(From, DomBB)] =
true;
1716 HasStoreCache[BlockPair] =
true;
1720 for (MachineInstr &
I : *BB) {
1723 if (
I.isCall() ||
I.hasOrderedMemoryRef()) {
1724 for (
auto *DomBB : HandledDomBlocks) {
1725 if (DomBB != BB && DT->
dominates(DomBB, BB))
1726 HasStoreCache[std::make_pair(DomBB, To)] =
true;
1727 else if (DomBB != BB && DT->
dominates(BB, DomBB))
1728 HasStoreCache[std::make_pair(From, DomBB)] =
true;
1730 HasStoreCache[BlockPair] =
true;
1740 if (
I.mayAlias(AA,
MI,
false))
1741 HasAliasedStore =
true;
1742 StoreInstrCache[BlockPair].push_back(&
I);
1749 HasStoreCache[BlockPair] =
false;
1750 return HasAliasedStore;
1758bool MachineSinking::aggressivelySinkIntoCycle(
1759 CycleRef Cycle, MachineInstr &
I,
1760 DenseMap<SinkItem, MachineInstr *> &SunkInstrs) {
1762 if (
I.getNumDefs() > 1)
1765 LLVM_DEBUG(
dbgs() <<
"AggressiveCycleSink: Finding sink block for: " <<
I);
1769 MachineOperand &DefMO =
I.getOperand(0);
1774 for (std::pair<RegSubRegPair, MachineInstr *> Entry :
Uses) {
1775 MachineInstr *
MI =
Entry.second;
1779 dbgs() <<
"AggressiveCycleSink: Not attempting to sink for PHI.\n");
1783 if (
MI->isPosition() ||
TII->isBasicBlockPrologue(*
MI)) {
1784 LLVM_DEBUG(
dbgs() <<
"AggressiveCycleSink: Use is BasicBlock prologue, "
1790 dbgs() <<
"AggressiveCycleSink: Use not in cycle, can't sink.\n");
1794 MachineBasicBlock *SinkBlock =
MI->getParent();
1795 MachineInstr *NewMI =
nullptr;
1796 SinkItem MapEntry(&
I, SinkBlock);
1798 auto SI = SunkInstrs.
find(MapEntry);
1802 if (SI != SunkInstrs.
end()) {
1803 LLVM_DEBUG(
dbgs() <<
"AggressiveCycleSink: Already sunk to block: "
1810 LLVM_DEBUG(
dbgs() <<
"AggressiveCycleSink: Sinking instruction to block: "
1813 NewMI =
I.
getMF()->CloneMachineInstr(&
I);
1822 SunkInstrs.
insert({MapEntry, NewMI});
1826 for (MachineOperand &MO : NewMI->
all_uses()) {
1828 RegsToClearKillFlags.insert(MO.
getReg());
1843 I.eraseFromParent();
1849bool MachineSinking::SinkInstruction(MachineInstr &
MI,
bool &SawStore,
1850 AllSuccsCache &AllSuccessors) {
1856 if (!
MI.isSafeToMove(SawStore))
1861 if (
MI.isConvergent())
1877 bool BreakPHIEdge =
false;
1878 MachineBasicBlock *ParentBlock =
MI.getParent();
1879 MachineBasicBlock *SuccToSinkTo =
1880 FindSuccToSinkTo(
MI, ParentBlock, BreakPHIEdge, AllSuccessors);
1889 for (
const MachineOperand &MO :
MI.all_defs()) {
1897 LLVM_DEBUG(
dbgs() <<
"Sink instr " <<
MI <<
"\tinto block " << *SuccToSinkTo);
1904 bool TryBreak =
false;
1906 MI.mayLoad() ? hasStoreBetween(ParentBlock, SuccToSinkTo,
MI) :
true;
1907 if (!
MI.isSafeToMove(
Store)) {
1908 LLVM_DEBUG(
dbgs() <<
" *** NOTE: Won't sink load along critical edge.\n");
1914 if (!TryBreak && !DT->
dominates(ParentBlock, SuccToSinkTo)) {
1920 if (!TryBreak && CI->
getCycle(SuccToSinkTo) &&
1934 bool Status = PostponeSplitCriticalEdge(
MI, ParentBlock, SuccToSinkTo,
1938 "break critical edge\n");
1949 PostponeSplitCriticalEdge(
MI, ParentBlock, SuccToSinkTo, BreakPHIEdge);
1952 "break critical edge\n");
1961 LLVM_DEBUG(
dbgs() <<
" *** Not sinking: prologue interference\n");
1967 for (
auto &MO :
MI.all_defs()) {
1970 auto It = SeenDbgUsers.find(MO.
getReg());
1971 if (It == SeenDbgUsers.end())
1975 auto &
Users = It->second;
1976 for (
auto &User :
Users) {
1977 MachineInstr *DbgMI =
User.getPointer();
1978 if (
User.getInt()) {
1993 if (
MI.getMF()->getFunction().getSubprogram() &&
MI.isCopy())
1994 SalvageUnsunkDebugUsersOfCopy(
MI, SuccToSinkTo);
2003 for (MachineOperand &MO :
MI.all_uses())
2004 RegsToClearKillFlags.insert(MO.
getReg());
2009void MachineSinking::SalvageUnsunkDebugUsersOfCopy(
2010 MachineInstr &
MI, MachineBasicBlock *TargetBlock) {
2017 SmallVector<MachineInstr *, 4> DbgDefUsers;
2019 const MachineRegisterInfo &MRI =
MI.getMF()->getRegInfo();
2020 for (
auto &MO :
MI.all_defs()) {
2029 if (
User.getParent() ==
MI.getParent())
2033 "DBG_VALUE user of vreg, but has no operand for it?");
2040 for (
auto *User : DbgDefUsers) {
2041 for (
auto &
Reg : DbgUseRegs) {
2042 for (
auto &DbgOp :
User->getDebugOperandsForReg(
Reg)) {
2043 DbgOp.setReg(
MI.getOperand(1).getReg());
2044 DbgOp.setSubReg(
MI.getOperand(1).getSubReg());
2086class PostRAMachineSinkingImpl {
2088 LiveRegUnits ModifiedRegUnits, UsedRegUnits;
2094 DenseMap<MCRegUnit, SmallVector<MIRegs, 2>> SeenDbgInstrs;
2098 bool tryToSinkCopy(MachineBasicBlock &BB, MachineFunction &MF,
2099 const TargetRegisterInfo *
TRI,
const TargetInstrInfo *
TII);
2102 bool run(MachineFunction &MF);
2105class PostRAMachineSinkingLegacy :
public MachineFunctionPass {
2107 bool runOnMachineFunction(MachineFunction &MF)
override;
2110 PostRAMachineSinkingLegacy() : MachineFunctionPass(
ID) {}
2111 StringRef getPassName()
const override {
return "PostRA Machine Sink"; }
2113 void getAnalysisUsage(AnalysisUsage &AU)
const override {
2115 AU.
addPreserved<MachineRegisterClassInfoWrapperPass>();
2119 MachineFunctionProperties getRequiredProperties()
const override {
2120 return MachineFunctionProperties().setNoVRegs();
2126char PostRAMachineSinkingLegacy::ID = 0;
2130 "PostRA Machine Sink",
false,
false)
2139static MachineBasicBlock *
2145 for (
auto *
SI : SinkableBBs) {
2146 if (aliasWithRegsInLiveIn(*
SI,
Reg,
TRI)) {
2166static MachineBasicBlock *
2172 for (
auto DefReg : DefedRegsInCopy) {
2175 if (!BB || (SingleBB && SingleBB != BB))
2186 for (
auto U : UsedOpsInCopy) {
2192 if (UI.killsRegister(SrcReg,
TRI)) {
2193 UI.clearRegisterKills(SrcReg,
TRI);
2205 for (
Register DefReg : DefedRegsInCopy)
2208 for (
auto U : UsedOpsInCopy)
2218 bool HasRegDependency =
false;
2219 for (
unsigned i = 0, e =
MI->getNumOperands(); i != e; ++i) {
2228 HasRegDependency =
true;
2237 }
else if (MO.
isUse()) {
2239 HasRegDependency =
true;
2245 return HasRegDependency;
2248bool PostRAMachineSinkingImpl::tryToSinkCopy(MachineBasicBlock &CurBB,
2249 MachineFunction &MF,
2250 const TargetRegisterInfo *
TRI,
2251 const TargetInstrInfo *
TII) {
2252 SmallPtrSet<MachineBasicBlock *, 2> SinkableBBs;
2256 for (MachineBasicBlock *SI : CurBB.
successors())
2257 if (!
SI->livein_empty() &&
SI->pred_size() == 1)
2260 if (SinkableBBs.
empty())
2267 ModifiedRegUnits.
clear();
2268 UsedRegUnits.
clear();
2269 SeenDbgInstrs.clear();
2273 SmallVector<unsigned, 2> UsedOpsInCopy;
2279 if (
MI.isDebugValue() && !
MI.isDebugRef()) {
2280 SmallDenseMap<MCRegUnit, SmallVector<Register, 2>, 4> MIUnits;
2281 bool IsValid =
true;
2282 for (MachineOperand &MO :
MI.debug_operands()) {
2287 ModifiedRegUnits, UsedRegUnits)) {
2293 for (MCRegUnit Unit :
TRI->regunits(MO.
getReg()))
2298 for (
auto &RegOps : MIUnits)
2299 SeenDbgInstrs[RegOps.first].emplace_back(&
MI,
2300 std::move(RegOps.second));
2306 if (!
TII->shouldPostRASink(
MI))
2309 if (
MI.isDebugOrPseudoInstr())
2316 if (!
MI.isCopy() || !
MI.getOperand(0).isRenamable()) {
2324 ModifiedRegUnits, UsedRegUnits)) {
2330 "Unexpect SrcReg or DefReg");
2331 MachineBasicBlock *SuccBB =
2341 "Unexpected predecessor");
2346 MapVector<MachineInstr *, MIRegs::second_type> DbgValsToSinkMap;
2347 for (
auto &MO :
MI.all_defs()) {
2348 for (MCRegUnit Unit :
TRI->regunits(MO.
getReg())) {
2349 for (
const auto &
MIRegs : SeenDbgInstrs.lookup(Unit)) {
2350 auto &Regs = DbgValsToSinkMap[
MIRegs.first];
2355 auto DbgValsToSink = DbgValsToSinkMap.
takeVector();
2364 LLVM_DEBUG(
dbgs() <<
" *** Not sinking: prologue interference\n");
2375 ++NumPostRACopySink;
2380bool PostRAMachineSinkingImpl::run(MachineFunction &MF) {
2393bool PostRAMachineSinkingLegacy::runOnMachineFunction(MachineFunction &MF) {
2397 return PostRAMachineSinkingImpl().run(MF);
2405 if (!PostRAMachineSinkingImpl().
run(MF))
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the DenseSet and SmallDenseSet classes.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
ManagedStatic< HTTPClientCleanup > Cleanup
static Register UseReg(const MachineOperand &MO)
const HexagonInstrInfo * TII
iv Induction Variable Users
static bool mayLoadFromGOTOrConstantPool(MachineInstr &MI)
Return true if this machine instruction loads from global offset table or constant pool.
static cl::opt< unsigned > SinkLoadInstsPerBlockThreshold("machine-sink-load-instrs-threshold", cl::desc("Do not try to find alias store for a load if there is a in-path " "block whose instruction number is higher than this threshold."), cl::init(2000), cl::Hidden)
static cl::opt< unsigned > SinkIntoCycleLimit("machine-sink-cycle-limit", cl::desc("The maximum number of instructions considered for cycle sinking."), cl::init(50), cl::Hidden)
TargetInstrInfo::RegSubRegPair RegSubRegPair
static void clearKillFlags(MachineInstr *MI, MachineBasicBlock &CurBB, const SmallVectorImpl< unsigned > &UsedOpsInCopy, const LiveRegUnits &UsedRegUnits, const TargetRegisterInfo *TRI)
static void performSink(MachineInstr &MI, MachineBasicBlock &SuccToSinkTo, MachineBasicBlock::iterator InsertPos, ArrayRef< MIRegs > DbgValuesToSink)
Sink an instruction and its associated debug instructions.
static cl::opt< bool > SplitEdges("machine-sink-split", cl::desc("Split critical edges during machine sinking"), cl::init(true), cl::Hidden)
static bool SinkingPreventsImplicitNullCheck(MachineInstr &MI, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI)
Return true if MI is likely to be usable as a memory operation by the implicit null check optimizatio...
static cl::opt< bool > SinkInstsIntoCycle("sink-insts-to-avoid-spills", cl::desc("Sink instructions into cycles to avoid " "register spills"), cl::init(false), cl::Hidden)
static cl::opt< unsigned > SinkLoadBlocksThreshold("machine-sink-load-blocks-threshold", cl::desc("Do not try to find alias store for a load if the block number in " "the straight line is higher than this threshold."), cl::init(20), cl::Hidden)
static void updateLiveIn(MachineInstr *MI, MachineBasicBlock *SuccBB, const SmallVectorImpl< unsigned > &UsedOpsInCopy, const SmallVectorImpl< Register > &DefedRegsInCopy)
static bool hasRegisterDependency(MachineInstr *MI, SmallVectorImpl< unsigned > &UsedOpsInCopy, SmallVectorImpl< Register > &DefedRegsInCopy, LiveRegUnits &ModifiedRegUnits, LiveRegUnits &UsedRegUnits)
Register const TargetRegisterInfo * TRI
std::pair< MachineInstr *, SmallVector< Register, 2 > > MIRegs
Machine code static false bool blockPrologueInterferes(const MachineBasicBlock *BB, MachineBasicBlock::const_iterator End, const MachineInstr &MI, const TargetRegisterInfo *TRI, const TargetInstrInfo *TII, const MachineRegisterInfo *MRI)
Return true if a target defined block prologue instruction interferes with a sink candidate.
static cl::opt< unsigned > SplitEdgeProbabilityThreshold("machine-sink-split-probability-threshold", cl::desc("Percentage threshold for splitting single-instruction critical edge. " "If the branch threshold is higher than this threshold, we allow " "speculative execution of up to 1 instruction to avoid branching to " "splitted critical edge"), cl::init(40), cl::Hidden)
static bool attemptDebugCopyProp(MachineInstr &SinkInst, MachineInstr &DbgMI, Register Reg)
If the sunk instruction is a copy, try to forward the copy instead of leaving an 'undef' DBG_VALUE in...
static cl::opt< bool > UseBlockFreqInfo("machine-sink-bfi", cl::desc("Use block frequency info to find successors to sink"), cl::init(true), cl::Hidden)
static MachineBasicBlock * getSingleLiveInSuccBB(MachineBasicBlock &CurBB, const SmallPtrSetImpl< MachineBasicBlock * > &SinkableBBs, Register Reg, const TargetRegisterInfo *TRI)
This file implements a map that provides insertion order iteration.
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)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file defines the PointerIntPair class.
Remove Loads Into Fake Uses
This file implements a set that has insertion order iteration characteristics.
static bool ProcessBlock(BasicBlock &BB, DominatorTree &DT, LoopInfo &LI, AAResults &AA)
static bool SinkInstruction(Instruction *Inst, SmallPtrSetImpl< Instruction * > &Stores, DominatorTree &DT, LoopInfo &LI, AAResults &AA)
SinkInstruction - Determine whether it is safe to sink the specified machine instruction out of its c...
This file defines the SmallSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Target-Independent Code Generator Pass Configuration Options pass.
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
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.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Represent a constant reference to an array (0 or more elements consecutively in memory),...
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
Represents analyses that only rely on functions' control flow.
Opaque handle to a cycle within a GenericCycleInfo that wraps the cycle's preorder index.
static LLVM_ABI DebugLoc getMergedLocation(DebugLoc LocA, DebugLoc LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
static DebugLoc getDropped()
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
bool dominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
dominates - Returns true iff A dominates B.
bool isReachableFromEntry(const NodeT *A) const
isReachableFromEntry - Return true if A is dominated by the entry block of the function containing it...
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
iterator_range< const_toplevel_iterator > toplevel_cycles() const
bool isReducible(CycleRef C) const
BlockT * getCyclePreheader(CycleRef C) const
Return the preheader block for C.
void splitCriticalEdge(BlockT *Pred, BlockT *Succ, BlockT *New)
bool contains(CycleRef Outer, CycleRef Inner) const
Returns true iff Outer contains Inner. O(1). Non-strict.
unsigned getCycleDepth(const BlockT *Block) const
Return the depth of the innermost cycle containing Block, or 0 if it is not contained in any cycle.
BlockT * getHeader(CycleRef C) const
CycleRef getCycle(const BlockT *Block) const
Find the innermost cycle containing Block.
Module * getParent()
Get the module that this global value is contained inside of...
bool isAsCheapAsAMove(const MachineInstr &MI) const override
bool shouldSink(const MachineInstr &MI) const override
A set of register units used to track register liveness.
static void accumulateUsedDefed(const MachineInstr &MI, LiveRegUnits &ModifiedRegUnits, LiveRegUnits &UsedRegUnits, const TargetRegisterInfo *TRI)
For a machine instruction MI, adds all register units used in UsedRegUnits and defined or clobbered i...
bool available(MCRegister Reg) const
Returns true if no part of physical register Reg is live.
void init(const TargetRegisterInfo &TRI)
Initialize and clear the set.
LLVM_ABI void addLiveIns(const MachineBasicBlock &MBB)
Adds registers living into block MBB.
void clear()
Clears the set.
bool hasSuperClassEq(const MCRegisterClass *RC) const
Returns true if RC is a super-class of or equal to this class.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
An RAII based helper class to modify MachineFunctionProperties when running pass.
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
instr_iterator instr_begin()
MachineInstrBundleIterator< const MachineInstr > const_iterator
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
LLVM_ABI iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
unsigned succ_size() const
LLVM_ABI void sortUniqueLiveIns()
Sorts and uniques the LiveIns vector.
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
pred_iterator pred_begin()
LLVM_ABI void removeLiveInOverlappedWith(MCRegister Reg)
Remove the specified register from any overlapped live in.
instr_iterator instr_end()
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
iterator_range< succ_iterator > successors()
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
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 bool isLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll()) const
Return true if the specified register is in the live in set.
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
LLVM_ABI BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
LLVM_ABI void onEdgeSplit(const MachineBasicBlock &NewPredecessor, const MachineBasicBlock &NewSuccessor, const MachineBranchProbabilityInfo &MBPI)
incrementally calculate block frequencies when we split edges, to avoid full CFG traversal.
LLVM_ABI BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
Legacy analysis pass which computes a MachineCycleInfo.
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...
bool dominates(const MachineInstr *A, const MachineInstr *B) const
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.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
bool hasDebugOperandForReg(Register Reg) const
Returns whether this debug value has at least one debug operand with the register Reg.
void setDebugValueUndef()
Sets all register debug operands in this debug value instruction to be undef.
LLVM_ABI iterator_range< filter_iterator< const MachineOperand *, std::function< bool(const MachineOperand &Op)> > > getDebugOperandsForReg(Register Reg) const
Returns a range of all of the operands that correspond to a debug use of Reg.
bool mayLoadOrStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read or modify memory.
const MachineBasicBlock * getParent() const
bool isCopyLike() const
Return true if the instruction behaves like a copy.
bool isDebugInstr() const
LLVM_ABI void substituteRegister(Register FromReg, Register ToReg, unsigned SubIdx, const TargetRegisterInfo &RegInfo)
Replace all occurrences of FromReg with ToReg:SubIdx, properly composing subreg indices where necessa...
LLVM_ABI const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
filtered_mop_range all_uses()
Returns an iterator range over all operands that are (explicit or implicit) register uses.
const MachineOperand & getOperand(unsigned i) const
void setDebugLoc(DebugLoc DL)
Replace current source information with new such.
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.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
Register getReg() const
getReg - Returns the register number.
MachinePostDominatorTree - an analysis pass wrapper for DominatorTree used to compute the post-domina...
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI bool hasOneNonDBGUse(Register RegNo) const
hasOneNonDBGUse - Return true if there is exactly one non-Debug use of the specified register.
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI void clearKillFlags(Register Reg) const
clearKillFlags - Iterate over all the uses of the given register and clear the kill flag from the Mac...
LLVM_ABI MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
iterator_range< use_nodbg_iterator > use_nodbg_operands(Register Reg) const
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 Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
iterator_range< use_instr_nodbg_iterator > use_nodbg_instructions(Register Reg) const
bool hasOneDef(Register RegNo) const
Return true if there is exactly one operand defining the specified register.
iterator_range< use_instr_iterator > use_instructions(Register Reg) const
LLVM_ABI bool isConstantPhysReg(MCRegister PhysReg) const
Returns true if PhysReg is unallocatable and constant throughout the function.
iterator_range< use_iterator > use_operands(Register Reg) const
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
LLVM_ABI void replaceRegWith(Register FromReg, Register ToReg)
replaceRegWith - Replace all instances of FromReg with ToReg in the machine function.
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &)
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
VectorType takeVector()
Clear the MapVector and return the underlying vector.
PointerIntPair - This class implements a pair of a pointer and small integer.
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
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 & preserveSet()
Mark an analysis set as preserved.
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
Analysis providing profile information.
Special value supplied for machine level alias analysis.
unsigned getRegPressureSetLimit(unsigned Idx) const
Get the register unit limit for the given pressure set index.
LLVM_ABI void collect(const MachineInstr &MI, const TargetRegisterInfo &TRI, const MachineRegisterInfo &MRI, bool TrackLaneMasks, bool IgnoreDead)
Analyze the given instruction MI and fill in the Uses, Defs and DeadDefs list based on the MachineOpe...
Wrapper class representing virtual and physical registers.
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.
A vector that has set insertion semantics.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
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.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
TargetInstrInfo - Interface to description of machine instruction set.
Target-Independent Code Generator Pass Configuration Options.
bool getEnableSinkAndFold() const
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.
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Abstract Attribute helper functions.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
DXILDebugInfoMap run(Module &M)
@ User
could "use" a pointer
This is an optimization pass for GlobalISel generic memory operations.
void stable_sort(R &&Range)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
@ Store
The extracted value is stored (ExtractElement only).
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
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.
auto reverse(ContainerTy &&C)
LLVM_ABI bool isCycleInvariant(const MachineCycleInfo &CI, CycleRef Cycle, MachineInstr &I)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI char & PostRAMachineSinkingID
This pass perform post-ra machine sink for COPY instructions.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
DomTreeNodeBase< MachineBasicBlock > MachineDomTreeNode
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
LLVM_ABI char & MachineSinkingLegacyID
MachineSinking - This pass performs sinking on machine instructions.
iterator_range< df_iterator< T > > depth_first(const T &G)
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
MCRegisterClass TargetRegisterClass
Represents a predicate at the MachineFunction level.
A pair composed of a register and a sub-register index.