@@ -3307,8 +3307,8 @@ define i1 @val_is_aligend_sub(i32 %num, i32 %val) {
33073307; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
33083308; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
33093309; CHECK-NEXT: [[NEG:%.*]] = add i32 [[NUM]], -1
3310- ; CHECK-NEXT: [[_2_SROA_0_0 :%.*]] = and i32 [[NUM_BIASED :%.*]], [[NEG]]
3311- ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0 ]], 0
3310+ ; CHECK-NEXT: [[TMP2 :%.*]] = and i32 [[NUM1 :%.*]], [[NEG]]
3311+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2 ]], 0
33123312; CHECK-NEXT: ret i1 [[_0]]
33133313;
33143314 %1 = tail call range(i32 1 , 33 ) i32 @llvm.ctpop.i32 (i32 %val )
@@ -3330,8 +3330,8 @@ define i1 @val_is_aligend_add(i32 %num, i32 %val) {
33303330; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
33313331; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
33323332; CHECK-NEXT: [[NEG:%.*]] = add i32 [[NUM]], -1
3333- ; CHECK-NEXT: [[_2_SROA_0_0 :%.*]] = and i32 [[NUM_BIASED :%.*]], [[NEG]]
3334- ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0 ]], 0
3333+ ; CHECK-NEXT: [[TMP2 :%.*]] = and i32 [[NUM1 :%.*]], [[NEG]]
3334+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2 ]], 0
33353335; CHECK-NEXT: ret i1 [[_0]]
33363336;
33373337 %1 = tail call range(i32 1 , 33 ) i32 @llvm.ctpop.i32 (i32 %val )
@@ -3347,6 +3347,52 @@ define i1 @val_is_aligend_add(i32 %num, i32 %val) {
33473347 ret i1 %_0
33483348}
33493349
3350+ define i1 @val_is_aligend_add_commute_add (i32 %num , i32 %val ) {
3351+ ; CHECK-LABEL: @val_is_aligend_add_commute_add(
3352+ ; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[VAL:%.*]])
3353+ ; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3354+ ; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3355+ ; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL]], -1
3356+ ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM:%.*]], [[MASK]]
3357+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
3358+ ; CHECK-NEXT: ret i1 [[_0]]
3359+ ;
3360+ %1 = tail call range(i32 1 , 33 ) i32 @llvm.ctpop.i32 (i32 %val )
3361+ %pow = icmp eq i32 %1 , 1
3362+ call void @llvm.assume (i1 %pow )
3363+
3364+ %mask = add i32 %val , -1
3365+ %neg = sub nsw i32 0 , %val
3366+
3367+ %num.biased = add i32 %mask , %num
3368+ %_2.sroa.0.0 = and i32 %num.biased , %neg
3369+ %_0 = icmp eq i32 %_2.sroa.0.0 , %num
3370+ ret i1 %_0
3371+ }
3372+
3373+ define i1 @val_is_aligend_add_commute_and (i32 %num , i32 %val ) {
3374+ ; CHECK-LABEL: @val_is_aligend_add_commute_and(
3375+ ; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[VAL:%.*]])
3376+ ; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3377+ ; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3378+ ; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL]], -1
3379+ ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM:%.*]], [[MASK]]
3380+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
3381+ ; CHECK-NEXT: ret i1 [[_0]]
3382+ ;
3383+ %1 = tail call range(i32 1 , 33 ) i32 @llvm.ctpop.i32 (i32 %val )
3384+ %pow = icmp eq i32 %1 , 1
3385+ call void @llvm.assume (i1 %pow )
3386+
3387+ %mask = add i32 %val , -1
3388+ %neg = sub nsw i32 0 , %val
3389+
3390+ %num.biased = add i32 %mask , %num
3391+ %_2.sroa.0.0 = and i32 %neg , %num.biased
3392+ %_0 = icmp eq i32 %_2.sroa.0.0 , %num
3393+ ret i1 %_0
3394+ }
3395+
33503396define i1 @val_is_aligend_const_pow2 (i32 %num ) {
33513397; CHECK-LABEL: @val_is_aligend_const_pow2(
33523398; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095
0 commit comments