diff options
author | Jason Merrill <jason@redhat.com> | 2005-06-23 10:44:21 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2005-06-23 10:44:21 -0400 |
commit | fa47911c5600725d7d72e224e4a61829267b00b9 (patch) | |
tree | 672b804a497a6d4d52b747f00969c6d7b30ebbfb /gcc/tree-inline.c | |
parent | f565b0a1a58554b7dd3cbd540f6dca295bd0cdbe (diff) | |
download | gcc-fa47911c5600725d7d72e224e4a61829267b00b9.zip gcc-fa47911c5600725d7d72e224e4a61829267b00b9.tar.gz gcc-fa47911c5600725d7d72e224e4a61829267b00b9.tar.bz2 |
re PR c++/19317 (removing a temporary return value when we cannot)
PR c++/19317
Leave the return slot target in the MODIFY_EXPR rather than making
it an argument, but only use it if the CALL_EXPR has a flag set.
* tree.h (CALL_EXPR_HAS_RETURN_SLOT_ADDR): Rename to
CALL_EXPR_RETURN_SLOT_OPT.
* calls.c (expand_call): Adjust.
* tree-inline.c (expand_call_inline): Adjust.
* tree-pretty-print.c (dump_generic_node): Adjust.
And set the flag as appropriate.
* gimplify.c (gimplify_modify_expr_rhs): Set
CALL_EXPR_HAS_RETURN_SLOT_ADDR where the LHS is obviously safe.
* tree-nrv.c (execute_return_slot_opt): Set
CALL_EXPR_HAS_RETURN_SLOT_ADDR based on escape analysis.
* tree-pass.h: Declare pass_return_slot.
* tree-optimize.c (init_tree_optimization_passes): Add it.
* cp/semantics.c (simplify_aggr_init_expr): Use
CALL_EXPR_RETURN_SLOT_OPT, not CALL_EXPR_HAS_RETURN_SLOT_ADDR.
From-SVN: r101269
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index c670c57..8f9e278 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -2026,13 +2026,6 @@ expand_call_inline (basic_block bb, tree stmt, tree *tp, void *data) /* Initialize the parameters. */ args = TREE_OPERAND (t, 1); - if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (t)) - { - return_slot_addr = TREE_VALUE (args); - args = TREE_CHAIN (args); - } - else - return_slot_addr = NULL_TREE; initialize_inlined_parameters (id, args, TREE_OPERAND (t, 2), fn, bb); @@ -2046,10 +2039,10 @@ expand_call_inline (basic_block bb, tree stmt, tree *tp, void *data) gcc_assert (TREE_CODE (DECL_INITIAL (fn)) == BLOCK); /* Find the lhs to which the result of this call is assigned. */ - modify_dest = stmt; - if (TREE_CODE (modify_dest) == MODIFY_EXPR) + return_slot_addr = NULL; + if (TREE_CODE (stmt) == MODIFY_EXPR) { - modify_dest = TREE_OPERAND (modify_dest, 0); + modify_dest = TREE_OPERAND (stmt, 0); /* The function which we are inlining might not return a value, in which case we should issue a warning that the function @@ -2059,6 +2052,11 @@ expand_call_inline (basic_block bb, tree stmt, tree *tp, void *data) uninitialized variable. */ if (DECL_P (modify_dest)) TREE_NO_WARNING (modify_dest) = 1; + if (CALL_EXPR_RETURN_SLOT_OPT (t)) + { + return_slot_addr = build_fold_addr_expr (modify_dest); + modify_dest = NULL; + } } else modify_dest = NULL; |