xref: /llvm-project/llvm/test/Transforms/LoopUnroll/invalidate_right_loop.ll (revision ef992b60798b6cd2c50b25351bfc392e319896b7)
1; RUN: opt < %s -S -passes='loop(indvars),loop-unroll' -verify-dom-info | FileCheck %s
2
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1"
4target triple = "x86_64-unknown-linux-gnu"
5
6; Make sure that this test doesn't crash because of dangling pointer in SCEV.
7declare void @llvm.experimental.guard(i1, ...)
8
9define void @test(ptr %p, ptr %p2, ptr %dest) {
10
11; CHECK-LABEL: @test(
12
13entry:
14  br label %outer.loop
15
16outer.loop:                                           ; preds = %outer.latch, %entry
17  %local_2_ = phi i32 [ 10, %entry ], [ %tmp2, %outer.latch ]
18  %tmp1 = icmp eq i32 %local_2_, 0
19  br label %inner.loop
20
21outer.latch:                                          ; preds = %inner.latch
22  %tmp2 = add i32 %local_2_, 1
23  br label %outer.loop
24
25inner.loop:                                           ; preds = %inner.latch, %outer.loop
26  %local_4_20 = phi i32 [ 7, %outer.loop ], [ %tmp15, %inner.latch ]
27  %tmp6 = icmp eq i32 %local_4_20, 0
28  call void (i1, ...) @llvm.experimental.guard(i1 %tmp6) [ "deopt"() ]
29  br label %innermost.loop
30
31store.block:                                          ; preds = %innermost.loop
32  store i64 %tmp20, ptr %dest, align 8
33  br i1 %tmp1, label %exit, label %inner.latch
34
35inner.latch:                                   ; preds = %store.block
36  %tmp15 = add i32 %local_4_20, 4
37  %tmp16 = icmp sgt i32 %tmp15, 263
38  br i1 %tmp16, label %outer.latch, label %inner.loop
39
40innermost.loop:                                          ; preds = %innermost.loop, %inner.loop
41  %tmp17 = phi i64 [ 0, %inner.loop ], [ %tmp20, %innermost.loop ]
42  %local_6_51 = phi i32 [ 1, %inner.loop ], [ %tmp21, %innermost.loop ]
43  %ze = zext i32 %local_6_51 to i64
44  %tmp20 = add i64 %tmp17, %ze
45  %tmp21 = add nuw nsw i32 %local_6_51, 1
46  %tmp22 = icmp ugt i32 %local_6_51, 5
47  br i1 %tmp22, label %store.block, label %innermost.loop
48
49exit:                                           ; preds = %store.block
50  ret void
51}
52