1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4declare i32 @llvm.smax.i32(i32 %a, i32 %b) 5declare i32 @llvm.smin.i32(i32 %a, i32 %b) 6declare i32 @llvm.umax.i32(i32 %a, i32 %b) 7declare i32 @llvm.umin.i32(i32 %a, i32 %b) 8 9define i32 @uadd_min_max(i32 %a, i32 %b) { 10; CHECK-LABEL: @uadd_min_max( 11; CHECK-NEXT: entry: 12; CHECK-NEXT: [[RES:%.*]] = add i32 [[A:%.*]], [[B:%.*]] 13; CHECK-NEXT: ret i32 [[RES]] 14; 15entry: 16 %max = call i32 @llvm.umax.i32(i32 %a, i32 %b) 17 %min = call i32 @llvm.umin.i32(i32 %a, i32 %b) 18 %res = add i32 %min, %max 19 ret i32 %res 20} 21 22define i32 @uadd_min_max_comm(i32 %a, i32 %b) { 23; CHECK-LABEL: @uadd_min_max_comm( 24; CHECK-NEXT: entry: 25; CHECK-NEXT: [[RES:%.*]] = add i32 [[B:%.*]], [[A:%.*]] 26; CHECK-NEXT: ret i32 [[RES]] 27; 28entry: 29 %max = call i32 @llvm.umax.i32(i32 %b, i32 %a) 30 %min = call i32 @llvm.umin.i32(i32 %a, i32 %b) 31 %res = add i32 %min, %max 32 ret i32 %res 33} 34 35define i32 @uadd_min_max_nuw_nsw(i32 %a, i32 %b) { 36; CHECK-LABEL: @uadd_min_max_nuw_nsw( 37; CHECK-NEXT: entry: 38; CHECK-NEXT: [[RES:%.*]] = add nuw nsw i32 [[A:%.*]], [[B:%.*]] 39; CHECK-NEXT: ret i32 [[RES]] 40; 41entry: 42 %max = call i32 @llvm.umax.i32(i32 %a, i32 %b) 43 %min = call i32 @llvm.umin.i32(i32 %a, i32 %b) 44 %res = add nuw nsw i32 %min, %max 45 ret i32 %res 46} 47 48define i32 @sadd_min_max(i32 %a, i32 %b) { 49; CHECK-LABEL: @sadd_min_max( 50; CHECK-NEXT: entry: 51; CHECK-NEXT: [[RES:%.*]] = add i32 [[A:%.*]], [[B:%.*]] 52; CHECK-NEXT: ret i32 [[RES]] 53; 54entry: 55 %max = call i32 @llvm.smax.i32(i32 %a, i32 %b) 56 %min = call i32 @llvm.smin.i32(i32 %a, i32 %b) 57 %res = add i32 %min, %max 58 ret i32 %res 59} 60 61define i32 @sadd_min_max_comm(i32 %a, i32 %b) { 62; CHECK-LABEL: @sadd_min_max_comm( 63; CHECK-NEXT: entry: 64; CHECK-NEXT: [[RES:%.*]] = add i32 [[B:%.*]], [[A:%.*]] 65; CHECK-NEXT: ret i32 [[RES]] 66; 67entry: 68 %max = call i32 @llvm.smax.i32(i32 %b, i32 %a) 69 %min = call i32 @llvm.smin.i32(i32 %a, i32 %b) 70 %res = add i32 %min, %max 71 ret i32 %res 72} 73 74define i32 @sadd_min_max_nuw_nsw(i32 %a, i32 %b) { 75; CHECK-LABEL: @sadd_min_max_nuw_nsw( 76; CHECK-NEXT: entry: 77; CHECK-NEXT: [[RES:%.*]] = add nuw nsw i32 [[A:%.*]], [[B:%.*]] 78; CHECK-NEXT: ret i32 [[RES]] 79; 80entry: 81 %max = call i32 @llvm.smax.i32(i32 %a, i32 %b) 82 %min = call i32 @llvm.smin.i32(i32 %a, i32 %b) 83 %res = add nuw nsw i32 %min, %max 84 ret i32 %res 85} 86