For some reason, the v2 version of this disappeared from my inbox, so I'll say
Reviewed-by: Connor Abbott <cwabbo...@gmail.com> I'm not convinced this is enough for when we optimize constant if-statement conditions, but I'll leave that be for now. On Thu, Feb 5, 2015 at 5:28 PM, Jason Ekstrand <ja...@jlekstrand.net> wrote: > Previously, if you remved a CF node that still had instructions in it, none > of the use/def information from those instructions would get cleaned up. > Also, we weren't removing if statements from the if_uses of the > corresponding register or SSA def. This commit fixes both of these > problems > --- > src/glsl/nir/nir.c | 54 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 54 insertions(+) > > diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c > index 9a88bd3..8ea7bb5 100644 > --- a/src/glsl/nir/nir.c > +++ b/src/glsl/nir/nir.c > @@ -1148,6 +1148,58 @@ stitch_blocks(nir_block *before, nir_block *after) > exec_node_remove(&after->cf_node.node); > } > > +static void > +remove_defs_uses(nir_instr *instr); > + > +static void > +cleanup_cf_node(nir_cf_node *node) > +{ > + switch (node->type) { > + case nir_cf_node_block: { > + nir_block *block = nir_cf_node_as_block(node); > + /* We need to walk the instructions and clean up defs/uses */ > + nir_foreach_instr(block, instr) > + remove_defs_uses(instr); > + break; > + } > + > + case nir_cf_node_if: { > + nir_if *if_stmt = nir_cf_node_as_if(node); > + foreach_list_typed(nir_cf_node, child, node, &if_stmt->then_list) > + cleanup_cf_node(child); > + foreach_list_typed(nir_cf_node, child, node, &if_stmt->else_list) > + cleanup_cf_node(child); > + > + struct set *if_uses; > + if (if_stmt->condition.is_ssa) { > + if_uses = if_stmt->condition.ssa->if_uses; > + } else { > + if_uses = if_stmt->condition.reg.reg->if_uses; > + } > + > + struct set_entry *entry = _mesa_set_search(if_uses, if_stmt); > + assert(entry); > + _mesa_set_remove(if_uses, entry); > + break; > + } > + > + case nir_cf_node_loop: { > + nir_loop *loop = nir_cf_node_as_loop(node); > + foreach_list_typed(nir_cf_node, child, node, &loop->body) > + cleanup_cf_node(child); > + break; > + } > + case nir_cf_node_function: { > + nir_function_impl *impl = nir_cf_node_as_function(node); > + foreach_list_typed(nir_cf_node, child, node, &impl->body) > + cleanup_cf_node(child); > + break; > + } > + default: > + unreachable("Invalid CF node type"); > + } > +} > + > void > nir_cf_node_remove(nir_cf_node *node) > { > @@ -1175,6 +1227,8 @@ nir_cf_node_remove(nir_cf_node *node) > exec_node_remove(&node->node); > stitch_blocks(before_block, after_block); > } > + > + cleanup_cf_node(node); > } > > static bool > -- > 2.2.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev