summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-02 22:30:32 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-02 22:30:32 +0000
commit723e4ab01ab01ebe328dd702ab17eb744fc27480 (patch)
tree944030daf9ed3ad7c588f297c744c7105c9ad582
parent92691afde4081d20efa969d97967b47a889f0ae5 (diff)
downloadppe42-gcc-723e4ab01ab01ebe328dd702ab17eb744fc27480.tar.gz
ppe42-gcc-723e4ab01ab01ebe328dd702ab17eb744fc27480.zip
* tree-sra.c (sra_walk_fns) <ldst>: Document new restriction.
(sra_walk_modify_expr) <rhs_elt>: Treat the reference as a use if the lhs has side-effects. <lhs_elt>: Treat the reference as a use if the rhs has side-effects. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122492 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-sra.c9
2 files changed, 13 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 39f849a3522..5e8d89a456f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-03-02 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree-sra.c (sra_walk_fns) <ldst>: Document new restriction.
+ (sra_walk_modify_expr) <rhs_elt>: Treat the reference as a use
+ if the lhs has side-effects.
+ <lhs_elt>: Treat the reference as a use if the rhs has side-effects.
+
2007-03-02 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.h (TUNEMASK): Remove define.
@@ -7,7 +14,7 @@
* config/i386/i386.c (override_options): Ditto.
(standard_80387_constant_p): Ditto.
-2007-03-03 Ian Lance Taylor <iant@google.com>
+2007-03-02 Ian Lance Taylor <iant@google.com>
Used signed infinities in VRP.
* tree-vrp.c (uses_overflow_infinity): New static function.
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index cb8f63d1833..ef7707f8b0d 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -685,8 +685,8 @@ struct sra_walk_fns
void (*init) (struct sra_elt *elt, tree value, block_stmt_iterator *bsi);
/* Invoked when we have a copy between one scalarizable reference ELT
- and one non-scalarizable reference OTHER. IS_OUTPUT is true if ELT
- is on the left-hand side. */
+ and one non-scalarizable reference OTHER without side-effects.
+ IS_OUTPUT is true if ELT is on the left-hand side. */
void (*ldst) (struct sra_elt *elt, tree other,
block_stmt_iterator *bsi, bool is_output);
@@ -908,7 +908,7 @@ sra_walk_gimple_modify_stmt (tree expr, block_stmt_iterator *bsi,
/* If the RHS is scalarizable, handle it. There are only two cases. */
if (rhs_elt)
{
- if (!rhs_elt->is_scalar)
+ if (!rhs_elt->is_scalar && !TREE_SIDE_EFFECTS (lhs))
fns->ldst (rhs_elt, lhs, bsi, false);
else
fns->use (rhs_elt, &GIMPLE_STMT_OPERAND (expr, 1), bsi, false, false);
@@ -951,7 +951,8 @@ sra_walk_gimple_modify_stmt (tree expr, block_stmt_iterator *bsi,
The lvalue requirement prevents us from trying to directly scalarize
the result of a function call. Which would result in trying to call
the function multiple times, and other evil things. */
- else if (!lhs_elt->is_scalar && is_gimple_addressable (rhs))
+ else if (!lhs_elt->is_scalar
+ && !TREE_SIDE_EFFECTS (rhs) && is_gimple_addressable (rhs))
fns->ldst (lhs_elt, rhs, bsi, true);
/* Otherwise we're being used in some context that requires the
OpenPOWER on IntegriCloud