| ; RUN: opt -S -instcombine < %s | FileCheck %s |
| |
| define i32 @compute_min_2(i32 %x, i32 %y) { |
| ; CHECK-LABEL: compute_min_2 |
| entry: |
| %not_x = sub i32 -1, %x |
| %not_y = sub i32 -1, %y |
| %cmp = icmp sgt i32 %not_x, %not_y |
| %not_min = select i1 %cmp, i32 %not_x, i32 %not_y |
| %min = sub i32 -1, %not_min |
| ret i32 %min |
| |
| ; CHECK: %0 = icmp slt i32 %x, %y |
| ; CHECK-NEXT: %1 = select i1 %0, i32 %x, i32 %y |
| ; CHECK-NEXT: ret i32 %1 |
| } |
| |
| define i32 @compute_min_3(i32 %x, i32 %y, i32 %z) { |
| ; CHECK-LABEL: compute_min_3 |
| entry: |
| %not_x = sub i32 -1, %x |
| %not_y = sub i32 -1, %y |
| %not_z = sub i32 -1, %z |
| %cmp_1 = icmp sgt i32 %not_x, %not_y |
| %not_min_1 = select i1 %cmp_1, i32 %not_x, i32 %not_y |
| %cmp_2 = icmp sgt i32 %not_min_1, %not_z |
| %not_min_2 = select i1 %cmp_2, i32 %not_min_1, i32 %not_z |
| %min = sub i32 -1, %not_min_2 |
| ret i32 %min |
| |
| ; CHECK: %0 = icmp slt i32 %x, %y |
| ; CHECK-NEXT: %1 = select i1 %0, i32 %x, i32 %y |
| ; CHECK-NEXT: %2 = icmp slt i32 %1, %z |
| ; CHECK-NEXT: %3 = select i1 %2, i32 %1, i32 %z |
| ; CHECK-NEXT: ret i32 %3 |
| } |
| |
| define i32 @compute_min_arithmetic(i32 %x, i32 %y) { |
| ; CHECK-LABEL: compute_min_arithmetic |
| entry: |
| %not_value = sub i32 3, %x |
| %not_y = sub i32 -1, %y |
| %cmp = icmp sgt i32 %not_value, %not_y |
| %not_min = select i1 %cmp, i32 %not_value, i32 %not_y |
| ret i32 %not_min |
| |
| ; CHECK: %0 = add i32 %x, -4 |
| ; CHECK-NEXT: %1 = icmp slt i32 %0, %y |
| ; CHECK-NEXT: %2 = select i1 %1, i32 %0, i32 %y |
| ; CHECK-NEXT: %3 = xor i32 %2, -1 |
| ; CHECK-NEXT: ret i32 %3 |
| } |
| |
| declare void @fake_use(i32) |
| |
| define i32 @compute_min_pessimization(i32 %x, i32 %y) { |
| ; CHECK-LABEL: compute_min_pessimization |
| entry: |
| %not_value = sub i32 3, %x |
| call void @fake_use(i32 %not_value) |
| %not_y = sub i32 -1, %y |
| %cmp = icmp sgt i32 %not_value, %not_y |
| ; CHECK: %not_value = sub i32 3, %x |
| ; CHECK: %cmp = icmp sgt i32 %not_value, %not_y |
| %not_min = select i1 %cmp, i32 %not_value, i32 %not_y |
| %min = sub i32 -1, %not_min |
| ret i32 %min |
| } |
| |
| define i32 @max_of_nots(i32 %x, i32 %y) { |
| ; CHECK-LABEL: @max_of_nots( |
| ; CHECK-NEXT: icmp |
| ; CHECK-NEXT: select |
| ; CHECK-NEXT: icmp |
| ; CHECK-NEXT: select |
| ; CHECK-NEXT: xor |
| ; CHECK-NEXT: ret |
| %c0 = icmp sgt i32 %y, 0 |
| %xor_y = xor i32 %y, -1 |
| %s0 = select i1 %c0, i32 %xor_y, i32 -1 |
| %xor_x = xor i32 %x, -1 |
| %c1 = icmp slt i32 %s0, %xor_x |
| %smax96 = select i1 %c1, i32 %xor_x, i32 %s0 |
| ret i32 %smax96 |
| } |