diff options
author | Whitney Tsang <whitneyt@ca.ibm.com> | 2021-03-03 20:41:41 +0000 |
---|---|---|
committer | Whitney Tsang <whitneyt@ca.ibm.com> | 2021-03-03 20:43:31 +0000 |
commit | 58d531fd6f04bf240755ca3f274cfefb20121e85 (patch) | |
tree | 8dc02744ae6804d0789687a51532addb6487d3e5 /llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp | |
parent | 60470ac7ff8e2e294636cb196de39e6b60be5995 (diff) | |
download | llvm-58d531fd6f04bf240755ca3f274cfefb20121e85.zip llvm-58d531fd6f04bf240755ca3f274cfefb20121e85.tar.gz llvm-58d531fd6f04bf240755ca3f274cfefb20121e85.tar.bz2 |
[LoopUnrollRuntime] Add option to assume the non latch exit block to be
predictable.
Reviewed By: Meinersbur, bmahjour
Differential Revision: https://reviews.llvm.org/D97747
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp index 0abf62b..5105c53 100644 --- a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp @@ -50,6 +50,9 @@ static cl::opt<bool> UnrollRuntimeMultiExit( "unroll-runtime-multi-exit", cl::init(false), cl::Hidden, cl::desc("Allow runtime unrolling for loops with multiple exits, when " "epilog is generated")); +static cl::opt<bool> UnrollRuntimeOtherExitPredictable( + "unroll-runtime-other-exit-predictable", cl::init(false), cl::Hidden, + cl::desc("Assume the non latch exit block to be predictable")); /// Connect the unrolling prolog code to the original loop. /// The unrolling prolog code contains code to execute the @@ -493,12 +496,19 @@ static bool canProfitablyUnrollMultiExitLoop( if (ExitingBlocks.size() > 2) return false; + // Allow unrolling of loops with no non latch exit blocks. + if (OtherExits.size() == 0) + return true; + // The second heuristic is that L has one exit other than the latchexit and // that exit is a deoptimize block. We know that deoptimize blocks are rarely // taken, which also implies the branch leading to the deoptimize block is - // highly predictable. + // highly predictable. When UnrollRuntimeOtherExitPredictable is specified, we + // assume the other exit branch is predictable even if it has no deoptimize + // call. return (OtherExits.size() == 1 && - OtherExits[0]->getTerminatingDeoptimizeCall()); + (UnrollRuntimeOtherExitPredictable || + OtherExits[0]->getTerminatingDeoptimizeCall())); // TODO: These can be fine-tuned further to consider code size or deopt states // that are captured by the deoptimize exit block. // Also, we can extend this to support more cases, if we actually |