mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-10 22:43:53 +00:00
NewPM: Add an extension point for the start of the pipeline.
This applies to most pipelines except the LTO and ThinLTO backend actions - it is for use at the beginning of the overall pipeline. This extension point will be used to add the GCOV pass when enabled in Clang. llvm-svn: 323166
This commit is contained in:
parent
aa2777e6da
commit
07fc4b0c75
@ -19,6 +19,7 @@
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/Analysis/CGSCCPassManager.h"
|
||||
#include "llvm/IR/PassManager.h"
|
||||
#include "llvm/Transforms/Instrumentation.h"
|
||||
#include "llvm/Transforms/Scalar/LoopPassManager.h"
|
||||
#include <vector>
|
||||
|
||||
@ -476,6 +477,16 @@ public:
|
||||
VectorizerStartEPCallbacks.push_back(C);
|
||||
}
|
||||
|
||||
/// 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).
|
||||
void registerPipelineStartEPCallback(
|
||||
const std::function<void(ModulePassManager &)> &C) {
|
||||
PipelineStartEPCallbacks.push_back(C);
|
||||
}
|
||||
|
||||
/// \brief Register a callback for parsing an AliasAnalysis Name to populate
|
||||
/// the given AAManager \p AA
|
||||
void registerParseAACallback(
|
||||
@ -589,6 +600,8 @@ private:
|
||||
SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>
|
||||
VectorizerStartEPCallbacks;
|
||||
// Module callbacks
|
||||
SmallVector<std::function<void(ModulePassManager &)>, 2>
|
||||
PipelineStartEPCallbacks;
|
||||
SmallVector<std::function<void(ModuleAnalysisManager &)>, 2>
|
||||
ModuleAnalysisRegistrationCallbacks;
|
||||
SmallVector<std::function<bool(StringRef, ModulePassManager &,
|
||||
|
@ -150,7 +150,6 @@
|
||||
#include "llvm/Transforms/Vectorize/LoopVectorize.h"
|
||||
#include "llvm/Transforms/Vectorize/SLPVectorizer.h"
|
||||
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
static cl::opt<unsigned> MaxDevirtIterations("pm-max-devirt-iterations",
|
||||
@ -841,6 +840,10 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
|
||||
// Force any function attributes we want the rest of the pipeline to observe.
|
||||
MPM.addPass(ForceFunctionAttrsPass());
|
||||
|
||||
// Apply module pipeline start EP callback.
|
||||
for (auto &C : PipelineStartEPCallbacks)
|
||||
C(MPM);
|
||||
|
||||
if (PGOOpt && PGOOpt->SamplePGOSupport)
|
||||
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
|
||||
|
||||
@ -867,6 +870,10 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level,
|
||||
if (PGOOpt && PGOOpt->SamplePGOSupport)
|
||||
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
|
||||
|
||||
// Apply module pipeline start EP callback.
|
||||
for (auto &C : PipelineStartEPCallbacks)
|
||||
C(MPM);
|
||||
|
||||
// If we are planning to perform ThinLTO later, we don't bloat the code with
|
||||
// unrolling/vectorization/... now. Just simplify the module as much as we
|
||||
// can.
|
||||
|
@ -56,11 +56,22 @@
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=CHECK-EP-VECTORIZER-START
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-pipeline-start='no-op-module' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=CHECK-EP-PIPELINE-START
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-pipeline-start='no-op-module' \
|
||||
; RUN: -passes='lto-pre-link<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=CHECK-EP-PIPELINE-START
|
||||
|
||||
; CHECK-O: Starting llvm::Module pass manager run.
|
||||
; CHECK-O-NEXT: Running pass: PassManager<{{.*}}Module{{.*}}>
|
||||
; CHECK-O-NEXT: Starting llvm::Module pass manager run.
|
||||
; CHECK-O-NEXT: Running pass: ForceFunctionAttrsPass
|
||||
; CHECK-EP-PIPELINE-START-NEXT: Running pass: NoOpModulePass
|
||||
; CHECK-O-NEXT: Running pass: PassManager<{{.*}}Module{{.*}}>
|
||||
; CHECK-O-NEXT: Starting llvm::Module pass manager run.
|
||||
; CHECK-O-NEXT: Running pass: InferFunctionAttrsPass
|
||||
|
@ -15,8 +15,8 @@
|
||||
; RUN: -passes='thinlto-pre-link<O2>,name-anon-globals' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,CHECK-PRELINK-O,CHECK-PRELINK-O-NODIS,CHECK-PRELINK-O2
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='thinlto-pre-link<O3>,name-anon-globals' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O3,CHECK-PRELINK-O,CHECK-PRELINK-O-NODIS,CHECK-PRELINK-O3
|
||||
; RUN: -passes='thinlto-pre-link<O3>,name-anon-globals' -S -passes-ep-pipeline-start='no-op-module' %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O3,CHECK-PRELINK-O,CHECK-PRELINK-O-NODIS,CHECK-PRELINK-O3,CHECK-EP-PIPELINE-START
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='thinlto-pre-link<Os>,name-anon-globals' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-Os,CHECK-PRELINK-O,CHECK-PRELINK-O-NODIS,CHECK-PRELINK-Os
|
||||
@ -34,7 +34,7 @@
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='thinlto<O2>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,CHECK-POSTLINK-O,CHECK-POSTLINK-O2
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: opt -disable-verify -debug-pass-manager -passes-ep-pipeline-start='no-op-module' \
|
||||
; RUN: -passes='thinlto<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O3,CHECK-POSTLINK-O,CHECK-POSTLINK-O3
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
@ -51,6 +51,7 @@
|
||||
; CHECK-O-NEXT: Running pass: PassManager<{{.*}}Module{{.*}}>
|
||||
; CHECK-O-NEXT: Starting llvm::Module pass manager run.
|
||||
; CHECK-O-NEXT: Running pass: ForceFunctionAttrsPass
|
||||
; CHECK-EP-PIPELINE-START-NEXT: Running pass: NoOpModulePass
|
||||
; CHECK-DIS-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}AddDiscriminatorsPass{{.*}}>
|
||||
; CHECK-DIS-NEXT: Running analysis: InnerAnalysisManagerProxy
|
||||
; CHECK-POSTLINK-O-NEXT: Running pass: PGOIndirectCallPromotion
|
||||
|
@ -82,6 +82,11 @@ static cl::opt<std::string> VectorizerStartEPPipeline(
|
||||
cl::desc("A textual description of the function pass pipeline inserted at "
|
||||
"the VectorizerStart extension point into default pipelines"),
|
||||
cl::Hidden);
|
||||
static cl::opt<std::string> PipelineStartEPPipeline(
|
||||
"passes-ep-pipeline-start",
|
||||
cl::desc("A textual description of the function pass pipeline inserted at "
|
||||
"the PipelineStart extension point into default pipelines"),
|
||||
cl::Hidden);
|
||||
enum PGOKind { NoPGO, InstrGen, InstrUse, SampleUse };
|
||||
static cl::opt<PGOKind> PGOKindFlag(
|
||||
"pgo-kind", cl::init(NoPGO), cl::Hidden,
|
||||
@ -159,6 +164,12 @@ static void registerEPCallbacks(PassBuilder &PB, bool VerifyEachPass,
|
||||
PB.parsePassPipeline(PM, VectorizerStartEPPipeline, VerifyEachPass,
|
||||
DebugLogging);
|
||||
});
|
||||
if (tryParsePipelineText<ModulePassManager>(PB, PipelineStartEPPipeline))
|
||||
PB.registerPipelineStartEPCallback(
|
||||
[&PB, VerifyEachPass, DebugLogging](ModulePassManager &PM) {
|
||||
PB.parsePassPipeline(PM, PipelineStartEPPipeline, VerifyEachPass,
|
||||
DebugLogging);
|
||||
});
|
||||
}
|
||||
|
||||
#ifdef LINK_POLLY_INTO_TOOLS
|
||||
|
Loading…
x
Reference in New Issue
Block a user