blob: 3d936b8f30fc010f35e4bcb8e4fcc1ee35a79a39 [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
173
174