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