blob: 49990f92cabe1a5bb58c9fe0bd28dffcd83b50ee [file] [log] [blame]
Michael Zolotukhin6bc56d52016-07-20 01:55:27 +00001; RUN: opt < %s -lcssa -loop-unroll -S | FileCheck %s
2target triple = "x86_64-unknown-linux-gnu"
3
Michael Zolotukhin09cf3042016-08-06 01:48:51 +00004; PR28272
Michael Zolotukhin6bc56d52016-07-20 01:55:27 +00005; When LoopSimplify separates nested loops, it might break LCSSA form: values
6; from the original loop might be used in the outer loop. This test invokes
7; loop-unroll, which calls loop-simplify before itself. If LCSSA is broken
8; after loop-simplify, we crash on assertion.
9
10; CHECK-LABEL: @foo
11define void @foo() {
12entry:
13 br label %header
14
15header:
16 br label %loop1
17
18loop1:
19 br i1 true, label %loop1, label %bb43
20
21bb43:
22 %a = phi i32 [ undef, %loop1 ], [ 0, %bb45 ], [ %a, %bb54 ]
23 %b = phi i32 [ 0, %loop1 ], [ 1, %bb54 ], [ %c, %bb45 ]
24 br i1 true, label %bb114, label %header
25
26bb114:
27 %c = add i32 0, 1
28 %d = add i32 0, 1
29 br i1 true, label %bb45, label %bb54
30
31bb45:
32 %x = add i32 %d, 0
33 br label %bb43
34
35bb54:
36 br label %bb43
37}
38
39; CHECK-LABEL: @foo2
40define void @foo2() {
41entry:
42 br label %outer
43
44outer.loopexit:
45 br label %outer
46
47outer:
48 br label %loop1
49
50loop1:
51 br i1 true, label %loop1, label %loop2.preheader
52
53loop2.preheader:
54 %a.ph = phi i32 [ undef, %loop1 ]
55 %b.ph = phi i32 [ 0, %loop1 ]
56 br label %loop2
57
58loop2:
59 %a = phi i32 [ 0, %loop2.if.true ], [ %a, %loop2.if.false ], [ %a.ph, %loop2.preheader ], [0, %bb]
60 %b = phi i32 [ 1, %loop2.if.false ], [ %c, %loop2.if.true ], [ %b.ph, %loop2.preheader ], [%c, %bb]
61 br i1 true, label %loop2.if, label %outer.loopexit
62
63loop2.if:
64 %c = add i32 0, 1
65 switch i32 undef, label %loop2.if.false [i32 0, label %loop2.if.true
66 i32 1, label %bb]
67
68loop2.if.true:
69 br i1 undef, label %loop2, label %bb
70
71loop2.if.false:
72 br label %loop2
73
74bb:
75 br label %loop2
76}