[llvm] [NewPM] Adds a port for AArch64PostCoalescerPass (PR #189520)

via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 30 18:58:51 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-aarch64

Author: Anshul Nigham (nigham)

<details>
<summary>Changes</summary>

Adds a standard porting for AArch64PostCoalescer to NewPM.

---
Full diff: https://github.com/llvm/llvm-project/pull/189520.diff


5 Files Affected:

- (modified) llvm/lib/Target/AArch64/AArch64.h (+8-1) 
- (modified) llvm/lib/Target/AArch64/AArch64PassRegistry.def (+1) 
- (modified) llvm/lib/Target/AArch64/AArch64PostCoalescerPass.cpp (+42-17) 
- (modified) llvm/lib/Target/AArch64/AArch64TargetMachine.cpp (+1-1) 
- (modified) llvm/test/CodeGen/AArch64/aarch64-post-coalescer.mir (+1) 


``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64.h b/llvm/lib/Target/AArch64/AArch64.h
index a4910df6957c9..81d44a2947d2e 100644
--- a/llvm/lib/Target/AArch64/AArch64.h
+++ b/llvm/lib/Target/AArch64/AArch64.h
@@ -99,7 +99,7 @@ void initializeAArch64LoadStoreOptLegacyPass(PassRegistry &);
 void initializeAArch64LowerHomogeneousPrologEpilogPass(PassRegistry &);
 void initializeAArch64MIPeepholeOptLegacyPass(PassRegistry &);
 void initializeAArch64O0PreLegalizerCombinerPass(PassRegistry &);
-void initializeAArch64PostCoalescerPass(PassRegistry &);
+void initializeAArch64PostCoalescerLegacyPass(PassRegistry &);
 void initializeAArch64PostLegalizerCombinerPass(PassRegistry &);
 void initializeAArch64PostLegalizerLoweringPass(PassRegistry &);
 void initializeAArch64PostSelectOptimizePass(PassRegistry &);
@@ -195,6 +195,13 @@ class AArch64PointerAuthPass : public PassInfoMixin<AArch64PointerAuthPass> {
                         MachineFunctionAnalysisManager &MFAM);
 };
 
+class AArch64PostCoalescerPass
+    : public PassInfoMixin<AArch64PostCoalescerPass> {
+public:
+  PreservedAnalyses run(MachineFunction &MF,
+                        MachineFunctionAnalysisManager &MFAM);
+};
+
 } // end namespace llvm
 
 #endif
