xref: /llvm-project/llvm/test/Transforms/InstCombine/mul-min-max.ll (revision 624973806c5644ccfa84805319b5852edb68d48d)
136158ce6SSerguei Katkov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
236158ce6SSerguei Katkov; RUN: opt < %s -passes=instcombine -S | FileCheck %s
336158ce6SSerguei Katkov
436158ce6SSerguei Katkovdeclare i32 @llvm.smax.i32(i32 %a, i32 %b)
536158ce6SSerguei Katkovdeclare i32 @llvm.smin.i32(i32 %a, i32 %b)
636158ce6SSerguei Katkovdeclare i32 @llvm.umax.i32(i32 %a, i32 %b)
736158ce6SSerguei Katkovdeclare i32 @llvm.umin.i32(i32 %a, i32 %b)
836158ce6SSerguei Katkov
936158ce6SSerguei Katkovdefine i32 @umul_min_max(i32 %a, i32 %b) {
1036158ce6SSerguei Katkov; CHECK-LABEL: @umul_min_max(
1136158ce6SSerguei Katkov; CHECK-NEXT:  entry:
12*62497380SSerguei Katkov; CHECK-NEXT:    [[RES:%.*]] = mul i32 [[A:%.*]], [[B:%.*]]
1336158ce6SSerguei Katkov; CHECK-NEXT:    ret i32 [[RES]]
1436158ce6SSerguei Katkov;
1536158ce6SSerguei Katkoventry:
1636158ce6SSerguei Katkov  %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)
1736158ce6SSerguei Katkov  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
1836158ce6SSerguei Katkov  %res = mul i32 %min, %max
1936158ce6SSerguei Katkov  ret i32 %res
2036158ce6SSerguei Katkov}
2136158ce6SSerguei Katkov
2236158ce6SSerguei Katkovdefine i32 @umul_min_max_comm(i32 %a, i32 %b) {
2336158ce6SSerguei Katkov; CHECK-LABEL: @umul_min_max_comm(
2436158ce6SSerguei Katkov; CHECK-NEXT:  entry:
25*62497380SSerguei Katkov; CHECK-NEXT:    [[RES:%.*]] = mul i32 [[B:%.*]], [[A:%.*]]
2636158ce6SSerguei Katkov; CHECK-NEXT:    ret i32 [[RES]]
2736158ce6SSerguei Katkov;
2836158ce6SSerguei Katkoventry:
2936158ce6SSerguei Katkov  %max = call i32 @llvm.umax.i32(i32 %b, i32 %a)
3036158ce6SSerguei Katkov  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
3136158ce6SSerguei Katkov  %res = mul i32 %min, %max
3236158ce6SSerguei Katkov  ret i32 %res
3336158ce6SSerguei Katkov}
3436158ce6SSerguei Katkov
3536158ce6SSerguei Katkovdefine i32 @umul_min_max_nuw_nsw(i32 %a, i32 %b) {
3636158ce6SSerguei Katkov; CHECK-LABEL: @umul_min_max_nuw_nsw(
3736158ce6SSerguei Katkov; CHECK-NEXT:  entry:
38*62497380SSerguei Katkov; CHECK-NEXT:    [[RES:%.*]] = mul nuw nsw i32 [[A:%.*]], [[B:%.*]]
3936158ce6SSerguei Katkov; CHECK-NEXT:    ret i32 [[RES]]
4036158ce6SSerguei Katkov;
4136158ce6SSerguei Katkoventry:
4236158ce6SSerguei Katkov  %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)
4336158ce6SSerguei Katkov  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
4436158ce6SSerguei Katkov  %res = mul nuw nsw i32 %min, %max
4536158ce6SSerguei Katkov  ret i32 %res
4636158ce6SSerguei Katkov}
4736158ce6SSerguei Katkov
4836158ce6SSerguei Katkovdefine i32 @smul_min_max(i32 %a, i32 %b) {
4936158ce6SSerguei Katkov; CHECK-LABEL: @smul_min_max(
5036158ce6SSerguei Katkov; CHECK-NEXT:  entry:
51*62497380SSerguei Katkov; CHECK-NEXT:    [[RES:%.*]] = mul i32 [[A:%.*]], [[B:%.*]]
5236158ce6SSerguei Katkov; CHECK-NEXT:    ret i32 [[RES]]
5336158ce6SSerguei Katkov;
5436158ce6SSerguei Katkoventry:
5536158ce6SSerguei Katkov  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
5636158ce6SSerguei Katkov  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
5736158ce6SSerguei Katkov  %res = mul i32 %min, %max
5836158ce6SSerguei Katkov  ret i32 %res
5936158ce6SSerguei Katkov}
6036158ce6SSerguei Katkov
6136158ce6SSerguei Katkovdefine i32 @smul_min_max_comm(i32 %a, i32 %b) {
6236158ce6SSerguei Katkov; CHECK-LABEL: @smul_min_max_comm(
6336158ce6SSerguei Katkov; CHECK-NEXT:  entry:
64*62497380SSerguei Katkov; CHECK-NEXT:    [[RES:%.*]] = mul i32 [[B:%.*]], [[A:%.*]]
6536158ce6SSerguei Katkov; CHECK-NEXT:    ret i32 [[RES]]
6636158ce6SSerguei Katkov;
6736158ce6SSerguei Katkoventry:
6836158ce6SSerguei Katkov  %max = call i32 @llvm.smax.i32(i32 %b, i32 %a)
6936158ce6SSerguei Katkov  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
7036158ce6SSerguei Katkov  %res = mul i32 %min, %max
7136158ce6SSerguei Katkov  ret i32 %res
7236158ce6SSerguei Katkov}
7336158ce6SSerguei Katkov
7436158ce6SSerguei Katkovdefine i32 @smul_min_max_nuw_nsw(i32 %a, i32 %b) {
7536158ce6SSerguei Katkov; CHECK-LABEL: @smul_min_max_nuw_nsw(
7636158ce6SSerguei Katkov; CHECK-NEXT:  entry:
77*62497380SSerguei Katkov; CHECK-NEXT:    [[RES:%.*]] = mul nuw nsw i32 [[A:%.*]], [[B:%.*]]
7836158ce6SSerguei Katkov; CHECK-NEXT:    ret i32 [[RES]]
7936158ce6SSerguei Katkov;
8036158ce6SSerguei Katkoventry:
8136158ce6SSerguei Katkov  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
8236158ce6SSerguei Katkov  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
8336158ce6SSerguei Katkov  %res = mul nuw nsw i32 %min, %max
8436158ce6SSerguei Katkov  ret i32 %res
8536158ce6SSerguei Katkov}
86