aboutsummaryrefslogtreecommitdiffstats
path: root/src/freedreno/ir3/ir3_postsched.c
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2020-04-03 09:04:10 -0700
committerMarge Bot <[email protected]>2020-04-13 20:47:28 +0000
commit89a78a07dec8f6fab7a80bba951b134a42bb9a2c (patch)
treec2b8f3b2a157721bec70dde05c6edf903cfc6ec5 /src/freedreno/ir3/ir3_postsched.c
parent017fdab2172c845eb7dd6e11d2a5c13245374247 (diff)
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 <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4440>
Diffstat (limited to 'src/freedreno/ir3/ir3_postsched.c')
-rw-r--r--src/freedreno/ir3/ir3_postsched.c18
1 files changed, 18 insertions, 0 deletions
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
@@ -507,6 +507,14 @@ sched_dag_init(struct ir3_postsched_ctx *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
* have the false-dep information in SSA form, so go ahead and add
@@ -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?