@@ -2316,3 +2316,39 @@ 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: [[SEL:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A:%.*]], i8 10)
2323+ ; CHECK-NEXT: ret i8 [[SEL]]
2324+ ;
2325+ %umax = call i8 @llvm.umax.i8 (i8 %a , i8 10 )
2326+ %sel = add i8 %umax , -10
2327+ ret i8 %sel
2328+ }
2329+
2330+ define i8 @fold_add_umax_to_usub_incorrect_rhs (i8 %a ) {
2331+ ; CHECK-LABEL: @fold_add_umax_to_usub_incorrect_rhs(
2332+ ; CHECK-NEXT: [[UMAX:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10)
2333+ ; CHECK-NEXT: [[SEL:%.*]] = add i8 [[UMAX]], -11
2334+ ; CHECK-NEXT: ret i8 [[SEL]]
2335+ ;
2336+ %umax = call i8 @llvm.umax.i8 (i8 %a , i8 10 )
2337+ %sel = add i8 %umax , -11
2338+ ret i8 %sel
2339+ }
2340+
2341+ define i8 @fold_add_umax_to_usub_multiuse (i8 %a ) {
2342+ ; CHECK-LABEL: @fold_add_umax_to_usub_multiuse(
2343+ ; CHECK-NEXT: [[UMAX:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10)
2344+ ; CHECK-NEXT: call void @usei8(i8 [[UMAX]])
2345+ ; CHECK-NEXT: [[SEL:%.*]] = add i8 [[UMAX]], -10
2346+ ; CHECK-NEXT: ret i8 [[SEL]]
2347+ ;
2348+ %umax = call i8 @llvm.umax.i8 (i8 %a , i8 10 )
2349+ call void @usei8 (i8 %umax )
2350+ %sel = add i8 %umax , -10
2351+ ret i8 %sel
2352+ }
2353+
2354+ declare void @usei8 (i8 )
0 commit comments