diff options
| author | Anna Thomas <anna@azul.com> | 2017-07-21 16:30:38 +0000 | 
|---|---|---|
| committer | Anna Thomas <anna@azul.com> | 2017-07-21 16:30:38 +0000 | 
| commit | 5c07a4c5de37d0098c6e664a620ded5a3edc6aca (patch) | |
| tree | 218d655436e8173fa06683eb43268068976c9fb5 /llvm/lib | |
| parent | 4f37d5754708dbe78deb368edb6f5ac3a88ad75e (diff) | |
| download | bcm5719-llvm-5c07a4c5de37d0098c6e664a620ded5a3edc6aca.tar.gz bcm5719-llvm-5c07a4c5de37d0098c6e664a620ded5a3edc6aca.zip  | |
[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.
llvm-svn: 308753
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp | 33 | 
1 files changed, 24 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp index d43ce7abb7c..2631255d64c 100644 --- a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp @@ -435,12 +435,9 @@ canSafelyUnrollMultiExitLoop(Loop *L, SmallVectorImpl<BasicBlock *> &OtherExits,                               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, SmallVectorImpl<BasicBlock *> &OtherExits,    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(Loop *L, unsigned Count,           "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())) {  | 

