[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / LowerExpectIntrinsic / phi_merge.ll
blob3b407c0f3a5ab510dc2935e02744044b94b780d9
1 ; RUN: opt -lower-expect  -S -o - < %s | FileCheck %s
2 ; RUN: opt -S -passes='function(lower-expect)' < %s | FileCheck %s
4 ; The C case
5 ; if (__builtin_expect((x > goo() && y > hoo() && z > too()), 1)) 
6 ; For the above case, all 3 branches should be annotated.
8 ; if (__builtin_expect((x > goo() && y > hoo() && z > too()), 0)) 
9 ; For the above case, we don't have enough information, so
10 ; only the last branch is annotated.
12 define void @foo(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {
13 ; CHECK-LABEL: void @foo
14 bb:
15   %tmp8 = call i32  @goo() 
16   %tmp9 = icmp sgt i32 %tmp8, %arg
17   br i1 %tmp9, label %bb10, label %bb18
18 ; CHECK: !prof [[WEIGHT:![0-9]+]]
20 bb10:                                             ; preds = %bb
21   %tmp12 = call i32  @hoo()
22   %tmp13 = icmp sgt i32 %arg1, %tmp12
23   br i1 %tmp13, label %bb14, label %bb18
24 ; CHECK: br i1 %tmp13, {{.*}}!prof [[WEIGHT]]
26 bb14:                                             ; preds = %bb10
27   %tmp16 = call i32  @too()
28   %tmp17 = icmp sgt i32 %arg2, %tmp16
29   br label %bb18
31 bb18:                                             ; preds = %bb14, %bb10, %bb
32   %tmp19 = phi i1 [ false, %bb10 ], [ false, %bb ], [ %tmp17, %bb14 ]
33   %tmp20 = xor i1 %tmp19, true
34   %tmp21 = xor i1 %tmp20, true
35   %tmp22 = zext i1 %tmp21 to i32
36   %tmp23 = sext i32 %tmp22 to i64
37   %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 1)
38   %tmp25 = icmp ne i64 %tmp24, 0
39   br i1 %tmp25, label %bb26, label %bb28
40 ; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]
42 bb26:                                             ; preds = %bb18
43   %tmp27 = call i32  @goo()
44   br label %bb30
46 bb28:                                             ; preds = %bb18
47   %tmp29 = call i32  @hoo()
48   br label %bb30
50 bb30:                                             ; preds = %bb28, %bb26
51   ret void
54 define void @foo2(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {
55 ; CHECK-LABEL: void @foo2
56 bb:
57   %tmp8 = call i32  @goo() 
58   %tmp9 = icmp sgt i32 %tmp8, %arg
59   br i1 %tmp9, label %bb10, label %bb18
60 ; CHECK:  br i1 %tmp9
61 ; CHECK-NOT: !prof
63 bb10:                                             ; preds = %bb
64   %tmp12 = call i32  @hoo()
65   %tmp13 = icmp sgt i32 %arg1, %tmp12
66   br i1 %tmp13, label %bb14, label %bb18
67 ; CHECK: br i1 %tmp13
68 ; CHECK-NOT: !prof
70 bb14:                                             ; preds = %bb10
71   %tmp16 = call i32 @too()
72   %tmp17 = icmp sgt i32 %arg2, %tmp16
73   br label %bb18
75 bb18:                                             ; preds = %bb14, %bb10, %bb
76   %tmp19 = phi i1 [ false, %bb10 ], [ false, %bb ], [ %tmp17, %bb14 ]
77   %tmp20 = xor i1 %tmp19, true
78   %tmp21 = xor i1 %tmp20, true
79   %tmp22 = zext i1 %tmp21 to i32
80   %tmp23 = sext i32 %tmp22 to i64
81   %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 0)
82   %tmp25 = icmp ne i64 %tmp24, 0
83   br i1 %tmp25, label %bb26, label %bb28
84 ; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT2:![0-9]+]]
86 bb26:                                             ; preds = %bb18
87   %tmp27 = call i32 @goo()
88   br label %bb30
90 bb28:                                             ; preds = %bb18
91   %tmp29 = call i32 @hoo()
92   br label %bb30
94 bb30:                                             ; preds = %bb28, %bb26
95   ret void
98 define void @foo_i32(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {
99 ; CHECK-LABEL: void @foo_i32
101   %tmp8 = call i32  @goo() 
102   %tmp9 = icmp sgt i32 %tmp8, %arg
103   br i1 %tmp9, label %bb10, label %bb18
104 ; CHECK: !prof [[WEIGHT]]
106 bb10:                                             ; preds = %bb
107   %tmp12 = call i32 @hoo()
108   %tmp13 = icmp sgt i32 %arg1, %tmp12
109   br i1 %tmp13, label %bb14, label %bb18
110 ; CHECK: br i1 %tmp13, {{.*}}!prof [[WEIGHT]]
112 bb14:                                             ; preds = %bb10
113   %tmp16 = call i32 @too()
114   %tmp17 = icmp sgt i32 %arg2, %tmp16
115   br label %bb18
117 bb18:                                             ; preds = %bb14, %bb10, %bb
118   %tmp19 = phi i32 [ 5, %bb10 ], [ 5, %bb ], [ %tmp16, %bb14 ]
119   %tmp23 = sext i32 %tmp19 to i64
120   %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4)
121   %tmp25 = icmp ne i64 %tmp24, 0
122   br i1 %tmp25, label %bb26, label %bb28
123 ; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]
125 bb26:                                             ; preds = %bb18
126   %tmp27 = call i32 @goo()
127   br label %bb30
129 bb28:                                             ; preds = %bb18
130   %tmp29 = call i32 @hoo()
131   br label %bb30
133 bb30:                                             ; preds = %bb28, %bb26
134   ret void
138 define void @foo_i32_not_unlikely(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3)  {
139 ; CHECK-LABEL: void @foo_i32_not_unlikely
141   %tmp8 = call i32 @goo() 
142   %tmp9 = icmp sgt i32 %tmp8, %arg
143   br i1 %tmp9, label %bb10, label %bb18
144 ; CHECK: br i1 %tmp9
145 ; CHECK-NOT: !prof
147 bb10:                                             ; preds = %bb
148   %tmp12 = call i32 @hoo()
149   %tmp13 = icmp sgt i32 %arg1, %tmp12
150   br i1 %tmp13, label %bb14, label %bb18
151 ; CHECK: br i1 %tmp13
152 ; CHECK-NOT: !prof
154 bb14:                                             ; preds = %bb10
155   %tmp16 = call i32  @too()
156   %tmp17 = icmp sgt i32 %arg2, %tmp16
157   br label %bb18
159 bb18:                                             ; preds = %bb14, %bb10, %bb
160   %tmp19 = phi i32 [ 4, %bb10 ], [ 4, %bb ], [ %tmp16, %bb14 ]
161   %tmp23 = sext i32 %tmp19 to i64
162   %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4)
163   %tmp25 = icmp ne i64 %tmp24, 0
164   br i1 %tmp25, label %bb26, label %bb28
165 ; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]
167 bb26:                                             ; preds = %bb18
168   %tmp27 = call i32  @goo()
169   br label %bb30
171 bb28:                                             ; preds = %bb18
172   %tmp29 = call i32 @hoo()
173   br label %bb30
175 bb30:                                             ; preds = %bb28, %bb26
176   ret void
179 define void @foo_i32_xor(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3)  {
180 ; CHECK-LABEL: void @foo_i32_xor
182   %tmp8 = call i32  @goo() 
183   %tmp9 = icmp sgt i32 %tmp8, %arg
184   br i1 %tmp9, label %bb10, label %bb18
185 ; CHECK: br i1 %tmp9,{{.*}}!prof [[WEIGHT]]
187 bb10:                                             ; preds = %bb
188   %tmp12 = call i32  @hoo()
189   %tmp13 = icmp sgt i32 %arg1, %tmp12
190   br i1 %tmp13, label %bb14, label %bb18
191 ; CHECK: br i1 %tmp13,{{.*}}!prof [[WEIGHT]]
193 bb14:                                             ; preds = %bb10
194   %tmp16 = call i32  @too()
195   %tmp17 = icmp sgt i32 %arg2, %tmp16
196   br label %bb18
198 bb18:                                             ; preds = %bb14, %bb10, %bb
199   %tmp19 = phi i32 [ 6, %bb10 ], [ 6, %bb ], [ %tmp16, %bb14 ]
200   %tmp20 = xor i32 %tmp19, 3
201   %tmp23 = sext i32 %tmp20 to i64
202   %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4)
203   %tmp25 = icmp ne i64 %tmp24, 0
204   br i1 %tmp25, label %bb26, label %bb28
205 ; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]
207 bb26:                                             ; preds = %bb18
208   %tmp27 = call i32 @goo()
209   br label %bb30
211 bb28:                                             ; preds = %bb18
212   %tmp29 = call i32 @hoo()
213   br label %bb30
214 bb30:                                             ; preds = %bb28, %bb26
215   ret void
218 define void @foo_i8_sext(i32 %arg, i32 %arg1, i8 %arg2, i32 %arg3)  {
219 ; CHECK-LABEL: void @foo_i8_sext
221   %tmp8 = call i32  @goo() 
222   %tmp9 = icmp sgt i32 %tmp8, %arg
223   br i1 %tmp9, label %bb10, label %bb18
224 ; CHECK: br i1 %tmp9,{{.*}}!prof [[WEIGHT]]
226 bb10:                                             ; preds = %bb
227   %tmp12 = call i32  @hoo()
228   %tmp13 = icmp sgt i32 %arg1, %tmp12
229   br i1 %tmp13, label %bb14, label %bb18
230 ; CHECK: br i1 %tmp13,{{.*}}!prof [[WEIGHT]]
232 bb14:                                             ; preds = %bb10
233   %tmp16 = call i8  @too8()
234   %tmp17 = icmp sgt i8 %arg2, %tmp16
235   br label %bb18
237 bb18:                                             ; preds = %bb14, %bb10, %bb
238   %tmp19 = phi i8 [ 255, %bb10 ], [ 255, %bb ], [ %tmp16, %bb14 ]
239   %tmp23 = sext i8 %tmp19 to i64
240 ; after sign extension, the operand value becomes -1 which does not match 255
241   %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 255)
242   %tmp25 = icmp ne i64 %tmp24, 0
243   br i1 %tmp25, label %bb26, label %bb28
244 ; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]
246 bb26:                                             ; preds = %bb18
247   %tmp27 = call i32 @goo()
248   br label %bb30
250 bb28:                                             ; preds = %bb18
251   %tmp29 = call i32 @hoo()
252   br label %bb30
253 bb30:                                             ; preds = %bb28, %bb26
254   ret void
257 define void @foo_i8_sext_not_unlikely(i32 %arg, i32 %arg1, i8 %arg2, i32 %arg3)  {
258 ; CHECK-LABEL: void @foo_i8_sext_not_unlikely
260   %tmp8 = call i32  @goo() 
261   %tmp9 = icmp sgt i32 %tmp8, %arg
262   br i1 %tmp9, label %bb10, label %bb18
263 ; CHECK: br i1 %tmp9
264 ; CHECK-NOT: !prof
266 bb10:                                             ; preds = %bb
267   %tmp12 = call i32  @hoo()
268   %tmp13 = icmp sgt i32 %arg1, %tmp12
269   br i1 %tmp13, label %bb14, label %bb18
270 ; CHECK: br i1 %tmp13
271 ; CHECK-NOT: !prof
273 bb14:                                             ; preds = %bb10
274   %tmp16 = call i8  @too8()
275   %tmp17 = icmp sgt i8 %arg2, %tmp16
276   br label %bb18
278 bb18:                                             ; preds = %bb14, %bb10, %bb
279   %tmp19 = phi i8 [ 255, %bb10 ], [ 255, %bb ], [ %tmp16, %bb14 ]
280   %tmp23 = sext i8 %tmp19 to i64
281 ; after sign extension, the operand value becomes -1 which matches -1
282   %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 -1)
283   %tmp25 = icmp ne i64 %tmp24, 0
284   br i1 %tmp25, label %bb26, label %bb28
285 ; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]
287 bb26:                                             ; preds = %bb18
288   %tmp27 = call i32 @goo()
289   br label %bb30
291 bb28:                                             ; preds = %bb18
292   %tmp29 = call i32 @hoo()
293   br label %bb30
294 bb30:                                             ; preds = %bb28, %bb26
295   ret void
299 define void @foo_i32_xor_not_unlikely(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3)  {
300 ; CHECK-LABEL: void @foo_i32_xor_not_unlikely
302   %tmp8 = call i32 @goo() 
303   %tmp9 = icmp sgt i32 %tmp8, %arg
304   br i1 %tmp9, label %bb10, label %bb18
305 ; CHECK: br i1 %tmp9
306 ; CHECK-NOT: !prof
308 bb10:                                             ; preds = %bb
309   %tmp12 = call i32  @hoo()
310   %tmp13 = icmp sgt i32 %arg1, %tmp12
311   br i1 %tmp13, label %bb14, label %bb18
312 ; CHECK: br i1 %tmp13
313 ; CHECK-NOT: !prof
315 bb14:                                             ; preds = %bb10
316   %tmp16 = call i32 @too()
317   %tmp17 = icmp sgt i32 %arg2, %tmp16
318   br label %bb18
320 bb18:                                             ; preds = %bb14, %bb10, %bb
321   %tmp19 = phi i32 [ 6, %bb10 ], [ 6, %bb ], [ %tmp16, %bb14 ]
322   %tmp20 = xor i32 %tmp19, 2
323   %tmp23 = sext i32 %tmp20 to i64
324   %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4)
325   %tmp25 = icmp ne i64 %tmp24, 0
326   br i1 %tmp25, label %bb26, label %bb28
327 ; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]
329 bb26:                                             ; preds = %bb18
330   %tmp27 = call i32 @goo()
331   br label %bb30
333 bb28:                                             ; preds = %bb18
334   %tmp29 = call i32  @hoo()
335   br label %bb30
337 bb30:                                             ; preds = %bb28, %bb26
338   ret void
341 declare i32 @goo()
343 declare i32 @hoo()
345 declare i32 @too()
347 declare i8 @too8()
349 ; Function Attrs: nounwind readnone
350 declare i64 @llvm.expect.i64(i64, i64) 
352 !llvm.ident = !{!0}
354 !0 = !{!"clang version 5.0.0 (trunk 302965)"}
355 ; CHECK: [[WEIGHT]] = !{!"branch_weights", i32 2000, i32 1}
356 ; CHECK: [[WEIGHT2]] = !{!"branch_weights", i32 1, i32 2000}