summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO
diff options
context:
space:
mode:
authorRong Xu <xur@google.com>2019-03-04 20:21:27 +0000
committerRong Xu <xur@google.com>2019-03-04 20:21:27 +0000
commitdb29a3a438d5991045b5980b2c70c1f48fb710ac (patch)
treefb4d74e9bbc88e9f9fbfff1d2b8243c92b9cc097 /llvm/lib/Transforms/IPO
parentbb4d4e2d767b451c88d8f226d62ab7c81f46711b (diff)
downloadbcm5719-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.cpp43
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());
OpenPOWER on IntegriCloud