diff options
| author | Fedor Sergeev <fedor.sergeev@azul.com> | 2018-11-16 21:16:43 +0000 |
|---|---|---|
| committer | Fedor Sergeev <fedor.sergeev@azul.com> | 2018-11-16 21:16:43 +0000 |
| commit | 2e3e224e715eeb85ca9640e19ce14cd0bd4f3f6b (patch) | |
| tree | 1703008da9443ad1291a6f2fc8ed5928d3ad144d /llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch2.ll | |
| parent | d1840e5383a9751c534fd3715ab24a497bc54295 (diff) | |
| download | bcm5719-llvm-2e3e224e715eeb85ca9640e19ce14cd0bd4f3f6b.tar.gz bcm5719-llvm-2e3e224e715eeb85ca9640e19ce14cd0bd4f3f6b.zip | |
[SimpleLoopUnswitch] adding cost multiplier to cap exponential unswitch with
We need to control exponential behavior of loop-unswitch so we do not get
run-away compilation.
Suggested solution is to introduce a multiplier for an unswitch cost that
makes cost prohibitive as soon as there are too many candidates and too
many sibling loops (meaning we have already started duplicating loops
by unswitching).
It does solve the currently known problem with compile-time degradation
(PR 39544).
Tests are built on top of a recently implemented CHECK-COUNT-<num>
FileCheck directives.
Reviewed By: chandlerc, mkazantsev
Differential Revision: https://reviews.llvm.org/D54223
llvm-svn: 347097
Diffstat (limited to 'llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch2.ll')
| -rw-r--r-- | llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch2.ll | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch2.ll b/llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch2.ll new file mode 100644 index 00000000000..b9875406933 --- /dev/null +++ b/llvm/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch2.ll @@ -0,0 +1,56 @@ +; +; Here all the branches are exiting ones. Checking that we dont have +; exponential behavior with any kind of controlling heuristics here. +; +; There we should have just a single loop. +; +; RUN: opt < %s -enable-nontrivial-unswitch -enable-unswitch-cost-multiplier=true \ +; RUN: -unswitch-num-initial-unscaled-candidates=0 -unswitch-siblings-toplevel-div=1 \ +; RUN: -passes='loop(unswitch),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP1 +; +; RUN: opt < %s -enable-nontrivial-unswitch -enable-unswitch-cost-multiplier=true \ +; RUN: -unswitch-num-initial-unscaled-candidates=0 -unswitch-siblings-toplevel-div=8 \ +; RUN: -passes='loop(unswitch),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP1 +; +; RUN: opt < %s -enable-nontrivial-unswitch -enable-unswitch-cost-multiplier=true \ +; RUN: -unswitch-num-initial-unscaled-candidates=8 -unswitch-siblings-toplevel-div=1 \ +; RUN: -passes='loop(unswitch),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP1 +; +; RUN: opt < %s -enable-nontrivial-unswitch -enable-unswitch-cost-multiplier=true \ +; RUN: -unswitch-num-initial-unscaled-candidates=8 -unswitch-siblings-toplevel-div=8 \ +; RUN: -passes='loop(unswitch),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP1 +; +; RUN: opt < %s -enable-nontrivial-unswitch -enable-unswitch-cost-multiplier=false \ +; RUN: -passes='loop(unswitch),print<loops>' -disable-output 2>&1 | FileCheck %s --check-prefixes=LOOP1 +; +; +; Single loop, not unswitched +; LOOP1: Loop at depth 1 containing: +; LOOP1-NOT: Loop at depth 1 containing: + +declare void @bar() + +define void @loop_simple5(i32* %addr, i1 %c1, i1 %c2, i1 %c3, i1 %c4, i1 %c5) { +entry: + br label %loop +loop: + %iv = phi i32 [0, %entry], [%iv.next, %loop_latch] + %iv.next = add i32 %iv, 1 + ;; disabling trivial unswitch + call void @bar() + br i1 %c1, label %loop_next1, label %exit +loop_next1: + br i1 %c2, label %loop_next2, label %exit +loop_next2: + br i1 %c3, label %loop_next3, label %exit +loop_next3: + br i1 %c4, label %loop_next4, label %exit +loop_next4: + br i1 %c5, label %loop_latch, label %exit +loop_latch: + store volatile i32 0, i32* %addr + %test_loop = icmp slt i32 %iv, 50 + br i1 %test_loop, label %loop, label %exit +exit: + ret void +} |

