Module: Mesa Branch: master Commit: 99936d7142d1eb5ba93f84d1e75c5e0183b5d434 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=99936d7142d1eb5ba93f84d1e75c5e0183b5d434
Author: Daniel Schürmann <[email protected]> Date: Mon Feb 22 11:00:22 2021 +0100 aco/spill: reload spilled exec masks directly to exec This handles the case of exec = p_linear_phi %a, %b where %a or %b might have been spilled. By directly reloading these variables into the exec mask register, we can avoid additional CSSA parallelcopies. Reviewed-by: Rhys Perry <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9196> --- src/amd/compiler/aco_spill.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index 8fcb5520483..e5f53a4cdb9 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -939,7 +939,7 @@ void add_coupling_code(spill_ctx& ctx, Block* block, unsigned block_idx) continue; unsigned pred_idx = preds[i]; - /* rename operand */ + /* if the operand was reloaded, rename */ if (ctx.spills_exit[pred_idx].find(phi->operands[i].getTemp()) == ctx.spills_exit[pred_idx].end()) { std::map<Temp, Temp>::iterator it = ctx.renames[pred_idx].find(phi->operands[i].getTemp()); if (it != ctx.renames[pred_idx].end()) @@ -961,13 +961,20 @@ void add_coupling_code(spill_ctx& ctx, Block* block, unsigned block_idx) idx--; } while (phi->opcode == aco_opcode::p_phi && pred.instructions[idx]->opcode != aco_opcode::p_logical_end); std::vector<aco_ptr<Instruction>>::iterator it = std::next(pred.instructions.begin(), idx); - aco_ptr<Instruction> reload = do_reload(ctx, tmp, new_name, ctx.spills_exit[pred_idx][tmp]); - pred.instructions.insert(it, std::move(reload)); - ctx.spills_exit[pred_idx].erase(tmp); - ctx.renames[pred_idx][tmp] = new_name; - phi->operands[i].setTemp(new_name); + /* reload spilled exec mask directly to exec */ + if (!phi->definitions[0].isTemp()) { + assert(phi->definitions[0].isFixed() && phi->definitions[0].physReg() == exec); + reload->definitions[0] = phi->definitions[0]; + phi->operands[i] = Operand(exec, ctx.program->lane_mask); + } else { + ctx.spills_exit[pred_idx].erase(tmp); + ctx.renames[pred_idx][tmp] = new_name; + phi->operands[i].setTemp(new_name); + } + + pred.instructions.insert(it, std::move(reload)); } } _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
