From: Rob Clark Date: Fri, 3 Apr 2020 16:04:10 +0000 (-0700) Subject: freedreno/ir3/postsched: avoid moving tex ahead of kill X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=89a78a07dec8f6fab7a80bba951b134a42bb9a2c;p=mesa.git freedreno/ir3/postsched: avoid moving tex ahead of kill Add extra dependencies of tex/mem instructions on previous kill instructions to avoid moving them ahead of kills. Signed-off-by: Rob Clark Part-of: --- diff --git a/src/freedreno/ir3/ir3_postsched.c b/src/freedreno/ir3/ir3_postsched.c index 3dc4505c52d..09e58750c04 100644 --- a/src/freedreno/ir3/ir3_postsched.c +++ b/src/freedreno/ir3/ir3_postsched.c @@ -506,6 +506,14 @@ sched_dag_init(struct ir3_postsched_ctx *ctx) calculate_forward_deps(ctx); calculate_reverse_deps(ctx); + /* + * To avoid expensive texture fetches, etc, from being moved ahead + * of kills, track the kills we've seen so far, so we can add an + * extra dependency on them for tex/mem instructions + */ + struct util_dynarray kills; + util_dynarray_init(&kills, ctx->mem_ctx); + /* * Normal srcs won't be in SSA at this point, those are dealt with in * calculate_forward_deps() and calculate_reverse_deps(). But we still @@ -532,6 +540,16 @@ sched_dag_init(struct ir3_postsched_ctx *ctx) dag_add_edge(&sn->dag, &n->dag, NULL); } + + if (is_kill(instr)) { + util_dynarray_append(&kills, struct ir3_instruction *, instr); + } else if (is_tex(instr) || is_mem(instr)) { + util_dynarray_foreach(&kills, struct ir3_instruction *, instrp) { + struct ir3_instruction *kill = *instrp; + struct ir3_postsched_node *kn = kill->data; + dag_add_edge(&kn->dag, &n->dag, NULL); + } + } } // TODO do we want to do this after reverse-dependencies?