diff options
author | mm <mm@FreeBSD.org> | 2011-03-29 20:53:51 +0000 |
---|---|---|
committer | mm <mm@FreeBSD.org> | 2011-03-29 20:53:51 +0000 |
commit | 24a0f968ca05de3f4d12a803e9141af94f6d0aee (patch) | |
tree | 8dd18f9d0a6d8b9d0b38d505e33d37244cd1c655 /contrib/gcc/tree-ssa-structalias.c | |
parent | 9d571f70778884c98026689ff71368ffa7c1cb9d (diff) | |
download | FreeBSD-src-24a0f968ca05de3f4d12a803e9141af94f6d0aee.zip FreeBSD-src-24a0f968ca05de3f4d12a803e9141af94f6d0aee.tar.gz |
Upgrade of base gcc and libstdc++ to the last GPLv2-licensed revision
(rev. 127959 of gcc-4_2-branch).
Resolved GCC bugs:
c++: 17763, 29365, 30535, 30917, 31337, 31941, 32108, 32112, 32346,
32898, 32992
debug: 32610, 32914
libstdc++: 33084, 33128
middle-end: 32563
rtl-optimization: 33148
tree-optimization: 25413, 32723
target: 32218
Tested by: pointyhat (miwi)
Obtained from: gcc (gcc-4_2-branch up to rev. 127959)
PR: gnu/153298, gnu/153959, gnu/154385
MFC after: 1 month
Diffstat (limited to 'contrib/gcc/tree-ssa-structalias.c')
-rw-r--r-- | contrib/gcc/tree-ssa-structalias.c | 92 |
1 files changed, 88 insertions, 4 deletions
diff --git a/contrib/gcc/tree-ssa-structalias.c b/contrib/gcc/tree-ssa-structalias.c index d2bc09b..29811ca 100644 --- a/contrib/gcc/tree-ssa-structalias.c +++ b/contrib/gcc/tree-ssa-structalias.c @@ -4350,6 +4350,75 @@ intra_create_variable_infos (void) process_constraint (new_constraint (lhs, rhs)); } +/* Structure used to put solution bitmaps in a hashtable so they can + be shared among variables with the same points-to set. */ + +typedef struct shared_bitmap_info +{ + bitmap pt_vars; + hashval_t hashcode; +} *shared_bitmap_info_t; + +static htab_t shared_bitmap_table; + +/* Hash function for a shared_bitmap_info_t */ + +static hashval_t +shared_bitmap_hash (const void *p) +{ + const shared_bitmap_info_t bi = (shared_bitmap_info_t) p; + return bi->hashcode; +} + +/* Equality function for two shared_bitmap_info_t's. */ + +static int +shared_bitmap_eq (const void *p1, const void *p2) +{ + const shared_bitmap_info_t sbi1 = (shared_bitmap_info_t) p1; + const shared_bitmap_info_t sbi2 = (shared_bitmap_info_t) p2; + return bitmap_equal_p (sbi1->pt_vars, sbi2->pt_vars); +} + +/* Lookup a bitmap in the shared bitmap hashtable, and return an already + existing instance if there is one, NULL otherwise. */ + +static bitmap +shared_bitmap_lookup (bitmap pt_vars) +{ + void **slot; + struct shared_bitmap_info sbi; + + sbi.pt_vars = pt_vars; + sbi.hashcode = bitmap_hash (pt_vars); + + slot = htab_find_slot_with_hash (shared_bitmap_table, &sbi, + sbi.hashcode, NO_INSERT); + if (!slot) + return NULL; + else + return ((shared_bitmap_info_t) *slot)->pt_vars; +} + + +/* Add a bitmap to the shared bitmap hashtable. */ + +static void +shared_bitmap_add (bitmap pt_vars) +{ + void **slot; + shared_bitmap_info_t sbi = XNEW (struct shared_bitmap_info); + + sbi->pt_vars = pt_vars; + sbi->hashcode = bitmap_hash (pt_vars); + + slot = htab_find_slot_with_hash (shared_bitmap_table, sbi, + sbi->hashcode, INSERT); + gcc_assert (!*slot); + *slot = (void *) sbi; +} + + /* Set bits in INTO corresponding to the variable uids in solution set FROM, which came from variable PTR. For variables that are actually dereferenced, we also use type @@ -4460,7 +4529,9 @@ find_what_p_points_to (tree p) struct ptr_info_def *pi = get_ptr_info (p); unsigned int i; bitmap_iterator bi; - + bitmap finished_solution; + bitmap result; + /* This variable may have been collapsed, let's get the real variable. */ vi = get_varinfo (find (vi->id)); @@ -4492,10 +4563,20 @@ find_what_p_points_to (tree p) if (pi->pt_anything) return false; - if (!pi->pt_vars) - pi->pt_vars = BITMAP_GGC_ALLOC (); + finished_solution = BITMAP_GGC_ALLOC (); + set_uids_in_ptset (vi->decl, finished_solution, vi->solution); + result = shared_bitmap_lookup (finished_solution); - set_uids_in_ptset (vi->decl, pi->pt_vars, vi->solution); + if (!result) + { + shared_bitmap_add (finished_solution); + pi->pt_vars = finished_solution; + } + else + { + pi->pt_vars = result; + bitmap_clear (finished_solution); + } if (bitmap_empty_p (pi->pt_vars)) pi->pt_vars = NULL; @@ -4691,6 +4772,8 @@ init_alias_vars (void) vi_for_tree = pointer_map_create (); memset (&stats, 0, sizeof (stats)); + shared_bitmap_table = htab_create (511, shared_bitmap_hash, + shared_bitmap_eq, free); init_base_vars (); } @@ -4923,6 +5006,7 @@ delete_points_to_sets (void) varinfo_t v; int i; + htab_delete (shared_bitmap_table); if (dump_file && (dump_flags & TDF_STATS)) fprintf (dump_file, "Points to sets created:%d\n", stats.points_to_sets_created); |