diff options
author | Richard Guenther <rguenther@suse.de> | 2009-04-16 10:45:18 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-04-16 10:45:18 +0000 |
commit | 54634841e755bf81e1c01d6ad9d4284d2b774709 (patch) | |
tree | aea1f631377fbafc1c53cc58287483dc76e4a8b5 /gcc/tree-cfg.c | |
parent | 540b5d9ce19915edcf491f6cebeec0a5c5571ac7 (diff) | |
download | gcc-54634841e755bf81e1c01d6ad9d4284d2b774709.zip gcc-54634841e755bf81e1c01d6ad9d4284d2b774709.tar.gz gcc-54634841e755bf81e1c01d6ad9d4284d2b774709.tar.bz2 |
re PR middle-end/39625 (Revision 145338 breaks ability to build Ada)
2009-04-16 Richard Guenther <rguenther@suse.de>
PR middle-end/39625
* tree-cfg.c (make_blocks): Split statements with to-be
abnormal SSA names on the lhs.
From-SVN: r146168
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 6c5eb87..447e6cf 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; |