diff options
| author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2017-03-03 18:19:10 +0000 |
|---|---|---|
| committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2017-03-03 18:19:10 +0000 |
| commit | eed71b9e1ccd4d04f47eb3372a8a39a6aea980a8 (patch) | |
| tree | 1f8a32d8584ea86ba7231f907d788022198f91b0 /llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp | |
| parent | 184c6242faca0be0188611d45b41235e68ef282a (diff) | |
| download | bcm5719-llvm-eed71b9e1ccd4d04f47eb3372a8a39a6aea980a8.tar.gz bcm5719-llvm-eed71b9e1ccd4d04f47eb3372a8a39a6aea980a8.zip | |
[LoopUnrolling] Re-prioritize Peeling and Partial unrolling
Summary:
In current implementation the loop peeling happens after trip-count based partial unrolling and may
sometimes not happen at all due to it (for example, if trip count is known, but UP.Partial = false). This
is generally bad, the more than there are some situations where peeling is profitable even if the partial
unrolling is disabled.
This patch is a NFC which reorders peeling and partial unrolling application and prepares the code for
implementation of the said optimizations.
Patch by Max Kazantsev!
Reviewers: sanjoy, anna, reames, apilipenko, igor-laevsky, mkuper
Reviewed By: mkuper
Subscribers: mkuper, llvm-commits, mzolotukhin
Differential Revision: https://reviews.llvm.org/D30243
llvm-svn: 296897
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp b/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp index 3cb9e6e2e02..0227f8a5d13 100644 --- a/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp @@ -61,7 +61,8 @@ static bool canPeel(Loop *L) { // Return the number of iterations we want to peel off. void llvm::computePeelCount(Loop *L, unsigned LoopSize, - TargetTransformInfo::UnrollingPreferences &UP) { + TargetTransformInfo::UnrollingPreferences &UP, + unsigned &TripCount) { UP.PeelCount = 0; if (!canPeel(L)) return; @@ -70,6 +71,11 @@ void llvm::computePeelCount(Loop *L, unsigned LoopSize, if (!L->empty()) return; + // Bail if we know the statically calculated trip count. + // In this case we rather prefer partial unrolling. + if (TripCount) + return; + // If the user provided a peel count, use that. bool UserPeelCount = UnrollForcePeelCount.getNumOccurrences() > 0; if (UserPeelCount) { |

