[Mesa-dev] [PATCH 04/11] nir/cf: Conditionally do block_add_normal_succs() in unlink_jump();
Jason Ekstrand
jason at jlekstrand.net
Wed Sep 23 10:45:43 PDT 2015
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
On Tue, Sep 22, 2015 at 8:01 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> There is a bug where we mess up predecessors/successors due to the
> ordering of unlinking/recreating edges/adding fake edges. In order to
> fix that, I need everything in one routine.
>
> However, calling block_add_normal_succs() isn't safe from
> cleanup_cf_node() - it would crash trying to insert phi undefs.
> So unfortunately I need to add a parameter.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/glsl/nir/nir_control_flow.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> New patch!
>
> diff --git a/src/glsl/nir/nir_control_flow.c b/src/glsl/nir/nir_control_flow.c
> index e2a151d..2b23f38 100644
> --- a/src/glsl/nir/nir_control_flow.c
> +++ b/src/glsl/nir/nir_control_flow.c
> @@ -548,8 +548,8 @@ remove_phi_src(nir_block *block, nir_block *pred)
> * infinite loops. Note that the jump to be eliminated may be free-floating.
> */
>
> -static
> -void unlink_jump(nir_block *block, nir_jump_type type)
> +static void
> +unlink_jump(nir_block *block, nir_jump_type type, bool add_normal_successors)
> {
> if (block->successors[0])
> remove_phi_src(block->successors[0], block);
> @@ -574,14 +574,14 @@ void unlink_jump(nir_block *block, nir_jump_type type)
> }
>
> unlink_block_successors(block);
> + if (add_normal_successors)
> + block_add_normal_succs(block);
> }
>
> void
> nir_handle_remove_jump(nir_block *block, nir_jump_type type)
> {
> - unlink_jump(block, type);
> -
> - block_add_normal_succs(block);
> + unlink_jump(block, type, true);
>
> nir_function_impl *impl = nir_cf_node_get_function(&block->cf_node);
> nir_metadata_preserve(impl, nir_metadata_none);
> @@ -689,7 +689,7 @@ cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl)
> nir_foreach_instr_safe(block, instr) {
> if (instr->type == nir_instr_type_jump) {
> nir_jump_type jump_type = nir_instr_as_jump(instr)->type;
> - unlink_jump(block, jump_type);
> + unlink_jump(block, jump_type, false);
> } else {
> nir_foreach_ssa_def(instr, replace_ssa_def_uses, impl);
> nir_instr_remove(instr);
> --
> 2.5.3
>
More information about the mesa-dev
mailing list