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

Side by Side Diff: test/NaCl/Bitcode/ptrtoint-elide.ll

Issue 939073008: Rebased PNaCl localmods in LLVM to 223109 (Closed)
Patch Set: undo localmod Created 5 years, 9 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 | « test/NaCl/Bitcode/pnacl-bcdis/vectorops.ll ('k') | test/NaCl/Bitcode/switch.ll » ('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 ; Test how we handle eliding ptrtoint instructions.
2
3 ; RUN: llvm-as < %s | pnacl-freeze \
4 ; RUN: | pnacl-bcanalyzer -dump-records \
5 ; RUN: | FileCheck %s -check-prefix=PF2
6
7 ; RUN: llvm-as < %s | pnacl-freeze -allow-local-symbol-tables \
8 ; RUN: | pnacl-thaw -allow-local-symbol-tables \
9 ; RUN: | llvm-dis - | FileCheck %s -check-prefix=TD2
10
11 ; ------------------------------------------------------
12
13 declare i32 @bar(i32)
14
15 @bytes = internal global [4 x i8] c"abcd"
16
17 ; ------------------------------------------------------
18
19 ; Show simple case where we use ptrtoint
20 define void @AllocCastSimple() {
21 %1 = alloca i8, i32 4, align 8
22 %2 = ptrtoint i8* %1 to i32
23 %3 = bitcast [4 x i8]* @bytes to i32*
24 store i32 %2, i32* %3, align 1
25 ret void
26 }
27
28 ; TD2: define void @AllocCastSimple() {
29 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
30 ; TD2-NEXT: %2 = ptrtoint i8* %1 to i32
31 ; TD2-NEXT: %3 = bitcast [4 x i8]* @bytes to i32*
32 ; TD2-NEXT: store i32 %2, i32* %3, align 1
33 ; TD2-NEXT: ret void
34 ; TD2-NEXT: }
35
36 ; PF2: <FUNCTION_BLOCK>
37 ; PF2: </CONSTANTS_BLOCK>
38 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
39 ; PF2-NEXT: <INST_STORE op0=3 op1=1 op2=1/>
40 ; PF2-NEXT: <INST_RET/>
41 ; PF2-NEXT: </FUNCTION_BLOCK>
42
43 ; ------------------------------------------------------
44
45 ; Same as above, but with the cast order changed. Shows
46 ; that we always inject casts back in a fixed order. Hence,
47 ; the casts will be reversed.
48 define void @AllocCastSimpleReversed() {
49 %1 = alloca i8, i32 4, align 8
50 %2 = bitcast [4 x i8]* @bytes to i32*
51 %3 = ptrtoint i8* %1 to i32
52 store i32 %3, i32* %2, align 1
53 ret void
54 }
55
56 ; TD2: define void @AllocCastSimpleReversed() {
57 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
58 ; TD2-NEXT: %2 = ptrtoint i8* %1 to i32
59 ; TD2-NEXT: %3 = bitcast [4 x i8]* @bytes to i32*
60 ; TD2-NEXT: store i32 %2, i32* %3, align 1
61 ; TD2-NEXT: ret void
62 ; TD2-NEXT: }
63
64 ; PF2: <FUNCTION_BLOCK>
65 ; PF2: </CONSTANTS_BLOCK>
66 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
67 ; PF2-NEXT: <INST_STORE op0=3 op1=1 op2=1/>
68 ; PF2-NEXT: <INST_RET/>
69 ; PF2-NEXT: </FUNCTION_BLOCK>
70
71 ; ------------------------------------------------------
72
73 ; Show case where we delete ptrtoint because they aren't used.
74 define void @AllocCastDelete() {
75 %1 = alloca i8, i32 4, align 8
76 %2 = ptrtoint i8* %1 to i32
77 %3 = alloca i8, i32 4, align 8
78 %4 = ptrtoint i8* %3 to i32
79 ret void
80 }
81
82 ; TD2: define void @AllocCastDelete() {
83 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
84 ; TD2-NEXT: %2 = alloca i8, i32 4, align 8
85 ; TD2-NEXT: ret void
86 ; TD2-NEXT: }
87
88 ; PF2: <FUNCTION_BLOCK>
89 ; PF2: </CONSTANTS_BLOCK>
90 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
91 ; PF2-NEXT: <INST_ALLOCA op0=2 op1=4/>
92 ; PF2-NEXT: <INST_RET/>
93 ; PF2-NEXT: </FUNCTION_BLOCK>
94
95 ; ------------------------------------------------------
96
97 ; Show case where we have optimized the ptrtoint (and bitcast) into a
98 ; single instruction, and will only be inserted before the first use
99 ; in the block.
100 define void @AllocCastOpt() {
101 %1 = alloca i8, i32 4, align 8
102 %2 = bitcast [4 x i8]* @bytes to i32*
103 %3 = ptrtoint i8* %1 to i32
104 store i32 %3, i32* %2, align 1
105 store i32 %3, i32* %2, align 1
106 ret void
107 }
108
109 ; TD2: define void @AllocCastOpt() {
110 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
111 ; TD2-NEXT: %2 = ptrtoint i8* %1 to i32
112 ; TD2-NEXT: %3 = bitcast [4 x i8]* @bytes to i32*
113 ; TD2-NEXT: store i32 %2, i32* %3, align 1
114 ; TD2-NEXT: store i32 %2, i32* %3, align 1
115 ; TD2-NEXT: ret void
116 ; TD2-NEXT: }
117
118 ; PF2: <FUNCTION_BLOCK>
119 ; PF2: </CONSTANTS_BLOCK>
120 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
121 ; PF2-NEXT: <INST_STORE op0=3 op1=1 op2=1/>
122 ; PF2-NEXT: <INST_STORE op0=3 op1=1 op2=1/>
123 ; PF2-NEXT: <INST_RET/>
124 ; PF2-NEXT: </FUNCTION_BLOCK>
125
126 ; ------------------------------------------------------
127
128 ; Show case where ptrtoint (and bitcast) for store are not immediately
129 ; before the store, the casts will be moved to the store.
130 define void @AllocCastMove(i32) {
131 %2 = alloca i8, i32 4, align 8
132 %3 = bitcast [4 x i8]* @bytes to i32*
133 %4 = ptrtoint i8* %2 to i32
134 %5 = add i32 %0, 1
135 store i32 %4, i32* %3, align 1
136 ret void
137 }
138
139 ; TD2: define void @AllocCastMove(i32) {
140 ; TD2-NEXT: %2 = alloca i8, i32 4, align 8
141 ; TD2-NEXT: %3 = add i32 %0, 1
142 ; TD2-NEXT: %4 = ptrtoint i8* %2 to i32
143 ; TD2-NEXT: %5 = bitcast [4 x i8]* @bytes to i32*
144 ; TD2-NEXT: store i32 %4, i32* %5, align 1
145 ; TD2-NEXT: ret void
146 ; TD2-NEXT: }
147
148 ; PF2: <FUNCTION_BLOCK>
149 ; PF2: </CONSTANTS_BLOCK>
150 ; PF2-NEXT: <INST_ALLOCA op0=2 op1=4/>
151 ; PF2-NEXT: <INST_BINOP op0=4 op1=2 op2=0/>
152 ; PF2-NEXT: <INST_STORE op0=6 op1=2 op2=1/>
153 ; PF2-NEXT: <INST_RET/>
154 ; PF2-NEXT: </FUNCTION_BLOCK>
155
156 ; ------------------------------------------------------
157
158 ; Show case where ptrtoint on global variable is merged in a store, and
159 ; order is kept.
160 define void @StoreGlobal() {
161 %1 = alloca i8, i32 4, align 8
162 %2 = ptrtoint [4 x i8]* @bytes to i32
163 %3 = bitcast i8* %1 to i32*
164 store i32 %2, i32* %3, align 1
165 ret void
166 }
167
168 ; TD2: define void @StoreGlobal() {
169 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
170 ; TD2-NEXT: %2 = ptrtoint [4 x i8]* @bytes to i32
171 ; TD2-NEXT: %3 = bitcast i8* %1 to i32*
172 ; TD2-NEXT: store i32 %2, i32* %3, align 1
173 ; TD2-NEXT: ret void
174 ; TD2-NEXT: }
175
176 ; PF2: <FUNCTION_BLOCK>
177 ; PF2: </CONSTANTS_BLOCK>
178 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
179 ; PF2-NEXT: <INST_STORE op0=1 op1=3 op2=1/>
180 ; PF2-NEXT: <INST_RET/>
181 ; PF2-NEXT: </FUNCTION_BLOCK>
182
183 ; ------------------------------------------------------
184
185 ; Same as above, but with cast order reversed.
186 define void @StoreGlobalCastsReversed() {
187 %1 = alloca i8, i32 4, align 8
188 %2 = bitcast i8* %1 to i32*
189 %3 = ptrtoint [4 x i8]* @bytes to i32
190 store i32 %3, i32* %2, align 1
191 ret void
192 }
193
194 ; TD2: define void @StoreGlobalCastsReversed() {
195 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
196 ; TD2-NEXT: %2 = ptrtoint [4 x i8]* @bytes to i32
197 ; TD2-NEXT: %3 = bitcast i8* %1 to i32*
198 ; TD2-NEXT: store i32 %2, i32* %3, align 1
199 ; TD2-NEXT: ret void
200 ; TD2-NEXT: }
201
202 ; PF2: <FUNCTION_BLOCK>
203 ; PF2: </CONSTANTS_BLOCK>
204 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
205 ; PF2-NEXT: <INST_STORE op0=1 op1=3 op2=1/>
206 ; PF2-NEXT: <INST_RET/>
207 ; PF2-NEXT: </FUNCTION_BLOCK>
208
209 ; ------------------------------------------------------
210
211 ; Show that we will move the ptrtoint of a global to the use.
212 define i32 @StoreGlobalMovePtr2Int() {
213 %1 = ptrtoint [4 x i8]* @bytes to i32
214 %2 = alloca i8, i32 4, align 8
215 %3 = bitcast i8* %2 to i32*
216 store i32 %1, i32* %3, align 1
217 ret i32 0
218 }
219
220 ; TD2: define i32 @StoreGlobalMovePtr2Int() {
221 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
222 ; TD2-NEXT: %2 = ptrtoint [4 x i8]* @bytes to i32
223 ; TD2-NEXT: %3 = bitcast i8* %1 to i32*
224 ; TD2-NEXT: store i32 %2, i32* %3, align 1
225 ; TD2-NEXT: ret i32 0
226 ; TD2-NEXT: }
227
228 ; PF2: <FUNCTION_BLOCK>
229 ; PF2: </CONSTANTS_BLOCK>
230 ; PF2-NEXT: <INST_ALLOCA op0=2 op1=4/>
231 ; PF2-NEXT: <INST_STORE op0=1 op1=4 op2=1/>
232 ; PF2-NEXT: <INST_RET op0=2/>
233 ; PF2-NEXT: </FUNCTION_BLOCK>
234
235 ; ------------------------------------------------------
236
237 ; Show that we handle add instructions with pointer casts.
238 define void @CastAddAlloca() {
239 %1 = alloca i8, i32 4, align 8
240 %2 = ptrtoint i8* %1 to i32
241
242 ; Simple add.
243 %3 = add i32 1, 2
244
245 ; Cast first.
246 %4 = add i32 %2, 2
247
248 ; Cast second.
249 %5 = add i32 1, %2
250
251 ; Cast both.
252 %6 = add i32 %2, %2
253
254 ret void
255 }
256
257 ; TD2: define void @CastAddAlloca() {
258 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
259 ; TD2-NEXT: %2 = add i32 1, 2
260 ; TD2-NEXT: %3 = ptrtoint i8* %1 to i32
261 ; TD2-NEXT: %4 = add i32 %3, 2
262 ; TD2-NEXT: %5 = add i32 1, %3
263 ; TD2-NEXT: %6 = add i32 %3, %3
264 ; TD2-NEXT: ret void
265 ; TD2-NEXT: }
266
267 ; PF2: <FUNCTION_BLOCK>
268 ; PF2: </CONSTANTS_BLOCK>
269 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
270 ; PF2-NEXT: <INST_BINOP op0=4 op1=3 op2=0/>
271 ; PF2-NEXT: <INST_BINOP op0=2 op1=4 op2=0/>
272 ; PF2-NEXT: <INST_BINOP op0=6 op1=3 op2=0/>
273 ; PF2-NEXT: <INST_BINOP op0=4 op1=4 op2=0/>
274 ; PF2-NEXT: <INST_RET/>
275 ; PF2-NEXT: </FUNCTION_BLOCK>
276
277 ; ------------------------------------------------------
278
279 ; Show that we handle add instructions with pointer casts.
280 define void @CastAddGlobal() {
281 %1 = ptrtoint [4 x i8]* @bytes to i32
282
283 ; Simple Add.
284 %2 = add i32 1, 2
285
286 ; Cast first.
287 %3 = add i32 %1, 2
288
289 ; Cast Second.
290 %4 = add i32 1, %1
291
292 ; Cast both.
293 %5 = add i32 %1, %1
294 ret void
295 }
296
297 ; TD2: define void @CastAddGlobal() {
298 ; TD2-NEXT: %1 = add i32 1, 2
299 ; TD2-NEXT: %2 = ptrtoint [4 x i8]* @bytes to i32
300 ; TD2-NEXT: %3 = add i32 %2, 2
301 ; TD2-NEXT: %4 = add i32 1, %2
302 ; TD2-NEXT: %5 = add i32 %2, %2
303 ; TD2-NEXT: ret void
304 ; TD2-NEXT: }
305
306 ; PF2: <FUNCTION_BLOCK>
307 ; PF2: </CONSTANTS_BLOCK>
308 ; PF2-NEXT: <INST_BINOP op0=2 op1=1 op2=0/>
309 ; PF2-NEXT: <INST_BINOP op0=4 op1=2 op2=0/>
310 ; PF2-NEXT: <INST_BINOP op0=4 op1=5 op2=0/>
311 ; PF2-NEXT: <INST_BINOP op0=6 op1=6 op2=0/>
312 ; PF2-NEXT: <INST_RET/>
313 ; PF2-NEXT: </FUNCTION_BLOCK>
314
315 ; ------------------------------------------------------
316
317 ; Show that we can handle pointer conversions for other scalar binary operators.
318 define void @CastBinop() {
319 %1 = alloca i8, i32 4, align 8
320 %2 = ptrtoint i8* %1 to i32
321 %3 = ptrtoint [4 x i8]* @bytes to i32
322 %4 = sub i32 %2, %3
323 %5 = mul i32 %2, %3
324 %6 = udiv i32 %2, %3
325 %7 = urem i32 %2, %3
326 %8 = srem i32 %2, %3
327 %9 = shl i32 %2, %3
328 %10 = lshr i32 %2, %3
329 %11 = ashr i32 %2, %3
330 %12 = and i32 %2, %3
331 %13 = or i32 %2, %3
332 %14 = xor i32 %2, %3
333 ret void
334 }
335
336 ; TD2: define void @CastBinop() {
337 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
338 ; TD2-NEXT: %2 = ptrtoint i8* %1 to i32
339 ; TD2-NEXT: %3 = ptrtoint [4 x i8]* @bytes to i32
340 ; TD2-NEXT: %4 = sub i32 %2, %3
341 ; TD2-NEXT: %5 = mul i32 %2, %3
342 ; TD2-NEXT: %6 = udiv i32 %2, %3
343 ; TD2-NEXT: %7 = urem i32 %2, %3
344 ; TD2-NEXT: %8 = srem i32 %2, %3
345 ; TD2-NEXT: %9 = shl i32 %2, %3
346 ; TD2-NEXT: %10 = lshr i32 %2, %3
347 ; TD2-NEXT: %11 = ashr i32 %2, %3
348 ; TD2-NEXT: %12 = and i32 %2, %3
349 ; TD2-NEXT: %13 = or i32 %2, %3
350 ; TD2-NEXT: %14 = xor i32 %2, %3
351 ; TD2-NEXT: ret void
352 ; TD2-NEXT: }
353
354 ; PF2: <FUNCTION_BLOCK>
355 ; PF2: </CONSTANTS_BLOCK>
356 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
357 ; PF2-NEXT: <INST_BINOP op0=1 op1=3 op2=1/>
358 ; PF2-NEXT: <INST_BINOP op0=2 op1=4 op2=2/>
359 ; PF2-NEXT: <INST_BINOP op0=3 op1=5 op2=3/>
360 ; PF2-NEXT: <INST_BINOP op0=4 op1=6 op2=5/>
361 ; PF2-NEXT: <INST_BINOP op0=5 op1=7 op2=6/>
362 ; PF2-NEXT: <INST_BINOP op0=6 op1=8 op2=7/>
363 ; PF2-NEXT: <INST_BINOP op0=7 op1=9 op2=8/>
364 ; PF2-NEXT: <INST_BINOP op0=8 op1=10 op2=9/>
365 ; PF2-NEXT: <INST_BINOP op0=9 op1=11 op2=10/>
366 ; PF2-NEXT: <INST_BINOP op0=10 op1=12 op2=11/>
367 ; PF2-NEXT: <INST_BINOP op0=11 op1=13 op2=12/>
368 ; PF2-NEXT: <INST_RET/>
369 ; PF2-NEXT: </FUNCTION_BLOCK>
370
371 ; ------------------------------------------------------
372
373 ; Show that we handle (non-special) bitcasts by converting pointer
374 ; casts to integer.
375 define void @TestCasts() {
376 %1 = alloca i8, i32 4, align 8
377 %2 = ptrtoint i8* %1 to i32
378
379 %3 = trunc i32 257 to i8
380 %4 = trunc i32 %2 to i8
381
382 %5 = zext i32 257 to i64
383 %6 = zext i32 %2 to i64
384
385 %7 = sext i32 -1 to i64
386 %8 = sext i32 %2 to i64
387
388 %9 = uitofp i32 1 to float
389 %10 = uitofp i32 %2 to float
390
391 %11 = sitofp i32 -1 to float
392 %12 = sitofp i32 %2 to float
393 ret void
394 }
395
396 ; TD2: define void @TestCasts() {
397 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
398 ; TD2-NEXT: %2 = trunc i32 257 to i8
399 ; TD2-NEXT: %3 = ptrtoint i8* %1 to i32
400 ; TD2-NEXT: %4 = trunc i32 %3 to i8
401 ; TD2-NEXT: %5 = zext i32 257 to i64
402 ; TD2-NEXT: %6 = zext i32 %3 to i64
403 ; TD2-NEXT: %7 = sext i32 -1 to i64
404 ; TD2-NEXT: %8 = sext i32 %3 to i64
405 ; TD2-NEXT: %9 = uitofp i32 1 to float
406 ; TD2-NEXT: %10 = uitofp i32 %3 to float
407 ; TD2-NEXT: %11 = sitofp i32 -1 to float
408 ; TD2-NEXT: %12 = sitofp i32 %3 to float
409 ; TD2-NEXT: ret void
410 ; TD2-NEXT: }
411
412 ; PF2: <FUNCTION_BLOCK>
413 ; PF2: </CONSTANTS_BLOCK>
414 ; PF2-NEXT: <INST_ALLOCA op0=2 op1=4/>
415 ; PF2-NEXT: <INST_CAST op0=5 op1={{.*}} op2=0/>
416 ; PF2-NEXT: <INST_CAST op0=2 op1={{.*}} op2=0/>
417 ; PF2-NEXT: <INST_CAST op0=7 op1={{.*}} op2=1/>
418 ; PF2-NEXT: <INST_CAST op0=4 op1={{.*}} op2=1/>
419 ; PF2-NEXT: <INST_CAST op0=8 op1={{.*}} op2=2/>
420 ; PF2-NEXT: <INST_CAST op0=6 op1={{.*}} op2=2/>
421 ; PF2-NEXT: <INST_CAST op0=8 op1={{.*}} op2=5/>
422 ; PF2-NEXT: <INST_CAST op0=8 op1={{.*}} op2=5/>
423 ; PF2-NEXT: <INST_CAST op0=12 op1={{.*}} op2=6/>
424 ; PF2-NEXT: <INST_CAST op0=10 op1={{.*}} op2=6/>
425 ; PF2-NEXT: <INST_RET/>
426 ; PF2-NEXT: </FUNCTION_BLOCK>
427
428 ; ------------------------------------------------------
429
430 ; Show that we elide a ptrtoint cast for a call.
431 define void @TestSavedPtrToInt() {
432 %1 = alloca i8, i32 4, align 8
433 %2 = ptrtoint i8* %1 to i32
434 %3 = add i32 %2, 0
435 %4 = call i32 @bar(i32 %2)
436 ret void
437 }
438
439 ; TD2: define void @TestSavedPtrToInt() {
440 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
441 ; TD2-NEXT: %2 = ptrtoint i8* %1 to i32
442 ; TD2-NEXT: %3 = add i32 %2, 0
443 ; TD2-NEXT: %4 = call i32 @bar(i32 %2)
444 ; TD2-NEXT: ret void
445 ; TD2-NEXT: }
446
447 ; PF2: <FUNCTION_BLOCK>
448 ; PF2: </CONSTANTS_BLOCK>
449 ; PF2-NEXT: <INST_ALLOCA op0=2 op1=4/>
450 ; PF2-NEXT: <INST_BINOP op0=1 op1=2 op2=0/>
451 ; PF2-NEXT: <INST_CALL op0=0 op1=25 op2=2/>
452 ; PF2-NEXT: <INST_RET/>
453 ; PF2-NEXT: </FUNCTION_BLOCK>
454
455 ; ------------------------------------------------------
456
457 ; Show that we can handle pointer conversions for icmp.
458 define void @CastIcmp() {
459 %1 = alloca i8, i32 4, align 8
460 %2 = ptrtoint i8* %1 to i32
461 %3 = ptrtoint [4 x i8]* @bytes to i32
462 %4 = icmp eq i32 1, 2
463 %5 = icmp eq i32 %2, 2
464 %6 = icmp eq i32 1, %3
465 %7 = icmp eq i32 %2, %3
466 %8 = icmp eq i32 %3, %2
467 ret void
468 }
469
470 ; TD2: define void @CastIcmp() {
471 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
472 ; TD2-NEXT: %2 = icmp eq i32 1, 2
473 ; TD2-NEXT: %3 = ptrtoint i8* %1 to i32
474 ; TD2-NEXT: %4 = icmp eq i32 %3, 2
475 ; TD2-NEXT: %5 = ptrtoint [4 x i8]* @bytes to i32
476 ; TD2-NEXT: %6 = icmp eq i32 1, %5
477 ; TD2-NEXT: %7 = icmp eq i32 %3, %5
478 ; TD2-NEXT: %8 = icmp eq i32 %5, %3
479 ; TD2-NEXT: ret void
480 ; TD2-NEXT: }
481
482 ; PF2: <FUNCTION_BLOCK>
483 ; PF2: </CONSTANTS_BLOCK>
484 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
485 ; PF2-NEXT: <INST_CMP2 op0=4 op1=3 op2=32/>
486 ; PF2-NEXT: <INST_CMP2 op0=2 op1=4 op2=32/>
487 ; PF2-NEXT: <INST_CMP2 op0=6 op1=7 op2=32/>
488 ; PF2-NEXT: <INST_CMP2 op0=4 op1=8 op2=32/>
489 ; PF2-NEXT: <INST_CMP2 op0=9 op1=5 op2=32/>
490 ; PF2-NEXT: <INST_RET/>
491 ; PF2-NEXT: </FUNCTION_BLOCK>
492
493 ; ------------------------------------------------------
494
495 ; Show that we can handle pointer conversions for Select.
496 define void @CastSelect() {
497 %1 = alloca i8, i32 4, align 8
498 %2 = ptrtoint i8* %1 to i32
499 %3 = ptrtoint [4 x i8]* @bytes to i32
500 %4 = select i1 true, i32 1, i32 2
501 %5 = select i1 true, i32 %2, i32 2
502 %6 = select i1 true, i32 1, i32 %3
503 %7 = select i1 true, i32 %2, i32 %3
504 %8 = select i1 true, i32 %3, i32 %2
505 ret void
506 }
507
508 ; TD2: define void @CastSelect() {
509 ; TD2-NEXT: %1 = alloca i8, i32 4, align 8
510 ; TD2-NEXT: %2 = select i1 true, i32 1, i32 2
511 ; TD2-NEXT: %3 = ptrtoint i8* %1 to i32
512 ; TD2-NEXT: %4 = select i1 true, i32 %3, i32 2
513 ; TD2-NEXT: %5 = ptrtoint [4 x i8]* @bytes to i32
514 ; TD2-NEXT: %6 = select i1 true, i32 1, i32 %5
515 ; TD2-NEXT: %7 = select i1 true, i32 %3, i32 %5
516 ; TD2-NEXT: %8 = select i1 true, i32 %5, i32 %3
517 ; TD2-NEXT: ret void
518 ; TD2-NEXT: }
519
520 ; PF2: <FUNCTION_BLOCK>
521 ; PF2: </CONSTANTS_BLOCK>
522 ; PF2-NEXT: <INST_ALLOCA op0=2 op1=4/>
523 ; PF2-NEXT: <INST_VSELECT op0=5 op1=4 op2=2/>
524 ; PF2-NEXT: <INST_VSELECT op0=2 op1=5 op2=3/>
525 ; PF2-NEXT: <INST_VSELECT op0=7 op1=8 op2=4/>
526 ; PF2-NEXT: <INST_VSELECT op0=4 op1=9 op2=5/>
527 ; PF2-NEXT: <INST_VSELECT op0=10 op1=5 op2=6/>
528 ; PF2-NEXT: <INST_RET/>
529 ; PF2-NEXT: </FUNCTION_BLOCK>
530
531 ; ------------------------------------------------------
532
533 ; Show that if a phi node refers to a pointer cast, we add
534 ; them at the end of the incoming block.
535 define void @PhiBackwardRefs(i1) {
536 %2 = alloca i8, i32 4, align 8
537 %3 = bitcast i8* %2 to i32*
538 %4 = alloca i8, i32 4, align 8
539 %5 = ptrtoint i8* %4 to i32
540 br i1 %0, label %true, label %false
541
542 true:
543 %6 = load i32* %3
544 br label %merge
545
546 false:
547 %7 = load i32* %3
548 br label %merge
549
550 merge:
551 %8 = phi i32 [%5, %true], [%5, %false]
552 %9 = phi i32 [%6, %true], [%7, %false]
553 ret void
554 }
555
556 ; TD2: define void @PhiBackwardRefs(i1) {
557 ; TD2-NEXT: %2 = alloca i8, i32 4, align 8
558 ; TD2-NEXT: %3 = alloca i8, i32 4, align 8
559 ; TD2-NEXT: br i1 %0, label %true, label %false
560 ; TD2: true:
561 ; TD2-NEXT: %4 = bitcast i8* %2 to i32*
562 ; TD2-NEXT: %5 = load i32* %4
563 ; TD2-NEXT: %6 = ptrtoint i8* %3 to i32
564 ; TD2-NEXT: br label %merge
565 ; TD2: false:
566 ; TD2-NEXT: %7 = bitcast i8* %2 to i32*
567 ; TD2-NEXT: %8 = load i32* %7
568 ; TD2-NEXT: %9 = ptrtoint i8* %3 to i32
569 ; TD2-NEXT: br label %merge
570 ; TD2: merge:
571 ; TD2-NEXT: %10 = phi i32 [ %6, %true ], [ %9, %false ]
572 ; TD2-NEXT: %11 = phi i32 [ %5, %true ], [ %8, %false ]
573 ; TD2-NEXT: ret void
574 ; TD2-NEXT: }
575
576 ; PF2: <FUNCTION_BLOCK>
577 ; PF2: </CONSTANTS_BLOCK>
578 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
579 ; PF2-NEXT: <INST_ALLOCA op0=2 op1=4/>
580 ; PF2-NEXT: <INST_BR op0=1 op1=2 op2=4/>
581 ; PF2-NEXT: <INST_LOAD op0=2 op1=0 op2=0/>
582 ; PF2-NEXT: <INST_BR op0=3/>
583 ; PF2-NEXT: <INST_LOAD op0=3 op1=0 op2=0/>
584 ; PF2-NEXT: <INST_BR op0=3/>
585 ; PF2-NEXT: <INST_PHI op0=0 op1=6 op2=1 op3=6 op4=2/>
586 ; PF2-NEXT: <INST_PHI op0=0 op1=6 op2=1 op3=4 op4=2/>
587 ; PF2-NEXT: <INST_RET/>
588 ; PF2: </FUNCTION_BLOCK>
589
590 ; ------------------------------------------------------
591
592 ; Like PhiBackwardRefs except the phi nodes forward reference
593 ; instructions instead of backwards references.
594 define void @PhiForwardRefs(i1) {
595 br label %start
596
597 merge:
598 %2 = phi i32 [%9, %true], [%9, %false]
599 %3 = phi i32 [%4, %true], [%5, %false]
600 ret void
601
602 true:
603 %4 = load i32* %7
604 br label %merge
605
606 false:
607 %5 = load i32* %7
608 br label %merge
609
610 start:
611 %6 = alloca i8, i32 4, align 8
612 %7 = bitcast i8* %6 to i32*
613 %8 = alloca i8, i32 4, align 8
614 %9 = ptrtoint i8* %8 to i32
615 br i1 %0, label %true, label %false
616 }
617
618 ; TD2: define void @PhiForwardRefs(i1) {
619 ; TD2-NEXT: br label %start
620 ; TD2: merge
621 ; TD2-NEXT: %2 = phi i32 [ %11, %true ], [ %11, %false ]
622 ; TD2-NEXT: %3 = phi i32 [ %5, %true ], [ %7, %false ]
623 ; TD2-NEXT: ret void
624 ; TD2: true:
625 ; TD2-NEXT: %4 = inttoptr i32 %9 to i32*
626 ; TD2-NEXT: %5 = load i32* %4
627 ; TD2-NEXT: br label %merge
628 ; TD2: false:
629 ; TD2-NEXT: %6 = inttoptr i32 %9 to i32*
630 ; TD2-NEXT: %7 = load i32* %6
631 ; TD2-NEXT: br label %merge
632 ; TD2: start:
633 ; TD2-NEXT: %8 = alloca i8, i32 4, align 8
634 ; TD2-NEXT: %9 = ptrtoint i8* %8 to i32
635 ; TD2-NEXT: %10 = alloca i8, i32 4, align 8
636 ; TD2-NEXT: %11 = ptrtoint i8* %10 to i32
637 ; TD2-NEXT: br i1 %0, label %true, label %false
638 ; TD2-NEXT: }
639
640 ; PF2: <FUNCTION_BLOCK>
641 ; PF2: </CONSTANTS_BLOCK>
642 ; PF2-NEXT: <INST_BR op0=4/>
643 ; PF2-NEXT: <FORWARDTYPEREF op0=28 op1=0/>
644 ; PF2-NEXT: <INST_PHI op0=0 op1=11 op2=2 op3=11 op4=3/>
645 ; PF2-NEXT: <FORWARDTYPEREF op0=25 op1=0/>
646 ; PF2-NEXT: <FORWARDTYPEREF op0=26 op1=0/>
647 ; PF2-NEXT: <INST_PHI op0=0 op1=3 op2=2 op3=5 op4=3/>
648 ; PF2-NEXT: <INST_RET/>
649 ; PF2-NEXT: <FORWARDTYPEREF op0=27 op1=0/>
650 ; PF2-NEXT: <INST_LOAD op0=4294967294 op1=0 op2=0/>
651 ; PF2-NEXT: <INST_BR op0=1/>
652 ; PF2-NEXT: <INST_LOAD op0=4294967295 op1=0 op2=0/>
653 ; PF2-NEXT: <INST_BR op0=1/>
654 ; PF2-NEXT: <INST_ALLOCA op0=5 op1=4/>
655 ; PF2-NEXT: <INST_ALLOCA op0=6 op1=4/>
656 ; PF2-NEXT: <INST_BR op0=2 op1=3 op2=8/>
657 ; PF2: </FUNCTION_BLOCK>
658
659 ; ------------------------------------------------------
660
661 ; Show that if a phi node incoming block already has a pointer cast,
662 ; we use it instead of adding one at the end of the block. In this
663 ; example, we reuse instruction %7 in block true for phi node %10.
664 define void @PhiMergeCast(i1) {
665 %2 = alloca i8, i32 4, align 8
666 %3 = bitcast i8* %2 to i32*
667 %4 = alloca i8, i32 4, align 8
668 %5 = ptrtoint i8* %4 to i32
669 br i1 %0, label %true, label %false
670
671 true:
672 %6 = load i32* %3
673 %7 = ptrtoint i8* %4 to i32
674 %8 = add i32 %6, %7
675 br label %merge
676
677 false:
678 %9 = load i32* %3
679 br label %merge
680
681 merge:
682 %10 = phi i32 [%5, %true], [%5, %false]
683 %11 = phi i32 [%6, %true], [%9, %false]
684 ret void
685 }
686
687 ; TD2: define void @PhiMergeCast(i1) {
688 ; TD2-NEXT: %2 = alloca i8, i32 4, align 8
689 ; TD2-NEXT: %3 = alloca i8, i32 4, align 8
690 ; TD2-NEXT: br i1 %0, label %true, label %false
691 ; TD2: true:
692 ; TD2-NEXT: %4 = bitcast i8* %2 to i32*
693 ; TD2-NEXT: %5 = load i32* %4
694 ; TD2-NEXT: %6 = ptrtoint i8* %3 to i32
695 ; TD2-NEXT: %7 = add i32 %5, %6
696 ; TD2-NEXT: br label %merge
697 ; TD2: false:
698 ; TD2-NEXT: %8 = bitcast i8* %2 to i32*
699 ; TD2-NEXT: %9 = load i32* %8
700 ; TD2-NEXT: %10 = ptrtoint i8* %3 to i32
701 ; TD2-NEXT: br label %merge
702 ; TD2: merge:
703 ; TD2-NEXT: %11 = phi i32 [ %6, %true ], [ %10, %false ]
704 ; TD2-NEXT: %12 = phi i32 [ %5, %true ], [ %9, %false ]
705 ; TD2-NEXT: ret void
706 ; TD2-NEXT: }
707
708 ; PF2: <FUNCTION_BLOCK>
709 ; PF2: </CONSTANTS_BLOCK>
710 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
711 ; PF2-NEXT: <INST_ALLOCA op0=2 op1=4/>
712 ; PF2-NEXT: <INST_BR op0=1 op1=2 op2=4/>
713 ; PF2-NEXT: <INST_LOAD op0=2 op1=0 op2=0/>
714 ; PF2-NEXT: <INST_BINOP op0=1 op1=2 op2=0/>
715 ; PF2-NEXT: <INST_BR op0=3/>
716 ; PF2-NEXT: <INST_LOAD op0=4 op1=0 op2=0/>
717 ; PF2-NEXT: <INST_BR op0=3/>
718 ; PF2-NEXT: <INST_PHI op0=0 op1=8 op2=1 op3=8 op4=2/>
719 ; PF2-NEXT: <INST_PHI op0=0 op1=8 op2=1 op3=4 op4=2/>
720 ; PF2-NEXT: <INST_RET/>
721 ; PF2: </FUNCTION_BLOCK>
722
723 ; ------------------------------------------------------
724
725 ; Show that we must introduce a cast reference for each
726 ; reachable block, but one is sufficient.
727 define void @LongReachingCasts(i1) {
728 %2 = alloca i8, i32 4, align 8
729 %3 = ptrtoint i8* %2 to i32
730 %4 = bitcast [4 x i8]* @bytes to i32*
731 br i1 %0, label %Split1, label %Split2
732
733 Split1:
734 br i1 %0, label %b1, label %b2
735
736 Split2:
737 br i1 %0, label %b3, label %b4
738
739 b1:
740 store i32 %3, i32* %4, align 1
741 store i32 %3, i32* %4, align 1
742 ret void
743
744 b2:
745 store i32 %3, i32* %4, align 1
746 store i32 %3, i32* %4, align 1
747 ret void
748
749 b3:
750 store i32 %3, i32* %4, align 1
751 store i32 %3, i32* %4, align 1
752 ret void
753
754 b4:
755 store i32 %3, i32* %4, align 1
756 store i32 %3, i32* %4, align 1
757 ret void
758 }
759
760 ; TD2: define void @LongReachingCasts(i1) {
761 ; TD2-NEXT: %2 = alloca i8, i32 4, align 8
762 ; TD2-NEXT: br i1 %0, label %Split1, label %Split2
763 ; TD2: Split1:
764 ; TD2-NEXT: br i1 %0, label %b1, label %b2
765 ; TD2: Split2:
766 ; TD2-NEXT: br i1 %0, label %b3, label %b4
767 ; TD2: b1:
768 ; TD2-NEXT: %3 = ptrtoint i8* %2 to i32
769 ; TD2-NEXT: %4 = bitcast [4 x i8]* @bytes to i32*
770 ; TD2-NEXT: store i32 %3, i32* %4, align 1
771 ; TD2-NEXT: store i32 %3, i32* %4, align 1
772 ; TD2-NEXT: ret void
773 ; TD2: b2:
774 ; TD2-NEXT: %5 = ptrtoint i8* %2 to i32
775 ; TD2-NEXT: %6 = bitcast [4 x i8]* @bytes to i32*
776 ; TD2-NEXT: store i32 %5, i32* %6, align 1
777 ; TD2-NEXT: store i32 %5, i32* %6, align 1
778 ; TD2-NEXT: ret void
779 ; TD2: b3:
780 ; TD2-NEXT: %7 = ptrtoint i8* %2 to i32
781 ; TD2-NEXT: %8 = bitcast [4 x i8]* @bytes to i32*
782 ; TD2-NEXT: store i32 %7, i32* %8, align 1
783 ; TD2-NEXT: store i32 %7, i32* %8, align 1
784 ; TD2-NEXT: ret void
785 ; TD2: b4:
786 ; TD2-NEXT: %9 = ptrtoint i8* %2 to i32
787 ; TD2-NEXT: %10 = bitcast [4 x i8]* @bytes to i32*
788 ; TD2-NEXT: store i32 %9, i32* %10, align 1
789 ; TD2-NEXT: store i32 %9, i32* %10, align 1
790 ; TD2-NEXT: ret void
791 ; TD2-NEXT: }
792
793 ; PF2: <FUNCTION_BLOCK>
794 ; PF2: </CONSTANTS_BLOCK>
795 ; PF2-NEXT: <INST_ALLOCA op0=1 op1=4/>
796 ; PF2-NEXT: <INST_BR op0=1 op1=2 op2=3/>
797 ; PF2-NEXT: <INST_BR op0=3 op1=4 op2=3/>
798 ; PF2-NEXT: <INST_BR op0=5 op1=6 op2=3/>
799 ; PF2-NEXT: <INST_STORE op0=4 op1=1 op2=1/>
800 ; PF2-NEXT: <INST_STORE op0=4 op1=1 op2=1/>
801 ; PF2-NEXT: <INST_RET/>
802 ; PF2-NEXT: <INST_STORE op0=4 op1=1 op2=1/>
803 ; PF2-NEXT: <INST_STORE op0=4 op1=1 op2=1/>
804 ; PF2-NEXT: <INST_RET/>
805 ; PF2-NEXT: <INST_STORE op0=4 op1=1 op2=1/>
806 ; PF2-NEXT: <INST_STORE op0=4 op1=1 op2=1/>
807 ; PF2-NEXT: <INST_RET/>
808 ; PF2-NEXT: <INST_STORE op0=4 op1=1 op2=1/>
809 ; PF2-NEXT: <INST_STORE op0=4 op1=1 op2=1/>
810 ; PF2-NEXT: <INST_RET/>
811 ; PF2: </FUNCTION_BLOCK>
OLDNEW
« no previous file with comments | « test/NaCl/Bitcode/pnacl-bcdis/vectorops.ll ('k') | test/NaCl/Bitcode/switch.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698