@@ -3057,9 +3057,9 @@ define i32 @icmp_slt_0_or_icmp_add_1_sge_100_i32_fail(i32 %x) {
3057
3057
define i1 @logical_and_icmps1 (i32 %a , i1 %other_cond ) {
3058
3058
; CHECK-LABEL: @logical_and_icmps1(
3059
3059
; 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 ]]
3063
3063
;
3064
3064
entry:
3065
3065
%cmp1 = icmp sgt i32 %a , -1
@@ -3085,9 +3085,9 @@ entry:
3085
3085
define <4 x i1 > @logical_and_icmps_vec1 (<4 x i32 > %a , <4 x i1 > %other_cond ) {
3086
3086
; CHECK-LABEL: @logical_and_icmps_vec1(
3087
3087
; 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 ]]
3091
3091
;
3092
3092
entry:
3093
3093
%cmp1 = icmp sgt <4 x i32 > %a , <i32 -1 , i32 -1 , i32 -1 , i32 -1 >
@@ -3113,3 +3113,225 @@ entry:
3113
3113
%ret = select i1 %logical_and , i1 %cmp2 , i1 false
3114
3114
ret i1 %ret
3115
3115
}
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