blob: e59d7636dca167b313467f0b05a8e3d8c910432c [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 Zolotukhin442b82f2016-08-07 01:56:54 +00004; PR28272, PR28825
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}
Michael Zolotukhin442b82f2016-08-07 01:56:54 +000077
78; When LoopSimplify separates nested loops, it might break LCSSA form: values
79; from the original loop might be used in exit blocks of the outer loop.
80; CHECK-LABEL: @foo3
81define void @foo3() {
82entry:
83 br label %bb1
84
85bb1:
86 br i1 undef, label %bb2, label %bb1
87
88bb2:
89 %a = phi i32 [ undef, %bb1 ], [ %a, %bb3 ], [ undef, %bb5 ]
90 br i1 undef, label %bb3, label %bb1
91
92bb3:
93 %b = load i32*, i32** undef
94 br i1 undef, label %bb2, label %bb4
95
96bb4:
97 br i1 undef, label %bb5, label %bb6
98
99bb5:
100 br i1 undef, label %bb2, label %bb4
101
102bb6:
103 br i1 undef, label %bb_end, label %bb1
104
105bb_end:
106 %x = getelementptr i32, i32* %b
107 br label %bb_end
108}