Skip to content

Commit af28ad0

Browse files
committed
Pre-commit tests
1 parent 1945753 commit af28ad0

File tree

1 file changed

+189
-0
lines changed

1 file changed

+189
-0
lines changed

llvm/test/Transforms/InstCombine/and-or-icmps.ll

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3491,3 +3491,192 @@ define i1 @and_icmp_eq_with_binary_range_operands(i8 range(i8 0, 2) %x, i8 range
34913491
%ret = and i1 %icmp1, %icmp2
34923492
ret i1 %ret
34933493
}
3494+
3495+
define i1 @or_icmp_eq_and_pow2_1(i32 %x) {
3496+
; CHECK-LABEL: @or_icmp_eq_and_pow2_1(
3497+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3498+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3499+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3500+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3501+
; CHECK-NEXT: ret i1 [[TMP4]]
3502+
;
3503+
%icmp1 = icmp eq i32 %x, 127
3504+
%and = and i32 %x, -32
3505+
%icmp2 = icmp eq i32 %and, 128
3506+
%ret = or i1 %icmp1, %icmp2
3507+
ret i1 %ret
3508+
}
3509+
3510+
define i1 @or_icmp_eq_and_pow2_2(i32 %x) {
3511+
; CHECK-LABEL: @or_icmp_eq_and_pow2_2(
3512+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 31
3513+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3514+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 32
3515+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3516+
; CHECK-NEXT: ret i1 [[TMP4]]
3517+
;
3518+
%icmp1 = icmp eq i32 %x, 31
3519+
%and = and i32 %x, -32
3520+
%icmp2 = icmp eq i32 %and, 32
3521+
%ret = or i1 %icmp1, %icmp2
3522+
ret i1 %ret
3523+
}
3524+
3525+
define i1 @or_icmp_eq_and_pow2_3(i32 %x) {
3526+
; CHECK-LABEL: @or_icmp_eq_and_pow2_3(
3527+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3528+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -64
3529+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3530+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3531+
; CHECK-NEXT: ret i1 [[TMP4]]
3532+
;
3533+
%icmp1 = icmp eq i32 %x, 127
3534+
%and = and i32 %x, -64
3535+
%icmp2 = icmp eq i32 %and, 128
3536+
%ret = or i1 %icmp1, %icmp2
3537+
ret i1 %ret
3538+
}
3539+
3540+
define i1 @or_icmp_eq_and_pow2_commute(i32 %x) {
3541+
; CHECK-LABEL: @or_icmp_eq_and_pow2_commute(
3542+
; CHECK-NEXT: [[ICMP1:%.*]] = and i32 [[X:%.*]], -32
3543+
; CHECK-NEXT: [[AND:%.*]] = icmp eq i32 [[ICMP1]], 128
3544+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[X]], 127
3545+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[AND]], [[ICMP2]]
3546+
; CHECK-NEXT: ret i1 [[TMP4]]
3547+
;
3548+
%icmp1 = and i32 %x, -32
3549+
%and = icmp eq i32 %icmp1, 128
3550+
%icmp2 = icmp eq i32 %x, 127
3551+
%ret = or i1 %and, %icmp2
3552+
ret i1 %ret
3553+
}
3554+
3555+
define i1 @neg_or_icmp_eq_and_pow2_multi_use(i32 %x) {
3556+
; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_multi_use(
3557+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3558+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3559+
; CHECK-NEXT: call void @use32(i32 [[AND]])
3560+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3561+
; CHECK-NEXT: [[RET:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3562+
; CHECK-NEXT: ret i1 [[RET]]
3563+
;
3564+
%icmp1 = icmp eq i32 %x, 127
3565+
%and = and i32 %x, -32
3566+
call void @use32(i32 %and)
3567+
%icmp2 = icmp eq i32 %and, 128
3568+
%ret = or i1 %icmp1, %icmp2
3569+
ret i1 %ret
3570+
}
3571+
3572+
define i1 @neg_and_icmp_eq_and_pow2(i32 %x) {
3573+
; CHECK-LABEL: @neg_and_icmp_eq_and_pow2(
3574+
; CHECK-NEXT: ret i1 false
3575+
;
3576+
%icmp1 = icmp eq i32 %x, 127
3577+
%and = and i32 %x, -32
3578+
%icmp2 = icmp eq i32 %and, 128
3579+
%ret = and i1 %icmp1, %icmp2
3580+
ret i1 %ret
3581+
}
3582+
3583+
define i1 @neg_or_icmp_eq_and_non_pow2_mask(i32 %x) {
3584+
; CHECK-LABEL: @neg_or_icmp_eq_and_non_pow2_mask(
3585+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3586+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X]], -33
3587+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 128
3588+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3589+
; CHECK-NEXT: ret i1 [[TMP4]]
3590+
;
3591+
%icmp1 = icmp eq i32 %x, 127
3592+
%and = and i32 %x, -33
3593+
%icmp2 = icmp eq i32 %and, 128
3594+
%ret = or i1 %icmp1, %icmp2
3595+
ret i1 %ret
3596+
}
3597+
3598+
define i1 @neg_or_icmp_eq_and_non_pow2_icmp(i32 %x) {
3599+
; CHECK-LABEL: @neg_or_icmp_eq_and_non_pow2_icmp(
3600+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3601+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X]], -33
3602+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 128
3603+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3604+
; CHECK-NEXT: ret i1 [[TMP4]]
3605+
;
3606+
%icmp1 = icmp eq i32 %x, 127
3607+
%and = and i32 %x, -33
3608+
%icmp2 = icmp eq i32 %and, 128
3609+
%ret = or i1 %icmp1, %icmp2
3610+
ret i1 %ret
3611+
}
3612+
3613+
define i1 @neg_or_icmp_eq_and_const_less_than_mask(i32 %x) {
3614+
; CHECK-LABEL: @neg_or_icmp_eq_and_const_less_than_mask(
3615+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 15
3616+
; CHECK-NEXT: ret i1 [[TMP1]]
3617+
;
3618+
%icmp1 = icmp eq i32 %x, 15
3619+
%and = and i32 %x, -32
3620+
%icmp2 = icmp eq i32 %and, 16
3621+
%ret = or i1 %icmp1, %icmp2
3622+
ret i1 %ret
3623+
}
3624+
3625+
define i1 @neg_or_icmp_eq_and_pow2_disjoint(i32 %x) {
3626+
; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_disjoint(
3627+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 126
3628+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3629+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[AND]], 128
3630+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3631+
; CHECK-NEXT: ret i1 [[TMP4]]
3632+
;
3633+
%icmp1 = icmp eq i32 %x, 126
3634+
%and = and i32 %x, -32
3635+
%icmp2 = icmp eq i32 %and, 128
3636+
%ret = or i1 %icmp1, %icmp2
3637+
ret i1 %ret
3638+
}
3639+
3640+
define i1 @neg_or_icmp_eq_double_and_pow2(i32 %x) {
3641+
; CHECK-LABEL: @neg_or_icmp_eq_double_and_pow2(
3642+
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -16
3643+
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 64
3644+
; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], -32
3645+
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[AND2]], 128
3646+
; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP2]], [[TMP4]]
3647+
; CHECK-NEXT: ret i1 [[TMP5]]
3648+
;
3649+
%and1 = and i32 %x, -16
3650+
%icmp1 = icmp eq i32 %and1, 64
3651+
%and2 = and i32 %x, -32
3652+
%icmp2 = icmp eq i32 %and2, 128
3653+
%ret = or i1 %icmp1, %icmp2
3654+
ret i1 %ret
3655+
}
3656+
3657+
define i1 @neg_or_icmp_eq_and_pow2_pred_non_eq_1(i32 %x) {
3658+
; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_pred_non_eq_1(
3659+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3660+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X]], -32
3661+
; CHECK-NEXT: [[TMP3:%.*]] = icmp ugt i32 [[TMP2]], 128
3662+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3663+
; CHECK-NEXT: ret i1 [[TMP4]]
3664+
;
3665+
%icmp1 = icmp eq i32 %x, 127
3666+
%and = and i32 %x, -32
3667+
%icmp2 = icmp ugt i32 %and, 128
3668+
%ret = or i1 %icmp1, %icmp2
3669+
ret i1 %ret
3670+
}
3671+
3672+
define i1 @neg_or_icmp_eq_and_pow2_pred_non_eq_2(i32 %x) {
3673+
; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_pred_non_eq_2(
3674+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[X:%.*]], 127
3675+
; CHECK-NEXT: ret i1 [[TMP1]]
3676+
;
3677+
%icmp1 = icmp ne i32 %x, 127
3678+
%and = and i32 %x, -32
3679+
%icmp2 = icmp eq i32 %and, 128
3680+
%ret = or i1 %icmp1, %icmp2
3681+
ret i1 %ret
3682+
}

0 commit comments

Comments
 (0)