Update Transforms tests to use CHECK-LABEL for easier debugging. No functionality...
[oota-llvm.git] / test / Transforms / LowerExpectIntrinsic / basic.ll
1 ; RUN: opt -lower-expect -strip-dead-prototypes -S -o - < %s | FileCheck %s
2
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, i32* %x.addr, align 4
9   %tmp = load i32* %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
18
19 if.then:                                          ; preds = %entry
20   %call = call i32 (...)* @f()
21   store i32 %call, i32* %retval
22   br label %return
23
24 if.end:                                           ; preds = %entry
25   store i32 1, i32* %retval
26   br label %return
27
28 return:                                           ; preds = %if.end, %if.then
29   %0 = load i32* %retval
30   ret i32 %0
31 }
32
33 declare i64 @llvm.expect.i64(i64, i64) nounwind readnone
34
35 declare i32 @f(...)
36
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, i32* %x.addr, align 4
43   %tmp = load i32* %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
50
51 if.then:                                          ; preds = %entry
52   %call = call i32 (...)* @f()
53   store i32 %call, i32* %retval
54   br label %return
55
56 if.end:                                           ; preds = %entry
57   store i32 1, i32* %retval
58   br label %return
59
60 return:                                           ; preds = %if.end, %if.then
61   %0 = load i32* %retval
62   ret i32 %0
63 }
64
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, i32* %x.addr, align 4
71   %tmp = load i32* %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
81
82 if.then:                                          ; preds = %entry
83   %call = call i32 (...)* @f()
84   store i32 %call, i32* %retval
85   br label %return
86
87 if.end:                                           ; preds = %entry
88   store i32 1, i32* %retval
89   br label %return
90
91 return:                                           ; preds = %if.end, %if.then
92   %0 = load i32* %retval
93   ret i32 %0
94 }
95
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, i32* %x.addr, align 4
102   %tmp = load i32* %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
113
114 if.then:                                          ; preds = %entry
115   %call = call i32 (...)* @f()
116   store i32 %call, i32* %retval
117   br label %return
118
119 if.end:                                           ; preds = %entry
120   store i32 1, i32* %retval
121   br label %return
122
123 return:                                           ; preds = %if.end, %if.then
124   %0 = load i32* %retval
125   ret i32 %0
126 }
127
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, i32* %x.addr, align 4
134   %tmp = load i32* %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
143
144 if.then:                                          ; preds = %entry
145   %call = call i32 (...)* @f()
146   store i32 %call, i32* %retval
147   br label %return
148
149 if.end:                                           ; preds = %entry
150   store i32 1, i32* %retval
151   br label %return
152
153 return:                                           ; preds = %if.end, %if.then
154   %0 = load i32* %retval
155   ret i32 %0
156 }
157
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, i32* %x.addr, align 4
164   %tmp = load i32* %x.addr, align 4
165   %conv = sext i32 %tmp to i64
166   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
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   ]
173
174 sw.bb:                                            ; preds = %entry, %entry
175   store i32 0, i32* %retval
176   br label %return
177
178 sw.epilog:                                        ; preds = %entry
179   store i32 1, i32* %retval
180   br label %return
181
182 return:                                           ; preds = %sw.epilog, %sw.bb
183   %0 = load i32* %retval
184   ret i32 %0
185 }
186
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, i32* %x.addr, align 4
193   %tmp = load i32* %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   ]
202
203 sw.bb:                                            ; preds = %entry, %entry
204   %tmp1 = load i32* %x.addr, align 4
205   store i32 %tmp1, i32* %retval
206   br label %return
207
208 sw.epilog:                                        ; preds = %entry
209   store i32 0, i32* %retval
210   br label %return
211
212 return:                                           ; preds = %sw.epilog, %sw.bb
213   %0 = load i32* %retval
214   ret i32 %0
215 }
216
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, i32* %x.addr, align 4
223   %tmp = load i32* %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
231
232 if.then:                                          ; preds = %entry
233   %call = call i32 (...)* @f()
234   store i32 %call, i32* %retval
235   br label %return
236
237 if.end:                                           ; preds = %entry
238   store i32 1, i32* %retval
239   br label %return
240
241 return:                                           ; preds = %if.end, %if.then
242   %0 = load i32* %retval
243   ret i32 %0
244 }
245
246 declare i32 @llvm.expect.i32(i32, i32) nounwind readnone
247
248 ; CHECK: !0 = metadata !{metadata !"branch_weights", i32 64, i32 4}
249 ; CHECK: !1 = metadata !{metadata !"branch_weights", i32 4, i32 64}
250 ; CHECK: !2 = metadata !{metadata !"branch_weights", i32 4, i32 64, i32 4}
251 ; CHECK: !3 = metadata !{metadata !"branch_weights", i32 64, i32 4, i32 4}