diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1433,6 +1433,8 @@ } if (CodeGenOpts.OptimizationLevel == 0) { + PB.invokeRegisteredO0EPCallbacks(MPM, CodeGenOpts.DebugPassManager); + // FIXME: the backends do not handle matrix intrinsics currently. Make // sure they are also lowered in O0. A lightweight version of the pass // should run in the backend pipeline on demand. diff --git a/clang/test/CodeGen/bpf-O0.c b/clang/test/CodeGen/bpf-O0.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/bpf-O0.c @@ -0,0 +1,7 @@ +// RUN: %clang -O0 %s -target bpf -g -c -o /dev/null -fexperimental-new-pass-manager +// REQUIRES: bpf-registered-target + +struct ss { + int a; +}; +int foo() { return __builtin_btf_type_id(0, 0) + __builtin_preserve_type_info(*(struct ss *)0, 0); } diff --git a/llvm/include/llvm/Passes/PassBuilder.h b/llvm/include/llvm/Passes/PassBuilder.h --- a/llvm/include/llvm/Passes/PassBuilder.h +++ b/llvm/include/llvm/Passes/PassBuilder.h @@ -598,8 +598,9 @@ /// Register a callback for a default optimizer pipeline extension point. /// /// This extension point allows adding optimization once at the start of the - /// pipeline. This does not apply to 'backend' compiles (LTO and ThinLTO - /// link-time pipelines). + /// pipeline. These are run at -O0 via invokeRegisteredO0EPCallbacks(). This + /// does not apply to 'backend' compiles (LTO and ThinLTO link-time + /// pipelines). void registerPipelineStartEPCallback( const std::function &C) { PipelineStartEPCallbacks.push_back(C); @@ -617,6 +618,14 @@ OptimizerLastEPCallbacks.push_back(C); } + /// Run all callbacks added via registerPipelineStartEPCallback(). + /// + /// As the name implies, this should only called for -O0. + /// This allows for reusing registerPipelineStartEPCallback() + /// between O0 and O[123] pipelines, since required target-specific IR passes + /// typically run at the very beginning. + void invokeRegisteredO0EPCallbacks(ModulePassManager &MPM, bool DebugLogging); + /// Register a callback for parsing an AliasAnalysis Name to populate /// the given AAManager \p AA void registerParseAACallback( diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -1654,6 +1654,12 @@ return MPM; } +void PassBuilder::invokeRegisteredO0EPCallbacks(ModulePassManager &MPM, + bool DebugLogging) { + for (auto &C : PipelineStartEPCallbacks) + C(MPM); +} + AAManager PassBuilder::buildDefaultAAPipeline() { AAManager AA; @@ -2240,6 +2246,8 @@ MPM.addPass(createModuleToFunctionPassAdaptor(CoroCleanupPass())); } + invokeRegisteredO0EPCallbacks(MPM, DebugLogging); + // Do nothing else at all! return Error::success(); } diff --git a/llvm/test/CodeGen/BPF/optnone-2.ll b/llvm/test/CodeGen/BPF/optnone-2.ll --- a/llvm/test/CodeGen/BPF/optnone-2.ll +++ b/llvm/test/CodeGen/BPF/optnone-2.ll @@ -1,5 +1,5 @@ ; RUN: opt < %s -passes='default' | llc -march=bpfel -filetype=asm -o /dev/null - -; TODO: add -O0 once that's supported +; RUN: opt < %s -passes='default' | llc -march=bpfel -filetype=asm -o /dev/null - ; IR generated by ; $ cat /tmp/a.c diff --git a/llvm/test/Other/new-pm-O0-ep-callbacks.ll b/llvm/test/Other/new-pm-O0-ep-callbacks.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Other/new-pm-O0-ep-callbacks.ll @@ -0,0 +1,18 @@ +; RUN: opt -disable-output -debug-pass-manager -passes-ep-pipeline-start=no-op-module -passes='default' 2>&1 < %s | FileCheck %s + +; CHECK: Running pass: NoOp + +declare void @bar() local_unnamed_addr + +define void @foo(i32 %n) local_unnamed_addr { +entry: + br label %loop +loop: + %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] + %iv.next = add i32 %iv, 1 + tail call void @bar() + %cmp = icmp eq i32 %iv, %n + br i1 %cmp, label %exit, label %loop +exit: + ret void +} diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp --- a/llvm/tools/opt/NewPMDriver.cpp +++ b/llvm/tools/opt/NewPMDriver.cpp @@ -94,7 +94,7 @@ cl::Hidden); static cl::opt PipelineStartEPPipeline( "passes-ep-pipeline-start", - cl::desc("A textual description of the function pass pipeline inserted at " + cl::desc("A textual description of the module pass pipeline inserted at " "the PipelineStart extension point into default pipelines"), cl::Hidden); static cl::opt OptimizerLastEPPipeline(