| # RUN: llc -mtriple=amdgpu9.00 -run-pass livevars -run-pass phi-node-elimination -o - %s | FileCheck %s | |
| # RUN: llc -mtriple=amdgpu9.00 --passes='require<live-vars>,phi-node-elimination' -o - %s | FileCheck %s | |
| ################################################################################ | |
| # This test used to hit an assert in PHIElimination: | |
| # PHIElimination::LowerPHINode(llvm::MachineBasicBlock&, llvm::MachineBasicBlock::iterator): Assertion `KillInst->readsRegister(SrcReg) && "Cannot find kill instruction"' | |
| --- | |
| name: foo | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| S_CBRANCH_SCC0 %bb.2, implicit undef $scc | |
| bb.1: | |
| %1:sreg_32_xm0 = S_MOV_B32 255 | |
| S_BRANCH %bb.3 | |
| bb.2: | |
| %2:sreg_32_xm0 = S_MOV_B32 254 | |
| bb.3: | |
| dead %3:sreg_32_xm0 = PHI undef %2, %bb.2, undef %1, %bb.1 | |
| %4:sreg_32_xm0 = PHI %2, %bb.2, %1, %bb.1 | |
| S_NOP 0, implicit %4 | |
| ... | |
| # CHECK-LABEL: name: foo | |
| # CHECK: bb.3: | |
| # CHECK-NEXT: %2:sreg_32_xm0 = IMPLICIT_DEF | |
| # CHECK-NEXT: %3:sreg_32_xm0 = COPY %4 | |
| # CHECK-NEXT: S_NOP 0, implicit %3 | |
| ################################################################################ | |
| # Similar test as above, but with swapped order for the PHI nodes. | |
| # With this PHI node order we did not hit the assert, but we used to get | |
| # | |
| # bb.3: | |
| # dead %3:sreg_32_xm0 = COPY killed %4 | |
| # %2:sreg_32_xm0 = COPY %4 | |
| # S_NOP 0, implicit killed %2 | |
| # | |
| # which looks weird regarding killed flags for %4. | |
| --- | |
| name: bar | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| S_CBRANCH_SCC0 %bb.2, implicit undef $scc | |
| bb.1: | |
| %1:sreg_32_xm0 = S_MOV_B32 255 | |
| S_BRANCH %bb.3 | |
| bb.2: | |
| %2:sreg_32_xm0 = S_MOV_B32 254 | |
| bb.3: | |
| %4:sreg_32_xm0 = PHI %2, %bb.2, %1, %bb.1 | |
| dead %3:sreg_32_xm0 = PHI undef %2, %bb.2, undef %1, %bb.1 | |
| S_NOP 0, implicit %4 | |
| ... | |
| # CHECK-LABEL: name: bar | |
| # CHECK: bb.3: | |
| # CHECK-NEXT: %3:sreg_32_xm0 = IMPLICIT_DEF | |
| # CHECK-NEXT: %2:sreg_32_xm0 = COPY %4 | |
| # CHECK-NEXT: S_NOP 0, implicit %2 | |
| # The following test crashes in phi-elimination hooks. | |
| # | |
| --- | |
| name: bax | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| S_CBRANCH_SCC0 %bb.2, implicit undef $scc | |
| bb.1: | |
| %1:sreg_32_xm0 = S_MOV_B32 255 | |
| S_BRANCH %bb.3 | |
| bb.2: | |
| %2:sreg_32_xm0 = S_MOV_B32 254 | |
| bb.3: | |
| %3:sreg_32_xm0 = PHI %2, %bb.2, %1, %bb.1 | |
| ... | |
| # CHECK-LABEL: name: bax | |
| # CHECK: bb.3: | |
| # CHECK-NEXT: %2:sreg_32_xm0 = COPY %3 |