aco/gfx11: use s_clause with stores

fossil-db (gfx1100):
Totals from 3535 (2.65% of 133428) affected shaders:
Instrs: 1963996 -> 1968979 (+0.25%)
CodeSize: 10077784 -> 10097716 (+0.20%)
Latency: 13264216 -> 13264741 (+0.00%)
InvThroughput: 2995676 -> 3004083 (+0.28%); split: -0.00%, +0.28%

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23505>
This commit is contained in:
Rhys Perry
2023-06-07 17:33:46 +01:00
committed by Marge Bot
parent 0c0143a4c0
commit f837fec213
2 changed files with 48 additions and 43 deletions
+9 -7
View File
@@ -55,16 +55,18 @@ void
emit_clause(Builder& bld, unsigned num_instrs, aco_ptr<Instruction>* instrs)
{
unsigned start = 0;
unsigned end = num_instrs;
/* skip any stores at the start */
for (; (start < num_instrs) && instrs[start]->definitions.empty(); start++)
bld.insert(std::move(instrs[start]));
if (bld.program->gfx_level < GFX11) {
/* skip any stores at the start */
for (; (start < num_instrs) && instrs[start]->definitions.empty(); start++)
bld.insert(std::move(instrs[start]));
for (end = start; (end < num_instrs) && !instrs[end]->definitions.empty(); end++)
;
}
unsigned end = start;
for (; (end < num_instrs) && !instrs[end]->definitions.empty(); end++)
;
unsigned clause_size = end - start;
if (clause_size > 1)
bld.sopp(aco_opcode::s_clause, -1, clause_size - 1);
+39 -36
View File
@@ -315,45 +315,48 @@ BEGIN_TEST(form_hard_clauses.heuristic)
END_TEST
BEGIN_TEST(form_hard_clauses.stores)
if (!setup_cs(NULL, GFX10))
return;
for (amd_gfx_level gfx : {GFX10, GFX11}) {
if (!setup_cs(NULL, gfx))
continue;
//>> p_unit_test 0
//; search_re('buffer_store_dword')
//; search_re('buffer_store_dword')
bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
create_mubuf_store();
create_mubuf_store();
//>> p_unit_test 0
//~gfx11! s_clause imm:1
//; search_re('buffer_store_dword')
//; search_re('buffer_store_dword')
bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
create_mubuf_store();
create_mubuf_store();
//>> p_unit_test 1
//! s_clause imm:1
//; search_re('buffer_load_dword')
//; search_re('buffer_load_dword')
//; search_re('buffer_store_dword')
bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
create_mubuf();
create_mubuf();
create_mubuf_store();
//>> p_unit_test 1
//! s_clause imm:1
//; search_re('buffer_load_dword')
//; search_re('buffer_load_dword')
//; search_re('buffer_store_dword')
bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
create_mubuf();
create_mubuf();
create_mubuf_store();
//>> p_unit_test 2
//; search_re('buffer_store_dword')
//! s_clause imm:1
//; search_re('buffer_load_dword')
//; search_re('buffer_load_dword')
bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
create_mubuf_store();
create_mubuf();
create_mubuf();
//>> p_unit_test 2
//; search_re('buffer_store_dword')
//! s_clause imm:1
//; search_re('buffer_load_dword')
//; search_re('buffer_load_dword')
bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
create_mubuf_store();
create_mubuf();
create_mubuf();
/* Unclear whether this is the best behaviour */
//>> p_unit_test 3
//; search_re('buffer_load_dword')
//; search_re('buffer_store_dword')
//; search_re('buffer_load_dword')
bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
create_mubuf();
create_mubuf_store();
create_mubuf();
/* Unclear whether this is the best behaviour */
//>> p_unit_test 3
//; search_re('buffer_load_dword')
//; search_re('buffer_store_dword')
//; search_re('buffer_load_dword')
bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
create_mubuf();
create_mubuf_store();
create_mubuf();
finish_form_hard_clause_test();
finish_form_hard_clause_test();
}
END_TEST