[llvm] [NewPM] Adds a port for AArch64PostSelectOptimize (PR #192599)
Anshul Nigham via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 16 23:24:05 PDT 2026
https://github.com/nigham created https://github.com/llvm/llvm-project/pull/192599
Standard porting with updated tests.
Note: Removed unused dep on TargetPassConfig for legacy pass.
>From ea046978081b6b2abbf381e8d3d49ad721349aa9 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Thu, 16 Apr 2026 23:22:23 -0700
Subject: [PATCH] [NewPM] Adds a port for AArch64PostSelectOptimize
Standard porting with updated tests.
Note: Removed unused dep on TargetPassConfig for legacy pass.
---
llvm/lib/Target/AArch64/AArch64.h | 9 ++-
.../Target/AArch64/AArch64PassRegistry.def | 2 +
.../Target/AArch64/AArch64TargetMachine.cpp | 2 +-
.../GISel/AArch64PostSelectOptimize.cpp | 69 ++++++++++++-------
.../postselectopt-constrain-new-regop.mir | 1 +
.../postselectopt-dead-cc-defs-in-fcmp.mir | 1 +
.../GlobalISel/postselectopt-dead-cc-defs.mir | 1 +
.../postselectopt-xclass-copies.mir | 1 +
8 files changed, 59 insertions(+), 27 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64.h b/llvm/lib/Target/AArch64/AArch64.h
index 8a7c8680da63c..8983dd28c2286 100644
--- a/llvm/lib/Target/AArch64/AArch64.h
+++ b/llvm/lib/Target/AArch64/AArch64.h
@@ -101,6 +101,13 @@ class AArch64PreLegalizerCombinerPass
MachineFunctionAnalysisManager &MFAM);
};
+class AArch64PostSelectOptimizePass
+ : public PassInfoMixin<AArch64PostSelectOptimizePass> {
+public:
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+
FunctionPass *createAArch64O0PreLegalizerCombiner();
FunctionPass *createAArch64PreLegalizerCombiner();
FunctionPass *createAArch64PostLegalizerCombiner(bool IsOptNone);
@@ -132,7 +139,7 @@ void initializeAArch64O0PreLegalizerCombinerLegacyPass(PassRegistry &);
void initializeAArch64PostCoalescerLegacyPass(PassRegistry &);
void initializeAArch64PostLegalizerCombinerPass(PassRegistry &);
void initializeAArch64PostLegalizerLoweringPass(PassRegistry &);
-void initializeAArch64PostSelectOptimizePass(PassRegistry &);
+void initializeAArch64PostSelectOptimizeLegacyPass(PassRegistry &);
void initializeAArch64PreLegalizerCombinerLegacyPass(PassRegistry &);
void initializeAArch64PromoteConstantPass(PassRegistry&);
void initializeAArch64RedundantCopyEliminationPass(PassRegistry&);
diff --git a/llvm/lib/Target/AArch64/AArch64PassRegistry.def b/llvm/lib/Target/AArch64/AArch64PassRegistry.def
index 39085fc033c12..7efbf9262c8dd 100644
--- a/llvm/lib/Target/AArch64/AArch64PassRegistry.def
+++ b/llvm/lib/Target/AArch64/AArch64PassRegistry.def
@@ -36,6 +36,8 @@ 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", AArch64PostCoalescerPass())
+MACHINE_FUNCTION_PASS("aarch64-post-select-optimize",
+ AArch64PostSelectOptimizePass())
MACHINE_FUNCTION_PASS("aarch64-prelegalizer-combiner",
AArch64PreLegalizerCombinerPass())
MACHINE_FUNCTION_PASS("aarch64-ptrauth", AArch64PointerAuthPass())
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
index 950d274ceae75..0d8f6a1107a54 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -263,7 +263,7 @@ LLVMInitializeAArch64Target() {
initializeAArch64PostCoalescerLegacyPass(PR);
initializeAArch64PostLegalizerCombinerPass(PR);
initializeAArch64PostLegalizerLoweringPass(PR);
- initializeAArch64PostSelectOptimizePass(PR);
+ initializeAArch64PostSelectOptimizeLegacyPass(PR);
initializeAArch64PromoteConstantPass(PR);
initializeAArch64RedundantCopyEliminationPass(PR);
initializeAArch64RedundantCondBranchPass(PR);
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64PostSelectOptimize.cpp b/llvm/lib/Target/AArch64/GISel/AArch64PostSelectOptimize.cpp
index 4bd025da636ca..c1c22029ede50 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64PostSelectOptimize.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64PostSelectOptimize.cpp
@@ -20,7 +20,6 @@
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineOperand.h"
-#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
@@ -29,11 +28,23 @@
using namespace llvm;
namespace {
-class AArch64PostSelectOptimize : public MachineFunctionPass {
+class AArch64PostSelectOptimizeImpl {
+public:
+ bool run(MachineFunction &MF);
+
+private:
+ bool optimizeNZCVDefs(MachineBasicBlock &MBB);
+ bool doPeepholeOpts(MachineBasicBlock &MBB);
+ /// Look for cross regclass copies that can be trivially eliminated.
+ bool foldSimpleCrossClassCopies(MachineInstr &MI);
+ bool foldCopyDup(MachineInstr &MI);
+};
+
+class AArch64PostSelectOptimizeLegacy : public MachineFunctionPass {
public:
static char ID;
- AArch64PostSelectOptimize() : MachineFunctionPass(ID) {}
+ AArch64PostSelectOptimizeLegacy() : MachineFunctionPass(ID) {}
StringRef getPassName() const override {
return "AArch64 Post Select Optimizer";
@@ -42,18 +53,11 @@ class AArch64PostSelectOptimize : public MachineFunctionPass {
bool runOnMachineFunction(MachineFunction &MF) override;
void getAnalysisUsage(AnalysisUsage &AU) const override;
-
-private:
- bool optimizeNZCVDefs(MachineBasicBlock &MBB);
- bool doPeepholeOpts(MachineBasicBlock &MBB);
- /// Look for cross regclass copies that can be trivially eliminated.
- bool foldSimpleCrossClassCopies(MachineInstr &MI);
- bool foldCopyDup(MachineInstr &MI);
};
} // end anonymous namespace
-void AArch64PostSelectOptimize::getAnalysisUsage(AnalysisUsage &AU) const {
- AU.addRequired<TargetPassConfig>();
+void AArch64PostSelectOptimizeLegacy::getAnalysisUsage(
+ AnalysisUsage &AU) const {
AU.setPreservesCFG();
getSelectionDAGFallbackAnalysisUsage(AU);
MachineFunctionPass::getAnalysisUsage(AU);
@@ -98,7 +102,7 @@ unsigned getNonFlagSettingVariant(unsigned Opc) {
}
}
-bool AArch64PostSelectOptimize::doPeepholeOpts(MachineBasicBlock &MBB) {
+bool AArch64PostSelectOptimizeImpl::doPeepholeOpts(MachineBasicBlock &MBB) {
bool Changed = false;
for (auto &MI : make_early_inc_range(MBB)) {
bool CurrentIterChanged = foldSimpleCrossClassCopies(MI);
@@ -109,7 +113,8 @@ bool AArch64PostSelectOptimize::doPeepholeOpts(MachineBasicBlock &MBB) {
return Changed;
}
-bool AArch64PostSelectOptimize::foldSimpleCrossClassCopies(MachineInstr &MI) {
+bool AArch64PostSelectOptimizeImpl::foldSimpleCrossClassCopies(
+ MachineInstr &MI) {
auto *MF = MI.getMF();
auto &MRI = MF->getRegInfo();
@@ -157,7 +162,7 @@ bool AArch64PostSelectOptimize::foldSimpleCrossClassCopies(MachineInstr &MI) {
return true;
}
-bool AArch64PostSelectOptimize::foldCopyDup(MachineInstr &MI) {
+bool AArch64PostSelectOptimizeImpl::foldCopyDup(MachineInstr &MI) {
if (!MI.isCopy())
return false;
@@ -219,7 +224,7 @@ bool AArch64PostSelectOptimize::foldCopyDup(MachineInstr &MI) {
AArch64::DUPi64, AArch64::UMOVvi64);
}
-bool AArch64PostSelectOptimize::optimizeNZCVDefs(MachineBasicBlock &MBB) {
+bool AArch64PostSelectOptimizeImpl::optimizeNZCVDefs(MachineBasicBlock &MBB) {
// If we find a dead NZCV implicit-def, we
// - try to convert the operation to a non-flag-setting equivalent
// - or mark the def as dead to aid later peephole optimizations.
@@ -291,7 +296,7 @@ bool AArch64PostSelectOptimize::optimizeNZCVDefs(MachineBasicBlock &MBB) {
return Changed;
}
-bool AArch64PostSelectOptimize::runOnMachineFunction(MachineFunction &MF) {
+bool AArch64PostSelectOptimizeImpl::run(MachineFunction &MF) {
if (MF.getProperties().hasFailedISel())
return false;
assert(MF.getProperties().hasSelected() && "Expected a selected MF");
@@ -304,16 +309,30 @@ bool AArch64PostSelectOptimize::runOnMachineFunction(MachineFunction &MF) {
return Changed;
}
-char AArch64PostSelectOptimize::ID = 0;
-INITIALIZE_PASS_BEGIN(AArch64PostSelectOptimize, DEBUG_TYPE,
- "Optimize AArch64 selected instructions",
- false, false)
-INITIALIZE_PASS_END(AArch64PostSelectOptimize, DEBUG_TYPE,
- "Optimize AArch64 selected instructions", false,
- false)
+bool AArch64PostSelectOptimizeLegacy::runOnMachineFunction(
+ MachineFunction &MF) {
+ return AArch64PostSelectOptimizeImpl().run(MF);
+}
+
+char AArch64PostSelectOptimizeLegacy::ID = 0;
+INITIALIZE_PASS_BEGIN(AArch64PostSelectOptimizeLegacy, DEBUG_TYPE,
+ "Optimize AArch64 selected instructions", false, false)
+INITIALIZE_PASS_END(AArch64PostSelectOptimizeLegacy, DEBUG_TYPE,
+ "Optimize AArch64 selected instructions", false, false)
namespace llvm {
FunctionPass *createAArch64PostSelectOptimize() {
- return new AArch64PostSelectOptimize();
+ return new AArch64PostSelectOptimizeLegacy();
+}
+
+PreservedAnalyses
+AArch64PostSelectOptimizePass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ const bool Changed = AArch64PostSelectOptimizeImpl().run(MF);
+ if (!Changed)
+ return PreservedAnalyses::all();
+ PreservedAnalyses PA = getMachineFunctionPassPreservedAnalyses();
+ PA.preserveSet<CFGAnalyses>();
+ return PA;
}
} // end namespace llvm
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-constrain-new-regop.mir b/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-constrain-new-regop.mir
index 5721f235de460..d8837653a5911 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-constrain-new-regop.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-constrain-new-regop.mir
@@ -1,5 +1,6 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple aarch64 -run-pass=aarch64-post-select-optimize -verify-machineinstrs %s -o - | FileCheck %s
+# RUN: llc -mtriple aarch64 -passes=aarch64-post-select-optimize %s -o - | FileCheck %s
---
name: pluto
alignment: 4
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-dead-cc-defs-in-fcmp.mir b/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-dead-cc-defs-in-fcmp.mir
index 0b9c72f6358cd..3765164ab5204 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-dead-cc-defs-in-fcmp.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-dead-cc-defs-in-fcmp.mir
@@ -1,5 +1,6 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple aarch64 -run-pass=aarch64-post-select-optimize -verify-machineinstrs %s -o - | FileCheck %s
+# RUN: llc -mtriple aarch64 -passes=aarch64-post-select-optimize %s -o - | FileCheck %s
---
name: test_fcmp_dead_cc
alignment: 4
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-dead-cc-defs.mir b/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-dead-cc-defs.mir
index 0b9c72f6358cd..3765164ab5204 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-dead-cc-defs.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-dead-cc-defs.mir
@@ -1,5 +1,6 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple aarch64 -run-pass=aarch64-post-select-optimize -verify-machineinstrs %s -o - | FileCheck %s
+# RUN: llc -mtriple aarch64 -passes=aarch64-post-select-optimize %s -o - | FileCheck %s
---
name: test_fcmp_dead_cc
alignment: 4
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-xclass-copies.mir b/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-xclass-copies.mir
index 4bd5c14e5e745..efa27486e167b 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-xclass-copies.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/postselectopt-xclass-copies.mir
@@ -1,5 +1,6 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple aarch64 -run-pass=aarch64-post-select-optimize -verify-machineinstrs %s -o - | FileCheck %s
+# RUN: llc -mtriple aarch64 -passes=aarch64-post-select-optimize %s -o - | FileCheck %s
--- |
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
More information about the llvm-commits
mailing list