freedreno/ir3/group: report progress

Not iterative, but this will let IR3_PASS() macro know if there are any
changes to print.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5048>
This commit is contained in:
Rob Clark 2020-05-14 16:01:29 -07:00 committed by Marge Bot
parent 721147a05d
commit c3630c9d29
2 changed files with 19 additions and 11 deletions

View file

@ -1201,7 +1201,7 @@ bool ir3_cf(struct ir3 *ir);
bool ir3_cp(struct ir3 *ir, struct ir3_shader_variant *so);
/* group neighbors and insert mov's to resolve conflicts: */
void ir3_group(struct ir3 *ir);
bool ir3_group(struct ir3 *ir);
/* scheduling: */
bool ir3_sched_add_deps(struct ir3 *ir);

View file

@ -139,45 +139,53 @@ restart:
}
}
static void
static bool
instr_find_neighbors(struct ir3_instruction *instr)
{
struct ir3_instruction *src;
bool progress = false;
if (ir3_instr_check_mark(instr))
return;
return false;
if (instr->opc == OPC_META_COLLECT)
if (instr->opc == OPC_META_COLLECT) {
group_collect(instr);
progress = true;
}
foreach_ssa_src (src, instr)
instr_find_neighbors(src);
progress |= instr_find_neighbors(src);
return progress;
}
static void
static bool
find_neighbors(struct ir3 *ir)
{
bool progress = false;
unsigned i;
struct ir3_instruction *out;
foreach_output (out, ir)
instr_find_neighbors(out);
progress |= instr_find_neighbors(out);
foreach_block (block, &ir->block_list) {
for (i = 0; i < block->keeps_count; i++) {
struct ir3_instruction *instr = block->keeps[i];
instr_find_neighbors(instr);
progress |= instr_find_neighbors(instr);
}
/* We also need to account for if-condition: */
if (block->condition)
instr_find_neighbors(block->condition);
progress |= instr_find_neighbors(block->condition);
}
return progress;
}
void
bool
ir3_group(struct ir3 *ir)
{
ir3_clear_mark(ir);
find_neighbors(ir);
return find_neighbors(ir);
}