diff options
Diffstat (limited to 'llvm/test/Transforms/LoopUnroll/invalidate_right_loop.ll')
-rw-r--r-- | llvm/test/Transforms/LoopUnroll/invalidate_right_loop.ll | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopUnroll/invalidate_right_loop.ll b/llvm/test/Transforms/LoopUnroll/invalidate_right_loop.ll new file mode 100644 index 00000000000..cb769af63c7 --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/invalidate_right_loop.ll @@ -0,0 +1,51 @@ +; RUN: opt < %s -S -indvars -loop-unroll -verify-dom-info | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1" +target triple = "x86_64-unknown-linux-gnu" + +; Make sure that this test doesn't crash because of dangling pointer in SCEV. +declare void @llvm.experimental.guard(i1, ...) + +define void @test(i32* %p, i8** %p2, i64* %dest) { + +; CHECK-LABEL: @test( + +entry: + br label %outer.loop + +outer.loop: ; preds = %outer.latch, %entry + %local_2_ = phi i32 [ 10, %entry ], [ %tmp2, %outer.latch ] + %tmp1 = icmp eq i32 %local_2_, 0 + br label %inner.loop + +outer.latch: ; preds = %inner.latch + %tmp2 = add i32 %local_2_, 1 + br label %outer.loop + +inner.loop: ; preds = %inner.latch, %outer.loop + %local_4_20 = phi i32 [ 7, %outer.loop ], [ %tmp15, %inner.latch ] + %tmp6 = icmp eq i32 %local_4_20, 0 + call void (i1, ...) @llvm.experimental.guard(i1 %tmp6) [ "deopt"() ] + br label %innermost.loop + +store.block: ; preds = %innermost.loop + store i64 %tmp20, i64* %dest, align 8 + br i1 %tmp1, label %exit, label %inner.latch + +inner.latch: ; preds = %store.block + %tmp15 = add i32 %local_4_20, 4 + %tmp16 = icmp sgt i32 %tmp15, 263 + br i1 %tmp16, label %outer.latch, label %inner.loop + +innermost.loop: ; preds = %innermost.loop, %inner.loop + %tmp17 = phi i64 [ 0, %inner.loop ], [ %tmp20, %innermost.loop ] + %local_6_51 = phi i32 [ 1, %inner.loop ], [ %tmp21, %innermost.loop ] + %ze = zext i32 %local_6_51 to i64 + %tmp20 = add i64 %tmp17, %ze + %tmp21 = add nuw nsw i32 %local_6_51, 1 + %tmp22 = icmp ugt i32 %local_6_51, 5 + br i1 %tmp22, label %store.block, label %innermost.loop + +exit: ; preds = %store.block + ret void +} |