Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Side by Side Diff: test/Transforms/NaCl/promote-integers.ll

Issue 14569012: PNaCl ABI: Promote illegal integer types (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: remove ABI checker tests until after we enable the pass Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/Transforms/NaCl/PromoteIntegers.cpp ('k') | tools/opt/opt.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
179 ; CHECK-NOT: and
180 %ashl = shl nuw i12 %a12, 5
181 ret void
182 }
183
184 ; CHECK: @lshr1
185 define void @lshr1(i16 %a) {
186 %a24 = zext i16 %a to i24
187 ; CHECK: %b = lshr i32 %a24, 20
188 %b = lshr i24 %a24, 20
189 ; CHECK: %c = lshr i32 %a24, 5
190 %c = lshr i24 %a24, 5
191 ret void
192 }
193
194 ; CHECK: @ashr1
195 define void @ashr1(i16 %a) {
196 %a24 = sext i16 %a to i24
197 ; CHECK: %a24.getsign = shl i32 %a24, 8
198 ; CHECK-NEXT: %b24.result = ashr i32 %a24.getsign, 19
199 ; CHECK-NEXT: %b24 = and i32 %b24.result, 16777215
200 %b24 = ashr i24 %a24, 11
201 ; CHECK-NEXT: %a24.getsign1 = shl i32 %a24, 8
202 ; CHECK-NEXT: %a24.shamt = add i32 %b24, 8
203 ; CHECK-NEXT: %c.result = ashr i32 %a24.getsign1, %a24.shamt
204 ; CHECK-NEXT: %c = and i32 %c.result, 16777215
205 %c = ashr i24 %a24, %b24
206 ret void
207 }
208
209 ; CHECK: @phi_icmp
210 define void @phi_icmp(i32 %a) {
211 entry:
212 br label %loop
213 loop:
214 ; CHECK: %phi40 = phi i64 [ 1099511627774, %entry ], [ %phi40, %loop ]
215 %phi40 = phi i40 [ -2, %entry ], [ %phi40, %loop ]
216 ; CHECK-NEXT: %b = icmp eq i64 %phi40, 1099511627775
217 %b = icmp eq i40 %phi40, -1
218 ; CHECK-NEXT: br i1 %b, label %loop, label %end
219 br i1 %b, label %loop, label %end
220 end:
221 ret void
222 }
223
224 ; CHECK: @icmp_ult
225 define void @icmp_ult(i32 %a) {
226 %a40 = zext i32 %a to i40
227 ; CHECK: %b = icmp ult i64 %a40, 1099511627774
228 %b = icmp ult i40 %a40, -2
229 ret void
230 }
231
232 ; CHECK: @select1
233 define void @select1(i32 %a) {
234 %a40 = zext i32 %a to i40
235 ; CHECK: %s40 = select i1 true, i64 %a40, i64 1099511627775
236 %s40 = select i1 true, i40 %a40, i40 -1
237 ret void
238 }
239
240 ; CHECK: @alloca40
241 ; CHECK: alloca i64, align 8
242 define void @alloca40() {
243 %a = alloca i40, align 8
244 %b = bitcast i40* %a to i8*
245 %c = load i8* %b
246 ret void
247 }
248
249 ; CHECK: @load24
250 ; CHECK: %bc.loty = bitcast i32* %bc to i16*
251 ; CHECK-NEXT: %load.lo = load i16* %bc.loty
252 ; CHECK-NEXT: %load.lo.ext = zext i16 %load.lo to i32
253 ; CHECK-NEXT: %bc.hi = getelementptr i16* %bc.loty, i32 1
254 ; CHECK-NEXT: %bc.hity = bitcast i16* %bc.hi to i8*
255 ; CHECK-NEXT: %load.hi = load i8* %bc.hity
256 ; CHECK-NEXT: %load.hi.ext = zext i8 %load.hi to i32
257 ; CHECK-NEXT: %load.hi.ext.sh = shl i32 %load.hi.ext, 16
258 ; CHECK-NEXT: %load = or i32 %load.lo.ext, %load.hi.ext.sh
259 define void @load24(i8* %a) {
260 %bc = bitcast i8* %a to i24*
261 %load = load i24* %bc, align 8
262 ret void
263 }
264
265 ; CHECK: @load48
266 ; CHECK: %bc.loty = bitcast i64* %bc to i32*
267 ; CHECK-NEXT: %load.lo = load i32* %bc.loty
268 ; CHECK-NEXT: %load.lo.ext = zext i32 %load.lo to i64
269 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1
270 ; CHECK-NEXT: %bc.hity = bitcast i32* %bc.hi to i16*
271 ; CHECK-NEXT: %load.hi = load i16* %bc.hity
272 ; CHECK-NEXT: %load.hi.ext = zext i16 %load.hi to i64
273 ; CHECK-NEXT: %load.hi.ext.sh = shl i64 %load.hi.ext, 32
274 ; CHECK-NEXT: %load = or i64 %load.lo.ext, %load.hi.ext.sh
275 define void @load48(i32* %a) {
276 %bc = bitcast i32* %a to i48*
277 %load = load i48* %bc, align 8
278 ret void
279 }
280
281 ; CHECK: %bc = bitcast i32* %a to i64*
282 ; CHECK-NEXT: %bc.loty = bitcast i64* %bc to i32*
283 ; CHECK-NEXT: %load.lo = load i32* %bc.loty
284 ; CHECK-NEXT: %load.lo.ext = zext i32 %load.lo to i64
285 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1
286 ; CHECK-NEXT: %bc.hity.loty = bitcast i32* %bc.hi to i16*
287 ; CHECK-NEXT: %load.hi.lo = load i16* %bc.hity.loty
288 ; CHECK-NEXT: %load.hi.lo.ext = zext i16 %load.hi.lo to i32
289 ; CHECK-NEXT: %bc.hity.hi = getelementptr i16* %bc.hity.loty, i32 1
290 ; CHECK-NEXT: %bc.hity.hity = bitcast i16* %bc.hity.hi to i8*
291 ; CHECK-NEXT: %load.hi.hi = load i8* %bc.hity.hity
292 ; CHECK-NEXT: %load.hi.hi.ext = zext i8 %load.hi.hi to i32
293 ; CHECK-NEXT: %load.hi.hi.ext.sh = shl i32 %load.hi.hi.ext, 16
294 ; CHECK-NEXT: %load.hi = or i32 %load.hi.lo.ext, %load.hi.hi.ext.sh
295 ; CHECK-NEXT: %load.hi.ext = zext i32 %load.hi to i64
296 ; CHECK-NEXT: %load.hi.ext.sh = shl i64 %load.hi.ext, 32
297 ; CHECK-NEXT: %load = or i64 %load.lo.ext, %load.hi.ext.sh
298 define void @load56(i32* %a) {
299 %bc = bitcast i32* %a to i56*
300 %load = load i56* %bc
301 ret void
302 }
303
304 ; CHECK: @store24
305 ; CHECK: %b24 = zext i8 %b to i32
306 ; CHECK-NEXT: %bc.loty = bitcast i32* %bc to i16*
307 ; CHECK-NEXT: %b24.lo = trunc i32 %b24 to i16
308 ; CHECK-NEXT: store i16 %b24.lo, i16* %bc.loty
309 ; CHECK-NEXT: %b24.hi.sh = lshr i32 %b24, 16
310 ; CHECK-NEXT: %bc.hi = getelementptr i16* %bc.loty, i32 1
311 ; CHECK-NEXT: %b24.hi = trunc i32 %b24.hi.sh to i8
312 ; CHECK-NEXT: %bc.hity = bitcast i16* %bc.hi to i8*
313 ; CHECK-NEXT: store i8 %b24.hi, i8* %bc.hity
314 define void @store24(i8* %a, i8 %b) {
315 %bc = bitcast i8* %a to i24*
316 %b24 = zext i8 %b to i24
317 store i24 %b24, i24* %bc
318 ret void
319 }
320
321 ; CHECK: @store56
322 ; CHECK: %b56 = zext i8 %b to i64
323 ; CHECK-NEXT: %bc.loty = bitcast i64* %bc to i32*
324 ; CHECK-NEXT: %b56.lo = trunc i64 %b56 to i32
325 ; CHECK-NEXT: store i32 %b56.lo, i32* %bc.loty
326 ; CHECK-NEXT: %b56.hi.sh = lshr i64 %b56, 32
327 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1
328 ; CHECK-NEXT: %bc.hity.loty = bitcast i32* %bc.hi to i16*
329 ; CHECK-NEXT: %b56.hi.sh.lo = trunc i64 %b56.hi.sh to i16
330 ; CHECK-NEXT: store i16 %b56.hi.sh.lo, i16* %bc.hity.loty
331 ; CHECK-NEXT: %b56.hi.sh.hi.sh = lshr i64 %b56.hi.sh, 16
332 ; CHECK-NEXT: %bc.hity.hi = getelementptr i16* %bc.hity.loty, i32 1
333 ; CHECK-NEXT: %b56.hi.sh.hi = trunc i64 %b56.hi.sh.hi.sh to i8
334 ; CHECK-NEXT: %bc.hity.hity = bitcast i16* %bc.hity.hi to i8*
335 ; CHECK-NEXT: store i8 %b56.hi.sh.hi, i8* %bc.hity.hity
336 define void @store56(i8* %a, i8 %b) {
337 %bc = bitcast i8* %a to i56*
338 %b56 = zext i8 %b to i56
339 store i56 %b56, i56* %bc
340 ret void
341 }
OLDNEW
« no previous file with comments | « lib/Transforms/NaCl/PromoteIntegers.cpp ('k') | tools/opt/opt.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698