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