Switch this code away from Value::isUsedInBasicBlock. That code either
[oota-llvm.git] / test / Transforms / SimplifyCFG / SpeculativeExec.ll
1 ; RUN: opt < %s -simplifycfg -phi-node-folding-threshold=2 -S | FileCheck %s
2
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4 target triple = "x86_64-unknown-linux-gnu"
5
6 define i32 @test1(i32 %a, i32 %b, i32 %c) nounwind  {
7 ; CHECK: @test1
8 entry:
9         %tmp1 = icmp eq i32 %b, 0
10         br i1 %tmp1, label %bb1, label %bb3
11
12 bb1:            ; preds = %entry
13         %tmp2 = icmp sgt i32 %c, 1
14         br i1 %tmp2, label %bb2, label %bb3
15 ; CHECK: bb1:
16 ; CHECK-NEXT: icmp sgt i32 %c, 1
17 ; CHECK-NEXT: add i32 %a, 1
18 ; CHECK-NEXT: select i1 %tmp2, i32 %tmp3, i32 %a
19 ; CHECK-NEXT: br label %bb3
20
21 bb2:            ; preds = bb1
22         %tmp3 = add i32 %a, 1
23         br label %bb3
24
25 bb3:            ; preds = %bb2, %entry
26         %tmp4 = phi i32 [ %b, %entry ], [ %a, %bb1 ], [ %tmp3, %bb2 ]
27         %tmp5 = sub i32 %tmp4, 1
28         ret i32 %tmp5
29 }
30
31 declare i8 @llvm.cttz.i8(i8, i1)
32
33 define i8 @test2(i8 %a) {
34 ; CHECK: @test2
35   br i1 undef, label %bb_true, label %bb_false
36 bb_true:
37   %b = tail call i8 @llvm.cttz.i8(i8 %a, i1 false)
38   br label %join
39 bb_false:
40   br label %join
41 join:
42   %c = phi i8 [%b, %bb_true], [%a, %bb_false]
43 ; CHECK: select
44   ret i8 %c
45 }
46
47 define i8* @test3(i1* %dummy, i8* %a, i8* %b) {
48 ; Test that a weird, unfolded constant cast in the PHI don't block speculation.
49 ; CHECK: @test3
50
51 entry:
52   %cond1 = load volatile i1* %dummy
53   br i1 %cond1, label %if, label %end
54
55 if:
56   %cond2 = load volatile i1* %dummy
57   br i1 %cond2, label %then, label %end
58
59 then:
60   br label %end
61
62 end:
63   %x = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 42 to i8*), %then ]
64 ; CHECK-NOT: phi
65 ; CHECK: select i1 %cond2, i8* inttoptr
66
67   ret i8* %x
68 }
69
70 define i8* @test4(i1* %dummy, i8* %a, i8* %b) {
71 ; Test that we don't speculate an arbitrarily large number of unfolded constant
72 ; expressions.
73 ; CHECK: @test4
74
75 entry:
76   %cond1 = load volatile i1* %dummy
77   br i1 %cond1, label %if, label %end
78
79 if:
80   %cond2 = load volatile i1* %dummy
81   br i1 %cond2, label %then, label %end
82
83 then:
84   br label %end
85
86 end:
87   %x1 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 1 to i8*), %then ]
88   %x2 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 2 to i8*), %then ]
89   %x3 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 3 to i8*), %then ]
90   %x4 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 4 to i8*), %then ]
91   %x5 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 5 to i8*), %then ]
92   %x6 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 6 to i8*), %then ]
93   %x7 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 7 to i8*), %then ]
94   %x8 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 8 to i8*), %then ]
95   %x9 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 9 to i8*), %then ]
96   %x10 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 10 to i8*), %then ]
97 ; CHECK-NOT: select
98 ; CHECK: phi i8*
99 ; CHECK: phi i8*
100 ; CHECK: phi i8*
101 ; CHECK: phi i8*
102 ; CHECK: phi i8*
103 ; CHECK: phi i8*
104 ; CHECK: phi i8*
105 ; CHECK: phi i8*
106 ; CHECK: phi i8*
107 ; CHECK: phi i8*
108
109   ret i8* %x10
110 }
111
112 define i16 @test5(i1* %dummy, i16 %a, i16 %b) {
113 ; Test that we speculate no-op instructions.
114 ; CHECK: @test5
115
116 entry:
117   %cond1 = load volatile i1* %dummy
118   br i1 %cond1, label %if, label %end
119
120 if:
121   %cond2 = load volatile i1* %dummy
122   %a.conv = sext i16 %a to i32
123   %b.conv = sext i16 %b to i32
124   %cmp = icmp ult i32 %a.conv, %b.conv
125   br i1 %cond2, label %then, label %end
126
127 then:
128   %sub = sub i32 %a.conv, %b.conv
129   %sub.conv = trunc i32 %sub to i16
130   br label %end
131
132 end:
133   %x = phi i16 [ %a, %entry ], [ %b, %if ], [ %sub.conv, %then ]
134 ; CHECK-NOT: phi
135 ; CHECK: select i1
136
137   ret i16 %x
138 }
139
140 define i16 @test6(i1* %dummy, i64 %a, i64 %b) {
141 ; Test that we speculate no-op instructions when those instructions are in the
142 ; predecessor but could potentially be sunk.
143 ; CHECK: @test6
144
145 entry:
146   %cond1 = load volatile i1* %dummy
147   %a.conv = trunc i64 %a to i16
148   %b.conv = trunc i64 %b to i16
149   br i1 %cond1, label %if, label %end
150
151 if:
152   %cond2 = load volatile i1* %dummy
153   %cond3 = load volatile i1* %dummy
154   %cond4 = load volatile i1* %dummy
155   %cmp = icmp ult i16 %a.conv, %b.conv
156   %a.conv2 = trunc i64 %a to i32
157   %b.conv2 = trunc i64 %b to i32
158   br i1 %cond2, label %then, label %end
159
160 then:
161   %sub = sub i32 %a.conv2, %b.conv2
162   %sub.conv = trunc i32 %sub to i16
163   br label %end
164
165 end:
166   %x = phi i16 [ %a.conv, %entry ], [ %b.conv, %if ], [ %sub.conv, %then ]
167 ; CHECK-NOT: phi
168 ; CHECK: select i1
169
170   ret i16 %x
171 }
172
173 define i16 @test7(i1* %dummy, i16 %a, i16 %b, i32 %x) {
174 ; Test that we don't speculate when there are instructions that could
175 ; potentially sink into the conditional block.
176 ; CHECK: @test7
177
178 entry:
179   %cond1 = load volatile i1* %dummy
180   br i1 %cond1, label %if, label %end
181
182 if:
183   %cond2 = load volatile i1* %dummy
184   %a.conv = sext i16 %a to i32
185   %b.conv = sext i16 %b to i32
186   %cmp = icmp ult i32 %a.conv, %b.conv
187   %a.conv2 = add i32 %a.conv, %x
188   br i1 %cond2, label %then, label %end
189
190 then:
191   %sub = sub i32 %a.conv2, %b.conv
192   %sub.conv = trunc i32 %sub to i16
193   br label %end
194
195 end:
196   %y = phi i16 [ %a, %entry ], [ %b, %if ], [ %sub.conv, %then ]
197 ; CHECK-NOT: select
198 ; CHECK: phi i16
199
200   ret i16 %y
201 }
202