diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-09-28 04:56:35 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-09-28 04:56:35 +0000 |
commit | 3541e1130504244cf334a9d3f471377bd276c949 (patch) | |
tree | 59d5e4829907404d9cd123482f4ad1565deac1eb /gcc/expr.c | |
parent | eb32e911e2e75329903d38e72ff207ede5ca722c (diff) | |
download | gcc-3541e1130504244cf334a9d3f471377bd276c949.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@71873 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c index 6ad93c506ab..26eaab01452 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); } |