1 /* Functions to support general ended bitmaps.
2    Copyright (C) 1997-2020 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 }
682 
683 /* Convert bitmap HEAD from linked-list view to splay-tree view.
684    This is simply a matter of dropping the prev or next pointers
685    and setting the tree_form flag.  The tree will balance itself
686    if and when it is used.  */
687 
688 void
bitmap_tree_view(bitmap head)689 bitmap_tree_view (bitmap head)
690 {
691   bitmap_element *ptr;
692 
693   gcc_assert (! head->tree_form);
694 
695   ptr = head->first;
696   while (ptr)
697     {
698       ptr->prev = NULL;
699       ptr = ptr->next;
700     }
701 
702   head->tree_form = true;
703 }
704 
705 /* Clear a bitmap by freeing all its elements.  */
706 
707 void
bitmap_clear(bitmap head)708 bitmap_clear (bitmap head)
709 {
710   if (head->first == NULL)
711     return;
712   if (head->tree_form)
713     {
714       bitmap_element *e, *t;
715       for (e = head->first; e->prev; e = e->prev)
716 	/* Loop to find the element with the smallest index.  */ ;
717       t = bitmap_tree_splay (head, head->first, e->indx);
718       gcc_checking_assert (t == e);
719       head->first = t;
720     }
721   bitmap_elt_clear_from (head, head->first);
722 }
723 
724 /* Initialize a bitmap obstack.  If BIT_OBSTACK is NULL, initialize
725    the default bitmap obstack.  */
726 
727 void
bitmap_obstack_initialize(bitmap_obstack * bit_obstack)728 bitmap_obstack_initialize (bitmap_obstack *bit_obstack)
729 {
730   if (!bit_obstack)
731     {
732       if (bitmap_default_obstack_depth++)
733 	return;
734       bit_obstack = &bitmap_default_obstack;
735     }
736 
737 #if !defined(__GNUC__) || (__GNUC__ < 2)
738 #define __alignof__(type) 0
739 #endif
740 
741   bit_obstack->elements = NULL;
742   bit_obstack->heads = NULL;
743   obstack_specify_allocation (&bit_obstack->obstack, OBSTACK_CHUNK_SIZE,
744 			      __alignof__ (bitmap_element),
745 			      obstack_chunk_alloc,
746 			      obstack_chunk_free);
747 }
748 
749 /* Release the memory from a bitmap obstack.  If BIT_OBSTACK is NULL,
750    release the default bitmap obstack.  */
751 
752 void
bitmap_obstack_release(bitmap_obstack * bit_obstack)753 bitmap_obstack_release (bitmap_obstack *bit_obstack)
754 {
755   if (!bit_obstack)
756     {
757       if (--bitmap_default_obstack_depth)
758 	{
759 	  gcc_assert (bitmap_default_obstack_depth > 0);
760 	  return;
761 	}
762       bit_obstack = &bitmap_default_obstack;
763     }
764 
765   bit_obstack->elements = NULL;
766   bit_obstack->heads = NULL;
767   obstack_free (&bit_obstack->obstack, NULL);
768 }
769 
770 /* Create a new bitmap on an obstack.  If BIT_OBSTACK is NULL, create
771    it on the default bitmap obstack.  */
772 
773 bitmap
bitmap_alloc(bitmap_obstack * bit_obstack MEM_STAT_DECL)774 bitmap_alloc (bitmap_obstack *bit_obstack MEM_STAT_DECL)
775 {
776   bitmap map;
777 
778   if (!bit_obstack)
779     bit_obstack = &bitmap_default_obstack;
780   map = bit_obstack->heads;
781   if (map)
782     bit_obstack->heads = (class bitmap_head *) map->first;
783   else
784     map = XOBNEW (&bit_obstack->obstack, bitmap_head);
785   bitmap_initialize (map, bit_obstack PASS_MEM_STAT);
786 
787   if (GATHER_STATISTICS)
788     register_overhead (map, sizeof (bitmap_head));
789 
790   return map;
791 }
792 
793 /* Create a new GCd bitmap.  */
794 
795 bitmap
bitmap_gc_alloc(ALONE_MEM_STAT_DECL)796 bitmap_gc_alloc (ALONE_MEM_STAT_DECL)
797 {
798   bitmap map;
799 
800   map = ggc_alloc<bitmap_head> ();
801   bitmap_initialize (map, NULL PASS_MEM_STAT);
802 
803   if (GATHER_STATISTICS)
804     register_overhead (map, sizeof (bitmap_head));
805 
806   return map;
807 }
808 
809 /* Release an obstack allocated bitmap.  */
810 
811 void
bitmap_obstack_free(bitmap map)812 bitmap_obstack_free (bitmap map)
813 {
814   if (map)
815     {
816       bitmap_clear (map);
817       map->first = (bitmap_element *) map->obstack->heads;
818 
819       if (GATHER_STATISTICS)
820 	release_overhead (map, sizeof (bitmap_head), true);
821 
822       map->obstack->heads = map;
823     }
824 }
825 
826 
827 /* Return nonzero if all bits in an element are zero.  */
828 
829 static inline int
bitmap_element_zerop(const bitmap_element * element)830 bitmap_element_zerop (const bitmap_element *element)
831 {
832 #if BITMAP_ELEMENT_WORDS == 2
833   return (element->bits[0] | element->bits[1]) == 0;
834 #else
835   unsigned i;
836 
837   for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
838     if (element->bits[i] != 0)
839       return 0;
840 
841   return 1;
842 #endif
843 }
844 
845 /* Copy a bitmap to another bitmap.  */
846 
847 void
bitmap_copy(bitmap to,const_bitmap from)848 bitmap_copy (bitmap to, const_bitmap from)
849 {
850   const bitmap_element *from_ptr;
851   bitmap_element *to_ptr = 0;
852 
853   gcc_checking_assert (!to->tree_form && !from->tree_form);
854 
855   bitmap_clear (to);
856 
857   /* Copy elements in forward direction one at a time.  */
858   for (from_ptr = from->first; from_ptr; from_ptr = from_ptr->next)
859     {
860       bitmap_element *to_elt = bitmap_element_allocate (to);
861 
862       to_elt->indx = from_ptr->indx;
863       memcpy (to_elt->bits, from_ptr->bits, sizeof (to_elt->bits));
864 
865       /* Here we have a special case of bitmap_list_link_element,
866          for the case where we know the links are being entered
867 	 in sequence.  */
868       if (to_ptr == 0)
869 	{
870 	  to->first = to->current = to_elt;
871 	  to->indx = from_ptr->indx;
872 	  to_elt->next = to_elt->prev = 0;
873 	}
874       else
875 	{
876 	  to_elt->prev = to_ptr;
877 	  to_elt->next = 0;
878 	  to_ptr->next = to_elt;
879 	}
880 
881       to_ptr = to_elt;
882     }
883 }
884 
885 /* Move a bitmap to another bitmap.  */
886 
887 void
bitmap_move(bitmap to,bitmap from)888 bitmap_move (bitmap to, bitmap from)
889 {
890   gcc_assert (to->obstack == from->obstack);
891 
892   bitmap_clear (to);
893 
894   size_t sz = 0;
895   if (GATHER_STATISTICS)
896     {
897       for (bitmap_element *e = to->first; e; e = e->next)
898 	sz += sizeof (bitmap_element);
899       register_overhead (to, sz);
900     }
901 
902   *to = *from;
903 
904   if (GATHER_STATISTICS)
905     release_overhead (from, sz, false);
906 }
907 
908 /* Clear a single bit in a bitmap.  Return true if the bit changed.  */
909 
910 bool
bitmap_clear_bit(bitmap head,int bit)911 bitmap_clear_bit (bitmap head, int bit)
912 {
913   unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
914   bitmap_element *ptr;
915 
916   if (!head->tree_form)
917     ptr = bitmap_list_find_element (head, indx);
918   else
919     ptr = bitmap_tree_find_element (head, indx);
920   if (ptr != 0)
921     {
922       unsigned bit_num  = bit % BITMAP_WORD_BITS;
923       unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
924       BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
925       bool res = (ptr->bits[word_num] & bit_val) != 0;
926       if (res)
927 	{
928 	  ptr->bits[word_num] &= ~bit_val;
929 	  /* If we cleared the entire word, free up the element.  */
930 	  if (!ptr->bits[word_num]
931 	      && bitmap_element_zerop (ptr))
932 	    {
933 	      if (!head->tree_form)
934 		bitmap_list_unlink_element (head, ptr);
935 	      else
936 		bitmap_tree_unlink_element (head, ptr);
937 	    }
938 	}
939 
940       return res;
941     }
942 
943   return false;
944 }
945 
946 /* Set a single bit in a bitmap.  Return true if the bit changed.  */
947 
948 bool
bitmap_set_bit(bitmap head,int bit)949 bitmap_set_bit (bitmap head, int bit)
950 {
951   unsigned indx = bit / BITMAP_ELEMENT_ALL_BITS;
952   bitmap_element *ptr;
953   if (!head->tree_form)
954     ptr = bitmap_list_find_element (head, indx);
955   else
956     ptr = bitmap_tree_find_element (head, indx);
957   unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
958   unsigned bit_num  = bit % BITMAP_WORD_BITS;
959   BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
960 
961   if (ptr != 0)
962     {
963       bool res = (ptr->bits[word_num] & bit_val) == 0;
964       if (res)
965 	ptr->bits[word_num] |= bit_val;
966       return res;
967     }
968 
969   ptr = bitmap_element_allocate (head);
970   ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
971   ptr->bits[word_num] = bit_val;
972   if (!head->tree_form)
973     bitmap_list_link_element (head, ptr);
974   else
975     bitmap_tree_link_element (head, ptr);
976   return true;
977 }
978 
979 /* Return whether a bit is set within a bitmap.  */
980 
981 int
bitmap_bit_p(const_bitmap head,int bit)982 bitmap_bit_p (const_bitmap head, int bit)
983 {
984   unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
985   const bitmap_element *ptr;
986   unsigned bit_num;
987   unsigned word_num;
988 
989   if (!head->tree_form)
990     ptr = bitmap_list_find_element (const_cast<bitmap> (head), indx);
991   else
992     ptr = bitmap_tree_find_element (const_cast<bitmap> (head), indx);
993   if (ptr == 0)
994     return 0;
995 
996   bit_num = bit % BITMAP_WORD_BITS;
997   word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
998 
999   return (ptr->bits[word_num] >> bit_num) & 1;
1000 }
1001 
1002 #if GCC_VERSION < 3400
1003 /* Table of number of set bits in a character, indexed by value of char.  */
1004 static const unsigned char popcount_table[] =
1005 {
1006     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,
1007     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,
1008     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,
1009     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,
1010     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,
1011     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,
1012     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,
1013     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,
1014 };
1015 
1016 static unsigned long
bitmap_popcount(BITMAP_WORD a)1017 bitmap_popcount (BITMAP_WORD a)
1018 {
1019   unsigned long ret = 0;
1020   unsigned i;
1021 
1022   /* Just do this the table way for now  */
1023   for (i = 0; i < BITMAP_WORD_BITS; i+= 8)
1024     ret += popcount_table[(a >> i) & 0xff];
1025   return ret;
1026 }
1027 #endif
1028 
1029 /* Count and return the number of bits set in the bitmap word BITS.  */
1030 static unsigned long
bitmap_count_bits_in_word(const BITMAP_WORD * bits)1031 bitmap_count_bits_in_word (const BITMAP_WORD *bits)
1032 {
1033   unsigned long count = 0;
1034 
1035   for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1036     {
1037 #if GCC_VERSION >= 3400
1038       /* Note that popcountl matches BITMAP_WORD in type, so the actual size
1039 	 of BITMAP_WORD is not material.  */
1040       count += __builtin_popcountl (bits[ix]);
1041 #else
1042       count += bitmap_popcount (bits[ix]);
1043 #endif
1044     }
1045   return count;
1046 }
1047 
1048 /* Count the number of bits set in the bitmap, and return it.  */
1049 
1050 unsigned long
bitmap_count_bits(const_bitmap a)1051 bitmap_count_bits (const_bitmap a)
1052 {
1053   unsigned long count = 0;
1054   const bitmap_element *elt;
1055 
1056   gcc_checking_assert (!a->tree_form);
1057   for (elt = a->first; elt; elt = elt->next)
1058     count += bitmap_count_bits_in_word (elt->bits);
1059 
1060   return count;
1061 }
1062 
1063 /* Count the number of unique bits set in A and B and return it.  */
1064 
1065 unsigned long
bitmap_count_unique_bits(const_bitmap a,const_bitmap b)1066 bitmap_count_unique_bits (const_bitmap a, const_bitmap b)
1067 {
1068   unsigned long count = 0;
1069   const bitmap_element *elt_a, *elt_b;
1070 
1071   for (elt_a = a->first, elt_b = b->first; elt_a && elt_b; )
1072     {
1073       /* If we're at different indices, then count all the bits
1074 	 in the lower element.  If we're at the same index, then
1075 	 count the bits in the IOR of the two elements.  */
1076       if (elt_a->indx < elt_b->indx)
1077 	{
1078 	  count += bitmap_count_bits_in_word (elt_a->bits);
1079 	  elt_a = elt_a->next;
1080 	}
1081       else if (elt_b->indx < elt_a->indx)
1082 	{
1083 	  count += bitmap_count_bits_in_word (elt_b->bits);
1084 	  elt_b = elt_b->next;
1085 	}
1086       else
1087 	{
1088 	  BITMAP_WORD bits[BITMAP_ELEMENT_WORDS];
1089 	  for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1090 	    bits[ix] = elt_a->bits[ix] | elt_b->bits[ix];
1091 	  count += bitmap_count_bits_in_word (bits);
1092 	  elt_a = elt_a->next;
1093 	  elt_b = elt_b->next;
1094 	}
1095     }
1096   return count;
1097 }
1098 
1099 /* Return true if the bitmap has a single bit set.  Otherwise return
1100    false.  */
1101 
1102 bool
bitmap_single_bit_set_p(const_bitmap a)1103 bitmap_single_bit_set_p (const_bitmap a)
1104 {
1105   unsigned long count = 0;
1106   const bitmap_element *elt;
1107   unsigned ix;
1108 
1109   if (bitmap_empty_p (a))
1110     return false;
1111 
1112   elt = a->first;
1113 
1114   /* As there are no completely empty bitmap elements, a second one
1115      means we have more than one bit set.  */
1116   if (elt->next != NULL
1117       && (!a->tree_form || elt->prev != NULL))
1118     return false;
1119 
1120   for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1121     {
1122 #if GCC_VERSION >= 3400
1123       /* Note that popcountl matches BITMAP_WORD in type, so the actual size
1124 	 of BITMAP_WORD is not material.  */
1125       count += __builtin_popcountl (elt->bits[ix]);
1126 #else
1127       count += bitmap_popcount (elt->bits[ix]);
1128 #endif
1129       if (count > 1)
1130 	return false;
1131     }
1132 
1133   return count == 1;
1134 }
1135 
1136 
1137 /* Return the bit number of the first set bit in the bitmap.  The
1138    bitmap must be non-empty.  */
1139 
1140 unsigned
bitmap_first_set_bit(const_bitmap a)1141 bitmap_first_set_bit (const_bitmap a)
1142 {
1143   const bitmap_element *elt = a->first;
1144   unsigned bit_no;
1145   BITMAP_WORD word;
1146   unsigned ix;
1147 
1148   gcc_checking_assert (elt);
1149 
1150   if (a->tree_form)
1151     while (elt->prev)
1152       elt = elt->prev;
1153 
1154   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
1155   for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1156     {
1157       word = elt->bits[ix];
1158       if (word)
1159 	goto found_bit;
1160     }
1161   gcc_unreachable ();
1162  found_bit:
1163   bit_no += ix * BITMAP_WORD_BITS;
1164 
1165 #if GCC_VERSION >= 3004
1166   gcc_assert (sizeof (long) == sizeof (word));
1167   bit_no += __builtin_ctzl (word);
1168 #else
1169   /* Binary search for the first set bit.  */
1170 #if BITMAP_WORD_BITS > 64
1171 #error "Fill out the table."
1172 #endif
1173 #if BITMAP_WORD_BITS > 32
1174   if (!(word & 0xffffffff))
1175     word >>= 32, bit_no += 32;
1176 #endif
1177   if (!(word & 0xffff))
1178     word >>= 16, bit_no += 16;
1179   if (!(word & 0xff))
1180     word >>= 8, bit_no += 8;
1181   if (!(word & 0xf))
1182     word >>= 4, bit_no += 4;
1183   if (!(word & 0x3))
1184     word >>= 2, bit_no += 2;
1185   if (!(word & 0x1))
1186     word >>= 1, bit_no += 1;
1187 
1188  gcc_checking_assert (word & 1);
1189 #endif
1190  return bit_no;
1191 }
1192 
1193 /* Return the bit number of the first set bit in the bitmap.  The
1194    bitmap must be non-empty.  */
1195 
1196 unsigned
bitmap_last_set_bit(const_bitmap a)1197 bitmap_last_set_bit (const_bitmap a)
1198 {
1199   const bitmap_element *elt;
1200   unsigned bit_no;
1201   BITMAP_WORD word;
1202   int ix;
1203 
1204   if (a->tree_form)
1205     elt = a->first;
1206   else
1207     elt = a->current ? a->current : a->first;
1208   gcc_checking_assert (elt);
1209 
1210   while (elt->next)
1211     elt = elt->next;
1212 
1213   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
1214   for (ix = BITMAP_ELEMENT_WORDS - 1; ix >= 1; ix--)
1215     {
1216       word = elt->bits[ix];
1217       if (word)
1218 	goto found_bit;
1219     }
1220   gcc_assert (elt->bits[ix] != 0);
1221  found_bit:
1222   bit_no += ix * BITMAP_WORD_BITS;
1223 #if GCC_VERSION >= 3004
1224   gcc_assert (sizeof (long) == sizeof (word));
1225   bit_no += BITMAP_WORD_BITS - __builtin_clzl (word) - 1;
1226 #else
1227   /* Hopefully this is a twos-complement host...  */
1228   BITMAP_WORD x = word;
1229   x |= (x >> 1);
1230   x |= (x >> 2);
1231   x |= (x >> 4);
1232   x |= (x >> 8);
1233   x |= (x >> 16);
1234 #if BITMAP_WORD_BITS > 32
1235   x |= (x >> 32);
1236 #endif
1237   bit_no += bitmap_popcount (x) - 1;
1238 #endif
1239 
1240   return bit_no;
1241 }
1242 
1243 
1244 /* DST = A & B.  */
1245 
1246 void
bitmap_and(bitmap dst,const_bitmap a,const_bitmap b)1247 bitmap_and (bitmap dst, const_bitmap a, const_bitmap b)
1248 {
1249   bitmap_element *dst_elt = dst->first;
1250   const bitmap_element *a_elt = a->first;
1251   const bitmap_element *b_elt = b->first;
1252   bitmap_element *dst_prev = NULL;
1253 
1254   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
1255   gcc_assert (dst != a && dst != b);
1256 
1257   if (a == b)
1258     {
1259       bitmap_copy (dst, a);
1260       return;
1261     }
1262 
1263   while (a_elt && b_elt)
1264     {
1265       if (a_elt->indx < b_elt->indx)
1266 	a_elt = a_elt->next;
1267       else if (b_elt->indx < a_elt->indx)
1268 	b_elt = b_elt->next;
1269       else
1270 	{
1271 	  /* Matching elts, generate A & B.  */
1272 	  unsigned ix;
1273 	  BITMAP_WORD ior = 0;
1274 
1275 	  if (!dst_elt)
1276 	    dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1277 							a_elt->indx);
1278 	  else
1279 	    dst_elt->indx = a_elt->indx;
1280 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1281 	    {
1282 	      BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
1283 
1284 	      dst_elt->bits[ix] = r;
1285 	      ior |= r;
1286 	    }
1287 	  if (ior)
1288 	    {
1289 	      dst_prev = dst_elt;
1290 	      dst_elt = dst_elt->next;
1291 	    }
1292 	  a_elt = a_elt->next;
1293 	  b_elt = b_elt->next;
1294 	}
1295     }
1296   /* Ensure that dst->current is valid.  */
1297   dst->current = dst->first;
1298   bitmap_elt_clear_from (dst, dst_elt);
1299   gcc_checking_assert (!dst->current == !dst->first);
1300   if (dst->current)
1301     dst->indx = dst->current->indx;
1302 }
1303 
1304 /* A &= B.  Return true if A changed.  */
1305 
1306 bool
bitmap_and_into(bitmap a,const_bitmap b)1307 bitmap_and_into (bitmap a, const_bitmap b)
1308 {
1309   bitmap_element *a_elt = a->first;
1310   const bitmap_element *b_elt = b->first;
1311   bitmap_element *next;
1312   bool changed = false;
1313 
1314   gcc_checking_assert (!a->tree_form && !b->tree_form);
1315 
1316   if (a == b)
1317     return false;
1318 
1319   while (a_elt && b_elt)
1320     {
1321       if (a_elt->indx < b_elt->indx)
1322 	{
1323 	  next = a_elt->next;
1324 	  bitmap_list_unlink_element (a, a_elt);
1325 	  a_elt = next;
1326 	  changed = true;
1327 	}
1328       else if (b_elt->indx < a_elt->indx)
1329 	b_elt = b_elt->next;
1330       else
1331 	{
1332 	  /* Matching elts, generate A &= B.  */
1333 	  unsigned ix;
1334 	  BITMAP_WORD ior = 0;
1335 
1336 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1337 	    {
1338 	      BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
1339 	      if (a_elt->bits[ix] != r)
1340 		changed = true;
1341 	      a_elt->bits[ix] = r;
1342 	      ior |= r;
1343 	    }
1344 	  next = a_elt->next;
1345 	  if (!ior)
1346 	    bitmap_list_unlink_element (a, a_elt);
1347 	  a_elt = next;
1348 	  b_elt = b_elt->next;
1349 	}
1350     }
1351 
1352   if (a_elt)
1353     {
1354       changed = true;
1355       bitmap_elt_clear_from (a, a_elt);
1356     }
1357 
1358   gcc_checking_assert (!a->current == !a->first
1359 		       && (!a->current || a->indx == a->current->indx));
1360 
1361   return changed;
1362 }
1363 
1364 
1365 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
1366    if non-NULL.  CHANGED is true if the destination bitmap had already been
1367    changed; the new value of CHANGED is returned.  */
1368 
1369 static inline bool
bitmap_elt_copy(bitmap dst,bitmap_element * dst_elt,bitmap_element * dst_prev,const bitmap_element * src_elt,bool changed)1370 bitmap_elt_copy (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
1371 		 const bitmap_element *src_elt, bool changed)
1372 {
1373   if (!changed && dst_elt && dst_elt->indx == src_elt->indx)
1374     {
1375       unsigned ix;
1376 
1377       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1378 	if (src_elt->bits[ix] != dst_elt->bits[ix])
1379 	  {
1380 	    dst_elt->bits[ix] = src_elt->bits[ix];
1381 	    changed = true;
1382 	  }
1383     }
1384   else
1385     {
1386       changed = true;
1387       if (!dst_elt)
1388 	dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1389 						    src_elt->indx);
1390       else
1391 	dst_elt->indx = src_elt->indx;
1392       memcpy (dst_elt->bits, src_elt->bits, sizeof (dst_elt->bits));
1393     }
1394   return changed;
1395 }
1396 
1397 
1398 
1399 /* DST = A & ~B  */
1400 
1401 bool
bitmap_and_compl(bitmap dst,const_bitmap a,const_bitmap b)1402 bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
1403 {
1404   bitmap_element *dst_elt = dst->first;
1405   const bitmap_element *a_elt = a->first;
1406   const bitmap_element *b_elt = b->first;
1407   bitmap_element *dst_prev = NULL;
1408   bitmap_element **dst_prev_pnext = &dst->first;
1409   bool changed = false;
1410 
1411   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
1412   gcc_assert (dst != a && dst != b);
1413 
1414   if (a == b)
1415     {
1416       changed = !bitmap_empty_p (dst);
1417       bitmap_clear (dst);
1418       return changed;
1419     }
1420 
1421   while (a_elt)
1422     {
1423       while (b_elt && b_elt->indx < a_elt->indx)
1424 	b_elt = b_elt->next;
1425 
1426       if (!b_elt || b_elt->indx > a_elt->indx)
1427 	{
1428 	  changed = bitmap_elt_copy (dst, dst_elt, dst_prev, a_elt, changed);
1429 	  dst_prev = *dst_prev_pnext;
1430 	  dst_prev_pnext = &dst_prev->next;
1431 	  dst_elt = *dst_prev_pnext;
1432 	  a_elt = a_elt->next;
1433 	}
1434 
1435       else
1436 	{
1437 	  /* Matching elts, generate A & ~B.  */
1438 	  unsigned ix;
1439 	  BITMAP_WORD ior = 0;
1440 
1441 	  if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1442 	    {
1443 	      for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1444 		{
1445 		  BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1446 
1447 		  if (dst_elt->bits[ix] != r)
1448 		    {
1449 		      changed = true;
1450 		      dst_elt->bits[ix] = r;
1451 		    }
1452 		  ior |= r;
1453 		}
1454 	    }
1455 	  else
1456 	    {
1457 	      bool new_element;
1458 	      if (!dst_elt || dst_elt->indx > a_elt->indx)
1459 		{
1460 		  dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1461 							      a_elt->indx);
1462 		  new_element = true;
1463 		}
1464 	      else
1465 		{
1466 		  dst_elt->indx = a_elt->indx;
1467 		  new_element = false;
1468 		}
1469 
1470 	      for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1471 		{
1472 		  BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1473 
1474 		  dst_elt->bits[ix] = r;
1475 		  ior |= r;
1476 		}
1477 
1478 	      if (ior)
1479 	        changed = true;
1480 	      else
1481 	        {
1482 	          changed |= !new_element;
1483 		  bitmap_list_unlink_element (dst, dst_elt);
1484 		  dst_elt = *dst_prev_pnext;
1485 		}
1486 	    }
1487 
1488 	  if (ior)
1489 	    {
1490 	      dst_prev = *dst_prev_pnext;
1491 	      dst_prev_pnext = &dst_prev->next;
1492 	      dst_elt = *dst_prev_pnext;
1493 	    }
1494 	  a_elt = a_elt->next;
1495 	  b_elt = b_elt->next;
1496 	}
1497     }
1498 
1499   /* Ensure that dst->current is valid.  */
1500   dst->current = dst->first;
1501 
1502   if (dst_elt)
1503     {
1504       changed = true;
1505       bitmap_elt_clear_from (dst, dst_elt);
1506     }
1507   gcc_checking_assert (!dst->current == !dst->first);
1508   if (dst->current)
1509     dst->indx = dst->current->indx;
1510 
1511   return changed;
1512 }
1513 
1514 /* A &= ~B. Returns true if A changes */
1515 
1516 bool
bitmap_and_compl_into(bitmap a,const_bitmap b)1517 bitmap_and_compl_into (bitmap a, const_bitmap b)
1518 {
1519   bitmap_element *a_elt = a->first;
1520   const bitmap_element *b_elt = b->first;
1521   bitmap_element *next;
1522   BITMAP_WORD changed = 0;
1523 
1524   gcc_checking_assert (!a->tree_form && !b->tree_form);
1525 
1526   if (a == b)
1527     {
1528       if (bitmap_empty_p (a))
1529 	return false;
1530       else
1531 	{
1532 	  bitmap_clear (a);
1533 	  return true;
1534 	}
1535     }
1536 
1537   while (a_elt && b_elt)
1538     {
1539       if (a_elt->indx < b_elt->indx)
1540 	a_elt = a_elt->next;
1541       else if (b_elt->indx < a_elt->indx)
1542 	b_elt = b_elt->next;
1543       else
1544 	{
1545 	  /* Matching elts, generate A &= ~B.  */
1546 	  unsigned ix;
1547 	  BITMAP_WORD ior = 0;
1548 
1549 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1550 	    {
1551 	      BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1552 	      BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
1553 
1554 	      a_elt->bits[ix] = r;
1555 	      changed |= cleared;
1556 	      ior |= r;
1557 	    }
1558 	  next = a_elt->next;
1559 	  if (!ior)
1560 	    bitmap_list_unlink_element (a, a_elt);
1561 	  a_elt = next;
1562 	  b_elt = b_elt->next;
1563 	}
1564     }
1565   gcc_checking_assert (!a->current == !a->first
1566 		       && (!a->current || a->indx == a->current->indx));
1567   return changed != 0;
1568 }
1569 
1570 /* Set COUNT bits from START in HEAD.  */
1571 void
bitmap_set_range(bitmap head,unsigned int start,unsigned int count)1572 bitmap_set_range (bitmap head, unsigned int start, unsigned int count)
1573 {
1574   unsigned int first_index, end_bit_plus1, last_index;
1575   bitmap_element *elt, *elt_prev;
1576   unsigned int i;
1577 
1578   gcc_checking_assert (!head->tree_form);
1579 
1580   if (!count)
1581     return;
1582 
1583   if (count == 1)
1584     {
1585       bitmap_set_bit (head, start);
1586       return;
1587     }
1588 
1589   first_index = start / BITMAP_ELEMENT_ALL_BITS;
1590   end_bit_plus1 = start + count;
1591   last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1592   elt = bitmap_list_find_element (head, first_index);
1593 
1594   /* If bitmap_list_find_element returns zero, the current is the closest block
1595      to the result.  Otherwise, just use bitmap_element_allocate to
1596      ensure ELT is set; in the loop below, ELT == NULL means "insert
1597      at the end of the bitmap".  */
1598   if (!elt)
1599     {
1600       elt = bitmap_element_allocate (head);
1601       elt->indx = first_index;
1602       bitmap_list_link_element (head, elt);
1603     }
1604 
1605   gcc_checking_assert (elt->indx == first_index);
1606   elt_prev = elt->prev;
1607   for (i = first_index; i <= last_index; i++)
1608     {
1609       unsigned elt_start_bit = i * BITMAP_ELEMENT_ALL_BITS;
1610       unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1611 
1612       unsigned int first_word_to_mod;
1613       BITMAP_WORD first_mask;
1614       unsigned int last_word_to_mod;
1615       BITMAP_WORD last_mask;
1616       unsigned int ix;
1617 
1618       if (!elt || elt->indx != i)
1619 	elt = bitmap_list_insert_element_after (head, elt_prev, i);
1620 
1621       if (elt_start_bit <= start)
1622 	{
1623 	  /* The first bit to turn on is somewhere inside this
1624 	     elt.  */
1625 	  first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1626 
1627 	  /* This mask should have 1s in all bits >= start position. */
1628 	  first_mask =
1629 	    (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1630 	  first_mask = ~first_mask;
1631 	}
1632       else
1633 	{
1634 	  /* The first bit to turn on is below this start of this elt.  */
1635 	  first_word_to_mod = 0;
1636 	  first_mask = ~(BITMAP_WORD) 0;
1637 	}
1638 
1639       if (elt_end_bit_plus1 <= end_bit_plus1)
1640 	{
1641 	  /* The last bit to turn on is beyond this elt.  */
1642 	  last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1643 	  last_mask = ~(BITMAP_WORD) 0;
1644 	}
1645       else
1646 	{
1647 	  /* The last bit to turn on is inside to this elt.  */
1648 	  last_word_to_mod =
1649 	    (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1650 
1651 	  /* The last mask should have 1s below the end bit.  */
1652 	  last_mask =
1653 	    (((BITMAP_WORD) 1) << ((end_bit_plus1 % BITMAP_WORD_BITS))) - 1;
1654 	}
1655 
1656       if (first_word_to_mod == last_word_to_mod)
1657 	{
1658 	  BITMAP_WORD mask = first_mask & last_mask;
1659 	  elt->bits[first_word_to_mod] |= mask;
1660 	}
1661       else
1662 	{
1663 	  elt->bits[first_word_to_mod] |= first_mask;
1664 	  if (BITMAP_ELEMENT_WORDS > 2)
1665 	    for (ix = first_word_to_mod + 1; ix < last_word_to_mod; ix++)
1666 	      elt->bits[ix] = ~(BITMAP_WORD) 0;
1667 	  elt->bits[last_word_to_mod] |= last_mask;
1668 	}
1669 
1670       elt_prev = elt;
1671       elt = elt->next;
1672     }
1673 
1674   head->current = elt ? elt : elt_prev;
1675   head->indx = head->current->indx;
1676 }
1677 
1678 /* Clear COUNT bits from START in HEAD.  */
1679 void
bitmap_clear_range(bitmap head,unsigned int start,unsigned int count)1680 bitmap_clear_range (bitmap head, unsigned int start, unsigned int count)
1681 {
1682   unsigned int first_index, end_bit_plus1, last_index;
1683   bitmap_element *elt;
1684 
1685   gcc_checking_assert (!head->tree_form);
1686 
1687   if (!count)
1688     return;
1689 
1690   if (count == 1)
1691     {
1692       bitmap_clear_bit (head, start);
1693       return;
1694     }
1695 
1696   first_index = start / BITMAP_ELEMENT_ALL_BITS;
1697   end_bit_plus1 = start + count;
1698   last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1699   elt = bitmap_list_find_element (head, first_index);
1700 
1701   /* If bitmap_list_find_element returns zero, the current is the closest block
1702      to the result.  If the current is less than first index, find the
1703      next one.  Otherwise, just set elt to be current.  */
1704   if (!elt)
1705     {
1706       if (head->current)
1707 	{
1708 	  if (head->indx < first_index)
1709 	    {
1710 	      elt = head->current->next;
1711 	      if (!elt)
1712 		return;
1713 	    }
1714 	  else
1715 	    elt = head->current;
1716 	}
1717       else
1718 	return;
1719     }
1720 
1721   while (elt && (elt->indx <= last_index))
1722     {
1723       bitmap_element * next_elt = elt->next;
1724       unsigned elt_start_bit = (elt->indx) * BITMAP_ELEMENT_ALL_BITS;
1725       unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1726 
1727 
1728       if (elt_start_bit >= start && elt_end_bit_plus1 <= end_bit_plus1)
1729 	/* Get rid of the entire elt and go to the next one.  */
1730 	bitmap_list_unlink_element (head, elt);
1731       else
1732 	{
1733 	  /* Going to have to knock out some bits in this elt.  */
1734 	  unsigned int first_word_to_mod;
1735 	  BITMAP_WORD first_mask;
1736 	  unsigned int last_word_to_mod;
1737 	  BITMAP_WORD last_mask;
1738 	  unsigned int i;
1739 	  bool clear = true;
1740 
1741 	  if (elt_start_bit <= start)
1742 	    {
1743 	      /* The first bit to turn off is somewhere inside this
1744 		 elt.  */
1745 	      first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1746 
1747 	      /* This mask should have 1s in all bits >= start position. */
1748 	      first_mask =
1749 		(((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1750 	      first_mask = ~first_mask;
1751 	    }
1752 	  else
1753 	    {
1754 	      /* The first bit to turn off is below this start of this elt.  */
1755 	      first_word_to_mod = 0;
1756 	      first_mask = 0;
1757 	      first_mask = ~first_mask;
1758 	    }
1759 
1760 	  if (elt_end_bit_plus1 <= end_bit_plus1)
1761 	    {
1762 	      /* The last bit to turn off is beyond this elt.  */
1763 	      last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1764 	      last_mask = 0;
1765 	      last_mask = ~last_mask;
1766 	    }
1767 	  else
1768 	    {
1769 	      /* The last bit to turn off is inside to this elt.  */
1770 	      last_word_to_mod =
1771 		(end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1772 
1773 	      /* The last mask should have 1s below the end bit.  */
1774 	      last_mask =
1775 		(((BITMAP_WORD) 1) << (((end_bit_plus1) % BITMAP_WORD_BITS))) - 1;
1776 	    }
1777 
1778 
1779 	  if (first_word_to_mod == last_word_to_mod)
1780 	    {
1781 	      BITMAP_WORD mask = first_mask & last_mask;
1782 	      elt->bits[first_word_to_mod] &= ~mask;
1783 	    }
1784 	  else
1785 	    {
1786 	      elt->bits[first_word_to_mod] &= ~first_mask;
1787 	      if (BITMAP_ELEMENT_WORDS > 2)
1788 	        for (i = first_word_to_mod + 1; i < last_word_to_mod; i++)
1789 		  elt->bits[i] = 0;
1790 	      elt->bits[last_word_to_mod] &= ~last_mask;
1791 	    }
1792 	  for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1793 	    if (elt->bits[i])
1794 	      {
1795 		clear = false;
1796 		break;
1797 	      }
1798 	  /* Check to see if there are any bits left.  */
1799 	  if (clear)
1800 	    bitmap_list_unlink_element (head, elt);
1801 	}
1802       elt = next_elt;
1803     }
1804 
1805   if (elt)
1806     {
1807       head->current = elt;
1808       head->indx = head->current->indx;
1809     }
1810 }
1811 
1812 /* A = ~A & B. */
1813 
1814 void
bitmap_compl_and_into(bitmap a,const_bitmap b)1815 bitmap_compl_and_into (bitmap a, const_bitmap b)
1816 {
1817   bitmap_element *a_elt = a->first;
1818   const bitmap_element *b_elt = b->first;
1819   bitmap_element *a_prev = NULL;
1820   bitmap_element *next;
1821 
1822   gcc_checking_assert (!a->tree_form && !b->tree_form);
1823   gcc_assert (a != b);
1824 
1825   if (bitmap_empty_p (a))
1826     {
1827       bitmap_copy (a, b);
1828       return;
1829     }
1830   if (bitmap_empty_p (b))
1831     {
1832       bitmap_clear (a);
1833       return;
1834     }
1835 
1836   while (a_elt || b_elt)
1837     {
1838       if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1839 	{
1840 	  /* A is before B.  Remove A */
1841 	  next = a_elt->next;
1842 	  a_prev = a_elt->prev;
1843 	  bitmap_list_unlink_element (a, a_elt);
1844 	  a_elt = next;
1845 	}
1846       else if (!a_elt || b_elt->indx < a_elt->indx)
1847 	{
1848 	  /* B is before A.  Copy B. */
1849 	  next = bitmap_list_insert_element_after (a, a_prev, b_elt->indx);
1850 	  memcpy (next->bits, b_elt->bits, sizeof (next->bits));
1851 	  a_prev = next;
1852 	  b_elt = b_elt->next;
1853 	}
1854       else
1855 	{
1856 	  /* Matching elts, generate A = ~A & B.  */
1857 	  unsigned ix;
1858 	  BITMAP_WORD ior = 0;
1859 
1860 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1861 	    {
1862 	      BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1863 	      BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
1864 
1865 	      a_elt->bits[ix] = r;
1866 	      ior |= r;
1867 	    }
1868 	  next = a_elt->next;
1869 	  if (!ior)
1870 	    bitmap_list_unlink_element (a, a_elt);
1871 	  else
1872 	    a_prev = a_elt;
1873 	  a_elt = next;
1874 	  b_elt = b_elt->next;
1875 	}
1876     }
1877   gcc_checking_assert (!a->current == !a->first
1878 		       && (!a->current || a->indx == a->current->indx));
1879   return;
1880 }
1881 
1882 
1883 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1884    overwriting DST_ELT if non-NULL.  CHANGED is true if the destination bitmap
1885    had already been changed; the new value of CHANGED is returned.  */
1886 
1887 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)1888 bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
1889 		const bitmap_element *a_elt, const bitmap_element *b_elt,
1890 		bool changed)
1891 {
1892   gcc_assert (a_elt || b_elt);
1893 
1894   if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1895     {
1896       /* Matching elts, generate A | B.  */
1897       unsigned ix;
1898 
1899       if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1900 	{
1901 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1902 	    {
1903 	      BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1904 	      if (r != dst_elt->bits[ix])
1905 		{
1906 		  dst_elt->bits[ix] = r;
1907 		  changed = true;
1908 		}
1909 	    }
1910 	}
1911       else
1912 	{
1913 	  changed = true;
1914 	  if (!dst_elt)
1915 	    dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1916 							a_elt->indx);
1917 	  else
1918 	    dst_elt->indx = a_elt->indx;
1919 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1920 	    {
1921 	      BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1922 	      dst_elt->bits[ix] = r;
1923 	    }
1924 	}
1925     }
1926   else
1927     {
1928       /* Copy a single element.  */
1929       const bitmap_element *src;
1930 
1931       if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1932 	src = a_elt;
1933       else
1934 	src = b_elt;
1935 
1936       gcc_checking_assert (src);
1937       changed = bitmap_elt_copy (dst, dst_elt, dst_prev, src, changed);
1938     }
1939   return changed;
1940 }
1941 
1942 
1943 /* DST = A | B.  Return true if DST changes.  */
1944 
1945 bool
bitmap_ior(bitmap dst,const_bitmap a,const_bitmap b)1946 bitmap_ior (bitmap dst, const_bitmap a, const_bitmap b)
1947 {
1948   bitmap_element *dst_elt = dst->first;
1949   const bitmap_element *a_elt = a->first;
1950   const bitmap_element *b_elt = b->first;
1951   bitmap_element *dst_prev = NULL;
1952   bitmap_element **dst_prev_pnext = &dst->first;
1953   bool changed = false;
1954 
1955   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
1956   gcc_assert (dst != a && dst != b);
1957 
1958   while (a_elt || b_elt)
1959     {
1960       changed = bitmap_elt_ior (dst, dst_elt, dst_prev, a_elt, b_elt, changed);
1961 
1962       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1963 	{
1964 	  a_elt = a_elt->next;
1965 	  b_elt = b_elt->next;
1966 	}
1967       else
1968 	{
1969 	  if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
1970             a_elt = a_elt->next;
1971           else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
1972             b_elt = b_elt->next;
1973 	}
1974 
1975       dst_prev = *dst_prev_pnext;
1976       dst_prev_pnext = &dst_prev->next;
1977       dst_elt = *dst_prev_pnext;
1978     }
1979 
1980   if (dst_elt)
1981     {
1982       changed = true;
1983       /* Ensure that dst->current is valid.  */
1984       dst->current = dst->first;
1985       bitmap_elt_clear_from (dst, dst_elt);
1986     }
1987   gcc_checking_assert (!dst->current == !dst->first);
1988   if (dst->current)
1989     dst->indx = dst->current->indx;
1990   return changed;
1991 }
1992 
1993 /* A |= B.  Return true if A changes.  */
1994 
1995 bool
bitmap_ior_into(bitmap a,const_bitmap b)1996 bitmap_ior_into (bitmap a, const_bitmap b)
1997 {
1998   bitmap_element *a_elt = a->first;
1999   const bitmap_element *b_elt = b->first;
2000   bitmap_element *a_prev = NULL;
2001   bitmap_element **a_prev_pnext = &a->first;
2002   bool changed = false;
2003 
2004   gcc_checking_assert (!a->tree_form && !b->tree_form);
2005   if (a == b)
2006     return false;
2007 
2008   while (b_elt)
2009     {
2010       /* If A lags behind B, just advance it.  */
2011       if (!a_elt || a_elt->indx == b_elt->indx)
2012 	{
2013 	  changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
2014 	  b_elt = b_elt->next;
2015 	}
2016       else if (a_elt->indx > b_elt->indx)
2017 	{
2018           changed = bitmap_elt_copy (a, NULL, a_prev, b_elt, changed);
2019 	  b_elt = b_elt->next;
2020 	}
2021 
2022       a_prev = *a_prev_pnext;
2023       a_prev_pnext = &a_prev->next;
2024       a_elt = *a_prev_pnext;
2025     }
2026 
2027   gcc_checking_assert (!a->current == !a->first);
2028   if (a->current)
2029     a->indx = a->current->indx;
2030   return changed;
2031 }
2032 
2033 /* A |= B.  Return true if A changes.  Free B (re-using its storage
2034    for the result).  */
2035 
2036 bool
bitmap_ior_into_and_free(bitmap a,bitmap * b_)2037 bitmap_ior_into_and_free (bitmap a, bitmap *b_)
2038 {
2039   bitmap b = *b_;
2040   bitmap_element *a_elt = a->first;
2041   bitmap_element *b_elt = b->first;
2042   bitmap_element *a_prev = NULL;
2043   bitmap_element **a_prev_pnext = &a->first;
2044   bool changed = false;
2045 
2046   gcc_checking_assert (!a->tree_form && !b->tree_form);
2047   gcc_assert (a->obstack == b->obstack);
2048   if (a == b)
2049     return false;
2050 
2051   while (b_elt)
2052     {
2053       /* If A lags behind B, just advance it.  */
2054       if (!a_elt || a_elt->indx == b_elt->indx)
2055 	{
2056 	  changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
2057 	  b_elt = b_elt->next;
2058 	}
2059       else if (a_elt->indx > b_elt->indx)
2060 	{
2061 	  bitmap_element *b_elt_next = b_elt->next;
2062 	  bitmap_list_unlink_element (b, b_elt, false);
2063 	  bitmap_list_insert_element_after (a, a_prev, b_elt->indx, b_elt);
2064 	  b_elt = b_elt_next;
2065 	}
2066 
2067       a_prev = *a_prev_pnext;
2068       a_prev_pnext = &a_prev->next;
2069       a_elt = *a_prev_pnext;
2070     }
2071 
2072   gcc_checking_assert (!a->current == !a->first);
2073   if (a->current)
2074     a->indx = a->current->indx;
2075 
2076   if (b->obstack)
2077     BITMAP_FREE (*b_);
2078   else
2079     bitmap_clear (b);
2080   return changed;
2081 }
2082 
2083 /* DST = A ^ B  */
2084 
2085 void
bitmap_xor(bitmap dst,const_bitmap a,const_bitmap b)2086 bitmap_xor (bitmap dst, const_bitmap a, const_bitmap b)
2087 {
2088   bitmap_element *dst_elt = dst->first;
2089   const bitmap_element *a_elt = a->first;
2090   const bitmap_element *b_elt = b->first;
2091   bitmap_element *dst_prev = NULL;
2092 
2093   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
2094   gcc_assert (dst != a && dst != b);
2095 
2096   if (a == b)
2097     {
2098       bitmap_clear (dst);
2099       return;
2100     }
2101 
2102   while (a_elt || b_elt)
2103     {
2104       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
2105 	{
2106 	  /* Matching elts, generate A ^ B.  */
2107 	  unsigned ix;
2108 	  BITMAP_WORD ior = 0;
2109 
2110 	  if (!dst_elt)
2111 	    dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
2112 							a_elt->indx);
2113 	  else
2114 	    dst_elt->indx = a_elt->indx;
2115 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2116 	    {
2117 	      BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
2118 
2119 	      ior |= r;
2120 	      dst_elt->bits[ix] = r;
2121 	    }
2122 	  a_elt = a_elt->next;
2123 	  b_elt = b_elt->next;
2124 	  if (ior)
2125 	    {
2126 	      dst_prev = dst_elt;
2127 	      dst_elt = dst_elt->next;
2128 	    }
2129 	}
2130       else
2131 	{
2132 	  /* Copy a single element.  */
2133 	  const bitmap_element *src;
2134 
2135 	  if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
2136 	    {
2137 	      src = a_elt;
2138 	      a_elt = a_elt->next;
2139 	    }
2140 	  else
2141 	    {
2142 	      src = b_elt;
2143 	      b_elt = b_elt->next;
2144 	    }
2145 
2146 	  if (!dst_elt)
2147 	    dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
2148 							src->indx);
2149 	  else
2150 	    dst_elt->indx = src->indx;
2151 	  memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
2152 	  dst_prev = dst_elt;
2153 	  dst_elt = dst_elt->next;
2154 	}
2155     }
2156   /* Ensure that dst->current is valid.  */
2157   dst->current = dst->first;
2158   bitmap_elt_clear_from (dst, dst_elt);
2159   gcc_checking_assert (!dst->current == !dst->first);
2160   if (dst->current)
2161     dst->indx = dst->current->indx;
2162 }
2163 
2164 /* A ^= B */
2165 
2166 void
bitmap_xor_into(bitmap a,const_bitmap b)2167 bitmap_xor_into (bitmap a, const_bitmap b)
2168 {
2169   bitmap_element *a_elt = a->first;
2170   const bitmap_element *b_elt = b->first;
2171   bitmap_element *a_prev = NULL;
2172 
2173   gcc_checking_assert (!a->tree_form && !b->tree_form);
2174 
2175   if (a == b)
2176     {
2177       bitmap_clear (a);
2178       return;
2179     }
2180 
2181   while (b_elt)
2182     {
2183       if (!a_elt || b_elt->indx < a_elt->indx)
2184 	{
2185 	  /* Copy b_elt.  */
2186 	  bitmap_element *dst = bitmap_list_insert_element_after (a, a_prev,
2187 								  b_elt->indx);
2188 	  memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
2189 	  a_prev = dst;
2190 	  b_elt = b_elt->next;
2191 	}
2192       else if (a_elt->indx < b_elt->indx)
2193 	{
2194 	  a_prev = a_elt;
2195 	  a_elt = a_elt->next;
2196 	}
2197       else
2198 	{
2199 	  /* Matching elts, generate A ^= B.  */
2200 	  unsigned ix;
2201 	  BITMAP_WORD ior = 0;
2202 	  bitmap_element *next = a_elt->next;
2203 
2204 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2205 	    {
2206 	      BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
2207 
2208 	      ior |= r;
2209 	      a_elt->bits[ix] = r;
2210 	    }
2211 	  b_elt = b_elt->next;
2212 	  if (ior)
2213 	    a_prev = a_elt;
2214 	  else
2215 	    bitmap_list_unlink_element (a, a_elt);
2216 	  a_elt = next;
2217 	}
2218     }
2219   gcc_checking_assert (!a->current == !a->first);
2220   if (a->current)
2221     a->indx = a->current->indx;
2222 }
2223 
2224 /* Return true if two bitmaps are identical.
2225    We do not bother with a check for pointer equality, as that never
2226    occurs in practice.  */
2227 
2228 bool
bitmap_equal_p(const_bitmap a,const_bitmap b)2229 bitmap_equal_p (const_bitmap a, const_bitmap b)
2230 {
2231   const bitmap_element *a_elt;
2232   const bitmap_element *b_elt;
2233   unsigned ix;
2234 
2235   gcc_checking_assert (!a->tree_form && !b->tree_form);
2236 
2237   for (a_elt = a->first, b_elt = b->first;
2238        a_elt && b_elt;
2239        a_elt = a_elt->next, b_elt = b_elt->next)
2240     {
2241       if (a_elt->indx != b_elt->indx)
2242 	return false;
2243       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2244 	if (a_elt->bits[ix] != b_elt->bits[ix])
2245 	  return false;
2246     }
2247   return !a_elt && !b_elt;
2248 }
2249 
2250 /* Return true if A AND B is not empty.  */
2251 
2252 bool
bitmap_intersect_p(const_bitmap a,const_bitmap b)2253 bitmap_intersect_p (const_bitmap a, const_bitmap b)
2254 {
2255   const bitmap_element *a_elt;
2256   const bitmap_element *b_elt;
2257   unsigned ix;
2258 
2259   gcc_checking_assert (!a->tree_form && !b->tree_form);
2260 
2261   for (a_elt = a->first, b_elt = b->first;
2262        a_elt && b_elt;)
2263     {
2264       if (a_elt->indx < b_elt->indx)
2265 	a_elt = a_elt->next;
2266       else if (b_elt->indx < a_elt->indx)
2267 	b_elt = b_elt->next;
2268       else
2269 	{
2270 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2271 	    if (a_elt->bits[ix] & b_elt->bits[ix])
2272 	      return true;
2273 	  a_elt = a_elt->next;
2274 	  b_elt = b_elt->next;
2275 	}
2276     }
2277   return false;
2278 }
2279 
2280 /* Return true if A AND NOT B is not empty.  */
2281 
2282 bool
bitmap_intersect_compl_p(const_bitmap a,const_bitmap b)2283 bitmap_intersect_compl_p (const_bitmap a, const_bitmap b)
2284 {
2285   const bitmap_element *a_elt;
2286   const bitmap_element *b_elt;
2287   unsigned ix;
2288 
2289   gcc_checking_assert (!a->tree_form && !b->tree_form);
2290 
2291   for (a_elt = a->first, b_elt = b->first;
2292        a_elt && b_elt;)
2293     {
2294       if (a_elt->indx < b_elt->indx)
2295 	return true;
2296       else if (b_elt->indx < a_elt->indx)
2297 	b_elt = b_elt->next;
2298       else
2299 	{
2300 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2301 	    if (a_elt->bits[ix] & ~b_elt->bits[ix])
2302 	      return true;
2303 	  a_elt = a_elt->next;
2304 	  b_elt = b_elt->next;
2305 	}
2306     }
2307   return a_elt != NULL;
2308 }
2309 
2310 
2311 /* DST = A | (FROM1 & ~FROM2).  Return true if DST changes.  */
2312 
2313 bool
bitmap_ior_and_compl(bitmap dst,const_bitmap a,const_bitmap b,const_bitmap kill)2314 bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b, const_bitmap kill)
2315 {
2316   bool changed = false;
2317 
2318   bitmap_element *dst_elt = dst->first;
2319   const bitmap_element *a_elt = a->first;
2320   const bitmap_element *b_elt = b->first;
2321   const bitmap_element *kill_elt = kill->first;
2322   bitmap_element *dst_prev = NULL;
2323   bitmap_element **dst_prev_pnext = &dst->first;
2324 
2325   gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form
2326 		       && !kill->tree_form);
2327   gcc_assert (dst != a && dst != b && dst != kill);
2328 
2329   /* Special cases.  We don't bother checking for bitmap_equal_p (b, kill).  */
2330   if (b == kill || bitmap_empty_p (b))
2331     {
2332       changed = !bitmap_equal_p (dst, a);
2333       if (changed)
2334 	bitmap_copy (dst, a);
2335       return changed;
2336     }
2337   if (bitmap_empty_p (kill))
2338     return bitmap_ior (dst, a, b);
2339   if (bitmap_empty_p (a))
2340     return bitmap_and_compl (dst, b, kill);
2341 
2342   while (a_elt || b_elt)
2343     {
2344       bool new_element = false;
2345 
2346       if (b_elt)
2347 	while (kill_elt && kill_elt->indx < b_elt->indx)
2348 	  kill_elt = kill_elt->next;
2349 
2350       if (b_elt && kill_elt && kill_elt->indx == b_elt->indx
2351 	  && (!a_elt || a_elt->indx >= b_elt->indx))
2352         {
2353 	  bitmap_element tmp_elt;
2354 	  unsigned ix;
2355 
2356 	  BITMAP_WORD ior = 0;
2357 	  tmp_elt.indx = b_elt->indx;
2358 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2359             {
2360               BITMAP_WORD r = b_elt->bits[ix] & ~kill_elt->bits[ix];
2361               ior |= r;
2362               tmp_elt.bits[ix] = r;
2363             }
2364 
2365 	  if (ior)
2366 	    {
2367 	      changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
2368 				        a_elt, &tmp_elt, changed);
2369 	      new_element = true;
2370 	      if (a_elt && a_elt->indx == b_elt->indx)
2371                 a_elt = a_elt->next;
2372 	    }
2373 
2374 	  b_elt = b_elt->next;
2375 	  kill_elt = kill_elt->next;
2376 	}
2377       else
2378 	{
2379 	  changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
2380 				    a_elt, b_elt, changed);
2381 	  new_element = true;
2382 
2383           if (a_elt && b_elt && a_elt->indx == b_elt->indx)
2384 	    {
2385 	      a_elt = a_elt->next;
2386 	      b_elt = b_elt->next;
2387 	    }
2388           else
2389 	    {
2390 	      if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
2391                 a_elt = a_elt->next;
2392               else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
2393                 b_elt = b_elt->next;
2394 	    }
2395 	}
2396 
2397       if (new_element)
2398 	{
2399 	  dst_prev = *dst_prev_pnext;
2400 	  dst_prev_pnext = &dst_prev->next;
2401 	  dst_elt = *dst_prev_pnext;
2402 	}
2403     }
2404 
2405   if (dst_elt)
2406     {
2407       changed = true;
2408       /* Ensure that dst->current is valid.  */
2409       dst->current = dst->first;
2410       bitmap_elt_clear_from (dst, dst_elt);
2411     }
2412   gcc_checking_assert (!dst->current == !dst->first);
2413   if (dst->current)
2414     dst->indx = dst->current->indx;
2415 
2416   return changed;
2417 }
2418 
2419 /* A |= (B & ~C).  Return true if A changes.  */
2420 
2421 bool
bitmap_ior_and_compl_into(bitmap a,const_bitmap b,const_bitmap c)2422 bitmap_ior_and_compl_into (bitmap a, const_bitmap b, const_bitmap c)
2423 {
2424   bitmap_element *a_elt = a->first;
2425   const bitmap_element *b_elt = b->first;
2426   const bitmap_element *c_elt = c->first;
2427   bitmap_element and_elt;
2428   bitmap_element *a_prev = NULL;
2429   bitmap_element **a_prev_pnext = &a->first;
2430   bool changed = false;
2431   unsigned ix;
2432 
2433   gcc_checking_assert (!a->tree_form && !b->tree_form && !c->tree_form);
2434 
2435   if (a == b)
2436     return false;
2437   if (bitmap_empty_p (c))
2438     return bitmap_ior_into (a, b);
2439   else if (bitmap_empty_p (a))
2440     return bitmap_and_compl (a, b, c);
2441 
2442   and_elt.indx = -1;
2443   while (b_elt)
2444     {
2445       /* Advance C.  */
2446       while (c_elt && c_elt->indx < b_elt->indx)
2447 	c_elt = c_elt->next;
2448 
2449       const bitmap_element *and_elt_ptr;
2450       if (c_elt && c_elt->indx == b_elt->indx)
2451 	{
2452 	  BITMAP_WORD overall = 0;
2453 	  and_elt_ptr = &and_elt;
2454 	  and_elt.indx = b_elt->indx;
2455 	  for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2456 	    {
2457 	      and_elt.bits[ix] = b_elt->bits[ix] & ~c_elt->bits[ix];
2458 	      overall |= and_elt.bits[ix];
2459 	    }
2460 	  if (!overall)
2461 	    {
2462 	      b_elt = b_elt->next;
2463 	      continue;
2464 	    }
2465 	}
2466       else
2467 	and_elt_ptr = b_elt;
2468 
2469       b_elt = b_elt->next;
2470 
2471       /* Now find a place to insert AND_ELT.  */
2472       do
2473 	{
2474 	  ix = a_elt ? a_elt->indx : and_elt_ptr->indx;
2475           if (ix == and_elt_ptr->indx)
2476 	    changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt,
2477 				      and_elt_ptr, changed);
2478           else if (ix > and_elt_ptr->indx)
2479 	    changed = bitmap_elt_copy (a, NULL, a_prev, and_elt_ptr, changed);
2480 
2481           a_prev = *a_prev_pnext;
2482           a_prev_pnext = &a_prev->next;
2483           a_elt = *a_prev_pnext;
2484 
2485           /* If A lagged behind B/C, we advanced it so loop once more.  */
2486 	}
2487       while (ix < and_elt_ptr->indx);
2488     }
2489 
2490   gcc_checking_assert (!a->current == !a->first);
2491   if (a->current)
2492     a->indx = a->current->indx;
2493   return changed;
2494 }
2495 
2496 /* A |= (B & C).  Return true if A changes.  */
2497 
2498 bool
bitmap_ior_and_into(bitmap a,const_bitmap b,const_bitmap c)2499 bitmap_ior_and_into (bitmap a, const_bitmap b, const_bitmap c)
2500 {
2501   bitmap_element *a_elt = a->first;
2502   const bitmap_element *b_elt = b->first;
2503   const bitmap_element *c_elt = c->first;
2504   bitmap_element and_elt;
2505   bitmap_element *a_prev = NULL;
2506   bitmap_element **a_prev_pnext = &a->first;
2507   bool changed = false;
2508   unsigned ix;
2509 
2510   gcc_checking_assert (!a->tree_form && !b->tree_form && !c->tree_form);
2511 
2512   if (b == c)
2513     return bitmap_ior_into (a, b);
2514   if (bitmap_empty_p (b) || bitmap_empty_p (c))
2515     return false;
2516 
2517   and_elt.indx = -1;
2518   while (b_elt && c_elt)
2519     {
2520       BITMAP_WORD overall;
2521 
2522       /* Find a common item of B and C.  */
2523       while (b_elt->indx != c_elt->indx)
2524 	{
2525           if (b_elt->indx < c_elt->indx)
2526 	    {
2527 	      b_elt = b_elt->next;
2528 	      if (!b_elt)
2529 		goto done;
2530 	    }
2531           else
2532 	    {
2533 	      c_elt = c_elt->next;
2534 	      if (!c_elt)
2535 		goto done;
2536 	    }
2537 	}
2538 
2539       overall = 0;
2540       and_elt.indx = b_elt->indx;
2541       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2542 	{
2543 	  and_elt.bits[ix] = b_elt->bits[ix] & c_elt->bits[ix];
2544 	  overall |= and_elt.bits[ix];
2545 	}
2546 
2547       b_elt = b_elt->next;
2548       c_elt = c_elt->next;
2549       if (!overall)
2550 	continue;
2551 
2552       /* Now find a place to insert AND_ELT.  */
2553       do
2554 	{
2555 	  ix = a_elt ? a_elt->indx : and_elt.indx;
2556           if (ix == and_elt.indx)
2557 	    changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, &and_elt, changed);
2558           else if (ix > and_elt.indx)
2559 	    changed = bitmap_elt_copy (a, NULL, a_prev, &and_elt, changed);
2560 
2561           a_prev = *a_prev_pnext;
2562           a_prev_pnext = &a_prev->next;
2563           a_elt = *a_prev_pnext;
2564 
2565           /* If A lagged behind B/C, we advanced it so loop once more.  */
2566 	}
2567       while (ix < and_elt.indx);
2568     }
2569 
2570  done:
2571   gcc_checking_assert (!a->current == !a->first);
2572   if (a->current)
2573     a->indx = a->current->indx;
2574   return changed;
2575 }
2576 
2577 /* Compute hash of bitmap (for purposes of hashing).  */
2578 
2579 hashval_t
bitmap_hash(const_bitmap head)2580 bitmap_hash (const_bitmap head)
2581 {
2582   const bitmap_element *ptr;
2583   BITMAP_WORD hash = 0;
2584   int ix;
2585 
2586   gcc_checking_assert (!head->tree_form);
2587 
2588   for (ptr = head->first; ptr; ptr = ptr->next)
2589     {
2590       hash ^= ptr->indx;
2591       for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
2592 	hash ^= ptr->bits[ix];
2593     }
2594   return (hashval_t)hash;
2595 }
2596 
2597 
2598 /* Function to obtain a vector of bitmap elements in bit order from
2599    HEAD in tree view.  */
2600 
2601 static void
bitmap_tree_to_vec(vec<bitmap_element * > & elts,const_bitmap head)2602 bitmap_tree_to_vec (vec<bitmap_element *> &elts, const_bitmap head)
2603 {
2604   gcc_checking_assert (head->tree_form);
2605   auto_vec<bitmap_element *, 32> stack;
2606   bitmap_element *e = head->first;
2607   while (true)
2608     {
2609       while (e != NULL)
2610 	{
2611 	  stack.safe_push (e);
2612 	  e = e->prev;
2613 	}
2614       if (stack.is_empty ())
2615 	break;
2616 
2617       e = stack.pop ();
2618       elts.safe_push (e);
2619       e = e->next;
2620     }
2621 }
2622 
2623 /* Debugging function to print out the contents of a bitmap element.  */
2624 
2625 DEBUG_FUNCTION void
debug_bitmap_elt_file(FILE * file,const bitmap_element * ptr)2626 debug_bitmap_elt_file (FILE *file, const bitmap_element *ptr)
2627 {
2628   unsigned int i, j, col = 26;
2629 
2630   fprintf (file, "\t" HOST_PTR_PRINTF " next = " HOST_PTR_PRINTF
2631 	   " prev = " HOST_PTR_PRINTF " indx = %u\n\t\tbits = {",
2632 	   (const void*) ptr, (const void*) ptr->next,
2633 	   (const void*) ptr->prev, ptr->indx);
2634 
2635   for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
2636     for (j = 0; j < BITMAP_WORD_BITS; j++)
2637       if ((ptr->bits[i] >> j) & 1)
2638 	{
2639 	  if (col > 70)
2640 	    {
2641 	      fprintf (file, "\n\t\t\t");
2642 	      col = 24;
2643 	    }
2644 
2645 	  fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
2646 				 + i * BITMAP_WORD_BITS + j));
2647 	  col += 4;
2648 	}
2649 
2650   fprintf (file, " }\n");
2651 }
2652 
2653 /* Debugging function to print out the contents of a bitmap.  */
2654 
2655 DEBUG_FUNCTION void
debug_bitmap_file(FILE * file,const_bitmap head)2656 debug_bitmap_file (FILE *file, const_bitmap head)
2657 {
2658   const bitmap_element *ptr;
2659 
2660   fprintf (file, "\nfirst = " HOST_PTR_PRINTF
2661 	   " current = " HOST_PTR_PRINTF " indx = %u\n",
2662 	   (void *) head->first, (void *) head->current, head->indx);
2663 
2664   if (head->tree_form)
2665     {
2666       auto_vec<bitmap_element *, 32> elts;
2667       bitmap_tree_to_vec (elts, head);
2668       for (unsigned i = 0; i < elts.length (); ++i)
2669 	debug_bitmap_elt_file (file, elts[i]);
2670     }
2671   else
2672     for (ptr = head->first; ptr; ptr = ptr->next)
2673       debug_bitmap_elt_file (file, ptr);
2674 }
2675 
2676 /* Function to be called from the debugger to print the contents
2677    of a bitmap.  */
2678 
2679 DEBUG_FUNCTION void
debug_bitmap(const_bitmap head)2680 debug_bitmap (const_bitmap head)
2681 {
2682   debug_bitmap_file (stderr, head);
2683 }
2684 
2685 /* Function to print out the contents of a bitmap.  Unlike debug_bitmap_file,
2686    it does not print anything but the bits.  */
2687 
2688 DEBUG_FUNCTION void
bitmap_print(FILE * file,const_bitmap head,const char * prefix,const char * suffix)2689 bitmap_print (FILE *file, const_bitmap head, const char *prefix,
2690 	      const char *suffix)
2691 {
2692   const char *comma = "";
2693   unsigned i;
2694 
2695   fputs (prefix, file);
2696   if (head->tree_form)
2697     {
2698       auto_vec<bitmap_element *, 32> elts;
2699       bitmap_tree_to_vec (elts, head);
2700       for (i = 0; i < elts.length (); ++i)
2701 	for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ++ix)
2702 	  {
2703 	    BITMAP_WORD word = elts[i]->bits[ix];
2704 	    for (unsigned bit = 0; bit != BITMAP_WORD_BITS; ++bit)
2705 	      if (word & ((BITMAP_WORD)1 << bit))
2706 		{
2707 		  fprintf (file, "%s%d", comma,
2708 			   (bit + BITMAP_WORD_BITS * ix
2709 			    + elts[i]->indx * BITMAP_ELEMENT_ALL_BITS));
2710 		  comma = ", ";
2711 		}
2712 	  }
2713     }
2714   else
2715     {
2716       bitmap_iterator bi;
2717       EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
2718 	{
2719 	  fprintf (file, "%s%d", comma, i);
2720 	  comma = ", ";
2721 	}
2722     }
2723   fputs (suffix, file);
2724 }
2725 
2726 /* Output per-bitmap memory usage statistics.  */
2727 void
dump_bitmap_statistics(void)2728 dump_bitmap_statistics (void)
2729 {
2730   if (!GATHER_STATISTICS)
2731     return;
2732 
2733   bitmap_mem_desc.dump (BITMAP_ORIGIN);
2734 }
2735 
2736 DEBUG_FUNCTION void
debug(const bitmap_head & ref)2737 debug (const bitmap_head &ref)
2738 {
2739   dump_bitmap (stderr, &ref);
2740 }
2741 
2742 DEBUG_FUNCTION void
debug(const bitmap_head * ptr)2743 debug (const bitmap_head *ptr)
2744 {
2745   if (ptr)
2746     debug (*ptr);
2747   else
2748     fprintf (stderr, "<nil>\n");
2749 }
2750 
2751 void
dump()2752 bitmap_head::dump ()
2753 {
2754   debug (this);
2755 }
2756 
2757 #if CHECKING_P
2758 
2759 namespace selftest {
2760 
2761 /* Selftests for bitmaps.  */
2762 
2763 /* Freshly-created bitmaps ought to be empty.  */
2764 
2765 static void
test_gc_alloc()2766 test_gc_alloc ()
2767 {
2768   bitmap b = bitmap_gc_alloc ();
2769   ASSERT_TRUE (bitmap_empty_p (b));
2770 }
2771 
2772 /* Verify bitmap_set_range.  */
2773 
2774 static void
test_set_range()2775 test_set_range ()
2776 {
2777   bitmap b = bitmap_gc_alloc ();
2778   ASSERT_TRUE (bitmap_empty_p (b));
2779 
2780   bitmap_set_range (b, 7, 5);
2781   ASSERT_FALSE (bitmap_empty_p (b));
2782   ASSERT_EQ (5, bitmap_count_bits (b));
2783 
2784   /* Verify bitmap_bit_p at the boundaries.  */
2785   ASSERT_FALSE (bitmap_bit_p (b, 6));
2786   ASSERT_TRUE (bitmap_bit_p (b, 7));
2787   ASSERT_TRUE (bitmap_bit_p (b, 11));
2788   ASSERT_FALSE (bitmap_bit_p (b, 12));
2789 }
2790 
2791 /* Verify splitting a range into two pieces using bitmap_clear_bit.  */
2792 
2793 static void
test_clear_bit_in_middle()2794 test_clear_bit_in_middle ()
2795 {
2796   bitmap b = bitmap_gc_alloc ();
2797 
2798   /* Set b to [100..200].  */
2799   bitmap_set_range (b, 100, 100);
2800   ASSERT_EQ (100, bitmap_count_bits (b));
2801 
2802   /* Clear a bit in the middle.  */
2803   bool changed = bitmap_clear_bit (b, 150);
2804   ASSERT_TRUE (changed);
2805   ASSERT_EQ (99, bitmap_count_bits (b));
2806   ASSERT_TRUE (bitmap_bit_p (b, 149));
2807   ASSERT_FALSE (bitmap_bit_p (b, 150));
2808   ASSERT_TRUE (bitmap_bit_p (b, 151));
2809 }
2810 
2811 /* Verify bitmap_copy.  */
2812 
2813 static void
test_copying()2814 test_copying ()
2815 {
2816   bitmap src = bitmap_gc_alloc ();
2817   bitmap_set_range (src, 40, 10);
2818 
2819   bitmap dst = bitmap_gc_alloc ();
2820   ASSERT_FALSE (bitmap_equal_p (src, dst));
2821   bitmap_copy (dst, src);
2822   ASSERT_TRUE (bitmap_equal_p (src, dst));
2823 
2824   /* Verify that we can make them unequal again...  */
2825   bitmap_set_range (src, 70, 5);
2826   ASSERT_FALSE (bitmap_equal_p (src, dst));
2827 
2828   /* ...and that changing src after the copy didn't affect
2829      the other: */
2830   ASSERT_FALSE (bitmap_bit_p (dst, 70));
2831 }
2832 
2833 /* Verify bitmap_single_bit_set_p.  */
2834 
2835 static void
test_bitmap_single_bit_set_p()2836 test_bitmap_single_bit_set_p ()
2837 {
2838   bitmap b = bitmap_gc_alloc ();
2839 
2840   ASSERT_FALSE (bitmap_single_bit_set_p (b));
2841 
2842   bitmap_set_range (b, 42, 1);
2843   ASSERT_TRUE (bitmap_single_bit_set_p (b));
2844   ASSERT_EQ (42, bitmap_first_set_bit (b));
2845 
2846   bitmap_set_range (b, 1066, 1);
2847   ASSERT_FALSE (bitmap_single_bit_set_p (b));
2848   ASSERT_EQ (42, bitmap_first_set_bit (b));
2849 
2850   bitmap_clear_range (b, 0, 100);
2851   ASSERT_TRUE (bitmap_single_bit_set_p (b));
2852   ASSERT_EQ (1066, bitmap_first_set_bit (b));
2853 }
2854 
2855 /* Run all of the selftests within this file.  */
2856 
2857 void
bitmap_c_tests()2858 bitmap_c_tests ()
2859 {
2860   test_gc_alloc ();
2861   test_set_range ();
2862   test_clear_bit_in_middle ();
2863   test_copying ();
2864   test_bitmap_single_bit_set_p ();
2865 }
2866 
2867 } // namespace selftest
2868 #endif /* CHECKING_P */
2869 
2870 #include "gt-bitmap.h"
2871