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