aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-propagate.c
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2007-07-18 15:44:28 +0000
committerDaniel Berlin <dberlin@gcc.gnu.org>2007-07-18 15:44:28 +0000
commitc3e4e34df939059960b03bf4a4dc0dcaf548e31b (patch)
treec53527fbd2f51b07fc3d2854903b5f4ea1d26240 /gcc/tree-ssa-propagate.c
parent9e19a50c89c2323781a390922f9cde317327231d (diff)
downloadgcc-c3e4e34df939059960b03bf4a4dc0dcaf548e31b.zip
gcc-c3e4e34df939059960b03bf4a4dc0dcaf548e31b.tar.gz
gcc-c3e4e34df939059960b03bf4a4dc0dcaf548e31b.tar.bz2
tree-ssa-sccvn.c (try_to_simplify): Use valid_gimple_expression
2007-07-18 Daniel Berlin <dberlin@dberlin.org> * tree-ssa-sccvn.c (try_to_simplify): Use valid_gimple_expression * tree-ssa-propagate (valid_gimple_expression): Handle ADDR_EXPR properly. From-SVN: r126721
Diffstat (limited to 'gcc/tree-ssa-propagate.c')
-rw-r--r--gcc/tree-ssa-propagate.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index 096664d..4803362 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -606,10 +606,21 @@ valid_gimple_expression_p (tree expr)
switch (code)
{
case ADDR_EXPR:
- if (TREE_CODE (TREE_OPERAND (expr, 0)) == ARRAY_REF
- && !is_gimple_val (TREE_OPERAND (TREE_OPERAND (expr, 0), 1)))
- return false;
- break;
+ {
+ tree t = TREE_OPERAND (expr, 0);
+ while (handled_component_p (t))
+ {
+ /* ??? More checks needed, see the GIMPLE verifier. */
+ if ((TREE_CODE (t) == ARRAY_REF
+ || TREE_CODE (t) == ARRAY_RANGE_REF)
+ && !is_gimple_val (TREE_OPERAND (t, 1)))
+ return false;
+ t = TREE_OPERAND (t, 0);
+ }
+ if (!is_gimple_addressable (t))
+ return false;
+ break;
+ }
case TRUTH_NOT_EXPR:
if (!is_gimple_val (TREE_OPERAND (expr, 0)))