[llvm] f4d2c6e - [BPF][NewPM] Port bpf-check-and-opt-ir

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 13 17:53:01 PDT 2026


Author: Aiden Grossman
Date: 2026-07-13T17:52:56-07:00
New Revision: f4d2c6e772e60a05a915b6ecda1bf12e8dd6c2d3

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

LOG: [BPF][NewPM] Port bpf-check-and-opt-ir

Standard pass porting. Part of the effort to make BPF work solely with
the new pass manager.

Reviewers: eddyz87, aeubanks, yonghong-song

Pull Request: https://github.com/llvm/llvm-project/pull/207787

Added: 
    

Modified: 
    llvm/lib/Target/BPF/BPF.h
    llvm/lib/Target/BPF/BPFCheckAndAdjustIR.cpp
    llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp
    llvm/lib/Target/BPF/BPFPassRegistry.def
    llvm/lib/Target/BPF/BPFTargetMachine.cpp
    llvm/test/CodeGen/BPF/sink-min-max.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/BPF/BPF.h b/llvm/lib/Target/BPF/BPF.h
index f4370f7756fb7..5301f5ec94881 100644
--- a/llvm/lib/Target/BPF/BPF.h
+++ b/llvm/lib/Target/BPF/BPF.h
@@ -26,7 +26,13 @@ class PassRegistry;
 
 #define BPF_TRAP "__bpf_trap"
 
