+2019-05-07 Martin Liska <mliska@suse.cz>
+
+ * bitmap.c (bitmap_register): Come up with
+ alloc_descriptor_max_uid and assign it for
+ a new bitmap.
+ (register_overhead): Use get_descriptor as
+ a descriptor.
+ (release_overhead): New.
+ (bitmap_elem_to_freelist): Call it.
+ (bitmap_elt_clear_from): Likewise.
+ (bitmap_obstack_free): Likewise.
+ (bitmap_move): Sensitively release memory.
+ * bitmap.h (struct GTY): Add alloc_descriptor and padding.
+ (bitmap_initialize): Initialize alloc_descriptor to zero.
+ * tree-ssa-pre.c (do_hoist_insertion): Use bitmap_move.
+
2019-05-07 Richard Biener <rguenther@suse.de>
* tree-vect-slp.c (vect_build_slp_tree_2): Bump size whenever
void
bitmap_register (bitmap b MEM_STAT_DECL)
{
- bitmap_mem_desc.register_descriptor (b, BITMAP_ORIGIN, false
- FINAL_PASS_MEM_STAT);
+ static unsigned alloc_descriptor_max_uid = 1;
+ gcc_assert (b->alloc_descriptor == 0);
+ b->alloc_descriptor = alloc_descriptor_max_uid++;
+
+ bitmap_mem_desc.register_descriptor (b->get_descriptor (), BITMAP_ORIGIN,
+ false FINAL_PASS_MEM_STAT);
}
/* Account the overhead. */
static void
register_overhead (bitmap b, size_t amount)
{
- if (bitmap_mem_desc.contains_descriptor_for_instance (b))
- bitmap_mem_desc.register_instance_overhead (amount, b);
+ unsigned *d = b->get_descriptor ();
+ if (bitmap_mem_desc.contains_descriptor_for_instance (d))
+ bitmap_mem_desc.register_instance_overhead (amount, d);
+}
+
+/* Release the overhead. */
+static void
+release_overhead (bitmap b, size_t amount, bool remove_from_map)
+{
+ unsigned *d = b->get_descriptor ();
+ if (bitmap_mem_desc.contains_descriptor_for_instance (d))
+ bitmap_mem_desc.release_instance_overhead (d, amount, remove_from_map);
}
+
/* Global data */
bitmap_element bitmap_zero_bits; /* An element of all zero bits. */
bitmap_obstack bitmap_default_obstack; /* The default bitmap obstack. */
bitmap_obstack *bit_obstack = head->obstack;
if (GATHER_STATISTICS)
- register_overhead (head, -((int)sizeof (bitmap_element)));
+ release_overhead (head, sizeof (bitmap_element), false);
elt->next = NULL;
elt->indx = -1;
int n = 0;
for (prev = elt; prev; prev = prev->next)
n++;
- register_overhead (head, -sizeof (bitmap_element) * n);
+ release_overhead (head, sizeof (bitmap_element) * n, false);
}
prev = elt->prev;
map->first = (bitmap_element *) map->obstack->heads;
if (GATHER_STATISTICS)
- register_overhead (map, -((int)sizeof (bitmap_head)));
+ release_overhead (map, sizeof (bitmap_head), true);
map->obstack->heads = map;
}
bitmap_clear (to);
- *to = *from;
-
+ size_t sz = 0;
if (GATHER_STATISTICS)
{
- size_t sz = 0;
for (bitmap_element *e = to->first; e; e = e->next)
sz += sizeof (bitmap_element);
register_overhead (to, sz);
- register_overhead (from, -sz);
}
+
+ *to = *from;
+
+ if (GATHER_STATISTICS)
+ release_overhead (from, sz, false);
}
\f
/* Clear a single bit in a bitmap. Return true if the bit changed. */
static bitmap_obstack crashme;
/* Poison obstack to not make it not a valid initialized GC bitmap. */
CONSTEXPR bitmap_head()
- : indx(0), tree_form(false), first(NULL), current(NULL),
- obstack (&crashme)
+ : indx (0), tree_form (false), padding (0), alloc_descriptor (0), first (NULL),
+ current (NULL), obstack (&crashme)
{}
/* Index of last element looked at. */
unsigned int indx;
/* False if the bitmap is in list form; true if the bitmap is in tree form.
Bitmap iterators only work on bitmaps in list form. */
- bool tree_form;
+ unsigned tree_form: 1;
+ /* Next integer is shifted, so padding is needed. */
+ unsigned padding: 2;
+ /* Bitmap UID used for memory allocation statistics. */
+ unsigned alloc_descriptor: 29;
/* In list form, the first element in the linked list;
in tree form, the root of the tree. */
bitmap_element *first;
bitmap_element * GTY((skip(""))) current;
/* Obstack to allocate elements from. If NULL, then use GGC allocation. */
bitmap_obstack * GTY((skip(""))) obstack;
+
+ /* Dump bitmap. */
void dump ();
+
+ /* Get bitmap descriptor UID casted to an unsigned integer pointer.
+ Shift the descriptor because pointer_hash<Type>::hash is
+ doing >> 3 shift operation. */
+ unsigned *get_descriptor ()
+ {
+ return (unsigned *)(ptrdiff_t)(alloc_descriptor << 3);
+ }
};
/* Global data */
{
head->first = head->current = NULL;
head->indx = head->tree_form = 0;
+ head->padding = 0;
+ head->alloc_descriptor = 0;
head->obstack = obstack;
if (GATHER_STATISTICS)
bitmap_register (head PASS_MEM_STAT);
return false;
/* Hack hoitable_set in-place so we can use sorted_array_from_bitmap_set. */
- hoistable_set.values = availout_in_some;
+ bitmap_move (&hoistable_set.values, &availout_in_some);
hoistable_set.expressions = ANTIC_IN (block)->expressions;
/* Now finally construct the topological-ordered expression set. */