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