Commit d1bd43d9 by Alexandre Oliva Committed by Alexandre Oliva

stmt.c (expand_expr_stmt): Keep last_expr_value non-NULL iff we're interested in the result.

* stmt.c (expand_expr_stmt): Keep last_expr_value non-NULL iff
we're interested in the result.  Use it to tell whether to
ignore results of enclosed expressions.
(expand_start_stmt_expr): Added new argument, and initialize
last_expr_value accordingly.
* tree.h (expand_start_stmt_expr): Adjusted declaration.
* c-common.c (c_expand_expr): Adjust call.
* expr.c (expand_expr) [EXPR_WFL]: Pass const0_rtx down if
ignoring the result.

From-SVN: r47607
parent 1b3ea405
2001-12-04 Alexandre Oliva <aoliva@redhat.com>
* stmt.c (expand_expr_stmt): Keep last_expr_value non-NULL iff
we're interested in the result. Use it to tell whether to
ignore results of enclosed expressions.
(expand_start_stmt_expr): Added new argument, and initialize
last_expr_value accordingly.
* tree.h (expand_start_stmt_expr): Adjusted declaration.
* c-common.c (c_expand_expr): Adjust call.
* expr.c (expand_expr) [EXPR_WFL]: Pass const0_rtx down if
ignoring the result.
2001-12-04 Jakub Jelinek <jakub@redhat.com> 2001-12-04 Jakub Jelinek <jakub@redhat.com>
* flow.c (ior_reg_cond): Return NULL if ! add and rtx wasn't optimized. * flow.c (ior_reg_cond): Return NULL if ! add and rtx wasn't optimized.
......
...@@ -3409,7 +3409,7 @@ c_expand_expr (exp, target, tmode, modifier) ...@@ -3409,7 +3409,7 @@ c_expand_expr (exp, target, tmode, modifier)
out-of-scope after the first EXPR_STMT from within the out-of-scope after the first EXPR_STMT from within the
STMT_EXPR. */ STMT_EXPR. */
push_temp_slots (); push_temp_slots ();
rtl_expr = expand_start_stmt_expr (); rtl_expr = expand_start_stmt_expr (target != const0_rtx);
expand_stmt (STMT_EXPR_STMT (exp)); expand_stmt (STMT_EXPR_STMT (exp));
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);
......
...@@ -6528,7 +6528,9 @@ expand_expr (exp, target, tmode, modifier) ...@@ -6528,7 +6528,9 @@ expand_expr (exp, target, tmode, modifier)
if (EXPR_WFL_EMIT_LINE_NOTE (exp)) if (EXPR_WFL_EMIT_LINE_NOTE (exp))
emit_line_note (input_filename, lineno); emit_line_note (input_filename, lineno);
/* Possibly avoid switching back and forth here. */ /* Possibly avoid switching back and forth here. */
to_return = expand_expr (EXPR_WFL_NODE (exp), target, tmode, modifier); to_return = expand_expr (EXPR_WFL_NODE (exp),
target || ! ignore ? target : const0_rtx,
tmode, modifier);
input_filename = saved_input_filename; input_filename = saved_input_filename;
lineno = saved_lineno; lineno = saved_lineno;
return to_return; return to_return;
......
...@@ -2149,6 +2149,8 @@ void ...@@ -2149,6 +2149,8 @@ void
expand_expr_stmt (exp) expand_expr_stmt (exp)
tree exp; tree exp;
{ {
bool want_value = last_expr_value != NULL_RTX;
/* If -W, warn about statements with no side effects, /* If -W, warn about statements with no side effects,
except for an explicit cast to void (e.g. for assert()), and except for an explicit cast to void (e.g. for assert()), and
except inside a ({...}) where they may be useful. */ except inside a ({...}) where they may be useful. */
...@@ -2175,7 +2177,7 @@ expand_expr_stmt (exp) ...@@ -2175,7 +2177,7 @@ expand_expr_stmt (exp)
last_expr_value to get reset. Therefore, we set last_expr_value last_expr_value to get reset. Therefore, we set last_expr_value
and last_expr_type *after* calling expand_expr. */ and last_expr_type *after* calling expand_expr. */
last_expr_value = expand_expr (exp, last_expr_value = expand_expr (exp,
(expr_stmts_for_value (want_value && expr_stmts_for_value
? NULL_RTX : const0_rtx), ? NULL_RTX : const0_rtx),
VOIDmode, 0); VOIDmode, 0);
last_expr_type = TREE_TYPE (exp); last_expr_type = TREE_TYPE (exp);
...@@ -2188,7 +2190,7 @@ expand_expr_stmt (exp) ...@@ -2188,7 +2190,7 @@ expand_expr_stmt (exp)
if (TYPE_MODE (TREE_TYPE (exp)) == VOIDmode) if (TYPE_MODE (TREE_TYPE (exp)) == VOIDmode)
; ;
else if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode) else if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode)
copy_to_reg (last_expr_value); last_expr_value = copy_to_reg (last_expr_value);
else else
{ {
rtx lab = gen_label_rtx (); rtx lab = gen_label_rtx ();
...@@ -2211,6 +2213,14 @@ expand_expr_stmt (exp) ...@@ -2211,6 +2213,14 @@ expand_expr_stmt (exp)
above. */ above. */
free_temp_slots (); free_temp_slots ();
if (! want_value && last_expr_value)
{
protect_from_queue (last_expr_value, 0);
last_expr_value = NULL_RTX;
}
else if (want_value && ! last_expr_value)
last_expr_value = const0_rtx;
emit_queue (); emit_queue ();
} }
...@@ -2336,7 +2346,8 @@ clear_last_expr () ...@@ -2336,7 +2346,8 @@ clear_last_expr ()
The caller must save that value and pass it to expand_end_stmt_expr. */ The caller must save that value and pass it to expand_end_stmt_expr. */
tree tree
expand_start_stmt_expr () expand_start_stmt_expr (want_value)
int want_value;
{ {
tree t; tree t;
...@@ -2347,6 +2358,7 @@ expand_start_stmt_expr () ...@@ -2347,6 +2358,7 @@ expand_start_stmt_expr ()
start_sequence_for_rtl_expr (t); start_sequence_for_rtl_expr (t);
NO_DEFER_POP; NO_DEFER_POP;
expr_stmts_for_value++; expr_stmts_for_value++;
last_expr_value = want_value ? const0_rtx : NULL_RTX;
return t; return t;
} }
......
...@@ -2706,7 +2706,7 @@ extern int type_num_arguments PARAMS ((tree)); ...@@ -2706,7 +2706,7 @@ extern int type_num_arguments PARAMS ((tree));
extern int in_control_zone_p PARAMS ((void)); extern int in_control_zone_p PARAMS ((void));
extern void expand_fixups PARAMS ((rtx)); extern void expand_fixups PARAMS ((rtx));
extern tree expand_start_stmt_expr PARAMS ((void)); extern tree expand_start_stmt_expr PARAMS ((int));
extern tree expand_end_stmt_expr PARAMS ((tree)); extern tree expand_end_stmt_expr PARAMS ((tree));
extern void expand_expr_stmt PARAMS ((tree)); extern void expand_expr_stmt PARAMS ((tree));
extern int warn_if_unused_value PARAMS ((tree)); extern int warn_if_unused_value PARAMS ((tree));
......
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