@@ -3300,3 +3300,149 @@ entry:
3300
3300
%cmp = icmp ult i32 %add , 253
3301
3301
ret i1 %cmp
3302
3302
}
3303
+
3304
+ ; PR 152851
3305
+
3306
+ define i1 @val_is_aligend_const_pow2 (i32 %num ) {
3307
+ ; CHECK-LABEL: @val_is_aligend_const_pow2(
3308
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095
3309
+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP1]], 0
3310
+ ; CHECK-NEXT: ret i1 [[_0]]
3311
+ ;
3312
+ %num.biased = add i32 %num , 4095
3313
+ %num.masked = and i32 %num.biased , -4096
3314
+ %_0 = icmp eq i32 %num.masked , %num
3315
+ ret i1 %_0
3316
+ }
3317
+
3318
+ define i1 @val_is_aligend_const_pow2_add_commute (i32 %num ) {
3319
+ ; CHECK-LABEL: @val_is_aligend_const_pow2_add_commute(
3320
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095
3321
+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP1]], 0
3322
+ ; CHECK-NEXT: ret i1 [[_0]]
3323
+ ;
3324
+ %num.biased = add i32 4095 , %num
3325
+ %num.masked = and i32 %num.biased , -4096
3326
+ %_0 = icmp eq i32 %num.masked , %num
3327
+ ret i1 %_0
3328
+ }
3329
+
3330
+ define i1 @val_is_aligend_const_pow2_and_commute (i32 %num ) {
3331
+ ; CHECK-LABEL: @val_is_aligend_const_pow2_and_commute(
3332
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095
3333
+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP1]], 0
3334
+ ; CHECK-NEXT: ret i1 [[_0]]
3335
+ ;
3336
+ %num.biased = add i32 %num , 4095
3337
+ %num.masked = and i32 -4096 , %num.biased
3338
+ %_0 = icmp eq i32 %num.masked , %num
3339
+ ret i1 %_0
3340
+ }
3341
+
3342
+ define i1 @val_is_aligend_const_pow2_icm_commute (i32 %num ) {
3343
+ ; CHECK-LABEL: @val_is_aligend_const_pow2_icm_commute(
3344
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095
3345
+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP1]], 0
3346
+ ; CHECK-NEXT: ret i1 [[_0]]
3347
+ ;
3348
+ %num.biased = add i32 %num , 4095
3349
+ %num.masked = and i32 %num.biased , -4096
3350
+ %_0 = icmp eq i32 %num , %num.masked
3351
+ ret i1 %_0
3352
+ }
3353
+
3354
+ ; Should not work for non-power-of-two cases
3355
+ define i1 @val_is_aligend_const_non_pow2 (i32 %num ) {
3356
+ ; CHECK-LABEL: @val_is_aligend_const_non_pow2(
3357
+ ; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], 6
3358
+ ; CHECK-NEXT: [[NUM_MASKED:%.*]] = and i32 [[NUM_BIASED]], -7
3359
+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[NUM_MASKED]], [[NUM]]
3360
+ ; CHECK-NEXT: ret i1 [[_0]]
3361
+ ;
3362
+ %num.biased = add i32 %num , 6
3363
+ %num.masked = and i32 %num.biased , -7
3364
+ %_0 = icmp eq i32 %num.masked , %num
3365
+ ret i1 %_0
3366
+ }
3367
+
3368
+ define i1 @val_is_aligend_const_pow2_multiuse (i32 %num ) {
3369
+ ; CHECK-LABEL: @val_is_aligend_const_pow2_multiuse(
3370
+ ; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], 4095
3371
+ ; CHECK-NEXT: [[NUM_MASKED:%.*]] = and i32 [[NUM_BIASED]], -4096
3372
+ ; CHECK-NEXT: call void @use(i32 [[NUM_MASKED]])
3373
+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[NUM_MASKED]], [[NUM]]
3374
+ ; CHECK-NEXT: ret i1 [[_0]]
3375
+ ;
3376
+ %num.biased = add i32 %num , 4095
3377
+ %num.masked = and i32 %num.biased , -4096
3378
+ call void @use (i32 %num.masked )
3379
+ %_0 = icmp eq i32 %num.masked , %num
3380
+ ret i1 %_0
3381
+ }
3382
+
3383
+ ; Applies since number of instructions do not change
3384
+ define i1 @val_is_aligend_const_pow2_multiuse1 (i32 %num ) {
3385
+ ; CHECK-LABEL: @val_is_aligend_const_pow2_multiuse1(
3386
+ ; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], 4095
3387
+ ; CHECK-NEXT: call void @use(i32 [[NUM_BIASED]])
3388
+ ; CHECK-NEXT: [[NUM_MASKED:%.*]] = and i32 [[NUM_BIASED]], -4096
3389
+ ; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[NUM_MASKED]], [[NUM]]
3390
+ ; CHECK-NEXT: ret i1 [[_0]]
3391
+ ;
3392
+ %num.biased = add i32 %num , 4095
3393
+ call void @use (i32 %num.biased )
3394
+ %num.masked = and i32 %num.biased , -4096
3395
+ %_0 = icmp eq i32 %num.masked , %num
3396
+ ret i1 %_0
3397
+ }
3398
+
3399
+ define i1 @val_is_aligend_const_pow2_ne (i32 %num ) {
3400
+ ; CHECK-LABEL: @val_is_aligend_const_pow2_ne(
3401
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095
3402
+ ; CHECK-NEXT: [[_0:%.*]] = icmp ne i32 [[TMP1]], 0
3403
+ ; CHECK-NEXT: ret i1 [[_0]]
3404
+ ;
3405
+ %num.biased = add i32 %num , 4095
3406
+ %num.masked = and i32 %num.biased , -4096
3407
+ %_0 = icmp ne i32 %num.masked , %num
3408
+ ret i1 %_0
3409
+ }
3410
+
3411
+ define i1 @val_is_aligend_const_mismatch (i32 %num ) {
3412
+ ; CHECK-LABEL: @val_is_aligend_const_mismatch(
3413
+ ; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], 4095
3414
+ ; CHECK-NEXT: [[NUM_MASKED:%.*]] = and i32 [[NUM_BIASED]], -4095
3415
+ ; CHECK-NEXT: [[_0:%.*]] = icmp ne i32 [[NUM_MASKED]], [[NUM]]
3416
+ ; CHECK-NEXT: ret i1 [[_0]]
3417
+ ;
3418
+ %num.biased = add i32 %num , 4095
3419
+ %num.masked = and i32 %num.biased , -4095
3420
+ %_0 = icmp ne i32 %num.masked , %num
3421
+ ret i1 %_0
3422
+ }
3423
+
3424
+ define i1 @val_is_aligend_const_mismatch1 (i32 %num ) {
3425
+ ; CHECK-LABEL: @val_is_aligend_const_mismatch1(
3426
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], -4096
3427
+ ; CHECK-NEXT: [[NUM_MASKED:%.*]] = add i32 [[TMP1]], 4096
3428
+ ; CHECK-NEXT: [[_0:%.*]] = icmp ne i32 [[NUM_MASKED]], [[NUM]]
3429
+ ; CHECK-NEXT: ret i1 [[_0]]
3430
+ ;
3431
+ %num.biased = add i32 %num , 4096
3432
+ %num.masked = and i32 %num.biased , -4096
3433
+ %_0 = icmp ne i32 %num.masked , %num
3434
+ ret i1 %_0
3435
+ }
3436
+
3437
+ define i1 @val_is_aligend_pred_mismatch (i32 %num ) {
3438
+ ; CHECK-LABEL: @val_is_aligend_pred_mismatch(
3439
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], -4096
3440
+ ; CHECK-NEXT: [[NUM_MASKED:%.*]] = add i32 [[TMP1]], 4096
3441
+ ; CHECK-NEXT: [[_0:%.*]] = icmp sge i32 [[NUM_MASKED]], [[NUM]]
3442
+ ; CHECK-NEXT: ret i1 [[_0]]
3443
+ ;
3444
+ %num.biased = add i32 %num , 4096
3445
+ %num.masked = and i32 %num.biased , -4096
3446
+ %_0 = icmp sge i32 %num.masked , %num
3447
+ ret i1 %_0
3448
+ }
0 commit comments