[llvm] r308753 - [RuntimeUnroll] NFC: Add a profitability function for mutliexit loop
Anna Thomas via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 21 09:30:38 PDT 2017
Author: annat
Date: Fri Jul 21 09:30:38 2017
New Revision: 308753
URL: http://llvm.org/viewvc/llvm-project?rev=308753&view=rev
Log:
[RuntimeUnroll] NFC: Add a profitability function for mutliexit loop
Separated out the profitability from the safety analysis for multiexit
loop unrolling. Currently, this is an NFC because profitability is true
only if the unroll-runtime-multi-exit is set to true (off-by-default).
This is to ease adding the profitability heuristic up for review at
D35380.
Modified:
llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp
Modified: llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp?rev=308753&r1=308752&r2=308753&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp Fri Jul 21 09:30:38 2017
@@ -435,12 +435,9 @@ canSafelyUnrollMultiExitLoop(Loop *L, Sm
BasicBlock *LatchExit, bool PreserveLCSSA,
bool UseEpilogRemainder) {
- // Support runtime unrolling for multiple exit blocks and multiple exiting
- // blocks.
- if (!UnrollRuntimeMultiExit)
- return false;
- // Even if runtime multi exit is enabled, we currently have some correctness
- // constrains in unrolling a multi-exit loop.
+ // We currently have some correctness constrains in unrolling a multi-exit
+ // loop. Check for these below.
+
// We rely on LCSSA form being preserved when the exit blocks are transformed.
if (!PreserveLCSSA)
return false;
@@ -470,7 +467,22 @@ canSafelyUnrollMultiExitLoop(Loop *L, Sm
return true;
}
-
+/// Returns true if we can profitably unroll the multi-exit loop L. Currently,
+/// we return true only if UnrollRuntimeMultiExit is set to true.
+static bool canProfitablyUnrollMultiExitLoop(
+ Loop *L, SmallVectorImpl<BasicBlock *> &OtherExits, BasicBlock *LatchExit,
+ bool PreserveLCSSA, bool UseEpilogRemainder) {
+
+#if !defined(NDEBUG)
+ SmallVector<BasicBlock *, 8> OtherExitsDummyCheck;
+ assert(canSafelyUnrollMultiExitLoop(L, OtherExitsDummyCheck, LatchExit,
+ PreserveLCSSA, UseEpilogRemainder) &&
+ "Should be safe to unroll before checking profitability!");
+#endif
+ // Priority goes to UnrollRuntimeMultiExit if it's supplied.
+ return UnrollRuntimeMultiExit.getNumOccurrences() ? UnrollRuntimeMultiExit
+ : false;
+}
/// Insert code in the prolog/epilog code when unrolling a loop with a
/// run-time trip-count.
@@ -538,8 +550,11 @@ bool llvm::UnrollRuntimeLoopRemainder(Lo
"one of the loop latch successors should be the exit block!");
// These are exit blocks other than the target of the latch exiting block.
SmallVector<BasicBlock *, 4> OtherExits;
- bool isMultiExitUnrollingEnabled = canSafelyUnrollMultiExitLoop(
- L, OtherExits, LatchExit, PreserveLCSSA, UseEpilogRemainder);
+ bool isMultiExitUnrollingEnabled =
+ canSafelyUnrollMultiExitLoop(L, OtherExits, LatchExit, PreserveLCSSA,
+ UseEpilogRemainder) &&
+ canProfitablyUnrollMultiExitLoop(L, OtherExits, LatchExit, PreserveLCSSA,
+ UseEpilogRemainder);
// Support only single exit and exiting block unless multi-exit loop unrolling is enabled.
if (!isMultiExitUnrollingEnabled &&
(!L->getExitingBlock() || OtherExits.size())) {
More information about the llvm-commits
mailing list