[Mesa-dev] [PATCH 049/133] nir: Add a function to detect if a block is immediately followed by an if
Jason Ekstrand
jason at jlekstrand.net
Mon Dec 15 22:04:59 PST 2014
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
More information about the mesa-dev
mailing list