| # RUN: not llc -mtriple=amdgpu9.00-amd-amdhsa -vgpr-regalloc=basic -sgpr-regalloc=basic -start-before=regallocbasic,0 -stop-after=virt-reg-rewriter,2 -verify-regalloc -o - %s 2> %t.basic.err | FileCheck -check-prefix=BASIC %s | |
| # RUN: not llc -mtriple=amdgpu9.00-amd-amdhsa -start-before=greedy,0 -stop-after=virt-reg-rewriter,2 -verify-regalloc -o - %s 2> %t.greedy.err | FileCheck -check-prefix=GREEDY %s | |
| # RUN: FileCheck -check-prefix=ERR -implicit-check-not=error %s < %t.basic.err | |
| # RUN: FileCheck -check-prefix=ERR -implicit-check-not=error %s < %t.greedy.err | |
| # This testcase must fail register allocation. It should also not | |
| # produce a verifier error after doing so. Previously, it would not | |
| # properly update the liveness for the dummy selected register. As a | |
| # result, VirtRegRewriter would incorrectly add kill flags which | |
| # combined with other uses of the physical register produced a | |
| # verifier error. | |
| # ERR: error: <unknown>:0:0: ran out of registers during register allocation | |
| # GREEDY: SI_SPILL_V256_SAVE undef $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 | |
| # GREEDY-NEXT: SI_SPILL_V512_SAVE killed $vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15_vgpr16_vgpr17_vgpr18_vgpr19, %stack.1, $sgpr32, 0, implicit $exec :: (store (s512) into %stack.1, align 4, addrspace 5) | |
| # GREEDY-NEXT: SI_SPILL_V128_SAVE killed $vgpr0_vgpr1_vgpr2_vgpr3 | |
| # GREEDY: $vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15_vgpr16_vgpr17_vgpr18_vgpr19 = SI_SPILL_V512_RESTORE | |
| # GREEDY: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 = SI_SPILL_V256_RESTORE | |
| # GREEDY: S_NOP 0, implicit killed renamable $vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15_vgpr16_vgpr17_vgpr18_vgpr19, implicit undef $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7, implicit killed renamable $vgpr0_vgpr1_vgpr2_vgpr3 | |
| # GREEDY: S_NOP 0, implicit killed renamable $vgpr20_vgpr21 | |
| # BASIC: SI_SPILL_V512_SAVE killed $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15 | |
| # BASIC: SI_SPILL_V256_SAVE killed $vgpr16_vgpr17_vgpr18_vgpr19_vgpr20_vgpr21_vgpr22_vgpr23 | |
| # BASIC: SI_SPILL_V128_SAVE undef $vgpr0_vgpr1_vgpr2_vgpr3 | |
| # BASIC: SI_SPILL_V64_SAVE killed $vgpr0_vgpr1 | |
| # BASIC: renamable $vgpr0_vgpr1_vgpr2_vgpr3 = SI_SPILL_V128_RESTORE | |
| # BASIC: renamable $vgpr16_vgpr17_vgpr18_vgpr19_vgpr20_vgpr21_vgpr22_vgpr23 = SI_SPILL_V256_RESTORE | |
| # BASIC: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15 = SI_SPILL_V512_RESTORE | |
| # BASIC: S_NOP 0, implicit undef $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15, implicit killed renamable $vgpr16_vgpr17_vgpr18_vgpr19_vgpr20_vgpr21_vgpr22_vgpr23, implicit killed renamable $vgpr0_vgpr1_vgpr2_vgpr3 | |
| # BASIC: renamable $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE | |
| # BASIC: S_NOP 0, implicit killed renamable $vgpr0_vgpr1 | |
| --- | | |
| define void @killed_reg_after_regalloc_failure() #0 { | |
| ret void | |
| } | |
| attributes #0 = { "amdgpu-waves-per-eu"="10,10" } | |
| ... | |
| --- | |
| name: killed_reg_after_regalloc_failure | |
| tracksRegLiveness: true | |
| machineFunctionInfo: | |
| scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' | |
| frameOffsetReg: '$sgpr33' | |
| stackPtrOffsetReg: '$sgpr32' | |
| body: | | |
| bb.0: | |
| S_NOP 0, implicit-def %0:vreg_512, implicit-def %1:vreg_256, implicit-def %2:vreg_128 | |
| S_NOP 0, implicit-def %3:vreg_64 | |
| S_NOP 0, implicit %0, implicit %1, implicit %2 | |
| S_NOP 0, implicit %3 | |
| S_ENDPGM 0 | |
| ... |