RegAllocGreedy: Roll back successful recolorings on failure
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 17 Mar 2022 17:12:36 +0000 (13:12 -0400)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 12 Apr 2022 23:02:48 +0000 (19:02 -0400)
commiteefed1dbf053f0a16e4c431688cafb02c99cbb7d
treec959621d77568ee50393bd6e5c44a2dd42d66a6b
parentdfffb7df24edee4fc9cb1fac82cff6cd1df1a347
RegAllocGreedy: Roll back successful recolorings on failure

This is a replacement for the original fix attempted in
c46aab01c002b7a04135b8b7f1f52d8c9ae23a58.

This fixes "overlapping insert" assertion failures when trying to
unwind an unsuccessful recoloring attempt.

The problem would occur when there are multiple recoloring candidates
which recursively required recoloring. If one recoloring candidate was
successfully recolored at one level, and the next recoloring candidate
was unsuccessful, we would not roll back the first candidates
successful recoloring. The forgotten successful recoloring may have
been assigned to something that conflicts with a register that needs
to be restored in a parent recoloring attempt.

See the testcase added in issue48473 for a more concrete example with
explanation.
llvm/lib/CodeGen/RegAllocGreedy.cpp
llvm/lib/CodeGen/RegAllocGreedy.h
llvm/test/CodeGen/AMDGPU/issue48473.mir [new file with mode: 0644]
llvm/test/CodeGen/AMDGPU/regalloc-failure-overlapping-insert-assert.mir [new file with mode: 0644]
llvm/test/CodeGen/RISCV/regalloc-last-chance-recoloring-failure.ll [new file with mode: 0644]