nir/cf: reimplement nir_cf_node_remove() using the new API

This gives us some testing of it. Also, the old nir_cf_node_remove()
wasn't handling phi nodes correctly and was calling cleanup_cf_node()
too late.

Signed-off-by: Connor Abbott <connor.w.abbott@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Connor Abbott
2015-07-21 19:54:35 -07:00
committed by Kenneth Graunke
parent fc7f2d2364
commit d7971b41ce
2 changed files with 9 additions and 33 deletions
-31
View File
@@ -708,37 +708,6 @@ cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl)
}
}
void
nir_cf_node_remove(nir_cf_node *node)
{
nir_function_impl *impl = nir_cf_node_get_function(node);
nir_metadata_preserve(impl, nir_metadata_none);
if (node->type == nir_cf_node_block) {
/*
* Basic blocks can't really be removed by themselves, since they act as
* padding between the non-basic blocks. So all we do here is empty the
* block of instructions.
*
* TODO: could we assert here?
*/
exec_list_make_empty(&nir_cf_node_as_block(node)->instr_list);
} else {
nir_cf_node *before = nir_cf_node_prev(node);
assert(before->type == nir_cf_node_block);
nir_block *before_block = nir_cf_node_as_block(before);
nir_cf_node *after = nir_cf_node_next(node);
assert(after->type == nir_cf_node_block);
nir_block *after_block = nir_cf_node_as_block(after);
exec_node_remove(&node->node);
stitch_blocks(before_block, after_block);
}
cleanup_cf_node(node, impl);
}
void
nir_cf_extract(nir_cf_list *extracted, nir_cursor begin, nir_cursor end)
{
+9 -2
View File
@@ -167,8 +167,6 @@ nir_cf_node_insert_end(struct exec_list *list, nir_cf_node *node)
nir_cf_node_insert(nir_after_cf_list(list), node);
}
/** removes a control flow node, doing any cleanup necessary */
void nir_cf_node_remove(nir_cf_node *node);
/** Control flow motion.
*
@@ -239,6 +237,15 @@ nir_cf_list_extract(nir_cf_list *extracted, struct exec_list *cf_list)
nir_after_cf_list(cf_list));
}
/** removes a control flow node, doing any cleanup necessary */
static inline void
nir_cf_node_remove(nir_cf_node *node)
{
nir_cf_list list;
nir_cf_extract(&list, nir_before_cf_node(node), nir_after_cf_node(node));
nir_cf_delete(&list);
}
#ifdef __cplusplus
}
#endif