diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2001-12-04 10:30:04 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2001-12-04 10:30:04 +0000 |
commit | d1bd43d95082914bdc5e6f782ed0a919ff4305e2 (patch) | |
tree | 764fcb1b30f9b79f8a0f0dc4fa3f07a61527c096 /gcc | |
parent | 1b3ea405b0f468e456251a24fede3012be58b3ff (diff) | |
download | gcc-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/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/c-common.c | 2 | ||||
-rw-r--r-- | gcc/expr.c | 4 | ||||
-rw-r--r-- | gcc/stmt.c | 18 | ||||
-rw-r--r-- | gcc/tree.h | 2 |
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); @@ -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; @@ -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; } @@ -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)); |