[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