1 ; RUN: opt -S -instcombine < %s | FileCheck %s 2 3 define i32 @compute_min_2(i32 %x, i32 %y) { 4 ; CHECK-LABEL: compute_min_2 5 entry: 6 %not_x = sub i32 -1, %x 7 %not_y = sub i32 -1, %y 8 %cmp = icmp sgt i32 %not_x, %not_y 9 %not_min = select i1 %cmp, i32 %not_x, i32 %not_y 10 %min = sub i32 -1, %not_min 11 ret i32 %min 12 13 ; CHECK: %0 = icmp slt i32 %x, %y 14 ; CHECK-NEXT: %1 = select i1 %0, i32 %x, i32 %y 15 ; CHECK-NEXT: ret i32 %1 16 } 17 18 define i32 @compute_min_3(i32 %x, i32 %y, i32 %z) { 19 ; CHECK-LABEL: compute_min_3 20 entry: 21 %not_x = sub i32 -1, %x 22 %not_y = sub i32 -1, %y 23 %not_z = sub i32 -1, %z 24 %cmp_1 = icmp sgt i32 %not_x, %not_y 25 %not_min_1 = select i1 %cmp_1, i32 %not_x, i32 %not_y 26 %cmp_2 = icmp sgt i32 %not_min_1, %not_z 27 %not_min_2 = select i1 %cmp_2, i32 %not_min_1, i32 %not_z 28 %min = sub i32 -1, %not_min_2 29 ret i32 %min 30 31 ; CHECK: %0 = icmp slt i32 %x, %y 32 ; CHECK-NEXT: %1 = select i1 %0, i32 %x, i32 %y 33 ; CHECK-NEXT: %2 = icmp slt i32 %1, %z 34 ; CHECK-NEXT: %3 = select i1 %2, i32 %1, i32 %z 35 ; CHECK-NEXT: ret i32 %3 36 } 37 38 define i32 @compute_min_arithmetic(i32 %x, i32 %y) { 39 ; CHECK-LABEL: compute_min_arithmetic 40 entry: 41 %not_value = sub i32 3, %x 42 %not_y = sub i32 -1, %y 43 %cmp = icmp sgt i32 %not_value, %not_y 44 %not_min = select i1 %cmp, i32 %not_value, i32 %not_y 45 ret i32 %not_min 46 47 ; CHECK: %0 = add i32 %x, -4 48 ; CHECK-NEXT: %1 = icmp slt i32 %0, %y 49 ; CHECK-NEXT: %2 = select i1 %1, i32 %0, i32 %y 50 ; CHECK-NEXT: %3 = xor i32 %2, -1 51 ; CHECK-NEXT: ret i32 %3 52 } 53 54 declare void @fake_use(i32) 55 56 define i32 @compute_min_pessimization(i32 %x, i32 %y) { 57 ; CHECK-LABEL: compute_min_pessimization 58 entry: 59 %not_value = sub i32 3, %x 60 call void @fake_use(i32 %not_value) 61 %not_y = sub i32 -1, %y 62 %cmp = icmp sgt i32 %not_value, %not_y 63 ; CHECK: %not_value = sub i32 3, %x 64 ; CHECK: %cmp = icmp sgt i32 %not_value, %not_y 65 %not_min = select i1 %cmp, i32 %not_value, i32 %not_y 66 %min = sub i32 -1, %not_min 67 ret i32 %min 68 } 69 70 define i32 @max_of_nots(i32 %x, i32 %y) { 71 ; CHECK-LABEL: @max_of_nots( 72 ; CHECK-NEXT: icmp 73 ; CHECK-NEXT: select 74 ; CHECK-NEXT: icmp 75 ; CHECK-NEXT: select 76 ; CHECK-NEXT: xor 77 ; CHECK-NEXT: ret 78 %c0 = icmp sgt i32 %y, 0 79 %xor_y = xor i32 %y, -1 80 %s0 = select i1 %c0, i32 %xor_y, i32 -1 81 %xor_x = xor i32 %x, -1 82 %c1 = icmp slt i32 %s0, %xor_x 83 %smax96 = select i1 %c1, i32 %xor_x, i32 %s0 84 ret i32 %smax96 85 } 86