[llvm] a718d2a - [BPF][NewPM] Introduce BPFCodeGenPassBuilder

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 13 17:48:56 PDT 2026


Author: Aiden Grossman
Date: 2026-07-13T17:48:52-07:00
New Revision: a718d2ad092bec5b7fe81e043ad276cb6ae97a50

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

LOG: [BPF][NewPM] Introduce BPFCodeGenPassBuilder

Part of the transition to the NewPM for CodeGen. Similar to
f122acf2d0b8c806bfa7be81aea0344bfd6fc225.

Reviewers: eddyz87, yonghong-song, aeubanks

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

Added: 
    llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp

Modified: 
    llvm/lib/Target/BPF/BPFTargetMachine.cpp
    llvm/lib/Target/BPF/BPFTargetMachine.h
    llvm/lib/Target/BPF/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp b/llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp
new file mode 100644
index 0000000000000..fcfd4a56ee231
--- /dev/null
+++ b/llvm/lib/Target/BPF/BPFCodeGenPassBuilder.cpp
@@ -0,0 +1,123 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "BPF.h"
+#include "BPFSubtarget.h"
+#include "BPFTargetMachine.h"
+#include "llvm/CodeGen/AtomicExpand.h"
+#include "llvm/IR/PassInstrumentation.h"
+#include "llvm/MC/MCStreamer.h"
+#include "llvm/Passes/CodeGenPassBuilder.h"
+#include "llvm/Passes/PassBuilder.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Target/CGPassBuilderOption.h"
+#include "llvm/Transforms/Scalar/SimplifyCFG.h"
+#include "llvm/Transforms/Utils/SimplifyCFGOptions.h"
+
+using namespace llvm;
+
+extern cl::opt<bool> DisableMIPeephole;
+
+namespace {
+
+class BPFCodeGenPassBuilder
+    : public CodeGenPassBuilder<BPFCodeGenPassBuilder, BPFTargetMachine> {
+  using Base = CodeGenPassBuilder<BPFCodeGenPassBuilder, BPFTargetMachine>;
+
+public:
+  explicit BPFCodeGenPassBuilder(BPFTargetMachine &TM,
+                                 const CGPassBuilderOption &Opts,
+                                 PassInstrumentationCallbacks *PIC)
+      : CodeGenPassBuilder(TM, Opts, PIC) {}
+
+  void addIRPasses(PassManagerWrapper &PMW) const;
+  Error addInstSelector(PassManagerWrapper &PMW) const;
+  void addMachineSSAOptimization(PassManagerWrapper &PMW) const;
+  void addPreEmitPass(PassManagerWrapper &PMW) const;
+};
+
+void BPFCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) const {
+  addFunctionPass(AtomicExpandPass(TM), PMW);
+  // TODO(boomanaiden154): Add BPFCheckAndAdjustIR when it has been ported.
+
+  Base::addIRPasses(PMW);
+}
+
+Error BPFCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) const {
+  addMachineFunctionPass(BPFISelDAGToDAGPass(TM), PMW);
+  return Error::success();
+}
+
+void BPFCodeGenPassBuilder::addMachineSSAOptimization(
+    PassManagerWrapper &PMW) const {
+  // TODO(boomanaiden154): Add BPFMISimplifyPatchablePass when it has been
+  // ported.
+
+  Base::addMachineSSAOptimization(PMW);
+
+  const BPFSubtarget *Subtarget = TM.getSubtargetImpl();
+  if (!DisableMIPeephole) {
+    if (Subtarget->getHasAlu32()) {
+      // TODO(boomanaiden154): Add BPFMIPeepholePass when it has been ported.
+    }
+  }
+}
+
+void BPFCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) const {
+  // TODO(boomanaiden154): Add BPFMIPreEmitCheckingPass when it has been ported.
+  if (!DisableMIPeephole) {
+    // TODO(boomanaiden154): Add BPFMIPreEmitPeepholePass when it has been
+    // ported.
+  }
+}
+
+} // namespace
+
+static Expected<bool> parseBPFPreserveStaticOffsetOptions(StringRef Params) {
+  return PassBuilder::parseSinglePassOption(Params, "allow-partial",
+                                            "BPFPreserveStaticOffsetPass");
+}
+
+void BPFTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
+#define GET_PASS_REGISTRY "BPFPassRegistry.def"
+#include "llvm/Passes/TargetPassRegistry.inc"
+
+  PB.registerPipelineStartEPCallback(
+      [=](ModulePassManager &MPM, OptimizationLevel) {
+        FunctionPassManager FPM;
+        FPM.addPass(BPFPreserveStaticOffsetPass(true));
+        FPM.addPass(BPFAbstractMemberAccessPass(this));
+        FPM.addPass(BPFPreserveDITypePass());
+        FPM.addPass(BPFIRPeepholePass());
+        MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
+      });
+  PB.registerPeepholeEPCallback([=](FunctionPassManager &FPM,
+                                    OptimizationLevel Level) {
+    FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().hoistCommonInsts(true)));
+    FPM.addPass(BPFASpaceCastSimplifyPass());
+  });
+  PB.registerScalarOptimizerLateEPCallback(
+      [=](FunctionPassManager &FPM, OptimizationLevel Level) {
+        // Run this after loop unrolling but before
+        // SimplifyCFGPass(... .sinkCommonInsts(true))
+        FPM.addPass(BPFPreserveStaticOffsetPass(false));
+      });
+  PB.registerPipelineEarlySimplificationEPCallback(
+      [=](ModulePassManager &MPM, OptimizationLevel, ThinOrFullLTOPhase) {
+        MPM.addPass(BPFAdjustOptPass());
+      });
+}
+
+Error BPFTargetMachine::buildCodeGenPipeline(
+    ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out,
+    raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
+    const CGPassBuilderOption &Opt, MCContext &Ctx,
+    PassInstrumentationCallbacks *PIC) {
+  auto CGPB = BPFCodeGenPassBuilder(*this, Opt, PIC);
+  return CGPB.buildPipeline(MPM, MAM, Out, DwoOut, FileType, Ctx);
+}

