diff options
| author | Fiona Glaser <escha@apple.com> | 2016-04-06 16:57:25 +0000 |
|---|---|---|
| committer | Fiona Glaser <escha@apple.com> | 2016-04-06 16:57:25 +0000 |
| commit | 045afc4f66711cd56d3e3407935633f1716d4a5f (patch) | |
| tree | 7dad66004adbdd2cbd9bff8d647318ca73f0be71 /llvm/lib/Transforms | |
| parent | a1ca39d3107f5d30f806c3f1b96544fde8dd28db (diff) | |
| download | bcm5719-llvm-045afc4f66711cd56d3e3407935633f1716d4a5f.tar.gz bcm5719-llvm-045afc4f66711cd56d3e3407935633f1716d4a5f.zip | |
Loop Unroll: add options and tweak to make Partial unrolling more useful
1. Add FullUnrollMaxCount option that works like MaxCount, but also limits
the unroll count for fully unrolled loops. So if a loop has an iteration
count over this, it won't fully unroll.
2. Add CLI options for MaxCount and the new option, so they can be tested
(plus a test).
3. Make partial unrolling obey MaxCount.
An example use-case (the out of tree one this is originally designed for) is
a target’s TTI can analyze a loop and decide on a max unroll count separate
from the size threshold, e.g. based on register pressure, then constrain
LoopUnroll to not exceed that, regardless of the size of the unrolled loop.
llvm-svn: 265562
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp index e5a95135891..01a8ad8a144 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -65,6 +65,15 @@ UnrollCount("unroll-count", cl::Hidden, cl::desc("Use this unroll count for all loops including those with " "unroll_count pragma values, for testing purposes")); +static cl::opt<unsigned> +UnrollMaxCount("unroll-max-count", cl::Hidden, + cl::desc("Set the max unroll count for partial and runtime unrolling, for" + "testing purposes")); + +static cl::opt<unsigned> +UnrollFullMaxCount("unroll-full-max-count", cl::Hidden, + cl::desc("Set the max unroll count for full unrolling, for testing purposes")); + static cl::opt<bool> UnrollAllowPartial("unroll-allow-partial", cl::Hidden, cl::desc("Allows loops to be partially unrolled until " @@ -107,6 +116,7 @@ static TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences( UP.PartialOptSizeThreshold = UP.OptSizeThreshold; UP.Count = 0; UP.MaxCount = UINT_MAX; + UP.FullUnrollMaxCount = UINT_MAX; UP.Partial = false; UP.Runtime = false; UP.AllowExpensiveTripCount = false; @@ -138,6 +148,10 @@ static TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences( UP.DynamicCostSavingsDiscount = UnrollDynamicCostSavingsDiscount; if (UnrollCount.getNumOccurrences() > 0) UP.Count = UnrollCount; + if (UnrollMaxCount.getNumOccurrences() > 0) + UP.MaxCount = UnrollMaxCount; + if (UnrollFullMaxCount.getNumOccurrences() > 0) + UP.FullUnrollMaxCount = UnrollFullMaxCount; if (UnrollAllowPartial.getNumOccurrences() > 0) UP.Partial = UnrollAllowPartial; if (UnrollRuntime.getNumOccurrences() > 0) @@ -566,6 +580,7 @@ static bool tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI, Count = TripCount == 0 ? DefaultUnrollRuntimeCount : TripCount; if (TripCount && Count > TripCount) Count = TripCount; + Count = std::min(Count, UP.FullUnrollMaxCount); unsigned NumInlineCandidates; bool NotDuplicatable; @@ -633,10 +648,12 @@ static bool tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI, << "-unroll-allow-partial not given\n"); return false; } - if (UP.PartialThreshold != NoThreshold && - UnrolledSize > UP.PartialThreshold) { + if (UP.PartialThreshold != NoThreshold && Count > 1) { // Reduce unroll count to be modulo of TripCount for partial unrolling. - Count = (std::max(UP.PartialThreshold, 3u) - 2) / (LoopSize - 2); + if (UnrolledSize > UP.PartialThreshold) + Count = (std::max(UP.PartialThreshold, 3u) - 2) / (LoopSize - 2); + if (Count > UP.MaxCount) + Count = UP.MaxCount; while (Count != 0 && TripCount % Count != 0) Count--; if (AllowRuntime && Count <= 1) { |

