Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion llvm/include/llvm/Passes/PassBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,34 @@ class PassBuilder {
return PIC;
}

// Invoke the callbacks registered for the various extension points.
// Custom pipelines should use these to invoke the callbacks registered
// by TargetMachines and other clients.
void invokePeepholeEPCallbacks(FunctionPassManager &FPM,
OptimizationLevel Level);
void invokeLateLoopOptimizationsEPCallbacks(LoopPassManager &LPM,
OptimizationLevel Level);
void invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
OptimizationLevel Level);
void invokeScalarOptimizerLateEPCallbacks(FunctionPassManager &FPM,
OptimizationLevel Level);
void invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
OptimizationLevel Level);
void invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
OptimizationLevel Level);
void invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level);
void invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level);
void invokeFullLinkTimeOptimizationEarlyEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level);
void invokeFullLinkTimeOptimizationLastEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level);
void invokePipelineStartEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level);
void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level);

private:
// O1 pass pipeline
FunctionPassManager
Expand Down Expand Up @@ -612,7 +640,6 @@ class PassBuilder {
bool RunProfileGen, bool IsCS, std::string ProfileFile,
std::string ProfileRemappingFile,
ThinOrFullLTOPhase LTOPhase);
void invokePeepholeEPCallbacks(FunctionPassManager &, OptimizationLevel);

// Extension Point callbacks
SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ void PerfJITEventListener::NotifyCode(Expected<llvm::StringRef> &Symbol,
rec.Prefix.Timestamp = perf_get_timestamp();

rec.CodeSize = CodeSize;
rec.Vma = 0;
rec.Vma = CodeAddr;
rec.CodeAddr = CodeAddr;
rec.Pid = Pid;
rec.Tid = get_threadid();
Expand Down
136 changes: 82 additions & 54 deletions llvm/lib/Passes/PassBuilderPipelines.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,61 @@ void PassBuilder::invokePeepholeEPCallbacks(FunctionPassManager &FPM,
for (auto &C : PeepholeEPCallbacks)
C(FPM, Level);
}
void PassBuilder::invokeLateLoopOptimizationsEPCallbacks(
LoopPassManager &LPM, OptimizationLevel Level) {
for (auto &C : LateLoopOptimizationsEPCallbacks)
C(LPM, Level);
}
void PassBuilder::invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
OptimizationLevel Level) {
for (auto &C : LoopOptimizerEndEPCallbacks)
C(LPM, Level);
}
void PassBuilder::invokeScalarOptimizerLateEPCallbacks(
FunctionPassManager &FPM, OptimizationLevel Level) {
for (auto &C : ScalarOptimizerLateEPCallbacks)
C(FPM, Level);
}
void PassBuilder::invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
OptimizationLevel Level) {
for (auto &C : CGSCCOptimizerLateEPCallbacks)
C(CGPM, Level);
}
void PassBuilder::invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
OptimizationLevel Level) {
for (auto &C : VectorizerStartEPCallbacks)
C(FPM, Level);
}
void PassBuilder::invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level) {
for (auto &C : OptimizerEarlyEPCallbacks)
C(MPM, Level);
}
void PassBuilder::invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level) {
for (auto &C : OptimizerLastEPCallbacks)
C(MPM, Level);
}
void PassBuilder::invokeFullLinkTimeOptimizationEarlyEPCallbacks(
ModulePassManager &MPM, OptimizationLevel Level) {
for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
C(MPM, Level);
}
void PassBuilder::invokeFullLinkTimeOptimizationLastEPCallbacks(
ModulePassManager &MPM, OptimizationLevel Level) {
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
C(MPM, Level);
}
void PassBuilder::invokePipelineStartEPCallbacks(ModulePassManager &MPM,
OptimizationLevel Level) {
for (auto &C : PipelineStartEPCallbacks)
C(MPM, Level);
}
void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
ModulePassManager &MPM, OptimizationLevel Level) {
for (auto &C : PipelineEarlySimplificationEPCallbacks)
C(MPM, Level);
}

// Helper to add AnnotationRemarksPass.
static void addAnnotationRemarksPass(ModulePassManager &MPM) {
Expand Down Expand Up @@ -311,8 +366,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
LPM2.addPass(LoopIdiomRecognizePass());
LPM2.addPass(IndVarSimplifyPass());

for (auto &C : LateLoopOptimizationsEPCallbacks)
C(LPM2, Level);
invokeLateLoopOptimizationsEPCallbacks(LPM2, Level);

LPM2.addPass(LoopDeletionPass());

Expand All @@ -330,8 +384,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
/* OnlyWhenForced= */ !PTO.LoopUnrolling,
PTO.ForgetAllSCEVInLoopUnroll));

