Skip to content

Commit

Permalink
Move whole-program virtual call optimization pass after function attr…
Browse files Browse the repository at this point in the history
…ibute inference in LTO pipeline.

As a result of D18634 we no longer infer certain attributes on linkonce_odr
functions at compile time, and may only infer them at LTO time. The readnone
attribute in particular is required for virtual constant propagation (part
of whole-program virtual call optimization) to work correctly.

This change moves the whole-program virtual call optimization pass after
the function attribute inference passes, and enables the attribute inference
passes at opt level 1, so that virtual constant propagation has a chance to
work correctly for linkonce_odr functions.

Differential Revision: http://reviews.llvm.org/D20643

llvm-svn: 270765
  • Loading branch information
pcc committed May 25, 2016
1 parent fa81425 commit fad596a
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 25 deletions.
1 change: 0 additions & 1 deletion llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h
Expand Up @@ -161,7 +161,6 @@ class PassManagerBuilder {
legacy::PassManagerBase &PM) const;
void addInitialAliasAnalysisPasses(legacy::PassManagerBase &PM) const;
void addLTOOptimizationPasses(legacy::PassManagerBase &PM);
void addEarlyLTOOptimizationPasses(legacy::PassManagerBase &PM);
void addLateLTOOptimizationPasses(legacy::PassManagerBase &PM);
void addPGOInstrPasses(legacy::PassManagerBase &MPM);
void addFunctionSimplificationPasses(legacy::PassManagerBase &MPM);
Expand Down
51 changes: 27 additions & 24 deletions llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
Expand Up @@ -567,6 +567,10 @@ void PassManagerBuilder::populateModulePassManager(
}

void PassManagerBuilder::addLTOOptimizationPasses(legacy::PassManagerBase &PM) {
// Remove unused virtual tables to improve the quality of code generated by
// whole-program devirtualization and bitset lowering.
PM.add(createGlobalDCEPass());

// Provide AliasAnalysis services for optimizations.
addInitialAliasAnalysisPasses(PM);

Expand All @@ -579,20 +583,32 @@ void PassManagerBuilder::addLTOOptimizationPasses(legacy::PassManagerBase &PM) {
// Infer attributes about declarations if possible.
PM.add(createInferFunctionAttrsLegacyPass());

// Indirect call promotion. This should promote all the targets that are left
// by the earlier promotion pass that promotes intra-module targets.
// This two-step promotion is to save the compile time. For LTO, it should
// produce the same result as if we only do promotion here.
PM.add(createPGOIndirectCallPromotionLegacyPass(true));

// Propagate constants at call sites into the functions they call. This
// opens opportunities for globalopt (and inlining) by substituting function
// pointers passed as arguments to direct uses of functions.
PM.add(createIPSCCPPass());
if (OptLevel > 1) {
// Indirect call promotion. This should promote all the targets that are
// left by the earlier promotion pass that promotes intra-module targets.
// This two-step promotion is to save the compile time. For LTO, it should
// produce the same result as if we only do promotion here.
PM.add(createPGOIndirectCallPromotionLegacyPass(true));

// Propagate constants at call sites into the functions they call. This
// opens opportunities for globalopt (and inlining) by substituting function
// pointers passed as arguments to direct uses of functions.
PM.add(createIPSCCPPass());
}

// Now that we internalized some globals, see if we can hack on them!
// Infer attributes about definitions. The readnone attribute in particular is
// required for virtual constant propagation.
PM.add(createPostOrderFunctionAttrsLegacyPass());
PM.add(createReversePostOrderFunctionAttrsPass());

// Apply whole-program devirtualization and virtual constant propagation.
PM.add(createWholeProgramDevirtPass());

// That's all we need at opt level 1.
if (OptLevel == 1)
return;

// Now that we internalized some globals, see if we can hack on them!
PM.add(createGlobalOptimizerPass());
// Promote any localized global vars.
PM.add(createPromoteMemoryToRegisterPass());
Expand Down Expand Up @@ -694,16 +710,6 @@ void PassManagerBuilder::addLTOOptimizationPasses(legacy::PassManagerBase &PM) {
PM.add(createJumpThreadingPass());
}

void PassManagerBuilder::addEarlyLTOOptimizationPasses(
legacy::PassManagerBase &PM) {
// Remove unused virtual tables to improve the quality of code generated by
// whole-program devirtualization and bitset lowering.
PM.add(createGlobalDCEPass());

// Apply whole-program devirtualization and virtual constant propagation.
PM.add(createWholeProgramDevirtPass());
}

void PassManagerBuilder::addLateLTOOptimizationPasses(
legacy::PassManagerBase &PM) {
// Delete basic blocks, which optimization passes may have killed.
Expand Down Expand Up @@ -746,9 +752,6 @@ void PassManagerBuilder::populateLTOPassManager(legacy::PassManagerBase &PM) {
PM.add(createVerifierPass());

if (OptLevel != 0)
addEarlyLTOOptimizationPasses(PM);

if (OptLevel > 1)
addLTOOptimizationPasses(PM);

// Create a function that performs CFI checks for cross-DSO calls with targets
Expand Down

0 comments on commit fad596a

Please sign in to comment.