aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-01-13 12:07:28 +0000
committerRichard Stallman <rms@gnu.org>1993-01-13 12:07:28 +0000
commitca300798ae1905d46697565ec095fb496398ec24 (patch)
tree135e5fa7ecd8405194932a90f267748fa258e294
parent8230fba78adffe8eb6f746404c6e0b67702383df (diff)
downloadgcc-ca300798ae1905d46697565ec095fb496398ec24.zip
gcc-ca300798ae1905d46697565ec095fb496398ec24.tar.gz
gcc-ca300798ae1905d46697565ec095fb496398ec24.tar.bz2
(expand_increment): Handle all preincrements by building
arithmetic and calling expand_assignment. From-SVN: r3222
-rw-r--r--gcc/expr.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index e3fdef7..ff5e90c 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6298,7 +6298,8 @@ expand_increment (exp, post)
/* Stabilize any component ref that might need to be
evaluated more than once below. */
- if (TREE_CODE (incremented) == BIT_FIELD_REF
+ if (!post
+ || TREE_CODE (incremented) == BIT_FIELD_REF
|| (TREE_CODE (incremented) == COMPONENT_REF
&& (TREE_CODE (TREE_OPERAND (incremented, 0)) != INDIRECT_REF
|| DECL_BIT_FIELD (TREE_OPERAND (incremented, 1)))))
@@ -6333,14 +6334,15 @@ expand_increment (exp, post)
this_optab = sub_optab;
/* If OP0 is not the actual lvalue, but rather a copy in a register,
- then we cannot just increment OP0. We must
- therefore contrive to increment the original value.
- Then we can return OP0 since it is a copy of the old value. */
- if (op0_is_copy)
+ then we cannot just increment OP0. We must therefore contrive to
+ increment the original value. Then, for postincrement, we can return
+ OP0 since it is a copy of the old value. For preincrement, we want
+ to always expand here, since this generates better or equivalent code. */
+ if (!post || op0_is_copy)
{
/* This is the easiest way to increment the value wherever it is.
- Problems with multiple evaluation of INCREMENTED
- are prevented because either (1) it is a component_ref,
+ Problems with multiple evaluation of INCREMENTED are prevented
+ because either (1) it is a component_ref or preincrement,
in which case it was stabilized above, or (2) it is an array_ref
with constant index in an array in a register, which is
safe to reevaluate. */