for (auto &C : LoopOptimizerEndEPCallbacks)
C(LPM2, Level);
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);

// We provide the opt remark emitter pass for LICM to use. We only need to do
// this once as it is immutable.
Expand Down Expand Up @@ -372,8 +425,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,

FPM.addPass(CoroElidePass());

for (auto &C : ScalarOptimizerLateEPCallbacks)
C(FPM, Level);
invokeScalarOptimizerLateEPCallbacks(FPM, Level);

// Finally, do an expensive DCE pass to catch all the dead code exposed by
// the simplifications and basic cleanup after all the simplifications.
Expand Down Expand Up @@ -496,8 +548,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
LPM2.addPass(LoopIdiomRecognizePass());
LPM2.addPass(IndVarSimplifyPass());

for (auto &C : LateLoopOptimizationsEPCallbacks)
C(LPM2, Level);
invokeLateLoopOptimizationsEPCallbacks(LPM2, Level);

LPM2.addPass(LoopDeletionPass());

Expand All @@ -515,8 +566,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
/* OnlyWhenForced= */ !PTO.LoopUnrolling,
PTO.ForgetAllSCEVInLoopUnroll));

for (auto &C : LoopOptimizerEndEPCallbacks)
C(LPM2, Level);
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);

// We provide the opt remark emitter pass for LICM to use. We only need to do
// this once as it is immutable.
Expand Down Expand Up @@ -589,8 +639,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,

FPM.addPass(CoroElidePass());

for (auto &C : ScalarOptimizerLateEPCallbacks)
C(FPM, Level);
invokeScalarOptimizerLateEPCallbacks(FPM, Level);

FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
.convertSwitchRangeToICmp(true)
Expand Down Expand Up @@ -772,8 +821,7 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
if (Level == OptimizationLevel::O2 || Level == OptimizationLevel::O3)
MainCGPipeline.addPass(OpenMPOptCGSCCPass());

for (auto &C : CGSCCOptimizerLateEPCallbacks)
C(MainCGPipeline, Level);
invokeCGSCCOptimizerLateEPCallbacks(MainCGPipeline, Level);

// Lastly, add the core function simplification pipeline nested inside the
// CGSCC walk.
Expand Down Expand Up @@ -928,8 +976,7 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
if (Phase == ThinOrFullLTOPhase::ThinLTOPostLink)
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));

for (auto &C : PipelineEarlySimplificationEPCallbacks)
C(MPM, Level);
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);

// Specialize functions with IPSCCP.
if (EnableFunctionSpecialization && Level == OptimizationLevel::O3)
Expand Down Expand Up @@ -1189,8 +1236,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
// memory operations.
MPM.addPass(RecomputeGlobalsAAPass());

for (auto &C : OptimizerEarlyEPCallbacks)
C(MPM, Level);
invokeOptimizerEarlyEPCallbacks(MPM, Level);

FunctionPassManager OptimizePM;
OptimizePM.addPass(Float2IntPass());
Expand All @@ -1208,8 +1254,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
// rather than on each loop in an inside-out manner, and so they are actually
// function passes.

for (auto &C : VectorizerStartEPCallbacks)
C(OptimizePM, Level);
invokeVectorizerStartEPCallbacks(OptimizePM, Level);

LoopPassManager LPM;
// First rotate loops that may have been un-rotated by prior passes.
Expand Down Expand Up @@ -1261,8 +1306,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM),
PTO.EagerlyInvalidateAnalyses));

for (auto &C : OptimizerLastEPCallbacks)
C(MPM, Level);
invokeOptimizerLastEPCallbacks(MPM, Level);

// Split out cold code. Splitting is done late to avoid hiding context from
// other optimizations and inadvertently regressing performance. The tradeoff
Expand Down Expand Up @@ -1315,8 +1359,7 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
MPM.addPass(ForceFunctionAttrsPass());

// Apply module pipeline start EP callback.
for (auto &C : PipelineStartEPCallbacks)
C(MPM, Level);
invokePipelineStartEPCallbacks(MPM, Level);

if (PGOOpt && PGOOpt->DebugInfoForProfiling)
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
Expand Down Expand Up @@ -1360,8 +1403,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));

// Apply module pipeline start EP callback.
for (auto &C : PipelineStartEPCallbacks)
C(MPM, Level);
invokePipelineStartEPCallbacks(MPM, Level);

// 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
Expand Down Expand Up @@ -1389,8 +1431,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
// Handle OptimizerLastEPCallbacks added by clang on PreLink. Actual
// optimization is going to be done in PostLink stage, but clang can't
// add callbacks there in case of in-process ThinLTO called by linker.
for (auto &C : OptimizerLastEPCallbacks)
C(MPM, Level);
invokeOptimizerLastEPCallbacks(MPM, Level);

