aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineSink.cpp
diff options
context:
space:
mode:
authorAkshat Oke <Akshat.Oke@amd.com>2025-03-03 15:49:37 +0530
committerGitHub <noreply@github.com>2025-03-03 15:49:37 +0530
commit77f44a964212a54ebc014a703c6787ae236b6ef4 (patch)
tree205abda00985fe1cbab084a5b82a912c9bae9e38 /llvm/lib/CodeGen/MachineSink.cpp
parent05589ee455334530addaabc56205f05df0954caf (diff)
downloadllvm-77f44a964212a54ebc014a703c6787ae236b6ef4.zip
llvm-77f44a964212a54ebc014a703c6787ae236b6ef4.tar.gz
llvm-77f44a964212a54ebc014a703c6787ae236b6ef4.tar.bz2
[CodeGen][NewPM] Port MachineSink to NPM (#115434)
Targets can set the EnableSinkAndFold option in CGPassBuilderOptions for the NPM pipeline in buildCodeGenPipeline(... &Opts, ...)
Diffstat (limited to 'llvm/lib/CodeGen/MachineSink.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineSink.cpp174
1 files changed, 129 insertions, 45 deletions
diff --git a/llvm/lib/CodeGen/MachineSink.cpp b/llvm/lib/CodeGen/MachineSink.cpp
index 0dbf560..4f206a8a 100644
--- a/llvm/lib/CodeGen/MachineSink.cpp
+++ b/llvm/lib/CodeGen/MachineSink.cpp
@@ -15,6 +15,7 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/CodeGen/MachineSink.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/MapVector.h"
@@ -26,6 +27,8 @@
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
+#include "llvm/CodeGen/LiveIntervals.h"
+#include "llvm/CodeGen/LiveVariables.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
@@ -42,6 +45,7 @@
#include "llvm/CodeGen/MachineSizeOpts.h"
#include "llvm/CodeGen/RegisterClassInfo.h"
#include "llvm/CodeGen/RegisterPressure.h"
+#include "llvm/CodeGen/SlotIndexes.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
@@ -118,7 +122,7 @@ using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
namespace {
-class MachineSinking : public MachineFunctionPass {
+class MachineSinking {
const TargetSubtargetInfo *STI = nullptr;
const TargetInstrInfo *TII = nullptr;
const TargetRegisterInfo *TRI = nullptr;
@@ -132,6 +136,11 @@ class MachineSinking : public MachineFunctionPass {
AliasAnalysis *AA = nullptr;
RegisterClassInfo RegClassInfo;
TargetSchedModel SchedModel;
+ // Required for split critical edge
+ LiveIntervals *LIS;
+ SlotIndexes *SI;
+ LiveVariables *LV;
+ MachineLoopInfo *MLI;
// Remember which edges have been considered for breaking.
SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8>
@@ -189,30 +198,19 @@ class MachineSinking : public MachineFunctionPass {
bool EnableSinkAndFold;
public:
- static char ID; // Pass identification
-
- MachineSinking() : MachineFunctionPass(ID) {
- initializeMachineSinkingPass(*PassRegistry::getPassRegistry());
- }
-
- bool runOnMachineFunction(MachineFunction &MF) override;
-
- void getAnalysisUsage(AnalysisUsage &AU) const override {
- MachineFunctionPass::getAnalysisUsage(AU);
- AU.addRequired<AAResultsWrapperPass>();
- AU.addRequired<MachineDominatorTreeWrapperPass>();
- AU.addRequired<MachinePostDominatorTreeWrapperPass>();
- AU.addRequired<MachineCycleInfoWrapperPass>();
- AU.addRequired<MachineBranchProbabilityInfoWrapperPass>();
- AU.addPreserved<MachineCycleInfoWrapperPass>();
- AU.addPreserved<MachineLoopInfoWrapperPass>();
- AU.addRequired<ProfileSummaryInfoWrapperPass>();
- if (UseBlockFreqInfo)
- AU.addRequired<MachineBlockFrequencyInfoWrapperPass>();
- AU.addRequired<TargetPassConfig>();
- }
-
- void releaseMemory() override {
+ MachineSinking(bool EnableSinkAndFold, MachineDominatorTree *DT,
+ MachinePostDominatorTree *PDT, LiveVariables *LV,
+ MachineLoopInfo *MLI, SlotIndexes *SI, LiveIntervals *LIS,
+ MachineCycleInfo *CI, ProfileSummaryInfo *PSI,
+ MachineBlockFrequencyInfo *MBFI,
+ const MachineBranchProbabilityInfo *MBPI, AliasAnalysis *AA)
+ : DT(DT), PDT(PDT), CI(CI), PSI(PSI), MBFI(MBFI), MBPI(MBPI), AA(AA),
+ LIS(LIS), SI(SI), LV(LV), MLI(MLI),
+ EnableSinkAndFold(EnableSinkAndFold) {}
+
+ bool run(MachineFunction &MF);
+
+ void releaseMemory() {
CEBCandidates.clear();
CEMergeCandidates.clear();
}
@@ -290,21 +288,47 @@ private:
bool registerPressureExceedsLimit(const MachineBasicBlock &MBB);
};
+class MachineSinkingLegacy : public MachineFunctionPass {
+public:
+ static char ID;
+
+ MachineSinkingLegacy() : MachineFunctionPass(ID) {
+ initializeMachineSinkingLegacyPass(*PassRegistry::getPassRegistry());
+ }
+
+ bool runOnMachineFunction(MachineFunction &MF) override;
+
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
+ MachineFunctionPass::getAnalysisUsage(AU);
+ AU.addRequired<AAResultsWrapperPass>();
+ AU.addRequired<MachineDominatorTreeWrapperPass>();
+ AU.addRequired<MachinePostDominatorTreeWrapperPass>();
+ AU.addRequired<MachineCycleInfoWrapperPass>();
+ AU.addRequired<MachineBranchProbabilityInfoWrapperPass>();
+ AU.addPreserved<MachineCycleInfoWrapperPass>();
+ AU.addPreserved<MachineLoopInfoWrapperPass>();
+ AU.addRequired<ProfileSummaryInfoWrapperPass>();
+ if (UseBlockFreqInfo)
+ AU.addRequired<MachineBlockFrequencyInfoWrapperPass>();
+ AU.addRequired<TargetPassConfig>();
+ }
+};
+
} // end anonymous namespace
-char MachineSinking::ID = 0;
+char MachineSinkingLegacy::ID = 0;
-char &llvm::MachineSinkingID = MachineSinking::ID;
+char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy::ID;
-INITIALIZE_PASS_BEGIN(MachineSinking, DEBUG_TYPE, "Machine code sinking", false,
- false)
+INITIALIZE_PASS_BEGIN(MachineSinkingLegacy, DEBUG_TYPE, "Machine code sinking",
+ false, false)
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
-INITIALIZE_PASS_END(MachineSinking, DEBUG_TYPE, "Machine code sinking", false,
- false)
+INITIALIZE_PASS_END(MachineSinkingLegacy, DEBUG_TYPE, "Machine code sinking",
+ false, false)
/// Return true if a target defined block prologue instruction interferes
/// with a sink candidate.
@@ -728,28 +752,87 @@ void MachineSinking::FindCycleSinkCandidates(
}
}
-bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
+PreservedAnalyses
+MachineSinkingPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ auto *DT = &MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
+ auto *PDT = &MFAM.getResult<MachinePostDominatorTreeAnalysis>(MF);
+ auto *CI = &MFAM.getResult<MachineCycleAnalysis>(MF);
+ auto *PSI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)
+ .getCachedResult<ProfileSummaryAnalysis>(
+ *MF.getFunction().getParent());
+ auto *MBFI = UseBlockFreqInfo
+ ? &MFAM.getResult<MachineBlockFrequencyAnalysis>(MF)
+ : nullptr;
+ auto *MBPI = &MFAM.getResult<MachineBranchProbabilityAnalysis>(MF);
+ auto *AA = &MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(MF)
+ .getManager()
+ .getResult<AAManager>(MF.getFunction());
+ auto *LIS = MFAM.getCachedResult<LiveIntervalsAnalysis>(MF);
+ auto *SI = MFAM.getCachedResult<SlotIndexesAnalysis>(MF);
+ auto *LV = MFAM.getCachedResult<LiveVariablesAnalysis>(MF);
+ auto *MLI = MFAM.getCachedResult<MachineLoopAnalysis>(MF);
+ MachineSinking Impl(EnableSinkAndFold, DT, PDT, LV, MLI, SI, LIS, CI, PSI,
+ MBFI, MBPI, AA);
+ bool Changed = Impl.run(MF);
+ if (!Changed)
+ return PreservedAnalyses::all();
+ auto PA = getMachineFunctionPassPreservedAnalyses();
+ PA.preserve<MachineCycleAnalysis>();
+ PA.preserve<MachineLoopAnalysis>();
+ return PA;
+}
+
+void MachineSinkingPass::printPipeline(
+ raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
+ OS << MapClassName2PassName(name()); // ideally machine-sink
+ if (EnableSinkAndFold)
+ OS << "<enable-sink-fold>";
+}
+
+bool MachineSinkingLegacy::runOnMachineFunction(MachineFunction &MF) {
if (skipFunction(MF.getFunction()))
return false;
+ TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
+ bool EnableSinkAndFold = PassConfig->getEnableSinkAndFold();
+
+ auto *DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
+ auto *PDT =
+ &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
+ auto *CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo();
+ auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
+ auto *MBFI =
+ UseBlockFreqInfo
+ ? &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI()
+ : nullptr;
+ auto *MBPI =
+ &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
+ auto *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
+ // Get analyses for split critical edge.
+ auto *LISWrapper = getAnalysisIfAvailable<LiveIntervalsWrapperPass>();
+ auto *LIS = LISWrapper ? &LISWrapper->getLIS() : nullptr;
+ auto *SIWrapper = getAnalysisIfAvailable<SlotIndexesWrapperPass>();
+ auto *SI = SIWrapper ? &SIWrapper->getSI() : nullptr;
+ auto *LVWrapper = getAnalysisIfAvailable<LiveVariablesWrapperPass>();
+ auto *LV = LVWrapper ? &LVWrapper->getLV() : nullptr;
+ auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
+ auto *MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
+
+ MachineSinking Impl(EnableSinkAndFold, DT, PDT, LV, MLI, SI, LIS, CI, PSI,
+ MBFI, MBPI, AA);
+ return Impl.run(MF);
+}
+
+bool MachineSinking::run(MachineFunction &MF) {
LLVM_DEBUG(dbgs() << "******** Machine Sinking ********\n");
STI = &MF.getSubtarget();
TII = STI->getInstrInfo();
TRI = STI->getRegisterInfo();
MRI = &MF.getRegInfo();
- DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
- PDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
- CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo();
- PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
- MBFI = UseBlockFreqInfo
- ? &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI()
- : nullptr;
- MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
- AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
+
RegClassInfo.runOnMachineFunction(MF);
- TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
- EnableSinkAndFold = PassConfig->getEnableSinkAndFold();
bool EverMadeChange = false;
@@ -767,8 +850,8 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
MachineDomTreeUpdater MDTU(DT, PDT,
MachineDomTreeUpdater::UpdateStrategy::Lazy);
for (const auto &Pair : ToSplit) {
- auto NewSucc =
- Pair.first->SplitCriticalEdge(Pair.second, *this, nullptr, &MDTU);
+ auto NewSucc = Pair.first->SplitCriticalEdge(
+ Pair.second, {LIS, SI, LV, MLI}, nullptr, &MDTU);
if (NewSucc != nullptr) {
LLVM_DEBUG(dbgs() << " *** Splitting critical edge: "
<< printMBBReference(*Pair.first) << " -- "
@@ -858,6 +941,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
MRI->clearKillFlags(I);
RegsToClearKillFlags.clear();
+ releaseMemory();
return EverMadeChange;
}