aco: fix corner case in register allocation
authorDaniel Schürmann <daniel@schuermann.dev>
Sat, 16 May 2020 16:14:30 +0000 (17:14 +0100)
committerMarge Bot <eric+marge@anholt.net>
Thu, 21 May 2020 12:07:40 +0000 (12:07 +0000)
We mark dead operands in the register file when searching for
a register for a definition. Only do so, if this space has not
yet been taken by a different definition.

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5070>

src/amd/compiler/aco_register_allocation.cpp

index d296e61de502891d42f9632bbafdc92acd14a77d..f40914e8bf03a765960b8eb86c5936e09f420995 100644 (file)
@@ -700,9 +700,9 @@ std::pair<PhysReg, bool> get_reg_impl(ra_ctx& ctx,
       if (instr->operands[j].isTemp() &&
           instr->operands[j].isFirstKillBeforeDef() &&
           instr->operands[j].physReg() >= lb &&
-          instr->operands[j].physReg() < ub) {
+          instr->operands[j].physReg() < ub &&
+          !reg_file.test(instr->operands[j].physReg(), instr->operands[j].bytes())) {
          assert(instr->operands[j].isFixed());
-         assert(!reg_file.test(instr->operands[j].physReg(), instr->operands[j].bytes()));
          reg_file.block(instr->operands[j].physReg(), instr->operands[j].regClass());
          killed_ops += instr->operands[j].getTemp().size();
       }