aco/ra: don't swap p_create_vector operand with definition blocker for scc
authorRhys Perry <pendingchaos02@gmail.com>
Thu, 8 Dec 2022 19:32:25 +0000 (19:32 +0000)
committerMarge Bot <emma+marge@anholt.net>
Fri, 9 Dec 2022 15:58:43 +0000 (15:58 +0000)
SCC is 1-bit, and we can't copy a 32-bit value into it.

Fixes dEQP-VK.spirv_assembly.type.scalar.i32.iequal_tesse with
ACO_DEBUG=noopt.

No fossil-db changes.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Fixes: 9476986e6f6 ("aco/ra: special-case get_reg_for_create_vector_copy()")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20240>

src/amd/compiler/aco_register_allocation.cpp

index 4ffc4ef..55df26c 100644 (file)
@@ -1095,7 +1095,7 @@ get_reg_for_create_vector_copy(ra_ctx& ctx, RegisterFile& reg_file,
             assignment& op = ctx.assignments[instr->operands[i].tempId()];
             /* if everything matches, create parallelcopy for the killed operand */
             if (!intersects(def_reg, PhysRegInterval{op.reg, op.rc.size()}) &&
-                reg_file.get_id(op.reg) == instr->operands[i].tempId()) {
+                op.reg != scc && reg_file.get_id(op.reg) == instr->operands[i].tempId()) {
                Definition pc_def = Definition(reg, info.rc);
                parallelcopies.emplace_back(instr->operands[i], pc_def);
                return op.reg;