[llvm] 610aeb6 - [X86][NewPM] Port x86-avoid-sfb to the New Pass Manager (#174166)

via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 3 15:37:11 PST 2026


Author: Aiden Grossman
Date: 2026-01-03T23:37:06Z
New Revision: 610aeb668b6a07806d77884f05df54d4288ede00

URL: https://github.com/llvm/llvm-project/commit/610aeb668b6a07806d77884f05df54d4288ede00
DIFF: https://github.com/llvm/llvm-project/commit/610aeb668b6a07806d77884f05df54d4288ede00.diff

LOG: [X86][NewPM] Port x86-avoid-sfb to the New Pass Manager (#174166)

Similar refactoring, wire up, and test adjustments to other X86 pass
ports.

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86.h
    llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp
    llvm/lib/Target/X86/X86PassRegistry.def
    llvm/lib/Target/X86/X86TargetMachine.cpp
    llvm/test/CodeGen/X86/avoid-sfb-g-no-change.mir
    llvm/test/CodeGen/X86/avoid-sfb-g-no-change2.mir
    llvm/test/CodeGen/X86/avoid-sfb-g-no-change3.mir
    llvm/test/CodeGen/X86/avoid-sfb-kill-flags.mir
    llvm/test/CodeGen/X86/avoid-sfb-offset.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86.h b/llvm/lib/Target/X86/X86.h
index 21bfe6f40d075..485340134c7cf 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
@@ -268,7 +276,7 @@ void initializeX86AsmPrinterPass(PassRegistry &);
 void initializeX86FixupInstTuningPassPass(PassRegistry &);
 void initializeX86FixupVectorConstantsPassPass(PassRegistry &);
 void initializeWinEHStatePassPass(PassRegistry &);
-void initializeX86AvoidSFBPassPass(PassRegistry &);
+void initializeX86AvoidSFBLegacyPass(PassRegistry &);
 void initializeX86AvoidTrailingCallLegacyPassPass(PassRegistry &);
 void initializeX86CallFrameOptimizationLegacyPass(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 77e44b7b008a4..a5642e2edcf72 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-cf-opt", X86CallFrameOptimizationPass())
 MACHINE_FUNCTION_PASS("x86-dyn-alloca-expander", X86DynAllocaExpanderPass())
@@ -43,7 +44,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-cmov-conversion", X86CmovConverterPass())
 DUMMY_MACHINE_FUNCTION_PASS("x86-compress-evex", CompressEVEXPass())
 DUMMY_MACHINE_FUNCTION_PASS("x86-domain-reassignment", X86DomainReassignment())

diff  --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp
index 728c5f837a000..3df42c4dc4a29 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(createX86CallFrameOptimizationLegacyPass());
-    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