-ModulePass *createBPFCheckAndAdjustIR();
+class BPFCheckAndAdjustIRPass
+    : public RequiredPassInfoMixin<BPFCheckAndAdjustIRPass> {
+public:
+  PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
+};
+
+ModulePass *createBPFCheckAndAdjustIRLegacyPass();
 
 class BPFISelDAGToDAGPass : public SelectionDAGISelPass {
 public:
@@ -44,7 +50,7 @@ InstructionSelector *createBPFInstructionSelector(const BPFTargetMachine &,
                                                   const BPFRegisterBankInfo &);
 
 void initializeBPFAsmPrinterPass(PassRegistry &);
-void initializeBPFCheckAndAdjustIRPass(PassRegistry&);
+void initializeBPFCheckAndAdjustIRLegacyPass(PassRegistry &);
 void initializeBPFDAGToDAGISelLegacyPass(PassRegistry &);
 void initializeBPFMIPeepholePass(PassRegistry &);
 void initializeBPFMIPreEmitCheckingPass(PassRegistry &);

diff  --git a/llvm/lib/Target/BPF/BPFCheckAndAdjustIR.cpp b/llvm/lib/Target/BPF/BPFCheckAndAdjustIR.cpp
index b12985d81fa75..303ef3accc7ad 100644
--- a/llvm/lib/Target/BPF/BPFCheckAndAdjustIR.cpp
+++ b/llvm/lib/Target/BPF/BPFCheckAndAdjustIR.cpp
@@ -22,6 +22,7 @@
 #include "BPF.h"
 #include "BPFCORE.h"
 #include "llvm/Analysis/LoopInfo.h"
+#include "llvm/IR/Analysis.h"
 #include "llvm/IR/GlobalVariable.h"
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/Instruction.h"
@@ -29,6 +30,7 @@
 #include "llvm/IR/IntrinsicInst.h"
 #include "llvm/IR/IntrinsicsBPF.h"
 #include "llvm/IR/Module.h"
+#include "llvm/IR/PassManager.h"
 #include "llvm/IR/Type.h"
 #include "llvm/IR/Value.h"
 #include "llvm/Pass.h"
@@ -40,34 +42,25 @@ using namespace llvm;
 
 namespace {
 
-class BPFCheckAndAdjustIR final : public ModulePass {
+class BPFCheckAndAdjustIRLegacy final : public ModulePass {
   bool runOnModule(Module &F) override;
 
 public:
   static char ID;
-  BPFCheckAndAdjustIR() : ModulePass(ID) {}
+  BPFCheckAndAdjustIRLegacy() : ModulePass(ID) {}
   void getAnalysisUsage(AnalysisUsage &AU) const override;
-
-private:
-  void checkIR(Module &M);
-  bool adjustIR(Module &M);
-  bool removePassThroughBuiltin(Module &M);
-  bool removeCompareBuiltin(Module &M);
-  bool sinkMinMax(Module &M);
-  bool removeGEPBuiltins(Module &M);
-  bool insertASpaceCasts(Module &M);
 };
 } // End anonymous namespace
 
-char BPFCheckAndAdjustIR::ID = 0;
-INITIALIZE_PASS(BPFCheckAndAdjustIR, DEBUG_TYPE, "BPF Check And Adjust IR",
-                false, false)
+char BPFCheckAndAdjustIRLegacy::ID = 0;
+INITIALIZE_PASS(BPFCheckAndAdjustIRLegacy, DEBUG_TYPE,
+                "BPF Check And Adjust IR", false, false)
 
-ModulePass *llvm::createBPFCheckAndAdjustIR() {
-  return new BPFCheckAndAdjustIR();
+ModulePass *llvm::createBPFCheckAndAdjustIRLegacyPass() {
+  return new BPFCheckAndAdjustIRLegacy();
 }
 
-void BPFCheckAndAdjustIR::checkIR(Module &M) {
+static void checkIR(Module &M) {
   // Ensure relocation global won't appear in PHI node
   // This may happen if the compiler generated the following code:
   //   B1:
@@ -100,7 +93,7 @@ void BPFCheckAndAdjustIR::checkIR(Module &M) {
       }
 }
 
-bool BPFCheckAndAdjustIR::removePassThroughBuiltin(Module &M) {
+static bool removePassThroughBuiltin(Module &M) {
   // Remove __builtin_bpf_passthrough()'s which are used to prevent
   // certain IR optimizations. Now major IR optimizations are done,
   // remove them.
@@ -130,7 +123,7 @@ bool BPFCheckAndAdjustIR::removePassThroughBuiltin(Module &M) {
   return Changed;
 }
 
-bool BPFCheckAndAdjustIR::removeCompareBuiltin(Module &M) {
+static bool removeCompareBuiltin(Module &M) {
   // Remove __builtin_bpf_compare()'s which are used to prevent
   // certain IR optimizations. Now major IR optimizations are done,
   // remove them.
@@ -340,14 +333,15 @@ static bool sinkMinMaxInBB(BasicBlock &BB,
 //
 // See also:
 //   https://lore.kernel.org/bpf/20230406164505.1046801-1-yhs@fb.com/
-bool BPFCheckAndAdjustIR::sinkMinMax(Module &M) {
+static bool sinkMinMax(Module &M,
+                       function_ref<LoopInfo &(Function &)> GetLoopInfo) {
   bool Changed = false;
 
   for (Function &F : M) {
     if (F.isDeclaration())
       continue;
 
-    LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>(F).getLoopInfo();
+    LoopInfo &LI = GetLoopInfo(F);
     for (Loop *L : LI)
       for (BasicBlock *BB : L->blocks()) {
         // Filter out instructions coming from the same loop
@@ -362,7 +356,7 @@ bool BPFCheckAndAdjustIR::sinkMinMax(Module &M) {
   return Changed;
 }
 
-void BPFCheckAndAdjustIR::getAnalysisUsage(AnalysisUsage &AU) const {
+void BPFCheckAndAdjustIRLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.addRequired<LoopInfoWrapperPass>();
 }
 
@@ -410,7 +404,7 @@ static bool removeGEPBuiltinsInFunc(Function &F) {
 // - llvm.bpf.getelementptr.and.load
 // - llvm.bpf.getelementptr.and.store
 // As (load (getelementptr ...)) or (store (getelementptr ...)).
-bool BPFCheckAndAdjustIR::removeGEPBuiltins(Module &M) {
+static bool removeGEPBuiltins(Module &M) {
   bool Changed = false;
   for (auto &F : M)
     Changed = removeGEPBuiltinsInFunc(F) || Changed;
@@ -575,7 +569,7 @@ static Instruction *aspaceMemMove(DenseMap<Value *, Value *> &Cache,
 //
 // - assign section with name .addr_space.N for globals defined in
 //   non-zero address space N
-bool BPFCheckAndAdjustIR::insertASpaceCasts(Module &M) {
+static bool insertASpaceCasts(Module &M) {
   bool Changed = false;
   for (Function &F : M) {
     DenseMap<Value *, Value *> CastsCache;
@@ -653,16 +647,31 @@ bool BPFCheckAndAdjustIR::insertASpaceCasts(Module &M) {
   return Changed;
 }
 
-bool BPFCheckAndAdjustIR::adjustIR(Module &M) {
+static bool adjustIR(Module &M,
+                     function_ref<LoopInfo &(Function &)> GetLoopInfo) {
   bool Changed = removePassThroughBuiltin(M);
   Changed = removeCompareBuiltin(M) || Changed;
-  Changed = sinkMinMax(M) || Changed;
+  Changed = sinkMinMax(M, GetLoopInfo) || Changed;
   Changed = removeGEPBuiltins(M) || Changed;
   Changed = insertASpaceCasts(M) || Changed;
   return Changed;
 }
 
-bool BPFCheckAndAdjustIR::runOnModule(Module &M) {
+bool BPFCheckAndAdjustIRLegacy::runOnModule(Module &M) {
+  checkIR(M);
+  return adjustIR(M, [&](Function &F) -> LoopInfo & {
+    return getAnalysis<LoopInfoWrapperPass>(F).getLoopInfo();
+  });
+}
+
+PreservedAnalyses BPFCheckAndAdjustIRPass::run(Module &M,
+                                               ModuleAnalysisManager &MAM) {
   checkIR(M);
-  return adjustIR(M);
+  bool Changed = adjustIR(M, [&](Function &F) -> LoopInfo & {
+    return MAM.getResult<FunctionAnalysisManagerModuleProxy>(M)
+        .getManager()
+        .getResult<LoopAnalysis>(F);
+  });
+  return Changed ? PreservedAnalyses::none().preserveSet<CFGAnalyses>()
+                 : PreservedAnalyses::all();
 }

diff  --git a/llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp b/llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp
index fcfd4a56ee231..b086fd13ddde2 100644
--- a/llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp
+++ b/llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp
@@ -43,7 +43,8 @@ class BPFCodeGenPassBuilder
 
 void BPFCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) const {
   addFunctionPass(AtomicExpandPass(TM), PMW);
-  // TODO(boomanaiden154): Add BPFCheckAndAdjustIR when it has been ported.
+  flushFPMsToMPM(PMW);
+  addModulePass(BPFCheckAndAdjustIRPass(), PMW);
 
   Base::addIRPasses(PMW);
 }

diff  --git a/llvm/lib/Target/BPF/BPFPassRegistry.def b/llvm/lib/Target/BPF/BPFPassRegistry.def
index ec71fa21ea407..fb285c1dc53f7 100644
--- a/llvm/lib/Target/BPF/BPFPassRegistry.def
+++ b/llvm/lib/Target/BPF/BPFPassRegistry.def
@@ -13,6 +13,12 @@
 
 // NOTE: NO INCLUDE GUARD DESIRED!
 
+#ifndef MODULE_PASS
+#define MODULE_PASS(NAME, CREATE_PASS)
+#endif
+MODULE_PASS("bpf-check-and-opt-ir", BPFCheckAndAdjustIRPass())
+#undef MODULE_PASS
+
 #ifndef FUNCTION_PASS
 #define FUNCTION_PASS(NAME, CREATE_PASS)
 #endif

diff  --git a/llvm/lib/Target/BPF/BPFTargetMachine.cpp b/llvm/lib/Target/BPF/BPFTargetMachine.cpp
index eeba0c4745cae..1a35351875cdf 100644
--- a/llvm/lib/Target/BPF/BPFTargetMachine.cpp
+++ b/llvm/lib/Target/BPF/BPFTargetMachine.cpp
@@ -51,7 +51,7 @@ extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTarget() {
   PassRegistry &PR = *PassRegistry::getPassRegistry();
   initializeGlobalISel(PR);
   initializeBPFAsmPrinterPass(PR);
-  initializeBPFCheckAndAdjustIRPass(PR);
+  initializeBPFCheckAndAdjustIRLegacyPass(PR);
   initializeBPFMIPeepholePass(PR);
   initializeBPFMIPreEmitPeepholePass(PR);
   initializeBPFDAGToDAGISelLegacyPass(PR);
@@ -115,7 +115,7 @@ TargetPassConfig *BPFTargetMachine::createPassConfig(PassManagerBase &PM) {
 
 void BPFPassConfig::addIRPasses() {
   addPass(createAtomicExpandLegacyPass());
-  addPass(createBPFCheckAndAdjustIR());
+  addPass(createBPFCheckAndAdjustIRLegacyPass());
 
   TargetPassConfig::addIRPasses();
 }

diff  --git a/llvm/test/CodeGen/BPF/sink-min-max.ll b/llvm/test/CodeGen/BPF/sink-min-max.ll
index 5ee080839985d..f8a7d4d3db414 100644
--- a/llvm/test/CodeGen/BPF/sink-min-max.ll
+++ b/llvm/test/CodeGen/BPF/sink-min-max.ll
@@ -1,4 +1,5 @@
 ; RUN: opt --bpf-check-and-opt-ir -S -mtriple=bpf-pc-linux %s | FileCheck %s
+; RUN: opt -passes=bpf-check-and-opt-ir -S -mtriple=bpf-pc-linux %s | FileCheck %s
 
 ; Test plan:
 ; @test1: x <  umin(i64 a, i64 b)


        


More information about the llvm-commits mailing list