aco: fix WQM coalescing
authorDaniel Schürmann <daniel@schuermann.dev>
Thu, 14 May 2020 11:40:55 +0000 (12:40 +0100)
committerMarge Bot <eric+marge@anholt.net>
Thu, 14 May 2020 16:30:19 +0000 (16:30 +0000)
get_reg_specified() doesn't handle special registers like SCC.
Fixes: a5fc96b533418dc2d68f17f3f19ac5f82d59b978 ('aco: coalesce parallelcopies during register allocation')
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5036>

src/amd/compiler/aco_register_allocation.cpp

index a5c8ba784f4e10f14e19349ce2eb4e11cbcdb408..613e55f0034660a284bb32b389331f2a1dabdac1 100644 (file)
@@ -1864,7 +1864,9 @@ void register_allocation(Program *program, std::vector<TempSet>& live_out_per_bl
                   definition.setFixed(reg);
             } else if (instr->opcode == aco_opcode::p_wqm || instr->opcode == aco_opcode::p_parallelcopy) {
                PhysReg reg = instr->operands[i].physReg();
-               if (get_reg_specified(ctx, register_file, definition.regClass(), parallelcopy, instr, reg))
+               if (instr->operands[i].isTemp() &&
+                   instr->operands[i].getTemp().type() == definition.getTemp().type() &&
+                   !register_file.test(reg, definition.bytes()))
                   definition.setFixed(reg);
             } else if (instr->opcode == aco_opcode::p_extract_vector) {
                PhysReg reg;