From 8525993d02c0b9f4a8d57fc0bef889af616282fe Mon Sep 17 00:00:00 2001 From: Natalie Vock Date: Wed, 26 Nov 2025 14:04:39 +0100 Subject: [PATCH] aco/ra: Move register preservation logic in last block to p_return Part-of: --- src/amd/compiler/aco_register_allocation.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/amd/compiler/aco_register_allocation.cpp b/src/amd/compiler/aco_register_allocation.cpp index 8fabf80610c..63df22e7dc1 100644 --- a/src/amd/compiler/aco_register_allocation.cpp +++ b/src/amd/compiler/aco_register_allocation.cpp @@ -3682,10 +3682,9 @@ recreate_blocking_vectors(ra_ctx& ctx, const std::vector& splits, } } - void -handle_last_reload_preserved(ra_ctx& ctx, aco_ptr& instr, - std::vector& parallelcopy, RegisterFile& register_file) +handle_return(ra_ctx& ctx, aco_ptr& instr, std::vector& parallelcopy, + RegisterFile& register_file) { BITSET_DECLARE(preserved_regs, 512); ctx.program->callee_abi.preservedRegisters(preserved_regs); @@ -3839,13 +3838,12 @@ register_allocation(Program* program, ra_test_policy policy) register_file.clear(op); } - /* If this is the last p_reload_preserved, we have no more opportunities to restore - * overwritten ABI-preserved registers. Make sure all remaining temporaries are outside - * preserved registers, then block the preserved registers to mark them unusable. + /* After p_return, we have no more opportunities to restore overwritten ABI-preserved + * registers. Make sure all remaining temporaries are outside preserved registers, then + * block the preserved registers to mark them unusable. */ - if (instr->opcode == aco_opcode::p_reload_preserved && block.linear_succs.empty()) { - handle_last_reload_preserved(ctx, instr, parallelcopy, register_file); - } + if (instr->opcode == aco_opcode::p_return) + handle_return(ctx, instr, parallelcopy, register_file); BITSET_DECLARE(call_clobbered_regs, 512); if (instr->isCall()) {