@@ -2351,3 +2351,305 @@ define i8 @fold_add_umax_to_usub_multiuse(i8 %a) {
23512351}
23522352
23532353declare 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