Mesa (11.0): nir/vars_to_ssa: Rework copy set handling in lower_copies_to_load_store

Emil Velikov evelikov at kemper.freedesktop.org
Thu Nov 19 12:41:16 UTC 2015


Module: Mesa
Branch: 11.0
Commit: 0dd0d6696fd7760f460af87f7155ce2ae6316945
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0dd0d6696fd7760f460af87f7155ce2ae6316945

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Thu Nov 12 18:10:22 2015 -0800

nir/vars_to_ssa: Rework copy set handling in lower_copies_to_load_store

Previously, we walked through a given deref_node's copies and, after
lowering the copy away, removed it from both the source and destination
copy sets.  This commit changes this to only remove it from the other
node's copy set (not the one we're lowering).  At the end of the loop, we
just throw away the copy set for the node we're lowering since that node no
longer has any copies.  This has two advantages:

 1) It's more efficient because we're doing potentially half as many set
    search operations.

 2) It now properly handles copies from a node to itself.  Perviously, it
    would delete the copy from the set when processing the destinatioon and
    then assert-fail when we couldn't find it for the source.

Cc: "11.0" <mesa-stable at lists.freedesktop.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92588
Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>
Reviewed-by: Connor Abbott <cwabbott0 at gmail.com>
(cherry picked from commit 226ba889a0f820b9f4b1132e379620d2688c96e7)

---

 src/glsl/nir/nir_lower_vars_to_ssa.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/glsl/nir/nir_lower_vars_to_ssa.c b/src/glsl/nir/nir_lower_vars_to_ssa.c
index ccb8f99..1248926 100644
--- a/src/glsl/nir/nir_lower_vars_to_ssa.c
+++ b/src/glsl/nir/nir_lower_vars_to_ssa.c
@@ -455,7 +455,8 @@ lower_copies_to_load_store(struct deref_node *node,
          struct deref_node *arg_node =
             get_deref_node(copy->variables[i], state);
 
-         if (arg_node == NULL)
+         /* Only bother removing copy entries for other nodes */
+         if (arg_node == NULL || arg_node == node)
             continue;
 
          struct set_entry *arg_entry = _mesa_set_search(arg_node->copies, copy);
@@ -466,6 +467,8 @@ lower_copies_to_load_store(struct deref_node *node,
       nir_instr_remove(&copy->instr);
    }
 
+   node->copies = NULL;
+
    return true;
 }
 




More information about the mesa-commit mailing list