[llvm] [InstCombine] Fold zext-add/sub-min/max-trunc to uadd.sat or usub.sat (PR #185259)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 27 03:40:43 PDT 2026


================
@@ -2858,3 +2858,195 @@ entry:
   %res = select i1 %cmp, i32 %add, i32 2147483647
   ret i32 %res
 }
+
+; Fold zext-add-umin-trunc to uadd.sat
+define i8 @fold_umin_to_uadd_sat(i8 %a, i8 %b) {
+; CHECK-LABEL: @fold_umin_to_uadd_sat(
+; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[B:%.*]], i8 [[A:%.*]])
+; CHECK-NEXT:    ret i8 [[R]]
+;
+  %za = zext i8 %a to i16
+  %zb = zext i8 %b to i16
+  %zsum = add nuw nsw i16 %zb, %za
+  %cmp = call i16 @llvm.umin.i16(i16 %zsum, i16 255)
+  %r = trunc nuw i16 %cmp to i8
+  ret i8 %r
+}
+
+; Fold zext-add-umin-trunc to uadd.sat with illegal type
+define i3 @fold_umin_to_uadd_sat_with_illegal_type(i3 %a, i3 %b) {
+; CHECK-LABEL: @fold_umin_to_uadd_sat_with_illegal_type(
+; CHECK-NEXT:    [[R:%.*]] = call i3 @llvm.uadd.sat.i3(i3 [[B:%.*]], i3 [[A:%.*]])
+; CHECK-NEXT:    ret i3 [[R]]
+;
+  %za = zext i3 %a to i11
+  %zb = zext i3 %b to i11
+  %zsum = add nuw nsw i11 %zb, %za
+  %cmp = call i11 @llvm.umin.i11(i11 %zsum, i11 7)
+  %r = trunc nuw i11 %cmp to i3
+  ret i3 %r
+}
+
+; Fold zext-add-umin-trunc to uadd.sat with commuted operations
+define i8 @fold_umin_to_uadd_sat_with_commuted_operations(i8 %a, i8 %b) {
+; CHECK-LABEL: @fold_umin_to_uadd_sat_with_commuted_operations(
+; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[A:%.*]], i8 [[B:%.*]])
+; CHECK-NEXT:    ret i8 [[R]]
+;
+  %za = zext i8 %a to i16
+  %zb = zext i8 %b to i16
+  %zsum = add nuw nsw i16 %za, %zb
+  %cmp = call i16 @llvm.umin.i16(i16 %zsum, i16 255)
+  %r = trunc nuw i16 %cmp to i8
+  ret i8 %r
+}
+
+; Multi-use test: zext-add-umin-trunc, but add has multi use
+define i8 @no_fold_umin_to_uadd_sat_if_has_multi_use(i8 %a, i8 %b) {
----------------
nikic wrote:

Missing test for multi-use on the umin. Also missing test for multi-use on the zext (which should fold).

https://github.com/llvm/llvm-project/pull/185259


More information about the llvm-commits mailing list