diff options
| author | Michael Kuperstein <mkuper@google.com> | 2017-01-26 01:04:11 +0000 |
|---|---|---|
| committer | Michael Kuperstein <mkuper@google.com> | 2017-01-26 01:04:11 +0000 |
| commit | 5dd55e8405d66842219883a55563ec45cc010da4 (patch) | |
| tree | 7ddc915e234eb02c440d117caa7b9294cbbbb95a /llvm/test/Transforms | |
| parent | d230de27f8aa70dca0194f8d5b0030bd557c0909 (diff) | |
| download | bcm5719-llvm-5dd55e8405d66842219883a55563ec45cc010da4.tar.gz bcm5719-llvm-5dd55e8405d66842219883a55563ec45cc010da4.zip | |
[LoopUnroll] Properly update loopinfo for runtime unrolling by 2
Even when we don't create a remainder loop (that is, when we unroll by 2), we
may duplicate nested loops into the remainder. This is complicated by the fact
the remainder may itself be either inserted into an outer loop, or at the top
level. In the latter case, we may need to create new top-level loops.
Differential Revision: https://reviews.llvm.org/D29156
llvm-svn: 293124
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/LoopUnroll/revisit.ll | 10 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopUnroll/runtime-li.ll | 36 |
2 files changed, 44 insertions, 2 deletions
diff --git a/llvm/test/Transforms/LoopUnroll/revisit.ll b/llvm/test/Transforms/LoopUnroll/revisit.ll index 18ae3658385..88c9f7ba21a 100644 --- a/llvm/test/Transforms/LoopUnroll/revisit.ll +++ b/llvm/test/Transforms/LoopUnroll/revisit.ll @@ -123,7 +123,7 @@ l0.0.latch: ; CHECK: LoopUnrollPass on Loop at depth 2 containing: %l0.0 ; CHECK-NOT: LoopUnrollPass ; -; Partial unrolling occurs which introduces new child loops but not new sibling +; Partial unrolling occurs which introduces both new child loops and new sibling ; loops. We only visit the child loops in a special mode, not by default. ; CHECK-CHILDREN: LoopUnrollPass on Loop at depth 3 containing: %l0.0.0<header> ; CHECK-CHILDREN-NOT: LoopUnrollPass @@ -137,7 +137,13 @@ l0.0.latch: ; When we revisit children, we also revisit the current loop. ; CHECK-CHILDREN: LoopUnrollPass on Loop at depth 2 containing: %l0.0<header> ; CHECK-CHILDREN-NOT: LoopUnrollPass - +; +; Revisit the children of the outer loop that are part of the prologue. +; +; CHECK: LoopUnrollPass on Loop at depth 2 containing: %l0.0.0.prol<header> +; CHECK-NOT: LoopUnrollPass +; CHECK: LoopUnrollPass on Loop at depth 2 containing: %l0.0.1.prol<header> +; CHECK-NOT: LoopUnrollPass l0.latch: br label %l0 ; CHECK: LoopUnrollPass on Loop at depth 1 containing: %l0<header> diff --git a/llvm/test/Transforms/LoopUnroll/runtime-li.ll b/llvm/test/Transforms/LoopUnroll/runtime-li.ll new file mode 100644 index 00000000000..5494c8e9da7 --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/runtime-li.ll @@ -0,0 +1,36 @@ +; RUN: opt -S -loop-unroll -unroll-runtime -unroll-count=2 -verify-loop-info -pass-remarks=loop-unroll < %s 2>&1 | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; Verify that runtime-unrolling a top-level loop that has nested loops does not +; make the unroller produce invalid loop-info. +; CHECK: remark: {{.*}}: unrolled loop by a factor of 2 with run-time trip count +; CHECK: @widget +; CHECK: ret void +define void @widget(double* %arg, double* %arg1, double* %p, i64* %q1, i64* %q2) local_unnamed_addr { +entry: + br label %header.outer + +header.outer: ; preds = %latch.outer, %entry + %tmp = phi double* [ %tmp8, %latch.outer ], [ %arg, %entry ] + br label %header.inner + +header.inner: ; preds = %latch.inner, %header.outer + br i1 undef, label %latch.inner, label %latch.outer + +latch.inner: ; preds = %header.inner + %tmp5 = load i64, i64* %q1, align 8 + store i64 %tmp5, i64* %q2, align 8 + %tmp6 = icmp eq double* %p, %arg + br label %header.inner + +latch.outer: ; preds = %header.inner + store double 0.0, double* %p, align 8 + %tmp8 = getelementptr inbounds double, double* %tmp, i64 1 + %tmp9 = icmp eq double* %tmp8, %arg1 + br i1 %tmp9, label %exit, label %header.outer + +exit: ; preds = %latch.outer + ret void +} |

