blob: ccb2a3f833010da35f91e91e5e8ac2f81ee8998c [file] [log] [blame]
Chris Lattner4f68e0c2009-10-11 03:54:21 +00001; RUN: opt < %s -jump-threading -S | FileCheck %s
Chris Lattnerd57b6b82008-04-22 06:35:14 +00002
3declare i32 @f1()
4declare i32 @f2()
5declare void @f3()
6
Chris Lattner3733adb2009-10-11 03:55:30 +00007define i32 @test1(i1 %cond) {
8; CHECK: @test1
9
Chris Lattnerd57b6b82008-04-22 06:35:14 +000010 br i1 %cond, label %T1, label %F1
11
12T1:
13 %v1 = call i32 @f1()
14 br label %Merge
15
16F1:
17 %v2 = call i32 @f2()
18 br label %Merge
19
20Merge:
21 %A = phi i1 [true, %T1], [false, %F1]
22 %B = phi i32 [%v1, %T1], [%v2, %F1]
23 br i1 %A, label %T2, label %F2
24
25T2:
Chris Lattner4f68e0c2009-10-11 03:54:21 +000026; CHECK: T2:
27; CHECK: ret i32 %v1
Chris Lattnerd57b6b82008-04-22 06:35:14 +000028 call void @f3()
29 ret i32 %B
30
31F2:
Chris Lattner4f68e0c2009-10-11 03:54:21 +000032; CHECK: F2:
33; CHECK: ret i32 %v2
Chris Lattnerd57b6b82008-04-22 06:35:14 +000034 ret i32 %B
35}
Chris Lattnerf4b9ed22008-12-03 07:48:08 +000036
37
38;; cond is known false on Entry -> F1 edge!
39define i32 @test2(i1 %cond) {
Chris Lattner3733adb2009-10-11 03:55:30 +000040; CHECK: @test2
Chris Lattnerf4b9ed22008-12-03 07:48:08 +000041Entry:
42 br i1 %cond, label %T1, label %F1
43
44T1:
Chris Lattner4f68e0c2009-10-11 03:54:21 +000045; CHECK: %v1 = call i32 @f1()
46; CHECK: ret i32 47
Chris Lattnerf4b9ed22008-12-03 07:48:08 +000047 %v1 = call i32 @f1()
48 br label %Merge
49
50F1:
51 br i1 %cond, label %Merge, label %F2
52
53Merge:
54 %B = phi i32 [47, %T1], [192, %F1]
55 ret i32 %B
56
57F2:
58 call void @f3()
59 ret i32 12
60}
Chris Lattner3733adb2009-10-11 03:55:30 +000061
62
63; Undef handling.
64define i32 @test3(i1 %cond) {
65; CHECK: @test3
66; CHECK-NEXT: T1:
67; CHECK-NEXT: ret i32 42
68 br i1 undef, label %T1, label %F1
69
70T1:
71 ret i32 42
72
73F1:
74 ret i32 17
75}
Chris Lattnera5c0a112009-10-11 04:18:15 +000076
77define i32 @test4(i1 %cond, i1 %cond2) {
78; CHECK: @test4
79
80 br i1 %cond, label %T1, label %F1
81
82T1:
83; CHECK: %v1 = call i32 @f1()
84; CHECK-NEXT: br label %T
85
86 %v1 = call i32 @f1()
87 br label %Merge
88
89F1:
90 %v2 = call i32 @f2()
91; CHECK: %v2 = call i32 @f2()
92; CHECK-NEXT: br i1 %cond2,
93 br label %Merge
94
95Merge:
96 %A = phi i1 [undef, %T1], [%cond2, %F1]
97 %B = phi i32 [%v1, %T1], [%v2, %F1]
98 br i1 %A, label %T2, label %F2
99
100T2:
101 call void @f3()
102 ret i32 %B
103
104F2:
105 ret i32 %B
106}
107
Chris Lattnered90ae22009-10-11 07:24:57 +0000108
109;; This tests that the branch in 'merge' can be cloned up into T1.
110define i32 @test5(i1 %cond, i1 %cond2) {
111; CHECK: @test5
112
113 br i1 %cond, label %T1, label %F1
114
115T1:
116; CHECK: T1:
117; CHECK-NEXT: %v1 = call i32 @f1()
118; CHECK-NEXT: %cond3 = icmp eq i32 %v1, 412
119; CHECK-NEXT: br i1 %cond3, label %T2, label %F2
120
121 %v1 = call i32 @f1()
122 %cond3 = icmp eq i32 %v1, 412
123 br label %Merge
124
125F1:
126 %v2 = call i32 @f2()
127 br label %Merge
128
129Merge:
130 %A = phi i1 [%cond3, %T1], [%cond2, %F1]
131 %B = phi i32 [%v1, %T1], [%v2, %F1]
132 br i1 %A, label %T2, label %F2
133
134T2:
135 call void @f3()
136 ret i32 %B
137
138F2:
139 ret i32 %B
140}
141
Chris Lattner59be4472009-10-11 18:39:58 +0000142
143;; Lexically duplicated conditionals should be threaded.
144
145
146define i32 @test6(i32 %A) {
147; CHECK: @test6
148 %tmp455 = icmp eq i32 %A, 42
149 br i1 %tmp455, label %BB1, label %BB2
150
151BB2:
152; CHECK: call i32 @f1()
153; CHECK-NEXT: call void @f3()
154; CHECK-NEXT: ret i32 4
155 call i32 @f1()
156 br label %BB1
157
158
159BB1:
160 %tmp459 = icmp eq i32 %A, 42
161 br i1 %tmp459, label %BB3, label %BB4
162
163BB3:
164 call i32 @f2()
165 ret i32 3
166
167BB4:
168 call void @f3()
169 ret i32 4
170}
171
172
Chris Lattnerd4fddc72009-11-07 08:05:03 +0000173;; This tests that the branch in 'merge' can be cloned up into T1.
174;; rdar://7367025
175define i32 @test7(i1 %cond, i1 %cond2) {
176Entry:
177; CHECK: @test7
178 %v1 = call i32 @f1()
179 br i1 %cond, label %Merge, label %F1
Chris Lattner59be4472009-10-11 18:39:58 +0000180
Chris Lattnerd4fddc72009-11-07 08:05:03 +0000181F1:
182 %v2 = call i32 @f2()
183 br label %Merge
184
185Merge:
186 %B = phi i32 [%v1, %Entry], [%v2, %F1]
187 %M = icmp ne i32 %B, %v1
188 %N = icmp eq i32 %B, 47
189 %O = and i1 %M, %N
190 br i1 %O, label %T2, label %F2
191
192; CHECK: Merge:
193; CHECK-NOT: phi
194; CHECK-NEXT: %v2 = call i32 @f2()
195
196T2:
197 call void @f3()
198 ret i32 %B
199
200F2:
201 ret i32 %B
202; CHECK: F2:
203; CHECK-NEXT: phi i32
204}
Chris Lattner59be4472009-10-11 18:39:58 +0000205
Chris Lattnera66ac182009-11-10 01:57:31 +0000206
207declare i1 @test8a()
208
209define i32 @test8b(i1 %cond, i1 %cond2) {
210; CHECK: @test8b
211T0:
212 %A = call i1 @test8a()
213 br i1 %A, label %T1, label %F1
Chris Lattner7ca174c2009-11-10 21:40:01 +0000214
215; CHECK: T0:
216; CHECK-NEXT: call
217; CHECK-NEXT: br i1 %A, label %T1, label %Y
218
Chris Lattnera66ac182009-11-10 01:57:31 +0000219T1:
220 %B = call i1 @test8a()
221 br i1 %B, label %T2, label %F1
Chris Lattner7ca174c2009-11-10 21:40:01 +0000222
223; CHECK: T1:
224; CHECK-NEXT: call
225; CHECK-NEXT: br i1 %B, label %T2, label %Y
Chris Lattnera66ac182009-11-10 01:57:31 +0000226T2:
227 %C = call i1 @test8a()
228 br i1 %cond, label %T3, label %F1
Chris Lattner7ca174c2009-11-10 21:40:01 +0000229
230; CHECK: T2:
231; CHECK-NEXT: call
232; CHECK-NEXT: br i1 %cond, label %T3, label %Y
Chris Lattnera66ac182009-11-10 01:57:31 +0000233T3:
234 ret i32 0
235
236F1:
Chris Lattnera66ac182009-11-10 01:57:31 +0000237 %D = phi i32 [0, %T0], [0, %T1], [1, %T2]
238 %E = icmp eq i32 %D, 1
239 %F = and i1 %E, %cond
240 br i1 %F, label %X, label %Y
241X:
242 call i1 @test8a()
243 ret i32 1
244Y:
245 ret i32 2
246}
247