1 /* Functions to support general ended bitmaps.
2    Copyright (C) 1997-2021 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "bitmap.h"
24 #include "selftest.h"
25 
26 /* Memory allocation statistics purpose instance.  */
27 mem_alloc_description<bitmap_usage> bitmap_mem_desc;
28 
29 /* Static zero-initialized bitmap obstack used for default initialization
30    of bitmap_head.  */
31 bitmap_obstack bitmap_head::crashme;
32 
33 static bitmap_element *bitmap_tree_listify_from (bitmap, bitmap_element *);
34 
35 /* Register new bitmap.  */
36 void
bitmap_register(bitmap b MEM_STAT_DECL)37 bitmap_register (bitmap b MEM_STAT_DECL)
38 {
39   static unsigned alloc_descriptor_max_uid = 1;
40   gcc_assert (b->alloc_descriptor == 0);
41   b->alloc_descriptor = alloc_descriptor_max_uid++;
42 
43   bitmap_mem_desc.register_descriptor (b->get_descriptor (), BITMAP_ORIGIN,
44 				       false FINAL_PASS_MEM_STAT);
45 }
46 
47 /* Account the overhead.  */
48 static void
register_overhead(bitmap b,size_t amount)49 register_overhead (bitmap b, size_t amount)
50 {
51   unsigned *d = b->get_descriptor ();
52   if (bitmap_mem_desc.contains_descriptor_for_instance (d))
53     bitmap_mem_desc.register_instance_overhead (amount, d);
54 }
55 
56 /* Release the overhead.  */
57 static void
release_overhead(bitmap b,size_t amount,bool remove_from_map)58 release_overhead (bitmap b, size_t amount, bool remove_from_map)
59 {
60   unsigned *d = b->get_descriptor ();
61   if (bitmap_mem_desc.contains_descriptor_for_instance (d))
62     bitmap_mem_desc.release_instance_overhead (d, amount, remove_from_map);
63 }
64 
65 
66 /* Global data */
67 bitmap_element bitmap_zero_bits;  /* An element of all zero bits.  */
68 bitmap_obstack bitmap_default_obstack;    /* The default bitmap obstack.  */
69 static int bitmap_default_obstack_depth;
70 static GTY((deletable)) bitmap_element *bitmap_ggc_free; /* Freelist of
71 							    GC'd elements.  */
72 
73 
74 /* Bitmap memory management.  */
75 
76 /* Add ELT to the appropriate freelist.  */
77 static inline void
bitmap_elem_to_freelist(bitmap head,bitmap_element * elt)78 bitmap_elem_to_freelist (bitmap head, bitmap_element *elt)
79 {
80   bitmap_obstack *bit_obstack = head->obstack;
81 
82   if (GATHER_STATISTICS)
83     release_overhead (head, sizeof (bitmap_element), false);
84 
85   elt->next = NULL;
86   elt->indx = -1;
87   if (bit_obstack)
88     {
89       elt->prev = bit_obstack->elements;
90       bit_obstack->elements = elt;
91     }
92   else
93     {
94       elt->prev = bitmap_ggc_free;
95       bitmap_ggc_free = elt;
96     }
97 }
98 
99 /* Allocate a bitmap element.  The bits are cleared, but nothing else is.  */
100 
101 static inline bitmap_element *
bitmap_element_allocate(bitmap head)102 bitmap_element_allocate (bitmap head)
103 {
104   bitmap_element *element;
105   bitmap_obstack *bit_obstack = head->obstack;
106 
107   if (bit_obstack)
108     {
109       element = bit_obstack->elements;
110 
111       if (element)
112 	/* Use up the inner list first before looking at the next
113 	   element of the outer list.  */
114 	if (element->next)
115 	  {
116 	    bit_obstack->elements = element->next;
117 	    bit_obstack->elements->prev = element->prev;
118 	  }
119 	else
120 	  /*  Inner list was just a singleton.  */
121 	  bit_obstack->elements = element->prev;
122       else
123 	element = XOBNEW (&bit_obstack->obstack, bitmap_element);
124     }
125   else
126     {
127       element = bitmap_ggc_free;
128       if (element)
129 	/* Use up the inner list first before looking at the next
130 	   element of the outer list.  */
131 	if (element->next)
132 	  {
133 	    bitmap_ggc_free = element->next;
134 	    bitmap_ggc_free->prev = element->prev;
135 	  }
136 	else
137 	  /*  Inner list was just a singleton.  */
138 	  bitmap_ggc_free = element->prev;
139       else
140 	element = ggc_alloc<bitmap_element> ();
141     }
142 
143   if (GATHER_STATISTICS)
144     register_overhead (head, sizeof (bitmap_element));
145 
146   memset (element->bits, 0, sizeof (element->bits));
147 
148   return element;
149 }
150 
151 /* Remove ELT and all following elements from bitmap HEAD.
152    Put the released elements in the freelist for HEAD.  */
153 
154 void
bitmap_elt_clear_from(bitmap head,bitmap_element * elt)155 bitmap_elt_clear_from (bitmap head, bitmap_element *elt)
156 {
157   bitmap_element *prev;
158   bitmap_obstack *bit_obstack = head->obstack;
159 
160   if (!elt)
161     return;
162 
163   if (head->tree_form)
164     elt = bitmap_tree_listify_from (head, elt);
165 
166   if (GATHER_STATISTICS)
167     {
168       int n = 0;
169       for (prev = elt; prev; prev = prev->next)
170 	n++;
171       release_overhead (head, sizeof (bitmap_element) * n, false);
172     }
173 
174   prev = elt->prev;
175   if (prev)
176     {
177       prev->next = NULL;
178       if (head->current->indx > prev->indx)
179 	{
180 	  head->current = prev;
181 	  head->indx = prev->indx;
182 	}
183     }
184   else
185     {
186       head->first = NULL;
187       head->current = NULL;
188       head->indx = 0;
189     }
190 
191   /* Put the entire list onto the freelist in one operation. */
192   if (bit_obstack)
193     {
194       elt->prev = bit_obstack->elements;
195       bit_obstack->elements = elt;
196     }
197   else
198     {
199       elt->prev = bitmap_ggc_free;
200       bitmap_ggc_free = elt;
201     }
202 }
203 
204 /* Linked-list view of bitmaps.
205 
206    In this representation, the bitmap elements form a double-linked list
207    with elements sorted by increasing index.  */
208 
209 /* Link the bitmap element into the current bitmap linked list.  */
210 
211 static inline void
bitmap_list_link_element(bitmap head,bitmap_element * element)212 bitmap_list_link_element (bitmap head, bitmap_element *element)
213 {
214   unsigned int indx = element->indx;
215   bitmap_element *ptr;
216 
217   gcc_checking_assert (!head->tree_form);
218 
219   /* If this is the first and only element, set it in.  */
220   if (head->first == 0)
221     {
222       element->next = element->prev = 0;
223       head->first = element;
224     }
225 
226   /* If this index is less than that of the current element, it goes someplace
227      before the current element.  */
228   else if (indx < head->indx)
229     {
230       for (ptr = head->current;
231 	   ptr->prev != 0 && ptr->prev->indx > indx;
232 	   ptr = ptr->prev)
233 	;
234 
235       if (ptr->prev)
236 	ptr->prev->next = element;
237       else
238 	head->first = element;
239 
240       element->prev = ptr->prev;
241       element->next = ptr;
242       ptr->prev = element;
243     }
244 
245   /* Otherwise, it must go someplace after the current element.  */
246   else
247     {
248       for (ptr = head->current;
249 	   ptr->next != 0 && ptr->next->indx < indx;
250 	   ptr = ptr->next)
251 	;
252 
253       if (ptr->next)
254 	ptr->next->prev = element;
255 
256       element->next = ptr->next;
257       element->prev = ptr;
258       ptr->next = element;
259     }
260 
261   /* Set up so this is the first element searched.  */
262   head->current = element;
263   head->indx = indx;
264 }
265 
266 /* Unlink the bitmap element from the current bitmap linked list,
267    and return it to the freelist.  */
268 
269 static inline void
270 bitmap_list_unlink_element (bitmap head, bitmap_element *element,
271 			    bool to_freelist = true)
272 {
273   bitmap_element *next = element->next;
274   bitmap_element *prev = element->prev;
275 
276   gcc_checking_assert (!head->tree_form);
277 
278   if (prev)
279     prev->next = next;
280 
281   if (next)
282     next->prev = prev;
283 
284   if (head->first == element)
285     head->first = next;
286 
287   /* Since the first thing we try is to insert before current,
288      make current the next entry in preference to the previous.  */
289   if (head->current == element)
290     {
291       head->current = next != 0 ? next : prev;
292       if (head->current)
293 	head->indx = head->current->indx;
294       else
295 	head->indx = 0;
296     }
297 
298   if (to_freelist)
299     bitmap_elem_to_freelist (head, element);
300 }
301 
302 /* Insert a new uninitialized element (or NODE if not NULL) into bitmap
303    HEAD after element ELT.  If ELT is NULL, insert the element at the start.
304    Return the new element.  */
305 
306 static bitmap_element *
307 bitmap_list_insert_element_after (bitmap head,
308 				  bitmap_element *elt, unsigned int indx,
309 				  bitmap_element *node = NULL)
310 {
311   if (!node)
312     node = bitmap_element_allocate (head);
313   node->indx = indx;
314 
315   gcc_checking_assert (!head->tree_form);
316 
317   if (!elt)
318     {
319       if (!head->current)
320 	{
321 	  head->current = node;
322 	  head->indx = indx;
323 	}
324       node->next = head->first;
325       if (node->next)
326 	node->next->prev = node;
327       head->first = node;
328       node->prev = NULL;
329     }
330   else
331     {
332       gcc_checking_assert (head->current);
333       node->next = elt->next;
334       if (node->next)
335 	node->next->prev = node;
336       elt->next = node;
337       node->prev = elt;
338     }
339   return node;
340 }
341 
342 /* Return the element for INDX, or NULL if the element doesn't exist.
343    Update the `current' field even if we can't find an element that
344    would hold the bitmap's bit to make eventual allocation
345    faster.  */
346 
347 static inline bitmap_element *
bitmap_list_find_element(bitmap head,unsigned int indx)348 bitmap_list_find_element (bitmap head, unsigned int indx)
349 {
350   bitmap_element *element;
351 
352   if (head->current == NULL
353       || head->indx == indx)
354     return head->current;
355 
356   if (head->current == head->first
357       && head->first->next == NULL)
358     return NULL;
359 
360   /* Usage can be NULL due to allocated bitmaps for which we do not
361      call initialize function.  */
362   bitmap_usage *usage = NULL;
363   if (GATHER_STATISTICS)
364     usage = bitmap_mem_desc.get_descriptor_for_instance (head);
365 
366   /* This bitmap has more than one element, and we're going to look
367      through the elements list.  Count that as a search.  */
368   if (GATHER_STATISTICS && usage)
369     usage->m_nsearches++;
370 
371   if (head->indx < indx)
372     /* INDX is beyond head->indx.  Search from head->current
373        forward.  */
374     for (element = head->current;
375 	 element->next != 0 && element->indx < indx;
376 	 element = element->next)
377       {
378 	if (GATHER_STATISTICS && usage)
379 	  usage->m_search_iter++;
380       }
381 
382   else if (head->indx / 2 < indx)
383     /* INDX is less than head->indx and closer to head->indx than to
384        0.  Search from head->current backward.  */
385     for (element = head->current;
386 	 element->prev != 0 && element->indx > indx;
387 	 element = element->prev)
388       {
389 	if (GATHER_STATISTICS && usage)
390 	  usage->m_search_iter++;
391       }
392 
393   else
394     /* INDX is less than head->indx and closer to 0 than to
395        head->indx.  Search from head->first forward.  */
396     for (element = head->first;
397 	 element->next != 0 && element->indx < indx;
398 	 element = element->next)
399       {
400 	if (GATHER_STATISTICS && usage)
401 	  usage->m_search_iter++;
402       }
403 
404   /* `element' is the nearest to the one we want.  If it's not the one we
405      want, the one we want doesn't exist.  */
406   gcc_checking_assert (element != NULL);
407   head->current = element;
408   head->indx = element->indx;
409   if (element->indx != indx)
410     element = 0;
411   return element;
412 }
413 
414 
415 /* Splay-tree view of bitmaps.
416 
417    This is an almost one-to-one the implementatin of the simple top-down
418    splay tree in Sleator and Tarjan's "Self-adjusting Binary Search Trees".
419    It is probably not the most efficient form of splay trees, but it should
420    be good enough to experiment with this idea of bitmaps-as-trees.
421 
422    For all functions below, the variable or function argument "t" is a node
423    in the tree, and "e" is a temporary or new node in the tree.  The rest
424    is sufficiently straigh-forward (and very well explained in the paper)
425    that comment would only clutter things.  */
426 
427 static inline void
bitmap_tree_link_left(bitmap_element * & t,bitmap_element * & l)428 bitmap_tree_link_left (bitmap_element * &t, bitmap_element * &l)
429 {
430   l->next = t;
431   l = t;
432   t = t->next;
433 }
434 
435 static inline void
bitmap_tree_link_right(bitmap_element * & t,bitmap_element * & r)436 bitmap_tree_link_right (bitmap_element * &t, bitmap_element * &r)
437 {
438   r->prev = t;
439   r = t;
440   t = t->prev;
441 }
442 
443 static inline void
bitmap_tree_rotate_left(bitmap_element * & t)444 bitmap_tree_rotate_left (bitmap_element * &t)
445 {
446   bitmap_element *e = t->next;
447   t->next = t->next->prev;
448   e->prev = t;
449   t = e;
450 }
451 
452 static inline void
bitmap_tree_rotate_right(bitmap_element * & t)453 bitmap_tree_rotate_right (bitmap_element * &t)
454 {
455   bitmap_element *e = t->prev;
456   t->prev = t->prev->next;
457   e->next = t;
458   t = e;
459 }
460 
461 static bitmap_element *
bitmap_tree_splay(bitmap head,bitmap_element * t,unsigned int indx)462 bitmap_tree_splay (bitmap head, bitmap_element *t, unsigned int indx)
463 {
464   bitmap_element N, *l, *r;
465 
466   if (t == NULL)
467     return NULL;
468 
469   bitmap_usage *usage = NULL;
470   if (GATHER_STATISTICS)
471     usage = bitmap_mem_desc.get_descriptor_for_instance (head);
472 
473   N.prev = N.next = NULL;
474   l = r = &N;
475 
476   while (indx != t->indx)
477     {
478       if (GATHER_STATISTICS && usage)
479 	usage->m_search_iter++;
480 
481       if (indx < t->indx)
482 	{
483 	  if (t->prev != NULL && indx < t->prev->indx)
484 	    bitmap_tree_rotate_right (t);
485 	  if (t->prev == NULL)
486 	    break;
487 	  bitmap_tree_link_right (t, r);
488 	}
489       else if (indx > t->indx)
490 	{
491 	  if (t->next != NULL && indx > t->next->indx)
492 	    bitmap_tree_rotate_left (t);
493 	  if (t->next == NULL)
494 	    break;
495 	  bitmap_tree_link_left (t, l);
496 	}
497     }
498 
499   l->next = t->prev;
500   r->prev = t->next;
501   t->prev = N.next;
502   t->next = N.prev;
503   return t;
504 }
505 
506 /* Link bitmap element E into the current bitmap splay tree.  */
507 
508 static inline void
bitmap_tree_link_element(bitmap head,bitmap_element * e)509 bitmap_tree_link_element (bitmap head, bitmap_element *e)
510 {
511   if (head->first == NULL)
512     e->prev = e->next = NULL;
513   else
514     {
515       bitmap_element *t = bitmap_tree_splay (head, head->first, e->indx);
516       if (e->indx < t->indx)
517 	{
518 	  e->prev = t->prev;
519 	  e->next = t;
520 	  t->prev = NULL;
521 	}
522       else if (e->indx > t->indx)
523 	{
524 	  e->next = t->next;
525 	  e->prev = t;
526 	  t->next = NULL;
527 	}
528       else
529 	gcc_unreachable ();
530     }
531   head->first = e;
532   head->current = e;
533   head->indx = e->indx;
534 }
535 
536 /* Unlink bitmap element E from the current bitmap splay tree,
537    and return it to the freelist.  */
538 
539 static void
bitmap_tree_unlink_element(bitmap head,bitmap_element * e)540 bitmap_tree_unlink_element (bitmap head, bitmap_element *e)
541 {
542   bitmap_element *t = bitmap_tree_splay (head, head->first, e->indx);
543 
544   gcc_checking_assert (t == e);
545 
546   if (e->prev == NULL)
547     t = e->next;
548   else
549     {
550       t = bitmap_tree_splay (head, e->prev, e->indx);
551       t->next = e->next;
552     }
553   head->first = t;
554   head->current = t;
555   head->indx = (t != NULL) ? t->indx : 0;
556 
557   bitmap_elem_to_freelist (head, e);
558 }
559 
560 /* Return the element for INDX, or NULL if the element doesn't exist.  */
561 
562 static inline bitmap_element *
bitmap_tree_find_element(bitmap head,unsigned int indx)563 bitmap_tree_find_element (bitmap head, unsigned int indx)
564 {
565   if (head->current == NULL
566       || head->indx == indx)
567     return head->current;
568 
569   /* Usage can be NULL due to allocated bitmaps for which we do not
570      call initialize function.  */
571   bitmap_usage *usage = NULL;
572   if (GATHER_STATISTICS)
573     usage = bitmap_mem_desc.get_descriptor_for_instance (head);
574 
575   /* This bitmap has more than one element, and we're going to look
576      through the elements list.  Count that as a search.  */
577   if (GATHER_STATISTICS && usage)
578     usage->m_nsearches++;
579 
580   bitmap_element *element = bitmap_tree_splay (head, head->first, indx);
581   gcc_checking_assert (element != NULL);
582   head->first = element;
583   head->current = element;
584   head->indx = element->indx;
585   if (element->indx != indx)
586     element = 0;
587   return element;
588 }
589 
590 /* Converting bitmap views from linked-list to tree and vice versa.  */
591 
592 /* Splice element E and all elements with a larger index from
593    bitmap HEAD, convert the spliced elements to the linked-list
594    view, and return the head of the list (which should be E again),  */
595 
596 static bitmap_element *
bitmap_tree_listify_from(bitmap head,bitmap_element * e)597 bitmap_tree_listify_from (bitmap head, bitmap_element *e)
598 {
599   bitmap_element *t, *erb;
600 
601   /* Detach the right branch from E (all elements with indx > E->indx),
602      and splay E to the root.  */
603   erb = e->next;
604   e->next = NULL;
605   t = bitmap_tree_splay (head, head->first, e->indx);
606   gcc_checking_assert (t == e);
607 
608   /* Because E has no right branch, and we rotated it to the root,
609      the left branch is the new root.  */
610   t = e->prev;
611   head->first = t;
612   head->current = t;
613   head->indx = (t != NULL) ? t->indx : 0;
614 
615   /* Detach the tree from E, and re-attach the right branch of E.  */
616   e->prev = NULL;
617   e->next = erb;
618 
619   /* The tree is now valid again.  Now we need to "un-tree" E.
620      It is imperative that a non-recursive implementation is used
621      for this, because splay trees have a worst case depth of O(N)
622      for a tree with N nodes.  A recursive implementation could
623      result in a stack overflow for a sufficiently large, unbalanced
624      bitmap tree.  */
625 
626   auto_vec<bitmap_element *, 32> stack;
627   auto_vec<bitmap_element *, 32> sorted_elements;
628   bitmap_element *n = e;
629 
630   while (true)
631     {
632       while (n != NULL)
633 	{
634 	  stack.safe_push (n);
635 	  n = n->prev;
636 	}
637 
638       if (stack.is_empty ())
639 	break;
640 
641       n = stack.pop ();
642       sorted_elements.safe_push (n);
643       n = n->next;
644     }
645 
646   gcc_assert (sorted_elements[0] == e);
647 
648   bitmap_element *prev = NULL;
649   unsigned ix;
650   FOR_EACH_VEC_ELT (sorted_elements, ix, n)
651     {
652       if (prev != NULL)
653         prev->next = n;
654       n->prev = prev;
655       n->next = NULL;
656       prev = n;
657     }
658 
659   return e;
660 }
661 
662 /* Convert bitmap HEAD from splay-tree view to linked-list view.  */
663 
664 void
bitmap_list_view(bitmap head)665 bitmap_list_view (bitmap head)
666 {
667   bitmap_element *ptr;
668 
669   gcc_assert (head->tree_form);
670 
671   ptr = head->first;
672   if (ptr)
673     {
674       while (ptr->prev)
675 	bitmap_tree_rotate_right (ptr);
676       head->first = ptr;
677       head->first = bitmap_tree_listify_from (head, ptr);
678     }
679 
680   head->tree_form = false;
681   if (!head->current)
682     {
683       head->current = head->first;
684       head->indx = head->current ? head->current->indx : 0;
685     }
686 }
687 
688 /* Convert bitmap HEAD from linked-list view to splay-tree view.
689    This is simply a matter of dropping the prev or next pointers
690    and setting the tree_form flag.  The tree will balance itself
691    if and when it is used.  */
692 
693 void
bitmap_tree_view(bitmap head)694 bitmap_tree_view (bitmap head)
695 {
696   bitmap_element *ptr;
697 
698   gcc_assert (! head->tree_form);
699 
700   ptr = head->first;
701   while (ptr)
702     {
703       ptr->prev = NULL;
704       ptr = ptr->next;
705     }
706 
707   head->tree_form = true;
708 }
709 
710 /* Clear a bitmap by freeing all its elements.  */
711 
712 void
bitmap_clear(bitmap head)713 bitmap_clear (bitmap head)
714 {
715   if (head->first == NULL)
716     return;
717   if (head->tree_form)
718     {
719       bitmap_element *e, *t;
720       for (e = head->first; e->prev; e = e->prev)
721 	/* Loop to find the element with the smallest index.  */ ;
722       t = bitmap_tree_splay (head, head->first, e->indx);
723       gcc_checking_assert (t == e);
724       head->first = t;
725     }
726   bitmap_elt_clear_from (head, head->first);
727 }
728 
729 /* Initialize a bitmap obstack.  If BIT_OBSTACK is NULL, initialize
730    the default bitmap obstack.  */
731 
732 void
bitmap_obstack_initialize(bitmap_obstack * bit_obstack)733 bitmap_obstack_initialize (bitmap_obstack *bit_obstack)
734 {
735   if (!bit_obstack)
736     {
737       if (bitmap_default_obstack_depth++)
738 	return;
739       bit_obstack = &bitmap_default_obstack;
740     }
741 
742 #if !defined(__GNUC__) || (__GNUC__ < 2)
743 #define __alignof__(type) 0
744 #endif
745 
746   bit_obstack->elements = NULL;
747   bit_obstack->heads = NULL;
748   obstack_specify_allocation (&bit_obstack->obstack, OBSTACK_CHUNK_SIZE,
749 			      __alignof__ (bitmap_element),
750 			      obstack_chunk_alloc,
751 			      obstack_chunk_free);
752 }
753 
754 /* Release the memory from a bitmap obstack.  If BIT_OBSTACK is NULL,
755    release the default bitmap obstack.  */
756 
757 void
bitmap_obstack_release(bitmap_obstack * bit_obstack)758 bitmap_obstack_release (bitmap_obstack *bit_obstack)
759 {
760   if (!bit_obstack)
761     {
762       if (--bitmap_default_obstack_depth)
763 	{
764 	  gcc_assert (bitmap_default_obstack_depth > 0);
765 	  return;
766 	}
767       bit_obstack = &bitmap_default_obstack;
768     }
769 
770   bit_obstack->elements = NULL;
771   bit_obstack->heads = NULL;
772   obstack_free (&bit_obstack->obstack, NULL);
773 }
774 
775 /* Create a new bitmap on an obstack.  If BIT_OBSTACK is NULL, create
776    it on the default bitmap obstack.  */
777 
778 bitmap
bitmap_alloc(bitmap_obstack * bit_obstack MEM_STAT_DECL)779 bitmap_alloc (bitmap_obstack *bit_obstack MEM_STAT_DECL)
780 {
781   bitmap map;
782 
783   if (!bit_obstack)
784     bit_obstack = &bitmap_default_obstack;
785   map = bit_obstack->heads;
786   if (map)
787     bit_obstack->heads = (class bitmap_head *) map->first;
788   else
789     map = XOBNEW (&bit_obstack->obstack, bitmap_head);
790   bitmap_initialize (map, bit_obstack PASS_MEM_STAT);
791 
792   if (GATHER_STATISTICS)
793     register_overhead (map, sizeof (bitmap_head));
794 
795   return map;
796 }
797 
798 /* Create a new GCd bitmap.  */
799 
800 bitmap
bitmap_gc_alloc(ALONE_MEM_STAT_DECL)801 bitmap_gc_alloc (ALONE_MEM_STAT_DECL)
802 {
803   bitmap map;
804 
805   map = ggc_alloc<bitmap_head> ();
806   bitmap_initialize (map, NULL PASS_MEM_STAT);
807 
808   if (GATHER_STATISTICS)
809     register_overhead (map, sizeof (bitmap_head));
810 
811   return map;
812 }
813 
814 /* Release an obstack allocated bitmap.  */
815 
816 void
bitmap_obstack_free(bitmap map)817 bitmap_obstack_free (bitmap map)
818 {
819   if (map)
820     {
821       bitmap_clear (map);
822       map->first = (bitmap_element *) map->obstack->heads;
823 
824       if (GATHER_STATISTICS)
825 	release_overhead (map, sizeof (bitmap_head), true);
826 
827       map->obstack->heads = map;
828     }
829 }
830 
831 
832 /* Return nonzero if all bits in an element are zero.  */
833 
834 static inline int
bitmap_element_zerop(const bitmap_element * element)835 bitmap_element_zerop (const bitmap_element *element)
836 {
837 #if BITMAP_ELEMENT_WORDS == 2
838   return (element->bits[0] | element->bits[1]) == 0;
839 #else
840   unsigned i;
841 
842   for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
843     if (element->bits[i] != 0)
844       return 0;
845 
846   return 1;
847 #endif
848 }
849 
850 /* Copy a bitmap to another bitmap.  */
851 
852 void
bitmap_copy(bitmap to,const_bitmap from)853 bitmap_copy (bitmap to, const_bitmap from)
854 {
855   const bitmap_element *from_ptr;
856   bitmap_element *to_ptr = 0;
857 
858   gcc_checking_assert (!to->tree_form && !from->tree_form);
859 
860   bitmap_clear (to);
861 
862   /* Copy elements in forward direction one at a time.  */
863   for (from_ptr = from->first; from_ptr; from_ptr = from_ptr->next)
864     {
865       bitmap_element *to_elt = bitmap_element_allocate (to);
866 
867       to_elt->indx = from_ptr->indx;
868       memcpy (to_elt->bits, from_ptr->bits, sizeof (to_elt->bits));
869 
870       /* Here we have a special case of bitmap_list_link_element,
871          for the case where we know the links are being entered
872 	 in sequence.  */
873       if (to_ptr == 0)
874 	{
875 	  to->first = to->current = to_elt;
876 	  to->indx = from_ptr->indx;
877 	  to_elt->next = to_elt->prev = 0;
878 	}
879       else
880 	{
881 	  to_elt->prev = to_ptr;
882 	  to_elt->next = 0;
883 	  to_ptr->next = to_elt;
884 	}
885 
886       to_ptr = to_elt;
887     }
888 }
889 
890 /* Move a bitmap to another bitmap.  */
891 
892 void
bitmap_move(bitmap to,bitmap from)893 bitmap_move (bitmap to, bitmap from)
894 {
895   gcc_assert (to->obstack == from->obstack);
896 
897   bitmap_clear (to);
898 
899   size_t sz = 0;
900   if (GATHER_STATISTICS)
901     {
902       for (bitmap_element *e = to->first; e; e = e->next)
903 	sz += sizeof (bitmap_element);
904       register_overhead (to, sz);
905     }
906 
907   *to = *from;
908 
909   if (GATHER_STATISTICS)
910     release_overhead (from, sz, false);
911 }
912 
913 /* Clear a single bit in a bitmap.  Return true if the bit changed.  */
914 
915 bool
bitmap_clear_bit(bitmap head,int bit)916 bitmap_clear_bit (bitmap head, int bit)
917 {
918   unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
919   bitmap_element *ptr;
920 
921   if (!head->tree_form)
922     ptr = bitmap_list_find_element (head, indx);
923   else
924     ptr = bitmap_tree_find_element (head, indx);
925   if (ptr != 0)
926     {
927       unsigned bit_num  = bit % BITMAP_WORD_BITS;
928       unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
929       BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
930       bool res = (ptr->bits[word_num] & bit_val) != 0;
931       if (res)
932 	{
933 	  ptr->bits[word_num] &= ~bit_val;
934 	  /* If we cleared the entire word, free up the element.  */
935 	  if (!ptr->bits[word_num]
936 	      && bitmap_element_zerop (ptr))
937 	    {
938 	      if (!head->tree_form)
939 		bitmap_list_unlink_element (head, ptr);
940 	      else
941 		bitmap_tree_unlink_element (head, ptr);
942 	    }
943 	}
944 
945       return res;
946     }
947 
948   return false;
949 }
950 
951 /* Set a single bit in a bitmap.  Return true if the bit changed.  */
952 
953 bool
bitmap_set_bit(bitmap head,int bit)954 bitmap_set_bit (bitmap head, int bit)
955 {
956   unsigned indx = bit / BITMAP_ELEMENT_ALL_BITS;
957   bitmap_element *ptr;
958   if (!head->tree_form)
959     ptr = bitmap_list_find_element (head, indx);
960   else
961     ptr = bitmap_tree_find_element (head, indx);
962   unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
963   unsigned bit_num  = bit % BITMAP_WORD_BITS;
964   BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
965 
966   if (ptr != 0)
967     {
968       bool res = (ptr->bits[word_num] & bit_val) == 0;
969       if (res)
970 	ptr->bits[word_num] |= bit_val;
971       return res;
972     }
973 
974   ptr = bitmap_element_allocate (head);
975   ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
976   ptr->bits[word_num] = bit_val;
977   if (!head->tree_form)
978     bitmap_list_link_element (head, ptr);
979   else
980     bitmap_tree_link_element (head, ptr);
981   return true;
982 }
983 
984 /* Return whether a bit is set within a bitmap.  */
985 
986 int
bitmap_bit_p(const_bitmap head,int bit)987 bitmap_bit_p (const_bitmap head, int bit)
988 {
989   unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
990   const bitmap_element *ptr;
991   unsigned bit_num;
992   unsigned word_num;
993 
994   if (!head->tree_form)
995     ptr = bitmap_list_find_element (const_cast<bitmap> (head), indx);
996   else
997     ptr = bitmap_tree_find_element (const_cast<bitmap> (head), indx);
998   if (ptr == 0)
999     return 0;
1000 
1001   bit_num = bit % BITMAP_WORD_BITS;
1002   word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
1003 
1004   return (ptr->bits[word_num] >> bit_num) & 1;
1005 }
1006 
1007 /* Set CHUNK_SIZE bits at a time in bitmap HEAD.
1008    Store CHUNK_VALUE starting at bits CHUNK * chunk_size.
1009    This is the set routine for viewing bitmap as a multi-bit sparse array.  */
1010 
1011 void
bitmap_set_aligned_chunk(bitmap head,unsigned int chunk,unsigned int chunk_size,BITMAP_WORD chunk_value)1012 bitmap_set_aligned_chunk (bitmap head, unsigned int chunk,
1013 			  unsigned int chunk_size, BITMAP_WORD chunk_value)
1014 {
1015   // Ensure chunk size is a power of 2 and fits in BITMAP_WORD.
1016   gcc_checking_assert (pow2p_hwi (chunk_size));
1017   gcc_checking_assert (chunk_size < (sizeof (BITMAP_WORD) * CHAR_BIT));
1018 
1019   // Ensure chunk_value is within range of chunk_size bits.
1020   BITMAP_WORD max_value = (1 << chunk_size) - 1;
1021   gcc_checking_assert (chunk_value <= max_value);
1022 
1023   unsigned bit = chunk * chunk_size;
1024   unsigned indx = bit / BITMAP_ELEMENT_ALL_BITS;
1025   bitmap_element *ptr;
1026   if (!head->tree_form)
1027     ptr = bitmap_list_find_element (head, indx);
1028   else
1029     ptr = bitmap_tree_find_element (head, indx);
1030   unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
1031   unsigned bit_num  = bit % BITMAP_WORD_BITS;
1032   BITMAP_WORD bit_val = chunk_value << bit_num;
1033   BITMAP_WORD mask = ~(max_value << bit_num);
1034 
1035   if (ptr != 0)
1036     {
1037       ptr->bits[word_num] &= mask;
1038       ptr->bits[word_num] |= bit_val;
1039       return;
1040     }
1041 
1042   ptr = bitmap_element_allocate (head);
1043   ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
1044   ptr->bits[word_num] = bit_val;
1045   if (!head->tree_form)
1046     bitmap_list_link_element (head, ptr);
1047   else
1048     bitmap_tree_link_element (head, ptr);
1049 }
1050 
1051 /* This is the get routine for viewing bitmap as a multi-bit sparse array.
1052    Return a set of CHUNK_SIZE consecutive bits from HEAD, starting at bit
1053    CHUNK * chunk_size.   */
1054 
1055 BITMAP_WORD
bitmap_get_aligned_chunk(const_bitmap head,unsigned int chunk,unsigned int chunk_size)1056 bitmap_get_aligned_chunk (const_bitmap head, unsigned int chunk,
1057 			  unsigned int chunk_size)
1058 {
1059   // Ensure chunk size is a power of 2, fits in BITMAP_WORD and is in range.
1060   gcc_checking_assert (pow2p_hwi (chunk_size));
1061   gcc_checking_assert (chunk_size < (sizeof (BITMAP_WORD) * CHAR_BIT));
1062 
1063   BITMAP_WORD max_value = (1 << chunk_size) - 1;
1064   unsigned bit = chunk * chunk_size;
1065   unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
1066   const bitmap_element *ptr;
1067   unsigned bit_num;
1068   unsigned word_num;
1069 
1070   if (!head->tree_form)
1071     ptr = bitmap_list_find_element (const_cast<bitmap> (head), indx);
1072   else
1073     ptr = bitmap_tree_find_element (const_cast<bitmap> (head), indx);
1074   if (ptr == 0)
1075     return 0;
1076 
1077   bit_num = bit % BITMAP_WORD_BITS;
1078   word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
1079 
1080   // Return 4 bits.
1081   return (ptr->bits[word_num] >> bit_num) & max_value;
1082 }
1083 
1084 #if GCC_VERSION < 3400
1085 /* Table of number of set bits in a character, indexed by value of char.  */
1086 static const unsigned char popcount_table[] =
1087 {
1088     0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
1089     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
1090     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
1091     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
1092     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
1093     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
1094     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
1095     3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,
1096 };
1097 
1098 static unsigned long
bitmap_popcount(BITMAP_WORD a)1099 bitmap_popcount (BITMAP_WORD a)
1100 {
1101   unsigned long ret = 0;
1102   unsigned i;
1103 
1104   /* Just do this the table way for now  */
1105   for (i = 0; i < BITMAP_WORD_BITS; i+= 8)
1106     ret += popcount_table[(a >> i) & 0xff];
1107   return ret;
1108 }
1109 #endif
1110 
1111 /* Count and return the number of bits set in the bitmap word BITS.  */
1112 static unsigned long
bitmap_count_bits_in_word(const BITMAP_WORD * bits)1113 bitmap_count_bits_in_word (const BITMAP_WORD *bits)
1114 {
1115   unsigned long count = 0;
1116 
1117   for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1118     {
1119 #if GCC_VERSION >= 3400
1120       /* Note that popcountl matches BITMAP_WORD in type, so the actual size
1121 	 of BITMAP_WORD is not material.  */
1122       count += __builtin_popcountl (bits[ix]);
1123 #else
1124       count += bitmap_popcount (bits[ix]);
1125 #endif
1126     }
1127   return count;
1128 }
1129 
1130 /* Count the number of bits set in the bitmap, and return it.  */
1131 
1132 unsigned long
bitmap_count_bits(const_bitmap a)1133 bitmap_count_bits (const_bitmap a)
1134 {
1135   unsigned long count = 0;
1136   const bitmap_element *elt;
1137 
1138   gcc_checking_assert (!a->tree_form);
1139   for (elt = a->first; elt; elt = elt->next)
1140     count += bitmap_count_bits_in_word (elt->bits);
1141 
1142   return count;
1143 }
1144 
1145 /* Count the number of unique bits set in A and B and return it.  */
1146 
1147 unsigned long
bitmap_count_unique_bits(const_bitmap a,const_bitmap b)1148 bitmap_count_unique_bits (const_bitmap a, const_bitmap b)
1149 {
1150   unsigned long count = 0;
1151   const bitmap_element *elt_a, *elt_b;
1152 
1153   for (elt_a = a->first, elt_b = b->first; elt_a && elt_b; )
1154     {
1155       /* If we're at different indices, then count all the bits
1156 	 in the lower element.  If we're at the same index, then
1157 	 count the bits in the IOR of the two elements.  */
1158       if (elt_a->indx < elt_b->indx)
1159 	{
1160 	  count += bitmap_count_bits_in_word (elt_a->bits);
1161 	  elt_a = elt_a->next;
1162 	}
1163       else if (elt_b->indx < elt_a->indx)
1164 	{
1165 	  count += bitmap_count_bits_in_word (elt_b->bits);
1166 	  elt_b = elt_b->next;
1167 	}
1168       else
1169 	{
1170 	  BITMAP_WORD bits[BITMAP_ELEMENT_WORDS];
1171 	  for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1172 	    bits[ix] = elt_a->bits[ix] | elt_b->bits[ix];
1173 	  count += bitmap_count_bits_in_word (bits);
1174 	  elt_a = elt_a->next;
1175 	  elt_b = elt_b->next;
1176 	}
1177     }
1178   return count;
1179 }
1180 
1181 /* Return true if the bitmap has a single bit set.  Otherwise return
1182    false.  */
1183 
1184 bool
bitmap_single_bit_set_p(const_bitmap a)1185 bitmap_single_bit_set_p (const_bitmap a)
1186 {
1187   unsigned long count = 0;
1188   const bitmap_element *elt;
1189   unsigned ix;
1190 
1191   if (bitmap_empty_p (a))
1192     return false;
1193 
1194   elt = a->first;
1195 
1196   /* As there are no completely empty bitmap elements, a second one
1197      means we have more than one bit set.  */
1198   if (elt->next != NULL
1199       && (!a->tree_form || elt->prev != NULL))
1200     return false;
1201 
1202   for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1203     {
1204 #if GCC_VERSION >= 3400
1205       /* Note that popcountl matches BITMAP_WORD in type, so the actual size
1206 	 of BITMAP_WORD is not material.  */
1207       count += __builtin_popcountl (elt->bits[ix]);
1208 #else
1209       count += bitmap_popcount (elt->bits[ix]);
1210 #endif
1211       if (count > 1)
1212 	return false;
1213     }
1214 
1215   return count == 1;
1216 }
1217 
1218 
1219 /* Return the bit number of the first set bit in the bitmap.  The
1220    bitmap must be non-empty.  */
1221 
1222 unsigned
bitmap_first_set_bit(const_bitmap a)1223 bitmap_first_set_bit (const_bitmap a)
1224 {
1225   const bitmap_element *elt = a->first;
1226   unsigned bit_no;
1227   BITMAP_WORD word;
1228   unsigned ix;
1229 
1230   gcc_checking_assert (elt);
1231 
1232   if (a->tree_form)
1233     while (elt->prev)
1234       elt = elt->prev;
1235 
1236   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
1237   for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1238     {
1239       word = elt->bits[ix];
1240       if (word)
1241 	goto found_bit;
1242     }
1243   gcc_unreachable ();
1244  found_bit:
1245   bit_no += ix * BITMAP_WORD_BITS;
1246 
1247 #if GCC_VERSION >= 3004
1248   gcc_assert (sizeof (long) == sizeof (word));
1249   bit_no += __builtin_ctzl (word);
1250 #else
1251   /* Binary search for the first set bit.  */
1252 #if BITMAP_WORD_BITS > 64
1253 #error "Fill out the table."
1254 #endif
1255 #if BITMAP_WORD_BITS > 32
1256   if (!(word & 0xffffffff))
1257     word >>= 32, bit_no += 32;
1258 #endif
1259   if (!(word & 0xffff))
1260     word >>= 16, bit_no += 16;
1261   if (!(word & 0xff))
1262     word >>= 8, bit_no += 8;
1263   if (!(word & 0xf))
1264     word >>= 4, bit_no += 4;
1265   if (!(word & 0x3))
1266     word >>= 2, bit_no += 2;
1267   if (!(word & 0x1))
1268     word >>= 1, bit_no += 1;
1269 
1270  gcc_checking_assert (word & 1);
1271 #endif
1272  return bit_no;
1273 }
1274 
1275 /* Return the bit number of the first set bit in the bitmap.  The
1276    bitmap must be non-empty.  */
1277 
1278 unsigned
bitmap_last_set_bit(const_bitmap a)1279 bitmap_last_set_bit (const_bitmap a)
1280 {
1281   const bitmap_element *elt;
1282   unsigned bit_no;
1283   BITMAP_WORD word;
1284   int ix;
1285 
1286   if (a->tree_form)
1287     elt = a->first;
1288   else
1289     elt = a->current ? a->current : a->first;
1290   gcc_checking_assert (elt);
1291 
1292   while (elt->next)
1293     elt = elt->next;
1294 
1295   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
1296   for (ix = BITMAP_ELEMENT_WORDS - 1; ix >= 1; ix--)
1297     {
1298       word = elt->bits[ix];
1299       if (word)
1300 	goto found_bit;
1301     }
1302   gcc_assert (elt->bits[ix] != 0);
1303  found_bit:
1304   bit_no += ix * BITMAP_WORD_BITS;
1305 #if GCC_VERSION >= 3004
1306   gcc_assert (sizeof (long) == sizeof (word));
1307   bit_no += BITMAP_WORD_BITS - __builtin_clzl (word) - 1;
1308 #else
1309   /* Hopefully this is a twos-complement host...  */
1310   BITMAP_WORD x = word;
1311   x |= (x >> 1);
1312   x |= (x >> 2);
1313   x |= (x >> 4);
1314   x |= (x >> 8);
1315   x |= (x >> 16);
1316 #if BITMAP_WORD_BITS > 32
1317   x |= (x >> 32);
1318 #endif
1319   bit_no += bitmap_popcount (x) - 1;
1320 #endif
1321 
1322   return bit_no;
1323 }
1324 
1325 
1326 /* DST = A & B.  */
1327 
1328 void
bitmap_and(bitmap dst,const_bitmap a,const_bitmap b)1329 bitmap_and (bitmap dst, const_bitmap a, const_bitmap b)
1330 {
1331   bitmap_element *dst_elt = dst->first;
1332   const bitmap_element *a_elt = a->first;
1333   const bitmap_element *b_elt = b->first;
1334   bitmap_element *dst_prev = NULL;
1335 
1336   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
1337   gcc_assert (dst != a && dst != b);
1338 
1339   if (a == b)
1340     {
1341       bitmap_copy (dst, a);
1342       return;
1343     }
1344 
1345   while (a_elt && b_elt)
1346     {
1347       if (a_elt->indx < b_elt->indx)
1348 	a_elt = a_elt->next;
1349       else if (b_elt->indx < a_elt->indx)
1350 	b_elt = b_elt->next;
1351       else
1352 	{
1353 	  /* Matching elts, generate A & B.  */
1354 	  unsigned ix;
1355 	  BITMAP_WORD ior = 0;
1356 
1357 	  if (!dst_elt)
1358 	    dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1359 							a_elt->indx);
1360 	  else
1361 	    dst_elt->indx = a_elt->indx;
1362 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1363 	    {
1364 	      BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
1365 
1366 	      dst_elt->bits[ix] = r;
1367 	      ior |= r;
1368 	    }
1369 	  if (ior)
1370 	    {
1371 	      dst_prev = dst_elt;
1372 	      dst_elt = dst_elt->next;
1373 	    }
1374 	  a_elt = a_elt->next;
1375 	  b_elt = b_elt->next;
1376 	}
1377     }
1378   /* Ensure that dst->current is valid.  */
1379   dst->current = dst->first;
1380   bitmap_elt_clear_from (dst, dst_elt);
1381   gcc_checking_assert (!dst->current == !dst->first);
1382   if (dst->current)
1383     dst->indx = dst->current->indx;
1384 }
1385 
1386 /* A &= B.  Return true if A changed.  */
1387 
1388 bool
bitmap_and_into(bitmap a,const_bitmap b)1389 bitmap_and_into (bitmap a, const_bitmap b)
1390 {
1391   bitmap_element *a_elt = a->first;
1392   const bitmap_element *b_elt = b->first;
1393   bitmap_element *next;
1394   bool changed = false;
1395 
1396   gcc_checking_assert (!a->tree_form && !b->tree_form);
1397 
1398   if (a == b)
1399     return false;
1400 
1401   while (a_elt && b_elt)
1402     {
1403       if (a_elt->indx < b_elt->indx)
1404 	{
1405 	  next = a_elt->next;
1406 	  bitmap_list_unlink_element (a, a_elt);
1407 	  a_elt = next;
1408 	  changed = true;
1409 	}
1410       else if (b_elt->indx < a_elt->indx)
1411 	b_elt = b_elt->next;
1412       else
1413 	{
1414 	  /* Matching elts, generate A &= B.  */
1415 	  unsigned ix;
1416 	  BITMAP_WORD ior = 0;
1417 
1418 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1419 	    {
1420 	      BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
1421 	      if (a_elt->bits[ix] != r)
1422 		changed = true;
1423 	      a_elt->bits[ix] = r;
1424 	      ior |= r;
1425 	    }
1426 	  next = a_elt->next;
1427 	  if (!ior)
1428 	    bitmap_list_unlink_element (a, a_elt);
1429 	  a_elt = next;
1430 	  b_elt = b_elt->next;
1431 	}
1432     }
1433 
1434   if (a_elt)
1435     {
1436       changed = true;
1437       bitmap_elt_clear_from (a, a_elt);
1438     }
1439 
1440   gcc_checking_assert (!a->current == !a->first
1441 		       && (!a->current || a->indx == a->current->indx));
1442 
1443   return changed;
1444 }
1445 
1446 
1447 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
1448    if non-NULL.  CHANGED is true if the destination bitmap had already been
1449    changed; the new value of CHANGED is returned.  */
1450 
1451 static inline bool
bitmap_elt_copy(bitmap dst,bitmap_element * dst_elt,bitmap_element * dst_prev,const bitmap_element * src_elt,bool changed)1452 bitmap_elt_copy (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
1453 		 const bitmap_element *src_elt, bool changed)
1454 {
1455   if (!changed && dst_elt && dst_elt->indx == src_elt->indx)
1456     {
1457       unsigned ix;
1458 
1459       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1460 	if (src_elt->bits[ix] != dst_elt->bits[ix])
1461 	  {
1462 	    dst_elt->bits[ix] = src_elt->bits[ix];
1463 	    changed = true;
1464 	  }
1465     }
1466   else
1467     {
1468       changed = true;
1469       if (!dst_elt)
1470 	dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1471 						    src_elt->indx);
1472       else
1473 	dst_elt->indx = src_elt->indx;
1474       memcpy (dst_elt->bits, src_elt->bits, sizeof (dst_elt->bits));
1475     }
1476   return changed;
1477 }
1478 
1479 
1480 
1481 /* DST = A & ~B  */
1482 
1483 bool
bitmap_and_compl(bitmap dst,const_bitmap a,const_bitmap b)1484 bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
1485 {
1486   bitmap_element *dst_elt = dst->first;
1487   const bitmap_element *a_elt = a->first;
1488   const bitmap_element *b_elt = b->first;
1489   bitmap_element *dst_prev = NULL;
1490   bitmap_element **dst_prev_pnext = &dst->first;
1491   bool changed = false;
1492 
1493   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
1494   gcc_assert (dst != a && dst != b);
1495 
1496   if (a == b)
1497     {
1498       changed = !bitmap_empty_p (dst);
1499       bitmap_clear (dst);
1500       return changed;
1501     }
1502 
1503   while (a_elt)
1504     {
1505       while (b_elt && b_elt->indx < a_elt->indx)
1506 	b_elt = b_elt->next;
1507 
1508       if (!b_elt || b_elt->indx > a_elt->indx)
1509 	{
1510 	  changed = bitmap_elt_copy (dst, dst_elt, dst_prev, a_elt, changed);
1511 	  dst_prev = *dst_prev_pnext;
1512 	  dst_prev_pnext = &dst_prev->next;
1513 	  dst_elt = *dst_prev_pnext;
1514 	  a_elt = a_elt->next;
1515 	}
1516 
1517       else
1518 	{
1519 	  /* Matching elts, generate A & ~B.  */
1520 	  unsigned ix;
1521 	  BITMAP_WORD ior = 0;
1522 
1523 	  if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1524 	    {
1525 	      for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1526 		{
1527 		  BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1528 
1529 		  if (dst_elt->bits[ix] != r)
1530 		    {
1531 		      changed = true;
1532 		      dst_elt->bits[ix] = r;
1533 		    }
1534 		  ior |= r;
1535 		}
1536 	    }
1537 	  else
1538 	    {
1539 	      bool new_element;
1540 	      if (!dst_elt || dst_elt->indx > a_elt->indx)
1541 		{
1542 		  dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1543 							      a_elt->indx);
1544 		  new_element = true;
1545 		}
1546 	      else
1547 		{
1548 		  dst_elt->indx = a_elt->indx;
1549 		  new_element = false;
1550 		}
1551 
1552 	      for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1553 		{
1554 		  BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1555 
1556 		  dst_elt->bits[ix] = r;
1557 		  ior |= r;
1558 		}
1559 
1560 	      if (ior)
1561 	        changed = true;
1562 	      else
1563 	        {
1564 	          changed |= !new_element;
1565 		  bitmap_list_unlink_element (dst, dst_elt);
1566 		  dst_elt = *dst_prev_pnext;
1567 		}
1568 	    }
1569 
1570 	  if (ior)
1571 	    {
1572 	      dst_prev = *dst_prev_pnext;
1573 	      dst_prev_pnext = &dst_prev->next;
1574 	      dst_elt = *dst_prev_pnext;
1575 	    }
1576 	  a_elt = a_elt->next;
1577 	  b_elt = b_elt->next;
1578 	}
1579     }
1580 
1581   /* Ensure that dst->current is valid.  */
1582   dst->current = dst->first;
1583 
1584   if (dst_elt)
1585     {
1586       changed = true;
1587       bitmap_elt_clear_from (dst, dst_elt);
1588     }
1589   gcc_checking_assert (!dst->current == !dst->first);
1590   if (dst->current)
1591     dst->indx = dst->current->indx;
1592 
1593   return changed;
1594 }
1595 
1596 /* A &= ~B. Returns true if A changes */
1597 
1598 bool
bitmap_and_compl_into(bitmap a,const_bitmap b)1599 bitmap_and_compl_into (bitmap a, const_bitmap b)
1600 {
1601   bitmap_element *a_elt = a->first;
1602   const bitmap_element *b_elt = b->first;
1603   bitmap_element *next;
1604   BITMAP_WORD changed = 0;
1605 
1606   gcc_checking_assert (!a->tree_form && !b->tree_form);
1607 
1608   if (a == b)
1609     {
1610       if (bitmap_empty_p (a))
1611 	return false;
1612       else
1613 	{
1614 	  bitmap_clear (a);
1615 	  return true;
1616 	}
1617     }
1618 
1619   while (a_elt && b_elt)
1620     {
1621       if (a_elt->indx < b_elt->indx)
1622 	a_elt = a_elt->next;
1623       else if (b_elt->indx < a_elt->indx)
1624 	b_elt = b_elt->next;
1625       else
1626 	{
1627 	  /* Matching elts, generate A &= ~B.  */
1628 	  unsigned ix;
1629 	  BITMAP_WORD ior = 0;
1630 
1631 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1632 	    {
1633 	      BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1634 	      BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
1635 
1636 	      a_elt->bits[ix] = r;
1637 	      changed |= cleared;
1638 	      ior |= r;
1639 	    }
1640 	  next = a_elt->next;
1641 	  if (!ior)
1642 	    bitmap_list_unlink_element (a, a_elt);
1643 	  a_elt = next;
1644 	  b_elt = b_elt->next;
1645 	}
1646     }
1647   gcc_checking_assert (!a->current == !a->first
1648 		       && (!a->current || a->indx == a->current->indx));
1649   return changed != 0;
1650 }
1651 
1652 /* Set COUNT bits from START in HEAD.  */
1653 void
bitmap_set_range(bitmap head,unsigned int start,unsigned int count)1654 bitmap_set_range (bitmap head, unsigned int start, unsigned int count)
1655 {
1656   unsigned int first_index, end_bit_plus1, last_index;
1657   bitmap_element *elt, *elt_prev;
1658   unsigned int i;
1659 
1660   gcc_checking_assert (!head->tree_form);
1661 
1662   if (!count)
1663     return;
1664 
1665   if (count == 1)
1666     {
1667       bitmap_set_bit (head, start);
1668       return;
1669     }
1670 
1671   first_index = start / BITMAP_ELEMENT_ALL_BITS;
1672   end_bit_plus1 = start + count;
1673   last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1674   elt = bitmap_list_find_element (head, first_index);
1675 
1676   /* If bitmap_list_find_element returns zero, the current is the closest block
1677      to the result.  Otherwise, just use bitmap_element_allocate to
1678      ensure ELT is set; in the loop below, ELT == NULL means "insert
1679      at the end of the bitmap".  */
1680   if (!elt)
1681     {
1682       elt = bitmap_element_allocate (head);
1683       elt->indx = first_index;
1684       bitmap_list_link_element (head, elt);
1685     }
1686 
1687   gcc_checking_assert (elt->indx == first_index);
1688   elt_prev = elt->prev;
1689   for (i = first_index; i <= last_index; i++)
1690     {
1691       unsigned elt_start_bit = i * BITMAP_ELEMENT_ALL_BITS;
1692       unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1693 
1694       unsigned int first_word_to_mod;
1695       BITMAP_WORD first_mask;
1696       unsigned int last_word_to_mod;
1697       BITMAP_WORD last_mask;
1698       unsigned int ix;
1699 
1700       if (!elt || elt->indx != i)
1701 	elt = bitmap_list_insert_element_after (head, elt_prev, i);
1702 
1703       if (elt_start_bit <= start)
1704 	{
1705 	  /* The first bit to turn on is somewhere inside this
1706 	     elt.  */
1707 	  first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1708 
1709 	  /* This mask should have 1s in all bits >= start position. */
1710 	  first_mask =
1711 	    (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1712 	  first_mask = ~first_mask;
1713 	}
1714       else
1715 	{
1716 	  /* The first bit to turn on is below this start of this elt.  */
1717 	  first_word_to_mod = 0;
1718 	  first_mask = ~(BITMAP_WORD) 0;
1719 	}
1720 
1721       if (elt_end_bit_plus1 <= end_bit_plus1)
1722 	{
1723 	  /* The last bit to turn on is beyond this elt.  */
1724 	  last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1725 	  last_mask = ~(BITMAP_WORD) 0;
1726 	}
1727       else
1728 	{
1729 	  /* The last bit to turn on is inside to this elt.  */
1730 	  last_word_to_mod =
1731 	    (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1732 
1733 	  /* The last mask should have 1s below the end bit.  */
1734 	  last_mask =
1735 	    (((BITMAP_WORD) 1) << ((end_bit_plus1 % BITMAP_WORD_BITS))) - 1;
1736 	}
1737 
1738       if (first_word_to_mod == last_word_to_mod)
1739 	{
1740 	  BITMAP_WORD mask = first_mask & last_mask;
1741 	  elt->bits[first_word_to_mod] |= mask;
1742 	}
1743       else
1744 	{
1745 	  elt->bits[first_word_to_mod] |= first_mask;
1746 	  if (BITMAP_ELEMENT_WORDS > 2)
1747 	    for (ix = first_word_to_mod + 1; ix < last_word_to_mod; ix++)
1748 	      elt->bits[ix] = ~(BITMAP_WORD) 0;
1749 	  elt->bits[last_word_to_mod] |= last_mask;
1750 	}
1751 
1752       elt_prev = elt;
1753       elt = elt->next;
1754     }
1755 
1756   head->current = elt ? elt : elt_prev;
1757   head->indx = head->current->indx;
1758 }
1759 
1760 /* Clear COUNT bits from START in HEAD.  */
1761 void
bitmap_clear_range(bitmap head,unsigned int start,unsigned int count)1762 bitmap_clear_range (bitmap head, unsigned int start, unsigned int count)
1763 {
1764   unsigned int first_index, end_bit_plus1, last_index;
1765   bitmap_element *elt;
1766 
1767   gcc_checking_assert (!head->tree_form);
1768 
1769   if (!count)
1770     return;
1771 
1772   if (count == 1)
1773     {
1774       bitmap_clear_bit (head, start);
1775       return;
1776     }
1777 
1778   first_index = start / BITMAP_ELEMENT_ALL_BITS;
1779   end_bit_plus1 = start + count;
1780   last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1781   elt = bitmap_list_find_element (head, first_index);
1782 
1783   /* If bitmap_list_find_element returns zero, the current is the closest block
1784      to the result.  If the current is less than first index, find the
1785      next one.  Otherwise, just set elt to be current.  */
1786   if (!elt)
1787     {
1788       if (head->current)
1789 	{
1790 	  if (head->indx < first_index)
1791 	    {
1792 	      elt = head->current->next;
1793 	      if (!elt)
1794 		return;
1795 	    }
1796 	  else
1797 	    elt = head->current;
1798 	}
1799       else
1800 	return;
1801     }
1802 
1803   while (elt && (elt->indx <= last_index))
1804     {
1805       bitmap_element * next_elt = elt->next;
1806       unsigned elt_start_bit = (elt->indx) * BITMAP_ELEMENT_ALL_BITS;
1807       unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1808 
1809 
1810       if (elt_start_bit >= start && elt_end_bit_plus1 <= end_bit_plus1)
1811 	/* Get rid of the entire elt and go to the next one.  */
1812 	bitmap_list_unlink_element (head, elt);
1813       else
1814 	{
1815 	  /* Going to have to knock out some bits in this elt.  */
1816 	  unsigned int first_word_to_mod;
1817 	  BITMAP_WORD first_mask;
1818 	  unsigned int last_word_to_mod;
1819 	  BITMAP_WORD last_mask;
1820 	  unsigned int i;
1821 	  bool clear = true;
1822 
1823 	  if (elt_start_bit <= start)
1824 	    {
1825 	      /* The first bit to turn off is somewhere inside this
1826 		 elt.  */
1827 	      first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1828 
1829 	      /* This mask should have 1s in all bits >= start position. */
1830 	      first_mask =
1831 		(((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1832 	      first_mask = ~first_mask;
1833 	    }
1834 	  else
1835 	    {
1836 	      /* The first bit to turn off is below this start of this elt.  */
1837 	      first_word_to_mod = 0;
1838 	      first_mask = 0;
1839 	      first_mask = ~first_mask;
1840 	    }
1841 
1842 	  if (elt_end_bit_plus1 <= end_bit_plus1)
1843 	    {
1844 	      /* The last bit to turn off is beyond this elt.  */
1845 	      last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1846 	      last_mask = 0;
1847 	      last_mask = ~last_mask;
1848 	    }
1849 	  else
1850 	    {
1851 	      /* The last bit to turn off is inside to this elt.  */
1852 	      last_word_to_mod =
1853 		(end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1854 
1855 	      /* The last mask should have 1s below the end bit.  */
1856 	      last_mask =
1857 		(((BITMAP_WORD) 1) << (((end_bit_plus1) % BITMAP_WORD_BITS))) - 1;
1858 	    }
1859 
1860 
1861 	  if (first_word_to_mod == last_word_to_mod)
1862 	    {
1863 	      BITMAP_WORD mask = first_mask & last_mask;
1864 	      elt->bits[first_word_to_mod] &= ~mask;
1865 	    }
1866 	  else
1867 	    {
1868 	      elt->bits[first_word_to_mod] &= ~first_mask;
1869 	      if (BITMAP_ELEMENT_WORDS > 2)
1870 	        for (i = first_word_to_mod + 1; i < last_word_to_mod; i++)
1871 		  elt->bits[i] = 0;
1872 	      elt->bits[last_word_to_mod] &= ~last_mask;
1873 	    }
1874 	  for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1875 	    if (elt->bits[i])
1876 	      {
1877 		clear = false;
1878 		break;
1879 	      }
1880 	  /* Check to see if there are any bits left.  */
1881 	  if (clear)
1882 	    bitmap_list_unlink_element (head, elt);
1883 	}
1884       elt = next_elt;
1885     }
1886 
1887   if (elt)
1888     {
1889       head->current = elt;
1890       head->indx = head->current->indx;
1891     }
1892 }
1893 
1894 /* A = ~A & B. */
1895 
1896 void
bitmap_compl_and_into(bitmap a,const_bitmap b)1897 bitmap_compl_and_into (bitmap a, const_bitmap b)
1898 {
1899   bitmap_element *a_elt = a->first;
1900   const bitmap_element *b_elt = b->first;
1901   bitmap_element *a_prev = NULL;
1902   bitmap_element *next;
1903 
1904   gcc_checking_assert (!a->tree_form && !b->tree_form);
1905   gcc_assert (a != b);
1906 
1907   if (bitmap_empty_p (a))
1908     {
1909       bitmap_copy (a, b);
1910       return;
1911     }
1912   if (bitmap_empty_p (b))
1913     {
1914       bitmap_clear (a);
1915       return;
1916     }
1917 
1918   while (a_elt || b_elt)
1919     {
1920       if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1921 	{
1922 	  /* A is before B.  Remove A */
1923 	  next = a_elt->next;
1924 	  a_prev = a_elt->prev;
1925 	  bitmap_list_unlink_element (a, a_elt);
1926 	  a_elt = next;
1927 	}
1928       else if (!a_elt || b_elt->indx < a_elt->indx)
1929 	{
1930 	  /* B is before A.  Copy B. */
1931 	  next = bitmap_list_insert_element_after (a, a_prev, b_elt->indx);
1932 	  memcpy (next->bits, b_elt->bits, sizeof (next->bits));
1933 	  a_prev = next;
1934 	  b_elt = b_elt->next;
1935 	}
1936       else
1937 	{
1938 	  /* Matching elts, generate A = ~A & B.  */
1939 	  unsigned ix;
1940 	  BITMAP_WORD ior = 0;
1941 
1942 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1943 	    {
1944 	      BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1945 	      BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
1946 
1947 	      a_elt->bits[ix] = r;
1948 	      ior |= r;
1949 	    }
1950 	  next = a_elt->next;
1951 	  if (!ior)
1952 	    bitmap_list_unlink_element (a, a_elt);
1953 	  else
1954 	    a_prev = a_elt;
1955 	  a_elt = next;
1956 	  b_elt = b_elt->next;
1957 	}
1958     }
1959   gcc_checking_assert (!a->current == !a->first
1960 		       && (!a->current || a->indx == a->current->indx));
1961   return;
1962 }
1963 
1964 
1965 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1966    overwriting DST_ELT if non-NULL.  CHANGED is true if the destination bitmap
1967    had already been changed; the new value of CHANGED is returned.  */
1968 
1969 static inline bool
bitmap_elt_ior(bitmap dst,bitmap_element * dst_elt,bitmap_element * dst_prev,const bitmap_element * a_elt,const bitmap_element * b_elt,bool changed)1970 bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
1971 		const bitmap_element *a_elt, const bitmap_element *b_elt,
1972 		bool changed)
1973 {
1974   gcc_assert (a_elt || b_elt);
1975 
1976   if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1977     {
1978       /* Matching elts, generate A | B.  */
1979       unsigned ix;
1980 
1981       if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1982 	{
1983 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1984 	    {
1985 	      BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1986 	      if (r != dst_elt->bits[ix])
1987 		{
1988 		  dst_elt->bits[ix] = r;
1989 		  changed = true;
1990 		}
1991 	    }
1992 	}
1993       else
1994 	{
1995 	  changed = true;
1996 	  if (!dst_elt)
1997 	    dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1998 							a_elt->indx);
1999 	  else
2000 	    dst_elt->indx = a_elt->indx;
2001 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2002 	    {
2003 	      BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
2004 	      dst_elt->bits[ix] = r;
2005 	    }
2006 	}
2007     }
2008   else
2009     {
2010       /* Copy a single element.  */
2011       const bitmap_element *src;
2012 
2013       if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
2014 	src = a_elt;
2015       else
2016 	src = b_elt;
2017 
2018       gcc_checking_assert (src);
2019       changed = bitmap_elt_copy (dst, dst_elt, dst_prev, src, changed);
2020     }
2021   return changed;
2022 }
2023 
2024 
2025 /* DST = A | B.  Return true if DST changes.  */
2026 
2027 bool
bitmap_ior(bitmap dst,const_bitmap a,const_bitmap b)2028 bitmap_ior (bitmap dst, const_bitmap a, const_bitmap b)
2029 {
2030   bitmap_element *dst_elt = dst->first;
2031   const bitmap_element *a_elt = a->first;
2032   const bitmap_element *b_elt = b->first;
2033   bitmap_element *dst_prev = NULL;
2034   bitmap_element **dst_prev_pnext = &dst->first;
2035   bool changed = false;
2036 
2037   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
2038   gcc_assert (dst != a && dst != b);
2039 
2040   while (a_elt || b_elt)
2041     {
2042       changed = bitmap_elt_ior (dst, dst_elt, dst_prev, a_elt, b_elt, changed);
2043 
2044       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
2045 	{
2046 	  a_elt = a_elt->next;
2047 	  b_elt = b_elt->next;
2048 	}
2049       else
2050 	{
2051 	  if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
2052             a_elt = a_elt->next;
2053           else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
2054             b_elt = b_elt->next;
2055 	}
2056 
2057       dst_prev = *dst_prev_pnext;
2058       dst_prev_pnext = &dst_prev->next;
2059       dst_elt = *dst_prev_pnext;
2060     }
2061 
2062   if (dst_elt)
2063     {
2064       changed = true;
2065       /* Ensure that dst->current is valid.  */
2066       dst->current = dst->first;
2067       bitmap_elt_clear_from (dst, dst_elt);
2068     }
2069   gcc_checking_assert (!dst->current == !dst->first);
2070   if (dst->current)
2071     dst->indx = dst->current->indx;
2072   return changed;
2073 }
2074 
2075 /* A |= B.  Return true if A changes.  */
2076 
2077 bool
bitmap_ior_into(bitmap a,const_bitmap b)2078 bitmap_ior_into (bitmap a, const_bitmap b)
2079 {
2080   bitmap_element *a_elt = a->first;
2081   const bitmap_element *b_elt = b->first;
2082   bitmap_element *a_prev = NULL;
2083   bitmap_element **a_prev_pnext = &a->first;
2084   bool changed = false;
2085 
2086   gcc_checking_assert (!a->tree_form && !b->tree_form);
2087   if (a == b)
2088     return false;
2089 
2090   while (b_elt)
2091     {
2092       /* If A lags behind B, just advance it.  */
2093       if (!a_elt || a_elt->indx == b_elt->indx)
2094 	{
2095 	  changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
2096 	  b_elt = b_elt->next;
2097 	}
2098       else if (a_elt->indx > b_elt->indx)
2099 	{
2100           changed = bitmap_elt_copy (a, NULL, a_prev, b_elt, changed);
2101 	  b_elt = b_elt->next;
2102 	}
2103 
2104       a_prev = *a_prev_pnext;
2105       a_prev_pnext = &a_prev->next;
2106       a_elt = *a_prev_pnext;
2107     }
2108 
2109   gcc_checking_assert (!a->current == !a->first);
2110   if (a->current)
2111     a->indx = a->current->indx;
2112   return changed;
2113 }
2114 
2115 /* A |= B.  Return true if A changes.  Free B (re-using its storage
2116    for the result).  */
2117 
2118 bool
bitmap_ior_into_and_free(bitmap a,bitmap * b_)2119 bitmap_ior_into_and_free (bitmap a, bitmap *b_)
2120 {
2121   bitmap b = *b_;
2122   bitmap_element *a_elt = a->first;
2123   bitmap_element *b_elt = b->first;
2124   bitmap_element *a_prev = NULL;
2125   bitmap_element **a_prev_pnext = &a->first;
2126   bool changed = false;
2127 
2128   gcc_checking_assert (!a->tree_form && !b->tree_form);
2129   gcc_assert (a->obstack == b->obstack);
2130   if (a == b)
2131     return false;
2132 
2133   while (b_elt)
2134     {
2135       /* If A lags behind B, just advance it.  */
2136       if (!a_elt || a_elt->indx == b_elt->indx)
2137 	{
2138 	  changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
2139 	  b_elt = b_elt->next;
2140 	}
2141       else if (a_elt->indx > b_elt->indx)
2142 	{
2143 	  bitmap_element *b_elt_next = b_elt->next;
2144 	  bitmap_list_unlink_element (b, b_elt, false);
2145 	  bitmap_list_insert_element_after (a, a_prev, b_elt->indx, b_elt);
2146 	  b_elt = b_elt_next;
2147 	}
2148 
2149       a_prev = *a_prev_pnext;
2150       a_prev_pnext = &a_prev->next;
2151       a_elt = *a_prev_pnext;
2152     }
2153 
2154   gcc_checking_assert (!a->current == !a->first);
2155   if (a->current)
2156     a->indx = a->current->indx;
2157 
2158   if (b->obstack)
2159     BITMAP_FREE (*b_);
2160   else
2161     bitmap_clear (b);
2162   return changed;
2163 }
2164 
2165 /* DST = A ^ B  */
2166 
2167 void
bitmap_xor(bitmap dst,const_bitmap a,const_bitmap b)2168 bitmap_xor (bitmap dst, const_bitmap a, const_bitmap b)
2169 {
2170   bitmap_element *dst_elt = dst->first;
2171   const bitmap_element *a_elt = a->first;
2172   const bitmap_element *b_elt = b->first;
2173   bitmap_element *dst_prev = NULL;
2174 
2175   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
2176   gcc_assert (dst != a && dst != b);
2177 
2178   if (a == b)
2179     {
2180       bitmap_clear (dst);
2181       return;
2182     }
2183 
2184   while (a_elt || b_elt)
2185     {
2186       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
2187 	{
2188 	  /* Matching elts, generate A ^ B.  */
2189 	  unsigned ix;
2190 	  BITMAP_WORD ior = 0;
2191 
2192 	  if (!dst_elt)
2193 	    dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
2194 							a_elt->indx);
2195 	  else
2196 	    dst_elt->indx = a_elt->indx;
2197 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2198 	    {
2199 	      BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
2200 
2201 	      ior |= r;
2202 	      dst_elt->bits[ix] = r;
2203 	    }
2204 	  a_elt = a_elt->next;
2205 	  b_elt = b_elt->next;
2206 	  if (ior)
2207 	    {
2208 	      dst_prev = dst_elt;
2209 	      dst_elt = dst_elt->next;
2210 	    }
2211 	}
2212       else
2213 	{
2214 	  /* Copy a single element.  */
2215 	  const bitmap_element *src;
2216 
2217 	  if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
2218 	    {
2219 	      src = a_elt;
2220 	      a_elt = a_elt->next;
2221 	    }
2222 	  else
2223 	    {
2224 	      src = b_elt;
2225 	      b_elt = b_elt->next;
2226 	    }
2227 
2228 	  if (!dst_elt)
2229 	    dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
2230 							src->indx);
2231 	  else
2232 	    dst_elt->indx = src->indx;
2233 	  memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
2234 	  dst_prev = dst_elt;
2235 	  dst_elt = dst_elt->next;
2236 	}
2237     }
2238   /* Ensure that dst->current is valid.  */
2239   dst->current = dst->first;
2240   bitmap_elt_clear_from (dst, dst_elt);
2241   gcc_checking_assert (!dst->current == !dst->first);
2242   if (dst->current)
2243     dst->indx = dst->current->indx;
2244 }
2245 
2246 /* A ^= B */
2247 
2248 void
bitmap_xor_into(bitmap a,const_bitmap b)2249 bitmap_xor_into (bitmap a, const_bitmap b)
2250 {
2251   bitmap_element *a_elt = a->first;
2252   const bitmap_element *b_elt = b->first;
2253   bitmap_element *a_prev = NULL;
2254 
2255   gcc_checking_assert (!a->tree_form && !b->tree_form);
2256 
2257   if (a == b)
2258     {
2259       bitmap_clear (a);
2260       return;
2261     }
2262 
2263   while (b_elt)
2264     {
2265       if (!a_elt || b_elt->indx < a_elt->indx)
2266 	{
2267 	  /* Copy b_elt.  */
2268 	  bitmap_element *dst = bitmap_list_insert_element_after (a, a_prev,
2269 								  b_elt->indx);
2270 	  memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
2271 	  a_prev = dst;
2272 	  b_elt = b_elt->next;
2273 	}
2274       else if (a_elt->indx < b_elt->indx)
2275 	{
2276 	  a_prev = a_elt;
2277 	  a_elt = a_elt->next;
2278 	}
2279       else
2280 	{
2281 	  /* Matching elts, generate A ^= B.  */
2282 	  unsigned ix;
2283 	  BITMAP_WORD ior = 0;
2284 	  bitmap_element *next = a_elt->next;
2285 
2286 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2287 	    {
2288 	      BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
2289 
2290 	      ior |= r;
2291 	      a_elt->bits[ix] = r;
2292 	    }
2293 	  b_elt = b_elt->next;
2294 	  if (ior)
2295 	    a_prev = a_elt;
2296 	  else
2297 	    bitmap_list_unlink_element (a, a_elt);
2298 	  a_elt = next;
2299 	}
2300     }
2301   gcc_checking_assert (!a->current == !a->first);
2302   if (a->current)
2303     a->indx = a->current->indx;
2304 }
2305 
2306 /* Return true if two bitmaps are identical.
2307    We do not bother with a check for pointer equality, as that never
2308    occurs in practice.  */
2309 
2310 bool
bitmap_equal_p(const_bitmap a,const_bitmap b)2311 bitmap_equal_p (const_bitmap a, const_bitmap b)
2312 {
2313   const bitmap_element *a_elt;
2314   const bitmap_element *b_elt;
2315   unsigned ix;
2316 
2317   gcc_checking_assert (!a->tree_form && !b->tree_form);
2318 
2319   for (a_elt = a->first, b_elt = b->first;
2320        a_elt && b_elt;
2321        a_elt = a_elt->next, b_elt = b_elt->next)
2322     {
2323       if (a_elt->indx != b_elt->indx)
2324 	return false;
2325       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2326 	if (a_elt->bits[ix] != b_elt->bits[ix])
2327 	  return false;
2328     }
2329   return !a_elt && !b_elt;
2330 }
2331 
2332 /* Return true if A AND B is not empty.  */
2333 
2334 bool
bitmap_intersect_p(const_bitmap a,const_bitmap b)2335 bitmap_intersect_p (const_bitmap a, const_bitmap b)
2336 {
2337   const bitmap_element *a_elt;
2338   const bitmap_element *b_elt;
2339   unsigned ix;
2340 
2341   gcc_checking_assert (!a->tree_form && !b->tree_form);
2342 
2343   for (a_elt = a->first, b_elt = b->first;
2344        a_elt && b_elt;)
2345     {
2346       if (a_elt->indx < b_elt->indx)
2347 	a_elt = a_elt->next;
2348       else if (b_elt->indx < a_elt->indx)
2349 	b_elt = b_elt->next;
2350       else
2351 	{
2352 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2353 	    if (a_elt->bits[ix] & b_elt->bits[ix])
2354 	      return true;
2355 	  a_elt = a_elt->next;
2356 	  b_elt = b_elt->next;
2357 	}
2358     }
2359   return false;
2360 }
2361 
2362 /* Return true if A AND NOT B is not empty.  */
2363 
2364 bool
bitmap_intersect_compl_p(const_bitmap a,const_bitmap b)2365 bitmap_intersect_compl_p (const_bitmap a, const_bitmap b)
2366 {
2367   const bitmap_element *a_elt;
2368   const bitmap_element *b_elt;
2369   unsigned ix;
2370 
2371   gcc_checking_assert (!a->tree_form && !b->tree_form);
2372 
2373   for (a_elt = a->first, b_elt = b->first;
2374        a_elt && b_elt;)
2375     {
2376       if (a_elt->indx < b_elt->indx)
2377 	return true;
2378       else if (b_elt->indx < a_elt->indx)
2379 	b_elt = b_elt->next;
2380       else
2381 	{
2382 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2383 	    if (a_elt->bits[ix] & ~b_elt->bits[ix])
2384 	      return true;
2385 	  a_elt = a_elt->next;
2386 	  b_elt = b_elt->next;
2387 	}
2388     }
2389   return a_elt != NULL;
2390 }
2391 
2392 
2393 /* DST = A | (FROM1 & ~FROM2).  Return true if DST changes.  */
2394 
2395 bool
bitmap_ior_and_compl(bitmap dst,const_bitmap a,const_bitmap b,const_bitmap kill)2396 bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b, const_bitmap kill)
2397 {
2398   bool changed = false;
2399 
2400   bitmap_element *dst_elt = dst->first;
2401   const bitmap_element *a_elt = a->first;
2402   const bitmap_element *b_elt = b->first;
2403   const bitmap_element *kill_elt = kill->first;
2404   bitmap_element *dst_prev = NULL;
2405   bitmap_element **dst_prev_pnext = &dst->first;
2406 
2407   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form
2408 		       && !kill->tree_form);
2409   gcc_assert (dst != a && dst != b && dst != kill);
2410 
2411   /* Special cases.  We don't bother checking for bitmap_equal_p (b, kill).  */
2412   if (b == kill || bitmap_empty_p (b))
2413     {
2414       changed = !bitmap_equal_p (dst, a);
2415       if (changed)
2416 	bitmap_copy (dst, a);
2417       return changed;
2418     }
2419   if (bitmap_empty_p (kill))
2420     return bitmap_ior (dst, a, b);
2421   if (bitmap_empty_p (a))
2422     return bitmap_and_compl (dst, b, kill);
2423 
2424   while (a_elt || b_elt)
2425     {
2426       bool new_element = false;
2427 
2428       if (b_elt)
2429 	while (kill_elt && kill_elt->indx < b_elt->indx)
2430 	  kill_elt = kill_elt->next;
2431 
2432       if (b_elt && kill_elt && kill_elt->indx == b_elt->indx
2433 	  && (!a_elt || a_elt->indx >= b_elt->indx))
2434         {
2435 	  bitmap_element tmp_elt;
2436 	  unsigned ix;
2437 
2438 	  BITMAP_WORD ior = 0;
2439 	  tmp_elt.indx = b_elt->indx;
2440 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2441             {
2442               BITMAP_WORD r = b_elt->bits[ix] & ~kill_elt->bits[ix];
2443               ior |= r;
2444               tmp_elt.bits[ix] = r;
2445             }
2446 
2447 	  if (ior)
2448 	    {
2449 	      changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
2450 				        a_elt, &tmp_elt, changed);
2451 	      new_element = true;
2452 	      if (a_elt && a_elt->indx == b_elt->indx)
2453                 a_elt = a_elt->next;
2454 	    }
2455 
2456 	  b_elt = b_elt->next;
2457 	  kill_elt = kill_elt->next;
2458 	}
2459       else
2460 	{
2461 	  changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
2462 				    a_elt, b_elt, changed);
2463 	  new_element = true;
2464 
2465           if (a_elt && b_elt && a_elt->indx == b_elt->indx)
2466 	    {
2467 	      a_elt = a_elt->next;
2468 	      b_elt = b_elt->next;
2469 	    }
2470           else
2471 	    {
2472 	      if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
2473                 a_elt = a_elt->next;
2474               else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
2475                 b_elt = b_elt->next;
2476 	    }
2477 	}
2478 
2479       if (new_element)
2480 	{
2481 	  dst_prev = *dst_prev_pnext;
2482 	  dst_prev_pnext = &dst_prev->next;
2483 	  dst_elt = *dst_prev_pnext;
2484 	}
2485     }
2486 
2487   if (dst_elt)
2488     {
2489       changed = true;
2490       /* Ensure that dst->current is valid.  */
2491       dst->current = dst->first;
2492       bitmap_elt_clear_from (dst, dst_elt);
2493     }
2494   gcc_checking_assert (!dst->current == !dst->first);
2495   if (dst->current)
2496     dst->indx = dst->current->indx;
2497 
2498   return changed;
2499 }
2500 
2501 /* A |= (B & ~C).  Return true if A changes.  */
2502 
2503 bool
bitmap_ior_and_compl_into(bitmap a,const_bitmap b,const_bitmap c)2504 bitmap_ior_and_compl_into (bitmap a, const_bitmap b, const_bitmap c)
2505 {
2506   bitmap_element *a_elt = a->first;
2507   const bitmap_element *b_elt = b->first;
2508   const bitmap_element *c_elt = c->first;
2509   bitmap_element and_elt;
2510   bitmap_element *a_prev = NULL;
2511   bitmap_element **a_prev_pnext = &a->first;
2512   bool changed = false;
2513   unsigned ix;
2514 
2515   gcc_checking_assert (!a->tree_form && !b->tree_form && !c->tree_form);
2516 
2517   if (a == b)
2518     return false;
2519   if (bitmap_empty_p (c))
2520     return bitmap_ior_into (a, b);
2521   else if (bitmap_empty_p (a))
2522     return bitmap_and_compl (a, b, c);
2523 
2524   and_elt.indx = -1;
2525   while (b_elt)
2526     {
2527       /* Advance C.  */
2528       while (c_elt && c_elt->indx < b_elt->indx)
2529 	c_elt = c_elt->next;
2530 
2531       const bitmap_element *and_elt_ptr;
2532       if (c_elt && c_elt->indx == b_elt->indx)
2533 	{
2534 	  BITMAP_WORD overall = 0;
2535 	  and_elt_ptr = &and_elt;
2536 	  and_elt.indx = b_elt->indx;
2537 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2538 	    {
2539 	      and_elt.bits[ix] = b_elt->bits[ix] & ~c_elt->bits[ix];
2540 	      overall |= and_elt.bits[ix];
2541 	    }
2542 	  if (!overall)
2543 	    {
2544 	      b_elt = b_elt->next;
2545 	      continue;
2546 	    }
2547 	}
2548       else
2549 	and_elt_ptr = b_elt;
2550 
2551       b_elt = b_elt->next;
2552 
2553       /* Now find a place to insert AND_ELT.  */
2554       do
2555 	{
2556 	  ix = a_elt ? a_elt->indx : and_elt_ptr->indx;
2557           if (ix == and_elt_ptr->indx)
2558 	    changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt,
2559 				      and_elt_ptr, changed);
2560           else if (ix > and_elt_ptr->indx)
2561 	    changed = bitmap_elt_copy (a, NULL, a_prev, and_elt_ptr, changed);
2562 
2563           a_prev = *a_prev_pnext;
2564           a_prev_pnext = &a_prev->next;
2565           a_elt = *a_prev_pnext;
2566 
2567           /* If A lagged behind B/C, we advanced it so loop once more.  */
2568 	}
2569       while (ix < and_elt_ptr->indx);
2570     }
2571 
2572   gcc_checking_assert (!a->current == !a->first);
2573   if (a->current)
2574     a->indx = a->current->indx;
2575   return changed;
2576 }
2577 
2578 /* A |= (B & C).  Return true if A changes.  */
2579 
2580 bool
bitmap_ior_and_into(bitmap a,const_bitmap b,const_bitmap c)2581 bitmap_ior_and_into (bitmap a, const_bitmap b, const_bitmap c)
2582 {
2583   bitmap_element *a_elt = a->first;
2584   const bitmap_element *b_elt = b->first;
2585   const bitmap_element *c_elt = c->first;
2586   bitmap_element and_elt;
2587   bitmap_element *a_prev = NULL;
2588   bitmap_element **a_prev_pnext = &a->first;
2589   bool changed = false;
2590   unsigned ix;
2591 
2592   gcc_checking_assert (!a->tree_form && !b->tree_form && !c->tree_form);
2593 
2594   if (b == c)
2595     return bitmap_ior_into (a, b);
2596   if (bitmap_empty_p (b) || bitmap_empty_p (c))
2597     return false;
2598 
2599   and_elt.indx = -1;
2600   while (b_elt && c_elt)
2601     {
2602       BITMAP_WORD overall;
2603 
2604       /* Find a common item of B and C.  */
2605       while (b_elt->indx != c_elt->indx)
2606 	{
2607           if (b_elt->indx < c_elt->indx)
2608 	    {
2609 	      b_elt = b_elt->next;
2610 	      if (!b_elt)
2611 		goto done;
2612 	    }
2613           else
2614 	    {
2615 	      c_elt = c_elt->next;
2616 	      if (!c_elt)
2617 		goto done;
2618 	    }
2619 	}
2620 
2621       overall = 0;
2622       and_elt.indx = b_elt->indx;
2623       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2624 	{
2625 	  and_elt.bits[ix] = b_elt->bits[ix] & c_elt->bits[ix];
2626 	  overall |= and_elt.bits[ix];
2627 	}
2628 
2629       b_elt = b_elt->next;
2630       c_elt = c_elt->next;
2631       if (!overall)
2632 	continue;
2633 
2634       /* Now find a place to insert AND_ELT.  */
2635       do
2636 	{
2637 	  ix = a_elt ? a_elt->indx : and_elt.indx;
2638           if (ix == and_elt.indx)
2639 	    changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, &and_elt, changed);
2640           else if (ix > and_elt.indx)
2641 	    changed = bitmap_elt_copy (a, NULL, a_prev, &and_elt, changed);
2642 
2643           a_prev = *a_prev_pnext;
2644           a_prev_pnext = &a_prev->next;
2645           a_elt = *a_prev_pnext;
2646 
2647           /* If A lagged behind B/C, we advanced it so loop once more.  */
2648 	}
2649       while (ix < and_elt.indx);
2650     }
2651 
2652  done:
2653   gcc_checking_assert (!a->current == !a->first);
2654   if (a->current)
2655     a->indx = a->current->indx;
2656   return changed;
2657 }
2658 
2659 /* Compute hash of bitmap (for purposes of hashing).  */
2660 
2661 hashval_t
bitmap_hash(const_bitmap head)2662 bitmap_hash (const_bitmap head)
2663 {
2664   const bitmap_element *ptr;
2665   BITMAP_WORD hash = 0;
2666   int ix;
2667 
2668   gcc_checking_assert (!head->tree_form);
2669 
2670   for (ptr = head->first; ptr; ptr = ptr->next)
2671     {
2672       hash ^= ptr->indx;
2673       for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
2674 	hash ^= ptr->bits[ix];
2675     }
2676   return (hashval_t)hash;
2677 }
2678 
2679 
2680 /* Function to obtain a vector of bitmap elements in bit order from
2681    HEAD in tree view.  */
2682 
2683 static void
bitmap_tree_to_vec(vec<bitmap_element * > & elts,const_bitmap head)2684 bitmap_tree_to_vec (vec<bitmap_element *> &elts, const_bitmap head)
2685 {
2686   gcc_checking_assert (head->tree_form);
2687   auto_vec<bitmap_element *, 32> stack;
2688   bitmap_element *e = head->first;
2689   while (true)
2690     {
2691       while (e != NULL)
2692 	{
2693 	  stack.safe_push (e);
2694 	  e = e->prev;
2695 	}
2696       if (stack.is_empty ())
2697 	break;
2698 
2699       e = stack.pop ();
2700       elts.safe_push (e);
2701       e = e->next;
2702     }
2703 }
2704 
2705 /* Debugging function to print out the contents of a bitmap element.  */
2706 
2707 DEBUG_FUNCTION void
debug_bitmap_elt_file(FILE * file,const bitmap_element * ptr)2708 debug_bitmap_elt_file (FILE *file, const bitmap_element *ptr)
2709 {
2710   unsigned int i, j, col = 26;
2711 
2712   fprintf (file, "\t" HOST_PTR_PRINTF " next = " HOST_PTR_PRINTF
2713 	   " prev = " HOST_PTR_PRINTF " indx = %u\n\t\tbits = {",
2714 	   (const void*) ptr, (const void*) ptr->next,
2715 	   (const void*) ptr->prev, ptr->indx);
2716 
2717   for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
2718     for (j = 0; j < BITMAP_WORD_BITS; j++)
2719       if ((ptr->bits[i] >> j) & 1)
2720 	{
2721 	  if (col > 70)
2722 	    {
2723 	      fprintf (file, "\n\t\t\t");
2724 	      col = 24;
2725 	    }
2726 
2727 	  fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
2728 				 + i * BITMAP_WORD_BITS + j));
2729 	  col += 4;
2730 	}
2731 
2732   fprintf (file, " }\n");
2733 }
2734 
2735 /* Debugging function to print out the contents of a bitmap.  */
2736 
2737 DEBUG_FUNCTION void
debug_bitmap_file(FILE * file,const_bitmap head)2738 debug_bitmap_file (FILE *file, const_bitmap head)
2739 {
2740   const bitmap_element *ptr;
2741 
2742   fprintf (file, "\nfirst = " HOST_PTR_PRINTF
2743 	   " current = " HOST_PTR_PRINTF " indx = %u\n",
2744 	   (void *) head->first, (void *) head->current, head->indx);
2745 
2746   if (head->tree_form)
2747     {
2748       auto_vec<bitmap_element *, 32> elts;
2749       bitmap_tree_to_vec (elts, head);
2750       for (unsigned i = 0; i < elts.length (); ++i)
2751 	debug_bitmap_elt_file (file, elts[i]);
2752     }
2753   else
2754     for (ptr = head->first; ptr; ptr = ptr->next)
2755       debug_bitmap_elt_file (file, ptr);
2756 }
2757 
2758 /* Function to be called from the debugger to print the contents
2759    of a bitmap.  */
2760 
2761 DEBUG_FUNCTION void
debug_bitmap(const_bitmap head)2762 debug_bitmap (const_bitmap head)
2763 {
2764   debug_bitmap_file (stderr, head);
2765 }
2766 
2767 /* Function to print out the contents of a bitmap.  Unlike debug_bitmap_file,
2768    it does not print anything but the bits.  */
2769 
2770 DEBUG_FUNCTION void
bitmap_print(FILE * file,const_bitmap head,const char * prefix,const char * suffix)2771 bitmap_print (FILE *file, const_bitmap head, const char *prefix,
2772 	      const char *suffix)
2773 {
2774   const char *comma = "";
2775   unsigned i;
2776 
2777   fputs (prefix, file);
2778   if (head->tree_form)
2779     {
2780       auto_vec<bitmap_element *, 32> elts;
2781       bitmap_tree_to_vec (elts, head);
2782       for (i = 0; i < elts.length (); ++i)
2783 	for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ++ix)
2784 	  {
2785 	    BITMAP_WORD word = elts[i]->bits[ix];
2786 	    for (unsigned bit = 0; bit != BITMAP_WORD_BITS; ++bit)
2787 	      if (word & ((BITMAP_WORD)1 << bit))
2788 		{
2789 		  fprintf (file, "%s%d", comma,
2790 			   (bit + BITMAP_WORD_BITS * ix
2791 			    + elts[i]->indx * BITMAP_ELEMENT_ALL_BITS));
2792 		  comma = ", ";
2793 		}
2794 	  }
2795     }
2796   else
2797     {
2798       bitmap_iterator bi;
2799       EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
2800 	{
2801 	  fprintf (file, "%s%d", comma, i);
2802 	  comma = ", ";
2803 	}
2804     }
2805   fputs (suffix, file);
2806 }
2807 
2808 /* Output per-bitmap memory usage statistics.  */
2809 void
dump_bitmap_statistics(void)2810 dump_bitmap_statistics (void)
2811 {
2812   if (!GATHER_STATISTICS)
2813     return;
2814 
2815   bitmap_mem_desc.dump (BITMAP_ORIGIN);
2816 }
2817 
2818 DEBUG_FUNCTION void
debug(const bitmap_head & ref)2819 debug (const bitmap_head &ref)
2820 {
2821   dump_bitmap (stderr, &ref);
2822 }
2823 
2824 DEBUG_FUNCTION void
debug(const bitmap_head * ptr)2825 debug (const bitmap_head *ptr)
2826 {
2827   if (ptr)
2828     debug (*ptr);
2829   else
2830     fprintf (stderr, "<nil>\n");
2831 }
2832 
2833 void
dump()2834 bitmap_head::dump ()
2835 {
2836   debug (this);
2837 }
2838 
2839 #if CHECKING_P
2840 
2841 namespace selftest {
2842 
2843 /* Selftests for bitmaps.  */
2844 
2845 /* Freshly-created bitmaps ought to be empty.  */
2846 
2847 static void
test_gc_alloc()2848 test_gc_alloc ()
2849 {
2850   bitmap b = bitmap_gc_alloc ();
2851   ASSERT_TRUE (bitmap_empty_p (b));
2852 }
2853 
2854 /* Verify bitmap_set_range.  */
2855 
2856 static void
test_set_range()2857 test_set_range ()
2858 {
2859   bitmap b = bitmap_gc_alloc ();
2860   ASSERT_TRUE (bitmap_empty_p (b));
2861 
2862   bitmap_set_range (b, 7, 5);
2863   ASSERT_FALSE (bitmap_empty_p (b));
2864   ASSERT_EQ (5, bitmap_count_bits (b));
2865 
2866   /* Verify bitmap_bit_p at the boundaries.  */
2867   ASSERT_FALSE (bitmap_bit_p (b, 6));
2868   ASSERT_TRUE (bitmap_bit_p (b, 7));
2869   ASSERT_TRUE (bitmap_bit_p (b, 11));
2870   ASSERT_FALSE (bitmap_bit_p (b, 12));
2871 }
2872 
2873 /* Verify splitting a range into two pieces using bitmap_clear_bit.  */
2874 
2875 static void
test_clear_bit_in_middle()2876 test_clear_bit_in_middle ()
2877 {
2878   bitmap b = bitmap_gc_alloc ();
2879 
2880   /* Set b to [100..200].  */
2881   bitmap_set_range (b, 100, 100);
2882   ASSERT_EQ (100, bitmap_count_bits (b));
2883 
2884   /* Clear a bit in the middle.  */
2885   bool changed = bitmap_clear_bit (b, 150);
2886   ASSERT_TRUE (changed);
2887   ASSERT_EQ (99, bitmap_count_bits (b));
2888   ASSERT_TRUE (bitmap_bit_p (b, 149));
2889   ASSERT_FALSE (bitmap_bit_p (b, 150));
2890   ASSERT_TRUE (bitmap_bit_p (b, 151));
2891 }
2892 
2893 /* Verify bitmap_copy.  */
2894 
2895 static void
test_copying()2896 test_copying ()
2897 {
2898   bitmap src = bitmap_gc_alloc ();
2899   bitmap_set_range (src, 40, 10);
2900 
2901   bitmap dst = bitmap_gc_alloc ();
2902   ASSERT_FALSE (bitmap_equal_p (src, dst));
2903   bitmap_copy (dst, src);
2904   ASSERT_TRUE (bitmap_equal_p (src, dst));
2905 
2906   /* Verify that we can make them unequal again...  */
2907   bitmap_set_range (src, 70, 5);
2908   ASSERT_FALSE (bitmap_equal_p (src, dst));
2909 
2910   /* ...and that changing src after the copy didn't affect
2911      the other: */
2912   ASSERT_FALSE (bitmap_bit_p (dst, 70));
2913 }
2914 
2915 /* Verify bitmap_single_bit_set_p.  */
2916 
2917 static void
test_bitmap_single_bit_set_p()2918 test_bitmap_single_bit_set_p ()
2919 {
2920   bitmap b = bitmap_gc_alloc ();
2921 
2922   ASSERT_FALSE (bitmap_single_bit_set_p (b));
2923 
2924   bitmap_set_range (b, 42, 1);
2925   ASSERT_TRUE (bitmap_single_bit_set_p (b));
2926   ASSERT_EQ (42, bitmap_first_set_bit (b));
2927 
2928   bitmap_set_range (b, 1066, 1);
2929   ASSERT_FALSE (bitmap_single_bit_set_p (b));
2930   ASSERT_EQ (42, bitmap_first_set_bit (b));
2931 
2932   bitmap_clear_range (b, 0, 100);
2933   ASSERT_TRUE (bitmap_single_bit_set_p (b));
2934   ASSERT_EQ (1066, bitmap_first_set_bit (b));
2935 }
2936 
2937 /* Verify accessing aligned bit chunks works as expected.  */
2938 
2939 static void
test_aligned_chunk(unsigned num_bits)2940 test_aligned_chunk (unsigned num_bits)
2941 {
2942   bitmap b = bitmap_gc_alloc ();
2943   int limit = 2 ^ num_bits;
2944 
2945   int index = 3;
2946   for (int x = 0; x < limit; x++)
2947     {
2948       bitmap_set_aligned_chunk (b, index, num_bits, (BITMAP_WORD) x);
2949       ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b, index, num_bits) == x);
2950       ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b, index + 1,
2951 						   num_bits) == 0);
2952       ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b, index - 1,
2953 						   num_bits) == 0);
2954       index += 3;
2955     }
2956   index = 3;
2957   for (int x = 0; x < limit ; x++)
2958     {
2959       ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b, index, num_bits) == x);
2960       index += 3;
2961     }
2962 }
2963 
2964 /* Run all of the selftests within this file.  */
2965 
2966 void
bitmap_c_tests()2967 bitmap_c_tests ()
2968 {
2969   test_gc_alloc ();
2970   test_set_range ();
2971   test_clear_bit_in_middle ();
2972   test_copying ();
2973   test_bitmap_single_bit_set_p ();
2974   /* Test 2, 4 and 8 bit aligned chunks.  */
2975   test_aligned_chunk (2);
2976   test_aligned_chunk (4);
2977   test_aligned_chunk (8);
2978 }
2979 
2980 } // namespace selftest
2981 #endif /* CHECKING_P */
2982 
2983 #include "gt-bitmap.h"
2984