@@ -2316,3 +2316,40 @@ define i32 @uadd_sat_via_add_swapped_cmp_select_nonstrict(i32 %x, i32 %y) {
23162316 %r = select i1 %c , i32 %a , i32 -1
23172317 ret i32 %r
23182318}
2319+
2320+ define i8 @fold_add_umax_to_usub (i8 %a ) {
2321+ ; CHECK-LABEL: @fold_add_umax_to_usub(
2322+ ; CHECK-NEXT: [[UMAX:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10)
2323+ ; CHECK-NEXT: [[SEL:%.*]] = add i8 [[UMAX]], -10
2324+ ; CHECK-NEXT: ret i8 [[SEL]]
2325+ ;
2326+ %umax = call i8 @llvm.umax.i8 (i8 %a , i8 10 )
2327+ %sel = add i8 %umax , -10
2328+ ret i8 %sel
2329+ }
2330+
2331+ define i8 @fold_add_umax_to_usub_incorrect_rhs (i8 %a ) {
2332+ ; CHECK-LABEL: @fold_add_umax_to_usub_incorrect_rhs(
2333+ ; CHECK-NEXT: [[UMAX:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10)
2334+ ; CHECK-NEXT: [[SEL:%.*]] = add i8 [[UMAX]], -11
2335+ ; CHECK-NEXT: ret i8 [[SEL]]
2336+ ;
2337+ %umax = call i8 @llvm.umax.i8 (i8 %a , i8 10 )
2338+ %sel = add i8 %umax , -11
2339+ ret i8 %sel
2340+ }
2341+
2342+ define i8 @fold_add_umax_to_usub_multiuse (i8 %a ) {
2343+ ; CHECK-LABEL: @fold_add_umax_to_usub_multiuse(
2344+ ; CHECK-NEXT: [[UMAX:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10)
2345+ ; CHECK-NEXT: call void @usei8(i8 [[UMAX]])
2346+ ; CHECK-NEXT: [[SEL:%.*]] = add i8 [[UMAX]], -10
2347+ ; CHECK-NEXT: ret i8 [[SEL]]
2348+ ;
2349+ %umax = call i8 @llvm.umax.i8 (i8 %a , i8 10 )
2350+ call void @usei8 (i8 %umax )
2351+ %sel = add i8 %umax , -10
2352+ ret i8 %sel
2353+ }
2354+
2355+ declare void @usei8 (i8 )
0 commit comments