summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/tree-ssa-structalias.c
diff options
context:
space:
mode:
authormm <mm@FreeBSD.org>2011-03-29 20:53:51 +0000
committermm <mm@FreeBSD.org>2011-03-29 20:53:51 +0000
commit24a0f968ca05de3f4d12a803e9141af94f6d0aee (patch)
tree8dd18f9d0a6d8b9d0b38d505e33d37244cd1c655 /contrib/gcc/tree-ssa-structalias.c
parent9d571f70778884c98026689ff71368ffa7c1cb9d (diff)
downloadFreeBSD-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.c92
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);
OpenPOWER on IntegriCloud