[llvm] 6ad7d55 - [NewPM] Adds a port for AArch64ConditionalComparesPass (#192755)

via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 18 11:59:16 PDT 2026


Author: Anshul Nigham
Date: 2026-04-18T18:59:11Z
New Revision: 6ad7d557b9f5b969e96acd49b216e87cd3f1efc6

URL: https://github.com/llvm/llvm-project/commit/6ad7d557b9f5b969e96acd49b216e87cd3f1efc6
DIFF: https://github.com/llvm/llvm-project/commit/6ad7d557b9f5b969e96acd49b216e87cd3f1efc6.diff

LOG: [NewPM] Adds a port for AArch64ConditionalComparesPass (#192755)

Adds a standard porting for AArch64ConditionalCompares.

Added: 
    

Modified: 
    llvm/lib/Target/AArch64/AArch64.h
    llvm/lib/Target/AArch64/AArch64ConditionalCompares.cpp
    llvm/lib/Target/AArch64/AArch64PassRegistry.def
    llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
    llvm/test/CodeGen/AArch64/ccmp-look-through-copy.mir
    llvm/test/CodeGen/AArch64/ccmp-successor-probs.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/AArch64.h b/llvm/lib/Target/AArch64/AArch64.h
index 8cc60d3116a17..a6ad9bd470ea8 100644
--- a/llvm/lib/Target/AArch64/AArch64.h
+++ b/llvm/lib/Target/AArch64/AArch64.h
@@ -147,7 +147,7 @@ void initializeAArch64CollectLOHLegacyPass(PassRegistry &);
 void initializeAArch64CompressJumpTablesLegacyPass(PassRegistry &);
 void initializeAArch64CondBrTuningPass(PassRegistry &);
 void initializeAArch64ConditionOptimizerLegacyPass(PassRegistry &);
-void initializeAArch64ConditionalComparesPass(PassRegistry &);
+void initializeAArch64ConditionalComparesLegacyPass(PassRegistry &);
 void initializeAArch64DAGToDAGISelLegacyPass(PassRegistry &);
 void initializeAArch64DeadRegisterDefinitionsLegacyPass(PassRegistry &);
 void initializeAArch64ExpandPseudoLegacyPass(PassRegistry &);
@@ -278,6 +278,13 @@ class AArch64RedundantCopyEliminationPass
                         MachineFunctionAnalysisManager &MFAM);
 };
 
+class AArch64ConditionalComparesPass
+    : public PassInfoMixin<AArch64ConditionalComparesPass> {
+public:
+  PreservedAnalyses run(MachineFunction &MF,
+                        MachineFunctionAnalysisManager &MFAM);
+};
+
 } // end namespace llvm
 
 #endif

diff  --git a/llvm/lib/Target/AArch64/AArch64ConditionalCompares.cpp b/llvm/lib/Target/AArch64/AArch64ConditionalCompares.cpp
index 539281e00aa4b..4754f5c1bb5b4 100644
--- a/llvm/lib/Target/AArch64/AArch64ConditionalCompares.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ConditionalCompares.cpp
@@ -25,6 +25,7 @@
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/CodeGen/MachinePassManager.h"
 #include "llvm/CodeGen/MachineRegisterInfo.h"
 #include "llvm/CodeGen/MachineTraceMetrics.h"
 #include "llvm/CodeGen/Passes.h"
