[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