From f81aaee7f17449cc454c73c61186355d0f0aa3ad Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Wed, 29 Oct 2025 12:56:51 +0000 Subject: [PATCH] aco/ra: create vectors for affinities of split definitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For example: a = ... b = ... if { c, d = split } phi(a, c) phi(b, d) This patch will allocate 'a' and 'b' as a vector. fossil-db (navi31): Totals from 2556 (3.20% of 79825) affected shaders: MaxWaves: 59957 -> 59955 (-0.00%) Instrs: 9170941 -> 9154954 (-0.17%); split: -0.19%, +0.02% CodeSize: 48245956 -> 48182620 (-0.13%); split: -0.15%, +0.02% VGPRs: 189372 -> 189900 (+0.28%); split: -0.04%, +0.32% Latency: 85469322 -> 85262360 (-0.24%); split: -0.32%, +0.08% InvThroughput: 14515911 -> 14486970 (-0.20%); split: -0.27%, +0.07% VClause: 197980 -> 197959 (-0.01%); split: -0.02%, +0.01% Copies: 787838 -> 774288 (-1.72%); split: -1.91%, +0.19% Branches: 271810 -> 271799 (-0.00%); split: -0.01%, +0.01% VALU: 5331813 -> 5318566 (-0.25%); split: -0.28%, +0.03% SALU: 1133559 -> 1133054 (-0.04%); split: -0.05%, +0.01% VOPD: 2435 -> 2418 (-0.70%); split: +0.12%, -0.82% fossil-db (navi21): Totals from 37513 (46.99% of 79825) affected shaders: Instrs: 26734825 -> 26681225 (-0.20%); split: -0.23%, +0.03% CodeSize: 141353284 -> 141144360 (-0.15%); split: -0.17%, +0.02% VGPRs: 1556760 -> 1556384 (-0.02%); split: -0.21%, +0.18% Latency: 146201548 -> 146156473 (-0.03%); split: -0.20%, +0.17% InvThroughput: 33921803 -> 33867398 (-0.16%); split: -0.23%, +0.07% VClause: 502263 -> 502209 (-0.01%); split: -0.27%, +0.26% SClause: 593142 -> 593155 (+0.00%); split: -0.00%, +0.00% Copies: 2600995 -> 2551257 (-1.91%); split: -2.16%, +0.25% Branches: 857910 -> 857787 (-0.01%); split: -0.03%, +0.02% VALU: 15674532 -> 15625013 (-0.32%); split: -0.35%, +0.04% SALU: 4635548 -> 4634680 (-0.02%); split: -0.04%, +0.02% Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_register_allocation.cpp | 45 ++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/amd/compiler/aco_register_allocation.cpp b/src/amd/compiler/aco_register_allocation.cpp index 520a5c61ff4..6e67ba21948 100644 --- a/src/amd/compiler/aco_register_allocation.cpp +++ b/src/amd/compiler/aco_register_allocation.cpp @@ -3442,6 +3442,51 @@ get_affinities(ra_ctx& ctx) ctx.vectors[vec[0].id()] = it->second; } } + + /* If split definitions have affinities with other temporaries, try to allocate those temporaries + * as a vector. */ + for (std::pair pair : ctx.split_vectors) { + Instruction* split = pair.second; + + vector_info info; + info.num_parts = split->definitions.size(); + + unsigned num_temps = 0; + for (unsigned i = 0; i < split->definitions.size(); i++) { + Definition def = split->definitions[i]; + uint32_t id = ctx.assignments[def.tempId()].affinity; + if (!id || def.regClass().type() != split->operands[0].regClass().type()) + continue; + + if (!info.parts) { + info.parts = + (Operand*)ctx.memory.allocate(sizeof(Operand) * info.num_parts, alignof(Operand)); + for (unsigned j = 0; j < split->definitions.size(); j++) + info.parts[j] = Operand(split->definitions[j].regClass()); + } + + info.parts[i] = Operand(Temp(id, ctx.program->temp_rc[id])); + num_temps++; + } + if (!num_temps) + continue; + + for (unsigned i = 0; i < split->definitions.size(); i++) { + uint32_t id = info.parts[i].tempId(); + if (!id) + continue; + + /* If the new vector affinities only includes one temporary, only overwrite the old one if + * the new one is stronger. */ + auto vec_it = ctx.vectors.find(id); + if (num_temps == 1 && vec_it != ctx.vectors.end() && + (!vec_it->second.is_weak || info.is_weak)) + continue; + + info.index = i; + ctx.vectors[id] = info; + } + } } void