diff --git a/llvm/lib/Target/AArch64/AArch64PassRegistry.def b/llvm/lib/Target/AArch64/AArch64PassRegistry.def
index 9567d76ccf64c..fb37537ba9547 100644
--- a/llvm/lib/Target/AArch64/AArch64PassRegistry.def
+++ b/llvm/lib/Target/AArch64/AArch64PassRegistry.def
@@ -35,6 +35,7 @@ MACHINE_FUNCTION_PASS("aarch64-fix-cortex-a53-835769", AArch64A53Fix835769Pass()
 MACHINE_FUNCTION_PASS("aarch64-jump-tables", AArch64CompressJumpTablesPass())
 MACHINE_FUNCTION_PASS("aarch64-ldst-opt", AArch64LoadStoreOptPass())
 MACHINE_FUNCTION_PASS("aarch64-mi-peephole-opt", AArch64MIPeepholeOptPass())
+MACHINE_FUNCTION_PASS("aarch64-post-coalescer-pass", AArch64PostCoalescerPass())
 MACHINE_FUNCTION_PASS("aarch64-ptrauth", AArch64PointerAuthPass())
 MACHINE_FUNCTION_PASS("aarch64-simd-scalar", AArch64AdvSIMDScalarPass())
 #undef MACHINE_FUNCTION_PASS
diff --git a/llvm/lib/Target/AArch64/AArch64PostCoalescerPass.cpp b/llvm/lib/Target/AArch64/AArch64PostCoalescerPass.cpp
index e6f55073b8f12..1696e62e7d3f9 100644
--- a/llvm/lib/Target/AArch64/AArch64PostCoalescerPass.cpp
+++ b/llvm/lib/Target/AArch64/AArch64PostCoalescerPass.cpp
@@ -7,8 +7,10 @@
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 
+#include "AArch64.h"
 #include "AArch64MachineFunctionInfo.h"
 #include "llvm/CodeGen/LiveIntervals.h"
+#include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineRegisterInfo.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/InitializePasses.h"
@@ -19,13 +21,18 @@ using namespace llvm;
 
 namespace {
 
-struct AArch64PostCoalescer : public MachineFunctionPass {
-  static char ID;
+struct AArch64PostCoalescerImpl {
+  LiveIntervals &LIS;
+  MachineRegisterInfo *MRI;
 
-  AArch64PostCoalescer() : MachineFunctionPass(ID) {}
+  explicit AArch64PostCoalescerImpl(LiveIntervals &LIS) : LIS(LIS) {}
+  bool run(MachineFunction &MF);
+};
 
-  LiveIntervals *LIS;
-  MachineRegisterInfo *MRI;
+struct AArch64PostCoalescerLegacy : public MachineFunctionPass {
+  static char ID;
+
+  AArch64PostCoalescerLegacy() : MachineFunctionPass(ID) {}
 
   bool runOnMachineFunction(MachineFunction &MF) override;
 
@@ -42,26 +49,22 @@ struct AArch64PostCoalescer : public MachineFunctionPass {
   }
 };
 
-char AArch64PostCoalescer::ID = 0;
+char AArch64PostCoalescerLegacy::ID = 0;
 
 } // end anonymous namespace
 
-INITIALIZE_PASS_BEGIN(AArch64PostCoalescer, "aarch64-post-coalescer-pass",
+INITIALIZE_PASS_BEGIN(AArch64PostCoalescerLegacy, "aarch64-post-coalescer-pass",
                       "AArch64 Post Coalescer Pass", false, false)
 INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass)
-INITIALIZE_PASS_END(AArch64PostCoalescer, "aarch64-post-coalescer-pass",
+INITIALIZE_PASS_END(AArch64PostCoalescerLegacy, "aarch64-post-coalescer-pass",
                     "AArch64 Post Coalescer Pass", false, false)
 
-bool AArch64PostCoalescer::runOnMachineFunction(MachineFunction &MF) {
-  if (skipFunction(MF.getFunction()))
-    return false;
-
+bool AArch64PostCoalescerImpl::run(MachineFunction &MF) {
   AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>();
   if (!FuncInfo->hasStreamingModeChanges())
     return false;
 
   MRI = &MF.getRegInfo();
-  LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
   bool Changed = false;
 
   for (MachineBasicBlock &MBB : MF) {
@@ -84,11 +87,11 @@ bool AArch64PostCoalescer::runOnMachineFunction(MachineFunction &MF) {
 
         // MI must be erased from the basic block before recalculating the live
         // interval.
-        LIS->RemoveMachineInstrFromMaps(MI);
+        LIS.RemoveMachineInstrFromMaps(MI);
         MI.eraseFromParent();
 
-        LIS->removeInterval(Src);
-        LIS->createAndComputeVirtRegInterval(Src);
+        LIS.removeInterval(Src);
+        LIS.createAndComputeVirtRegInterval(Src);
 
         Changed = true;
         break;
@@ -100,6 +103,28 @@ bool AArch64PostCoalescer::runOnMachineFunction(MachineFunction &MF) {
   return Changed;
 }
 
+bool AArch64PostCoalescerLegacy::runOnMachineFunction(MachineFunction &MF) {
+  if (skipFunction(MF.getFunction()))
+    return false;
+
+  auto &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS();
+  return AArch64PostCoalescerImpl(LIS).run(MF);
+}
+
+PreservedAnalyses
+AArch64PostCoalescerPass::run(MachineFunction &MF,
+                              MachineFunctionAnalysisManager &MFAM) {
+  auto &LIS = MFAM.getResult<LiveIntervalsAnalysis>(MF);
+  const bool Changed = AArch64PostCoalescerImpl(LIS).run(MF);
+  if (!Changed)
+    return PreservedAnalyses::all();
+  PreservedAnalyses PA = getMachineFunctionPassPreservedAnalyses();
+  PA.preserveSet<CFGAnalyses>();
+  PA.preserve<LiveIntervalsAnalysis>();
+  PA.preserve<SlotIndexesAnalysis>();
+  return PA;
+}
+
 FunctionPass *llvm::createAArch64PostCoalescerPass() {
-  return new AArch64PostCoalescer();
+  return new AArch64PostCoalescerLegacy();
 }
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
index b8c2c96301b69..d8a8210f22be2 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -260,7 +260,7 @@ LLVMInitializeAArch64Target() {
   initializeAArch64O0PreLegalizerCombinerPass(PR);
   initializeAArch64PreLegalizerCombinerPass(PR);
   initializeAArch64PointerAuthLegacyPass(PR);
-  initializeAArch64PostCoalescerPass(PR);
+  initializeAArch64PostCoalescerLegacyPass(PR);
   initializeAArch64PostLegalizerCombinerPass(PR);
   initializeAArch64PostLegalizerLoweringPass(PR);
   initializeAArch64PostSelectOptimizePass(PR);
diff --git a/llvm/test/CodeGen/AArch64/aarch64-post-coalescer.mir b/llvm/test/CodeGen/AArch64/aarch64-post-coalescer.mir
index 654016014be98..03278bdda8603 100644
--- a/llvm/test/CodeGen/AArch64/aarch64-post-coalescer.mir
+++ b/llvm/test/CodeGen/AArch64/aarch64-post-coalescer.mir
@@ -1,5 +1,6 @@
 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
 # RUN: llc -mtriple=aarch64 -mattr=+sme -run-pass=aarch64-post-coalescer-pass -o - %s | FileCheck %s
+# RUN: llc -mtriple=aarch64 -mattr=+sme -passes=aarch64-post-coalescer-pass -o - %s | FileCheck %s
 
 ---
 name:            foo

``````````

</details>


https://github.com/llvm/llvm-project/pull/189520


More information about the llvm-commits mailing list