491 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -verify-coalescing -verify-machineinstrs -amdgpu-enable-rewrite-partial-reg-uses=false -start-before=register-coalescer -stop-after=machine-scheduler -o - %s | FileCheck %s3 4# Tests that break due to the handling of partially undef registers5# when whole register identity copies are erased.6 7# Make sure there is no verifier error after8# RenameIndepependentSubregs processes this. The coalescer would9# remove the identity copy in %bb.1, and leave behind a dummy interval10# across bb.1 with no corresponding value anywhere in the function.11 12---13name: identity_copy_undef_subrange14tracksRegLiveness: true15body: |16 ; CHECK-LABEL: name: identity_copy_undef_subrange17 ; CHECK: bb.0:18 ; CHECK-NEXT: successors: %bb.1(0x80000000)19 ; CHECK-NEXT: liveins: $vgpr020 ; CHECK-NEXT: {{ $}}21 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr022 ; CHECK-NEXT: {{ $}}23 ; CHECK-NEXT: bb.1:24 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)25 ; CHECK-NEXT: {{ $}}26 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec27 ; CHECK-NEXT: S_BRANCH %bb.228 ; CHECK-NEXT: {{ $}}29 ; CHECK-NEXT: bb.2:30 ; CHECK-NEXT: successors: %bb.1(0x80000000)31 ; CHECK-NEXT: {{ $}}32 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 [[COPY]].sub1, implicit $mode, implicit $exec33 ; CHECK-NEXT: S_BRANCH %bb.134 bb.0:35 liveins: $vgpr036 37 undef %0.sub1:vreg_64 = COPY killed $vgpr038 39 bb.1:40 successors: %bb.2, %bb.141 42 %0:vreg_64 = COPY %043 S_CBRANCH_EXECNZ %bb.1, implicit $exec44 S_BRANCH %bb.245 46 bb.2:47 undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 killed %0.sub1, implicit $mode, implicit $exec48 S_BRANCH %bb.149 50...51 52# Test another use of the register inside the block.53---54name: identity_copy_undef_subrange_other_uses055tracksRegLiveness: true56body: |57 ; CHECK-LABEL: name: identity_copy_undef_subrange_other_uses058 ; CHECK: bb.0:59 ; CHECK-NEXT: successors: %bb.1(0x80000000)60 ; CHECK-NEXT: liveins: $vgpr061 ; CHECK-NEXT: {{ $}}62 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr063 ; CHECK-NEXT: {{ $}}64 ; CHECK-NEXT: bb.1:65 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)66 ; CHECK-NEXT: {{ $}}67 ; CHECK-NEXT: S_NOP 0, implicit undef [[COPY]].sub068 ; CHECK-NEXT: S_NOP 0, implicit undef [[COPY]].sub069 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec70 ; CHECK-NEXT: S_BRANCH %bb.271 ; CHECK-NEXT: {{ $}}72 ; CHECK-NEXT: bb.2:73 ; CHECK-NEXT: successors: %bb.1(0x80000000)74 ; CHECK-NEXT: {{ $}}75 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 [[COPY]].sub1, implicit $mode, implicit $exec76 ; CHECK-NEXT: S_BRANCH %bb.177 bb.0:78 liveins: $vgpr079 undef %0.sub1:vreg_64 = COPY killed $vgpr080 81 bb.1:82 successors: %bb.2, %bb.183 84 %0:vreg_64 = COPY %085 S_NOP 0, implicit %0.sub086 S_NOP 0, implicit %0.sub087 S_CBRANCH_EXECNZ %bb.1, implicit $exec88 S_BRANCH %bb.289 90 bb.2:91 undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 killed %0.sub1, implicit $mode, implicit $exec92 S_BRANCH %bb.193 94...95 96---97name: second_identity_copy98tracksRegLiveness: true99body: |100 ; CHECK-LABEL: name: second_identity_copy101 ; CHECK: bb.0:102 ; CHECK-NEXT: successors: %bb.1(0x80000000)103 ; CHECK-NEXT: liveins: $vgpr0104 ; CHECK-NEXT: {{ $}}105 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0106 ; CHECK-NEXT: {{ $}}107 ; CHECK-NEXT: bb.1:108 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)109 ; CHECK-NEXT: {{ $}}110 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec111 ; CHECK-NEXT: S_BRANCH %bb.2112 ; CHECK-NEXT: {{ $}}113 ; CHECK-NEXT: bb.2:114 ; CHECK-NEXT: successors: %bb.1(0x80000000)115 ; CHECK-NEXT: {{ $}}116 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = nofpexcept V_MUL_F32_e32 0, [[COPY]].sub1, implicit $mode, implicit $exec117 ; CHECK-NEXT: S_BRANCH %bb.1118 bb.0:119 liveins: $vgpr0120 121 undef %0.sub1:vreg_64 = COPY killed $vgpr0122 123 bb.1:124 successors: %bb.2, %bb.1125 126 %0:vreg_64 = COPY killed %0127 %0:vreg_64 = COPY %0128 S_CBRANCH_EXECNZ %bb.1, implicit $exec129 S_BRANCH %bb.2130 131 bb.2:132 undef %0.sub1:vreg_64 = nofpexcept V_MUL_F32_e32 0, killed %0.sub1, implicit $mode, implicit $exec133 S_BRANCH %bb.1134 135...136 137---138name: second_identity_copy_undef_lane_outblock139tracksRegLiveness: true140body: |141 ; CHECK-LABEL: name: second_identity_copy_undef_lane_outblock142 ; CHECK: bb.0:143 ; CHECK-NEXT: successors: %bb.1(0x80000000)144 ; CHECK-NEXT: liveins: $vgpr0145 ; CHECK-NEXT: {{ $}}146 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0147 ; CHECK-NEXT: {{ $}}148 ; CHECK-NEXT: bb.1:149 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)150 ; CHECK-NEXT: {{ $}}151 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec152 ; CHECK-NEXT: S_BRANCH %bb.2153 ; CHECK-NEXT: {{ $}}154 ; CHECK-NEXT: bb.2:155 ; CHECK-NEXT: successors: %bb.1(0x80000000)156 ; CHECK-NEXT: {{ $}}157 ; CHECK-NEXT: [[COPY:%[0-9]+]].sub1:vreg_64 = nofpexcept V_MUL_F32_e32 0, [[COPY]].sub1, implicit $mode, implicit $exec158 ; CHECK-NEXT: S_BRANCH %bb.1159 bb.0:160 liveins: $vgpr0161 162 undef %0.sub1:vreg_64 = COPY killed $vgpr0163 164 bb.1:165 successors: %bb.2, %bb.1166 167 %0:vreg_64 = COPY killed %0168 %0:vreg_64 = COPY %0169 S_CBRANCH_EXECNZ %bb.1, implicit $exec170 S_BRANCH %bb.2171 172 bb.2:173 %0.sub1:vreg_64 = nofpexcept V_MUL_F32_e32 0, killed %0.sub1, implicit $mode, implicit $exec174 S_BRANCH %bb.1175 176...177 178# The same value number appears in multiple blocks179---180name: identity_copy_undef_subrange_null_vninfo_to_remove181tracksRegLiveness: true182body: |183 ; CHECK-LABEL: name: identity_copy_undef_subrange_null_vninfo_to_remove184 ; CHECK: bb.0:185 ; CHECK-NEXT: successors: %bb.1(0x80000000)186 ; CHECK-NEXT: liveins: $vgpr0187 ; CHECK-NEXT: {{ $}}188 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0189 ; CHECK-NEXT: {{ $}}190 ; CHECK-NEXT: bb.1:191 ; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)192 ; CHECK-NEXT: {{ $}}193 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.3, implicit $exec194 ; CHECK-NEXT: {{ $}}195 ; CHECK-NEXT: bb.2:196 ; CHECK-NEXT: successors: %bb.1(0x80000000)197 ; CHECK-NEXT: {{ $}}198 ; CHECK-NEXT: S_NOP 0, implicit undef [[COPY]].sub0199 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 [[COPY]].sub1, implicit $mode, implicit $exec200 ; CHECK-NEXT: S_BRANCH %bb.1201 ; CHECK-NEXT: {{ $}}202 ; CHECK-NEXT: bb.3:203 ; CHECK-NEXT: S_NOP 0, implicit undef [[COPY]].sub0204 bb.0:205 liveins: $vgpr0206 207 undef %0.sub1:vreg_64 = COPY killed $vgpr0208 209 bb.1:210 %0:vreg_64 = COPY %0211 S_CBRANCH_EXECNZ %bb.3, implicit $exec212 213 bb.2:214 S_NOP 0, implicit %0.sub0215 undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 killed %0.sub1, implicit $mode, implicit $exec216 S_BRANCH %bb.1217 218 bb.3:219 S_NOP 0, implicit %0.sub0220 221...222 223---224name: undef_copy_self_loop0225tracksRegLiveness: true226body: |227 ; CHECK-LABEL: name: undef_copy_self_loop0228 ; CHECK: bb.0:229 ; CHECK-NEXT: successors: %bb.1(0x80000000)230 ; CHECK-NEXT: liveins: $vgpr0231 ; CHECK-NEXT: {{ $}}232 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0233 ; CHECK-NEXT: {{ $}}234 ; CHECK-NEXT: bb.1:235 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)236 ; CHECK-NEXT: {{ $}}237 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec238 ; CHECK-NEXT: {{ $}}239 ; CHECK-NEXT: bb.2:240 ; CHECK-NEXT: S_NOP 0, implicit undef [[COPY]].sub0241 bb.0:242 liveins: $vgpr0243 244 undef %0.sub1:vreg_64 = COPY killed $vgpr0245 246 bb.1:247 %0:vreg_64 = COPY %0248 S_CBRANCH_EXECNZ %bb.1, implicit $exec249 250 bb.2:251 S_NOP 0, implicit %0.sub0252 253...254 255---256name: undef_copy_self_loop1257tracksRegLiveness: true258body: |259 ; CHECK-LABEL: name: undef_copy_self_loop1260 ; CHECK: bb.0:261 ; CHECK-NEXT: successors: %bb.1(0x80000000)262 ; CHECK-NEXT: liveins: $vgpr0263 ; CHECK-NEXT: {{ $}}264 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0265 ; CHECK-NEXT: {{ $}}266 ; CHECK-NEXT: bb.1:267 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)268 ; CHECK-NEXT: {{ $}}269 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec270 ; CHECK-NEXT: {{ $}}271 ; CHECK-NEXT: bb.2:272 ; CHECK-NEXT: S_NOP 0, implicit [[COPY]].sub1273 bb.0:274 liveins: $vgpr0275 276 undef %0.sub1:vreg_64 = COPY killed $vgpr0277 278 bb.1:279 %0:vreg_64 = COPY %0280 S_CBRANCH_EXECNZ %bb.1, implicit $exec281 282 bb.2:283 S_NOP 0, implicit %0.sub1284 285...286 287# The coalescing of the %0 = %2 COPY in %bb.2 needs to prune the dead288# phi range across %bb.1 after it is erased.289---290name: prune_subrange_phi_value_0291tracksRegLiveness: true292body: |293 ; CHECK-LABEL: name: prune_subrange_phi_value_0294 ; CHECK: bb.0:295 ; CHECK-NEXT: successors: %bb.1(0x80000000)296 ; CHECK-NEXT: liveins: $vgpr0297 ; CHECK-NEXT: {{ $}}298 ; CHECK-NEXT: dead undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0299 ; CHECK-NEXT: {{ $}}300 ; CHECK-NEXT: bb.1:301 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)302 ; CHECK-NEXT: {{ $}}303 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec304 ; CHECK-NEXT: S_BRANCH %bb.2305 ; CHECK-NEXT: {{ $}}306 ; CHECK-NEXT: bb.2:307 ; CHECK-NEXT: successors: %bb.1(0x80000000)308 ; CHECK-NEXT: {{ $}}309 ; CHECK-NEXT: S_BRANCH %bb.1310 bb.0:311 liveins: $vgpr0312 313 undef %0.sub1:vreg_64 = COPY killed $vgpr0314 315 bb.1:316 successors: %bb.2, %bb.1317 318 %1:vreg_64 = COPY killed %0319 %0:vreg_64 = COPY %1320 S_CBRANCH_EXECNZ %bb.1, implicit $exec321 S_BRANCH %bb.2322 323 bb.2:324 undef %2.sub1:vreg_64 = COPY %0.sub1325 %0:vreg_64 = COPY killed %2326 S_BRANCH %bb.1327 328...329 330---331name: prune_subrange_phi_value_0_0332tracksRegLiveness: true333body: |334 ; CHECK-LABEL: name: prune_subrange_phi_value_0_0335 ; CHECK: bb.0:336 ; CHECK-NEXT: successors: %bb.1(0x80000000)337 ; CHECK-NEXT: liveins: $vgpr0338 ; CHECK-NEXT: {{ $}}339 ; CHECK-NEXT: dead undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0340 ; CHECK-NEXT: {{ $}}341 ; CHECK-NEXT: bb.1:342 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)343 ; CHECK-NEXT: {{ $}}344 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec345 ; CHECK-NEXT: S_BRANCH %bb.2346 ; CHECK-NEXT: {{ $}}347 ; CHECK-NEXT: bb.2:348 ; CHECK-NEXT: successors: %bb.1(0x80000000)349 ; CHECK-NEXT: {{ $}}350 ; CHECK-NEXT: S_BRANCH %bb.1351 bb.0:352 liveins: $vgpr0353 354 undef %0.sub1:vreg_64 = COPY killed $vgpr0355 356 bb.1:357 successors: %bb.2, %bb.1358 359 %1:vreg_64 = COPY killed %0360 %0:vreg_64 = COPY %1361 S_CBRANCH_EXECNZ %bb.1, implicit $exec362 S_BRANCH %bb.2363 364 bb.2:365 undef %0.sub1:vreg_64 = COPY %0.sub1366 S_BRANCH %bb.1367 368...369 370---371name: prune_subrange_phi_value_0_1372tracksRegLiveness: true373body: |374 ; CHECK-LABEL: name: prune_subrange_phi_value_0_1375 ; CHECK: bb.0:376 ; CHECK-NEXT: successors: %bb.1(0x80000000)377 ; CHECK-NEXT: liveins: $vgpr0378 ; CHECK-NEXT: {{ $}}379 ; CHECK-NEXT: dead undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0380 ; CHECK-NEXT: {{ $}}381 ; CHECK-NEXT: bb.1:382 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)383 ; CHECK-NEXT: {{ $}}384 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec385 ; CHECK-NEXT: S_BRANCH %bb.2386 ; CHECK-NEXT: {{ $}}387 ; CHECK-NEXT: bb.2:388 ; CHECK-NEXT: successors: %bb.1(0x80000000)389 ; CHECK-NEXT: {{ $}}390 ; CHECK-NEXT: S_BRANCH %bb.1391 bb.0:392 liveins: $vgpr0393 394 undef %0.sub1:vreg_64 = COPY killed $vgpr0395 396 bb.1:397 successors: %bb.2, %bb.1398 399 %1:vreg_64 = COPY killed %0400 %0:vreg_64 = COPY %1401 S_CBRANCH_EXECNZ %bb.1, implicit $exec402 S_BRANCH %bb.2403 404 bb.2:405 S_BRANCH %bb.1406 407...408 409# Variant of testcase that asserts since there wasn't already an410# incoming segment at the erased copy, and no valid end point.411---412name: prune_subrange_phi_value_1413tracksRegLiveness: true414body: |415 ; CHECK-LABEL: name: prune_subrange_phi_value_1416 ; CHECK: bb.0:417 ; CHECK-NEXT: successors: %bb.1(0x80000000)418 ; CHECK-NEXT: liveins: $vgpr0419 ; CHECK-NEXT: {{ $}}420 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0421 ; CHECK-NEXT: {{ $}}422 ; CHECK-NEXT: bb.1:423 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)424 ; CHECK-NEXT: {{ $}}425 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec426 ; CHECK-NEXT: S_BRANCH %bb.2427 ; CHECK-NEXT: {{ $}}428 ; CHECK-NEXT: bb.2:429 ; CHECK-NEXT: successors: %bb.1(0x80000000)430 ; CHECK-NEXT: {{ $}}431 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 [[COPY]].sub1, implicit $mode, implicit $exec432 ; CHECK-NEXT: S_BRANCH %bb.1433 bb.0:434 liveins: $vgpr0435 436 undef %0.sub1:vreg_64 = COPY killed $vgpr0437 438 bb.1:439 successors: %bb.2, %bb.1440 441 %0:vreg_64 = COPY killed %0442 S_CBRANCH_EXECNZ %bb.1, implicit $exec443 S_BRANCH %bb.2444 445 bb.2:446 undef %1.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 killed %0.sub1, implicit $mode, implicit $exec447 %0:vreg_64 = COPY killed %1448 S_BRANCH %bb.1449 450...451 452---453name: prune_subrange_phi_value_2454tracksRegLiveness: true455body: |456 ; CHECK-LABEL: name: prune_subrange_phi_value_2457 ; CHECK: bb.0:458 ; CHECK-NEXT: successors: %bb.1(0x80000000)459 ; CHECK-NEXT: liveins: $vgpr0460 ; CHECK-NEXT: {{ $}}461 ; CHECK-NEXT: undef [[COPY:%[0-9]+]].sub1:vreg_64 = COPY $vgpr0462 ; CHECK-NEXT: {{ $}}463 ; CHECK-NEXT: bb.1:464 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)465 ; CHECK-NEXT: {{ $}}466 ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec467 ; CHECK-NEXT: S_BRANCH %bb.2468 ; CHECK-NEXT: {{ $}}469 ; CHECK-NEXT: bb.2:470 ; CHECK-NEXT: successors: %bb.1(0x80000000)471 ; CHECK-NEXT: {{ $}}472 ; CHECK-NEXT: [[COPY:%[0-9]+]].sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 [[COPY]].sub1, implicit $mode, implicit $exec473 ; CHECK-NEXT: S_BRANCH %bb.1474 bb.0:475 liveins: $vgpr0476 477 undef %0.sub1:vreg_64 = COPY killed $vgpr0478 479 bb.1:480 successors: %bb.2, %bb.1481 482 %0:vreg_64 = COPY killed %0483 S_CBRANCH_EXECNZ %bb.1, implicit $exec484 S_BRANCH %bb.2485 486 bb.2:487 %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 %0.sub1, implicit $mode, implicit $exec488 S_BRANCH %bb.1489 490...491