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.

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);
     }
   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)
       {
        tree block = LOCATION_BLOCK (e->goto_locus);
        if (d->orig_block == NULL_TREE

Reply via email to