summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>2008-07-19 20:02:29 +0000
committerandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>2008-07-19 20:02:29 +0000
commit8c8a7011b86e6bd91d78c8dd3100d4014cb0f26d (patch)
tree86848acd2172e064f4a209b5b054324423da0eea /gcc
parentb49770cfa3f8bdc579b3b4627ed8c5b5bfb80739 (diff)
downloadgcc-8c8a7011b86e6bd91d78c8dd3100d4014cb0f26d.tar.gz
2008-07-19 Richard Guenther <rguenther@suse.de>
PR bootstrap/36864 * tree-ssa-sccvn.h (get_constant_value_id): Declare. * tree-ssa-sccvn.c (get_constant_value_id): New function. * tree-ssa-pre.c (get_expr_value_id): For newly created constant value-ids make sure to add the expression to its expression-set. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137991 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-ssa-pre.c11
-rw-r--r--gcc/tree-ssa-sccvn.c18
-rw-r--r--gcc/tree-ssa-sccvn.h1
4 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 701b25f787e..50edf353df9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2008-07-19 Richard Guenther <rguenther@suse.de>
+
+ PR bootstrap/36864
+ * tree-ssa-sccvn.h (get_constant_value_id): Declare.
+ * tree-ssa-sccvn.c (get_constant_value_id): New function.
+ * tree-ssa-pre.c (get_expr_value_id): For newly created
+ constant value-ids make sure to add the expression to its
+ expression-set.
+
2008-07-19 Jakub Jelinek <jakub@redhat.com>
PR middle-end/36877
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index efa934fb853..ed337a39c46 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -599,7 +599,16 @@ get_expr_value_id (pre_expr expr)
switch (expr->kind)
{
case CONSTANT:
- return get_or_alloc_constant_value_id (PRE_EXPR_CONSTANT (expr));
+ {
+ unsigned int id;
+ id = get_constant_value_id (PRE_EXPR_CONSTANT (expr));
+ if (id == 0)
+ {
+ id = get_or_alloc_constant_value_id (PRE_EXPR_CONSTANT (expr));
+ add_to_value (id, expr);
+ }
+ return id;
+ }
case NAME:
return VN_INFO (PRE_EXPR_NAME (expr))->value_id;
case NARY:
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 69945a5c3c7..48b5297b4d8 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -248,6 +248,24 @@ vn_constant_hash (const void *p1)
return vc1->hashcode;
}
+/* Lookup a value id for CONSTANT and return it. If it does not
+ exist returns 0. */
+
+unsigned int
+get_constant_value_id (tree constant)
+{
+ void **slot;
+ struct vn_constant_s vc;
+
+ vc.hashcode = iterative_hash_expr (constant, 0);
+ vc.constant = constant;
+ slot = htab_find_slot_with_hash (constant_to_value_id, &vc,
+ vc.hashcode, NO_INSERT);
+ if (slot)
+ return ((vn_constant_t)*slot)->value_id;
+ return 0;
+}
+
/* Lookup a value id for CONSTANT, and if it does not exist, create a
new one and return it. If it does exist, return it. */
diff --git a/gcc/tree-ssa-sccvn.h b/gcc/tree-ssa-sccvn.h
index 9f391af43aa..314cf8f8c9b 100644
--- a/gcc/tree-ssa-sccvn.h
+++ b/gcc/tree-ssa-sccvn.h
@@ -163,6 +163,7 @@ hashval_t vn_reference_compute_hash (const vn_reference_t);
int vn_reference_eq (const void *, const void *);
unsigned int get_max_value_id (void);
unsigned int get_next_value_id (void);
+unsigned int get_constant_value_id (tree);
unsigned int get_or_alloc_constant_value_id (tree);
bool value_id_constant_p (unsigned int);
VEC (tree, gc) *shared_vuses_from_stmt (tree);