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 }