[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / LowerExpectIntrinsic / basic.ll
blob0abca5b383224a7e65a943572cb56b08b9b603b0
1 ; RUN: opt -S -passes='function(lower-expect),strip-dead-prototypes' < %s | FileCheck %s
3 ; CHECK-LABEL: @test1(
4 define i32 @test1(i32 %x) nounwind uwtable ssp {
5 entry:
6   %retval = alloca i32, align 4
7   %x.addr = alloca i32, align 4
8   store i32 %x, ptr %x.addr, align 4
9   %tmp = load i32, ptr %x.addr, align 4
10   %cmp = icmp sgt i32 %tmp, 1
11   %conv = zext i1 %cmp to i32
12   %conv1 = sext i32 %conv to i64
13   %expval = call i64 @llvm.expect.i64(i64 %conv1, i64 1)
14   %tobool = icmp ne i64 %expval, 0
15 ; CHECK: !prof !0
16 ; CHECK-NOT: @llvm.expect
17   br i1 %tobool, label %if.then, label %if.end
19 if.then:                                          ; preds = %entry
20   %call = call i32 (...) @f()
21   store i32 %call, ptr %retval
22   br label %return
24 if.end:                                           ; preds = %entry
25   store i32 1, ptr %retval
26   br label %return
28 return:                                           ; preds = %if.end, %if.then
29   %0 = load i32, ptr %retval
30   ret i32 %0
33 declare i64 @llvm.expect.i64(i64, i64) nounwind readnone
35 declare i32 @f(...)
37 ; CHECK-LABEL: @test2(
38 define i32 @test2(i32 %x) nounwind uwtable ssp {
39 entry:
40   %retval = alloca i32, align 4
41   %x.addr = alloca i32, align 4
42   store i32 %x, ptr %x.addr, align 4
43   %tmp = load i32, ptr %x.addr, align 4
44   %conv = sext i32 %tmp to i64
45   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
46   %tobool = icmp ne i64 %expval, 0
47 ; CHECK: !prof !0
48 ; CHECK-NOT: @llvm.expect
49   br i1 %tobool, label %if.then, label %if.end
51 if.then:                                          ; preds = %entry
52   %call = call i32 (...) @f()
53   store i32 %call, ptr %retval
54   br label %return
56 if.end:                                           ; preds = %entry
57   store i32 1, ptr %retval
58   br label %return
60 return:                                           ; preds = %if.end, %if.then
61   %0 = load i32, ptr %retval
62   ret i32 %0
65 ; CHECK-LABEL: @test3(
66 define i32 @test3(i32 %x) nounwind uwtable ssp {
67 entry:
68   %retval = alloca i32, align 4
69   %x.addr = alloca i32, align 4
70   store i32 %x, ptr %x.addr, align 4
71   %tmp = load i32, ptr %x.addr, align 4
72   %tobool = icmp ne i32 %tmp, 0
73   %lnot = xor i1 %tobool, true
74   %lnot.ext = zext i1 %lnot to i32
75   %conv = sext i32 %lnot.ext to i64
76   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
77   %tobool1 = icmp ne i64 %expval, 0
78 ; CHECK: !prof !0
79 ; CHECK-NOT: @llvm.expect
80   br i1 %tobool1, label %if.then, label %if.end
82 if.then:                                          ; preds = %entry
83   %call = call i32 (...) @f()
84   store i32 %call, ptr %retval
85   br label %return
87 if.end:                                           ; preds = %entry
88   store i32 1, ptr %retval
89   br label %return
91 return:                                           ; preds = %if.end, %if.then
92   %0 = load i32, ptr %retval
93   ret i32 %0
96 ; CHECK-LABEL: @test4(
97 define i32 @test4(i32 %x) nounwind uwtable ssp {
98 entry:
99   %retval = alloca i32, align 4
100   %x.addr = alloca i32, align 4
101   store i32 %x, ptr %x.addr, align 4
102   %tmp = load i32, ptr %x.addr, align 4
103   %tobool = icmp ne i32 %tmp, 0
104   %lnot = xor i1 %tobool, true
105   %lnot1 = xor i1 %lnot, true
106   %lnot.ext = zext i1 %lnot1 to i32
107   %conv = sext i32 %lnot.ext to i64
108   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
109   %tobool2 = icmp ne i64 %expval, 0
110 ; CHECK: !prof !0
111 ; CHECK-NOT: @llvm.expect
112   br i1 %tobool2, label %if.then, label %if.end
114 if.then:                                          ; preds = %entry
115   %call = call i32 (...) @f()
116   store i32 %call, ptr %retval
117   br label %return
119 if.end:                                           ; preds = %entry
120   store i32 1, ptr %retval
121   br label %return
123 return:                                           ; preds = %if.end, %if.then
124   %0 = load i32, ptr %retval
125   ret i32 %0
128 ; CHECK-LABEL: @test5(
129 define i32 @test5(i32 %x) nounwind uwtable ssp {
130 entry:
131   %retval = alloca i32, align 4
132   %x.addr = alloca i32, align 4
133   store i32 %x, ptr %x.addr, align 4
134   %tmp = load i32, ptr %x.addr, align 4
135   %cmp = icmp slt i32 %tmp, 0
136   %conv = zext i1 %cmp to i32
137   %conv1 = sext i32 %conv to i64
138   %expval = call i64 @llvm.expect.i64(i64 %conv1, i64 0)
139   %tobool = icmp ne i64 %expval, 0
140 ; CHECK: !prof !1
141 ; CHECK-NOT: @llvm.expect
142   br i1 %tobool, label %if.then, label %if.end
144 if.then:                                          ; preds = %entry
145   %call = call i32 (...) @f()
146   store i32 %call, ptr %retval
147   br label %return
149 if.end:                                           ; preds = %entry
150   store i32 1, ptr %retval
151   br label %return
153 return:                                           ; preds = %if.end, %if.then
154   %0 = load i32, ptr %retval
155   ret i32 %0
158 ; CHECK-LABEL: @test6(
159 define i32 @test6(i32 %x) nounwind uwtable ssp {
160 entry:
161   %retval = alloca i32, align 4
162   %x.addr = alloca i32, align 4
163   store i32 %x, ptr %x.addr, align 4
164   %tmp = load i32, ptr %x.addr, align 4
165   %conv = sext i32 %tmp to i64
166   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 2)
167 ; CHECK: !prof !2
168 ; CHECK-NOT: @llvm.expect
169   switch i64 %expval, label %sw.epilog [
170     i64 1, label %sw.bb
171     i64 2, label %sw.bb
172   ]
174 sw.bb:                                            ; preds = %entry, %entry
175   store i32 0, ptr %retval
176   br label %return
178 sw.epilog:                                        ; preds = %entry
179   store i32 1, ptr %retval
180   br label %return
182 return:                                           ; preds = %sw.epilog, %sw.bb
183   %0 = load i32, ptr %retval
184   ret i32 %0
187 ; CHECK-LABEL: @test7(
188 define i32 @test7(i32 %x) nounwind uwtable ssp {
189 entry:
190   %retval = alloca i32, align 4
191   %x.addr = alloca i32, align 4
192   store i32 %x, ptr %x.addr, align 4
193   %tmp = load i32, ptr %x.addr, align 4
194   %conv = sext i32 %tmp to i64
195   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
196 ; CHECK: !prof !3
197 ; CHECK-NOT: @llvm.expect
198   switch i64 %expval, label %sw.epilog [
199     i64 2, label %sw.bb
200     i64 3, label %sw.bb
201   ]
203 sw.bb:                                            ; preds = %entry, %entry
204   %tmp1 = load i32, ptr %x.addr, align 4
205   store i32 %tmp1, ptr %retval
206   br label %return
208 sw.epilog:                                        ; preds = %entry
209   store i32 0, ptr %retval
210   br label %return
212 return:                                           ; preds = %sw.epilog, %sw.bb
213   %0 = load i32, ptr %retval
214   ret i32 %0
217 ; CHECK-LABEL: @test8(
218 define i32 @test8(i32 %x) nounwind uwtable ssp {
219 entry:
220   %retval = alloca i32, align 4
221   %x.addr = alloca i32, align 4
222   store i32 %x, ptr %x.addr, align 4
223   %tmp = load i32, ptr %x.addr, align 4
224   %cmp = icmp sgt i32 %tmp, 1
225   %conv = zext i1 %cmp to i32
226   %expval = call i32 @llvm.expect.i32(i32 %conv, i32 1)
227   %tobool = icmp ne i32 %expval, 0
228 ; CHECK: !prof !0
229 ; CHECK-NOT: @llvm.expect
230   br i1 %tobool, label %if.then, label %if.end
232 if.then:                                          ; preds = %entry
233   %call = call i32 (...) @f()
234   store i32 %call, ptr %retval
235   br label %return
237 if.end:                                           ; preds = %entry
238   store i32 1, ptr %retval
239   br label %return
241 return:                                           ; preds = %if.end, %if.then
242   %0 = load i32, ptr %retval
243   ret i32 %0
246 declare i32 @llvm.expect.i32(i32, i32) nounwind readnone
248 ; CHECK-LABEL: @test9(
249 define i32 @test9(i32 %x) nounwind uwtable ssp {
250 entry:
251   %retval = alloca i32, align 4
252   %x.addr = alloca i32, align 4
253   store i32 %x, ptr %x.addr, align 4
254   %tmp = load i32, ptr %x.addr, align 4
255   %cmp = icmp sgt i32 %tmp, 1
256   %expval = call i1 @llvm.expect.i1(i1 %cmp, i1 1)
257 ; CHECK: !prof !0
258 ; CHECK-NOT: @llvm.expect
259   br i1 %expval, label %if.then, label %if.end
261 if.then:                                          ; preds = %entry
262   %call = call i32 (...) @f()
263   store i32 %call, ptr %retval
264   br label %return
266 if.end:                                           ; preds = %entry
267   store i32 1, ptr %retval
268   br label %return
270 return:                                           ; preds = %if.end, %if.then
271   %0 = load i32, ptr %retval
272   ret i32 %0
275 ; CHECK-LABEL: @test10(
276 define i32 @test10(i64 %t6) {
277   %t7 = call i64 @llvm.expect.i64(i64 %t6, i64 0)
278   %t8 = icmp ne i64 %t7, 0
279   %t9 = select i1 %t8, i32 1, i32 2
280 ; CHECK: select{{.*}}, !prof !1
281   ret i32 %t9
285 declare i1 @llvm.expect.i1(i1, i1) nounwind readnone
287 ; CHECK: !0 = !{!"branch_weights", i32 2000, i32 1}
288 ; CHECK: !1 = !{!"branch_weights", i32 1, i32 2000}
289 ; CHECK: !2 = !{!"branch_weights", i32 1, i32 1, i32 2000}
290 ; CHECK: !3 = !{!"branch_weights", i32 2000, i32 1, i32 1}