aco/gfx11+: limit hard clauses to 32 instructions
https://github.com/llvm/llvm-project/pull/81287 Foz-DB Navi31: Totals from 406 (0.52% of 78112) affected shaders: Instrs: 585342 -> 585750 (+0.07%) CodeSize: 3077856 -> 3079456 (+0.05%); split: -0.00%, +0.05% Latency: 3263165 -> 3263326 (+0.00%); split: -0.00%, +0.01% InvThroughput: 664092 -> 664114 (+0.00%); split: -0.00%, +0.00% VClause: 11143 -> 11537 (+3.54%) SClause: 11878 -> 11884 (+0.05%) Copies: 39807 -> 39815 (+0.02%) Cc: mesa-stable Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27569>
This commit is contained in:
@@ -248,6 +248,10 @@ get_type(Program* program, aco_ptr<Instruction>& instr)
|
|||||||
void
|
void
|
||||||
form_hard_clauses(Program* program)
|
form_hard_clauses(Program* program)
|
||||||
{
|
{
|
||||||
|
/* The ISA documentation says 63 is the maximum for GFX11/12, but according to
|
||||||
|
* LLVM there are HW bugs with more than 32 instructions.
|
||||||
|
*/
|
||||||
|
const unsigned max_clause_length = program->gfx_level >= GFX11 ? 32 : 63;
|
||||||
for (Block& block : program->blocks) {
|
for (Block& block : program->blocks) {
|
||||||
unsigned num_instrs = 0;
|
unsigned num_instrs = 0;
|
||||||
aco_ptr<Instruction> current_instrs[63];
|
aco_ptr<Instruction> current_instrs[63];
|
||||||
@@ -261,7 +265,7 @@ form_hard_clauses(Program* program)
|
|||||||
aco_ptr<Instruction>& instr = block.instructions[i];
|
aco_ptr<Instruction>& instr = block.instructions[i];
|
||||||
|
|
||||||
clause_type type = get_type(program, instr);
|
clause_type type = get_type(program, instr);
|
||||||
if (type != current_type || num_instrs == 63 ||
|
if (type != current_type || num_instrs == max_clause_length ||
|
||||||
(num_instrs && !should_form_clause(current_instrs[0].get(), instr.get()))) {
|
(num_instrs && !should_form_clause(current_instrs[0].get(), instr.get()))) {
|
||||||
emit_clause(bld, num_instrs, current_instrs);
|
emit_clause(bld, num_instrs, current_instrs);
|
||||||
num_instrs = 0;
|
num_instrs = 0;
|
||||||
|
Reference in New Issue
Block a user