diff options
author | dberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-07-18 15:44:28 +0000 |
---|---|---|
committer | dberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-07-18 15:44:28 +0000 |
commit | 2602affde4ad8deb852a125a4ea868f90d411ccf (patch) | |
tree | c53527fbd2f51b07fc3d2854903b5f4ea1d26240 /gcc/tree-ssa-propagate.c | |
parent | 94d1be51302ff3a757dd78a31456b86cf4a45b3d (diff) | |
download | gcc-2602affde4ad8deb852a125a4ea868f90d411ccf.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@126721 138bc75d-0d04-0410-961f-82ee72b054a4
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 096664d90d1..4803362aef5 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))) |