From c3630c9d29b7bc7dbdf7d914d39782b4d02c5520 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 14 May 2020 16:01:29 -0700 Subject: [PATCH] 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 Part-of: --- src/freedreno/ir3/ir3.h | 2 +- src/freedreno/ir3/ir3_group.c | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h index a33050956aa..e40cd0b374c 100644 --- a/src/freedreno/ir3/ir3.h +++ b/src/freedreno/ir3/ir3.h @@ -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); diff --git a/src/freedreno/ir3/ir3_group.c b/src/freedreno/ir3/ir3_group.c index 4fc236708d7..c9859197a1e 100644 --- a/src/freedreno/ir3/ir3_group.c +++ b/src/freedreno/ir3/ir3_group.c @@ -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); } -- 2.30.2