[llvm] [X86][NewPM] Port x86-avoid-sfb to the New Pass Manager (PR #174166)
Aiden Grossman via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 3 15:03:09 PST 2026
https://github.com/boomanaiden154 updated https://github.com/llvm/llvm-project/pull/174166
>From 8a6ff698866050940ead1074f4676af239caabbc Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 1 Jan 2026 23:11:35 +0000
Subject: [PATCH] [X86][NewPM] Port x86-avoid-sfb to the New Pass Manager
Similar refactoring, wire up, and test adjustments to other X86 pass
ports.
---
llvm/lib/Target/X86/X86.h | 14 ++-
.../X86/X86AvoidStoreForwardingBlocks.cpp | 86 ++++++++++++-------
llvm/lib/Target/X86/X86PassRegistry.def | 2 +-
llvm/lib/Target/X86/X86TargetMachine.cpp | 4 +-
.../CodeGen/X86/avoid-sfb-g-no-change.mir | 6 +-
.../CodeGen/X86/avoid-sfb-g-no-change2.mir | 3 +-
.../CodeGen/X86/avoid-sfb-g-no-change3.mir | 3 +-
.../test/CodeGen/X86/avoid-sfb-kill-flags.mir | 3 +-
llvm/test/CodeGen/X86/avoid-sfb-offset.mir | 3 +-
9 files changed, 82 insertions(+), 42 deletions(-)
diff --git a/llvm/lib/Target/X86/X86.h b/llvm/lib/Target/X86/X86.h
index a25f88c2ce0e8..b42fe7d8b5d75 100644
--- a/llvm/lib/Target/X86/X86.h
+++ b/llvm/lib/Target/X86/X86.h
@@ -95,8 +95,16 @@ FunctionPass *createX86OptimizeLEAsLegacyPass();
/// Return a pass that transforms setcc + movzx pairs into xor + setcc.
FunctionPass *createX86FixupSetCC();
-/// Return a pass that avoids creating store forward block issues in the hardware.
-FunctionPass *createX86AvoidStoreForwardingBlocks();
+/// Return a pass that avoids creating store forward block issues in the
+/// hardware.
+class X86AvoidStoreForwardingBlocksPass
+ : public PassInfoMixin<X86AvoidStoreForwardingBlocksPass> {
+public:
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+
+FunctionPass *createX86AvoidStoreForwardingBlocksLegacyPass();
/// Return a pass that lowers EFLAGS copy pseudo instructions.
class X86FlagsCopyLoweringPass
@@ -261,7 +269,7 @@ void initializeX86AsmPrinterPass(PassRegistry &);
void initializeX86FixupInstTuningPassPass(PassRegistry &);
void initializeX86FixupVectorConstantsPassPass(PassRegistry &);
void initializeWinEHStatePassPass(PassRegistry &);
-void initializeX86AvoidSFBPassPass(PassRegistry &);
+void initializeX86AvoidSFBLegacyPass(PassRegistry &);
void initializeX86AvoidTrailingCallLegacyPassPass(PassRegistry &);
void initializeX86CallFrameOptimizationPass(PassRegistry &);
void initializeX86CmovConverterPassPass(PassRegistry &);
diff --git a/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp b/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp
index 9473e8db3af93..f450b04d25892 100644
--- a/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp
+++ b/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp
@@ -51,7 +51,7 @@
using namespace llvm;
-#define DEBUG_TYPE "x86-avoid-SFB"
+#define DEBUG_TYPE "x86-avoid-sfb"
static cl::opt<bool> DisableX86AvoidStoreForwardBlocks(
"x86-disable-avoid-SFB", cl::Hidden,
@@ -67,21 +67,10 @@ namespace {
using DisplacementSizeMap = std::map<int64_t, unsigned>;
-class X86AvoidSFBPass : public MachineFunctionPass {
+class X86AvoidSFBImpl {
public:
- static char ID;
- X86AvoidSFBPass() : MachineFunctionPass(ID) { }
-
- StringRef getPassName() const override {
- return "X86 Avoid Store Forwarding Blocks";
- }
-
- bool runOnMachineFunction(MachineFunction &MF) override;
-
- void getAnalysisUsage(AnalysisUsage &AU) const override {
- MachineFunctionPass::getAnalysisUsage(AU);
- AU.addRequired<AAResultsWrapperPass>();
- }
+ X86AvoidSFBImpl(AliasAnalysis *AA) : AA(AA) {};
+ bool runOnMachineFunction(MachineFunction &MF);
private:
MachineRegisterInfo *MRI = nullptr;
@@ -115,18 +104,35 @@ class X86AvoidSFBPass : public MachineFunctionPass {
unsigned getRegSizeInBytes(MachineInstr *Inst);
};
+class X86AvoidSFBLegacy : public MachineFunctionPass {
+public:
+ static char ID;
+ X86AvoidSFBLegacy() : MachineFunctionPass(ID) {}
+
+ StringRef getPassName() const override {
+ return "X86 Avoid Store Forwarding Blocks";
+ }
+
+ bool runOnMachineFunction(MachineFunction &MF) override;
+
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
+ MachineFunctionPass::getAnalysisUsage(AU);
+ AU.addRequired<AAResultsWrapperPass>();
+ }
+};
+
} // end anonymous namespace
-char X86AvoidSFBPass::ID = 0;
+char X86AvoidSFBLegacy::ID = 0;
-INITIALIZE_PASS_BEGIN(X86AvoidSFBPass, DEBUG_TYPE, "Machine code sinking",
+INITIALIZE_PASS_BEGIN(X86AvoidSFBLegacy, DEBUG_TYPE, "Machine code sinking",
false, false)
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
-INITIALIZE_PASS_END(X86AvoidSFBPass, DEBUG_TYPE, "Machine code sinking", false,
- false)
+INITIALIZE_PASS_END(X86AvoidSFBLegacy, DEBUG_TYPE, "Machine code sinking",
+ false, false)
-FunctionPass *llvm::createX86AvoidStoreForwardingBlocks() {
- return new X86AvoidSFBPass();
+FunctionPass *llvm::createX86AvoidStoreForwardingBlocksLegacyPass() {
+ return new X86AvoidSFBLegacy();
}
static bool isXMMLoadOpcode(unsigned Opcode) {
@@ -376,7 +382,7 @@ findPotentialBlockers(MachineInstr *LoadInst) {
return PotentialBlockers;
}
-void X86AvoidSFBPass::buildCopy(MachineInstr *LoadInst, unsigned NLoadOpcode,
+void X86AvoidSFBImpl::buildCopy(MachineInstr *LoadInst, unsigned NLoadOpcode,
int64_t LoadDisp, MachineInstr *StoreInst,
unsigned NStoreOpcode, int64_t StoreDisp,
unsigned Size, int64_t LMMOffset,
@@ -427,7 +433,7 @@ void X86AvoidSFBPass::buildCopy(MachineInstr *LoadInst, unsigned NLoadOpcode,
LLVM_DEBUG(NewStore->dump());
}
-void X86AvoidSFBPass::buildCopies(int Size, MachineInstr *LoadInst,
+void X86AvoidSFBImpl::buildCopies(int Size, MachineInstr *LoadInst,
int64_t LdDispImm, MachineInstr *StoreInst,
int64_t StDispImm, int64_t LMMOffset,
int64_t SMMOffset) {
@@ -514,7 +520,7 @@ static void updateKillStatus(MachineInstr *LoadInst, MachineInstr *StoreInst) {
}
}
-bool X86AvoidSFBPass::alias(const MachineMemOperand &Op1,
+bool X86AvoidSFBImpl::alias(const MachineMemOperand &Op1,
const MachineMemOperand &Op2) const {
if (!Op1.getValue() || !Op2.getValue())
return true;
@@ -528,7 +534,7 @@ bool X86AvoidSFBPass::alias(const MachineMemOperand &Op1,
MemoryLocation(Op2.getValue(), Overlapb, Op2.getAAInfo()));
}
-void X86AvoidSFBPass::findPotentiallylBlockedCopies(MachineFunction &MF) {
+void X86AvoidSFBImpl::findPotentiallylBlockedCopies(MachineFunction &MF) {
for (auto &MBB : MF)
for (auto &MI : MBB) {
if (!isPotentialBlockedMemCpyLd(MI.getOpcode()))
@@ -552,12 +558,12 @@ void X86AvoidSFBPass::findPotentiallylBlockedCopies(MachineFunction &MF) {
}
}
-unsigned X86AvoidSFBPass::getRegSizeInBytes(MachineInstr *LoadInst) {
+unsigned X86AvoidSFBImpl::getRegSizeInBytes(MachineInstr *LoadInst) {
const auto *TRC = TII->getRegClass(TII->get(LoadInst->getOpcode()), 0);
return TRI->getRegSizeInBits(*TRC) / 8;
}
-void X86AvoidSFBPass::breakBlockedCopies(
+void X86AvoidSFBImpl::breakBlockedCopies(
MachineInstr *LoadInst, MachineInstr *StoreInst,
const DisplacementSizeMap &BlockingStoresDispSizeMap) {
int64_t LdDispImm = getDispOperand(LoadInst).getImm();
@@ -654,10 +660,10 @@ removeRedundantBlockingStores(DisplacementSizeMap &BlockingStoresDispSizeMap) {
BlockingStoresDispSizeMap.insert(Disp);
}
-bool X86AvoidSFBPass::runOnMachineFunction(MachineFunction &MF) {
+bool X86AvoidSFBImpl::runOnMachineFunction(MachineFunction &MF) {
bool Changed = false;
- if (DisableX86AvoidStoreForwardBlocks || skipFunction(MF.getFunction()) ||
+ if (DisableX86AvoidStoreForwardBlocks ||
!MF.getSubtarget<X86Subtarget>().is64Bit())
return false;
@@ -665,7 +671,6 @@ bool X86AvoidSFBPass::runOnMachineFunction(MachineFunction &MF) {
assert(MRI->isSSA() && "Expected MIR to be in SSA form");
TII = MF.getSubtarget<X86Subtarget>().getInstrInfo();
TRI = MF.getSubtarget<X86Subtarget>().getRegisterInfo();
- AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
LLVM_DEBUG(dbgs() << "Start X86AvoidStoreForwardBlocks\n";);
// Look for a load then a store to XMM/YMM which look like a memcpy
findPotentiallylBlockedCopies(MF);
@@ -721,3 +726,24 @@ bool X86AvoidSFBPass::runOnMachineFunction(MachineFunction &MF) {
return Changed;
}
+
+bool X86AvoidSFBLegacy::runOnMachineFunction(MachineFunction &MF) {
+ if (skipFunction(MF.getFunction()))
+ return false;
+ AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
+ X86AvoidSFBImpl Impl(AA);
+ return Impl.runOnMachineFunction(MF);
+}
+
+PreservedAnalyses
+X86AvoidStoreForwardingBlocksPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ AliasAnalysis *AA =
+ &MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(MF)
+ .getManager()
+ .getResult<AAManager>(MF.getFunction());
+ X86AvoidSFBImpl Impl(AA);
+ bool Changed = Impl.runOnMachineFunction(MF);
+ return Changed ? getMachineFunctionPassPreservedAnalyses()
+ : PreservedAnalyses::all();
+}
diff --git a/llvm/lib/Target/X86/X86PassRegistry.def b/llvm/lib/Target/X86/X86PassRegistry.def
index a34f2341550ca..0c8902d674b32 100644
--- a/llvm/lib/Target/X86/X86PassRegistry.def
+++ b/llvm/lib/Target/X86/X86PassRegistry.def
@@ -29,6 +29,7 @@ DUMMY_FUNCTION_PASS("x86-winehstate", WinEHStatePass())
#ifndef MACHINE_FUNCTION_PASS
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
#endif
+MACHINE_FUNCTION_PASS("x86-avoid-sfb", X86AvoidStoreForwardingBlocksPass())
MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass())
MACHINE_FUNCTION_PASS("x86-dyn-alloca-expander", X86DynAllocaExpanderPass())
MACHINE_FUNCTION_PASS("x86-expand-pseudo", X86ExpandPseudoPass())
@@ -42,7 +43,6 @@ MACHINE_FUNCTION_PASS("x86-optimize-leas", X86OptimizeLEAsPass())
#ifndef DUMMY_MACHINE_FUNCTION_PASS
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME)
#endif
-DUMMY_MACHINE_FUNCTION_PASS("x86-avoid-SFB", X86AvoidSFBPass())
DUMMY_MACHINE_FUNCTION_PASS("x86-cf-opt", X86CallFrameOptimization())
DUMMY_MACHINE_FUNCTION_PASS("x86-cmov-conversion", X86CmovConverterPass())
DUMMY_MACHINE_FUNCTION_PASS("x86-compress-evex", CompressEVEXPass())
diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp
index 9bee5416a5ce2..7390b3e263e6f 100644
--- a/llvm/lib/Target/X86/X86TargetMachine.cpp
+++ b/llvm/lib/Target/X86/X86TargetMachine.cpp
@@ -88,7 +88,7 @@ extern "C" LLVM_C_ABI void LLVMInitializeX86Target() {
initializeX86ExpandPseudoLegacyPass(PR);
initializeX86ExecutionDomainFixPass(PR);
initializeX86DomainReassignmentPass(PR);
- initializeX86AvoidSFBPassPass(PR);
+ initializeX86AvoidSFBLegacyPass(PR);
initializeX86AvoidTrailingCallLegacyPassPass(PR);
initializeX86SpeculativeLoadHardeningPassPass(PR);
initializeX86SpeculativeExecutionSideEffectSuppressionPass(PR);
@@ -517,7 +517,7 @@ void X86PassConfig::addPreRegAlloc() {
addPass(createX86FixupSetCC());
addPass(createX86OptimizeLEAsLegacyPass());
addPass(createX86CallFrameOptimization());
- addPass(createX86AvoidStoreForwardingBlocks());
+ addPass(createX86AvoidStoreForwardingBlocksLegacyPass());
}
addPass(createX86SuppressAPXForRelocationPass());
diff --git a/llvm/test/CodeGen/X86/avoid-sfb-g-no-change.mir b/llvm/test/CodeGen/X86/avoid-sfb-g-no-change.mir
index 88d7682753b96..f499cbfda1bee 100644
--- a/llvm/test/CodeGen/X86/avoid-sfb-g-no-change.mir
+++ b/llvm/test/CodeGen/X86/avoid-sfb-g-no-change.mir
@@ -1,5 +1,7 @@
-# RUN: llc %s -run-pass x86-avoid-SFB -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s -check-prefixes=CHECK,DEBUG
-# RUN: llc %s -run-pass x86-avoid-SFB -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s -check-prefixes=CHECK,NODEBUG
+# RUN: llc %s -run-pass x86-avoid-sfb -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s -check-prefixes=CHECK,DEBUG
+# RUN: llc %s -passes=x86-avoid-sfb -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s -check-prefixes=CHECK,DEBUG
+# RUN: llc %s -run-pass x86-avoid-sfb -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s -check-prefixes=CHECK,NODEBUG
+# RUN: llc %s -passes=x86-avoid-sfb -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s -check-prefixes=CHECK,NODEBUG
#
# This was generated from:
#
diff --git a/llvm/test/CodeGen/X86/avoid-sfb-g-no-change2.mir b/llvm/test/CodeGen/X86/avoid-sfb-g-no-change2.mir
index 8dbd4e2ca983b..e39db260a0399 100644
--- a/llvm/test/CodeGen/X86/avoid-sfb-g-no-change2.mir
+++ b/llvm/test/CodeGen/X86/avoid-sfb-g-no-change2.mir
@@ -1,4 +1,5 @@
-# RUN: llc %s -run-pass x86-avoid-SFB -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s
+# RUN: llc %s -run-pass x86-avoid-sfb -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s
+# RUN: llc %s -passes=x86-avoid-sfb -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s
#
# This was generated from:
#
diff --git a/llvm/test/CodeGen/X86/avoid-sfb-g-no-change3.mir b/llvm/test/CodeGen/X86/avoid-sfb-g-no-change3.mir
index c0924eaa00b6b..ba77d347cb53d 100644
--- a/llvm/test/CodeGen/X86/avoid-sfb-g-no-change3.mir
+++ b/llvm/test/CodeGen/X86/avoid-sfb-g-no-change3.mir
@@ -1,4 +1,5 @@
-# RUN: llc %s -run-pass x86-avoid-SFB -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s
+# RUN: llc %s -run-pass x86-avoid-sfb -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s
+# RUN: llc %s -passes=x86-avoid-sfb -mtriple=x86_64-unknown-linux-gnu -o - | FileCheck %s
#
# This was generated from:
#
diff --git a/llvm/test/CodeGen/X86/avoid-sfb-kill-flags.mir b/llvm/test/CodeGen/X86/avoid-sfb-kill-flags.mir
index 4e9e3c9d3efa1..91676d3f5f919 100644
--- a/llvm/test/CodeGen/X86/avoid-sfb-kill-flags.mir
+++ b/llvm/test/CodeGen/X86/avoid-sfb-kill-flags.mir
@@ -1,4 +1,5 @@
-# RUN: llc -o - %s -mtriple=x86_64-- -run-pass=x86-avoid-SFB | FileCheck %s
+# RUN: llc -o - %s -mtriple=x86_64-- -run-pass=x86-avoid-sfb | FileCheck %s
+# RUN: llc -o - %s -mtriple=x86_64-- -passes=x86-avoid-sfb | FileCheck %s
--- |
; ModuleID = '../test/CodeGen/X86/avoid-sfb-mir.ll'
source_filename = "../test/CodeGen/X86/avoid-sfb-mir.ll"
diff --git a/llvm/test/CodeGen/X86/avoid-sfb-offset.mir b/llvm/test/CodeGen/X86/avoid-sfb-offset.mir
index eec19e779d70d..f1814cd048bae 100644
--- a/llvm/test/CodeGen/X86/avoid-sfb-offset.mir
+++ b/llvm/test/CodeGen/X86/avoid-sfb-offset.mir
@@ -1,4 +1,5 @@
-# RUN: llc -o - %s -mtriple=x86_64-- -run-pass=x86-avoid-SFB | FileCheck %s
+# RUN: llc -o - %s -mtriple=x86_64-- -run-pass=x86-avoid-sfb | FileCheck %s
+# RUN: llc -o - %s -mtriple=x86_64-- -passes=x86-avoid-sfb | FileCheck %s
--- |
; ModuleID = '../test50419-2.ll'
source_filename = "nice.c"
More information about the llvm-commits
mailing list