@@ -343,5 +343,131 @@ exit:
343
343
ret i8 %or2
344
344
}
345
345
346
+ define i32 @test_icmp_trunc1 (i32 %x ){
347
+ ; CHECK-LABEL: @test_icmp_trunc1(
348
+ ; CHECK-NEXT: entry:
349
+ ; CHECK-NEXT: [[Y:%.*]] = trunc i32 [[X:%.*]] to i16
350
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[Y]], 7
351
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
352
+ ; CHECK: then:
353
+ ; CHECK-NEXT: [[Z:%.*]] = and i32 [[X]], 15
354
+ ; CHECK-NEXT: ret i32 [[Z]]
355
+ ; CHECK: else:
356
+ ; CHECK-NEXT: ret i32 0
357
+ ;
358
+ entry:
359
+ %y = trunc i32 %x to i16
360
+ %cmp = icmp eq i16 %y , 7
361
+ br i1 %cmp , label %then , label %else
362
+ then:
363
+ %z = and i32 %x , 15
364
+ ret i32 %z
365
+ else:
366
+ ret i32 0
367
+ }
368
+
369
+ define i64 @test_icmp_trunc2 (i64 %x ) {
370
+ ; CHECK-LABEL: @test_icmp_trunc2(
371
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[X:%.*]] to i32
372
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], 12
373
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
374
+ ; CHECK: if.then:
375
+ ; CHECK-NEXT: [[SEXT:%.*]] = shl i64 [[X]], 32
376
+ ; CHECK-NEXT: [[RET:%.*]] = ashr exact i64 [[SEXT]], 32
377
+ ; CHECK-NEXT: ret i64 [[RET]]
378
+ ; CHECK: if.else:
379
+ ; CHECK-NEXT: ret i64 0
380
+ ;
381
+ %conv = trunc i64 %x to i32
382
+ %cmp = icmp sgt i32 %conv , 12
383
+ br i1 %cmp , label %if.then , label %if.else
384
+
385
+ if.then:
386
+ %sext = shl i64 %x , 32
387
+ %ret = ashr exact i64 %sext , 32
388
+ ret i64 %ret
389
+ if.else:
390
+ ret i64 0
391
+ }
392
+
393
+ define i64 @test_icmp_trunc3 (i64 %n ) {
394
+ ; CHECK-LABEL: @test_icmp_trunc3(
395
+ ; CHECK-NEXT: entry:
396
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32
397
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 96
398
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
399
+ ; CHECK: if.then:
400
+ ; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 4294967295
401
+ ; CHECK-NEXT: ret i64 [[RET]]
402
+ ; CHECK: if.else:
403
+ ; CHECK-NEXT: ret i64 0
404
+ ;
405
+ entry:
406
+ %conv = trunc i64 %n to i32
407
+ %cmp = icmp ult i32 %conv , 96
408
+ br i1 %cmp , label %if.then , label %if.else
409
+
410
+ if.then:
411
+ %ret = and i64 %n , 4294967295
412
+ ret i64 %ret
413
+
414
+ if.else:
415
+ ret i64 0
416
+ }
417
+
418
+ define i8 @test_icmp_trunc4 (i64 %n ) {
419
+ ; CHECK-LABEL: @test_icmp_trunc4(
420
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32
421
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 10
422
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
423
+ ; CHECK: if.then:
424
+ ; CHECK-NEXT: [[CONV2:%.*]] = trunc i64 [[N]] to i8
425
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[CONV2]], 48
426
+ ; CHECK-NEXT: ret i8 [[ADD]]
427
+ ; CHECK: if.else:
428
+ ; CHECK-NEXT: ret i8 0
429
+ ;
430
+ %conv = trunc i64 %n to i32
431
+ %cmp = icmp ult i32 %conv , 10
432
+ br i1 %cmp , label %if.then , label %if.else
433
+
434
+ if.then:
435
+ %conv2 = trunc i64 %n to i8
436
+ %add = add i8 %conv2 , 48
437
+ ret i8 %add
438
+
439
+ if.else:
440
+ ret i8 0
441
+ }
442
+
443
+ define i64 @test_icmp_trunc5 (i64 %n ) {
444
+ ; CHECK-LABEL: @test_icmp_trunc5(
445
+ ; CHECK-NEXT: entry:
446
+ ; CHECK-NEXT: [[SHR:%.*]] = ashr i64 [[N:%.*]], 47
447
+ ; CHECK-NEXT: [[CONV1:%.*]] = trunc i64 [[SHR]] to i32
448
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CONV1]], -13
449
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
450
+ ; CHECK: if.then:
451
+ ; CHECK-NEXT: [[AND:%.*]] = and i64 [[SHR]], 4294967295
452
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[AND]], 4294967295
453
+ ; CHECK-NEXT: ret i64 [[NOT]]
454
+ ; CHECK: if.else:
455
+ ; CHECK-NEXT: ret i64 13
456
+ ;
457
+ entry:
458
+ %shr = ashr i64 %n , 47
459
+ %conv1 = trunc i64 %shr to i32
460
+ %cmp = icmp ugt i32 %conv1 , -13
461
+ br i1 %cmp , label %if.then , label %if.else
462
+
463
+ if.then:
464
+ %and = and i64 %shr , 4294967295
465
+ %not = xor i64 %and , 4294967295
466
+ ret i64 %not
467
+
468
+ if.else:
469
+ ret i64 13
470
+ }
471
+
346
472
declare void @use (i1 )
347
473
declare void @sink (i8 )
0 commit comments