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

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: use upper-clear invariant rather than sign-extend 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
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 %a12 = sext i8 %a to i12
jvoung (off chromium) 2013/05/07 01:22:11 move the definition %a12 = ... closer to the uses?
Derek Schuff 2013/05/08 22:33:28 Done.
17 ; CHECK: call void @consume_i16(i16 -2)
18 %c12 = sext i12 -2 to i16
19 call void @consume_i16(i16 %c12)
20 ; CHECK: %a12.getsign = shl i16 %a12, 4
jvoung (off chromium) 2013/05/07 01:22:11 Could add other test cases where the shift amount
Derek Schuff 2013/05/08 22:33:28 Done.
21 ; CHECK-NEXT: %a16 = ashr i16 %a12.getsign, 4
22 %a16 = sext i12 %a12 to i16
23 ; CHECK: %a12.getsign1 = shl i16 %a12, 4
24 ; CHECK-NEXT: %a12.signed = ashr i16 %a12.getsign1, 4
25 ; CHECK-NEXT: %a14 = and i16 %a12.signed, 16383
26 ; (0x3FFF)
27 %a14 = sext i12 %a12 to i14
28 ; CHECK-NEXT: %a12.getsign2 = shl i16 %a12, 4
29 ; CHECK-NEXT: %a12.signed3 = ashr i16 %a12.getsign2, 4
30 ; CHECK-NEXT: %a24.sext = sext i16 %a12.signed3 to i32
31 ; CHECK-NEXT: %a24 = and i32 %a24.sext, 16777215
32 ; (0xFFFFFF)
33 %a24 = sext i12 %a12 to i24
34 ret void
35 }
36
37 ; CHECK: @zext_to_illegal
38 ; CHECK: zext i32 %a to i64
39 define void @zext_to_illegal(i32 %a) {
jvoung (off chromium) 2013/05/07 01:22:11 CHECK-NOT: for the AND? (or is there an AND)?
Derek Schuff 2013/05/08 22:33:28 Done.
40 %a40 = zext i32 %a to i40
41 ret void
42 }
43
44 ; CHECK: @zext_from_illegal
45 ; TODO(dschuff): make the ANDs no-ops?
jvoung (off chromium) 2013/05/07 01:22:11 Put the TODO by the first AND?
Derek Schuff 2013/05/08 22:33:28 Done.
46 define void @zext_from_illegal(i8 %a) {
47 ; get some illegal values to start with
48 %a24 = zext i8 %a to i24
49 %a40 = zext i8 %a to i40
50 %a18 = zext i8 %a to i18
51
52 ; CHECK: %a32 = and i32 %a24, 16777215
53 ; (0xFFFFFF)
54 %a32 = zext i24 %a24 to i32
55
56 ; CHECK: %b24 = and i32 %a18, 262143
57 ; (0x3FFFF)
58 %b24 = zext i18 %a18 to i24
59
60 ; CHECK: %a24.clear = and i32 %a24, 16777215
61 ; CHECK: %b40 = zext i32 %a24.clear to i64
62 %b40 = zext i24 %a24 to i40
63
64 ; CHECK: call void @consume_i16(i16 4094)
65 %c16 = zext i12 -2 to i16
66 call void @consume_i16(i16 %c16)
67 ; CHECK: call void @consume_i16(i16 4094)
68 %c14 = zext i12 -2 to i14
69 %c16.2 = zext i14 %c14 to i16
70 call void @consume_i16(i16 %c16.2)
71 ret void
72 }
73
74 define void @trunc_from_illegal(i8 %a) {
75 %a24 = zext i8 %a to i24
76 ; CHECK: %a16 = trunc i32 %a24 to i16
jvoung (off chromium) 2013/05/07 01:22:11 same for sext?
Derek Schuff 2013/05/08 22:33:28 same what?
jvoung (off chromium) 2013/05/09 00:06:43 meant test trunc with a var that was sext to illeg
77 %a16 = trunc i24 %a24 to i16
78 ret void
79 }
80
81 define void @trunc_to_illegal(i32 %a) {
82 ; CHECK: %a24 = and i32 %a, 16777215
83 ; (0xFFFFFF)
84 %a24 = trunc i32 %a to i24
85
86 ; CHECK: %a24.trunc = trunc i32 %a24 to i16
87 ; CHECK-NEXT: %a12 = and i16 %a24.trunc, 4095
88 ; (0xFFF)
89 %a12 = trunc i24 %a24 to i12
90 ret void
91 }
92
93 ; CHECK: @icmpsigned
94 define void @icmpsigned(i32 %a) {
95 %shl = trunc i32 %a to i24
96 ; CHECK: %shl.getsign = shl i32 %shl, 8
97 ; CHECK-NEXT: %shl.signed = ashr i32 %shl.getsign, 8
98 ; CHECK-NEXT: %cmp = icmp slt i32 %shl.signed, -2
99 %cmp = icmp slt i24 %shl, -2
jvoung (off chromium) 2013/05/07 01:22:11 Is it the case that with "ult", you will still end
Derek Schuff 2013/05/08 22:33:28 No, with unsigned and equality we don't sign-exten
100 ret void
101 }
102
103 ; CHECK: @bc1
104 ; CHECK: bc1 = bitcast i32* %a to i64*
105 ; CHECK-NEXT: bc2 = bitcast i64* %bc1 to i32*
106 define i32* @bc1(i32* %a) {
107 %bc1 = bitcast i32* %a to i40*
108 %bc2 = bitcast i40* %bc1 to i32*
109 ret i32* %bc2
110 }
111
112 ; CHECK: zext i32 %a to i64
113 ; CHECK: and i64 %a40, 255
114 define void @and1(i32 %a) {
115 %a40 = zext i32 %a to i40
116 %and = and i40 %a40, 255
117 ret void
118 }
119
120 ; CHECK: @add1
121 ; CHECK: sext i16 %a to i32
122 ; CHECK: %sum.result = add i32 %a24, 16777214
jvoung (off chromium) 2013/05/07 01:22:11 CHECK-NEXT: or is there something in between?
Derek Schuff 2013/05/08 22:33:28 Done.
123 ; CHECK: %sum = and i32 %sum.result, 16777215
124 define void @add1(i16 %a) {
125 %a24 = sext i16 %a to i24
126 %sum = add i24 %a24, -2
127 ret void
128 }
129
130 ; CHECK @shl1
131 define void @shl1(i16 %a) {
132 %a24 = zext i16 %a to i24
133 ; CHECK: %ashl.result = shl i32 %a24, 5
134 ; CHECK: %ashl = and i32 %ashl.result, 16777215
135 %ashl = shl i24 %a24, 5
136 ret void
137 }
138
139 ; CHECK: @lshr1
140 define void @lshr1(i16 %a) {
141 %a24 = zext i16 %a to i24
142 ; CHECK: %b = lshr i32 %a24, 20
143 %b = lshr i24 %a24, 20
jvoung (off chromium) 2013/05/07 01:22:11 nit: Also test with shift amt smaller than 16? (w
Derek Schuff 2013/05/08 22:33:28 True, although it's just an artifact of the way I
144 ret void
145 }
146
147 ; CHECK: @ashr1
148 define void @ashr1(i16 %a) {
149 %a24 = sext i16 %a to i24
150 ; CHECK: %a24.getsign = shl i32 %a24, 8
151 ; CHECK-NEXT: %b24.result = ashr i32 %a24.getsign, 19
152 ; CHECK-NEXT: %b24 = and i32 %b24.result, 16777215
153 %b24 = ashr i24 %a24, 11
154 ; CHECK-NEXT: %a24.getsign1 = shl i32 %a24, 8
155 ; CHECK-NEXT: %a24.shamt = add i32 %b24, 8
156 ; CHECK-NEXT: %c.result = ashr i32 %a24.getsign1, %a24.shamt
157 ; CHECK-NEXT: %c = and i32 %c.result, 16777215
158 %c = ashr i24 %a24, %b24
159 ret void
160 }
161
162 ; CHECK: @phi_icmp
163 define void @phi_icmp(i32 %a) {
164 entry:
165 br label %loop
166 loop:
167 ; CHECK: %phi40 = phi i64 [ 1099511627774, %entry ], [ %phi40, %loop ]
168 %phi40 = phi i40 [ -2, %entry ], [ %phi40, %loop ]
169 ; CHECK-NEXT: %b = icmp eq i64 %phi40, 1099511627775
170 %b = icmp eq i40 %phi40, -1
171 ; CHECK-NEXT: br i1 %b, label %loop, label %end
172 br i1 %b, label %loop, label %end
173 end:
174 ret void
175 }
176
177 ; CHECK: @icmp_ult
178 define void @icmp_ult(i32 %a) {
179 %a40 = zext i32 %a to i40
180 ; CHECK: %b = icmp ult i64 %a40, 1099511627774
181 %b = icmp ult i40 %a40, -2
182 ret void
183 }
184
185 ; TODO(dschuff): implement icmp sXX
186
187 ; CHECK: @select1
188 define void @select1(i32 %a) {
189 %a40 = zext i32 %a to i40
190 ; CHECK: %s40 = select i1 true, i64 %a40, i64 1099511627775
191 %s40 = select i1 true, i40 %a40, i40 -1
192 ret void
193 }
194
195 ; CHECK: @alloca40
196 ; CHECK: alloca i64, align 8
197 define void @alloca40() {
198 %a = alloca i40, align 8
199 %b = bitcast i40* %a to i8*
200 %c = load i8* %b
201 ret void
202 }
203
204 ; CHECK: @load24
205 ; CHECK: %bc.loty = bitcast i32* %bc to i16*
206 ; CHECK-NEXT: %load.lo = load i16* %bc.loty
207 ; CHECK-NEXT: %load.lo.ext = zext i16 %load.lo to i32
208 ; CHECK-NEXT: %bc.hi = getelementptr i16* %bc.loty, i32 1
209 ; CHECK-NEXT: %bc.hity = bitcast i16* %bc.hi to i8*
210 ; CHECK-NEXT: %load.hi = load i8* %bc.hity
211 ; CHECK-NEXT: %load.hi.ext = zext i8 %load.hi to i32
212 ; CHECK-NEXT: %load.hi.ext.sh = shl i32 %load.hi.ext, 16
213 ; CHECK-NEXT: %load = or i32 %load.lo.ext, %load.hi.ext.sh
214 define void @load24(i8* %a) {
215 %bc = bitcast i8* %a to i24*
jvoung (off chromium) 2013/05/07 01:22:11 Is it also possible to handle bitcast i32* %a to i
Derek Schuff 2013/05/08 22:33:28 Yeah, the bitcast is just to get from a legal type
216 %load = load i24* %bc, align 8
217 ret void
218 }
219
220 ; CHECK: @load48
221 ; CHECK: %bc.loty = bitcast i64* %bc to i32*
222 ; CHECK-NEXT: %load.lo = load i32* %bc.loty
223 ; CHECK-NEXT: %load.lo.ext = zext i32 %load.lo to i64
224 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1
225 ; CHECK-NEXT: %bc.hity = bitcast i32* %bc.hi to i16*
226 ; CHECK-NEXT: %load.hi = load i16* %bc.hity
227 ; CHECK-NEXT: %load.hi.ext = zext i16 %load.hi to i64
228 ; CHECK-NEXT: %load.hi.ext.sh = shl i64 %load.hi.ext, 32
229 ; CHECK-NEXT: %load = or i64 %load.lo.ext, %load.hi.ext.sh
230 define void @load48(i32* %a) {
231 %bc = bitcast i32* %a to i48*
232 %load = load i48* %bc, align 8
233 ret void
234 }
235
236 ; CHECK: %bc = bitcast i32* %a to i64*
237 ; CHECK-NEXT: %bc.loty = bitcast i64* %bc to i32*
238 ; CHECK-NEXT: %load.lo = load i32* %bc.loty
239 ; CHECK-NEXT: %load.lo.ext = zext i32 %load.lo to i64
240 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1
241 ; CHECK-NEXT: %bc.hity.loty = bitcast i32* %bc.hi to i16*
242 ; CHECK-NEXT: %load.hi.lo = load i16* %bc.hity.loty
243 ; CHECK-NEXT: %load.hi.lo.ext = zext i16 %load.hi.lo to i32
244 ; CHECK-NEXT: %bc.hity.hi = getelementptr i16* %bc.hity.loty, i32 1
245 ; CHECK-NEXT: %bc.hity.hity = bitcast i16* %bc.hity.hi to i8*
246 ; CHECK-NEXT: %load.hi.hi = load i8* %bc.hity.hity
247 ; CHECK-NEXT: %load.hi.hi.ext = zext i8 %load.hi.hi to i32
248 ; CHECK-NEXT: %load.hi.hi.ext.sh = shl i32 %load.hi.hi.ext, 16
249 ; CHECK-NEXT: %load.hi = or i32 %load.hi.lo.ext, %load.hi.hi.ext.sh
250 ; CHECK-NEXT: %load.hi.ext = zext i32 %load.hi to i64
251 ; CHECK-NEXT: %load.hi.ext.sh = shl i64 %load.hi.ext, 32
252 ; CHECK-NEXT: %load = or i64 %load.lo.ext, %load.hi.ext.sh
253 define void @load56(i32* %a) {
254 %bc = bitcast i32* %a to i56*
255 %load = load i56* %bc
256 ret void
257 }
258
259 ; CHECK: @store24
260 ; CHECK: %b24 = zext i8 %b to i32
261 ; CHECK-NEXT: %bc.loty = bitcast i32* %bc to i16*
262 ; CHECK-NEXT: %b24.lo = trunc i32 %b24 to i16
263 ; CHECK-NEXT: store i16 %b24.lo, i16* %bc.loty
264 ; CHECK-NEXT: %b24.hi.sh = lshr i32 %b24, 16
265 ; CHECK-NEXT: %bc.hi = getelementptr i16* %bc.loty, i32 1
266 ; CHECK-NEXT: %b24.hi = trunc i32 %b24.hi.sh to i8
267 ; CHECK-NEXT: %bc.hity = bitcast i16* %bc.hi to i8*
268 ; CHECK-NEXT: store i8 %b24.hi, i8* %bc.hity
269 define void @store24(i8* %a, i8 %b) {
270 %bc = bitcast i8* %a to i24*
271 %b24 = zext i8 %b to i24
272 store i24 %b24, i24* %bc
273 ret void
274 }
275
276 ; CHECK: @store56
277 ; CHECK: %b56 = zext i8 %b to i64
278 ; CHECK-NEXT: %bc.loty = bitcast i64* %bc to i32*
279 ; CHECK-NEXT: %b56.lo = trunc i64 %b56 to i32
280 ; CHECK-NEXT: store i32 %b56.lo, i32* %bc.loty
281 ; CHECK-NEXT: %b56.hi.sh = lshr i64 %b56, 32
282 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1
283 ; CHECK-NEXT: %bc.hity.loty = bitcast i32* %bc.hi to i16*
284 ; CHECK-NEXT: %b56.hi.sh.lo = trunc i64 %b56.hi.sh to i16
285 ; CHECK-NEXT: store i16 %b56.hi.sh.lo, i16* %bc.hity.loty
286 ; CHECK-NEXT: %b56.hi.sh.hi.sh = lshr i64 %b56.hi.sh, 16
287 ; CHECK-NEXT: %bc.hity.hi = getelementptr i16* %bc.hity.loty, i32 1
288 ; CHECK-NEXT: %b56.hi.sh.hi = trunc i64 %b56.hi.sh.hi.sh to i8
289 ; CHECK-NEXT: %bc.hity.hity = bitcast i16* %bc.hity.hi to i8*
290 ; CHECK-NEXT: store i8 %b56.hi.sh.hi, i8* %bc.hity.hity
291 define void @store56(i8* %a, i8 %b) {
292 %bc = bitcast i8* %a to i56*
293 %b56 = zext i8 %b to i56
294 store i56 %b56, i56* %bc
295 ret void
296 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698