Skip to content

Commit 92b401e

Browse files
committed
[InstCombine] Add tests for transforming (or/and (icmp eq/ne X,0),(icmp eq/ne X,Pow2OrZero)); NFC
1 parent 0605e98 commit 92b401e

File tree

1 file changed

+215
-6
lines changed

1 file changed

+215
-6
lines changed

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

Lines changed: 215 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3057,9 +3057,9 @@ define i32 @icmp_slt_0_or_icmp_add_1_sge_100_i32_fail(i32 %x) {
30573057
define i1 @logical_and_icmps1(i32 %a, i1 %other_cond) {
30583058
; CHECK-LABEL: @logical_and_icmps1(
30593059
; CHECK-NEXT: entry:
3060-
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[A:%.*]], 10086
3061-
; CHECK-NEXT: [[RET2:%.*]] = select i1 [[RET1:%.*]], i1 [[CMP3]], i1 false
3062-
; CHECK-NEXT: ret i1 [[RET2]]
3060+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[A:%.*]], 10086
3061+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[OTHER_COND:%.*]], i1 [[TMP0]], i1 false
3062+
; CHECK-NEXT: ret i1 [[RET]]
30633063
;
30643064
entry:
30653065
%cmp1 = icmp sgt i32 %a, -1
@@ -3085,9 +3085,9 @@ entry:
30853085
define <4 x i1> @logical_and_icmps_vec1(<4 x i32> %a, <4 x i1> %other_cond) {
30863086
; CHECK-LABEL: @logical_and_icmps_vec1(
30873087
; CHECK-NEXT: entry:
3088-
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult <4 x i32> [[A:%.*]], <i32 10086, i32 10086, i32 10086, i32 10086>
3089-
; CHECK-NEXT: [[RET2:%.*]] = select <4 x i1> [[RET1:%.*]], <4 x i1> [[CMP3]], <4 x i1> zeroinitializer
3090-
; CHECK-NEXT: ret <4 x i1> [[RET2]]
3088+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i32> [[A:%.*]], <i32 10086, i32 10086, i32 10086, i32 10086>
3089+
; CHECK-NEXT: [[RET:%.*]] = select <4 x i1> [[OTHER_COND:%.*]], <4 x i1> [[TMP0]], <4 x i1> zeroinitializer
3090+
; CHECK-NEXT: ret <4 x i1> [[RET]]
30913091
;
30923092
entry:
30933093
%cmp1 = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1 >
@@ -3113,3 +3113,212 @@ entry:
31133113
%ret = select i1 %logical_and, i1 %cmp2, i1 false
31143114
ret i1 %ret
31153115
}
3116+
3117+
3118+
define i1 @icmp_eq_or_z_or_pow2orz(i8 %x, i8 %y) {
3119+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz(
3120+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3121+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3122+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 0
3123+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3124+
; CHECK-NEXT: [[R:%.*]] = or i1 [[CP2]], [[C0]]
3125+
; CHECK-NEXT: ret i1 [[R]]
3126+
;
3127+
%ny = sub i8 0, %y
3128+
%pow2orz = and i8 %ny, %y
3129+
3130+
%c0 = icmp eq i8 %x, 0
3131+
%cp2 = icmp eq i8 %x, %pow2orz
3132+
%r = or i1 %cp2, %c0
3133+
ret i1 %r
3134+
}
3135+
3136+
3137+
define i1 @icmp_eq_or_z_or_pow2orz_logical(i8 %x, i8 %y) {
3138+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_logical(
3139+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3140+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3141+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 0
3142+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3143+
; CHECK-NEXT: [[R:%.*]] = or i1 [[CP2]], [[C0]]
3144+
; CHECK-NEXT: ret i1 [[R]]
3145+
;
3146+
%ny = sub i8 0, %y
3147+
%pow2orz = and i8 %ny, %y
3148+
3149+
%c0 = icmp eq i8 %x, 0
3150+
%cp2 = icmp eq i8 %x, %pow2orz
3151+
%r = select i1 %cp2, i1 true, i1 %c0
3152+
ret i1 %r
3153+
}
3154+
3155+
3156+
3157+
define i1 @icmp_eq_or_z_or_pow2orz_fail_multiuse(i8 %x, i8 %y) {
3158+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_fail_multiuse(
3159+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3160+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3161+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 0
3162+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3163+
; CHECK-NEXT: call void @use(i1 [[C0]])
3164+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3165+
; CHECK-NEXT: ret i1 [[R]]
3166+
;
3167+
%ny = sub i8 0, %y
3168+
%pow2orz = and i8 %ny, %y
3169+
3170+
%c0 = icmp eq i8 %x, 0
3171+
%cp2 = icmp eq i8 %x, %pow2orz
3172+
call void @use(i1 %c0)
3173+
%r = or i1 %c0, %cp2
3174+
ret i1 %r
3175+
}
3176+
3177+
3178+
define i1 @icmp_eq_or_z_or_pow2orz_fail_logic_or(i8 %x, i8 %y) {
3179+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_fail_logic_or(
3180+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3181+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3182+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 0
3183+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3184+
; CHECK-NEXT: [[R:%.*]] = select i1 [[C0]], i1 true, i1 [[CP2]]
3185+
; CHECK-NEXT: ret i1 [[R]]
3186+
;
3187+
%ny = sub i8 0, %y
3188+
%pow2orz = and i8 %ny, %y
3189+
3190+
%c0 = icmp eq i8 %x, 0
3191+
%cp2 = icmp eq i8 %x, %pow2orz
3192+
%r = select i1 %c0, i1 true, i1 %cp2
3193+
ret i1 %r
3194+
}
3195+
3196+
3197+
define <2 x i1> @icmp_ne_and_z_and_pow2orz(<2 x i8> %x, <2 x i8> %y) {
3198+
; CHECK-LABEL: @icmp_ne_and_z_and_pow2orz(
3199+
; CHECK-NEXT: [[NY:%.*]] = sub <2 x i8> zeroinitializer, [[Y:%.*]]
3200+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and <2 x i8> [[NY]], [[Y]]
3201+
; CHECK-NEXT: [[C0:%.*]] = icmp ne <2 x i8> [[X:%.*]], zeroinitializer
3202+
; CHECK-NEXT: [[CP2:%.*]] = icmp ne <2 x i8> [[POW2ORZ]], [[X]]
3203+
; CHECK-NEXT: [[R:%.*]] = and <2 x i1> [[C0]], [[CP2]]
3204+
; CHECK-NEXT: ret <2 x i1> [[R]]
3205+
;
3206+
%ny = sub <2 x i8> zeroinitializer, %y
3207+
%pow2orz = and <2 x i8> %ny, %y
3208+
3209+
%c0 = icmp ne <2 x i8> %x, zeroinitializer
3210+
%cp2 = icmp ne <2 x i8> %x, %pow2orz
3211+
%r = and <2 x i1> %c0, %cp2
3212+
ret <2 x i1> %r
3213+
}
3214+
3215+
3216+
define i1 @icmp_ne_and_z_and_pow2orz_fail_multiuse1(i8 %x, i8 %y) {
3217+
; CHECK-LABEL: @icmp_ne_and_z_and_pow2orz_fail_multiuse1(
3218+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3219+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3220+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 0
3221+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3222+
; CHECK-NEXT: call void @use(i1 [[C0]])
3223+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3224+
; CHECK-NEXT: ret i1 [[R]]
3225+
;
3226+
%ny = sub i8 0, %y
3227+
%pow2orz = and i8 %ny, %y
3228+
3229+
%c0 = icmp eq i8 %x, 0
3230+
%cp2 = icmp eq i8 %x, %pow2orz
3231+
call void @use(i1 %c0)
3232+
%r = or i1 %c0, %cp2
3233+
ret i1 %r
3234+
}
3235+
3236+
3237+
define <2 x i1> @icmp_ne_and_z_and_pow2orz_fail_logic_and(<2 x i8> %x, <2 x i8> %y) {
3238+
; CHECK-LABEL: @icmp_ne_and_z_and_pow2orz_fail_logic_and(
3239+
; CHECK-NEXT: [[NY:%.*]] = sub <2 x i8> zeroinitializer, [[Y:%.*]]
3240+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and <2 x i8> [[NY]], [[Y]]
3241+
; CHECK-NEXT: [[C0:%.*]] = icmp ne <2 x i8> [[X:%.*]], zeroinitializer
3242+
; CHECK-NEXT: [[CP2:%.*]] = icmp ne <2 x i8> [[POW2ORZ]], [[X]]
3243+
; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C0]], <2 x i1> [[CP2]], <2 x i1> zeroinitializer
3244+
; CHECK-NEXT: ret <2 x i1> [[R]]
3245+
;
3246+
%ny = sub <2 x i8> zeroinitializer, %y
3247+
%pow2orz = and <2 x i8> %ny, %y
3248+
3249+
%c0 = icmp ne <2 x i8> %x, zeroinitializer
3250+
%cp2 = icmp ne <2 x i8> %x, %pow2orz
3251+
%r = select <2 x i1> %c0, <2 x i1> %cp2, <2 x i1> zeroinitializer
3252+
ret <2 x i1> %r
3253+
}
3254+
3255+
define i1 @icmp_eq_or_z_or_pow2orz_fail_not_pow2(i8 %x, i8 %y) {
3256+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_fail_not_pow2(
3257+
; CHECK-NEXT: [[NY:%.*]] = sub i8 1, [[Y:%.*]]
3258+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3259+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 0
3260+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3261+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3262+
; CHECK-NEXT: ret i1 [[R]]
3263+
;
3264+
%ny = sub i8 1, %y
3265+
%pow2orz = and i8 %ny, %y
3266+
3267+
%c0 = icmp eq i8 %x, 0
3268+
%cp2 = icmp eq i8 %x, %pow2orz
3269+
%r = or i1 %c0, %cp2
3270+
ret i1 %r
3271+
}
3272+
3273+
define i1 @icmp_eq_or_z_or_pow2orz_fail_nonzero_const(i8 %x, i8 %y) {
3274+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_fail_nonzero_const(
3275+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3276+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3277+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 1
3278+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3279+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3280+
; CHECK-NEXT: ret i1 [[R]]
3281+
;
3282+
%ny = sub i8 0, %y
3283+
%pow2orz = and i8 %ny, %y
3284+
3285+
%c0 = icmp eq i8 %x, 1
3286+
%cp2 = icmp eq i8 %x, %pow2orz
3287+
%r = or i1 %c0, %cp2
3288+
ret i1 %r
3289+
}
3290+
3291+
define <2 x i1> @icmp_ne_and_z_and_pow2orz_fail_bad_pred(<2 x i8> %x, <2 x i8> %y) {
3292+
; CHECK-LABEL: @icmp_ne_and_z_and_pow2orz_fail_bad_pred(
3293+
; CHECK-NEXT: [[NY:%.*]] = sub <2 x i8> zeroinitializer, [[Y:%.*]]
3294+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and <2 x i8> [[NY]], [[Y]]
3295+
; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i8> [[POW2ORZ]], [[X:%.*]]
3296+
; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[TMP1]], zeroinitializer
3297+
; CHECK-NEXT: ret <2 x i1> [[R]]
3298+
;
3299+
%ny = sub <2 x i8> zeroinitializer, %y
3300+
%pow2orz = and <2 x i8> %ny, %y
3301+
3302+
%c0 = icmp eq <2 x i8> %x, zeroinitializer
3303+
%cp2 = icmp eq <2 x i8> %x, %pow2orz
3304+
%r = and <2 x i1> %c0, %cp2
3305+
ret <2 x i1> %r
3306+
}
3307+
3308+
define i1 @icmp_eq_or_z_or_pow2orz_fail_bad_pred2(i8 %x, i8 %y) {
3309+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_fail_bad_pred2(
3310+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3311+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3312+
; CHECK-NEXT: [[C0:%.*]] = icmp slt i8 [[X:%.*]], 1
3313+
; CHECK-NEXT: [[CP2:%.*]] = icmp sge i8 [[POW2ORZ]], [[X]]
3314+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3315+
; CHECK-NEXT: ret i1 [[R]]
3316+
;
3317+
%ny = sub i8 0, %y
3318+
%pow2orz = and i8 %ny, %y
3319+
3320+
%c0 = icmp sle i8 %x, 0
3321+
%cp2 = icmp sle i8 %x, %pow2orz
3322+
%r = or i1 %c0, %cp2
3323+
ret i1 %r
3324+
}

0 commit comments

Comments
 (0)