aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-10-14 09:24:36 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-10-14 09:24:36 +0000
commitfd7e50840c8056f2065826849b7ff9b0ec90f60b (patch)
tree51850479810f98b2410d92fad641c512a3c70a7e /gcc/gimple.c
parentd19d091ca06d75016be9e3c5af8488bca8c0d546 (diff)
downloadgcc-fd7e50840c8056f2065826849b7ff9b0ec90f60b.zip
gcc-fd7e50840c8056f2065826849b7ff9b0ec90f60b.tar.gz
gcc-fd7e50840c8056f2065826849b7ff9b0ec90f60b.tar.bz2
re PR other/58712 (issues found by --enable-checking=valgrind)
2013-10-14 Richard Biener <rguenther@suse.de> PR middle-end/58712 PR middle-end/55358 * gimple.c (iterative_hash_canonical_type): Make sure to record the hash into the correct hashtable slot. From-SVN: r203517
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r--gcc/gimple.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c
index f3191aa..e0cc4ef 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -3112,8 +3112,7 @@ iterative_hash_canonical_type (tree type, hashval_t val)
struct tree_int_map *mp, m;
m.base.from = type;
- if ((slot = htab_find_slot (canonical_type_hash_cache, &m, INSERT))
- && *slot)
+ if ((slot = htab_find_slot (canonical_type_hash_cache, &m, NO_INSERT)))
return iterative_hash_hashval_t (((struct tree_int_map *) *slot)->to, val);
/* Combine a few common features of types so that types are grouped into
@@ -3217,6 +3216,10 @@ iterative_hash_canonical_type (tree type, hashval_t val)
mp = ggc_alloc_cleared_tree_int_map ();
mp->base.from = type;
mp->to = v;
+ /* As we recurse the hashtable may expand between looking up the
+ cached value (and not finding one) and here, so we have to
+ re-lookup the slot. */
+ slot = htab_find_slot (canonical_type_hash_cache, &m, INSERT);
*slot = (void *) mp;
return iterative_hash_hashval_t (v, val);