@@ -3332,3 +3332,93 @@ define i1 @icmp_eq_or_z_or_pow2orz_fail_bad_pred2(i8 %x, i8 %y) {
33323332 %r = or i1 %c0 , %cp2
33333333 ret i1 %r
33343334}
3335+
3336+ define i1 @and_slt_to_mask (i8 %x ) {
3337+ ; CHECK-LABEL: @and_slt_to_mask(
3338+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -124
3339+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 2
3340+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[AND]], 0
3341+ ; CHECK-NEXT: [[AND2:%.*]] = and i1 [[CMP]], [[CMP2]]
3342+ ; CHECK-NEXT: ret i1 [[AND2]]
3343+ ;
3344+ %cmp = icmp slt i8 %x , -124
3345+ %and = and i8 %x , 2
3346+ %cmp2 = icmp eq i8 %and , 0
3347+ %and2 = and i1 %cmp , %cmp2
3348+ ret i1 %and2
3349+ }
3350+
3351+ define i1 @and_slt_to_mask_off_by_one (i8 %x ) {
3352+ ; CHECK-LABEL: @and_slt_to_mask_off_by_one(
3353+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -123
3354+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 2
3355+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[AND]], 0
3356+ ; CHECK-NEXT: [[AND2:%.*]] = and i1 [[CMP]], [[CMP2]]
3357+ ; CHECK-NEXT: ret i1 [[AND2]]
3358+ ;
3359+ %cmp = icmp slt i8 %x , -123
3360+ %and = and i8 %x , 2
3361+ %cmp2 = icmp eq i8 %and , 0
3362+ %and2 = and i1 %cmp , %cmp2
3363+ ret i1 %and2
3364+ }
3365+
3366+ define i1 @and_sgt_to_mask (i8 %x ) {
3367+ ; CHECK-LABEL: @and_sgt_to_mask(
3368+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 123
3369+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 2
3370+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[AND]], 0
3371+ ; CHECK-NEXT: [[AND2:%.*]] = and i1 [[CMP]], [[CMP2]]
3372+ ; CHECK-NEXT: ret i1 [[AND2]]
3373+ ;
3374+ %cmp = icmp sgt i8 %x , 123
3375+ %and = and i8 %x , 2
3376+ %cmp2 = icmp eq i8 %and , 0
3377+ %and2 = and i1 %cmp , %cmp2
3378+ ret i1 %and2
3379+ }
3380+
3381+ define i1 @and_sgt_to_mask_off_by_one (i8 %x ) {
3382+ ; CHECK-LABEL: @and_sgt_to_mask_off_by_one(
3383+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 124
3384+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 2
3385+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[AND]], 0
3386+ ; CHECK-NEXT: [[AND2:%.*]] = and i1 [[CMP]], [[CMP2]]
3387+ ; CHECK-NEXT: ret i1 [[AND2]]
3388+ ;
3389+ %cmp = icmp sgt i8 %x , 124
3390+ %and = and i8 %x , 2
3391+ %cmp2 = icmp eq i8 %and , 0
3392+ %and2 = and i1 %cmp , %cmp2
3393+ ret i1 %and2
3394+ }
3395+
3396+ define i1 @and_ugt_to_mask (i8 %x ) {
3397+ ; CHECK-LABEL: @and_ugt_to_mask(
3398+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -5
3399+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 2
3400+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[AND]], 0
3401+ ; CHECK-NEXT: [[AND2:%.*]] = and i1 [[CMP]], [[CMP2]]
3402+ ; CHECK-NEXT: ret i1 [[AND2]]
3403+ ;
3404+ %cmp = icmp ugt i8 %x , -5
3405+ %and = and i8 %x , 2
3406+ %cmp2 = icmp eq i8 %and , 0
3407+ %and2 = and i1 %cmp , %cmp2
3408+ ret i1 %and2
3409+ }
3410+
3411+ define i1 @and_ugt_to_mask_off_by_one (i8 %x ) {
3412+ ; CHECK-LABEL: @and_ugt_to_mask_off_by_one(
3413+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -6
3414+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 2
3415+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[AND]], 0
3416+ ; CHECK-NEXT: [[AND2:%.*]] = and i1 [[CMP]], [[CMP2]]
3417+ ; CHECK-NEXT: ret i1 [[AND2]]
3418+ ;
3419+ %cmp = icmp ugt i8 %x , -6
3420+ %and = and i8 %x , 2
3421+ %cmp2 = icmp eq i8 %and , 0
3422+ %and2 = and i1 %cmp , %cmp2
3423+ ret i1 %and2
3424+ }
0 commit comments