@@ -3686,3 +3686,48 @@ define i1 @neg_select_icmp_eq_and_pow2(i32 %x) {
36863686 %1 = select i1 %icmp1 , i1 %icmp2 , i1 false
36873687 ret i1 %1
36883688}
3689+
3690+ define i1 @implied_range_check (i8 %a ) {
3691+ ; CHECK-LABEL: @implied_range_check(
3692+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 [[A:%.*]], 5
3693+ ; CHECK-NEXT: [[MASKED:%.*]] = and i8 [[A]], -2
3694+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[MASKED]], 2
3695+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
3696+ ; CHECK-NEXT: ret i1 [[AND]]
3697+ ;
3698+ %cmp1 = icmp ult i8 %a , 5
3699+ %masked = and i8 %a , -2
3700+ %cmp2 = icmp eq i8 %masked , 2
3701+ %and = and i1 %cmp1 , %cmp2
3702+ ret i1 %and
3703+ }
3704+
3705+ define i1 @merge_range_check_and (i8 %a ) {
3706+ ; CHECK-LABEL: @merge_range_check_and(
3707+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 [[A:%.*]], 3
3708+ ; CHECK-NEXT: [[MASKED:%.*]] = and i8 [[A]], -2
3709+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[MASKED]], 2
3710+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
3711+ ; CHECK-NEXT: ret i1 [[AND]]
3712+ ;
3713+ %cmp1 = icmp ult i8 %a , 3
3714+ %masked = and i8 %a , -2
3715+ %cmp2 = icmp eq i8 %masked , 2
3716+ %and = and i1 %cmp1 , %cmp2
3717+ ret i1 %and
3718+ }
3719+
3720+ define i1 @merge_range_check_or (i8 %a ) {
3721+ ; CHECK-LABEL: @merge_range_check_or(
3722+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 [[A:%.*]], 3
3723+ ; CHECK-NEXT: [[MASKED:%.*]] = and i8 [[A]], -2
3724+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[MASKED]], 2
3725+ ; CHECK-NEXT: [[AND:%.*]] = or i1 [[CMP1]], [[CMP2]]
3726+ ; CHECK-NEXT: ret i1 [[AND]]
3727+ ;
3728+ %cmp1 = icmp ult i8 %a , 3
3729+ %masked = and i8 %a , -2
3730+ %cmp2 = icmp eq i8 %masked , 2
3731+ %and = or i1 %cmp1 , %cmp2
3732+ ret i1 %and
3733+ }
0 commit comments