summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2008-04-15 13:28:08 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2008-04-15 13:28:08 +0000
commitfb05ee8785f73de2d7d97547ac9a9bd19fc0463e (patch)
tree9098d5ac54a9f0a83f6c1809c9d7cb33b7f481de
parentdc543af159c1eeb5ca6fa36d88639f1b2010475a (diff)
downloadppe42-gcc-fb05ee8785f73de2d7d97547ac9a9bd19fc0463e.tar.gz
ppe42-gcc-fb05ee8785f73de2d7d97547ac9a9bd19fc0463e.zip
2008-04-15 Richard Guenther <rguenther@suse.de>
* tree-ssa-sccvn.h (vn_reference_lookup): Adjust prototype. * tree-ssa-sccvn.c (vn_reference_lookup): New parameter maywalk. (visit_reference_op_load): Do walk vuse-vdef chains on vn_reference_lookup. (visit_reference_op_store): But do not here. * tree-vn.c (vn_lookup): Do not walk vuse-vdef chains on vn_reference_lookup. (vn_lookup_with_vuses): But do so here. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@134314 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/tree-ssa-sccvn.c7
-rw-r--r--gcc/tree-ssa-sccvn.h2
-rw-r--r--gcc/tree-vn.c6
4 files changed, 19 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 90a088f25fc..b00f53d6085 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2008-04-15 Richard Guenther <rguenther@suse.de>
+
+ * tree-ssa-sccvn.h (vn_reference_lookup): Adjust prototype.
+ * tree-ssa-sccvn.c (vn_reference_lookup): New parameter maywalk.
+ (visit_reference_op_load): Do walk vuse-vdef chains on
+ vn_reference_lookup.
+ (visit_reference_op_store): But do not here.
+ * tree-vn.c (vn_lookup): Do not walk vuse-vdef chains on
+ vn_reference_lookup.
+ (vn_lookup_with_vuses): But do so here.
+
2008-04-14 Ian Lance Taylor <iant@google.com>
* fold-const.c (fold_overflow_warning): Remove assertion.
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index b613b2ba21f..849eade1d21 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -735,7 +735,7 @@ vn_reference_lookup_1 (vn_reference_t vr)
it does not exist in the hash table. */
tree
-vn_reference_lookup (tree op, VEC (tree, gc) *vuses)
+vn_reference_lookup (tree op, VEC (tree, gc) *vuses, bool maywalk)
{
struct vn_reference_s vr1;
tree result, def_stmt;
@@ -748,6 +748,7 @@ vn_reference_lookup (tree op, VEC (tree, gc) *vuses)
/* If there is a single defining statement for all virtual uses, we can
use that, following virtual use-def chains. */
if (!result
+ && maywalk
&& vr1.vuses
&& VEC_length (tree, vr1.vuses) >= 1
&& !get_call_expr_in (op)
@@ -1188,7 +1189,7 @@ static bool
visit_reference_op_load (tree lhs, tree op, tree stmt)
{
bool changed = false;
- tree result = vn_reference_lookup (op, shared_vuses_from_stmt (stmt));
+ tree result = vn_reference_lookup (op, shared_vuses_from_stmt (stmt), true);
/* We handle type-punning through unions by value-numbering based
on offset and size of the access. Be prepared to handle a
@@ -1294,7 +1295,7 @@ visit_reference_op_store (tree lhs, tree op, tree stmt)
Otherwise, the vdefs for the store are used when inserting into
the table, since the store generates a new memory state. */
- result = vn_reference_lookup (lhs, shared_vuses_from_stmt (stmt));
+ result = vn_reference_lookup (lhs, shared_vuses_from_stmt (stmt), false);
if (result)
{
diff --git a/gcc/tree-ssa-sccvn.h b/gcc/tree-ssa-sccvn.h
index 55d9831f504..ecc3297af42 100644
--- a/gcc/tree-ssa-sccvn.h
+++ b/gcc/tree-ssa-sccvn.h
@@ -59,7 +59,7 @@ void free_scc_vn (void);
void switch_to_PRE_table (void);
tree vn_nary_op_lookup (tree);
void vn_nary_op_insert (tree, tree);
-tree vn_reference_lookup (tree, VEC (tree, gc) *);
+tree vn_reference_lookup (tree, VEC (tree, gc) *, bool);
void vn_reference_insert (tree, tree, VEC (tree, gc) *);
VEC (tree, gc) *shared_vuses_from_stmt (tree);
VEC (tree, gc) *copy_vuses_from_stmt (tree);
diff --git a/gcc/tree-vn.c b/gcc/tree-vn.c
index 2122a7e432e..c09dfb76284 100644
--- a/gcc/tree-vn.c
+++ b/gcc/tree-vn.c
@@ -255,7 +255,7 @@ vn_lookup (tree expr)
/* In the case of array-refs of constants, for example, we can
end up with no vuses. */
case tcc_reference:
- return vn_reference_lookup (expr, NULL);
+ return vn_reference_lookup (expr, NULL, false);
break;
/* It is possible to have CALL_EXPR with no vuses for things
like "cos", and these will fall into vn_lookup. */
@@ -264,7 +264,7 @@ vn_lookup (tree expr)
case tcc_expression:
case tcc_declaration:
if (TREE_CODE (expr) == CALL_EXPR || DECL_P (expr))
- return vn_reference_lookup (expr, NULL);
+ return vn_reference_lookup (expr, NULL, false);
else if (TREE_CODE (expr) == SSA_NAME)
return SSA_NAME_VALUE (expr);
else if (TREE_CODE (expr) == ADDR_EXPR)
@@ -308,7 +308,7 @@ vn_lookup_with_vuses (tree expr, VEC (tree, gc) *vuses)
if (is_gimple_min_invariant (expr) || TREE_CODE (expr) == FIELD_DECL)
return expr;
- return vn_reference_lookup (expr, vuses);
+ return vn_reference_lookup (expr, vuses, true);
}
static tree
OpenPOWER on IntegriCloud