We also allow unlinking of jumps to be skipped, this will be useful for removing loops once they have been unrolled. --- src/compiler/nir/nir_control_flow.c | 23 ++++++++++++++--------- src/compiler/nir/nir_control_flow.h | 4 ++++ 2 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/src/compiler/nir/nir_control_flow.c b/src/compiler/nir/nir_control_flow.c index ed8cd24..0429abd 100644 --- a/src/compiler/nir/nir_control_flow.c +++ b/src/compiler/nir/nir_control_flow.c @@ -698,8 +698,9 @@ replace_ssa_def_uses(nir_ssa_def *def, void *void_impl) return true; } -static void -cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl) +void +nir_cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl, + bool unlink_jumps) { switch (node->type) { case nir_cf_node_block: { @@ -707,8 +708,12 @@ cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl) /* We need to walk the instructions and clean up defs/uses */ nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_jump) { - nir_jump_type jump_type = nir_instr_as_jump(instr)->type; - unlink_jump(block, jump_type, false); + if (unlink_jumps) { + nir_jump_type jump_type = nir_instr_as_jump(instr)->type; + unlink_jump(block, jump_type, false); + } else { + exec_node_remove(&instr->node); + } } else { nir_foreach_ssa_def(instr, replace_ssa_def_uses, impl); nir_instr_remove(instr); @@ -720,9 +725,9 @@ cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl) case nir_cf_node_if: { nir_if *if_stmt = nir_cf_node_as_if(node); foreach_list_typed(nir_cf_node, child, node, &if_stmt->then_list) - cleanup_cf_node(child, impl); + nir_cleanup_cf_node(child, impl, unlink_jumps); foreach_list_typed(nir_cf_node, child, node, &if_stmt->else_list) - cleanup_cf_node(child, impl); + nir_cleanup_cf_node(child, impl, unlink_jumps); list_del(&if_stmt->condition.use_link); break; @@ -731,13 +736,13 @@ cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl) case nir_cf_node_loop: { nir_loop *loop = nir_cf_node_as_loop(node); foreach_list_typed(nir_cf_node, child, node, &loop->body) - cleanup_cf_node(child, impl); + nir_cleanup_cf_node(child, impl, unlink_jumps); break; } case nir_cf_node_function: { nir_function_impl *impl = nir_cf_node_as_function(node); foreach_list_typed(nir_cf_node, child, node, &impl->body) - cleanup_cf_node(child, impl); + nir_cleanup_cf_node(child, impl, unlink_jumps); break; } default: @@ -847,6 +852,6 @@ void nir_cf_delete(nir_cf_list *cf_list) { foreach_list_typed(nir_cf_node, node, node, &cf_list->list) { - cleanup_cf_node(node, cf_list->impl); + nir_cleanup_cf_node(node, cf_list->impl, true); } } diff --git a/src/compiler/nir/nir_control_flow.h b/src/compiler/nir/nir_control_flow.h index 0d97486..a7d0b81 100644 --- a/src/compiler/nir/nir_control_flow.h +++ b/src/compiler/nir/nir_control_flow.h @@ -138,6 +138,10 @@ typedef struct { nir_function_impl *impl; /* for cleaning up if the list is deleted */ } nir_cf_list; +void +nir_cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl, + bool unlink_jumps); + void nir_cf_extract(nir_cf_list *extracted, nir_cursor begin, nir_cursor end); void nir_cf_reinsert(nir_cf_list *cf_list, nir_cursor cursor); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev