diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2007-03-02 22:30:32 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2007-03-02 22:30:32 +0000 |
commit | 9700224802151e26d4fadbf9eba9038f73006203 (patch) | |
tree | 944030daf9ed3ad7c588f297c744c7105c9ad582 /gcc | |
parent | e39e8c363b440515ff778e4141634af5cc4b5815 (diff) | |
download | gcc-9700224802151e26d4fadbf9eba9038f73006203.zip gcc-9700224802151e26d4fadbf9eba9038f73006203.tar.gz gcc-9700224802151e26d4fadbf9eba9038f73006203.tar.bz2 |
tree-sra.c (sra_walk_fns): Document new restriction.
* 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.
From-SVN: r122492
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/tree-sra.c | 9 |
2 files changed, 13 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39f849a..5e8d89a 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 cb8f63d..ef7707f 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 |