On Tue, Dec 16, 2014 at 1:04 AM, Jason Ekstrand <ja...@jlekstrand.net> wrote: > Since we don't actually have an "if" instruction, this is a very common > pattern when iterating over instructions. This adds a helper function for > it to make things a little less painful. > --- > src/glsl/nir/nir.c | 17 +++++++++++++++++ > src/glsl/nir/nir.h | 5 +++++ > src/glsl/nir/nir_from_ssa.c | 9 +++------ > src/glsl/nir/nir_opt_dce.c | 12 +++++------- > 4 files changed, 30 insertions(+), 13 deletions(-) > > diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c > index 5dbcc77..e90eeda 100644 > --- a/src/glsl/nir/nir.c > +++ b/src/glsl/nir/nir.c > @@ -1686,6 +1686,23 @@ nir_foreach_block_reverse(nir_function_impl *impl, > nir_foreach_block_cb cb, > return true; > } > > +nir_if * > +nir_block_following_if(nir_block *block)
Could you rename this to "nir_block_get_following_if"? I read this as "block following if" (i.e. finding the block after an if statement) and was confused at first. Also, it's generally a good idea to name functions with verbs. > +{ > + if (exec_node_is_tail_sentinel(&block->cf_node.node)) > + return NULL; > + > + if (nir_cf_node_is_last(&block->cf_node)) > + return NULL; > + > + nir_cf_node *next_node = nir_cf_node_next(&block->cf_node); > + > + if (next_node->type != nir_cf_node_if) > + return NULL; > + > + return nir_cf_node_as_if(next_node); > +} > + > static bool > index_block(nir_block *block, void *state) > { > diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h > index 8d5f6b8..f405694 100644 > --- a/src/glsl/nir/nir.h > +++ b/src/glsl/nir/nir.h > @@ -1275,6 +1275,11 @@ typedef bool (*nir_foreach_block_cb)(nir_block *block, > void *state); > bool nir_foreach_block(nir_function_impl *impl, nir_foreach_block_cb cb, > void *state); > > +/* If the following CF node is an if, this function returns that if. > + * Otherwise, it returns NULL. > + */ > +nir_if *nir_block_following_if(nir_block *block); > + > void nir_index_local_regs(nir_function_impl *impl); > void nir_index_global_regs(nir_shader *shader); > void nir_index_ssa_defs(nir_function_impl *impl); > diff --git a/src/glsl/nir/nir_from_ssa.c b/src/glsl/nir/nir_from_ssa.c > index 04c8103..a26f0c4 100644 > --- a/src/glsl/nir/nir_from_ssa.c > +++ b/src/glsl/nir/nir_from_ssa.c > @@ -109,12 +109,9 @@ convert_from_ssa_block(nir_block *block, void > *void_state) > } > } > > - if (block->cf_node.node.next != NULL && /* check that we aren't the end > node */ > - !nir_cf_node_is_last(&block->cf_node) && > - nir_cf_node_next(&block->cf_node)->type == nir_cf_node_if) { > - nir_if *if_stmt = nir_cf_node_as_if(nir_cf_node_next(&block->cf_node)); > - rewrite_ssa_src(&if_stmt->condition, state); > - } > + nir_if *following_if = nir_block_following_if(block); > + if (following_if) > + rewrite_ssa_src(&following_if->condition, state); > > return true; > } > diff --git a/src/glsl/nir/nir_opt_dce.c b/src/glsl/nir/nir_opt_dce.c > index c18ba32..c3bbcb4 100644 > --- a/src/glsl/nir/nir_opt_dce.c > +++ b/src/glsl/nir/nir_opt_dce.c > @@ -123,13 +123,11 @@ init_block_cb(nir_block *block, void *_state) > nir_foreach_instr(block, instr) > init_instr(instr, worklist); > > - if (block->cf_node.node.next != NULL && /* check that we aren't the end > node */ > - !nir_cf_node_is_last(&block->cf_node) && > - nir_cf_node_next(&block->cf_node)->type == nir_cf_node_if) { > - nir_if *if_stmt = nir_cf_node_as_if(nir_cf_node_next(&block->cf_node)); > - if (if_stmt->condition.is_ssa && > - !if_stmt->condition.ssa->parent_instr->live) > - worklist_push(worklist, if_stmt->condition.ssa->parent_instr); > + nir_if *following_if = nir_block_following_if(block); > + if (following_if) { > + if (following_if->condition.is_ssa && > + !following_if->condition.ssa->parent_instr->live) > + worklist_push(worklist, following_if->condition.ssa->parent_instr); > } > > return true; > -- > 2.2.0 > > _______________________________________________ > 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