nir: add nir_remove_after_cf_node helper
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28301>
This commit is contained in:
@@ -171,6 +171,18 @@ nir_cf_node_remove(nir_cf_node *node)
|
||||
nir_cf_delete(&list);
|
||||
}
|
||||
|
||||
static inline void
|
||||
nir_remove_after_cf_node(nir_cf_node *node)
|
||||
{
|
||||
nir_cf_node *end = node;
|
||||
while (!nir_cf_node_is_last(end))
|
||||
end = nir_cf_node_next(end);
|
||||
|
||||
nir_cf_list list;
|
||||
nir_cf_extract(&list, nir_after_cf_node(node), nir_after_cf_node(end));
|
||||
nir_cf_delete(&list);
|
||||
}
|
||||
|
||||
/** inserts undef phi sources from predcessor into phis of the block */
|
||||
void nir_insert_phi_undef(nir_block *block, nir_block *pred);
|
||||
|
||||
|
||||
@@ -68,18 +68,6 @@
|
||||
* cf_node (see dead_cf_list()) so this is a convenient place to remove them.
|
||||
*/
|
||||
|
||||
static void
|
||||
remove_after_cf_node(nir_cf_node *node)
|
||||
{
|
||||
nir_cf_node *end = node;
|
||||
while (!nir_cf_node_is_last(end))
|
||||
end = nir_cf_node_next(end);
|
||||
|
||||
nir_cf_list list;
|
||||
nir_cf_extract(&list, nir_after_cf_node(node), nir_after_cf_node(end));
|
||||
nir_cf_delete(&list);
|
||||
}
|
||||
|
||||
static void
|
||||
opt_constant_if(nir_if *if_stmt, bool condition)
|
||||
{
|
||||
@@ -93,7 +81,7 @@ opt_constant_if(nir_if *if_stmt, bool condition)
|
||||
*/
|
||||
|
||||
if (nir_block_ends_in_jump(last_block)) {
|
||||
remove_after_cf_node(&if_stmt->cf_node);
|
||||
nir_remove_after_cf_node(&if_stmt->cf_node);
|
||||
} else {
|
||||
/* Remove any phi nodes after the if by rewriting uses to point to the
|
||||
* correct source.
|
||||
@@ -276,7 +264,7 @@ dead_cf_block(nir_block *block)
|
||||
/* opt_constant_if() doesn't handle this case. */
|
||||
if (nir_block_ends_in_jump(block) &&
|
||||
!exec_node_is_tail_sentinel(block->cf_node.node.next)) {
|
||||
remove_after_cf_node(&block->cf_node);
|
||||
nir_remove_after_cf_node(&block->cf_node);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -358,7 +346,7 @@ dead_cf_list(struct exec_list *list, bool *list_ends_in_jump)
|
||||
nir_block *next = nir_cf_node_as_block(nir_cf_node_next(cur));
|
||||
if (!exec_list_is_empty(&next->instr_list) ||
|
||||
!exec_node_is_tail_sentinel(next->cf_node.node.next)) {
|
||||
remove_after_cf_node(cur);
|
||||
nir_remove_after_cf_node(cur);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -376,7 +364,7 @@ dead_cf_list(struct exec_list *list, bool *list_ends_in_jump)
|
||||
if (next->predecessors->entries == 0 &&
|
||||
(!exec_list_is_empty(&next->instr_list) ||
|
||||
!exec_node_is_tail_sentinel(next->cf_node.node.next))) {
|
||||
remove_after_cf_node(cur);
|
||||
nir_remove_after_cf_node(cur);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user