Mercurial > hg > CbC > CbC_llvm
comparison test/Transforms/InstCombine/sub.ll @ 95:afa8332a0e37 LLVM3.8
LLVM 3.8
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 Oct 2015 17:48:58 +0900 |
parents | 60c9769439b8 |
children | 1172e4bd9c6f |
comparison
equal
deleted
inserted
replaced
84:f3e34b893a5f | 95:afa8332a0e37 |
---|---|
214 ; CHECK: ret i1 %tmp5 | 214 ; CHECK: ret i1 %tmp5 |
215 } | 215 } |
216 | 216 |
217 ; rdar://7362831 | 217 ; rdar://7362831 |
218 define i32 @test23(i8* %P, i64 %A){ | 218 define i32 @test23(i8* %P, i64 %A){ |
219 %B = getelementptr inbounds i8* %P, i64 %A | 219 %B = getelementptr inbounds i8, i8* %P, i64 %A |
220 %C = ptrtoint i8* %B to i64 | 220 %C = ptrtoint i8* %B to i64 |
221 %D = trunc i64 %C to i32 | 221 %D = trunc i64 %C to i32 |
222 %E = ptrtoint i8* %P to i64 | 222 %E = ptrtoint i8* %P to i64 |
223 %F = trunc i64 %E to i32 | 223 %F = trunc i64 %E to i32 |
224 %G = sub i32 %D, %F | 224 %G = sub i32 %D, %F |
230 | 230 |
231 define i8 @test23_as1(i8 addrspace(1)* %P, i16 %A) { | 231 define i8 @test23_as1(i8 addrspace(1)* %P, i16 %A) { |
232 ; CHECK: @test23_as1 | 232 ; CHECK: @test23_as1 |
233 ; CHECK-NEXT: = trunc i16 %A to i8 | 233 ; CHECK-NEXT: = trunc i16 %A to i8 |
234 ; CHECK-NEXT: ret i8 | 234 ; CHECK-NEXT: ret i8 |
235 %B = getelementptr inbounds i8 addrspace(1)* %P, i16 %A | 235 %B = getelementptr inbounds i8, i8 addrspace(1)* %P, i16 %A |
236 %C = ptrtoint i8 addrspace(1)* %B to i16 | 236 %C = ptrtoint i8 addrspace(1)* %B to i16 |
237 %D = trunc i16 %C to i8 | 237 %D = trunc i16 %C to i8 |
238 %E = ptrtoint i8 addrspace(1)* %P to i16 | 238 %E = ptrtoint i8 addrspace(1)* %P to i16 |
239 %F = trunc i16 %E to i8 | 239 %F = trunc i16 %E to i8 |
240 %G = sub i8 %D, %F | 240 %G = sub i8 %D, %F |
241 ret i8 %G | 241 ret i8 %G |
242 } | 242 } |
243 | 243 |
244 define i64 @test24(i8* %P, i64 %A){ | 244 define i64 @test24(i8* %P, i64 %A){ |
245 %B = getelementptr inbounds i8* %P, i64 %A | 245 %B = getelementptr inbounds i8, i8* %P, i64 %A |
246 %C = ptrtoint i8* %B to i64 | 246 %C = ptrtoint i8* %B to i64 |
247 %E = ptrtoint i8* %P to i64 | 247 %E = ptrtoint i8* %P to i64 |
248 %G = sub i64 %C, %E | 248 %G = sub i64 %C, %E |
249 ret i64 %G | 249 ret i64 %G |
250 ; CHECK-LABEL: @test24( | 250 ; CHECK-LABEL: @test24( |
252 } | 252 } |
253 | 253 |
254 define i16 @test24_as1(i8 addrspace(1)* %P, i16 %A) { | 254 define i16 @test24_as1(i8 addrspace(1)* %P, i16 %A) { |
255 ; CHECK: @test24_as1 | 255 ; CHECK: @test24_as1 |
256 ; CHECK-NEXT: ret i16 %A | 256 ; CHECK-NEXT: ret i16 %A |
257 %B = getelementptr inbounds i8 addrspace(1)* %P, i16 %A | 257 %B = getelementptr inbounds i8, i8 addrspace(1)* %P, i16 %A |
258 %C = ptrtoint i8 addrspace(1)* %B to i16 | 258 %C = ptrtoint i8 addrspace(1)* %B to i16 |
259 %E = ptrtoint i8 addrspace(1)* %P to i16 | 259 %E = ptrtoint i8 addrspace(1)* %P to i16 |
260 %G = sub i16 %C, %E | 260 %G = sub i16 %C, %E |
261 ret i16 %G | 261 ret i16 %G |
262 } | 262 } |
263 | 263 |
264 define i64 @test24a(i8* %P, i64 %A){ | 264 define i64 @test24a(i8* %P, i64 %A){ |
265 %B = getelementptr inbounds i8* %P, i64 %A | 265 %B = getelementptr inbounds i8, i8* %P, i64 %A |
266 %C = ptrtoint i8* %B to i64 | 266 %C = ptrtoint i8* %B to i64 |
267 %E = ptrtoint i8* %P to i64 | 267 %E = ptrtoint i8* %P to i64 |
268 %G = sub i64 %E, %C | 268 %G = sub i64 %E, %C |
269 ret i64 %G | 269 ret i64 %G |
270 ; CHECK-LABEL: @test24a( | 270 ; CHECK-LABEL: @test24a( |
274 | 274 |
275 define i16 @test24a_as1(i8 addrspace(1)* %P, i16 %A) { | 275 define i16 @test24a_as1(i8 addrspace(1)* %P, i16 %A) { |
276 ; CHECK: @test24a_as1 | 276 ; CHECK: @test24a_as1 |
277 ; CHECK-NEXT: sub i16 0, %A | 277 ; CHECK-NEXT: sub i16 0, %A |
278 ; CHECK-NEXT: ret i16 | 278 ; CHECK-NEXT: ret i16 |
279 %B = getelementptr inbounds i8 addrspace(1)* %P, i16 %A | 279 %B = getelementptr inbounds i8, i8 addrspace(1)* %P, i16 %A |
280 %C = ptrtoint i8 addrspace(1)* %B to i16 | 280 %C = ptrtoint i8 addrspace(1)* %B to i16 |
281 %E = ptrtoint i8 addrspace(1)* %P to i16 | 281 %E = ptrtoint i8 addrspace(1)* %P to i16 |
282 %G = sub i16 %E, %C | 282 %G = sub i16 %E, %C |
283 ret i16 %G | 283 ret i16 %G |
284 } | 284 } |
285 | 285 |
286 | 286 |
287 @Arr = external global [42 x i16] | 287 @Arr = external global [42 x i16] |
288 | 288 |
289 define i64 @test24b(i8* %P, i64 %A){ | 289 define i64 @test24b(i8* %P, i64 %A){ |
290 %B = getelementptr inbounds [42 x i16]* @Arr, i64 0, i64 %A | 290 %B = getelementptr inbounds [42 x i16], [42 x i16]* @Arr, i64 0, i64 %A |
291 %C = ptrtoint i16* %B to i64 | 291 %C = ptrtoint i16* %B to i64 |
292 %G = sub i64 %C, ptrtoint ([42 x i16]* @Arr to i64) | 292 %G = sub i64 %C, ptrtoint ([42 x i16]* @Arr to i64) |
293 ret i64 %G | 293 ret i64 %G |
294 ; CHECK-LABEL: @test24b( | 294 ; CHECK-LABEL: @test24b( |
295 ; CHECK-NEXT: shl nuw i64 %A, 1 | 295 ; CHECK-NEXT: shl nuw i64 %A, 1 |
296 ; CHECK-NEXT: ret i64 | 296 ; CHECK-NEXT: ret i64 |
297 } | 297 } |
298 | 298 |
299 | 299 |
300 define i64 @test25(i8* %P, i64 %A){ | 300 define i64 @test25(i8* %P, i64 %A){ |
301 %B = getelementptr inbounds [42 x i16]* @Arr, i64 0, i64 %A | 301 %B = getelementptr inbounds [42 x i16], [42 x i16]* @Arr, i64 0, i64 %A |
302 %C = ptrtoint i16* %B to i64 | 302 %C = ptrtoint i16* %B to i64 |
303 %G = sub i64 %C, ptrtoint (i16* getelementptr ([42 x i16]* @Arr, i64 1, i64 0) to i64) | 303 %G = sub i64 %C, ptrtoint (i16* getelementptr ([42 x i16], [42 x i16]* @Arr, i64 1, i64 0) to i64) |
304 ret i64 %G | 304 ret i64 %G |
305 ; CHECK-LABEL: @test25( | 305 ; CHECK-LABEL: @test25( |
306 ; CHECK-NEXT: shl nuw i64 %A, 1 | 306 ; CHECK-NEXT: shl nuw i64 %A, 1 |
307 ; CHECK-NEXT: add i64 {{.*}}, -84 | 307 ; CHECK-NEXT: add i64 {{.*}}, -84 |
308 ; CHECK-NEXT: ret i64 | 308 ; CHECK-NEXT: ret i64 |
314 ; CHECK: @test25_as1 | 314 ; CHECK: @test25_as1 |
315 ; CHECK-NEXT: %1 = trunc i64 %A to i16 | 315 ; CHECK-NEXT: %1 = trunc i64 %A to i16 |
316 ; CHECK-NEXT: shl nuw i16 %1, 1 | 316 ; CHECK-NEXT: shl nuw i16 %1, 1 |
317 ; CHECK-NEXT: add i16 {{.*}}, -84 | 317 ; CHECK-NEXT: add i16 {{.*}}, -84 |
318 ; CHECK-NEXT: ret i16 | 318 ; CHECK-NEXT: ret i16 |
319 %B = getelementptr inbounds [42 x i16] addrspace(1)* @Arr_as1, i64 0, i64 %A | 319 %B = getelementptr inbounds [42 x i16], [42 x i16] addrspace(1)* @Arr_as1, i64 0, i64 %A |
320 %C = ptrtoint i16 addrspace(1)* %B to i16 | 320 %C = ptrtoint i16 addrspace(1)* %B to i16 |
321 %G = sub i16 %C, ptrtoint (i16 addrspace(1)* getelementptr ([42 x i16] addrspace(1)* @Arr_as1, i64 1, i64 0) to i16) | 321 %G = sub i16 %C, ptrtoint (i16 addrspace(1)* getelementptr ([42 x i16], [42 x i16] addrspace(1)* @Arr_as1, i64 1, i64 0) to i16) |
322 ret i16 %G | 322 ret i16 %G |
323 } | 323 } |
324 | 324 |
325 define i32 @test26(i32 %x) { | 325 define i32 @test26(i32 %x) { |
326 %shl = shl i32 3, %x | 326 %shl = shl i32 3, %x |
351 ; CHECK-NEXT: add i32 | 351 ; CHECK-NEXT: add i32 |
352 ; CHECK-NEXT: ret i32 | 352 ; CHECK-NEXT: ret i32 |
353 } | 353 } |
354 | 354 |
355 define i64 @test29(i8* %foo, i64 %i, i64 %j) { | 355 define i64 @test29(i8* %foo, i64 %i, i64 %j) { |
356 %gep1 = getelementptr inbounds i8* %foo, i64 %i | 356 %gep1 = getelementptr inbounds i8, i8* %foo, i64 %i |
357 %gep2 = getelementptr inbounds i8* %foo, i64 %j | 357 %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j |
358 %cast1 = ptrtoint i8* %gep1 to i64 | 358 %cast1 = ptrtoint i8* %gep1 to i64 |
359 %cast2 = ptrtoint i8* %gep2 to i64 | 359 %cast2 = ptrtoint i8* %gep2 to i64 |
360 %sub = sub i64 %cast1, %cast2 | 360 %sub = sub i64 %cast1, %cast2 |
361 ret i64 %sub | 361 ret i64 %sub |
362 ; CHECK-LABEL: @test29( | 362 ; CHECK-LABEL: @test29( |
364 ; CHECK-NEXT: ret i64 | 364 ; CHECK-NEXT: ret i64 |
365 } | 365 } |
366 | 366 |
367 define i64 @test30(i8* %foo, i64 %i, i64 %j) { | 367 define i64 @test30(i8* %foo, i64 %i, i64 %j) { |
368 %bit = bitcast i8* %foo to i32* | 368 %bit = bitcast i8* %foo to i32* |
369 %gep1 = getelementptr inbounds i32* %bit, i64 %i | 369 %gep1 = getelementptr inbounds i32, i32* %bit, i64 %i |
370 %gep2 = getelementptr inbounds i8* %foo, i64 %j | 370 %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j |
371 %cast1 = ptrtoint i32* %gep1 to i64 | 371 %cast1 = ptrtoint i32* %gep1 to i64 |
372 %cast2 = ptrtoint i8* %gep2 to i64 | 372 %cast2 = ptrtoint i8* %gep2 to i64 |
373 %sub = sub i64 %cast1, %cast2 | 373 %sub = sub i64 %cast1, %cast2 |
374 ret i64 %sub | 374 ret i64 %sub |
375 ; CHECK-LABEL: @test30( | 375 ; CHECK-LABEL: @test30( |
382 ; CHECK-LABEL: @test30_as1( | 382 ; CHECK-LABEL: @test30_as1( |
383 ; CHECK-NEXT: %gep1.idx = shl nuw i16 %i, 2 | 383 ; CHECK-NEXT: %gep1.idx = shl nuw i16 %i, 2 |
384 ; CHECK-NEXT: sub i16 %gep1.idx, %j | 384 ; CHECK-NEXT: sub i16 %gep1.idx, %j |
385 ; CHECK-NEXT: ret i16 | 385 ; CHECK-NEXT: ret i16 |
386 %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)* | 386 %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)* |
387 %gep1 = getelementptr inbounds i32 addrspace(1)* %bit, i16 %i | 387 %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i16 %i |
388 %gep2 = getelementptr inbounds i8 addrspace(1)* %foo, i16 %j | 388 %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i16 %j |
389 %cast1 = ptrtoint i32 addrspace(1)* %gep1 to i16 | 389 %cast1 = ptrtoint i32 addrspace(1)* %gep1 to i16 |
390 %cast2 = ptrtoint i8 addrspace(1)* %gep2 to i16 | 390 %cast2 = ptrtoint i8 addrspace(1)* %gep2 to i16 |
391 %sub = sub i16 %cast1, %cast2 | 391 %sub = sub i16 %cast1, %cast2 |
392 ret i16 %sub | 392 ret i16 %sub |
393 } | 393 } |
548 ; CHECK-LABEL: @test46( | 548 ; CHECK-LABEL: @test46( |
549 ; CHECK-NEXT: %x.not = xor i32 %x, -1 | 549 ; CHECK-NEXT: %x.not = xor i32 %x, -1 |
550 ; CHECK-NEXT: %sub = and i32 %y, %x.not | 550 ; CHECK-NEXT: %sub = and i32 %y, %x.not |
551 ; CHECK: ret i32 %sub | 551 ; CHECK: ret i32 %sub |
552 } | 552 } |
553 | |
554 define i32 @test47(i1 %A, i32 %B, i32 %C, i32 %D) { | |
555 %sel0 = select i1 %A, i32 %D, i32 %B | |
556 %sel1 = select i1 %A, i32 %C, i32 %B | |
557 %sub = sub i32 %sel0, %sel1 | |
558 ret i32 %sub | |
559 ; CHECK-LABEL: @test47( | |
560 ; CHECK-NEXT: %[[sub:.*]] = sub i32 %D, %C | |
561 ; CHECK-NEXT: %[[sel:.*]] = select i1 %A, i32 %[[sub]], i32 0 | |
562 ; CHECK-NEXT: ret i32 %[[sel]] | |
563 } | |
564 | |
565 define i32 @test48(i1 %A, i32 %B, i32 %C, i32 %D) { | |
566 %sel0 = select i1 %A, i32 %B, i32 %D | |
567 %sel1 = select i1 %A, i32 %B, i32 %C | |
568 %sub = sub i32 %sel0, %sel1 | |
569 ret i32 %sub | |
570 ; CHECK-LABEL: @test48( | |
571 ; CHECK-NEXT: %[[sub:.*]] = sub i32 %D, %C | |
572 ; CHECK-NEXT: %[[sel:.*]] = select i1 %A, i32 0, i32 %[[sub]] | |
573 ; CHECK-NEXT: ret i32 %[[sel]] | |
574 } |