diff options
author | Hal Finkel <hfinkel@anl.gov> | 2014-04-01 18:50:30 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2014-04-01 18:50:30 +0000 |
commit | 0d5c0629bbd49977ed53a093fd96ed3fd2c234f5 (patch) | |
tree | a2f614a932f926fa7fbfb2ced04c2133a3e42905 /lib/Transforms/Scalar/LoopUnrollPass.cpp | |
parent | a7a02cb7377a1c0843bee6d42e4d4d8f1dddb2ed (diff) | |
download | llvm-0d5c0629bbd49977ed53a093fd96ed3fd2c234f5.tar.gz llvm-0d5c0629bbd49977ed53a093fd96ed3fd2c234f5.tar.bz2 llvm-0d5c0629bbd49977ed53a093fd96ed3fd2c234f5.tar.xz |
Add some additional fields to TTI::UnrollingPreferences
In preparation for an upcoming commit implementing unrolling preferences for
x86, this adds additional fields to the UnrollingPreferences structure:
- PartialThreshold and PartialOptSizeThreshold - Like Threshold and
OptSizeThreshold, but used when not fully unrolling. These are necessary
because we need different thresholds for full unrolling from those used when
partially unrolling (the full unrolling thresholds are generally going to be
larger).
- MaxCount - A cap on the unrolling factor when partially unrolling. This can
be used by a target to prevent the unrolled loop from exceeding some
resource limit independent of the loop size (such as number of branches).
There should be no functionality change for any in-tree targets.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205347 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/LoopUnrollPass.cpp')
-rw-r--r-- | lib/Transforms/Scalar/LoopUnrollPass.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/Transforms/Scalar/LoopUnrollPass.cpp b/lib/Transforms/Scalar/LoopUnrollPass.cpp index 4420dc2d4a..ecd350b258 100644 --- a/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -166,7 +166,10 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) { TargetTransformInfo::UnrollingPreferences UP; UP.Threshold = CurrentThreshold; UP.OptSizeThreshold = OptSizeUnrollThreshold; + UP.PartialThreshold = CurrentThreshold; + UP.PartialOptSizeThreshold = OptSizeUnrollThreshold; UP.Count = CurrentCount; + UP.MaxCount = UINT_MAX; UP.Partial = CurrentAllowPartial; UP.Runtime = CurrentRuntime; TTI.getUnrollingPreferences(L, UP); @@ -176,11 +179,15 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) { // function is marked as optimize-for-size, and the unroll threshold was // not user specified. unsigned Threshold = UserThreshold ? CurrentThreshold : UP.Threshold; + unsigned PartialThreshold = + UserThreshold ? CurrentThreshold : UP.PartialThreshold; if (!UserThreshold && Header->getParent()->getAttributes(). hasAttribute(AttributeSet::FunctionIndex, - Attribute::OptimizeForSize)) + Attribute::OptimizeForSize)) { Threshold = UP.OptSizeThreshold; + PartialThreshold = UP.PartialOptSizeThreshold; + } // Find trip count and trip multiple if count is not available unsigned TripCount = 0; @@ -214,7 +221,7 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) { } // Enforce the threshold. - if (Threshold != NoThreshold) { + if (Threshold != NoThreshold && PartialThreshold != NoThreshold) { unsigned NumInlineCandidates; bool notDuplicatable; unsigned LoopSize = ApproximateLoopSize(L, NumInlineCandidates, @@ -241,17 +248,19 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) { } if (TripCount) { // Reduce unroll count to be modulo of TripCount for partial unrolling - Count = Threshold / LoopSize; + Count = PartialThreshold / LoopSize; while (Count != 0 && TripCount%Count != 0) Count--; } else if (Runtime) { // Reduce unroll count to be a lower power-of-two value - while (Count != 0 && Size > Threshold) { + while (Count != 0 && Size > PartialThreshold) { Count >>= 1; Size = LoopSize*Count; } } + if (Count > UP.MaxCount) + Count = UP.MaxCount; if (Count < 2) { DEBUG(dbgs() << " could not unroll partially\n"); return false; |