[llvm] [CodeGen][NewPM] Port machine-region-info to new pass manager (PR #203848)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 15 03:08:58 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
Author: paperchalice
<details>
<summary>Changes</summary>
- Make `MachineRegionInfo` movable, like `RegionInfo`.
- Add printer pass.
---
Full diff: https://github.com/llvm/llvm-project/pull/203848.diff
5 Files Affected:
- (modified) llvm/include/llvm/CodeGen/MachineRegionInfo.h (+40)
- (modified) llvm/include/llvm/Passes/MachinePassRegistry.def (+3-2)
- (modified) llvm/lib/CodeGen/MachineRegionInfo.cpp (+33)
- (modified) llvm/lib/Passes/PassBuilder.cpp (+1)
- (modified) llvm/test/CodeGen/X86/machine-region-info.mir (+1)
``````````diff
diff --git a/llvm/include/llvm/CodeGen/MachineRegionInfo.h b/llvm/include/llvm/CodeGen/MachineRegionInfo.h
index 2f8fcadefe675..46135ac7170b0 100644
--- a/llvm/include/llvm/CodeGen/MachineRegionInfo.h
+++ b/llvm/include/llvm/CodeGen/MachineRegionInfo.h
@@ -18,6 +18,7 @@
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/CodeGen/MachinePassManager.h"
#include <cassert>
namespace llvm {
@@ -73,9 +74,26 @@ class MachineRegion : public RegionBase<RegionTraits<MachineFunction>> {
class LLVM_ABI MachineRegionInfo
: public RegionInfoBase<RegionTraits<MachineFunction>> {
public:
+ using Base = RegionInfoBase<RegionTraits<MachineFunction>>;
+
explicit MachineRegionInfo();
~MachineRegionInfo() override;
+ MachineRegionInfo(MachineRegionInfo &&Arg)
+ : Base(std::move(static_cast<Base &>(Arg))) {
+ updateRegionTree(*this, TopLevelRegion);
+ }
+
+ MachineRegionInfo &operator=(MachineRegionInfo &&RHS) {
+ Base::operator=(std::move(static_cast<Base &>(RHS)));
+ updateRegionTree(*this, TopLevelRegion);
+ return *this;
+ }
+
+ /// Handle invalidation explicitly.
+ bool invalidate(MachineFunction &F, const PreservedAnalyses &PA,
+ MachineFunctionAnalysisManager::Invalidator &);
+
// updateStatistics - Update statistic about created regions.
void updateStatistics(MachineRegion *R) final;
@@ -83,6 +101,28 @@ class LLVM_ABI MachineRegionInfo
MachinePostDominatorTree *PDT, MachineDominanceFrontier *DF);
};
+class LLVM_ABI MachineRegionInfoAnalysis
+ : public AnalysisInfoMixin<MachineRegionInfoAnalysis> {
+ friend AnalysisInfoMixin<MachineRegionInfoAnalysis>;
+
+ static AnalysisKey Key;
+
+public:
+ using Result = MachineRegionInfo;
+
+ Result run(MachineFunction &F, MachineFunctionAnalysisManager &AM);
+};
+
+class LLVM_ABI MachineRegionInfoPrinterPass
+ : public RequiredPassInfoMixin<MachineRegionInfoPrinterPass> {
+ raw_ostream &OS;
+
+public:
+ explicit MachineRegionInfoPrinterPass(raw_ostream &OS) : OS(OS) {}
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+
class LLVM_ABI MachineRegionInfoPass : public MachineFunctionPass {
MachineRegionInfo RI;
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def
index 93617ee54965f..bd411b7331ed0 100644
--- a/llvm/include/llvm/Passes/MachinePassRegistry.def
+++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -46,6 +46,7 @@ MACHINE_FUNCTION_ANALYSIS("machine-opt-remark-emitter",
MachineOptimizationRemarkEmitterAnalysis())
MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree",
MachinePostDominatorTreeAnalysis())
+MACHINE_FUNCTION_ANALYSIS("machine-regions", MachineRegionInfoAnalysis())
MACHINE_FUNCTION_ANALYSIS("machine-trace-metrics", MachineTraceMetricsAnalysis())
MACHINE_FUNCTION_ANALYSIS("machine-uniformity", MachineUniformityAnalysis())
MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))
@@ -55,8 +56,6 @@ MACHINE_FUNCTION_ANALYSIS("regalloc-priority", RegAllocPriorityAdvisorAnalysis()
MACHINE_FUNCTION_ANALYSIS("slot-indexes", SlotIndexesAnalysis())
MACHINE_FUNCTION_ANALYSIS("spill-code-placement", SpillPlacementAnalysis())
MACHINE_FUNCTION_ANALYSIS("virtregmap", VirtRegMapAnalysis())
-// MACHINE_FUNCTION_ANALYSIS("machine-region-info",
-// MachineRegionInfoPassAnalysis())
// MACHINE_FUNCTION_ANALYSIS("gc-analysis",
// GCMachineCodeAnalysisPass())
#undef MACHINE_FUNCTION_ANALYSIS
@@ -116,6 +115,8 @@ MACHINE_FUNCTION_PASS("print<machine-dom-tree>",
MACHINE_FUNCTION_PASS("print<machine-loops>", MachineLoopPrinterPass(errs()))
MACHINE_FUNCTION_PASS("print<machine-post-dom-tree>",
MachinePostDominatorTreePrinterPass(errs()))
+MACHINE_FUNCTION_PASS("print<machine-regions>",
+ MachineRegionInfoPrinterPass(errs()))
MACHINE_FUNCTION_PASS("print<machine-uniformity>",
MachineUniformityPrinterPass(errs()))
MACHINE_FUNCTION_PASS("print<reaching-def>", ReachingDefPrinterPass(errs()))
diff --git a/llvm/lib/CodeGen/MachineRegionInfo.cpp b/llvm/lib/CodeGen/MachineRegionInfo.cpp
index 9f90bfe15ecd8..76bd58e59b68c 100644
--- a/llvm/lib/CodeGen/MachineRegionInfo.cpp
+++ b/llvm/lib/CodeGen/MachineRegionInfo.cpp
@@ -72,6 +72,39 @@ void MachineRegionInfo::recalculate(MachineFunction &F,
calculate(F);
}
+bool MachineRegionInfo::invalidate(
+ MachineFunction &F, const PreservedAnalyses &PA,
+ MachineFunctionAnalysisManager::Invalidator &) {
+ // Check whether the analysis, all analyses on functions, or the function's
+ // CFG has been preserved.
+ auto PAC = PA.getChecker<MachineRegionInfoAnalysis>();
+ return !(PAC.preserved() ||
+ PAC.preservedSet<AllAnalysesOn<MachineFunction>>() ||
+ PAC.preservedSet<CFGAnalyses>());
+}
+
+//===----------------------------------------------------------------------===//
+// MachineRegionAnalysis implementation
+//
+AnalysisKey MachineRegionInfoAnalysis::Key;
+MachineRegionInfo
+MachineRegionInfoAnalysis::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ MachineRegionInfo MRI;
+ MRI.recalculate(MF, &MFAM.getResult<MachineDominatorTreeAnalysis>(MF),
+ &MFAM.getResult<MachinePostDominatorTreeAnalysis>(MF),
+ &MFAM.getResult<MachineDominanceFrontierAnalysis>(MF));
+ return MRI;
+}
+
+PreservedAnalyses
+MachineRegionInfoPrinterPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ MachineRegionInfo &MRI = MFAM.getResult<MachineRegionInfoAnalysis>(MF);
+ MRI.print(OS);
+ return PreservedAnalyses::all();
+}
+
//===----------------------------------------------------------------------===//
// MachineRegionInfoPass implementation
//
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index abf92ba7b018c..e88b81a13fae9 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -138,6 +138,7 @@
#include "llvm/CodeGen/MachineLateInstrsCleanup.h"
#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/CodeGen/MachinePostDominators.h"
+#include "llvm/CodeGen/MachineRegionInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/MachineScheduler.h"
#include "llvm/CodeGen/MachineSink.h"
diff --git a/llvm/test/CodeGen/X86/machine-region-info.mir b/llvm/test/CodeGen/X86/machine-region-info.mir
index 8b3aae6a6b005..30d4af6688aa3 100644
--- a/llvm/test/CodeGen/X86/machine-region-info.mir
+++ b/llvm/test/CodeGen/X86/machine-region-info.mir
@@ -1,4 +1,5 @@
# RUN: llc -mtriple=x86_64-- -run-pass=machine-region-info %s -debug-only=machine-region-info -o /dev/null 2>&1 | FileCheck %s
+# RUN: llc -mtriple=x86_64-- -p 'print<machine-regions>' %s -debug-only=machine-region-info -o /dev/null 2>&1 | FileCheck %s
# REQUIRES: asserts
---
name: fun
``````````
</details>
https://github.com/llvm/llvm-project/pull/203848
More information about the llvm-commits
mailing list