Commit f1a044c7 by Jason Merrill Committed by Jason Merrill

c-common.c (c_expand_expr): If the last expression is a VAR_DECL with RTL that…

c-common.c (c_expand_expr): If the last expression is a VAR_DECL with RTL that matches the target...

        * c-common.c (c_expand_expr) [STMT_EXPR]: If the last expression is
        a VAR_DECL with RTL that matches the target, just return that RTL.

From-SVN: r56083
parent 1e14c7f0
2002-08-06 Jason Merrill <jason@redhat.com>
* c-common.c (c_expand_expr) [STMT_EXPR]: If the last expression is
a VAR_DECL with RTL that matches the target, just return that RTL.
2002-08-06 Dale Johannesen <dalej@apple.com> 2002-08-06 Dale Johannesen <dalej@apple.com>
* c-common.c (fname_decl): Use line number 0 for * c-common.c (fname_decl): Use line number 0 for
__func__, to avoid confusing debuggers. __func__, to avoid confusing debuggers.
......
...@@ -4185,6 +4185,7 @@ c_expand_expr (exp, target, tmode, modifier) ...@@ -4185,6 +4185,7 @@ c_expand_expr (exp, target, tmode, modifier)
tree rtl_expr; tree rtl_expr;
rtx result; rtx result;
bool preserve_result = false; bool preserve_result = false;
bool return_target = false;
/* Since expand_expr_stmt calls free_temp_slots after every /* Since expand_expr_stmt calls free_temp_slots after every
expression statement, we must call push_temp_slots here. expression statement, we must call push_temp_slots here.
...@@ -4212,8 +4213,20 @@ c_expand_expr (exp, target, tmode, modifier) ...@@ -4212,8 +4213,20 @@ c_expand_expr (exp, target, tmode, modifier)
if (TREE_CODE (last) == SCOPE_STMT if (TREE_CODE (last) == SCOPE_STMT
&& TREE_CODE (expr) == EXPR_STMT) && TREE_CODE (expr) == EXPR_STMT)
{ {
TREE_ADDRESSABLE (expr) = 1; if (target && TREE_CODE (EXPR_STMT_EXPR (expr)) == VAR_DECL
preserve_result = true; && DECL_RTL_IF_SET (EXPR_STMT_EXPR (expr)) == target)
/* If the last expression is a variable whose RTL is the
same as our target, just return the target; if it
isn't valid expanding the decl would produce different
RTL, and store_expr would try to do a copy. */
return_target = true;
else
{
/* Otherwise, note that we want the value from the last
expression. */
TREE_ADDRESSABLE (expr) = 1;
preserve_result = true;
}
} }
} }
...@@ -4221,7 +4234,9 @@ c_expand_expr (exp, target, tmode, modifier) ...@@ -4221,7 +4234,9 @@ c_expand_expr (exp, target, tmode, modifier)
expand_end_stmt_expr (rtl_expr); expand_end_stmt_expr (rtl_expr);
result = expand_expr (rtl_expr, target, tmode, modifier); result = expand_expr (rtl_expr, target, tmode, modifier);
if (preserve_result && GET_CODE (result) == MEM) if (return_target)
result = target;
else if (preserve_result && GET_CODE (result) == MEM)
{ {
if (GET_MODE (result) != BLKmode) if (GET_MODE (result) != BLKmode)
result = copy_to_reg (result); result = copy_to_reg (result);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment