diff options
| author | Rong Xu <xur@google.com> | 2019-03-04 20:21:27 +0000 | 
|---|---|---|
| committer | Rong Xu <xur@google.com> | 2019-03-04 20:21:27 +0000 | 
| commit | db29a3a438d5991045b5980b2c70c1f48fb710ac (patch) | |
| tree | fb4d74e9bbc88e9f9fbfff1d2b8243c92b9cc097 /llvm/lib/Transforms/IPO | |
| parent | bb4d4e2d767b451c88d8f226d62ab7c81f46711b (diff) | |
| download | bcm5719-llvm-db29a3a438d5991045b5980b2c70c1f48fb710ac.tar.gz bcm5719-llvm-db29a3a438d5991045b5980b2c70c1f48fb710ac.zip | |
[PGO] Context sensitive PGO (part 3)
Part 3 of CSPGO changes (mostly related to PassMananger).
Differential Revision: https://reviews.llvm.org/D54175
llvm-svn: 355330
Diffstat (limited to 'llvm/lib/Transforms/IPO')
| -rw-r--r-- | llvm/lib/Transforms/IPO/PassManagerBuilder.cpp | 43 | 
1 files changed, 34 insertions, 9 deletions
| diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index 14b4bc76a81..0505135673b 100644 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -174,6 +174,8 @@ PassManagerBuilder::PassManagerBuilder() {      MergeFunctions = false;      PrepareForLTO = false;      EnablePGOInstrGen = false; +    EnablePGOCSInstrGen = false; +    EnablePGOCSInstrUse = false;      PGOInstrGen = "";      PGOInstrUse = "";      PGOSampleUse = ""; @@ -271,13 +273,19 @@ void PassManagerBuilder::populateFunctionPassManager(  }  // Do PGO instrumentation generation or use pass as the option specified. -void PassManagerBuilder::addPGOInstrPasses(legacy::PassManagerBase &MPM) { -  if (!EnablePGOInstrGen && PGOInstrUse.empty() && PGOSampleUse.empty()) +void PassManagerBuilder::addPGOInstrPasses(legacy::PassManagerBase &MPM, +                                           bool IsCS = false) { +  if (IsCS) { +    if (!EnablePGOCSInstrGen && !EnablePGOCSInstrUse) +      return; +  } else if (!EnablePGOInstrGen && PGOInstrUse.empty() && PGOSampleUse.empty())      return; +    // Perform the preinline and cleanup passes for O1 and above.    // And avoid doing them if optimizing for size. +  // We will not do this inline for context sensitive PGO (when IsCS is true).    if (OptLevel > 0 && SizeLevel == 0 && !DisablePreInliner && -      PGOSampleUse.empty()) { +      PGOSampleUse.empty() && !IsCS) {      // Create preinline pass. We construct an InlineParams object and specify      // the threshold here to avoid the command line options of the regular      // inliner to influence pre-inlining. The only fields of InlineParams we @@ -295,22 +303,23 @@ void PassManagerBuilder::addPGOInstrPasses(legacy::PassManagerBase &MPM) {      MPM.add(createInstructionCombiningPass()); // Combine silly seq's      addExtensionsToPM(EP_Peephole, MPM);    } -  if (EnablePGOInstrGen) { -    MPM.add(createPGOInstrumentationGenLegacyPass()); +  if ((EnablePGOInstrGen && !IsCS) || (EnablePGOCSInstrGen && IsCS)) { +    MPM.add(createPGOInstrumentationGenLegacyPass(IsCS));      // Add the profile lowering pass.      InstrProfOptions Options;      if (!PGOInstrGen.empty())        Options.InstrProfileOutput = PGOInstrGen;      Options.DoCounterPromotion = true; +    Options.UseBFIInPromotion = IsCS;      MPM.add(createLoopRotatePass()); -    MPM.add(createInstrProfilingLegacyPass(Options)); +    MPM.add(createInstrProfilingLegacyPass(Options, IsCS));    }    if (!PGOInstrUse.empty()) -    MPM.add(createPGOInstrumentationUseLegacyPass(PGOInstrUse)); +    MPM.add(createPGOInstrumentationUseLegacyPass(PGOInstrUse, IsCS));    // Indirect call promotion that promotes intra-module targets only.    // For ThinLTO this is done earlier due to interactions with globalopt    // for imported functions. We don't run this at -O0. -  if (OptLevel > 0) +  if (OptLevel > 0 && !IsCS)      MPM.add(          createPGOIndirectCallPromotionLegacyPass(false, !PGOSampleUse.empty()));  } @@ -418,7 +427,7 @@ void PassManagerBuilder::addFunctionSimplificationPasses(    addExtensionsToPM(EP_Peephole, MPM);    if (EnableCHR && OptLevel >= 3 && -      (!PGOInstrUse.empty() || !PGOSampleUse.empty())) +      (!PGOInstrUse.empty() || !PGOSampleUse.empty() || EnablePGOCSInstrGen))      MPM.add(createControlHeightReductionLegacyPass());  } @@ -533,6 +542,11 @@ void PassManagerBuilder::populateModulePassManager(    if (DefaultOrPreLinkPipeline && !PrepareForThinLTOUsingPGOSampleProfile)      addPGOInstrPasses(MPM); +  // Create profile COMDAT variables. Lld linker wants to see all variables +  // before the LTO/ThinLTO link since it needs to resolve symbols/comdats. +  if (!PerformThinLTO && EnablePGOCSInstrGen) +    MPM.add(createPGOInstrumentationGenCreateVarLegacyPass(PGOInstrGen)); +    // We add a module alias analysis pass here. In part due to bugs in the    // analysis infrastructure this "works" in that the analysis stays alive    // for the entire SCC pass run below. @@ -574,6 +588,14 @@ void PassManagerBuilder::populateModulePassManager(      // and saves running remaining passes on the eliminated functions.      MPM.add(createEliminateAvailableExternallyPass()); +  // CSFDO instrumentation and use pass. Don't invoke this for Prepare pass +  // for LTO and ThinLTO -- The actual pass will be called after all inlines +  // are performed. +  // Need to do this after COMDAT variables have been eliminated, +  // (i.e. after EliminateAvailableExternallyPass). +  if (!(PrepareForLTO || PrepareForThinLTO)) +    addPGOInstrPasses(MPM, /* IsCS */ true); +    if (EnableOrderFileInstrumentation)      MPM.add(createInstrOrderFilePass()); @@ -854,6 +876,9 @@ void PassManagerBuilder::addLTOOptimizationPasses(legacy::PassManagerBase &PM) {    PM.add(createPruneEHPass());   // Remove dead EH info. +  // CSFDO instrumentation and use pass. +  addPGOInstrPasses(PM, /* IsCS */ true); +    // Optimize globals again if we ran the inliner.    if (RunInliner)      PM.add(createGlobalOptimizerPass()); | 

