aco/assembler: Don't insert chained branches into otherwise empty blocks
No fossil changes, but keeps block offsets of the empty blocks intact. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33762>
This commit is contained in:
committed by
Marge Bot
parent
6659db285a
commit
713396ec8e
@@ -1575,15 +1575,20 @@ chain_branches(asm_context& ctx, std::vector<uint32_t>& out, branch_info& branch
|
||||
if (insert_at == 0) {
|
||||
/* Find the last block that is still within reach. */
|
||||
unsigned insertion_block_idx = 0;
|
||||
while (ctx.program->blocks[insertion_block_idx + 1].offset < upper_end)
|
||||
insertion_block_idx++;
|
||||
unsigned next_block = 0;
|
||||
while (ctx.program->blocks[next_block + 1].offset < upper_end) {
|
||||
if (!ctx.program->blocks[next_block].instructions.empty())
|
||||
insertion_block_idx = next_block;
|
||||
next_block++;
|
||||
}
|
||||
|
||||
insert_at = ctx.program->blocks[insertion_block_idx].offset;
|
||||
auto it = ctx.program->blocks[insertion_block_idx].instructions.begin();
|
||||
int skip = 0;
|
||||
insert_at = ctx.program->blocks[next_block].offset;
|
||||
if (insert_at < upper_start) {
|
||||
/* Ensure some forward progress by splitting the block if necessary. */
|
||||
auto it = ctx.program->blocks[next_block].instructions.begin();
|
||||
int skip = 0;
|
||||
while (skip-- > 0 || insert_at < upper_start) {
|
||||
assert(it != ctx.program->blocks[next_block].instructions.end());
|
||||
Instruction* instr = (it++)->get();
|
||||
if (instr->isSOPP()) {
|
||||
if (instr->opcode == aco_opcode::s_clause)
|
||||
@@ -1603,10 +1608,11 @@ chain_branches(asm_context& ctx, std::vector<uint32_t>& out, branch_info& branch
|
||||
|
||||
/* If the insertion point is in the middle of the block, insert the branch instructions
|
||||
* into that block instead. */
|
||||
bld.reset(&ctx.program->blocks[insertion_block_idx].instructions, it);
|
||||
bld.reset(&ctx.program->blocks[next_block].instructions, it);
|
||||
} else {
|
||||
bld.reset(&ctx.program->blocks[insertion_block_idx - 1].instructions);
|
||||
skip_branch_target = insertion_block_idx;
|
||||
/* Insert the additional branches at the end of the previous non-empty block. */
|
||||
bld.reset(&ctx.program->blocks[insertion_block_idx].instructions);
|
||||
skip_branch_target = next_block;
|
||||
}
|
||||
|
||||
/* Since we insert a branch into existing code, mitigate LdsBranchVmemWARHazard on GFX10. */
|
||||
@@ -1619,6 +1625,7 @@ chain_branches(asm_context& ctx, std::vector<uint32_t>& out, branch_info& branch
|
||||
branch_instr = bld.sopp(aco_opcode::s_branch, 1).instr;
|
||||
emit_sopp_instruction(ctx, code, branch_instr, true);
|
||||
}
|
||||
assert(insert_at >= upper_start);
|
||||
const unsigned block_offset = insert_at + code.size();
|
||||
|
||||
branch_instr = bld.sopp(aco_opcode::s_branch, 0);
|
||||
|
||||
Reference in New Issue
Block a user