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 ; ************************************* 25 ; * All variations with i16 26 27 ; *** ab, unsigned, i16 28 define i16 @ab_ugt_i16(i16 %a, i16 %b) { 29 ; LABEL: @ab_ugt_i16 30 ; CHECK: max.u16 31 %cmp = icmp ugt i16 %a, %b 32 %sel = select i1 %cmp, i16 %a, i16 %b 33 ret i16 %sel 34 } 35 36 define i16 @ab_uge_i16(i16 %a, i16 %b) { 37 ; LABEL: @ab_uge_i16 38 ; CHECK: max.u16 39 %cmp = icmp uge i16 %a, %b 40 %sel = select i1 %cmp, i16 %a, i16 %b 41 ret i16 %sel 42 } 43 44 define i16 @ab_ult_i16(i16 %a, i16 %b) { 45 ; LABEL: @ab_ult_i16 46 ; CHECK: min.u16 47 %cmp = icmp ult i16 %a, %b 48 %sel = select i1 %cmp, i16 %a, i16 %b 49 ret i16 %sel 50 } 51 52 define i16 @ab_ule_i16(i16 %a, i16 %b) { 53 ; LABEL: @ab_ule_i16 54 ; CHECK: min.u16 55 %cmp = icmp ule i16 %a, %b 56 %sel = select i1 %cmp, i16 %a, i16 %b 57 ret i16 %sel 58 } 59 60 ; *** ab, signed, i16 61 define i16 @ab_sgt_i16(i16 %a, i16 %b) { 62 ; LABEL: @ab_ugt_i16 63 ; CHECK: max.s16 64 %cmp = icmp sgt i16 %a, %b 65 %sel = select i1 %cmp, i16 %a, i16 %b 66 ret i16 %sel 67 } 68 69 define i16 @ab_sge_i16(i16 %a, i16 %b) { 70 ; LABEL: @ab_sge_i16 71 ; CHECK: max.s16 72 %cmp = icmp sge i16 %a, %b 73 %sel = select i1 %cmp, i16 %a, i16 %b 74 ret i16 %sel 75 } 76 77 define i16 @ab_slt_i16(i16 %a, i16 %b) { 78 ; LABEL: @ab_slt_i16 79 ; CHECK: min.s16 80 %cmp = icmp slt i16 %a, %b 81 %sel = select i1 %cmp, i16 %a, i16 %b 82 ret i16 %sel 83 } 84 85 define i16 @ab_sle_i16(i16 %a, i16 %b) { 86 ; LABEL: @ab_sle_i16 87 ; CHECK: min.s16 88 %cmp = icmp sle i16 %a, %b 89 %sel = select i1 %cmp, i16 %a, i16 %b 90 ret i16 %sel 91 } 92 93 ; *** ba, unsigned, i16 94 define i16 @ba_ugt_i16(i16 %a, i16 %b) { 95 ; LABEL: @ba_ugt_i16 96 ; CHECK: min.u16 97 %cmp = icmp ugt i16 %a, %b 98 %sel = select i1 %cmp, i16 %b, i16 %a 99 ret i16 %sel 100 } 101 102 define i16 @ba_uge_i16(i16 %a, i16 %b) { 103 ; LABEL: @ba_uge_i16 104 ; CHECK: min.u16 105 %cmp = icmp uge i16 %a, %b 106 %sel = select i1 %cmp, i16 %b, i16 %a 107 ret i16 %sel 108 } 109 110 define i16 @ba_ult_i16(i16 %a, i16 %b) { 111 ; LABEL: @ba_ult_i16 112 ; CHECK: max.u16 113 %cmp = icmp ult i16 %a, %b 114 %sel = select i1 %cmp, i16 %b, i16 %a 115 ret i16 %sel 116 } 117 118 define i16 @ba_ule_i16(i16 %a, i16 %b) { 119 ; LABEL: @ba_ule_i16 120 ; CHECK: max.u16 121 %cmp = icmp ule i16 %a, %b 122 %sel = select i1 %cmp, i16 %b, i16 %a 123 ret i16 %sel 124 } 125 126 ; *** ba, signed, i16 127 define i16 @ba_sgt_i16(i16 %a, i16 %b) { 128 ; LBAEL: @ba_ugt_i16 129 ; CHECK: min.s16 130 %cmp = icmp sgt i16 %a, %b 131 %sel = select i1 %cmp, i16 %b, i16 %a 132 ret i16 %sel 133 } 134 135 define i16 @ba_sge_i16(i16 %a, i16 %b) { 136 ; LABEL: @ba_sge_i16 137 ; CHECK: min.s16 138 %cmp = icmp sge i16 %a, %b 139 %sel = select i1 %cmp, i16 %b, i16 %a 140 ret i16 %sel 141 } 142 143 define i16 @ba_slt_i16(i16 %a, i16 %b) { 144 ; LABEL: @ba_slt_i16 145 ; CHECK: max.s16 146 %cmp = icmp slt i16 %a, %b 147 %sel = select i1 %cmp, i16 %b, i16 %a 148 ret i16 %sel 149 } 150 151 define i16 @ba_sle_i16(i16 %a, i16 %b) { 152 ; LABEL: @ba_sle_i16 153 ; CHECK: max.s16 154 %cmp = icmp sle i16 %a, %b 155 %sel = select i1 %cmp, i16 %b, i16 %a 156 ret i16 %sel 157 } 158 159 ; ************************************* 160 ; * All variations with i32 161 162 ; *** ab, unsigned, i32 163 define i32 @ab_ugt_i32(i32 %a, i32 %b) { 164 ; LABEL: @ab_ugt_i32 165 ; CHECK: max.u32 166 %cmp = icmp ugt i32 %a, %b 167 %sel = select i1 %cmp, i32 %a, i32 %b 168 ret i32 %sel 169 } 170 171 define i32 @ab_uge_i32(i32 %a, i32 %b) { 172 ; LABEL: @ab_uge_i32 173 ; CHECK: max.u32 174 %cmp = icmp uge i32 %a, %b 175 %sel = select i1 %cmp, i32 %a, i32 %b 176 ret i32 %sel 177 } 178 179 define i32 @ab_ult_i32(i32 %a, i32 %b) { 180 ; LABEL: @ab_ult_i32 181 ; CHECK: min.u32 182 %cmp = icmp ult i32 %a, %b 183 %sel = select i1 %cmp, i32 %a, i32 %b 184 ret i32 %sel 185 } 186 187 define i32 @ab_ule_i32(i32 %a, i32 %b) { 188 ; LABEL: @ab_ule_i32 189 ; CHECK: min.u32 190 %cmp = icmp ule i32 %a, %b 191 %sel = select i1 %cmp, i32 %a, i32 %b 192 ret i32 %sel 193 } 194 195 ; *** ab, signed, i32 196 define i32 @ab_sgt_i32(i32 %a, i32 %b) { 197 ; LABEL: @ab_ugt_i32 198 ; CHECK: max.s32 199 %cmp = icmp sgt i32 %a, %b 200 %sel = select i1 %cmp, i32 %a, i32 %b 201 ret i32 %sel 202 } 203 204 define i32 @ab_sge_i32(i32 %a, i32 %b) { 205 ; LABEL: @ab_sge_i32 206 ; CHECK: max.s32 207 %cmp = icmp sge i32 %a, %b 208 %sel = select i1 %cmp, i32 %a, i32 %b 209 ret i32 %sel 210 } 211 212 define i32 @ab_slt_i32(i32 %a, i32 %b) { 213 ; LABEL: @ab_slt_i32 214 ; CHECK: min.s32 215 %cmp = icmp slt i32 %a, %b 216 %sel = select i1 %cmp, i32 %a, i32 %b 217 ret i32 %sel 218 } 219 220 define i32 @ab_sle_i32(i32 %a, i32 %b) { 221 ; LABEL: @ab_sle_i32 222 ; CHECK: min.s32 223 %cmp = icmp sle i32 %a, %b 224 %sel = select i1 %cmp, i32 %a, i32 %b 225 ret i32 %sel 226 } 227 228 ; *** ba, unsigned, i32 229 define i32 @ba_ugt_i32(i32 %a, i32 %b) { 230 ; LABEL: @ba_ugt_i32 231 ; CHECK: min.u32 232 %cmp = icmp ugt i32 %a, %b 233 %sel = select i1 %cmp, i32 %b, i32 %a 234 ret i32 %sel 235 } 236 237 define i32 @ba_uge_i32(i32 %a, i32 %b) { 238 ; LABEL: @ba_uge_i32 239 ; CHECK: min.u32 240 %cmp = icmp uge i32 %a, %b 241 %sel = select i1 %cmp, i32 %b, i32 %a 242 ret i32 %sel 243 } 244 245 define i32 @ba_ult_i32(i32 %a, i32 %b) { 246 ; LABEL: @ba_ult_i32 247 ; CHECK: max.u32 248 %cmp = icmp ult i32 %a, %b 249 %sel = select i1 %cmp, i32 %b, i32 %a 250 ret i32 %sel 251 } 252 253 define i32 @ba_ule_i32(i32 %a, i32 %b) { 254 ; LABEL: @ba_ule_i32 255 ; CHECK: max.u32 256 %cmp = icmp ule i32 %a, %b 257 %sel = select i1 %cmp, i32 %b, i32 %a 258 ret i32 %sel 259 } 260 261 ; *** ba, signed, i32 262 define i32 @ba_sgt_i32(i32 %a, i32 %b) { 263 ; LBAEL: @ba_ugt_i32 264 ; CHECK: min.s32 265 %cmp = icmp sgt i32 %a, %b 266 %sel = select i1 %cmp, i32 %b, i32 %a 267 ret i32 %sel 268 } 269 270 define i32 @ba_sge_i32(i32 %a, i32 %b) { 271 ; LABEL: @ba_sge_i32 272 ; CHECK: min.s32 273 %cmp = icmp sge i32 %a, %b 274 %sel = select i1 %cmp, i32 %b, i32 %a 275 ret i32 %sel 276 } 277 278 define i32 @ba_slt_i32(i32 %a, i32 %b) { 279 ; LABEL: @ba_slt_i32 280 ; CHECK: max.s32 281 %cmp = icmp slt i32 %a, %b 282 %sel = select i1 %cmp, i32 %b, i32 %a 283 ret i32 %sel 284 } 285 286 define i32 @ba_sle_i32(i32 %a, i32 %b) { 287 ; LABEL: @ba_sle_i32 288 ; CHECK: max.s32 289 %cmp = icmp sle i32 %a, %b 290 %sel = select i1 %cmp, i32 %b, i32 %a 291 ret i32 %sel 292 } 293 294 ; ************************************* 295 ; * All variations with i64 296 297 ; *** ab, unsigned, i64 298 define i64 @ab_ugt_i64(i64 %a, i64 %b) { 299 ; LABEL: @ab_ugt_i64 300 ; CHECK: max.u64 301 %cmp = icmp ugt i64 %a, %b 302 %sel = select i1 %cmp, i64 %a, i64 %b 303 ret i64 %sel 304 } 305 306 define i64 @ab_uge_i64(i64 %a, i64 %b) { 307 ; LABEL: @ab_uge_i64 308 ; CHECK: max.u64 309 %cmp = icmp uge i64 %a, %b 310 %sel = select i1 %cmp, i64 %a, i64 %b 311 ret i64 %sel 312 } 313 314 define i64 @ab_ult_i64(i64 %a, i64 %b) { 315 ; LABEL: @ab_ult_i64 316 ; CHECK: min.u64 317 %cmp = icmp ult i64 %a, %b 318 %sel = select i1 %cmp, i64 %a, i64 %b 319 ret i64 %sel 320 } 321 322 define i64 @ab_ule_i64(i64 %a, i64 %b) { 323 ; LABEL: @ab_ule_i64 324 ; CHECK: min.u64 325 %cmp = icmp ule i64 %a, %b 326 %sel = select i1 %cmp, i64 %a, i64 %b 327 ret i64 %sel 328 } 329 330 ; *** ab, signed, i64 331 define i64 @ab_sgt_i64(i64 %a, i64 %b) { 332 ; LABEL: @ab_ugt_i64 333 ; CHECK: max.s64 334 %cmp = icmp sgt i64 %a, %b 335 %sel = select i1 %cmp, i64 %a, i64 %b 336 ret i64 %sel 337 } 338 339 define i64 @ab_sge_i64(i64 %a, i64 %b) { 340 ; LABEL: @ab_sge_i64 341 ; CHECK: max.s64 342 %cmp = icmp sge i64 %a, %b 343 %sel = select i1 %cmp, i64 %a, i64 %b 344 ret i64 %sel 345 } 346 347 define i64 @ab_slt_i64(i64 %a, i64 %b) { 348 ; LABEL: @ab_slt_i64 349 ; CHECK: min.s64 350 %cmp = icmp slt i64 %a, %b 351 %sel = select i1 %cmp, i64 %a, i64 %b 352 ret i64 %sel 353 } 354 355 define i64 @ab_sle_i64(i64 %a, i64 %b) { 356 ; LABEL: @ab_sle_i64 357 ; CHECK: min.s64 358 %cmp = icmp sle i64 %a, %b 359 %sel = select i1 %cmp, i64 %a, i64 %b 360 ret i64 %sel 361 } 362 363 ; *** ba, unsigned, i64 364 define i64 @ba_ugt_i64(i64 %a, i64 %b) { 365 ; LABEL: @ba_ugt_i64 366 ; CHECK: min.u64 367 %cmp = icmp ugt i64 %a, %b 368 %sel = select i1 %cmp, i64 %b, i64 %a 369 ret i64 %sel 370 } 371 372 define i64 @ba_uge_i64(i64 %a, i64 %b) { 373 ; LABEL: @ba_uge_i64 374 ; CHECK: min.u64 375 %cmp = icmp uge i64 %a, %b 376 %sel = select i1 %cmp, i64 %b, i64 %a 377 ret i64 %sel 378 } 379 380 define i64 @ba_ult_i64(i64 %a, i64 %b) { 381 ; LABEL: @ba_ult_i64 382 ; CHECK: max.u64 383 %cmp = icmp ult i64 %a, %b 384 %sel = select i1 %cmp, i64 %b, i64 %a 385 ret i64 %sel 386 } 387 388 define i64 @ba_ule_i64(i64 %a, i64 %b) { 389 ; LABEL: @ba_ule_i64 390 ; CHECK: max.u64 391 %cmp = icmp ule i64 %a, %b 392 %sel = select i1 %cmp, i64 %b, i64 %a 393 ret i64 %sel 394 } 395 396 ; *** ba, signed, i64 397 define i64 @ba_sgt_i64(i64 %a, i64 %b) { 398 ; LBAEL: @ba_ugt_i64 399 ; CHECK: min.s64 400 %cmp = icmp sgt i64 %a, %b 401 %sel = select i1 %cmp, i64 %b, i64 %a 402 ret i64 %sel 403 } 404 405 define i64 @ba_sge_i64(i64 %a, i64 %b) { 406 ; LABEL: @ba_sge_i64 407 ; CHECK: min.s64 408 %cmp = icmp sge i64 %a, %b 409 %sel = select i1 %cmp, i64 %b, i64 %a 410 ret i64 %sel 411 } 412 413 define i64 @ba_slt_i64(i64 %a, i64 %b) { 414 ; LABEL: @ba_slt_i64 415 ; CHECK: max.s64 416 %cmp = icmp slt i64 %a, %b 417 %sel = select i1 %cmp, i64 %b, i64 %a 418 ret i64 %sel 419 } 420 421 define i64 @ba_sle_i64(i64 %a, i64 %b) { 422 ; LABEL: @ba_sle_i64 423 ; CHECK: max.s64 424 %cmp = icmp sle i64 %a, %b 425 %sel = select i1 %cmp, i64 %b, i64 %a 426 ret i64 %sel 427 } 428