OLD | NEW |
---|---|
(Empty) | |
1 ; RUN: opt < %s -nacl-promote-ints -S | FileCheck %s | |
2 | |
3 declare void @consume_i16(i16 %a) | |
4 | |
5 ; CHECK: @sext_to_illegal | |
6 ; CHECK-NEXT: %a40.sext = sext i32 %a to i64 | |
7 ; CHECK-NEXT: %a40 = and i64 %a40.sext, 1099511627775 | |
8 ; (0xFFFFFFFFFF) | |
9 define void @sext_to_illegal(i32 %a) { | |
10 %a40 = sext i32 %a to i40 | |
11 ret void | |
12 } | |
13 | |
14 ; CHECK; @sext_from_illegal | |
15 define void @sext_from_illegal(i8 %a) { | |
16 ; CHECK: call void @consume_i16(i16 -2) | |
17 %c12 = sext i12 -2 to i16 | |
18 call void @consume_i16(i16 %c12) | |
19 ; CHECK: %a12.sext = sext i8 %a to i16 | |
20 ; CHECK-NEXT: %a12 = and i16 %a12.sext, 4095 | |
21 %a12 = sext i8 %a to i12 | |
22 ; CHECK: %a12.getsign = shl i16 %a12, 4 | |
23 ; CHECK-NEXT: %a16 = ashr i16 %a12.getsign, 4 | |
24 %a16 = sext i12 %a12 to i16 | |
25 ; CHECK: %a12.getsign1 = shl i16 %a12, 4 | |
26 ; CHECK-NEXT: %a12.signed = ashr i16 %a12.getsign1, 4 | |
27 ; CHECK-NEXT: %a14 = and i16 %a12.signed, 16383 | |
28 ; (0x3FFF) | |
29 %a14 = sext i12 %a12 to i14 | |
30 ; CHECK-NEXT: %a12.getsign2 = shl i16 %a12, 4 | |
31 ; CHECK-NEXT: %a12.signed3 = ashr i16 %a12.getsign2, 4 | |
32 ; CHECK-NEXT: %a24.sext = sext i16 %a12.signed3 to i32 | |
33 ; CHECK-NEXT: %a24 = and i32 %a24.sext, 16777215 | |
34 ; (0xFFFFFF) | |
35 %a24 = sext i12 %a12 to i24 | |
36 | |
37 %a37 = zext i8 %a to i37 | |
38 ; CHECK: %a37.getsign = shl i64 %a37, 27 | |
39 ; CHECK-NEXT: %a64 = ashr i64 %a37.getsign, 27 | |
40 %a64 = sext i37 %a37 to i64 | |
41 ret void | |
42 } | |
43 | |
44 ; CHECK: @zext_to_illegal | |
45 define void @zext_to_illegal(i32 %a) { | |
46 ; CHECK: zext i32 %a to i64 | |
47 ; CHECK-NOT: and | |
48 %a40 = zext i32 %a to i40 | |
49 ret void | |
50 } | |
51 | |
52 ; CHECK: @zext_from_illegal | |
53 define void @zext_from_illegal(i8 %a) { | |
54 ; get some illegal values to start with | |
55 %a24 = zext i8 %a to i24 | |
56 %a40 = zext i8 %a to i40 | |
57 %a18 = zext i8 %a to i18 | |
58 | |
59 ; TODO(dschuff): the ANDs can be no-ops when we zext from an illegal type. | |
60 ; CHECK: %a32 = and i32 %a24, 16777215 | |
61 ; (0xFFFFFF) | |
62 %a32 = zext i24 %a24 to i32 | |
63 | |
64 ; CHECK: %b24 = and i32 %a18, 262143 | |
65 ; (0x3FFFF) | |
66 %b24 = zext i18 %a18 to i24 | |
67 | |
68 ; CHECK: %a24.clear = and i32 %a24, 16777215 | |
69 ; CHECK: %b40 = zext i32 %a24.clear to i64 | |
70 %b40 = zext i24 %a24 to i40 | |
71 | |
72 ; CHECK: call void @consume_i16(i16 4094) | |
73 %c16 = zext i12 -2 to i16 | |
74 call void @consume_i16(i16 %c16) | |
75 ; CHECK: call void @consume_i16(i16 4094) | |
76 %c14 = zext i12 -2 to i14 | |
77 %c16.2 = zext i14 %c14 to i16 | |
78 call void @consume_i16(i16 %c16.2) | |
79 ret void | |
80 } | |
81 | |
82 define void @trunc_from_illegal(i8 %a) { | |
83 %a24 = zext i8 %a to i24 | |
84 ; CHECK: %a16 = trunc i32 %a24 to i16 | |
85 %a16 = trunc i24 %a24 to i16 | |
86 ret void | |
87 } | |
88 | |
89 define void @trunc_to_illegal(i32 %a) { | |
90 ; CHECK: %a24 = and i32 %a, 16777215 | |
91 ; (0xFFFFFF) | |
92 %a24 = trunc i32 %a to i24 | |
93 | |
94 ; CHECK: %a24.trunc = trunc i32 %a24 to i16 | |
95 ; CHECK-NEXT: %a12 = and i16 %a24.trunc, 4095 | |
96 ; (0xFFF) | |
97 %a12 = trunc i24 %a24 to i12 | |
98 ret void | |
99 } | |
100 | |
101 ; CHECK: @icmpsigned | |
102 define void @icmpsigned(i32 %a) { | |
103 %shl = trunc i32 %a to i24 | |
104 ; CHECK: %shl.getsign = shl i32 %shl, 8 | |
105 ; CHECK-NEXT: %shl.signed = ashr i32 %shl.getsign, 8 | |
106 ; CHECK-NEXT: %cmp = icmp slt i32 %shl.signed, -2 | |
107 %cmp = icmp slt i24 %shl, -2 | |
108 ret void | |
109 } | |
110 | |
111 ; CHECK: @bc1 | |
112 ; CHECK: bc1 = bitcast i32* %a to i64* | |
113 ; CHECK-NEXT: bc2 = bitcast i64* %bc1 to i32* | |
114 define i32* @bc1(i32* %a) { | |
115 %bc1 = bitcast i32* %a to i40* | |
116 %bc2 = bitcast i40* %bc1 to i32* | |
117 ret i32* %bc2 | |
118 } | |
119 | |
120 ; CHECK: zext i32 %a to i64 | |
121 ; CHECK: and i64 %a40, 255 | |
122 define void @and1(i32 %a) { | |
123 %a40 = zext i32 %a to i40 | |
124 %and = and i40 %a40, 255 | |
125 ret void | |
126 } | |
127 | |
128 ; CHECK: @andi3 | |
129 define void @andi3(i8 %a) { | |
130 ; CHECK-NEXT: and i8 %a, 7 | |
131 %a3 = trunc i8 %a to i3 | |
132 ; CHECK-NEXT: and i8 %a3, 2 | |
133 %and = and i3 %a3, 2 | |
134 ret void | |
135 } | |
136 | |
137 ; CHECK: @ori7 | |
138 define void @ori7(i8 %a, i8 %b) { | |
139 %a7 = trunc i8 %a to i7 | |
140 %b7 = trunc i8 %b to i7 | |
141 ; CHECK: %or = or i8 %a7, %b7 | |
142 %or = or i7 %a7, %b7 | |
143 ret void | |
144 } | |
145 | |
146 ; CHECK: @add1 | |
147 define void @add1(i16 %a) { | |
148 ; CHECK-NEXT: %a24.sext = sext i16 %a to i32 | |
149 ; CHECK-NEXT: %a24 = and i32 %a24.sext, 16777215 | |
150 %a24 = sext i16 %a to i24 | |
151 ; CHECK-NEXT: %sum.result = add i32 %a24, 16777214 | |
152 ; CHECK-NEXT: %sum = and i32 %sum.result, 16777215 | |
153 %sum = add i24 %a24, -2 | |
154 ; CHECK-NEXT: %sumnsw.result = add nsw i32 %a24, 16777214 | |
155 ; CHECK-NEXT: %sumnsw = and i32 %sumnsw.result, 16777215 | |
156 %sumnsw = add nsw i24 %a24, -2 | |
157 ; CHECK-NEXT: %sumnuw.result = add nuw i32 %a24, 16777214 | |
158 ; CHECK-NEXT: %sumnuw = and i32 %sumnuw.result, 16777215 | |
159 %sumnuw = add nuw i24 %a24, -2 | |
160 ; CHECK-NEXT: %sumnw = add nuw nsw i32 %a24, 16777214 | |
161 ; CHECK-NOT: and | |
162 %sumnw = add nuw nsw i24 %a24, -2 | |
163 ret void | |
164 } | |
165 | |
166 ; CHECK: @shl1 | |
167 define void @shl1(i16 %a) { | |
168 %a24 = zext i16 %a to i24 | |
169 ; CHECK: %ashl.result = shl i32 %a24, 5 | |
170 ; CHECK: %ashl = and i32 %ashl.result, 16777215 | |
171 %ashl = shl i24 %a24, 5 | |
172 ret void | |
173 } | |
174 | |
175 ; CHECK: @shlnuw | |
176 define void @shlnuw(i16 %a) { | |
177 %a12 = trunc i16 %a to i12 | |
178 ; CHECK: %ashl = shl nuw i16 %a12, 5 | |
jvoung (off chromium)
2013/05/10 01:22:44
CHECK-NOT: and
if you are checking the clearUpperB
Derek Schuff
2013/05/11 00:11:45
Done.
| |
179 %ashl = shl nuw i12 %a12, 5 | |
180 ret void | |
181 } | |
182 | |
183 ; CHECK: @lshr1 | |
184 define void @lshr1(i16 %a) { | |
185 %a24 = zext i16 %a to i24 | |
186 ; CHECK: %b = lshr i32 %a24, 20 | |
187 %b = lshr i24 %a24, 20 | |
188 ; CHECK: %c = lshr i32 %a24, 5 | |
189 %c = lshr i24 %a24, 5 | |
190 ret void | |
191 } | |
192 | |
193 ; CHECK: @ashr1 | |
194 define void @ashr1(i16 %a) { | |
195 %a24 = sext i16 %a to i24 | |
196 ; CHECK: %a24.getsign = shl i32 %a24, 8 | |
197 ; CHECK-NEXT: %b24.result = ashr i32 %a24.getsign, 19 | |
198 ; CHECK-NEXT: %b24 = and i32 %b24.result, 16777215 | |
199 %b24 = ashr i24 %a24, 11 | |
200 ; CHECK-NEXT: %a24.getsign1 = shl i32 %a24, 8 | |
201 ; CHECK-NEXT: %a24.shamt = add i32 %b24, 8 | |
202 ; CHECK-NEXT: %c.result = ashr i32 %a24.getsign1, %a24.shamt | |
203 ; CHECK-NEXT: %c = and i32 %c.result, 16777215 | |
204 %c = ashr i24 %a24, %b24 | |
205 ret void | |
206 } | |
207 | |
208 ; CHECK: @phi_icmp | |
209 define void @phi_icmp(i32 %a) { | |
210 entry: | |
211 br label %loop | |
212 loop: | |
213 ; CHECK: %phi40 = phi i64 [ 1099511627774, %entry ], [ %phi40, %loop ] | |
214 %phi40 = phi i40 [ -2, %entry ], [ %phi40, %loop ] | |
215 ; CHECK-NEXT: %b = icmp eq i64 %phi40, 1099511627775 | |
216 %b = icmp eq i40 %phi40, -1 | |
217 ; CHECK-NEXT: br i1 %b, label %loop, label %end | |
218 br i1 %b, label %loop, label %end | |
219 end: | |
220 ret void | |
221 } | |
222 | |
223 ; CHECK: @icmp_ult | |
224 define void @icmp_ult(i32 %a) { | |
225 %a40 = zext i32 %a to i40 | |
226 ; CHECK: %b = icmp ult i64 %a40, 1099511627774 | |
227 %b = icmp ult i40 %a40, -2 | |
228 ret void | |
229 } | |
230 | |
231 ; TODO(dschuff): implement icmp sXX | |
jvoung (off chromium)
2013/05/10 01:22:44
This doesn't seem to be a TODO anymore, according
Derek Schuff
2013/05/11 00:11:45
Done.
| |
232 | |
233 ; CHECK: @select1 | |
234 define void @select1(i32 %a) { | |
235 %a40 = zext i32 %a to i40 | |
236 ; CHECK: %s40 = select i1 true, i64 %a40, i64 1099511627775 | |
237 %s40 = select i1 true, i40 %a40, i40 -1 | |
238 ret void | |
239 } | |
240 | |
241 ; CHECK: @alloca40 | |
242 ; CHECK: alloca i64, align 8 | |
243 define void @alloca40() { | |
244 %a = alloca i40, align 8 | |
245 %b = bitcast i40* %a to i8* | |
246 %c = load i8* %b | |
247 ret void | |
248 } | |
249 | |
250 ; CHECK: @load24 | |
251 ; CHECK: %bc.loty = bitcast i32* %bc to i16* | |
252 ; CHECK-NEXT: %load.lo = load i16* %bc.loty | |
253 ; CHECK-NEXT: %load.lo.ext = zext i16 %load.lo to i32 | |
254 ; CHECK-NEXT: %bc.hi = getelementptr i16* %bc.loty, i32 1 | |
255 ; CHECK-NEXT: %bc.hity = bitcast i16* %bc.hi to i8* | |
256 ; CHECK-NEXT: %load.hi = load i8* %bc.hity | |
257 ; CHECK-NEXT: %load.hi.ext = zext i8 %load.hi to i32 | |
258 ; CHECK-NEXT: %load.hi.ext.sh = shl i32 %load.hi.ext, 16 | |
259 ; CHECK-NEXT: %load = or i32 %load.lo.ext, %load.hi.ext.sh | |
260 define void @load24(i8* %a) { | |
261 %bc = bitcast i8* %a to i24* | |
262 %load = load i24* %bc, align 8 | |
263 ret void | |
264 } | |
265 | |
266 ; CHECK: @load48 | |
267 ; CHECK: %bc.loty = bitcast i64* %bc to i32* | |
268 ; CHECK-NEXT: %load.lo = load i32* %bc.loty | |
269 ; CHECK-NEXT: %load.lo.ext = zext i32 %load.lo to i64 | |
270 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1 | |
271 ; CHECK-NEXT: %bc.hity = bitcast i32* %bc.hi to i16* | |
272 ; CHECK-NEXT: %load.hi = load i16* %bc.hity | |
273 ; CHECK-NEXT: %load.hi.ext = zext i16 %load.hi to i64 | |
274 ; CHECK-NEXT: %load.hi.ext.sh = shl i64 %load.hi.ext, 32 | |
275 ; CHECK-NEXT: %load = or i64 %load.lo.ext, %load.hi.ext.sh | |
276 define void @load48(i32* %a) { | |
277 %bc = bitcast i32* %a to i48* | |
278 %load = load i48* %bc, align 8 | |
279 ret void | |
280 } | |
281 | |
282 ; CHECK: %bc = bitcast i32* %a to i64* | |
283 ; CHECK-NEXT: %bc.loty = bitcast i64* %bc to i32* | |
284 ; CHECK-NEXT: %load.lo = load i32* %bc.loty | |
285 ; CHECK-NEXT: %load.lo.ext = zext i32 %load.lo to i64 | |
286 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1 | |
287 ; CHECK-NEXT: %bc.hity.loty = bitcast i32* %bc.hi to i16* | |
288 ; CHECK-NEXT: %load.hi.lo = load i16* %bc.hity.loty | |
289 ; CHECK-NEXT: %load.hi.lo.ext = zext i16 %load.hi.lo to i32 | |
290 ; CHECK-NEXT: %bc.hity.hi = getelementptr i16* %bc.hity.loty, i32 1 | |
291 ; CHECK-NEXT: %bc.hity.hity = bitcast i16* %bc.hity.hi to i8* | |
292 ; CHECK-NEXT: %load.hi.hi = load i8* %bc.hity.hity | |
293 ; CHECK-NEXT: %load.hi.hi.ext = zext i8 %load.hi.hi to i32 | |
294 ; CHECK-NEXT: %load.hi.hi.ext.sh = shl i32 %load.hi.hi.ext, 16 | |
295 ; CHECK-NEXT: %load.hi = or i32 %load.hi.lo.ext, %load.hi.hi.ext.sh | |
296 ; CHECK-NEXT: %load.hi.ext = zext i32 %load.hi to i64 | |
297 ; CHECK-NEXT: %load.hi.ext.sh = shl i64 %load.hi.ext, 32 | |
298 ; CHECK-NEXT: %load = or i64 %load.lo.ext, %load.hi.ext.sh | |
299 define void @load56(i32* %a) { | |
300 %bc = bitcast i32* %a to i56* | |
301 %load = load i56* %bc | |
302 ret void | |
303 } | |
304 | |
305 ; CHECK: @store24 | |
306 ; CHECK: %b24 = zext i8 %b to i32 | |
307 ; CHECK-NEXT: %bc.loty = bitcast i32* %bc to i16* | |
308 ; CHECK-NEXT: %b24.lo = trunc i32 %b24 to i16 | |
309 ; CHECK-NEXT: store i16 %b24.lo, i16* %bc.loty | |
310 ; CHECK-NEXT: %b24.hi.sh = lshr i32 %b24, 16 | |
311 ; CHECK-NEXT: %bc.hi = getelementptr i16* %bc.loty, i32 1 | |
312 ; CHECK-NEXT: %b24.hi = trunc i32 %b24.hi.sh to i8 | |
313 ; CHECK-NEXT: %bc.hity = bitcast i16* %bc.hi to i8* | |
314 ; CHECK-NEXT: store i8 %b24.hi, i8* %bc.hity | |
315 define void @store24(i8* %a, i8 %b) { | |
316 %bc = bitcast i8* %a to i24* | |
317 %b24 = zext i8 %b to i24 | |
318 store i24 %b24, i24* %bc | |
319 ret void | |
320 } | |
321 | |
322 ; CHECK: @store56 | |
323 ; CHECK: %b56 = zext i8 %b to i64 | |
324 ; CHECK-NEXT: %bc.loty = bitcast i64* %bc to i32* | |
325 ; CHECK-NEXT: %b56.lo = trunc i64 %b56 to i32 | |
326 ; CHECK-NEXT: store i32 %b56.lo, i32* %bc.loty | |
327 ; CHECK-NEXT: %b56.hi.sh = lshr i64 %b56, 32 | |
328 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1 | |
329 ; CHECK-NEXT: %bc.hity.loty = bitcast i32* %bc.hi to i16* | |
330 ; CHECK-NEXT: %b56.hi.sh.lo = trunc i64 %b56.hi.sh to i16 | |
331 ; CHECK-NEXT: store i16 %b56.hi.sh.lo, i16* %bc.hity.loty | |
332 ; CHECK-NEXT: %b56.hi.sh.hi.sh = lshr i64 %b56.hi.sh, 16 | |
333 ; CHECK-NEXT: %bc.hity.hi = getelementptr i16* %bc.hity.loty, i32 1 | |
334 ; CHECK-NEXT: %b56.hi.sh.hi = trunc i64 %b56.hi.sh.hi.sh to i8 | |
335 ; CHECK-NEXT: %bc.hity.hity = bitcast i16* %bc.hity.hi to i8* | |
336 ; CHECK-NEXT: store i8 %b56.hi.sh.hi, i8* %bc.hity.hity | |
337 define void @store56(i8* %a, i8 %b) { | |
338 %bc = bitcast i8* %a to i56* | |
339 %b56 = zext i8 %b to i56 | |
340 store i56 %b56, i56* %bc | |
341 ret void | |
342 } | |
OLD | NEW |