@@ -3307,8 +3307,8 @@ define i1 @val_is_aligend_sub(i32 %num, i32 %val) {
3307
3307
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3308
3308
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3309
3309
; 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
3312
3312
; CHECK-NEXT: ret i1 [[_0]]
3313
3313
;
3314
3314
%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) {
3330
3330
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3331
3331
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3332
3332
; 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
3335
3335
; CHECK-NEXT: ret i1 [[_0]]
3336
3336
;
3337
3337
%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) {
3347
3347
ret i1 %_0
3348
3348
}
3349
3349
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
+
3350
3396
define i1 @val_is_aligend_const_pow2 (i32 %num ) {
3351
3397
; CHECK-LABEL: @val_is_aligend_const_pow2(
3352
3398
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095
0 commit comments