From fd49ba59a3888795ad0788259e3472e08c42bc24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 11 Dec 2020 09:23:04 +0100 Subject: [PATCH] aco/ra: use get_reg_specified() for p_extract_vector 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 Part-of: --- src/amd/compiler/aco_register_allocation.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/amd/compiler/aco_register_allocation.cpp b/src/amd/compiler/aco_register_allocation.cpp index 7ab1004a2cb..7b535c658b3 100644 --- a/src/amd/compiler/aco_register_allocation.cpp +++ b/src/amd/compiler/aco_register_allocation.cpp @@ -2172,14 +2172,10 @@ void register_allocation(Program *program, std::vector& 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);