aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2003-09-28 04:56:35 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2003-09-28 04:56:35 +0000
commitc67e6e1492b2e8cedf8a95731ee788dc919984be (patch)
tree59d5e4829907404d9cd123482f4ad1565deac1eb /gcc/expr.c
parentedaf3e0357bbc16c01ff9f341016a1e6969a617d (diff)
downloadgcc-c67e6e1492b2e8cedf8a95731ee788dc919984be.zip
gcc-c67e6e1492b2e8cedf8a95731ee788dc919984be.tar.gz
gcc-c67e6e1492b2e8cedf8a95731ee788dc919984be.tar.bz2
toplev.c (flag_evaluation_order): New global variable.
* toplev.c (flag_evaluation_order): New global variable. * flags.h (flag_evaluation_order): Prototype here. * expr.c (expand_operands): If we need to preserve observable evaluation order, protect exp1 from clobbering exp0's result. * java/lang.c (java_init_options): Set flag_evaluation_order. * java/expr.c (force_evaluation_order): Don't attempt to force evaluation order of binary operations using save_expr. * java/parse.y (java_complete_lhs): No longer need to call force_evaluation_order when constructing binary operators. From-SVN: r71873
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 6ad93c5..26eaab0 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6553,6 +6553,10 @@ expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1,
}
else
{
+ /* If we need to preserve evaluation order, copy exp0 into its own
+ temporary variable so that it can't be clobbered by exp1. */
+ if (flag_evaluation_order && TREE_SIDE_EFFECTS (exp1))
+ exp0 = save_expr (exp0);
*op0 = expand_expr (exp0, target, VOIDmode, modifier);
*op1 = expand_expr (exp1, NULL_RTX, VOIDmode, modifier);
}