From 723e4ab01ab01ebe328dd702ab17eb744fc27480 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Fri, 2 Mar 2007 22:30:32 +0000 Subject: [PATCH] * tree-sra.c (sra_walk_fns) : Document new restriction. (sra_walk_modify_expr) : Treat the reference as a use if the lhs has side-effects. : 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 --- gcc/ChangeLog | 9 ++++++++- 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 + + * tree-sra.c (sra_walk_fns) : Document new restriction. + (sra_walk_modify_expr) : Treat the reference as a use + if the lhs has side-effects. + : Treat the reference as a use if the rhs has side-effects. + 2007-03-02 Uros Bizjak * 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 +2007-03-02 Ian Lance Taylor 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 -- 2.7.4