Skip to content

Commit 3d7db85

Browse files
committed
Pre-commit tests
1 parent 1945753 commit 3d7db85

File tree

1 file changed

+207
-0
lines changed

1 file changed

+207
-0
lines changed

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

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3491,3 +3491,210 @@ 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(i32 %x) {
3496+
; CHECK-LABEL: @or_icmp_eq_and_pow2(
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: [[RET:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3501+
; CHECK-NEXT: ret i1 [[RET]]
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_mask_equal_to_icmp(i32 %x) {
3511+
; CHECK-LABEL: @or_icmp_eq_and_pow2_mask_equal_to_icmp(
3512+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 63
3513+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -64
3514+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 64
3515+
; CHECK-NEXT: [[RET:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3516+
; CHECK-NEXT: ret i1 [[RET]]
3517+
;
3518+
%icmp1 = icmp eq i32 %x, 63
3519+
%and = and i32 %x, -64
3520+
%icmp2 = icmp eq i32 %and, 64
3521+
%ret = or i1 %icmp1, %icmp2
3522+
ret i1 %ret
3523+
}
3524+
3525+
define i1 @and_icmp_ne_and_pow2(i32 %x) {
3526+
; CHECK-LABEL: @and_icmp_ne_and_pow2(
3527+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[X:%.*]], 127
3528+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3529+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[AND]], 128
3530+
; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3531+
; CHECK-NEXT: ret i1 [[RET]]
3532+
;
3533+
%icmp1 = icmp ne i32 %x, 127
3534+
%and = and i32 %x, -32
3535+
%icmp2 = icmp ne i32 %and, 128
3536+
%ret = and i1 %icmp1, %icmp2
3537+
ret i1 %ret
3538+
}
3539+
3540+
define i1 @and_icmp_ne_and_pow2_mask_equal_to_icmp(i32 %x) {
3541+
; CHECK-LABEL: @and_icmp_ne_and_pow2_mask_equal_to_icmp(
3542+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[X:%.*]], 63
3543+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -64
3544+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[AND]], 64
3545+
; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3546+
; CHECK-NEXT: ret i1 [[RET]]
3547+
;
3548+
%icmp1 = icmp ne i32 %x, 63
3549+
%and = and i32 %x, -64
3550+
%icmp2 = icmp ne i32 %and, 64
3551+
%ret = and i1 %icmp1, %icmp2
3552+
ret i1 %ret
3553+
}
3554+
3555+
define i1 @or_icmp_eq_and_pow2_commute(i32 %x) {
3556+
; CHECK-LABEL: @or_icmp_eq_and_pow2_commute(
3557+
; CHECK-NEXT: [[ICMP1:%.*]] = and i32 [[X:%.*]], -32
3558+
; CHECK-NEXT: [[AND:%.*]] = icmp eq i32 [[ICMP1]], 128
3559+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[X]], 127
3560+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[AND]], [[ICMP2]]
3561+
; CHECK-NEXT: ret i1 [[TMP4]]
3562+
;
3563+
%and = and i32 %x, -32
3564+
%icmp1 = icmp eq i32 %and, 128
3565+
%icmp2 = icmp eq i32 %x, 127
3566+
%ret = or i1 %icmp1, %icmp2
3567+
ret i1 %ret
3568+
}
3569+
3570+
define i1 @and_icmp_ne_and_pow2_commute(i32 %x) {
3571+
; CHECK-LABEL: @and_icmp_ne_and_pow2_commute(
3572+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], -32
3573+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[AND]], 128
3574+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[X]], 127
3575+
; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3576+
; CHECK-NEXT: ret i1 [[RET]]
3577+
;
3578+
%and = and i32 %x, -32
3579+
%icmp1 = icmp ne i32 %and, 128
3580+
%icmp2 = icmp ne i32 %x, 127
3581+
%ret = and i1 %icmp1, %icmp2
3582+
ret i1 %ret
3583+
}
3584+
3585+
define i1 @neg_or_icmp_eq_and_pow2_multi_use(i32 %x) {
3586+
; CHECK-LABEL: @neg_or_icmp_eq_and_pow2_multi_use(
3587+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3588+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3589+
; CHECK-NEXT: call void @use32(i32 [[AND]])
3590+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3591+
; CHECK-NEXT: [[RET:%.*]] = or i1 [[ICMP1]], [[ICMP2]]
3592+
; CHECK-NEXT: ret i1 [[RET]]
3593+
;
3594+
%icmp1 = icmp eq i32 %x, 127
3595+
%and = and i32 %x, -32
3596+
call void @use32(i32 %and)
3597+
%icmp2 = icmp eq i32 %and, 128
3598+
%ret = or i1 %icmp1, %icmp2
3599+
ret i1 %ret
3600+
}
3601+
3602+
define i1 @neg_and_icmp_eq_and_pow2(i32 %x) {
3603+
; CHECK-LABEL: @neg_and_icmp_eq_and_pow2(
3604+
; CHECK-NEXT: ret i1 false
3605+
;
3606+
%icmp1 = icmp eq i32 %x, 127
3607+
%and = and i32 %x, -32
3608+
%icmp2 = icmp eq i32 %and, 128
3609+
%ret = and i1 %icmp1, %icmp2
3610+
ret i1 %ret
3611+
}
3612+
3613+
define i1 @neg_or_icmp_eq_and_non_pow2_mask(i32 %x) {
3614+
; CHECK-LABEL: @neg_or_icmp_eq_and_non_pow2_mask(
3615+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 127
3616+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X]], -33
3617+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 128
3618+
; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]]
3619+
; CHECK-NEXT: ret i1 [[TMP4]]
3620+
;
3621+
%icmp1 = icmp eq i32 %x, 127
3622+
%and = and i32 %x, -33
3623+
%icmp2 = icmp eq i32 %and, 128
3624+
%ret = or i1 %icmp1, %icmp2
3625+
ret i1 %ret
3626+
}
3627+
3628+
define i1 @neg_and_icmp_ne_and_non_pow2_icmp(i32 %x) {
3629+
; CHECK-LABEL: @neg_and_icmp_ne_and_non_pow2_icmp(
3630+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[X:%.*]], 127
3631+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -33
3632+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[AND]], 128
3633+
; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3634+
; CHECK-NEXT: ret i1 [[RET]]
3635+
;
3636+
%icmp1 = icmp ne i32 %x, 127
3637+
%and = and i32 %x, -33
3638+
%icmp2 = icmp ne i32 %and, 128
3639+
%ret = and i1 %icmp1, %icmp2
3640+
ret i1 %ret
3641+
}
3642+
3643+
define i1 @neg_or_icmp_eq_and_const_less_than_mask(i32 %x) {
3644+
; CHECK-LABEL: @neg_or_icmp_eq_and_const_less_than_mask(
3645+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 15
3646+
; CHECK-NEXT: ret i1 [[TMP1]]
3647+
;
3648+
%icmp1 = icmp eq i32 %x, 15
3649+
%and = and i32 %x, -32
3650+
%icmp2 = icmp eq i32 %and, 16
3651+
%ret = or i1 %icmp1, %icmp2
3652+
ret i1 %ret
3653+
}
3654+
3655+
define i1 @neg_and_icmp_ne_and_pow2_disjoint(i32 %x) {
3656+
; CHECK-LABEL: @neg_and_icmp_ne_and_pow2_disjoint(
3657+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp ne i32 [[X:%.*]], 126
3658+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3659+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[AND]], 128
3660+
; CHECK-NEXT: [[RET:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3661+
; CHECK-NEXT: ret i1 [[RET]]
3662+
;
3663+
%icmp1 = icmp ne i32 %x, 126
3664+
%and = and i32 %x, -32
3665+
%icmp2 = icmp ne i32 %and, 128
3666+
%ret = and i1 %icmp1, %icmp2
3667+
ret i1 %ret
3668+
}
3669+
3670+
define i1 @neg_or_icmp_eq_double_and_pow2(i32 %x) {
3671+
; CHECK-LABEL: @neg_or_icmp_eq_double_and_pow2(
3672+
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -16
3673+
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 64
3674+
; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], -32
3675+
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[AND2]], 128
3676+
; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP2]], [[TMP4]]
3677+
; CHECK-NEXT: ret i1 [[TMP5]]
3678+
;
3679+
%and1 = and i32 %x, -16
3680+
%icmp1 = icmp eq i32 %and1, 64
3681+
%and2 = and i32 %x, -32
3682+
%icmp2 = icmp eq i32 %and2, 128
3683+
%ret = or i1 %icmp1, %icmp2
3684+
ret i1 %ret
3685+
}
3686+
3687+
define i1 @neg_select_icmp_eq_and_pow2(i32 %x) {
3688+
; CHECK-LABEL: @neg_select_icmp_eq_and_pow2(
3689+
; CHECK-NEXT: [[ICMP1:%.*]] = icmp sgt i32 [[X:%.*]], 127
3690+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], -32
3691+
; CHECK-NEXT: [[ICMP2:%.*]] = icmp eq i32 [[AND]], 128
3692+
; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[ICMP1]], [[ICMP2]]
3693+
; CHECK-NEXT: ret i1 [[TMP1]]
3694+
;
3695+
%icmp1 = icmp sgt i32 %x, 127
3696+
%and = and i32 %x, -32
3697+
%icmp2 = icmp eq i32 %and, 128
3698+
%1 = select i1 %icmp1, i1 %icmp2, i1 false
3699+
ret i1 %1
3700+
}

0 commit comments

Comments
 (0)