aco: Only fix used variables to registers

Reviewed-by: Friedrich Vock <friedrich.vock@gmx.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27137>
This commit is contained in:
Konstantin Seurer 2024-01-17 15:58:13 +01:00 committed by Marge Bot
parent 348d13f06e
commit eb249bb18e
3 changed files with 17 additions and 3 deletions

View file

@ -9308,11 +9308,13 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
break; break;
} }
case nir_intrinsic_store_scalar_arg_amd: { case nir_intrinsic_store_scalar_arg_amd: {
BITSET_SET(ctx->output_args, nir_intrinsic_base(instr));
ctx->arg_temps[nir_intrinsic_base(instr)] = ctx->arg_temps[nir_intrinsic_base(instr)] =
bld.as_uniform(get_ssa_temp(ctx, instr->src[0].ssa)); bld.as_uniform(get_ssa_temp(ctx, instr->src[0].ssa));
break; break;
} }
case nir_intrinsic_store_vector_arg_amd: { case nir_intrinsic_store_vector_arg_amd: {
BITSET_SET(ctx->output_args, nir_intrinsic_base(instr));
ctx->arg_temps[nir_intrinsic_base(instr)] = ctx->arg_temps[nir_intrinsic_base(instr)] =
as_vgpr(ctx, get_ssa_temp(ctx, instr->src[0].ssa)); as_vgpr(ctx, get_ssa_temp(ctx, instr->src[0].ssa));
break; break;
@ -11668,19 +11670,27 @@ merged_wave_info_to_mask(isel_context* ctx, unsigned i)
static void static void
insert_rt_jump_next(isel_context& ctx, const struct ac_shader_args* args) insert_rt_jump_next(isel_context& ctx, const struct ac_shader_args* args)
{ {
unsigned src_count = ctx.args->arg_count; unsigned src_count = 0;
for (unsigned i = 0; i < ctx.args->arg_count; i++)
src_count += !!BITSET_TEST(ctx.output_args, i);
Pseudo_instruction* ret = Pseudo_instruction* ret =
create_instruction<Pseudo_instruction>(aco_opcode::p_return, Format::PSEUDO, src_count, 0); create_instruction<Pseudo_instruction>(aco_opcode::p_return, Format::PSEUDO, src_count, 0);
ctx.block->instructions.emplace_back(ret); ctx.block->instructions.emplace_back(ret);
for (unsigned i = 0; i < src_count; i++) { src_count = 0;
for (unsigned i = 0; i < ctx.args->arg_count; i++) {
if (!BITSET_TEST(ctx.output_args, i))
continue;
enum ac_arg_regfile file = ctx.args->args[i].file; enum ac_arg_regfile file = ctx.args->args[i].file;
unsigned size = ctx.args->args[i].size; unsigned size = ctx.args->args[i].size;
unsigned reg = ctx.args->args[i].offset + (file == AC_ARG_SGPR ? 0 : 256); unsigned reg = ctx.args->args[i].offset + (file == AC_ARG_SGPR ? 0 : 256);
RegClass type = RegClass(file == AC_ARG_SGPR ? RegType::sgpr : RegType::vgpr, size); RegClass type = RegClass(file == AC_ARG_SGPR ? RegType::sgpr : RegType::vgpr, size);
Operand op = ctx.arg_temps[i].id() ? Operand(ctx.arg_temps[i], PhysReg{reg}) Operand op = ctx.arg_temps[i].id() ? Operand(ctx.arg_temps[i], PhysReg{reg})
: Operand(PhysReg{reg}, type); : Operand(PhysReg{reg}, type);
ret->operands[i] = op; ret->operands[src_count] = op;
src_count++;
} }
Builder bld(ctx.program, ctx.block); Builder bld(ctx.program, ctx.block);

View file

@ -106,6 +106,8 @@ struct isel_context {
/* WQM information */ /* WQM information */
uint32_t wqm_block_idx; uint32_t wqm_block_idx;
uint32_t wqm_instruction_idx; uint32_t wqm_instruction_idx;
BITSET_DECLARE(output_args, AC_MAX_ARGS);
}; };
inline Temp inline Temp

View file

@ -635,6 +635,8 @@ init_context(isel_context* ctx, nir_shader* shader)
ctx->program->constant_data.insert(ctx->program->constant_data.end(), ctx->program->constant_data.insert(ctx->program->constant_data.end(),
(uint8_t*)shader->constant_data, (uint8_t*)shader->constant_data,
(uint8_t*)shader->constant_data + shader->constant_data_size); (uint8_t*)shader->constant_data + shader->constant_data_size);
BITSET_CLEAR_RANGE(ctx->output_args, 0, BITSET_SIZE(ctx->output_args));
} }
void void