From: Richard Guenther Date: Thu, 16 Apr 2009 10:45:18 +0000 (+0000) Subject: re PR middle-end/39625 (Revision 145338 breaks ability to build Ada) X-Git-Tag: releases/gcc-4.5.0~6552 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=54634841e755bf81e1c01d6ad9d4284d2b774709;p=thirdparty%2Fgcc.git re PR middle-end/39625 (Revision 145338 breaks ability to build Ada) 2009-04-16 Richard Guenther PR middle-end/39625 * tree-cfg.c (make_blocks): Split statements with to-be abnormal SSA names on the lhs. From-SVN: r146168 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 66374e5926cf..f04bbcff5fc4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-04-16 Richard Guenther + + PR middle-end/39625 + * tree-cfg.c (make_blocks): Split statements with to-be + abnormal SSA names on the lhs. + 2009-04-16 Paolo Bonzini * c-common.c (vector_targets_convertible_p, vector_types_convertible_p): diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 6c5eb87d6444..447e6cf0a090 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -375,7 +375,29 @@ make_blocks (gimple_seq seq) /* If STMT is a basic block terminator, set START_NEW_BLOCK for the next iteration. */ if (stmt_ends_bb_p (stmt)) - start_new_block = true; + { + /* If the stmt can make abnormal goto use a new temporary + for the assignment to the LHS. This makes sure the old value + of the LHS is available on the abnormal edge. Otherwise + we will end up with overlapping life-ranges for abnormal + SSA names. */ + if (gimple_has_lhs (stmt) + && stmt_can_make_abnormal_goto (stmt) + && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt)))) + { + tree lhs = gimple_get_lhs (stmt); + tree tmp = create_tmp_var (TREE_TYPE (lhs), NULL); + gimple s = gimple_build_assign (lhs, tmp); + gimple_set_location (s, gimple_location (stmt)); + gimple_set_block (s, gimple_block (stmt)); + gimple_set_lhs (stmt, tmp); + if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE + || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE) + DECL_GIMPLE_REG_P (tmp) = 1; + gsi_insert_after (&i, s, GSI_SAME_STMT); + } + start_new_block = true; + } gsi_next (&i); first_stmt_of_seq = false;