@@ -2256,6 +2256,183 @@ define <2 x i1> @or_icmp_ne_A_0_icmp_ne_B_0_undef(<2 x i64> %a, <2 x i64> %b) {
2256
2256
ret <2 x i1 > %3
2257
2257
}
2258
2258
2259
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B (i64 %a , i64 %b ) {
2260
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B(
2261
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2262
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2263
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2264
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2265
+ ;
2266
+ %1 = icmp ne i64 %b , 0
2267
+ %2 = icmp uge i64 %a , %b
2268
+ %3 = and i1 %1 , %2
2269
+ ret i1 %3
2270
+ }
2271
+
2272
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_commuted1 (i64 %a , i64 %b ) {
2273
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_commuted1(
2274
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i64 [[A:%.*]], [[B:%.*]]
2275
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[B]], 0
2276
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2277
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2278
+ ;
2279
+ %1 = icmp uge i64 %a , %b
2280
+ %2 = icmp ne i64 %b , 0
2281
+ %3 = and i1 %1 , %2
2282
+ ret i1 %3
2283
+ }
2284
+
2285
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_commuted2 (i64 %a , i64 %b ) {
2286
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_commuted2(
2287
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2288
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp ule i64 [[B]], [[A:%.*]]
2289
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2290
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2291
+ ;
2292
+ %1 = icmp ne i64 %b , 0
2293
+ %2 = icmp ule i64 %b , %a
2294
+ %3 = and i1 %1 , %2
2295
+ ret i1 %3
2296
+ }
2297
+
2298
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_extra_use1 (i64 %a , i64 %b ) {
2299
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_extra_use1(
2300
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2301
+ ; CHECK-NEXT: call void @use_i1(i1 [[TMP1]])
2302
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2303
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2304
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2305
+ ;
2306
+ %1 = icmp ne i64 %b , 0
2307
+ call void @use_i1 (i1 %1 )
2308
+ %2 = icmp uge i64 %a , %b
2309
+ %3 = and i1 %1 , %2
2310
+ ret i1 %3
2311
+ }
2312
+
2313
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_extra_use2 (i64 %a , i64 %b ) {
2314
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_extra_use2(
2315
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2316
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2317
+ ; CHECK-NEXT: call void @use_i1(i1 [[TMP2]])
2318
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2319
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2320
+ ;
2321
+ %1 = icmp ne i64 %b , 0
2322
+ %2 = icmp uge i64 %a , %b
2323
+ call void @use_i1 (i1 %2 )
2324
+ %3 = and i1 %1 , %2
2325
+ ret i1 %3
2326
+ }
2327
+
2328
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_extra_use3 (i64 %a , i64 %b ) {
2329
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_extra_use3(
2330
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2331
+ ; CHECK-NEXT: call void @use_i1(i1 [[TMP1]])
2332
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2333
+ ; CHECK-NEXT: call void @use_i1(i1 [[TMP2]])
2334
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2335
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2336
+ ;
2337
+ %1 = icmp ne i64 %b , 0
2338
+ call void @use_i1 (i1 %1 )
2339
+ %2 = icmp uge i64 %a , %b
2340
+ call void @use_i1 (i1 %2 )
2341
+ %3 = and i1 %1 , %2
2342
+ ret i1 %3
2343
+ }
2344
+
2345
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_wrong_pred1 (i64 %a , i64 %b ) {
2346
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_wrong_pred1(
2347
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i64 [[B:%.*]], 0
2348
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2349
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2350
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2351
+ ;
2352
+ %1 = icmp sgt i64 %b , 0
2353
+ %2 = icmp uge i64 %a , %b
2354
+ %3 = and i1 %1 , %2
2355
+ ret i1 %3
2356
+ }
2357
+
2358
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_wrong_pred2 (i64 %a , i64 %b ) {
2359
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_wrong_pred2(
2360
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2361
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt i64 [[A:%.*]], [[B]]
2362
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2363
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2364
+ ;
2365
+ %1 = icmp ne i64 %b , 0
2366
+ %2 = icmp ugt i64 %a , %b
2367
+ %3 = and i1 %1 , %2
2368
+ ret i1 %3
2369
+ }
2370
+
2371
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_wrong_op1 (i64 %a , i64 %b ) {
2372
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_wrong_op1(
2373
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 1
2374
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2375
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2376
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2377
+ ;
2378
+ %1 = icmp ne i64 %b , 1
2379
+ %2 = icmp uge i64 %a , %b
2380
+ %3 = and i1 %1 , %2
2381
+ ret i1 %3
2382
+ }
2383
+
2384
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_wrong_op2 (i64 %a , i64 %b , i64 %c ) {
2385
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_wrong_op2(
2386
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2387
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[C:%.*]], [[B]]
2388
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2389
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2390
+ ;
2391
+ %1 = icmp ne i64 %b , 0
2392
+ %2 = icmp uge i64 %c , %b
2393
+ %3 = and i1 %1 , %2
2394
+ ret i1 %3
2395
+ }
2396
+
2397
+ define i1 @and_icmp_ne_B_0_icmp_uge_A_B_logical (i64 %a , i64 %b ) {
2398
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_logical(
2399
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2400
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2401
+ ; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false
2402
+ ; CHECK-NEXT: ret i1 [[TMP3]]
2403
+ ;
2404
+ %1 = icmp ne i64 %b , 0
2405
+ %2 = icmp uge i64 %a , %b
2406
+ %3 = select i1 %1 , i1 %2 , i1 false
2407
+ ret i1 %3
2408
+ }
2409
+
2410
+ define <2 x i1 > @and_icmp_ne_B_0_icmp_uge_A_B_uniform (<2 x i64 > %a , <2 x i64 > %b ) {
2411
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_uniform(
2412
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i64> [[B:%.*]], zeroinitializer
2413
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge <2 x i64> [[A:%.*]], [[B]]
2414
+ ; CHECK-NEXT: [[TMP3:%.*]] = and <2 x i1> [[TMP1]], [[TMP2]]
2415
+ ; CHECK-NEXT: ret <2 x i1> [[TMP3]]
2416
+ ;
2417
+ %1 = icmp ne <2 x i64 > %b , zeroinitializer
2418
+ %2 = icmp uge <2 x i64 > %a , %b
2419
+ %3 = and <2 x i1 > %1 , %2
2420
+ ret <2 x i1 > %3
2421
+ }
2422
+
2423
+ define <2 x i1 > @and_icmp_ne_B_0_icmp_uge_A_B_undef (<2 x i64 > %a , <2 x i64 > %b ) {
2424
+ ; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_undef(
2425
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i64> [[B:%.*]], <i64 0, i64 undef>
2426
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge <2 x i64> [[A:%.*]], [[B]]
2427
+ ; CHECK-NEXT: [[TMP3:%.*]] = and <2 x i1> [[TMP1]], [[TMP2]]
2428
+ ; CHECK-NEXT: ret <2 x i1> [[TMP3]]
2429
+ ;
2430
+ %1 = icmp ne <2 x i64 > %b , <i64 0 , i64 undef >
2431
+ %2 = icmp uge <2 x i64 > %a , %b
2432
+ %3 = and <2 x i1 > %1 , %2
2433
+ ret <2 x i1 > %3
2434
+ }
2435
+
2259
2436
define i1 @icmp_add_ult_2 (i32 %X ) {
2260
2437
; CHECK-LABEL: @icmp_add_ult_2(
2261
2438
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -2
@@ -3807,6 +3984,7 @@ define <4 x i1> @signbit_bitcast_fpext_vec_wrong_bitcast(<2 x half> %x) {
3807
3984
ret <4 x i1 > %r
3808
3985
}
3809
3986
3987
+ declare void @use_i1 (i1 )
3810
3988
declare void @use_i64 (i64 )
3811
3989
3812
3990
define i1 @signbit_bitcast_fpext_extra_use (float %x , i64* %p ) {
0 commit comments