1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=tahiti -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=WAVE64 %s 3# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=WAVE64 %s 4# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -run-pass=instruction-select -global-isel-abort=0 -verify-machineinstrs -o - %s | FileCheck -check-prefix=WAVE32 %s 5# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -run-pass=instruction-select -global-isel-abort=0 -verify-machineinstrs -o - %s | FileCheck -check-prefix=WAVE32 %s 6 7--- 8 9name: and_s1_vcc_vcc_vcc 10legalized: true 11regBankSelected: true 12tracksRegLiveness: true 13 14body: | 15 bb.0: 16 liveins: $vgpr0, $vgpr1 17 ; WAVE64-LABEL: name: and_s1_vcc_vcc_vcc 18 ; WAVE64: liveins: $vgpr0, $vgpr1 19 ; WAVE64-NEXT: {{ $}} 20 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 21 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 22 ; WAVE64-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec 23 ; WAVE64-NEXT: [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 [[COPY]], [[V_MOV_B32_e32_]], implicit $exec 24 ; WAVE64-NEXT: [[V_CMP_EQ_U32_e64_1:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 [[COPY1]], [[V_MOV_B32_e32_]], implicit $exec 25 ; WAVE64-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64_xexec = S_AND_B64 [[V_CMP_EQ_U32_e64_]], [[V_CMP_EQ_U32_e64_1]], implicit-def dead $scc 26 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 27 ; 28 ; WAVE32-LABEL: name: and_s1_vcc_vcc_vcc 29 ; WAVE32: liveins: $vgpr0, $vgpr1 30 ; WAVE32-NEXT: {{ $}} 31 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 32 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 33 ; WAVE32-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec 34 ; WAVE32-NEXT: [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_32_xm0_xexec = V_CMP_EQ_U32_e64 [[COPY]], [[V_MOV_B32_e32_]], implicit $exec 35 ; WAVE32-NEXT: [[V_CMP_EQ_U32_e64_1:%[0-9]+]]:sreg_32_xm0_xexec = V_CMP_EQ_U32_e64 [[COPY1]], [[V_MOV_B32_e32_]], implicit $exec 36 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32_xm0_xexec = S_AND_B32 [[V_CMP_EQ_U32_e64_]], [[V_CMP_EQ_U32_e64_1]], implicit-def dead $scc 37 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 38 %0:vgpr(s32) = COPY $vgpr0 39 %1:vgpr(s32) = COPY $vgpr1 40 %2:vgpr(s32) = G_CONSTANT i32 0 41 %3:vcc(s1) = G_ICMP intpred(eq), %0, %2 42 %4:vcc(s1) = G_ICMP intpred(eq), %1, %2 43 %5:vcc(s1) = G_AND %3, %4 44 S_ENDPGM 0, implicit %5 45... 46 47# Should fail to select 48--- 49 50name: and_s1_sgpr_sgpr_sgpr 51legalized: true 52regBankSelected: true 53tracksRegLiveness: true 54 55body: | 56 bb.0: 57 liveins: $sgpr0, $sgpr1 58 ; WAVE64-LABEL: name: and_s1_sgpr_sgpr_sgpr 59 ; WAVE64: liveins: $sgpr0, $sgpr1 60 ; WAVE64-NEXT: {{ $}} 61 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 62 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 63 ; WAVE64-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 64 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 65 ; 66 ; WAVE32-LABEL: name: and_s1_sgpr_sgpr_sgpr 67 ; WAVE32: liveins: $sgpr0, $sgpr1 68 ; WAVE32-NEXT: {{ $}} 69 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 70 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 71 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 72 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 73 %0:sgpr(s32) = COPY $sgpr0 74 %1:sgpr(s32) = COPY $sgpr1 75 %2:sgpr(s1) = G_TRUNC %0 76 %3:sgpr(s1) = G_TRUNC %1 77 %4:sgpr(s1) = G_AND %2, %3 78 S_ENDPGM 0, implicit %4 79... 80 81--- 82 83name: and_s16_sgpr_sgpr_sgpr 84legalized: true 85regBankSelected: true 86tracksRegLiveness: true 87 88body: | 89 bb.0: 90 liveins: $sgpr0, $sgpr1 91 ; WAVE64-LABEL: name: and_s16_sgpr_sgpr_sgpr 92 ; WAVE64: liveins: $sgpr0, $sgpr1 93 ; WAVE64-NEXT: {{ $}} 94 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 95 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 96 ; WAVE64-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 97 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 98 ; 99 ; WAVE32-LABEL: name: and_s16_sgpr_sgpr_sgpr 100 ; WAVE32: liveins: $sgpr0, $sgpr1 101 ; WAVE32-NEXT: {{ $}} 102 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 103 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 104 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 105 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 106 %0:sgpr(s32) = COPY $sgpr0 107 %1:sgpr(s32) = COPY $sgpr1 108 %2:sgpr(s16) = G_TRUNC %0 109 %3:sgpr(s16) = G_TRUNC %1 110 %4:sgpr(s16) = G_AND %2, %3 111 S_ENDPGM 0, implicit %4 112... 113 114--- 115 116name: and_s16_vgpr_vgpr_vgpr 117legalized: true 118regBankSelected: true 119tracksRegLiveness: true 120 121body: | 122 bb.0: 123 liveins: $vgpr0, $vgpr1 124 ; WAVE64-LABEL: name: and_s16_vgpr_vgpr_vgpr 125 ; WAVE64: liveins: $vgpr0, $vgpr1 126 ; WAVE64-NEXT: {{ $}} 127 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 128 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 129 ; WAVE64-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[COPY]], [[COPY1]], implicit $exec 130 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 131 ; 132 ; WAVE32-LABEL: name: and_s16_vgpr_vgpr_vgpr 133 ; WAVE32: liveins: $vgpr0, $vgpr1 134 ; WAVE32-NEXT: {{ $}} 135 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 136 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 137 ; WAVE32-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[COPY]], [[COPY1]], implicit $exec 138 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 139 %0:vgpr(s32) = COPY $vgpr0 140 %1:vgpr(s32) = COPY $vgpr1 141 %2:vgpr(s16) = G_TRUNC %0 142 %3:vgpr(s16) = G_TRUNC %1 143 %4:vgpr(s16) = G_AND %2, %3 144 S_ENDPGM 0, implicit %4 145... 146 147--- 148 149name: and_s32_sgpr_sgpr_sgpr 150legalized: true 151regBankSelected: true 152tracksRegLiveness: true 153 154body: | 155 bb.0: 156 liveins: $sgpr0, $sgpr1 157 ; WAVE64-LABEL: name: and_s32_sgpr_sgpr_sgpr 158 ; WAVE64: liveins: $sgpr0, $sgpr1 159 ; WAVE64-NEXT: {{ $}} 160 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 161 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 162 ; WAVE64-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 163 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 164 ; 165 ; WAVE32-LABEL: name: and_s32_sgpr_sgpr_sgpr 166 ; WAVE32: liveins: $sgpr0, $sgpr1 167 ; WAVE32-NEXT: {{ $}} 168 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 169 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 170 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 171 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 172 %0:sgpr(s32) = COPY $sgpr0 173 %1:sgpr(s32) = COPY $sgpr1 174 %2:sgpr(s32) = G_AND %0, %1 175 S_ENDPGM 0, implicit %2 176... 177 178--- 179 180name: and_s64_sgpr_sgpr_sgpr 181legalized: true 182regBankSelected: true 183tracksRegLiveness: true 184 185body: | 186 bb.0: 187 liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 188 ; WAVE64-LABEL: name: and_s64_sgpr_sgpr_sgpr 189 ; WAVE64: liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 190 ; WAVE64-NEXT: {{ $}} 191 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $sgpr0_sgpr1 192 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $sgpr2_sgpr3 193 ; WAVE64-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], [[COPY1]], implicit-def dead $scc 194 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 195 ; 196 ; WAVE32-LABEL: name: and_s64_sgpr_sgpr_sgpr 197 ; WAVE32: liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 198 ; WAVE32-NEXT: {{ $}} 199 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $sgpr0_sgpr1 200 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $sgpr2_sgpr3 201 ; WAVE32-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], [[COPY1]], implicit-def dead $scc 202 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 203 %0:sgpr(s64) = COPY $sgpr0_sgpr1 204 %1:sgpr(s64) = COPY $sgpr2_sgpr3 205 %2:sgpr(s64) = G_AND %0, %1 206 S_ENDPGM 0, implicit %2 207... 208 209--- 210 211name: and_v2s16_sgpr_sgpr_sgpr 212legalized: true 213regBankSelected: true 214tracksRegLiveness: true 215 216body: | 217 bb.0: 218 liveins: $sgpr0, $sgpr1 219 ; WAVE64-LABEL: name: and_v2s16_sgpr_sgpr_sgpr 220 ; WAVE64: liveins: $sgpr0, $sgpr1 221 ; WAVE64-NEXT: {{ $}} 222 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 223 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 224 ; WAVE64-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 225 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 226 ; 227 ; WAVE32-LABEL: name: and_v2s16_sgpr_sgpr_sgpr 228 ; WAVE32: liveins: $sgpr0, $sgpr1 229 ; WAVE32-NEXT: {{ $}} 230 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 231 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 232 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 233 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 234 %0:sgpr(<2 x s16>) = COPY $sgpr0 235 %1:sgpr(<2 x s16>) = COPY $sgpr1 236 %2:sgpr(<2 x s16>) = G_AND %0, %1 237 S_ENDPGM 0, implicit %2 238... 239 240--- 241 242name: and_v2s32_sgpr_sgpr_sgpr 243legalized: true 244regBankSelected: true 245tracksRegLiveness: true 246 247body: | 248 bb.0: 249 liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 250 ; WAVE64-LABEL: name: and_v2s32_sgpr_sgpr_sgpr 251 ; WAVE64: liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 252 ; WAVE64-NEXT: {{ $}} 253 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $sgpr0_sgpr1 254 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $sgpr2_sgpr3 255 ; WAVE64-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], [[COPY1]], implicit-def dead $scc 256 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 257 ; 258 ; WAVE32-LABEL: name: and_v2s32_sgpr_sgpr_sgpr 259 ; WAVE32: liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 260 ; WAVE32-NEXT: {{ $}} 261 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $sgpr0_sgpr1 262 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $sgpr2_sgpr3 263 ; WAVE32-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], [[COPY1]], implicit-def dead $scc 264 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 265 %0:sgpr(<2 x s32>) = COPY $sgpr0_sgpr1 266 %1:sgpr(<2 x s32>) = COPY $sgpr2_sgpr3 267 %2:sgpr(<2 x s32>) = G_AND %0, %1 268 S_ENDPGM 0, implicit %2 269... 270 271--- 272 273name: and_v4s16_sgpr_sgpr_sgpr 274legalized: true 275regBankSelected: true 276tracksRegLiveness: true 277 278body: | 279 bb.0: 280 liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 281 ; WAVE64-LABEL: name: and_v4s16_sgpr_sgpr_sgpr 282 ; WAVE64: liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 283 ; WAVE64-NEXT: {{ $}} 284 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $sgpr0_sgpr1 285 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $sgpr2_sgpr3 286 ; WAVE64-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], [[COPY1]], implicit-def dead $scc 287 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 288 ; 289 ; WAVE32-LABEL: name: and_v4s16_sgpr_sgpr_sgpr 290 ; WAVE32: liveins: $sgpr0_sgpr1, $sgpr2_sgpr3 291 ; WAVE32-NEXT: {{ $}} 292 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $sgpr0_sgpr1 293 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $sgpr2_sgpr3 294 ; WAVE32-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], [[COPY1]], implicit-def dead $scc 295 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 296 %0:sgpr(<4 x s16>) = COPY $sgpr0_sgpr1 297 %1:sgpr(<4 x s16>) = COPY $sgpr2_sgpr3 298 %2:sgpr(<4 x s16>) = G_AND %0, %1 299 S_ENDPGM 0, implicit %2 300... 301 302--- 303 304name: and_s32_vgpr_vgpr_vgpr 305legalized: true 306regBankSelected: true 307tracksRegLiveness: true 308 309body: | 310 bb.0: 311 liveins: $vgpr0, $vgpr1 312 ; WAVE64-LABEL: name: and_s32_vgpr_vgpr_vgpr 313 ; WAVE64: liveins: $vgpr0, $vgpr1 314 ; WAVE64-NEXT: {{ $}} 315 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 316 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 317 ; WAVE64-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[COPY]], [[COPY1]], implicit $exec 318 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 319 ; 320 ; WAVE32-LABEL: name: and_s32_vgpr_vgpr_vgpr 321 ; WAVE32: liveins: $vgpr0, $vgpr1 322 ; WAVE32-NEXT: {{ $}} 323 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 324 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 325 ; WAVE32-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[COPY]], [[COPY1]], implicit $exec 326 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 327 %0:vgpr(s32) = COPY $vgpr0 328 %1:vgpr(s32) = COPY $vgpr1 329 %2:vgpr(s32) = G_AND %0, %1 330 S_ENDPGM 0, implicit %2 331... 332 333--- 334 335name: and_v2s16_vgpr_vgpr_vgpr 336legalized: true 337regBankSelected: true 338tracksRegLiveness: true 339 340body: | 341 bb.0: 342 liveins: $vgpr0, $vgpr1 343 ; WAVE64-LABEL: name: and_v2s16_vgpr_vgpr_vgpr 344 ; WAVE64: liveins: $vgpr0, $vgpr1 345 ; WAVE64-NEXT: {{ $}} 346 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 347 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 348 ; WAVE64-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[COPY]], [[COPY1]], implicit $exec 349 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 350 ; 351 ; WAVE32-LABEL: name: and_v2s16_vgpr_vgpr_vgpr 352 ; WAVE32: liveins: $vgpr0, $vgpr1 353 ; WAVE32-NEXT: {{ $}} 354 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 355 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 356 ; WAVE32-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[COPY]], [[COPY1]], implicit $exec 357 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 358 %0:vgpr(<2 x s16>) = COPY $vgpr0 359 %1:vgpr(<2 x s16>) = COPY $vgpr1 360 %2:vgpr(<2 x s16>) = G_AND %0, %1 361 S_ENDPGM 0, implicit %2 362... 363 364 365# This should fail to select 366--- 367 368name: and_s64_vgpr_vgpr_vgpr 369legalized: true 370regBankSelected: true 371tracksRegLiveness: true 372 373body: | 374 bb.0: 375 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 376 ; WAVE64-LABEL: name: and_s64_vgpr_vgpr_vgpr 377 ; WAVE64: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 378 ; WAVE64-NEXT: {{ $}} 379 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:vgpr(s64) = COPY $vgpr0_vgpr1 380 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:vgpr(s64) = COPY $vgpr2_vgpr3 381 ; WAVE64-NEXT: [[AND:%[0-9]+]]:vgpr(s64) = G_AND [[COPY]], [[COPY1]] 382 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[AND]](s64) 383 ; 384 ; WAVE32-LABEL: name: and_s64_vgpr_vgpr_vgpr 385 ; WAVE32: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 386 ; WAVE32-NEXT: {{ $}} 387 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:vgpr(s64) = COPY $vgpr0_vgpr1 388 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:vgpr(s64) = COPY $vgpr2_vgpr3 389 ; WAVE32-NEXT: [[AND:%[0-9]+]]:vgpr(s64) = G_AND [[COPY]], [[COPY1]] 390 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[AND]](s64) 391 %0:vgpr(s64) = COPY $vgpr0_vgpr1 392 %1:vgpr(s64) = COPY $vgpr2_vgpr3 393 %2:vgpr(s64) = G_AND %0, %1 394 S_ENDPGM 0, implicit %2 395... 396 397--- 398 399name: and_s1_vcc_copy_to_vcc 400legalized: true 401regBankSelected: true 402tracksRegLiveness: true 403 404body: | 405 bb.0: 406 liveins: $vgpr0, $vgpr1 407 ; WAVE64-LABEL: name: and_s1_vcc_copy_to_vcc 408 ; WAVE64: liveins: $vgpr0, $vgpr1 409 ; WAVE64-NEXT: {{ $}} 410 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 411 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 412 ; WAVE64-NEXT: [[V_AND_B32_e32_:%[0-9]+]]:vgpr_32 = V_AND_B32_e32 1, [[COPY]], implicit $exec 413 ; WAVE64-NEXT: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[V_AND_B32_e32_]], implicit $exec 414 ; WAVE64-NEXT: [[V_AND_B32_e32_1:%[0-9]+]]:vgpr_32 = V_AND_B32_e32 1, [[COPY1]], implicit $exec 415 ; WAVE64-NEXT: [[V_CMP_NE_U32_e64_1:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[V_AND_B32_e32_1]], implicit $exec 416 ; WAVE64-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64_xexec = S_AND_B64 [[V_CMP_NE_U32_e64_]], [[V_CMP_NE_U32_e64_1]], implicit-def dead $scc 417 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 418 ; 419 ; WAVE32-LABEL: name: and_s1_vcc_copy_to_vcc 420 ; WAVE32: liveins: $vgpr0, $vgpr1 421 ; WAVE32-NEXT: {{ $}} 422 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 423 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 424 ; WAVE32-NEXT: [[V_AND_B32_e32_:%[0-9]+]]:vgpr_32 = V_AND_B32_e32 1, [[COPY]], implicit $exec 425 ; WAVE32-NEXT: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 0, [[V_AND_B32_e32_]], implicit $exec 426 ; WAVE32-NEXT: [[V_AND_B32_e32_1:%[0-9]+]]:vgpr_32 = V_AND_B32_e32 1, [[COPY1]], implicit $exec 427 ; WAVE32-NEXT: [[V_CMP_NE_U32_e64_1:%[0-9]+]]:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 0, [[V_AND_B32_e32_1]], implicit $exec 428 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32_xm0_xexec = S_AND_B32 [[V_CMP_NE_U32_e64_]], [[V_CMP_NE_U32_e64_1]], implicit-def dead $scc 429 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 430 %0:vgpr(s32) = COPY $vgpr0 431 %1:vgpr(s32) = COPY $vgpr1 432 %2:vgpr(s1) = G_TRUNC %0 433 %3:vgpr(s1) = G_TRUNC %1 434 %4:vcc(s1) = COPY %2 435 %5:vcc(s1) = COPY %3 436 %6:vcc(s1) = G_AND %4, %5 437 S_ENDPGM 0, implicit %6 438... 439 440# The selector for the copy of the and result may constrain the result 441# register of the and, losing that it is a VCCRegBank context. 442 443# Works for wave32, should fail for wave64 444--- 445name: copy_select_constrain_vcc_result_reg_wave32 446legalized: true 447regBankSelected: true 448tracksRegLiveness: true 449body: | 450 bb.0: 451 liveins: $vgpr0, $sgpr0 452 453 ; WAVE64-LABEL: name: copy_select_constrain_vcc_result_reg_wave32 454 ; WAVE64: liveins: $vgpr0, $sgpr0 455 ; WAVE64-NEXT: {{ $}} 456 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 457 ; WAVE64-NEXT: %sgpr0:sreg_32 = COPY $sgpr0 458 ; WAVE64-NEXT: [[V_AND_B32_e32_:%[0-9]+]]:vgpr_32 = V_AND_B32_e32 1, [[COPY]], implicit $exec 459 ; WAVE64-NEXT: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[V_AND_B32_e32_]], implicit $exec 460 ; WAVE64-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 1, %sgpr0, implicit-def dead $scc 461 ; WAVE64-NEXT: [[V_CMP_NE_U32_e64_1:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[S_AND_B32_]], implicit $exec 462 ; WAVE64-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64_xexec = S_AND_B64 [[V_CMP_NE_U32_e64_]], [[V_CMP_NE_U32_e64_1]], implicit-def dead $scc 463 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_32_xm0 = COPY [[S_AND_B64_]] 464 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[COPY1]] 465 ; 466 ; WAVE32-LABEL: name: copy_select_constrain_vcc_result_reg_wave32 467 ; WAVE32: liveins: $vgpr0, $sgpr0 468 ; WAVE32-NEXT: {{ $}} 469 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 470 ; WAVE32-NEXT: %sgpr0:sreg_32 = COPY $sgpr0 471 ; WAVE32-NEXT: [[V_AND_B32_e32_:%[0-9]+]]:vgpr_32 = V_AND_B32_e32 1, [[COPY]], implicit $exec 472 ; WAVE32-NEXT: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 0, [[V_AND_B32_e32_]], implicit $exec 473 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 1, %sgpr0, implicit-def dead $scc 474 ; WAVE32-NEXT: [[V_CMP_NE_U32_e64_1:%[0-9]+]]:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 0, [[S_AND_B32_]], implicit $exec 475 ; WAVE32-NEXT: [[S_AND_B32_1:%[0-9]+]]:sreg_32_xm0_xexec = S_AND_B32 [[V_CMP_NE_U32_e64_]], [[V_CMP_NE_U32_e64_1]], implicit-def dead $scc 476 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_32_xm0 = COPY [[S_AND_B32_1]] 477 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[COPY1]] 478 %1:vgpr(s32) = COPY $vgpr0 479 %0:vgpr(s1) = G_TRUNC %1(s32) 480 %sgpr0:sgpr(s32) = COPY $sgpr0 481 %2:sgpr(s1) = G_TRUNC %sgpr0 482 %6:sgpr(s32) = G_CONSTANT i32 0 483 %7:sgpr(p1) = G_IMPLICIT_DEF 484 %9:vcc(s1) = COPY %0(s1) 485 %10:vcc(s1) = COPY %2(s1) 486 %8:vcc(s1) = G_AND %9, %10 487 %3:sreg_32_xm0(s1) = COPY %8(s1) 488 S_ENDPGM 0, implicit %3 489 490... 491 492# Works for wave64, should fail for wave32 493--- 494name: copy_select_constrain_vcc_result_reg_wave64 495legalized: true 496regBankSelected: true 497tracksRegLiveness: true 498body: | 499 bb.0: 500 liveins: $vgpr0, $sgpr0 501 502 ; WAVE64-LABEL: name: copy_select_constrain_vcc_result_reg_wave64 503 ; WAVE64: liveins: $vgpr0, $sgpr0 504 ; WAVE64-NEXT: {{ $}} 505 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 506 ; WAVE64-NEXT: %sgpr0:sreg_32 = COPY $sgpr0 507 ; WAVE64-NEXT: [[V_AND_B32_e32_:%[0-9]+]]:vgpr_32 = V_AND_B32_e32 1, [[COPY]], implicit $exec 508 ; WAVE64-NEXT: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[V_AND_B32_e32_]], implicit $exec 509 ; WAVE64-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 1, %sgpr0, implicit-def dead $scc 510 ; WAVE64-NEXT: [[V_CMP_NE_U32_e64_1:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[S_AND_B32_]], implicit $exec 511 ; WAVE64-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64_xexec = S_AND_B64 [[V_CMP_NE_U32_e64_]], [[V_CMP_NE_U32_e64_1]], implicit-def dead $scc 512 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B64_]] 513 ; 514 ; WAVE32-LABEL: name: copy_select_constrain_vcc_result_reg_wave64 515 ; WAVE32: liveins: $vgpr0, $sgpr0 516 ; WAVE32-NEXT: {{ $}} 517 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 518 ; WAVE32-NEXT: %sgpr0:sreg_32 = COPY $sgpr0 519 ; WAVE32-NEXT: [[V_AND_B32_e32_:%[0-9]+]]:vgpr_32 = V_AND_B32_e32 1, [[COPY]], implicit $exec 520 ; WAVE32-NEXT: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 0, [[V_AND_B32_e32_]], implicit $exec 521 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 1, %sgpr0, implicit-def dead $scc 522 ; WAVE32-NEXT: [[V_CMP_NE_U32_e64_1:%[0-9]+]]:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 0, [[S_AND_B32_]], implicit $exec 523 ; WAVE32-NEXT: [[S_AND_B32_1:%[0-9]+]]:sreg_32_xm0_xexec = S_AND_B32 [[V_CMP_NE_U32_e64_]], [[V_CMP_NE_U32_e64_1]], implicit-def dead $scc 524 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_64_xexec = COPY [[S_AND_B32_1]] 525 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[COPY1]] 526 %1:vgpr(s32) = COPY $vgpr0 527 %0:vgpr(s1) = G_TRUNC %1(s32) 528 %sgpr0:sgpr(s32) = COPY $sgpr0 529 %2:sgpr(s1) = G_TRUNC %sgpr0 530 %6:sgpr(s32) = G_CONSTANT i32 0 531 %7:sgpr(p1) = G_IMPLICIT_DEF 532 %9:vcc(s1) = COPY %0(s1) 533 %10:vcc(s1) = COPY %2(s1) 534 %8:vcc(s1) = G_AND %9, %10 535 %3:sreg_64_xexec(s1) = COPY %8(s1) 536 S_ENDPGM 0, implicit %3 537 538... 539 540--- 541 542name: and_s32_sgpr_sgpr_sgpr_result_reg_class 543legalized: true 544regBankSelected: true 545tracksRegLiveness: true 546 547body: | 548 bb.0: 549 liveins: $sgpr0, $sgpr1 550 ; WAVE64-LABEL: name: and_s32_sgpr_sgpr_sgpr_result_reg_class 551 ; WAVE64: liveins: $sgpr0, $sgpr1 552 ; WAVE64-NEXT: {{ $}} 553 ; WAVE64-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 554 ; WAVE64-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 555 ; WAVE64-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 556 ; WAVE64-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 557 ; 558 ; WAVE32-LABEL: name: and_s32_sgpr_sgpr_sgpr_result_reg_class 559 ; WAVE32: liveins: $sgpr0, $sgpr1 560 ; WAVE32-NEXT: {{ $}} 561 ; WAVE32-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0 562 ; WAVE32-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1 563 ; WAVE32-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY]], [[COPY1]], implicit-def dead $scc 564 ; WAVE32-NEXT: S_ENDPGM 0, implicit [[S_AND_B32_]] 565 %0:sgpr(s32) = COPY $sgpr0 566 %1:sgpr(s32) = COPY $sgpr1 567 %2:sreg_32(s32) = G_AND %0, %1 568 S_ENDPGM 0, implicit %2 569... 570