diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-06-02 21:13:55 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-06-02 21:13:55 +0000 |
commit | 3c47257f1db851e014efa174a030e2070fe104cf (patch) | |
tree | f0824776b9bc1f6d3abf7f05e0e3cb8bf1fef7e7 /gcc/tree-cfg.c | |
parent | e4959831a5291ada12e9e9c4c10943f0d3b2ef5c (diff) | |
download | gcc-3c47257f1db851e014efa174a030e2070fe104cf.tar.gz |
* tree-cfg.c (tree_find_edge_insert_loc): Allow inserting before
return_stmt.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82586 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index e53d71c2aaf..21277d86bf2 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. */ |