@@ -3491,3 +3491,192 @@ 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_1 (i32 %x ) {
3496
+ ; CHECK-LABEL: @or_icmp_eq_and_pow2_1(
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: [[TMP4:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3501
+ ; CHECK-NEXT: ret i1 [[TMP4]]
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_2 (i32 %x ) {
3511
+ ; CHECK-LABEL: @or_icmp_eq_and_pow2_2(
3512
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 31
3513
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3514
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 32
3515
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3516
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3517
+ ;
3518
+ %icmp1 = icmp eq i32 %x , 31
3519
+ %and = and i32 %x , -32
3520
+ %icmp2 = icmp eq i32 %and , 32
3521
+ %ret = or i1 %icmp1 , %icmp2
3522
+ ret i1 %ret
3523
+ }
3524
+
3525
+ define i1 @or_icmp_eq_and_pow2_3 (i32 %x ) {
3526
+ ; CHECK-LABEL: @or_icmp_eq_and_pow2_3(
3527
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3528
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -64
3529
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3530
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3531
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3532
+ ;
3533
+ %icmp1 = icmp eq i32 %x , 127
3534
+ %and = and i32 %x , -64
3535
+ %icmp2 = icmp eq i32 %and , 128
3536
+ %ret = or i1 %icmp1 , %icmp2
3537
+ ret i1 %ret
3538
+ }
3539
+
3540
+ define i1 @or_icmp_eq_and_pow2_commute (i32 %x ) {
3541
+ ; CHECK-LABEL: @or_icmp_eq_and_pow2_commute(
3542
+ ; CHECK-NEXT: [[ICMP1:%.*]] = and i32 [[X:%.*]], -32
3543
+ ; CHECK-NEXT: [[AND:%.*]] = icmp eq i32 [[ICMP1]], 128
3544
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[X]], 127
3545
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[AND]], [[ICMP2]]
3546
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3547
+ ;
3548
+ %icmp1 = and i32 %x , -32
3549
+ %and = icmp eq i32 %icmp1 , 128
3550
+ %icmp2 = icmp eq i32 %x , 127
3551
+ %ret = or i1 %and , %icmp2
3552
+ ret i1 %ret
3553
+ }
3554
+
3555
+ define i1 @neg_or_icmp_eq_and_pow2_multi_use (i32 %x ) {
3556
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_multi_use(
3557
+ ; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3558
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3559
+ ; CHECK-NEXT: call void @use32(i32 [[AND]])
3560
+ ; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3561
+ ; CHECK-NEXT: [[RET:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3562
+ ; CHECK-NEXT: ret i1 [[RET]]
3563
+ ;
3564
+ %icmp1 = icmp eq i32 %x , 127
3565
+ %and = and i32 %x , -32
3566
+ call void @use32 (i32 %and )
3567
+ %icmp2 = icmp eq i32 %and , 128
3568
+ %ret = or i1 %icmp1 , %icmp2
3569
+ ret i1 %ret
3570
+ }
3571
+
3572
+ define i1 @neg_and_icmp_eq_and_pow2 (i32 %x ) {
3573
+ ; CHECK-LABEL: @neg_and_icmp_eq_and_pow2(
3574
+ ; CHECK-NEXT: ret i1 false
3575
+ ;
3576
+ %icmp1 = icmp eq i32 %x , 127
3577
+ %and = and i32 %x , -32
3578
+ %icmp2 = icmp eq i32 %and , 128
3579
+ %ret = and i1 %icmp1 , %icmp2
3580
+ ret i1 %ret
3581
+ }
3582
+
3583
+ define i1 @neg_or_icmp_eq_and_non_pow2_mask (i32 %x ) {
3584
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_non_pow2_mask(
3585
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3586
+ ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X]], -33
3587
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 128
3588
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3589
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3590
+ ;
3591
+ %icmp1 = icmp eq i32 %x , 127
3592
+ %and = and i32 %x , -33
3593
+ %icmp2 = icmp eq i32 %and , 128
3594
+ %ret = or i1 %icmp1 , %icmp2
3595
+ ret i1 %ret
3596
+ }
3597
+
3598
+ define i1 @neg_or_icmp_eq_and_non_pow2_icmp (i32 %x ) {
3599
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_non_pow2_icmp(
3600
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3601
+ ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X]], -33
3602
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 128
3603
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3604
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3605
+ ;
3606
+ %icmp1 = icmp eq i32 %x , 127
3607
+ %and = and i32 %x , -33
3608
+ %icmp2 = icmp eq i32 %and , 128
3609
+ %ret = or i1 %icmp1 , %icmp2
3610
+ ret i1 %ret
3611
+ }
3612
+
3613
+ define i1 @neg_or_icmp_eq_and_const_less_than_mask (i32 %x ) {
3614
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_const_less_than_mask(
3615
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 15
3616
+ ; CHECK-NEXT: ret i1 [[TMP1]]
3617
+ ;
3618
+ %icmp1 = icmp eq i32 %x , 15
3619
+ %and = and i32 %x , -32
3620
+ %icmp2 = icmp eq i32 %and , 16
3621
+ %ret = or i1 %icmp1 , %icmp2
3622
+ ret i1 %ret
3623
+ }
3624
+
3625
+ define i1 @neg_or_icmp_eq_and_pow2_disjoint (i32 %x ) {
3626
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_disjoint(
3627
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 126
3628
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3629
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[AND]], 128
3630
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3631
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3632
+ ;
3633
+ %icmp1 = icmp eq i32 %x , 126
3634
+ %and = and i32 %x , -32
3635
+ %icmp2 = icmp eq i32 %and , 128
3636
+ %ret = or i1 %icmp1 , %icmp2
3637
+ ret i1 %ret
3638
+ }
3639
+
3640
+ define i1 @neg_or_icmp_eq_double_and_pow2 (i32 %x ) {
3641
+ ; CHECK-LABEL: @neg_or_icmp_eq_double_and_pow2(
3642
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -16
3643
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 64
3644
+ ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], -32
3645
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[AND2]], 128
3646
+ ; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP2]], [[TMP4]]
3647
+ ; CHECK-NEXT: ret i1 [[TMP5]]
3648
+ ;
3649
+ %and1 = and i32 %x , -16
3650
+ %icmp1 = icmp eq i32 %and1 , 64
3651
+ %and2 = and i32 %x , -32
3652
+ %icmp2 = icmp eq i32 %and2 , 128
3653
+ %ret = or i1 %icmp1 , %icmp2
3654
+ ret i1 %ret
3655
+ }
3656
+
3657
+ define i1 @neg_or_icmp_eq_and_pow2_pred_non_eq_1 (i32 %x ) {
3658
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_pred_non_eq_1(
3659
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3660
+ ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X]], -32
3661
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp ugt i32 [[TMP2]], 128
3662
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3663
+ ; CHECK-NEXT: ret i1 [[TMP4]]
3664
+ ;
3665
+ %icmp1 = icmp eq i32 %x , 127
3666
+ %and = and i32 %x , -32
3667
+ %icmp2 = icmp ugt i32 %and , 128
3668
+ %ret = or i1 %icmp1 , %icmp2
3669
+ ret i1 %ret
3670
+ }
3671
+
3672
+ define i1 @neg_or_icmp_eq_and_pow2_pred_non_eq_2 (i32 %x ) {
3673
+ ; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_pred_non_eq_2(
3674
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[X:%.*]], 127
3675
+ ; CHECK-NEXT: ret i1 [[TMP1]]
3676
+ ;
3677
+ %icmp1 = icmp ne i32 %x , 127
3678
+ %and = and i32 %x , -32
3679
+ %icmp2 = icmp eq i32 %and , 128
3680
+ %ret = or i1 %icmp1 , %icmp2
3681
+ ret i1 %ret
3682
+ }
0 commit comments