Skip to content

Commit 3cf4a50

Browse files
committed
[InstCombine] Add tests for transforming (or/and (icmp eq/ne X,0),(icmp eq/ne X,Pow2OrZero)); NFC
1 parent 9a3cd0e commit 3cf4a50

File tree

1 file changed

+228
-6
lines changed

1 file changed

+228
-6
lines changed

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

Lines changed: 228 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,225 @@ 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_onefail(i8 %x) {
3217+
; CHECK-LABEL: @icmp_ne_and_z_and_onefail(
3218+
; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[X:%.*]], 2
3219+
; CHECK-NEXT: ret i1 [[R]]
3220+
;
3221+
%c0 = icmp ne i8 %x, 0
3222+
%cp2 = icmp ne i8 %x, 1
3223+
%cp3 = icmp ne i8 %x, 2
3224+
%rr = and i1 %c0, %cp2
3225+
%r = and i1 %rr, %cp3
3226+
ret i1 %r
3227+
}
3228+
3229+
define i1 @icmp_ne_and_z_and_pow2orz_fail_multiuse1(i8 %x, i8 %y) {
3230+
; CHECK-LABEL: @icmp_ne_and_z_and_pow2orz_fail_multiuse1(
3231+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3232+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3233+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 0
3234+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3235+
; CHECK-NEXT: call void @use(i1 [[C0]])
3236+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3237+
; CHECK-NEXT: ret i1 [[R]]
3238+
;
3239+
%ny = sub i8 0, %y
3240+
%pow2orz = and i8 %ny, %y
3241+
3242+
%c0 = icmp eq i8 %x, 0
3243+
%cp2 = icmp eq i8 %x, %pow2orz
3244+
call void @use(i1 %c0)
3245+
%r = or i1 %c0, %cp2
3246+
ret i1 %r
3247+
}
3248+
3249+
3250+
define <2 x i1> @icmp_ne_and_z_and_pow2orz_fail_logic_and(<2 x i8> %x, <2 x i8> %y) {
3251+
; CHECK-LABEL: @icmp_ne_and_z_and_pow2orz_fail_logic_and(
3252+
; CHECK-NEXT: [[NY:%.*]] = sub <2 x i8> zeroinitializer, [[Y:%.*]]
3253+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and <2 x i8> [[NY]], [[Y]]
3254+
; CHECK-NEXT: [[C0:%.*]] = icmp ne <2 x i8> [[X:%.*]], zeroinitializer
3255+
; CHECK-NEXT: [[CP2:%.*]] = icmp ne <2 x i8> [[POW2ORZ]], [[X]]
3256+
; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C0]], <2 x i1> [[CP2]], <2 x i1> zeroinitializer
3257+
; CHECK-NEXT: ret <2 x i1> [[R]]
3258+
;
3259+
%ny = sub <2 x i8> zeroinitializer, %y
3260+
%pow2orz = and <2 x i8> %ny, %y
3261+
3262+
%c0 = icmp ne <2 x i8> %x, zeroinitializer
3263+
%cp2 = icmp ne <2 x i8> %x, %pow2orz
3264+
%r = select <2 x i1> %c0, <2 x i1> %cp2, <2 x i1> zeroinitializer
3265+
ret <2 x i1> %r
3266+
}
3267+
3268+
define i1 @icmp_eq_or_z_or_pow2orz_fail_not_pow2(i8 %x, i8 %y) {
3269+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_fail_not_pow2(
3270+
; CHECK-NEXT: [[NY:%.*]] = sub i8 1, [[Y:%.*]]
3271+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3272+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 0
3273+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3274+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3275+
; CHECK-NEXT: ret i1 [[R]]
3276+
;
3277+
%ny = sub i8 1, %y
3278+
%pow2orz = and i8 %ny, %y
3279+
3280+
%c0 = icmp eq i8 %x, 0
3281+
%cp2 = icmp eq i8 %x, %pow2orz
3282+
%r = or i1 %c0, %cp2
3283+
ret i1 %r
3284+
}
3285+
3286+
define i1 @icmp_eq_or_z_or_pow2orz_fail_nonzero_const(i8 %x, i8 %y) {
3287+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_fail_nonzero_const(
3288+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3289+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3290+
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[X:%.*]], 1
3291+
; CHECK-NEXT: [[CP2:%.*]] = icmp eq i8 [[POW2ORZ]], [[X]]
3292+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3293+
; CHECK-NEXT: ret i1 [[R]]
3294+
;
3295+
%ny = sub i8 0, %y
3296+
%pow2orz = and i8 %ny, %y
3297+
3298+
%c0 = icmp eq i8 %x, 1
3299+
%cp2 = icmp eq i8 %x, %pow2orz
3300+
%r = or i1 %c0, %cp2
3301+
ret i1 %r
3302+
}
3303+
3304+
define <2 x i1> @icmp_ne_and_z_and_pow2orz_fail_bad_pred(<2 x i8> %x, <2 x i8> %y) {
3305+
; CHECK-LABEL: @icmp_ne_and_z_and_pow2orz_fail_bad_pred(
3306+
; CHECK-NEXT: [[NY:%.*]] = sub <2 x i8> zeroinitializer, [[Y:%.*]]
3307+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and <2 x i8> [[NY]], [[Y]]
3308+
; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i8> [[POW2ORZ]], [[X:%.*]]
3309+
; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[TMP1]], zeroinitializer
3310+
; CHECK-NEXT: ret <2 x i1> [[R]]
3311+
;
3312+
%ny = sub <2 x i8> zeroinitializer, %y
3313+
%pow2orz = and <2 x i8> %ny, %y
3314+
3315+
%c0 = icmp eq <2 x i8> %x, zeroinitializer
3316+
%cp2 = icmp eq <2 x i8> %x, %pow2orz
3317+
%r = and <2 x i1> %c0, %cp2
3318+
ret <2 x i1> %r
3319+
}
3320+
3321+
define i1 @icmp_eq_or_z_or_pow2orz_fail_bad_pred2(i8 %x, i8 %y) {
3322+
; CHECK-LABEL: @icmp_eq_or_z_or_pow2orz_fail_bad_pred2(
3323+
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
3324+
; CHECK-NEXT: [[POW2ORZ:%.*]] = and i8 [[NY]], [[Y]]
3325+
; CHECK-NEXT: [[C0:%.*]] = icmp slt i8 [[X:%.*]], 1
3326+
; CHECK-NEXT: [[CP2:%.*]] = icmp sge i8 [[POW2ORZ]], [[X]]
3327+
; CHECK-NEXT: [[R:%.*]] = or i1 [[C0]], [[CP2]]
3328+
; CHECK-NEXT: ret i1 [[R]]
3329+
;
3330+
%ny = sub i8 0, %y
3331+
%pow2orz = and i8 %ny, %y
3332+
3333+
%c0 = icmp sle i8 %x, 0
3334+
%cp2 = icmp sle i8 %x, %pow2orz
3335+
%r = or i1 %c0, %cp2
3336+
ret i1 %r
3337+
}

0 commit comments

Comments
 (0)