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?