freedreno/ir3/postsched: avoid moving tex ahead of kill
authorRob Clark <robdclark@chromium.org>
Fri, 3 Apr 2020 16:04:10 +0000 (09:04 -0700)
committerMarge Bot <eric+marge@anholt.net>
Mon, 13 Apr 2020 20:47:28 +0000 (20:47 +0000)
Add extra dependencies of tex/mem instructions on previous kill
instructions to avoid moving them ahead of kills.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4440>

src/freedreno/ir3/ir3_postsched.c

index 3dc4505c52da5fcb9add3ddcc106580f6f921ce9..09e58750c048164aa7976ccfdf7b71fb08f3dd21 100644 (file)
@@ -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?