aco/ra: use get_reg_specified() for p_extract_vector
authorDaniel Schürmann <daniel@schuermann.dev>
Fri, 11 Dec 2020 08:23:04 +0000 (09:23 +0100)
committerMarge Bot <eric+marge@anholt.net>
Fri, 11 Dec 2020 13:44:47 +0000 (13:44 +0000)
On GFX6/7, it might violate validation rules, otherwise.

Fixes: 51f4b22feec3720c89458094a3245efc984115ee ('aco: don't allow unaligned subdword accesses on GFX6/7')
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8047>

src/amd/compiler/aco_register_allocation.cpp

index 7ab1004..7b535c6 100644 (file)
@@ -2172,14 +2172,10 @@ void register_allocation(Program *program, std::vector<IDSet>& live_out_per_bloc
                    !register_file.test(reg, definition->bytes()))
                   definition->setFixed(reg);
             } else if (instr->opcode == aco_opcode::p_extract_vector) {
-               PhysReg reg;
-               if (instr->operands[0].isKillBeforeDef() &&
-                   instr->operands[0].getTemp().type() == definition->getTemp().type()) {
-                  reg = instr->operands[0].physReg();
-                  reg.reg_b += definition->bytes() * instr->operands[1].constantValue();
-                  assert(!register_file.test(reg, definition->bytes()));
+               PhysReg reg = instr->operands[0].physReg();
+               reg.reg_b += definition->bytes() * instr->operands[1].constantValue();
+               if (get_reg_specified(ctx, register_file, definition->regClass(), parallelcopy, instr, reg))
                   definition->setFixed(reg);
-               }
             } else if (instr->opcode == aco_opcode::p_create_vector) {
                PhysReg reg = get_reg_create_vector(ctx, register_file, definition->getTemp(),
                                                    parallelcopy, instr);