[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