@@ -2351,3 +2351,305 @@ define i8 @fold_add_umax_to_usub_multiuse(i8 %a) {
2351
2351
}
2352
2352
2353
2353
declare void @usei8 (i8 )
2354
+
2355
+ define i8 @sadd_sat_uge_int_max (i8 %x , i8 %y ) {
2356
+ ; CHECK-LABEL: @sadd_sat_uge_int_max(
2357
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 127
2358
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y:%.*]]
2359
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2360
+ ; CHECK-NEXT: ret i8 [[R]]
2361
+ ;
2362
+ %cmp = icmp sge i8 %x , 127
2363
+ %add = add i8 %x , %y
2364
+ %r = select i1 %cmp , i8 127 , i8 %add
2365
+ ret i8 %r
2366
+ }
2367
+
2368
+ define i8 @sadd_sat_ugt_int_max (i8 %x , i8 %y ) {
2369
+ ; CHECK-LABEL: @sadd_sat_ugt_int_max(
2370
+ ; CHECK-NEXT: [[R:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]
2371
+ ; CHECK-NEXT: ret i8 [[R]]
2372
+ ;
2373
+ %cmp = icmp sgt i8 %x , 127
2374
+ %add = add i8 %x , %y
2375
+ %r = select i1 %cmp , i8 127 , i8 %add
2376
+ ret i8 %r
2377
+ }
2378
+
2379
+ define i8 @sadd_sat_eq_int_max (i8 %x ) {
2380
+ ; CHECK-LABEL: @sadd_sat_eq_int_max(
2381
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 127
2382
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 1
2383
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2384
+ ; CHECK-NEXT: ret i8 [[R]]
2385
+ ;
2386
+ %cmp = icmp eq i8 %x , 127
2387
+ %add = add i8 %x , 1
2388
+ %r = select i1 %cmp , i8 127 , i8 %add
2389
+ ret i8 %r
2390
+ }
2391
+
2392
+ define i8 @sadd_sat_constant (i8 %x ) {
2393
+ ; CHECK-LABEL: @sadd_sat_constant(
2394
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 117)
2395
+ ; CHECK-NEXT: [[R:%.*]] = add nsw i8 [[TMP1]], 10
2396
+ ; CHECK-NEXT: ret i8 [[R]]
2397
+ ;
2398
+ %cmp = icmp sge i8 %x , 118
2399
+ %add = add i8 %x , 10
2400
+ %r = select i1 %cmp , i8 127 , i8 %add
2401
+ ret i8 %r
2402
+ }
2403
+
2404
+ define i8 @sadd_sat_negative_no_fold (i8 %x , i8 %y ) {
2405
+ ; CHECK-LABEL: @sadd_sat_negative_no_fold(
2406
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 127
2407
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y:%.*]]
2408
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2409
+ ; CHECK-NEXT: ret i8 [[R]]
2410
+ ;
2411
+ %cmp = icmp sge i8 %x , 127
2412
+ %add = add i8 %x , %y
2413
+ %r = select i1 %cmp , i8 127 , i8 %add
2414
+ ret i8 %r
2415
+ }
2416
+
2417
+ define i8 @sadd_sat_wrong_predicate (i8 %x , i8 %y ) {
2418
+ ; CHECK-LABEL: @sadd_sat_wrong_predicate(
2419
+ ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[X:%.*]], 127
2420
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[Y:%.*]], 127
2421
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP_NOT]], i8 [[ADD]], i8 127
2422
+ ; CHECK-NEXT: ret i8 [[R]]
2423
+ ;
2424
+ %cmp = icmp slt i8 %x , 127
2425
+ %add = add i8 %x , %y
2426
+ %r = select i1 %cmp , i8 127 , i8 %add
2427
+ ret i8 %r
2428
+ }
2429
+
2430
+ define i8 @sadd_sat_wrong_constant (i8 %x , i8 %y ) {
2431
+ ; CHECK-LABEL: @sadd_sat_wrong_constant(
2432
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 125
2433
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y:%.*]]
2434
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2435
+ ; CHECK-NEXT: ret i8 [[R]]
2436
+ ;
2437
+ %cmp = icmp sge i8 %x , 126
2438
+ %add = add i8 %x , %y
2439
+ %r = select i1 %cmp , i8 127 , i8 %add
2440
+ ret i8 %r
2441
+ }
2442
+
2443
+ define <2 x i8 > @sadd_sat_vector (<2 x i8 > %x , <2 x i8 > %y ) {
2444
+ ; CHECK-LABEL: @sadd_sat_vector(
2445
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], splat (i8 127)
2446
+ ; CHECK-NEXT: [[ADD:%.*]] = add <2 x i8> [[X]], [[Y:%.*]]
2447
+ ; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[CMP]], <2 x i8> splat (i8 127), <2 x i8> [[ADD]]
2448
+ ; CHECK-NEXT: ret <2 x i8> [[R]]
2449
+ ;
2450
+ %cmp = icmp sge <2 x i8 > %x , <i8 127 , i8 127 >
2451
+ %add = add <2 x i8 > %x , %y
2452
+ %r = select <2 x i1 > %cmp , <2 x i8 > <i8 127 , i8 127 >, <2 x i8 > %add
2453
+ ret <2 x i8 > %r
2454
+ }
2455
+
2456
+ define <2 x i8 > @sadd_sat_vector_constant (<2 x i8 > %x ) {
2457
+ ; CHECK-LABEL: @sadd_sat_vector_constant(
2458
+ ; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[X:%.*]], <2 x i8> <i8 117, i8 107>)
2459
+ ; CHECK-NEXT: [[R:%.*]] = add <2 x i8> [[TMP1]], <i8 10, i8 20>
2460
+ ; CHECK-NEXT: ret <2 x i8> [[R]]
2461
+ ;
2462
+ %cmp = icmp sge <2 x i8 > %x , <i8 118 , i8 108 >
2463
+ %add = add <2 x i8 > %x , <i8 10 , i8 20 >
2464
+ %r = select <2 x i1 > %cmp , <2 x i8 > <i8 127 , i8 127 >, <2 x i8 > %add
2465
+ ret <2 x i8 > %r
2466
+ }
2467
+
2468
+ define i8 @sadd_sat_int_max_minus_x (i8 %x , i8 %y ) {
2469
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x(
2470
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i8 127, [[X:%.*]]
2471
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SUB]], [[Y:%.*]]
2472
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2473
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2474
+ ; CHECK-NEXT: ret i8 [[R]]
2475
+ ;
2476
+ %sub = sub i8 127 , %x
2477
+ %cmp = icmp slt i8 %sub , %y
2478
+ %add = add i8 %x , %y
2479
+ %r = select i1 %cmp , i8 127 , i8 %add
2480
+ ret i8 %r
2481
+ }
2482
+
2483
+ define i8 @sadd_sat_int_max_minus_x_commuted (i8 %x , i8 %y ) {
2484
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_commuted(
2485
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i8 127, [[X:%.*]]
2486
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[SUB]]
2487
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2488
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2489
+ ; CHECK-NEXT: ret i8 [[R]]
2490
+ ;
2491
+ %sub = sub i8 127 , %x
2492
+ %cmp = icmp sgt i8 %y , %sub
2493
+ %add = add i8 %x , %y
2494
+ %r = select i1 %cmp , i8 127 , i8 %add
2495
+ ret i8 %r
2496
+ }
2497
+
2498
+ define i8 @sadd_sat_int_max_minus_x_nonstrict (i8 %x , i8 %y ) {
2499
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_nonstrict(
2500
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i8 127, [[X:%.*]]
2501
+ ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i8 [[SUB]], [[Y:%.*]]
2502
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2503
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP_NOT]], i8 [[ADD]], i8 127
2504
+ ; CHECK-NEXT: ret i8 [[R]]
2505
+ ;
2506
+ %sub = sub i8 127 , %x
2507
+ %cmp = icmp sle i8 %sub , %y
2508
+ %add = add i8 %x , %y
2509
+ %r = select i1 %cmp , i8 127 , i8 %add
2510
+ ret i8 %r
2511
+ }
2512
+
2513
+ define i8 @sadd_sat_int_max_minus_x_commuted_nonstrict (i8 %x , i8 %y ) {
2514
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_commuted_nonstrict(
2515
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i8 127, [[X:%.*]]
2516
+ ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i8 [[Y:%.*]], [[SUB]]
2517
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2518
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP_NOT]], i8 [[ADD]], i8 127
2519
+ ; CHECK-NEXT: ret i8 [[R]]
2520
+ ;
2521
+ %sub = sub i8 127 , %x
2522
+ %cmp = icmp sge i8 %y , %sub
2523
+ %add = add i8 %x , %y
2524
+ %r = select i1 %cmp , i8 127 , i8 %add
2525
+ ret i8 %r
2526
+ }
2527
+
2528
+ define i8 @sadd_sat_int_max_minus_x_wrong_constant (i8 %x , i8 %y ) {
2529
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_wrong_constant(
2530
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i8 126, [[X:%.*]]
2531
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SUB]], [[Y:%.*]]
2532
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2533
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2534
+ ; CHECK-NEXT: ret i8 [[R]]
2535
+ ;
2536
+ %sub = sub i8 126 , %x
2537
+ %cmp = icmp slt i8 %sub , %y
2538
+ %add = add i8 %x , %y
2539
+ %r = select i1 %cmp , i8 127 , i8 %add
2540
+ ret i8 %r
2541
+ }
2542
+
2543
+ define i8 @sadd_sat_int_max_minus_x_wrong_predicate (i8 %x , i8 %y ) {
2544
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_wrong_predicate(
2545
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i8 127, [[X:%.*]]
2546
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[SUB]], [[Y:%.*]]
2547
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2548
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2549
+ ; CHECK-NEXT: ret i8 [[R]]
2550
+ ;
2551
+ %sub = sub i8 127 , %x
2552
+ %cmp = icmp sgt i8 %sub , %y
2553
+ %add = add i8 %x , %y
2554
+ %r = select i1 %cmp , i8 127 , i8 %add
2555
+ ret i8 %r
2556
+ }
2557
+
2558
+ define <2 x i8 > @sadd_sat_int_max_minus_x_vector (<2 x i8 > %x , <2 x i8 > %y ) {
2559
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_vector(
2560
+ ; CHECK-NEXT: [[SUB:%.*]] = sub <2 x i8> splat (i8 127), [[X:%.*]]
2561
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[SUB]], [[Y:%.*]]
2562
+ ; CHECK-NEXT: [[ADD:%.*]] = add <2 x i8> [[X]], [[Y]]
2563
+ ; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[CMP]], <2 x i8> splat (i8 127), <2 x i8> [[ADD]]
2564
+ ; CHECK-NEXT: ret <2 x i8> [[R]]
2565
+ ;
2566
+ %sub = sub <2 x i8 > <i8 127 , i8 127 >, %x
2567
+ %cmp = icmp slt <2 x i8 > %sub , %y
2568
+ %add = add <2 x i8 > %x , %y
2569
+ %r = select <2 x i1 > %cmp , <2 x i8 > <i8 127 , i8 127 >, <2 x i8 > %add
2570
+ ret <2 x i8 > %r
2571
+ }
2572
+
2573
+ define i8 @sadd_sat_commuted_select (i8 %x , i8 %y ) {
2574
+ ; CHECK-LABEL: @sadd_sat_commuted_select(
2575
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 127
2576
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[Y:%.*]], 127
2577
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 127
2578
+ ; CHECK-NEXT: ret i8 [[R]]
2579
+ ;
2580
+ %cmp = icmp sge i8 %x , 127
2581
+ %add = add i8 %x , %y
2582
+ %r = select i1 %cmp , i8 %add , i8 127
2583
+ ret i8 %r
2584
+ }
2585
+
2586
+ define i8 @sadd_sat_commuted_add (i8 %x , i8 %y ) {
2587
+ ; CHECK-LABEL: @sadd_sat_commuted_add(
2588
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 127
2589
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[Y:%.*]], [[X]]
2590
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2591
+ ; CHECK-NEXT: ret i8 [[R]]
2592
+ ;
2593
+ %cmp = icmp sge i8 %x , 127
2594
+ %add = add i8 %y , %x
2595
+ %r = select i1 %cmp , i8 127 , i8 %add
2596
+ ret i8 %r
2597
+ }
2598
+
2599
+ define i8 @sadd_sat_commuted_both (i8 %x , i8 %y ) {
2600
+ ; CHECK-LABEL: @sadd_sat_commuted_both(
2601
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 127
2602
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[Y:%.*]], 127
2603
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 127
2604
+ ; CHECK-NEXT: ret i8 [[R]]
2605
+ ;
2606
+ %cmp = icmp sge i8 %x , 127
2607
+ %add = add i8 %y , %x
2608
+ %r = select i1 %cmp , i8 %add , i8 127
2609
+ ret i8 %r
2610
+ }
2611
+
2612
+ define i8 @sadd_sat_int_max_minus_x_nsw_slt (i8 %x , i8 %y ) {
2613
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_nsw_slt(
2614
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 127, [[X:%.*]]
2615
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SUB]], [[Y:%.*]]
2616
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2617
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2618
+ ; CHECK-NEXT: ret i8 [[R]]
2619
+ ;
2620
+ %sub = sub nsw i8 127 , %x
2621
+ %cmp = icmp slt i8 %sub , %y
2622
+ %add = add i8 %x , %y
2623
+ %r = select i1 %cmp , i8 127 , i8 %add
2624
+ ret i8 %r
2625
+ }
2626
+
2627
+ define i8 @sadd_sat_int_max_minus_x_nsw_sge_commuted (i8 %x , i8 %y ) {
2628
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_nsw_sge_commuted(
2629
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 127, [[X:%.*]]
2630
+ ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i8 [[Y:%.*]], [[SUB]]
2631
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2632
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP_NOT]], i8 [[ADD]], i8 127
2633
+ ; CHECK-NEXT: ret i8 [[R]]
2634
+ ;
2635
+ %sub = sub nsw i8 127 , %x
2636
+ %cmp = icmp sge i8 %y , %sub
2637
+ %add = add i8 %x , %y
2638
+ %r = select i1 %cmp , i8 127 , i8 %add
2639
+ ret i8 %r
2640
+ }
2641
+
2642
+ define i8 @sadd_sat_int_max_minus_x_no_nsw_neg (i8 %x , i8 %y ) {
2643
+ ; CHECK-LABEL: @sadd_sat_int_max_minus_x_no_nsw_neg(
2644
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i8 127, [[X:%.*]]
2645
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SUB]], [[Y:%.*]]
2646
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[Y]]
2647
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
2648
+ ; CHECK-NEXT: ret i8 [[R]]
2649
+ ;
2650
+ %sub = sub i8 127 , %x
2651
+ %cmp = icmp slt i8 %sub , %y
2652
+ %add = add i8 %x , %y
2653
+ %r = select i1 %cmp , i8 127 , i8 %add
2654
+ ret i8 %r
2655
+ }
0 commit comments