Mesa (master): nir/gcm: Delete dead instructions

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 20 04:38:56 UTC 2020


Module: Mesa
Branch: master
Commit: d4cf2df01a1f7b77660ea849ba552fd5b2d751d6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d4cf2df01a1f7b77660ea849ba552fd5b2d751d6

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Tue Jan 17 18:38:40 2017 -0800

nir/gcm: Delete dead instructions

Classically, global code motion is also a dead code pass.  However, in
the initial implementation, the decision was made to place every
instruction and let conventional DCE clean up the dead ones.  Because
any uses of a dead instruction are unreachable, we have no late block
and the dead instructions are always scheduled early.  The problem is
that, because we place the dead instruction early, it  pushes the
placement of any dependencies of the dead instruction earlier than they
may need to be placed.  In order prevent dead instructions from
affecting the placement of live ones, we need to delete them.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4636>

---

 src/compiler/nir/nir_opt_gcm.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/compiler/nir/nir_opt_gcm.c b/src/compiler/nir/nir_opt_gcm.c
index aa20ab1667f..86432ab1ab5 100644
--- a/src/compiler/nir/nir_opt_gcm.c
+++ b/src/compiler/nir/nir_opt_gcm.c
@@ -343,11 +343,11 @@ gcm_schedule_late_def(nir_ssa_def *def, void *void_state)
    nir_block *early_block =
       state->instr_infos[def->parent_instr->index].early_block;
 
-   /* Some instructions may never be used.  We'll just schedule them early and
-    * let dead code clean them up.
+   /* Some instructions may never be used.  Flag them and the instruction
+    * placement code will get rid of them for us.
     */
    if (lca == NULL) {
-      def->parent_instr->block = early_block;
+      def->parent_instr->block = NULL;
       return true;
    }
 
@@ -410,6 +410,23 @@ gcm_place_instr_def(nir_ssa_def *def, void *state)
    return false;
 }
 
+static bool
+gcm_replace_def_with_undef(nir_ssa_def *def, void *void_state)
+{
+   struct gcm_state *state = void_state;
+
+   if (list_is_empty(&def->uses) && list_is_empty(&def->if_uses))
+      return true;
+
+   nir_ssa_undef_instr *undef =
+      nir_ssa_undef_instr_create(state->impl->function->shader,
+                                 def->num_components, def->bit_size);
+   nir_instr_insert(nir_before_cf_list(&state->impl->body), &undef->instr);
+   nir_ssa_def_rewrite_uses(def, nir_src_for_ssa(&undef->def));
+
+   return true;
+}
+
 /** Places an instrution back into the program
  *
  * The earlier passes of GCM simply choose blocks for each instruction and
@@ -433,6 +450,12 @@ gcm_place_instr(nir_instr *instr, struct gcm_state *state)
 
    instr->pass_flags |= GCM_INSTR_PLACED;
 
+   if (instr->block == NULL) {
+      nir_foreach_ssa_def(instr, gcm_replace_def_with_undef, state);
+      nir_instr_remove(instr);
+      return;
+   }
+
    /* Phi nodes are our once source of back-edges.  Since right now we are
     * only doing scheduling within blocks, we don't need to worry about
     * them since they are always at the top.  Just skip them completely.



More information about the mesa-commit mailing list