From 226ba889a0f820b9f4b1132e379620d2688c96e7 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 12 Nov 2015 18:10:22 -0800 Subject: [PATCH] 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" Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92588 Reviewed-by: Timothy Arceri Reviewed-by: Connor Abbott --- 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 59715072c15..df24510b3a5 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(©->instr); } + node->copies = NULL; + return true; } -- 2.30.2