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
This commit is contained in:
Jason Merrill 2002-08-06 20:52:24 -04:00 committed by Jason Merrill
parent 1e14c7f083
commit f1a044c7da
2 changed files with 23 additions and 3 deletions

View File

@ -1,3 +1,8 @@
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>
* c-common.c (fname_decl): Use line number 0 for
__func__, to avoid confusing debuggers.

View File

@ -4185,6 +4185,7 @@ c_expand_expr (exp, target, tmode, modifier)
tree rtl_expr;
rtx result;
bool preserve_result = false;
bool return_target = false;
/* Since expand_expr_stmt calls free_temp_slots after every
expression statement, we must call push_temp_slots here.
@ -4212,8 +4213,20 @@ c_expand_expr (exp, target, tmode, modifier)
if (TREE_CODE (last) == SCOPE_STMT
&& TREE_CODE (expr) == EXPR_STMT)
{
TREE_ADDRESSABLE (expr) = 1;
preserve_result = true;
if (target && TREE_CODE (EXPR_STMT_EXPR (expr)) == VAR_DECL
&& 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)
expand_end_stmt_expr (rtl_expr);
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)
result = copy_to_reg (result);