diff  --git a/llvm/lib/Target/BPF/BPFTargetMachine.cpp b/llvm/lib/Target/BPF/BPFTargetMachine.cpp
index a1ac20b841e39..eeba0c4745cae 100644
--- a/llvm/lib/Target/BPF/BPFTargetMachine.cpp
+++ b/llvm/lib/Target/BPF/BPFTargetMachine.cpp
@@ -35,9 +35,8 @@
 #include <optional>
 using namespace llvm;
 
-static cl::
-opt<bool> DisableMIPeephole("disable-bpf-peephole", cl::Hidden,
-                            cl::desc("Disable machine peepholes for BPF"));
+cl::opt<bool> DisableMIPeephole("disable-bpf-peephole", cl::Hidden,
+                                cl::desc("Disable machine peepholes for BPF"));
 
 static cl::opt<bool>
     DisableCheckUnreachable("bpf-disable-trap-unreachable", cl::Hidden,
@@ -114,41 +113,6 @@ TargetPassConfig *BPFTargetMachine::createPassConfig(PassManagerBase &PM) {
   return new BPFPassConfig(*this, PM);
 }
 
-static Expected<bool> parseBPFPreserveStaticOffsetOptions(StringRef Params) {
-  return PassBuilder::parseSinglePassOption(Params, "allow-partial",
-                                            "BPFPreserveStaticOffsetPass");
-}
-
-void BPFTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
-#define GET_PASS_REGISTRY "BPFPassRegistry.def"
-#include "llvm/Passes/TargetPassRegistry.inc"
-
-  PB.registerPipelineStartEPCallback(
-      [=](ModulePassManager &MPM, OptimizationLevel) {
-        FunctionPassManager FPM;
-        FPM.addPass(BPFPreserveStaticOffsetPass(true));
-        FPM.addPass(BPFAbstractMemberAccessPass(this));
-        FPM.addPass(BPFPreserveDITypePass());
-        FPM.addPass(BPFIRPeepholePass());
-        MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
-      });
-  PB.registerPeepholeEPCallback([=](FunctionPassManager &FPM,
-                                    OptimizationLevel Level) {
-    FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().hoistCommonInsts(true)));
-    FPM.addPass(BPFASpaceCastSimplifyPass());
-  });
-  PB.registerScalarOptimizerLateEPCallback(
-      [=](FunctionPassManager &FPM, OptimizationLevel Level) {
-        // Run this after loop unrolling but before
-        // SimplifyCFGPass(... .sinkCommonInsts(true))
-        FPM.addPass(BPFPreserveStaticOffsetPass(false));
-      });
-  PB.registerPipelineEarlySimplificationEPCallback(
-      [=](ModulePassManager &MPM, OptimizationLevel, ThinOrFullLTOPhase) {
-        MPM.addPass(BPFAdjustOptPass());
-      });
-}
-
 void BPFPassConfig::addIRPasses() {
   addPass(createAtomicExpandLegacyPass());
   addPass(createBPFCheckAndAdjustIR());

diff  --git a/llvm/lib/Target/BPF/BPFTargetMachine.h b/llvm/lib/Target/BPF/BPFTargetMachine.h
index 15230bd06dadb..e26bb58681ee4 100644
--- a/llvm/lib/Target/BPF/BPFTargetMachine.h
+++ b/llvm/lib/Target/BPF/BPFTargetMachine.h
@@ -43,6 +43,12 @@ class BPFTargetMachine : public CodeGenTargetMachineImpl {
   }
 
   void registerPassBuilderCallbacks(PassBuilder &PB) override;
+
+  Error buildCodeGenPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM,
+                             raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
+                             CodeGenFileType FileType,
+                             const CGPassBuilderOption &Opt, MCContext &Ctx,
+                             PassInstrumentationCallbacks *PIC) override;
 };
 }
 

diff  --git a/llvm/lib/Target/BPF/CMakeLists.txt b/llvm/lib/Target/BPF/CMakeLists.txt
index fa539a0a7b806..2fb60e0b7591a 100644
--- a/llvm/lib/Target/BPF/CMakeLists.txt
+++ b/llvm/lib/Target/BPF/CMakeLists.txt
@@ -27,6 +27,7 @@ add_llvm_target(BPFCodeGen
   BPFAsmPrinter.cpp
   BPFASpaceCastSimplifyPass.cpp
   BPFCheckAndAdjustIR.cpp
+  BPFCodeGenPassBuilder.cpp
   BPFFrameLowering.cpp
   BPFInstrInfo.cpp
   BPFIRPeephole.cpp
@@ -53,9 +54,11 @@ add_llvm_target(BPFCodeGen
   CodeGen
   CodeGenTypes
   Core
+  IRPrinter
   GlobalISel
   IPO
   MC
+  ObjCARC
   Passes
   Scalar
   SelectionDAG


        


More information about the llvm-commits mailing list