[llvm] 36158ce - [InstCombine] Add tests for min(a, b) +/* max(a, b) pattern.

Serguei Katkov via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 31 00:41:50 PDT 2023


Author: Serguei Katkov
Date: 2023-03-31T14:41:30+07:00
New Revision: 36158ce622068bd6256af78887ebe14d6d141140

URL: https://github.com/llvm/llvm-project/commit/36158ce622068bd6256af78887ebe14d6d141140
DIFF: https://github.com/llvm/llvm-project/commit/36158ce622068bd6256af78887ebe14d6d141140.diff

LOG: [InstCombine] Add tests for min(a,b) +/* max(a,b) pattern.

Added: 
    llvm/test/Transforms/InstCombine/add-min-max.ll
    llvm/test/Transforms/InstCombine/mul-min-max.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/add-min-max.ll b/llvm/test/Transforms/InstCombine/add-min-max.ll
new file mode 100644
index 0000000000000..d077d18f6ee97
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/add-min-max.ll
@@ -0,0 +1,97 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
+
+declare i32 @llvm.smax.i32(i32 %a, i32 %b)
+declare i32 @llvm.smin.i32(i32 %a, i32 %b)
+declare i32 @llvm.umax.i32(i32 %a, i32 %b)
+declare i32 @llvm.umin.i32(i32 %a, i32 %b)
+
+define i32 @uadd_min_max(i32 %a, i32 %b) {
+; CHECK-LABEL: @uadd_min_max(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 [[B:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = add i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)
+  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
+  %res = add i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @uadd_min_max_comm(i32 %a, i32 %b) {
+; CHECK-LABEL: @uadd_min_max_comm(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[B:%.*]], i32 [[A:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = add i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.umax.i32(i32 %b, i32 %a)
+  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
+  %res = add i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @uadd_min_max_nuw_nsw(i32 %a, i32 %b) {
+; CHECK-LABEL: @uadd_min_max_nuw_nsw(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 [[B:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = add nuw nsw i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)
+  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
+  %res = add nuw nsw i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @sadd_min_max(i32 %a, i32 %b) {
+; CHECK-LABEL: @sadd_min_max(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 [[B:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = add i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
+  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
+  %res = add i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @sadd_min_max_comm(i32 %a, i32 %b) {
+; CHECK-LABEL: @sadd_min_max_comm(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B:%.*]], i32 [[A:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = add i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.smax.i32(i32 %b, i32 %a)
+  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
+  %res = add i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @sadd_min_max_nuw_nsw(i32 %a, i32 %b) {
+; CHECK-LABEL: @sadd_min_max_nuw_nsw(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 [[B:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = add nuw nsw i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
+  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
+  %res = add nuw nsw i32 %min, %max
+  ret i32 %res
+}

diff  --git a/llvm/test/Transforms/InstCombine/mul-min-max.ll b/llvm/test/Transforms/InstCombine/mul-min-max.ll
new file mode 100644
index 0000000000000..e6808ffa18a5d
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/mul-min-max.ll
@@ -0,0 +1,97 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
+
+declare i32 @llvm.smax.i32(i32 %a, i32 %b)
+declare i32 @llvm.smin.i32(i32 %a, i32 %b)
+declare i32 @llvm.umax.i32(i32 %a, i32 %b)
+declare i32 @llvm.umin.i32(i32 %a, i32 %b)
+
+define i32 @umul_min_max(i32 %a, i32 %b) {
+; CHECK-LABEL: @umul_min_max(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 [[B:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = mul i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)
+  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
+  %res = mul i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @umul_min_max_comm(i32 %a, i32 %b) {
+; CHECK-LABEL: @umul_min_max_comm(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[B:%.*]], i32 [[A:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = mul i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.umax.i32(i32 %b, i32 %a)
+  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
+  %res = mul i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @umul_min_max_nuw_nsw(i32 %a, i32 %b) {
+; CHECK-LABEL: @umul_min_max_nuw_nsw(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 [[B:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = mul nuw nsw i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)
+  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
+  %res = mul nuw nsw i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @smul_min_max(i32 %a, i32 %b) {
+; CHECK-LABEL: @smul_min_max(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 [[B:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = mul i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
+  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
+  %res = mul i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @smul_min_max_comm(i32 %a, i32 %b) {
+; CHECK-LABEL: @smul_min_max_comm(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B:%.*]], i32 [[A:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = mul i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.smax.i32(i32 %b, i32 %a)
+  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
+  %res = mul i32 %min, %max
+  ret i32 %res
+}
+
+define i32 @smul_min_max_nuw_nsw(i32 %a, i32 %b) {
+; CHECK-LABEL: @smul_min_max_nuw_nsw(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 [[B:%.*]])
+; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = mul nuw nsw i32 [[MIN]], [[MAX]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
+  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
+  %res = mul nuw nsw i32 %min, %max
+  ret i32 %res
+}


        


More information about the llvm-commits mailing list