[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