aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2001-12-04 10:30:04 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2001-12-04 10:30:04 +0000
commitd1bd43d95082914bdc5e6f782ed0a919ff4305e2 (patch)
tree764fcb1b30f9b79f8a0f0dc4fa3f07a61527c096 /gcc
parent1b3ea405b0f468e456251a24fede3012be58b3ff (diff)
downloadgcc-d1bd43d95082914bdc5e6f782ed0a919ff4305e2.zip
gcc-d1bd43d95082914bdc5e6f782ed0a919ff4305e2.tar.gz
gcc-d1bd43d95082914bdc5e6f782ed0a919ff4305e2.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/c-common.c2
-rw-r--r--gcc/expr.c4
-rw-r--r--gcc/stmt.c18
-rw-r--r--gcc/tree.h2
5 files changed, 32 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fff9d98..a278714 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+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>
* flow.c (ior_reg_cond): Return NULL if ! add and rtx wasn't optimized.
diff --git a/gcc/c-common.c b/gcc/c-common.c
index a7d005b..41aaeb6 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -3409,7 +3409,7 @@ c_expand_expr (exp, target, tmode, modifier)
out-of-scope after the first EXPR_STMT from within the
STMT_EXPR. */
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_end_stmt_expr (rtl_expr);
result = expand_expr (rtl_expr, target, tmode, modifier);
diff --git a/gcc/expr.c b/gcc/expr.c
index 659ff03..1a4681e 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6528,7 +6528,9 @@ expand_expr (exp, target, tmode, modifier)
if (EXPR_WFL_EMIT_LINE_NOTE (exp))
emit_line_note (input_filename, lineno);
/* 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;
lineno = saved_lineno;
return to_return;
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 2b176bb..bfac270 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -2149,6 +2149,8 @@ void
expand_expr_stmt (exp)
tree exp;
{
+ bool want_value = last_expr_value != NULL_RTX;
+
/* If -W, warn about statements with no side effects,
except for an explicit cast to void (e.g. for assert()), and
except inside a ({...}) where they may be useful. */
@@ -2175,7 +2177,7 @@ expand_expr_stmt (exp)
last_expr_value to get reset. Therefore, we set last_expr_value
and last_expr_type *after* calling expand_expr. */
last_expr_value = expand_expr (exp,
- (expr_stmts_for_value
+ (want_value && expr_stmts_for_value
? NULL_RTX : const0_rtx),
VOIDmode, 0);
last_expr_type = TREE_TYPE (exp);
@@ -2188,7 +2190,7 @@ expand_expr_stmt (exp)
if (TYPE_MODE (TREE_TYPE (exp)) == VOIDmode)
;
else if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode)
- copy_to_reg (last_expr_value);
+ last_expr_value = copy_to_reg (last_expr_value);
else
{
rtx lab = gen_label_rtx ();
@@ -2211,6 +2213,14 @@ expand_expr_stmt (exp)
above. */
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 ();
}
@@ -2336,7 +2346,8 @@ clear_last_expr ()
The caller must save that value and pass it to expand_end_stmt_expr. */
tree
-expand_start_stmt_expr ()
+expand_start_stmt_expr (want_value)
+ int want_value;
{
tree t;
@@ -2347,6 +2358,7 @@ expand_start_stmt_expr ()
start_sequence_for_rtl_expr (t);
NO_DEFER_POP;
expr_stmts_for_value++;
+ last_expr_value = want_value ? const0_rtx : NULL_RTX;
return t;
}
diff --git a/gcc/tree.h b/gcc/tree.h
index 859a564..9492b01 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2706,7 +2706,7 @@ extern int type_num_arguments PARAMS ((tree));
extern int in_control_zone_p PARAMS ((void));
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 void expand_expr_stmt PARAMS ((tree));
extern int warn_if_unused_value PARAMS ((tree));