x86: Enable FMA in rsqrt<mode>2 expander
[platform/upstream/gcc.git] / gcc / bitmap.c
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
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
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
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 \f
74 /* Bitmap memory management.  */
75
76 /* Add ELT to the appropriate freelist.  */
77 static inline void
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 *
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
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 \f
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
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 *
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 \f
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
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
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
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
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 *
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
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
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 *
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 \f
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 *
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
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
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 \f
705 /* Clear a bitmap by freeing all its elements.  */
706
707 void
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 \f
724 /* Initialize a bitmap obstack.  If BIT_OBSTACK is NULL, initialize
725    the default bitmap obstack.  */
726
727 void
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
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
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
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
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 \f
827 /* Return nonzero if all bits in an element are zero.  */
828
829 static inline int
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 \f
845 /* Copy a bitmap to another bitmap.  */
846
847 void
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
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 \f
908 /* Clear a single bit in a bitmap.  Return true if the bit changed.  */
909
910 bool
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
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
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 \f
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
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
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
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
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
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
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
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 \f
1243
1244 /* DST = A & B.  */
1245
1246 void
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 \f
2311 /* DST = A | (FROM1 & ~FROM2).  Return true if DST changes.  */
2312
2313 bool
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
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
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
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 \f
2598 /* Function to obtain a vector of bitmap elements in bit order from
2599    HEAD in tree view.  */
2600
2601 static void
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
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
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
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
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
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
2737 debug (const bitmap_head &ref)
2738 {
2739   dump_bitmap (stderr, &ref);
2740 }
2741
2742 DEBUG_FUNCTION void
2743 debug (const bitmap_head *ptr)
2744 {
2745   if (ptr)
2746     debug (*ptr);
2747   else
2748     fprintf (stderr, "<nil>\n");
2749 }
2750
2751 void
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
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
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
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
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
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
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"