diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2007-07-18 15:44:28 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2007-07-18 15:44:28 +0000 |
commit | c3e4e34df939059960b03bf4a4dc0dcaf548e31b (patch) | |
tree | c53527fbd2f51b07fc3d2854903b5f4ea1d26240 /gcc/tree-ssa-propagate.c | |
parent | 9e19a50c89c2323781a390922f9cde317327231d (diff) | |
download | gcc-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.c | 19 |
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))) |