[BPF][NewPM] Port bpf-adjust-opt to NPM and add it to pipeline
authorArthur Eubanks <aeubanks@google.com>
Thu, 19 Nov 2020 17:37:40 +0000 (09:37 -0800)
committerArthur Eubanks <aeubanks@google.com>
Thu, 26 Nov 2020 18:11:26 +0000 (10:11 -0800)
Reviewed By: yonghong-song

Differential Revision: https://reviews.llvm.org/D91990

llvm/lib/Target/BPF/BPF.h
llvm/lib/Target/BPF/BPFAdjustOpt.cpp
llvm/lib/Target/BPF/BPFTargetMachine.cpp
llvm/test/CodeGen/BPF/adjust-opt-icmp1.ll

index 8629c1503b4e904a11bc68a7ce61c05d5f116050..a98a3e08d5de7e516f84f95aa5f3613966d4c279 100644 (file)
@@ -56,6 +56,11 @@ public:
 
   static bool isRequired() { return true; }
 };
+
+class BPFAdjustOptPass : public PassInfoMixin<BPFAdjustOptPass> {
+public:
+  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
+};
 } // namespace llvm
 
 #endif
index 8efaa9d72b5762b1d6e6cf0aab8683a89f95f474..6afd2d77485dddbe656463276cbf8a201fe1e08e 100644 (file)
@@ -39,6 +39,14 @@ static cl::opt<bool> DisableBPFavoidSpeculation(
 namespace {
 
 class BPFAdjustOpt final : public ModulePass {
+public:
+  static char ID;
+
+  BPFAdjustOpt() : ModulePass(ID) {}
+  bool runOnModule(Module &M) override;
+};
+
+class BPFAdjustOptImpl {
   struct PassThroughInfo {
     Instruction *Input;
     Instruction *UsedInst;
@@ -48,13 +56,12 @@ class BPFAdjustOpt final : public ModulePass {
   };
 
 public:
-  static char ID;
-  Module *Mod;
+  BPFAdjustOptImpl(Module *M) : M(M) {}
 
-  BPFAdjustOpt() : ModulePass(ID) {}
-  bool runOnModule(Module &M) override;
+  bool run();
 
 private:
+  Module *M;
   SmallVector<PassThroughInfo, 16> PassThroughs;
 
   void adjustBasicBlock(BasicBlock &BB);
@@ -73,9 +80,10 @@ INITIALIZE_PASS(BPFAdjustOpt, "bpf-adjust-opt", "BPF Adjust Optimization",
 
 ModulePass *llvm::createBPFAdjustOpt() { return new BPFAdjustOpt(); }
 
-bool BPFAdjustOpt::runOnModule(Module &M) {
-  Mod = &M;
-  for (Function &F : M)
+bool BPFAdjustOpt::runOnModule(Module &M) { return BPFAdjustOptImpl(&M).run(); }
+
+bool BPFAdjustOptImpl::run() {
+  for (Function &F : *M)
     for (auto &BB : F) {
       adjustBasicBlock(BB);
       for (auto &I : BB)
@@ -85,10 +93,10 @@ bool BPFAdjustOpt::runOnModule(Module &M) {
   return insertPassThrough();
 }
 
-bool BPFAdjustOpt::insertPassThrough() {
+bool BPFAdjustOptImpl::insertPassThrough() {
   for (auto &Info : PassThroughs) {
     auto *CI = BPFCoreSharedInfo::insertPassThrough(
-        Mod, Info.UsedInst->getParent(), Info.Input, Info.UsedInst);
+        M, Info.UsedInst->getParent(), Info.Input, Info.UsedInst);
     Info.UsedInst->setOperand(Info.OpIdx, CI);
   }
 
@@ -97,7 +105,7 @@ bool BPFAdjustOpt::insertPassThrough() {
 
 // To avoid combining conditionals in the same basic block by
 // instrcombine optimization.
-bool BPFAdjustOpt::serializeICMPInBB(Instruction &I) {
+bool BPFAdjustOptImpl::serializeICMPInBB(Instruction &I) {
   // For:
   //   comp1 = icmp <opcode> ...;
   //   comp2 = icmp <opcode> ...;
@@ -130,7 +138,7 @@ bool BPFAdjustOpt::serializeICMPInBB(Instruction &I) {
 
 // To avoid combining conditionals in the same basic block by
 // instrcombine optimization.
-bool BPFAdjustOpt::serializeICMPCrossBB(BasicBlock &BB) {
+bool BPFAdjustOptImpl::serializeICMPCrossBB(BasicBlock &BB) {
   // For:
   //   B1:
   //     comp1 = icmp <opcode> ...;
@@ -204,7 +212,7 @@ bool BPFAdjustOpt::serializeICMPCrossBB(BasicBlock &BB) {
 
 // To avoid speculative hoisting certain computations out of
 // a basic block.
-bool BPFAdjustOpt::avoidSpeculation(Instruction &I) {
+bool BPFAdjustOptImpl::avoidSpeculation(Instruction &I) {
   if (auto *LdInst = dyn_cast<LoadInst>(&I)) {
     if (auto *GV = dyn_cast<GlobalVariable>(LdInst->getOperand(0))) {
       if (GV->hasAttribute(BPFCoreSharedInfo::AmaAttr) ||
@@ -297,14 +305,19 @@ bool BPFAdjustOpt::avoidSpeculation(Instruction &I) {
   return true;
 }
 
-void BPFAdjustOpt::adjustBasicBlock(BasicBlock &BB) {
+void BPFAdjustOptImpl::adjustBasicBlock(BasicBlock &BB) {
   if (!DisableBPFserializeICMP && serializeICMPCrossBB(BB))
     return;
 }
 
-void BPFAdjustOpt::adjustInst(Instruction &I) {
+void BPFAdjustOptImpl::adjustInst(Instruction &I) {
   if (!DisableBPFserializeICMP && serializeICMPInBB(I))
     return;
   if (!DisableBPFavoidSpeculation && avoidSpeculation(I))
     return;
 }
+
+PreservedAnalyses BPFAdjustOptPass::run(Module &M, ModuleAnalysisManager &AM) {
+  return BPFAdjustOptImpl(&M).run() ? PreservedAnalyses::none()
+                                    : PreservedAnalyses::all();
+}
index 25fccea256f12e6ca766eecf7017af5c0e5eb5d2..c35a3192282f24572928e40f65db464b80374d3d 100644 (file)
@@ -136,6 +136,10 @@ void BPFTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB,
                                     PassBuilder::OptimizationLevel Level) {
     FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().hoistCommonInsts(true)));
   });
+  PB.registerPipelineEarlySimplificationEPCallback(
+      [=](ModulePassManager &MPM, PassBuilder::OptimizationLevel) {
+        MPM.addPass(BPFAdjustOptPass());
+      });
 }
 
 void BPFPassConfig::addIRPasses() {
index bb651f4ea57addf2c2655bf7b931ac0b6f8418c2..6eea4d2f4618c8571c9afbafc48950f9019bd6be 100644 (file)
@@ -1,7 +1,11 @@
 ; RUN: opt -O2 -mtriple=bpf-pc-linux %s | llvm-dis > %t1
 ; RUN: llc %t1 -o - | FileCheck -check-prefixes=CHECK %s
+; RUN: opt -passes='default<O2>' -mtriple=bpf-pc-linux %s | llvm-dis > %t1
+; RUN: llc %t1 -o - | FileCheck -check-prefixes=CHECK %s
 ; RUN: opt -O2 -mtriple=bpf-pc-linux -bpf-disable-serialize-icmp %s | llvm-dis > %t1
 ; RUN: llc %t1 -o - | FileCheck -check-prefixes=CHECK-DISABLE %s
+; RUN: opt -passes='default<O2>' -mtriple=bpf-pc-linux -bpf-disable-serialize-icmp %s | llvm-dis > %t1
+; RUN: llc %t1 -o - | FileCheck -check-prefixes=CHECK-DISABLE %s
 ;
 ; Source:
 ;   int foo();