diff options
| author | Teresa Johnson <tejohnson@google.com> | 2017-08-03 23:42:58 +0000 |
|---|---|---|
| committer | Teresa Johnson <tejohnson@google.com> | 2017-08-03 23:42:58 +0000 |
| commit | 8482e56920780be8146b4088ec21502d00b9e440 (patch) | |
| tree | 00dfc2477bb32dd29fe68a06e61663fb1a613e5d /llvm/lib/Transforms | |
| parent | a176cc5b93075eec2bfdaf6c357b1ba216aab006 (diff) | |
| download | bcm5719-llvm-8482e56920780be8146b4088ec21502d00b9e440.tar.gz bcm5719-llvm-8482e56920780be8146b4088ec21502d00b9e440.zip | |
Use profile summary to disable peeling for huge working sets
Summary:
Detect when the working set size of a profiled application is huge,
by comparing the number of counts required to reach the hot percentile
in the profile summary to a large threshold*.
When the working set size is determined to be huge, disable peeling
to avoid bloating the working set further.
*Note that the selected threshold (15K) is significantly larger than the
largest working set value in SPEC cpu2006 (which is gcc at around 11K).
Reviewers: davidxl
Subscribers: mehdi_amini, mzolotukhin, eraman, llvm-commits
Differential Revision: https://reviews.llvm.org/D36288
llvm-svn: 310005
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp index cd0e4328697..b692c08c9cc 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/LoopUnrollAnalyzer.h" #include "llvm/Analysis/OptimizationDiagnosticInfo.h" +#include "llvm/Analysis/ProfileSummaryInfo.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/ScalarEvolutionExpressions.h" #include "llvm/IR/DataLayout.h" @@ -1252,6 +1253,11 @@ PreservedAnalyses LoopUnrollPass::run(Function &F, auto &AC = AM.getResult<AssumptionAnalysis>(F); auto &ORE = AM.getResult<OptimizationRemarkEmitterAnalysis>(F); + const ModuleAnalysisManager &MAM = + AM.getResult<ModuleAnalysisManagerFunctionProxy>(F).getManager(); + ProfileSummaryInfo *PSI = + MAM.getCachedResult<ProfileSummaryAnalysis>(*F.getParent()); + bool Changed = false; // The unroller requires loops to be in simplified form, and also needs LCSSA. @@ -1280,12 +1286,18 @@ PreservedAnalyses LoopUnrollPass::run(Function &F, // states we support: partial and full (or "simple") unrolling. However, to // enable these things we actually pass "None" in for the optional to avoid // providing an explicit choice. - Optional<bool> AllowPartialParam, RuntimeParam, UpperBoundParam; - bool CurChanged = tryToUnrollLoop( - &L, DT, &LI, SE, TTI, AC, ORE, - /*PreserveLCSSA*/ true, OptLevel, /*Count*/ None, - /*Threshold*/ None, AllowPartialParam, RuntimeParam, UpperBoundParam, - /*AllowPeeling*/ None); + Optional<bool> AllowPartialParam, RuntimeParam, UpperBoundParam, + AllowPeeling; + // Check if the profile summary indicates that the profiled application + // has a huge working set size, in which case we disable peeling to avoid + // bloating it further. + if (PSI && PSI->hasHugeWorkingSetSize()) + AllowPeeling = false; + bool CurChanged = + tryToUnrollLoop(&L, DT, &LI, SE, TTI, AC, ORE, + /*PreserveLCSSA*/ true, OptLevel, /*Count*/ None, + /*Threshold*/ None, AllowPartialParam, RuntimeParam, + UpperBoundParam, AllowPeeling); Changed |= CurChanged; // The parent must not be damaged by unrolling! |

