Skip to content

Commit a043af5

Browse files
committed
Pre-commit tests (NFC)
1 parent b698927 commit a043af5

File tree

1 file changed

+302
-0
lines changed

1 file changed

+302
-0
lines changed

llvm/test/Transforms/InstCombine/saturating-add-sub.ll

Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2351,3 +2351,305 @@ define i8 @fold_add_umax_to_usub_multiuse(i8 %a) {
23512351
}
23522352

23532353
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

Comments
 (0)