Home | History | Annotate | Download | only in NVPTX
      1 ; RUN: llc < %s -march=nvptx -mcpu=sm_20 -O2 | FileCheck %s
      2 
      3 ; *************************************
      4 ; * Cases with no min/max
      5 
      6 define i32 @ab_eq_i32(i32 %a, i32 %b) {
      7 ; LABEL: @ab_slt_i32
      8 ; CHECK-NOT: min
      9 ; CHECK-NOT: max
     10   %cmp = icmp eq i32 %a, %b
     11   %sel = select i1 %cmp, i32 %a, i32 %b
     12   ret i32 %sel
     13 }
     14 
     15 define i64 @ba_ne_i64(i64 %a, i64 %b) {
     16 ; LABEL: @ab_ne_i64
     17 ; CHECK-NOT: min
     18 ; CHECK-NOT: max
     19   %cmp = icmp ne i64 %a, %b
     20   %sel = select i1 %cmp, i64 %b, i64 %a
     21   ret i64 %sel
     22 }
     23 
     24 ; PTX does have e.g. max.s16, but at least as of Kepler (sm_3x) that
     25 ; gets compiled to SASS that converts the 16 bit parameters to 32 bit
     26 ; before using a 32 bit instruction. That is probably not a win and
     27 ; NVCC 7.5 does not emit 16 bit min/max either, presumably for that
     28 ; reason.
     29 define i16 @ab_ugt_i16(i16 %a, i16 %b) {
     30 ; LABEL: @ab_ugt_i16
     31 ; CHECK-NOT: min
     32 ; CHECK-NOT: max
     33   %cmp = icmp ugt i16 %a, %b
     34   %sel = select i1 %cmp, i16 %a, i16 %b
     35   ret i16 %sel
     36 }
     37 
     38 
     39 ; *************************************
     40 ; * All variations with i32
     41 
     42 ; *** ab, unsigned, i32
     43 define i32 @ab_ugt_i32(i32 %a, i32 %b) {
     44 ; LABEL: @ab_ugt_i32
     45 ; CHECK: max.u32
     46   %cmp = icmp ugt i32 %a, %b
     47   %sel = select i1 %cmp, i32 %a, i32 %b
     48   ret i32 %sel
     49 }
     50 
     51 define i32 @ab_uge_i32(i32 %a, i32 %b) {
     52 ; LABEL: @ab_uge_i32
     53 ; CHECK: max.u32
     54   %cmp = icmp uge i32 %a, %b
     55   %sel = select i1 %cmp, i32 %a, i32 %b
     56   ret i32 %sel
     57 }
     58 
     59 define i32 @ab_ult_i32(i32 %a, i32 %b) {
     60 ; LABEL: @ab_ult_i32
     61 ; CHECK: min.u32
     62   %cmp = icmp ult i32 %a, %b
     63   %sel = select i1 %cmp, i32 %a, i32 %b
     64   ret i32 %sel
     65 }
     66 
     67 define i32 @ab_ule_i32(i32 %a, i32 %b) {
     68 ; LABEL: @ab_ule_i32
     69 ; CHECK: min.u32
     70   %cmp = icmp ule i32 %a, %b
     71   %sel = select i1 %cmp, i32 %a, i32 %b
     72   ret i32 %sel
     73 }
     74 
     75 ; *** ab, signed, i32
     76 define i32 @ab_sgt_i32(i32 %a, i32 %b) {
     77 ; LABEL: @ab_ugt_i32
     78 ; CHECK: max.s32
     79   %cmp = icmp sgt i32 %a, %b
     80   %sel = select i1 %cmp, i32 %a, i32 %b
     81   ret i32 %sel
     82 }
     83 
     84 define i32 @ab_sge_i32(i32 %a, i32 %b) {
     85 ; LABEL: @ab_sge_i32
     86 ; CHECK: max.s32
     87   %cmp = icmp sge i32 %a, %b
     88   %sel = select i1 %cmp, i32 %a, i32 %b
     89   ret i32 %sel
     90 }
     91 
     92 define i32 @ab_slt_i32(i32 %a, i32 %b) {
     93 ; LABEL: @ab_slt_i32
     94 ; CHECK: min.s32
     95   %cmp = icmp slt i32 %a, %b
     96   %sel = select i1 %cmp, i32 %a, i32 %b
     97   ret i32 %sel
     98 }
     99 
    100 define i32 @ab_sle_i32(i32 %a, i32 %b) {
    101 ; LABEL: @ab_sle_i32
    102 ; CHECK: min.s32
    103   %cmp = icmp sle i32 %a, %b
    104   %sel = select i1 %cmp, i32 %a, i32 %b
    105   ret i32 %sel
    106 }
    107 
    108 ; *** ba, unsigned, i32
    109 define i32 @ba_ugt_i32(i32 %a, i32 %b) {
    110 ; LABEL: @ba_ugt_i32
    111 ; CHECK: min.u32
    112   %cmp = icmp ugt i32 %a, %b
    113   %sel = select i1 %cmp, i32 %b, i32 %a
    114   ret i32 %sel
    115 }
    116 
    117 define i32 @ba_uge_i32(i32 %a, i32 %b) {
    118 ; LABEL: @ba_uge_i32
    119 ; CHECK: min.u32
    120   %cmp = icmp uge i32 %a, %b
    121   %sel = select i1 %cmp, i32 %b, i32 %a
    122   ret i32 %sel
    123 }
    124 
    125 define i32 @ba_ult_i32(i32 %a, i32 %b) {
    126 ; LABEL: @ba_ult_i32
    127 ; CHECK: max.u32
    128   %cmp = icmp ult i32 %a, %b
    129   %sel = select i1 %cmp, i32 %b, i32 %a
    130   ret i32 %sel
    131 }
    132 
    133 define i32 @ba_ule_i32(i32 %a, i32 %b) {
    134 ; LABEL: @ba_ule_i32
    135 ; CHECK: max.u32
    136   %cmp = icmp ule i32 %a, %b
    137   %sel = select i1 %cmp, i32 %b, i32 %a
    138   ret i32 %sel
    139 }
    140 
    141 ; *** ba, signed, i32
    142 define i32 @ba_sgt_i32(i32 %a, i32 %b) {
    143 ; LBAEL: @ba_ugt_i32
    144 ; CHECK: min.s32
    145   %cmp = icmp sgt i32 %a, %b
    146   %sel = select i1 %cmp, i32 %b, i32 %a
    147   ret i32 %sel
    148 }
    149 
    150 define i32 @ba_sge_i32(i32 %a, i32 %b) {
    151 ; LABEL: @ba_sge_i32
    152 ; CHECK: min.s32
    153   %cmp = icmp sge i32 %a, %b
    154   %sel = select i1 %cmp, i32 %b, i32 %a
    155   ret i32 %sel
    156 }
    157 
    158 define i32 @ba_slt_i32(i32 %a, i32 %b) {
    159 ; LABEL: @ba_slt_i32
    160 ; CHECK: max.s32
    161   %cmp = icmp slt i32 %a, %b
    162   %sel = select i1 %cmp, i32 %b, i32 %a
    163   ret i32 %sel
    164 }
    165 
    166 define i32 @ba_sle_i32(i32 %a, i32 %b) {
    167 ; LABEL: @ba_sle_i32
    168 ; CHECK: max.s32
    169   %cmp = icmp sle i32 %a, %b
    170   %sel = select i1 %cmp, i32 %b, i32 %a
    171   ret i32 %sel
    172 }
    173 
    174 ; *************************************
    175 ; * All variations with i64
    176 
    177 ; *** ab, unsigned, i64
    178 define i64 @ab_ugt_i64(i64 %a, i64 %b) {
    179 ; LABEL: @ab_ugt_i64
    180 ; CHECK: max.u64
    181   %cmp = icmp ugt i64 %a, %b
    182   %sel = select i1 %cmp, i64 %a, i64 %b
    183   ret i64 %sel
    184 }
    185 
    186 define i64 @ab_uge_i64(i64 %a, i64 %b) {
    187 ; LABEL: @ab_uge_i64
    188 ; CHECK: max.u64
    189   %cmp = icmp uge i64 %a, %b
    190   %sel = select i1 %cmp, i64 %a, i64 %b
    191   ret i64 %sel
    192 }
    193 
    194 define i64 @ab_ult_i64(i64 %a, i64 %b) {
    195 ; LABEL: @ab_ult_i64
    196 ; CHECK: min.u64
    197   %cmp = icmp ult i64 %a, %b
    198   %sel = select i1 %cmp, i64 %a, i64 %b
    199   ret i64 %sel
    200 }
    201 
    202 define i64 @ab_ule_i64(i64 %a, i64 %b) {
    203 ; LABEL: @ab_ule_i64
    204 ; CHECK: min.u64
    205   %cmp = icmp ule i64 %a, %b
    206   %sel = select i1 %cmp, i64 %a, i64 %b
    207   ret i64 %sel
    208 }
    209 
    210 ; *** ab, signed, i64
    211 define i64 @ab_sgt_i64(i64 %a, i64 %b) {
    212 ; LABEL: @ab_ugt_i64
    213 ; CHECK: max.s64
    214   %cmp = icmp sgt i64 %a, %b
    215   %sel = select i1 %cmp, i64 %a, i64 %b
    216   ret i64 %sel
    217 }
    218 
    219 define i64 @ab_sge_i64(i64 %a, i64 %b) {
    220 ; LABEL: @ab_sge_i64
    221 ; CHECK: max.s64
    222   %cmp = icmp sge i64 %a, %b
    223   %sel = select i1 %cmp, i64 %a, i64 %b
    224   ret i64 %sel
    225 }
    226 
    227 define i64 @ab_slt_i64(i64 %a, i64 %b) {
    228 ; LABEL: @ab_slt_i64
    229 ; CHECK: min.s64
    230   %cmp = icmp slt i64 %a, %b
    231   %sel = select i1 %cmp, i64 %a, i64 %b
    232   ret i64 %sel
    233 }
    234 
    235 define i64 @ab_sle_i64(i64 %a, i64 %b) {
    236 ; LABEL: @ab_sle_i64
    237 ; CHECK: min.s64
    238   %cmp = icmp sle i64 %a, %b
    239   %sel = select i1 %cmp, i64 %a, i64 %b
    240   ret i64 %sel
    241 }
    242 
    243 ; *** ba, unsigned, i64
    244 define i64 @ba_ugt_i64(i64 %a, i64 %b) {
    245 ; LABEL: @ba_ugt_i64
    246 ; CHECK: min.u64
    247   %cmp = icmp ugt i64 %a, %b
    248   %sel = select i1 %cmp, i64 %b, i64 %a
    249   ret i64 %sel
    250 }
    251 
    252 define i64 @ba_uge_i64(i64 %a, i64 %b) {
    253 ; LABEL: @ba_uge_i64
    254 ; CHECK: min.u64
    255   %cmp = icmp uge i64 %a, %b
    256   %sel = select i1 %cmp, i64 %b, i64 %a
    257   ret i64 %sel
    258 }
    259 
    260 define i64 @ba_ult_i64(i64 %a, i64 %b) {
    261 ; LABEL: @ba_ult_i64
    262 ; CHECK: max.u64
    263   %cmp = icmp ult i64 %a, %b
    264   %sel = select i1 %cmp, i64 %b, i64 %a
    265   ret i64 %sel
    266 }
    267 
    268 define i64 @ba_ule_i64(i64 %a, i64 %b) {
    269 ; LABEL: @ba_ule_i64
    270 ; CHECK: max.u64
    271   %cmp = icmp ule i64 %a, %b
    272   %sel = select i1 %cmp, i64 %b, i64 %a
    273   ret i64 %sel
    274 }
    275 
    276 ; *** ba, signed, i64
    277 define i64 @ba_sgt_i64(i64 %a, i64 %b) {
    278 ; LBAEL: @ba_ugt_i64
    279 ; CHECK: min.s64
    280   %cmp = icmp sgt i64 %a, %b
    281   %sel = select i1 %cmp, i64 %b, i64 %a
    282   ret i64 %sel
    283 }
    284 
    285 define i64 @ba_sge_i64(i64 %a, i64 %b) {
    286 ; LABEL: @ba_sge_i64
    287 ; CHECK: min.s64
    288   %cmp = icmp sge i64 %a, %b
    289   %sel = select i1 %cmp, i64 %b, i64 %a
    290   ret i64 %sel
    291 }
    292 
    293 define i64 @ba_slt_i64(i64 %a, i64 %b) {
    294 ; LABEL: @ba_slt_i64
    295 ; CHECK: max.s64
    296   %cmp = icmp slt i64 %a, %b
    297   %sel = select i1 %cmp, i64 %b, i64 %a
    298   ret i64 %sel
    299 }
    300 
    301 define i64 @ba_sle_i64(i64 %a, i64 %b) {
    302 ; LABEL: @ba_sle_i64
    303 ; CHECK: max.s64
    304   %cmp = icmp sle i64 %a, %b
    305   %sel = select i1 %cmp, i64 %b, i64 %a
    306   ret i64 %sel
    307 }
    308