[PATCH] Fix PR54650
Richard Guenther
richard.guenther@gmail.com
Mon Sep 24 12:53:00 GMT 2012
On Sat, Sep 22, 2012 at 4:08 AM, Dehao Chen <dehao@google.com> wrote:
> Hi,
>
> The problem is due to a bug when move_block_to_fn. edge->goto_block
> should be updated even when its locus is unknown. This patch also
> fixes the way to reset block for expr.
I think the machinery is much more fragile (which is probably why
when in SSA form the whole thing is invoked with a NULL_TREE BLOCK).
>From looking at how the block tree is mangled:
/* Rewire BLOCK_SUBBLOCKS of orig_block. */
if (orig_block)
{
tree block;
gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
== NULL_TREE);
BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
= BLOCK_SUBBLOCKS (orig_block);
for (block = BLOCK_SUBBLOCKS (orig_block);
block; block = BLOCK_CHAIN (block))
BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
}
I think we want a simpler version of your fix:
> Bootstrapped and pass all gcc regression tests.
>
> Is it okay for trunk?
>
> Thanks,
> Dehao
>
> gcc/ChangeLog:
> tree-cfg.c (move_stmt_op): Reset the expr block only
> when necessary.
> (move_block_to_fn): Reset the edge's goto block even
> when the goto locus is unknown.
>
> Index: tree-cfg.c
> ===================================================================
> --- tree-cfg.c (revision 191614)
> +++ tree-cfg.c (working copy)
> @@ -6013,7 +6013,9 @@ move_stmt_op (tree *tp, int *walk_subtrees, void *
>
> if (EXPR_P (t))
> {
> - if (TREE_BLOCK (t))
> + if (p->orig_block == NULL_TREE
> + || TREE_BLOCK (t) == p->orig_block
> + || TREE_BLOCK (t) == NULL_TREE)
> TREE_SET_BLOCK (t, p->new_block);
Only replace TREE_BLOCK of t if it was equal to p->orig_block or if
p->orig_block is NULL_TREE _and_ TREE_BLOCK of t is not NULL_TREE.
> }
> else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
> @@ -6315,7 +6317,7 @@ move_block_to_fn (struct function *dest_cfun, basi
> }
>
> FOR_EACH_EDGE (e, ei, bb->succs)
> - if (!IS_UNKNOWN_LOCATION (e->goto_locus))
> + if (e->goto_locus)
Please compare against UNKNOWN_LOCATION (which is zero, right)?
Ok with that changes.
Thanks,
Richard.
> {
> tree block = LOCATION_BLOCK (e->goto_locus);
> if (d->orig_block == NULL_TREE
More information about the Gcc-patches
mailing list