@@ -764,7 +765,7 @@ int SSACCmpConv::expectedCodeSizeDelta() const {
 //===----------------------------------------------------------------------===//
 
 namespace {
-class AArch64ConditionalCompares : public MachineFunctionPass {
+class AArch64ConditionalComparesImpl {
   const MachineBranchProbabilityInfo *MBPI;
   const TargetInstrInfo *TII;
   const TargetRegisterInfo *TRI;
@@ -779,13 +780,13 @@ class AArch64ConditionalCompares : public MachineFunctionPass {
   SSACCmpConv CmpConv;
 
 public:
-  static char ID;
-  AArch64ConditionalCompares() : MachineFunctionPass(ID) {}
-  void getAnalysisUsage(AnalysisUsage &AU) const override;
-  bool runOnMachineFunction(MachineFunction &MF) override;
-  StringRef getPassName() const override {
-    return "AArch64 Conditional Compares";
-  }
+  AArch64ConditionalComparesImpl(const MachineBranchProbabilityInfo *MBPI,
+                                 MachineDominatorTree *DomTree,
+                                 MachineLoopInfo *Loops,
+                                 MachineTraceMetrics *Traces)
+      : MBPI(MBPI), DomTree(DomTree), Loops(Loops), Traces(Traces) {}
+
+  bool run(MachineFunction &MF);
 
 private:
   bool tryConvert(MachineBasicBlock *);
@@ -794,23 +795,38 @@ class AArch64ConditionalCompares : public MachineFunctionPass {
   void invalidateTraces();
   bool shouldConvert();
 };
+
+class AArch64ConditionalComparesLegacy : public MachineFunctionPass {
+public:
+  static char ID;
+  AArch64ConditionalComparesLegacy() : MachineFunctionPass(ID) {
+    initializeAArch64ConditionalComparesLegacyPass(
+        *PassRegistry::getPassRegistry());
+  }
+  void getAnalysisUsage(AnalysisUsage &AU) const override;
+  bool runOnMachineFunction(MachineFunction &MF) override;
+  StringRef getPassName() const override {
+    return "AArch64 Conditional Compares";
+  }
+};
 } // end anonymous namespace
 
-char AArch64ConditionalCompares::ID = 0;
+char AArch64ConditionalComparesLegacy::ID = 0;
 
-INITIALIZE_PASS_BEGIN(AArch64ConditionalCompares, "aarch64-ccmp",
+INITIALIZE_PASS_BEGIN(AArch64ConditionalComparesLegacy, "aarch64-ccmp",
                       "AArch64 CCMP Pass", false, false)
 INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(MachineTraceMetricsWrapperPass)
-INITIALIZE_PASS_END(AArch64ConditionalCompares, "aarch64-ccmp",
+INITIALIZE_PASS_END(AArch64ConditionalComparesLegacy, "aarch64-ccmp",
                     "AArch64 CCMP Pass", false, false)
 
 FunctionPass *llvm::createAArch64ConditionalCompares() {
-  return new AArch64ConditionalCompares();
+  return new AArch64ConditionalComparesLegacy();
 }
 
-void AArch64ConditionalCompares::getAnalysisUsage(AnalysisUsage &AU) const {
+void AArch64ConditionalComparesLegacy::getAnalysisUsage(
+    AnalysisUsage &AU) const {
   AU.addRequired<MachineBranchProbabilityInfoWrapperPass>();
   AU.addRequired<MachineDominatorTreeWrapperPass>();
   AU.addPreserved<MachineDominatorTreeWrapperPass>();
@@ -822,7 +838,7 @@ void AArch64ConditionalCompares::getAnalysisUsage(AnalysisUsage &AU) const {
 }
 
 /// Update the dominator tree after if-conversion erased some blocks.
-void AArch64ConditionalCompares::updateDomTree(
+void AArch64ConditionalComparesImpl::updateDomTree(
     ArrayRef<MachineBasicBlock *> Removed) {
   // convert() removes CmpBB which was previously dominated by Head.
   // CmpBB children should be transferred to Head.
@@ -838,8 +854,8 @@ void AArch64ConditionalCompares::updateDomTree(
 }
 
 /// Update LoopInfo after if-conversion.
-void
-AArch64ConditionalCompares::updateLoops(ArrayRef<MachineBasicBlock *> Removed) {
+void AArch64ConditionalComparesImpl::updateLoops(
+    ArrayRef<MachineBasicBlock *> Removed) {
   if (!Loops)
     return;
   for (MachineBasicBlock *RemovedMBB : Removed)
@@ -847,7 +863,7 @@ AArch64ConditionalCompares::updateLoops(ArrayRef<MachineBasicBlock *> Removed) {
 }
 
 /// Invalidate MachineTraceMetrics before if-conversion.
-void AArch64ConditionalCompares::invalidateTraces() {
+void AArch64ConditionalComparesImpl::invalidateTraces() {
   Traces->invalidate(CmpConv.Head);
   Traces->invalidate(CmpConv.CmpBB);
 }
@@ -855,7 +871,7 @@ void AArch64ConditionalCompares::invalidateTraces() {
 /// Apply cost model and heuristics to the if-conversion in IfConv.
 /// Return true if the conversion is a good idea.
 ///
-bool AArch64ConditionalCompares::shouldConvert() {
+bool AArch64ConditionalComparesImpl::shouldConvert() {
   // Stress testing mode disables all cost considerations.
   if (Stress)
     return true;
@@ -916,7 +932,7 @@ bool AArch64ConditionalCompares::shouldConvert() {
   return true;
 }
 
-bool AArch64ConditionalCompares::tryConvert(MachineBasicBlock *MBB) {
+bool AArch64ConditionalComparesImpl::tryConvert(MachineBasicBlock *MBB) {
   bool Changed = false;
   while (CmpConv.canConvert(MBB) && shouldConvert()) {
     invalidateTraces();
@@ -931,20 +947,14 @@ bool AArch64ConditionalCompares::tryConvert(MachineBasicBlock *MBB) {
   return Changed;
 }
 
-bool AArch64ConditionalCompares::runOnMachineFunction(MachineFunction &MF) {
+bool AArch64ConditionalComparesImpl::run(MachineFunction &MF) {
   LLVM_DEBUG(dbgs() << "********** AArch64 Conditional Compares **********\n"
                     << "********** Function: " << MF.getName() << '\n');
-  if (skipFunction(MF.getFunction()))
-    return false;
 
   TII = MF.getSubtarget().getInstrInfo();
   TRI = MF.getSubtarget().getRegisterInfo();
   SchedModel = MF.getSubtarget().getSchedModel();
   MRI = &MF.getRegInfo();
-  DomTree = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
-  Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
-  MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
-  Traces = &getAnalysis<MachineTraceMetricsWrapperPass>().getMTM();
   MinInstr = nullptr;
   MinSize = MF.getFunction().hasMinSize();
 
@@ -962,3 +972,43 @@ bool AArch64ConditionalCompares::runOnMachineFunction(MachineFunction &MF) {
 
   return Changed;
 }
+
+bool AArch64ConditionalComparesLegacy::runOnMachineFunction(
+    MachineFunction &MF) {
+  if (skipFunction(MF.getFunction()))
+    return false;
+
+  const MachineBranchProbabilityInfo *MBPI =
+      &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
+  MachineDominatorTree *DomTree =
+      &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
+  MachineLoopInfo *Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
+  MachineTraceMetrics *Traces =
+      &getAnalysis<MachineTraceMetricsWrapperPass>().getMTM();
+
+  AArch64ConditionalComparesImpl Impl(MBPI, DomTree, Loops, Traces);
+  return Impl.run(MF);
+}
+
+PreservedAnalyses
+AArch64ConditionalComparesPass::run(MachineFunction &MF,
+                                    MachineFunctionAnalysisManager &MFAM) {
+  const MachineBranchProbabilityInfo *MBPI =
+      &MFAM.getResult<MachineBranchProbabilityAnalysis>(MF);
+  MachineDominatorTree *DomTree =
+      &MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
+  MachineLoopInfo *Loops = &MFAM.getResult<MachineLoopAnalysis>(MF);
+  MachineTraceMetrics *Traces =
+      &MFAM.getResult<MachineTraceMetricsAnalysis>(MF);
+
+  AArch64ConditionalComparesImpl Impl(MBPI, DomTree, Loops, Traces);
+  bool Changed = Impl.run(MF);
+  if (!Changed)
+    return PreservedAnalyses::all();
+
+  PreservedAnalyses PA = getMachineFunctionPassPreservedAnalyses();
+  PA.preserve<MachineDominatorTreeAnalysis>();
+  PA.preserve<MachineLoopAnalysis>();
+  PA.preserve<MachineTraceMetricsAnalysis>();
+  return PA;
+}

diff  --git a/llvm/lib/Target/AArch64/AArch64PassRegistry.def b/llvm/lib/Target/AArch64/AArch64PassRegistry.def
index 5f6eed29ae734..f64873b9fece6 100644
--- a/llvm/lib/Target/AArch64/AArch64PassRegistry.def
+++ b/llvm/lib/Target/AArch64/AArch64PassRegistry.def
@@ -28,6 +28,7 @@
 #endif
 MACHINE_FUNCTION_PASS("aarch64-a57-fp-load-balancing", AArch64A57FPLoadBalancingPass())
 MACHINE_FUNCTION_PASS("aarch64-branch-targets", AArch64BranchTargetsPass())
+MACHINE_FUNCTION_PASS("aarch64-ccmp", AArch64ConditionalComparesPass())
 MACHINE_FUNCTION_PASS("aarch64-collect-loh", AArch64CollectLOHPass())
 MACHINE_FUNCTION_PASS("aarch64-condopt", AArch64ConditionOptimizerPass())
 MACHINE_FUNCTION_PASS("aarch64-copyelim", AArch64RedundantCopyEliminationPass())

diff  --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
index 04506be1eb28d..127f86026d953 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -245,7 +245,7 @@ LLVMInitializeAArch64Target() {
   initializeAArch64BranchTargetsLegacyPass(PR);
   initializeAArch64CollectLOHLegacyPass(PR);
   initializeAArch64CompressJumpTablesLegacyPass(PR);
-  initializeAArch64ConditionalComparesPass(PR);
+  initializeAArch64ConditionalComparesLegacyPass(PR);
   initializeAArch64ConditionOptimizerLegacyPass(PR);
   initializeAArch64DeadRegisterDefinitionsLegacyPass(PR);
   initializeAArch64ExpandPseudoLegacyPass(PR);

diff  --git a/llvm/test/CodeGen/AArch64/ccmp-look-through-copy.mir b/llvm/test/CodeGen/AArch64/ccmp-look-through-copy.mir
index 8c0017ae1343c..0893c69009396 100644
--- a/llvm/test/CodeGen/AArch64/ccmp-look-through-copy.mir
+++ b/llvm/test/CodeGen/AArch64/ccmp-look-through-copy.mir
@@ -1,4 +1,5 @@
 # RUN: llc -o - %s -mtriple=aarch64 -run-pass=aarch64-ccmp -aarch64-stress-ccmp | FileCheck %s
+# RUN: llc -o - %s -mtriple=aarch64 -passes=aarch64-ccmp -aarch64-stress-ccmp | FileCheck %s
 ---
 name: ccmp-look-through-copy
 tracksRegLiveness: true

diff  --git a/llvm/test/CodeGen/AArch64/ccmp-successor-probs.mir b/llvm/test/CodeGen/AArch64/ccmp-successor-probs.mir
index df27fc499b813..b99b49fd86f56 100644
--- a/llvm/test/CodeGen/AArch64/ccmp-successor-probs.mir
+++ b/llvm/test/CodeGen/AArch64/ccmp-successor-probs.mir
@@ -1,4 +1,5 @@
 # RUN: llc -o - %s -mtriple=aarch64--linux-gnu -mcpu=falkor -run-pass=aarch64-ccmp | FileCheck %s
+# RUN: llc -o - %s -mtriple=aarch64--linux-gnu -mcpu=falkor -passes=aarch64-ccmp | FileCheck %s
 ---
 # This test checks that successor probabilties are properly updated after a
 # ccmp-conversion.


        


More information about the llvm-commits mailing list