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) +{ + 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