Home | History | Annotate | Download | only in InstCombine
      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