// Emit annotation remarks.
addAnnotationRemarksPass(MPM);
Expand Down Expand Up @@ -1473,8 +1514,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
// Convert @llvm.global.annotations to !annotation metadata.
MPM.addPass(Annotation2MetadataPass());

for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
C(MPM, Level);
invokeFullLinkTimeOptimizationEarlyEPCallbacks(MPM, Level);

// Create a function that performs CFI checks for cross-DSO calls with targets
// in the current module.
Expand All @@ -1489,8 +1529,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
// in ICP.
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));

for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
C(MPM, Level);
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);

// Emit annotation remarks.
addAnnotationRemarksPass(MPM);
Expand Down Expand Up @@ -1571,8 +1610,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
// pipeline).
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));

for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
C(MPM, Level);
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);

// Emit annotation remarks.
addAnnotationRemarksPass(MPM);
Expand Down Expand Up @@ -1753,8 +1791,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
if (PTO.CallGraphProfile)
MPM.addPass(CGProfilePass());

for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
C(MPM, Level);
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);

// Emit annotation remarks.
addAnnotationRemarksPass(MPM);
Expand Down Expand Up @@ -1783,14 +1820,12 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
/* RunProfileGen */ (PGOOpt->Action == PGOOptions::IRInstr),
/* IsCS */ false, PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile);

for (auto &C : PipelineStartEPCallbacks)
C(MPM, Level);
invokePipelineStartEPCallbacks(MPM, Level);

if (PGOOpt && PGOOpt->DebugInfoForProfiling)
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));

for (auto &C : PipelineEarlySimplificationEPCallbacks)
C(MPM, Level);
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);

// Build a minimal pipeline based on the semantics required by LLVM,
// which is just that always inlining occurs. Further, disable generating
Expand All @@ -1808,44 +1843,38 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,

if (!CGSCCOptimizerLateEPCallbacks.empty()) {
CGSCCPassManager CGPM;
for (auto &C : CGSCCOptimizerLateEPCallbacks)
C(CGPM, Level);
invokeCGSCCOptimizerLateEPCallbacks(CGPM, Level);
if (!CGPM.isEmpty())
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
}
if (!LateLoopOptimizationsEPCallbacks.empty()) {
LoopPassManager LPM;
for (auto &C : LateLoopOptimizationsEPCallbacks)
C(LPM, Level);
invokeLateLoopOptimizationsEPCallbacks(LPM, Level);
if (!LPM.isEmpty()) {
MPM.addPass(createModuleToFunctionPassAdaptor(
createFunctionToLoopPassAdaptor(std::move(LPM))));
}
}
if (!LoopOptimizerEndEPCallbacks.empty()) {
LoopPassManager LPM;
for (auto &C : LoopOptimizerEndEPCallbacks)
C(LPM, Level);
invokeLoopOptimizerEndEPCallbacks(LPM, Level);
if (!LPM.isEmpty()) {
MPM.addPass(createModuleToFunctionPassAdaptor(
createFunctionToLoopPassAdaptor(std::move(LPM))));
}
}
if (!ScalarOptimizerLateEPCallbacks.empty()) {
FunctionPassManager FPM;
for (auto &C : ScalarOptimizerLateEPCallbacks)
C(FPM, Level);
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
if (!FPM.isEmpty())
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
}

for (auto &C : OptimizerEarlyEPCallbacks)
C(MPM, Level);
invokeOptimizerEarlyEPCallbacks(MPM, Level);

if (!VectorizerStartEPCallbacks.empty()) {
FunctionPassManager FPM;
for (auto &C : VectorizerStartEPCallbacks)
C(FPM, Level);
invokeVectorizerStartEPCallbacks(FPM, Level);
if (!FPM.isEmpty())
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
}
Expand All @@ -1859,8 +1888,7 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
CoroPM.addPass(GlobalDCEPass());
MPM.addPass(CoroConditionalWrapper(std::move(CoroPM)));

for (auto &C : OptimizerLastEPCallbacks)
C(MPM, Level);
invokeOptimizerLastEPCallbacks(MPM, Level);

if (LTOPreLink)
addRequiredLTOPreLinkPasses(MPM);
Expand Down
3 changes: 1 addition & 2 deletions llvm/lib/Passes/StandardInstrumentations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -758,8 +758,7 @@ void PrintIRInstrumentation::printAfterPass(StringRef PassID, Any IR) {
}

void PrintIRInstrumentation::printAfterPassInvalidated(StringRef PassID) {
StringRef PassName = PIC->getPassNameForClassName(PassID);
if (!shouldPrintAfterPass(PassName))
if (!shouldPrintAfterPass(PassID))
return;

if (isIgnored(PassID))
Expand Down
Loading