aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2004-06-02 23:13:55 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2004-06-02 21:13:55 +0000
commitce068299f5f38bc06a50f08f751fc4c23288f36f (patch)
treef0824776b9bc1f6d3abf7f05e0e3cb8bf1fef7e7
parent415c974c0bd00f130e7795c3342bad4e3f014c6e (diff)
downloadgcc-ce068299f5f38bc06a50f08f751fc4c23288f36f.zip
gcc-ce068299f5f38bc06a50f08f751fc4c23288f36f.tar.gz
gcc-ce068299f5f38bc06a50f08f751fc4c23288f36f.tar.bz2
tree-cfg.c (tree_find_edge_insert_loc): Allow inserting before return_stmt.
* tree-cfg.c (tree_find_edge_insert_loc): Allow inserting before return_stmt. From-SVN: r82586
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-cfg.c16
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd63a97..b851e51 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-06-02 Jan Hubicka <jh@suse.cz>
+
+ * tree-cfg.c (tree_find_edge_insert_loc): Allow inserting before
+ return_stmt.
+
2004-06-02 Jason Merrill <jason@redhat.com>
* Makefile.in (TAGS): Don't mess with c-parse.[ch].
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index e53d71c..21277d8 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -2931,6 +2931,22 @@ tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi)
tmp = bsi_stmt (*bsi);
if (!stmt_ends_bb_p (tmp))
return true;
+
+ /* Insert code just before returning the value. We may need to decompose
+ the return in the case it contains non-trivial operand. */
+ if (TREE_CODE (tmp) == RETURN_EXPR)
+ {
+ tree op = TREE_OPERAND (tmp, 0);
+ if (!is_gimple_val (op))
+ {
+ if (TREE_CODE (op) != MODIFY_EXPR)
+ abort ();
+ bsi_insert_before (bsi, op, BSI_NEW_STMT);
+ TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
+ }
+ bsi_prev (bsi);
+ return true;
+ }
}
/* Otherwise, create a new basic block, and split this edge. */