@@ -3491,3 +3491,210 @@ define i1 @and_icmp_eq_with_binary_range_operands(i8 range(i8 0, 2) %x, i8 range
3491
3491
%ret = and i1 %icmp1 , %icmp2
3492
3492
ret i1 %ret
3493
3493
}
3494
+
3495
+ define i1 @or_icmp_eq_and_pow2 (i32 %x ) {
3496
+ ; CHECK-LABEL: @or_icmp_eq_and_pow2(
3497
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3498
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3499
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3500
+ ; CHECK-NEXT: [[RET:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3501
+ ; CHECK-NEXT: ret i1 [[RET]]
3502
+ ;
3503
+ %icmp1 = icmp eq i32 %x , 127
3504
+ %and = and i32 %x , -32
3505
+ %icmp2 = icmp eq i32 %and , 128
3506
+ %ret = or i1 %icmp1 , %icmp2
3507
+ ret i1 %ret
3508
+ }
3509
+
3510
+ define i1 @or_icmp_eq_and_pow2_mask_equal_to_icmp (i32 %x ) {
3511
+ ; CHECK-LABEL: @or_icmp_eq_and_pow2_mask_equal_to_icmp(
3512
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 63
3513
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -64
3514
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 64
3515
+ ; CHECK-NEXT: [[RET:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3516
+ ; CHECK-NEXT: ret i1 [[RET]]
3517
+ ;
3518
+ %icmp1 = icmp eq i32 %x , 63
3519
+ %and = and i32 %x , -64
3520
+ %icmp2 = icmp eq i32 %and , 64
3521
+ %ret = or i1 %icmp1 , %icmp2
3522
+ ret i1 %ret
3523
+ }
3524
+
3525
+ define i1 @and_icmp_ne_and_pow2 (i32 %x ) {
3526
+ ; CHECK-LABEL: @and_icmp_ne_and_pow2(
3527
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[X:%.*]], 127
3528
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3529
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[AND]], 128
3530
+ ; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3531
+ ; CHECK-NEXT: ret i1 [[RET]]
3532
+ ;
3533
+ %icmp1 = icmp ne i32 %x , 127
3534
+ %and = and i32 %x , -32
3535
+ %icmp2 = icmp ne i32 %and , 128
3536
+ %ret = and i1 %icmp1 , %icmp2
3537
+ ret i1 %ret
3538
+ }
3539
+
3540
+ define i1 @and_icmp_ne_and_pow2_mask_equal_to_icmp (i32 %x ) {
3541
+ ; CHECK-LABEL: @and_icmp_ne_and_pow2_mask_equal_to_icmp(
3542
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[X:%.*]], 63
3543
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -64
3544
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[AND]], 64
3545
+ ; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3546
+ ; CHECK-NEXT: ret i1 [[RET]]
3547
+ ;
3548
+ %icmp1 = icmp ne i32 %x , 63
3549
+ %and = and i32 %x , -64
3550
+ %icmp2 = icmp ne i32 %and , 64
3551
+ %ret = and i1 %icmp1 , %icmp2
3552
+ ret i1 %ret
3553
+ }
3554
+
3555
+ define i1 @or_icmp_eq_and_pow2_commute (i32 %x ) {
3556
+ ; CHECK-LABEL: @or_icmp_eq_and_pow2_commute(
3557
+ ; CHECK-NEXT: [[ICMP1:%.*]] = and i32 [[X:%.*]], -32
3558
+ ; CHECK-NEXT: [[AND:%.*]] = icmp eq i32 [[ICMP1]], 128
3559
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[X]], 127
3560
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[AND]], [[ICMP2]]
3561
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3562
+ ;
3563
+ %and = and i32 %x , -32
3564
+ %icmp1 = icmp eq i32 %and , 128
3565
+ %icmp2 = icmp eq i32 %x , 127
3566
+ %ret = or i1 %icmp1 , %icmp2
3567
+ ret i1 %ret
3568
+ }
3569
+
3570
+ define i1 @and_icmp_ne_and_pow2_commute (i32 %x ) {
3571
+ ; CHECK-LABEL: @and_icmp_ne_and_pow2_commute(
3572
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], -32
3573
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[AND]], 128
3574
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[X]], 127
3575
+ ; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3576
+ ; CHECK-NEXT: ret i1 [[RET]]
3577
+ ;
3578
+ %and = and i32 %x , -32
3579
+ %icmp1 = icmp ne i32 %and , 128
3580
+ %icmp2 = icmp ne i32 %x , 127
3581
+ %ret = and i1 %icmp1 , %icmp2
3582
+ ret i1 %ret
3583
+ }
3584
+
3585
+ define i1 @neg_or_icmp_eq_and_pow2_multi_use (i32 %x ) {
3586
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_multi_use(
3587
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3588
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3589
+ ; CHECK-NEXT: call void @use32(i32 [[AND]])
3590
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3591
+ ; CHECK-NEXT: [[RET:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3592
+ ; CHECK-NEXT: ret i1 [[RET]]
3593
+ ;
3594
+ %icmp1 = icmp eq i32 %x , 127
3595
+ %and = and i32 %x , -32
3596
+ call void @use32 (i32 %and )
3597
+ %icmp2 = icmp eq i32 %and , 128
3598
+ %ret = or i1 %icmp1 , %icmp2
3599
+ ret i1 %ret
3600
+ }
3601
+
3602
+ define i1 @neg_and_icmp_eq_and_pow2 (i32 %x ) {
3603
+ ; CHECK-LABEL: @neg_and_icmp_eq_and_pow2(
3604
+ ; CHECK-NEXT: ret i1 false
3605
+ ;
3606
+ %icmp1 = icmp eq i32 %x , 127
3607
+ %and = and i32 %x , -32
3608
+ %icmp2 = icmp eq i32 %and , 128
3609
+ %ret = and i1 %icmp1 , %icmp2
3610
+ ret i1 %ret
3611
+ }
3612
+
3613
+ define i1 @neg_or_icmp_eq_and_non_pow2_mask (i32 %x ) {
3614
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_non_pow2_mask(
3615
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3616
+ ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X]], -33
3617
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 128
3618
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3619
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3620
+ ;
3621
+ %icmp1 = icmp eq i32 %x , 127
3622
+ %and = and i32 %x , -33
3623
+ %icmp2 = icmp eq i32 %and , 128
3624
+ %ret = or i1 %icmp1 , %icmp2
3625
+ ret i1 %ret
3626
+ }
3627
+
3628
+ define i1 @neg_and_icmp_ne_and_non_pow2_icmp (i32 %x ) {
3629
+ ; CHECK-LABEL: @neg_and_icmp_ne_and_non_pow2_icmp(
3630
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[X:%.*]], 127
3631
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -33
3632
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[AND]], 128
3633
+ ; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3634
+ ; CHECK-NEXT: ret i1 [[RET]]
3635
+ ;
3636
+ %icmp1 = icmp ne i32 %x , 127
3637
+ %and = and i32 %x , -33
3638
+ %icmp2 = icmp ne i32 %and , 128
3639
+ %ret = and i1 %icmp1 , %icmp2
3640
+ ret i1 %ret
3641
+ }
3642
+
3643
+ define i1 @neg_or_icmp_eq_and_const_less_than_mask (i32 %x ) {
3644
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_const_less_than_mask(
3645
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 15
3646
+ ; CHECK-NEXT: ret i1 [[TMP1]]
3647
+ ;
3648
+ %icmp1 = icmp eq i32 %x , 15
3649
+ %and = and i32 %x , -32
3650
+ %icmp2 = icmp eq i32 %and , 16
3651
+ %ret = or i1 %icmp1 , %icmp2
3652
+ ret i1 %ret
3653
+ }
3654
+
3655
+ define i1 @neg_and_icmp_ne_and_pow2_disjoint (i32 %x ) {
3656
+ ; CHECK-LABEL: @neg_and_icmp_ne_and_pow2_disjoint(
3657
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[X:%.*]], 126
3658
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3659
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[AND]], 128
3660
+ ; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3661
+ ; CHECK-NEXT: ret i1 [[RET]]
3662
+ ;
3663
+ %icmp1 = icmp ne i32 %x , 126
3664
+ %and = and i32 %x , -32
3665
+ %icmp2 = icmp ne i32 %and , 128
3666
+ %ret = and i1 %icmp1 , %icmp2
3667
+ ret i1 %ret
3668
+ }
3669
+
3670
+ define i1 @neg_or_icmp_eq_double_and_pow2 (i32 %x ) {
3671
+ ; CHECK-LABEL: @neg_or_icmp_eq_double_and_pow2(
3672
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -16
3673
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 64
3674
+ ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], -32
3675
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[AND2]], 128
3676
+ ; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP2]], [[TMP4]]
3677
+ ; CHECK-NEXT: ret i1 [[TMP5]]
3678
+ ;
3679
+ %and1 = and i32 %x , -16
3680
+ %icmp1 = icmp eq i32 %and1 , 64
3681
+ %and2 = and i32 %x , -32
3682
+ %icmp2 = icmp eq i32 %and2 , 128
3683
+ %ret = or i1 %icmp1 , %icmp2
3684
+ ret i1 %ret
3685
+ }
3686
+
3687
+ define i1 @neg_select_icmp_eq_and_pow2 (i32 %x ) {
3688
+ ; CHECK-LABEL: @neg_select_icmp_eq_and_pow2(
3689
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp sgt i32 [[X:%.*]], 127
3690
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3691
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3692
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3693
+ ; CHECK-NEXT: ret i1 [[TMP1]]
3694
+ ;
3695
+ %icmp1 = icmp sgt i32 %x , 127
3696
+ %and = and i32 %x , -32
3697
+ %icmp2 = icmp eq i32 %and , 128
3698
+ %1 = select i1 %icmp1 , i1 %icmp2 , i1 false
3699
+ ret i1 %1
3700
+ }
0 commit comments