gcc50: Disconnect from buildworld.
[dragonfly.git] / contrib / gcc-5.0 / gcc / bitmap.c
1 /* Functions to support general ended bitmaps.
2    Copyright (C) 1997-2015 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 "obstack.h"
24 #include "ggc.h"
25 #include "bitmap.h"
26 #include "hash-table.h"
27 #include "vec.h"
28
29 /* Store information about each particular bitmap, per allocation site.  */
30 struct bitmap_descriptor_d
31 {
32   int id;
33   const char *function;
34   const char *file;
35   int line;
36   int created;
37   uint64_t allocated;
38   uint64_t peak;
39   uint64_t current;
40   uint64_t nsearches;
41   uint64_t search_iter;
42 };
43
44 typedef struct bitmap_descriptor_d *bitmap_descriptor;
45 typedef const struct bitmap_descriptor_d *const_bitmap_descriptor;
46
47 /* Next available unique id number for bitmap desciptors.  */
48 static int next_bitmap_desc_id = 0;
49
50 /* Vector mapping descriptor ids to descriptors.  */
51 static vec<bitmap_descriptor> bitmap_descriptors;
52
53 /* Hashtable helpers.  */
54
55 struct loc
56 {
57   const char *file;
58   const char *function;
59   int line;
60 };
61
62 struct bitmap_desc_hasher : typed_noop_remove <bitmap_descriptor_d>
63 {
64   typedef bitmap_descriptor_d value_type;
65   typedef loc compare_type;
66   static inline hashval_t hash (const value_type *);
67   static inline bool equal (const value_type *, const compare_type *);
68 };
69
70 inline hashval_t
71 bitmap_desc_hasher::hash (const value_type *d)
72 {
73   return htab_hash_pointer (d->file) + d->line;
74 }
75
76 inline bool
77 bitmap_desc_hasher::equal (const value_type *d, const compare_type *l)
78 {
79   return d->file == l->file && d->function == l->function && d->line == l->line;
80 }
81
82 /* Hashtable mapping bitmap names to descriptors.  */
83 static hash_table<bitmap_desc_hasher> *bitmap_desc_hash;
84
85 /* For given file and line, return descriptor, create new if needed.  */
86 static bitmap_descriptor
87 get_bitmap_descriptor (const char *file, int line, const char *function)
88 {
89   bitmap_descriptor_d **slot;
90   struct loc loc;
91
92   loc.file = file;
93   loc.function = function;
94   loc.line = line;
95
96   if (!bitmap_desc_hash)
97     bitmap_desc_hash = new hash_table<bitmap_desc_hasher> (10);
98
99   slot
100     = bitmap_desc_hash->find_slot_with_hash (&loc,
101                                              htab_hash_pointer (file) + line,
102                                              INSERT);
103   if (*slot)
104     return *slot;
105
106   *slot = XCNEW (struct bitmap_descriptor_d);
107   bitmap_descriptors.safe_push (*slot);
108   (*slot)->id = next_bitmap_desc_id++;
109   (*slot)->file = file;
110   (*slot)->function = function;
111   (*slot)->line = line;
112   return *slot;
113 }
114
115 /* Register new bitmap.  */
116 void
117 bitmap_register (bitmap b MEM_STAT_DECL)
118 {
119   bitmap_descriptor desc = get_bitmap_descriptor (ALONE_FINAL_PASS_MEM_STAT);
120   desc->created++;
121   b->descriptor_id = desc->id;
122 }
123
124 /* Account the overhead.  */
125 static void
126 register_overhead (bitmap b, int amount)
127 {
128   bitmap_descriptor desc = bitmap_descriptors[b->descriptor_id];
129   desc->current += amount;
130   if (amount > 0)
131     desc->allocated += amount;
132   if (desc->peak < desc->current)
133     desc->peak = desc->current;
134 }
135
136 /* Global data */
137 bitmap_element bitmap_zero_bits;  /* An element of all zero bits.  */
138 bitmap_obstack bitmap_default_obstack;    /* The default bitmap obstack.  */
139 static int bitmap_default_obstack_depth;
140 static GTY((deletable)) bitmap_element *bitmap_ggc_free; /* Freelist of
141                                                             GC'd elements.  */
142
143 static void bitmap_elem_to_freelist (bitmap, bitmap_element *);
144 static void bitmap_element_free (bitmap, bitmap_element *);
145 static bitmap_element *bitmap_element_allocate (bitmap);
146 static int bitmap_element_zerop (const bitmap_element *);
147 static void bitmap_element_link (bitmap, bitmap_element *);
148 static bitmap_element *bitmap_elt_insert_after (bitmap, bitmap_element *, unsigned int);
149 static void bitmap_elt_clear_from (bitmap, bitmap_element *);
150 static bitmap_element *bitmap_find_bit (bitmap, unsigned int);
151 \f
152
153 /* Add ELEM to the appropriate freelist.  */
154 static inline void
155 bitmap_elem_to_freelist (bitmap head, bitmap_element *elt)
156 {
157   bitmap_obstack *bit_obstack = head->obstack;
158
159   elt->next = NULL;
160   if (bit_obstack)
161     {
162       elt->prev = bit_obstack->elements;
163       bit_obstack->elements = elt;
164     }
165   else
166     {
167       elt->prev = bitmap_ggc_free;
168       bitmap_ggc_free = elt;
169     }
170 }
171
172 /* Free a bitmap element.  Since these are allocated off the
173    bitmap_obstack, "free" actually means "put onto the freelist".  */
174
175 static inline void
176 bitmap_element_free (bitmap head, bitmap_element *elt)
177 {
178   bitmap_element *next = elt->next;
179   bitmap_element *prev = elt->prev;
180
181   if (prev)
182     prev->next = next;
183
184   if (next)
185     next->prev = prev;
186
187   if (head->first == elt)
188     head->first = next;
189
190   /* Since the first thing we try is to insert before current,
191      make current the next entry in preference to the previous.  */
192   if (head->current == elt)
193     {
194       head->current = next != 0 ? next : prev;
195       if (head->current)
196         head->indx = head->current->indx;
197       else
198         head->indx = 0;
199     }
200
201   if (GATHER_STATISTICS)
202     register_overhead (head, -((int)sizeof (bitmap_element)));
203
204   bitmap_elem_to_freelist (head, elt);
205 }
206 \f
207 /* Allocate a bitmap element.  The bits are cleared, but nothing else is.  */
208
209 static inline bitmap_element *
210 bitmap_element_allocate (bitmap head)
211 {
212   bitmap_element *element;
213   bitmap_obstack *bit_obstack = head->obstack;
214
215   if (bit_obstack)
216     {
217       element = bit_obstack->elements;
218
219       if (element)
220         /* Use up the inner list first before looking at the next
221            element of the outer list.  */
222         if (element->next)
223           {
224             bit_obstack->elements = element->next;
225             bit_obstack->elements->prev = element->prev;
226           }
227         else
228           /*  Inner list was just a singleton.  */
229           bit_obstack->elements = element->prev;
230       else
231         element = XOBNEW (&bit_obstack->obstack, bitmap_element);
232     }
233   else
234     {
235       element = bitmap_ggc_free;
236       if (element)
237         /* Use up the inner list first before looking at the next
238            element of the outer list.  */
239         if (element->next)
240           {
241             bitmap_ggc_free = element->next;
242             bitmap_ggc_free->prev = element->prev;
243           }
244         else
245           /*  Inner list was just a singleton.  */
246           bitmap_ggc_free = element->prev;
247       else
248         element = ggc_alloc<bitmap_element> ();
249     }
250
251   if (GATHER_STATISTICS)
252     register_overhead (head, sizeof (bitmap_element));
253
254   memset (element->bits, 0, sizeof (element->bits));
255
256   return element;
257 }
258
259 /* Remove ELT and all following elements from bitmap HEAD.  */
260
261 void
262 bitmap_elt_clear_from (bitmap head, bitmap_element *elt)
263 {
264   bitmap_element *prev;
265   bitmap_obstack *bit_obstack = head->obstack;
266
267   if (!elt) return;
268
269   if (GATHER_STATISTICS)
270     {
271       int n = 0;
272       for (prev = elt; prev; prev = prev->next)
273         n++;
274       register_overhead (head, -sizeof (bitmap_element) * n);
275     }
276
277   prev = elt->prev;
278   if (prev)
279     {
280       prev->next = NULL;
281       if (head->current->indx > prev->indx)
282         {
283           head->current = prev;
284           head->indx = prev->indx;
285         }
286     }
287   else
288     {
289       head->first = NULL;
290       head->current = NULL;
291       head->indx = 0;
292     }
293
294   /* Put the entire list onto the free list in one operation. */
295   if (bit_obstack)
296     {
297       elt->prev = bit_obstack->elements;
298       bit_obstack->elements = elt;
299     }
300   else
301     {
302       elt->prev = bitmap_ggc_free;
303       bitmap_ggc_free = elt;
304     }
305 }
306
307 /* Clear a bitmap by freeing the linked list.  */
308
309 void
310 bitmap_clear (bitmap head)
311 {
312   if (head->first)
313     bitmap_elt_clear_from (head, head->first);
314 }
315 \f
316 /* Initialize a bitmap obstack.  If BIT_OBSTACK is NULL, initialize
317    the default bitmap obstack.  */
318
319 void
320 bitmap_obstack_initialize (bitmap_obstack *bit_obstack)
321 {
322   if (!bit_obstack)
323     {
324       if (bitmap_default_obstack_depth++)
325         return;
326       bit_obstack = &bitmap_default_obstack;
327     }
328
329 #if !defined(__GNUC__) || (__GNUC__ < 2)
330 #define __alignof__(type) 0
331 #endif
332
333   bit_obstack->elements = NULL;
334   bit_obstack->heads = NULL;
335   obstack_specify_allocation (&bit_obstack->obstack, OBSTACK_CHUNK_SIZE,
336                               __alignof__ (bitmap_element),
337                               obstack_chunk_alloc,
338                               obstack_chunk_free);
339 }
340
341 /* Release the memory from a bitmap obstack.  If BIT_OBSTACK is NULL,
342    release the default bitmap obstack.  */
343
344 void
345 bitmap_obstack_release (bitmap_obstack *bit_obstack)
346 {
347   if (!bit_obstack)
348     {
349       if (--bitmap_default_obstack_depth)
350         {
351           gcc_assert (bitmap_default_obstack_depth > 0);
352           return;
353         }
354       bit_obstack = &bitmap_default_obstack;
355     }
356
357   bit_obstack->elements = NULL;
358   bit_obstack->heads = NULL;
359   obstack_free (&bit_obstack->obstack, NULL);
360 }
361
362 /* Create a new bitmap on an obstack.  If BIT_OBSTACK is NULL, create
363    it on the default bitmap obstack.  */
364
365 bitmap
366 bitmap_obstack_alloc_stat (bitmap_obstack *bit_obstack MEM_STAT_DECL)
367 {
368   bitmap map;
369
370   if (!bit_obstack)
371     bit_obstack = &bitmap_default_obstack;
372   map = bit_obstack->heads;
373   if (map)
374     bit_obstack->heads = (struct bitmap_head *) map->first;
375   else
376     map = XOBNEW (&bit_obstack->obstack, bitmap_head);
377   bitmap_initialize_stat (map, bit_obstack PASS_MEM_STAT);
378
379   if (GATHER_STATISTICS)
380     register_overhead (map, sizeof (bitmap_head));
381
382   return map;
383 }
384
385 /* Create a new GCd bitmap.  */
386
387 bitmap
388 bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL)
389 {
390   bitmap map;
391
392   map = ggc_alloc<bitmap_head> ();
393   bitmap_initialize_stat (map, NULL PASS_MEM_STAT);
394
395   if (GATHER_STATISTICS)
396     register_overhead (map, sizeof (bitmap_head));
397
398   return map;
399 }
400
401 /* Release an obstack allocated bitmap.  */
402
403 void
404 bitmap_obstack_free (bitmap map)
405 {
406   if (map)
407     {
408       bitmap_clear (map);
409       map->first = (bitmap_element *) map->obstack->heads;
410
411       if (GATHER_STATISTICS)
412         register_overhead (map, -((int)sizeof (bitmap_head)));
413
414       map->obstack->heads = map;
415     }
416 }
417
418 \f
419 /* Return nonzero if all bits in an element are zero.  */
420
421 static inline int
422 bitmap_element_zerop (const bitmap_element *element)
423 {
424 #if BITMAP_ELEMENT_WORDS == 2
425   return (element->bits[0] | element->bits[1]) == 0;
426 #else
427   unsigned i;
428
429   for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
430     if (element->bits[i] != 0)
431       return 0;
432
433   return 1;
434 #endif
435 }
436 \f
437 /* Link the bitmap element into the current bitmap linked list.  */
438
439 static inline void
440 bitmap_element_link (bitmap head, bitmap_element *element)
441 {
442   unsigned int indx = element->indx;
443   bitmap_element *ptr;
444
445   /* If this is the first and only element, set it in.  */
446   if (head->first == 0)
447     {
448       element->next = element->prev = 0;
449       head->first = element;
450     }
451
452   /* If this index is less than that of the current element, it goes someplace
453      before the current element.  */
454   else if (indx < head->indx)
455     {
456       for (ptr = head->current;
457            ptr->prev != 0 && ptr->prev->indx > indx;
458            ptr = ptr->prev)
459         ;
460
461       if (ptr->prev)
462         ptr->prev->next = element;
463       else
464         head->first = element;
465
466       element->prev = ptr->prev;
467       element->next = ptr;
468       ptr->prev = element;
469     }
470
471   /* Otherwise, it must go someplace after the current element.  */
472   else
473     {
474       for (ptr = head->current;
475            ptr->next != 0 && ptr->next->indx < indx;
476            ptr = ptr->next)
477         ;
478
479       if (ptr->next)
480         ptr->next->prev = element;
481
482       element->next = ptr->next;
483       element->prev = ptr;
484       ptr->next = element;
485     }
486
487   /* Set up so this is the first element searched.  */
488   head->current = element;
489   head->indx = indx;
490 }
491
492 /* Insert a new uninitialized element into bitmap HEAD after element
493    ELT.  If ELT is NULL, insert the element at the start.  Return the
494    new element.  */
495
496 static bitmap_element *
497 bitmap_elt_insert_after (bitmap head, bitmap_element *elt, unsigned int indx)
498 {
499   bitmap_element *node = bitmap_element_allocate (head);
500   node->indx = indx;
501
502   if (!elt)
503     {
504       if (!head->current)
505         {
506           head->current = node;
507           head->indx = indx;
508         }
509       node->next = head->first;
510       if (node->next)
511         node->next->prev = node;
512       head->first = node;
513       node->prev = NULL;
514     }
515   else
516     {
517       gcc_checking_assert (head->current);
518       node->next = elt->next;
519       if (node->next)
520         node->next->prev = node;
521       elt->next = node;
522       node->prev = elt;
523     }
524   return node;
525 }
526 \f
527 /* Copy a bitmap to another bitmap.  */
528
529 void
530 bitmap_copy (bitmap to, const_bitmap from)
531 {
532   const bitmap_element *from_ptr;
533   bitmap_element *to_ptr = 0;
534
535   bitmap_clear (to);
536
537   /* Copy elements in forward direction one at a time.  */
538   for (from_ptr = from->first; from_ptr; from_ptr = from_ptr->next)
539     {
540       bitmap_element *to_elt = bitmap_element_allocate (to);
541
542       to_elt->indx = from_ptr->indx;
543       memcpy (to_elt->bits, from_ptr->bits, sizeof (to_elt->bits));
544
545       /* Here we have a special case of bitmap_element_link, for the case
546          where we know the links are being entered in sequence.  */
547       if (to_ptr == 0)
548         {
549           to->first = to->current = to_elt;
550           to->indx = from_ptr->indx;
551           to_elt->next = to_elt->prev = 0;
552         }
553       else
554         {
555           to_elt->prev = to_ptr;
556           to_elt->next = 0;
557           to_ptr->next = to_elt;
558         }
559
560       to_ptr = to_elt;
561     }
562 }
563 \f
564 /* Find a bitmap element that would hold a bitmap's bit.
565    Update the `current' field even if we can't find an element that
566    would hold the bitmap's bit to make eventual allocation
567    faster.  */
568
569 static inline bitmap_element *
570 bitmap_find_bit (bitmap head, unsigned int bit)
571 {
572   bitmap_element *element;
573   unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
574
575   if (head->current == NULL
576       || head->indx == indx)
577     return head->current;
578   if (head->current == head->first
579       && head->first->next == NULL)
580     return NULL;
581
582   /* This bitmap has more than one element, and we're going to look
583      through the elements list.  Count that as a search.  */
584   if (GATHER_STATISTICS)
585     bitmap_descriptors[head->descriptor_id]->nsearches++;
586
587   if (head->indx < indx)
588     /* INDX is beyond head->indx.  Search from head->current
589        forward.  */
590     for (element = head->current;
591          element->next != 0 && element->indx < indx;
592          element = element->next)
593       {
594         if (GATHER_STATISTICS)
595           bitmap_descriptors[head->descriptor_id]->search_iter++;
596       }
597
598   else if (head->indx / 2 < indx)
599     /* INDX is less than head->indx and closer to head->indx than to
600        0.  Search from head->current backward.  */
601     for (element = head->current;
602          element->prev != 0 && element->indx > indx;
603          element = element->prev)
604       {
605         if (GATHER_STATISTICS)
606           bitmap_descriptors[head->descriptor_id]->search_iter++;
607       }
608
609   else
610     /* INDX is less than head->indx and closer to 0 than to
611        head->indx.  Search from head->first forward.  */
612     for (element = head->first;
613          element->next != 0 && element->indx < indx;
614          element = element->next)
615       if (GATHER_STATISTICS)
616         {
617           bitmap_descriptors[head->descriptor_id]->search_iter++;
618         }
619
620   /* `element' is the nearest to the one we want.  If it's not the one we
621      want, the one we want doesn't exist.  */
622   head->current = element;
623   head->indx = element->indx;
624   if (element != 0 && element->indx != indx)
625     element = 0;
626
627   return element;
628 }
629 \f
630 /* Clear a single bit in a bitmap.  Return true if the bit changed.  */
631
632 bool
633 bitmap_clear_bit (bitmap head, int bit)
634 {
635   bitmap_element *const ptr = bitmap_find_bit (head, bit);
636
637   if (ptr != 0)
638     {
639       unsigned bit_num  = bit % BITMAP_WORD_BITS;
640       unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
641       BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
642       bool res = (ptr->bits[word_num] & bit_val) != 0;
643       if (res)
644         {
645           ptr->bits[word_num] &= ~bit_val;
646           /* If we cleared the entire word, free up the element.  */
647           if (!ptr->bits[word_num]
648               && bitmap_element_zerop (ptr))
649             bitmap_element_free (head, ptr);
650         }
651
652       return res;
653     }
654
655   return false;
656 }
657
658 /* Set a single bit in a bitmap.  Return true if the bit changed.  */
659
660 bool
661 bitmap_set_bit (bitmap head, int bit)
662 {
663   bitmap_element *ptr = bitmap_find_bit (head, bit);
664   unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
665   unsigned bit_num  = bit % BITMAP_WORD_BITS;
666   BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
667
668   if (ptr == 0)
669     {
670       ptr = bitmap_element_allocate (head);
671       ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
672       ptr->bits[word_num] = bit_val;
673       bitmap_element_link (head, ptr);
674       return true;
675     }
676   else
677     {
678       bool res = (ptr->bits[word_num] & bit_val) == 0;
679       if (res)
680         ptr->bits[word_num] |= bit_val;
681       return res;
682     }
683 }
684
685 /* Return whether a bit is set within a bitmap.  */
686
687 int
688 bitmap_bit_p (bitmap head, int bit)
689 {
690   bitmap_element *ptr;
691   unsigned bit_num;
692   unsigned word_num;
693
694   ptr = bitmap_find_bit (head, bit);
695   if (ptr == 0)
696     return 0;
697
698   bit_num = bit % BITMAP_WORD_BITS;
699   word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
700
701   return (ptr->bits[word_num] >> bit_num) & 1;
702 }
703 \f
704 #if GCC_VERSION < 3400
705 /* Table of number of set bits in a character, indexed by value of char.  */
706 static const unsigned char popcount_table[] =
707 {
708     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,
709     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,
710     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,
711     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,
712     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,
713     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,
714     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,
715     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,
716 };
717
718 static unsigned long
719 bitmap_popcount (BITMAP_WORD a)
720 {
721   unsigned long ret = 0;
722   unsigned i;
723
724   /* Just do this the table way for now  */
725   for (i = 0; i < BITMAP_WORD_BITS; i+= 8)
726     ret += popcount_table[(a >> i) & 0xff];
727   return ret;
728 }
729 #endif
730 /* Count the number of bits set in the bitmap, and return it.  */
731
732 unsigned long
733 bitmap_count_bits (const_bitmap a)
734 {
735   unsigned long count = 0;
736   const bitmap_element *elt;
737   unsigned ix;
738
739   for (elt = a->first; elt; elt = elt->next)
740     {
741       for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
742         {
743 #if GCC_VERSION >= 3400
744           /* Note that popcountl matches BITMAP_WORD in type, so the actual size
745          of BITMAP_WORD is not material.  */
746           count += __builtin_popcountl (elt->bits[ix]);
747 #else
748           count += bitmap_popcount (elt->bits[ix]);
749 #endif
750         }
751     }
752   return count;
753 }
754
755 /* Return true if the bitmap has a single bit set.  Otherwise return
756    false.  */
757
758 bool
759 bitmap_single_bit_set_p (const_bitmap a)
760 {
761   unsigned long count = 0;
762   const bitmap_element *elt;
763   unsigned ix;
764
765   if (bitmap_empty_p (a))
766     return false;
767
768   elt = a->first;
769   /* As there are no completely empty bitmap elements, a second one
770      means we have more than one bit set.  */
771   if (elt->next != NULL)
772     return false;
773
774   for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
775     {
776 #if GCC_VERSION >= 3400
777       /* Note that popcountl matches BITMAP_WORD in type, so the actual size
778          of BITMAP_WORD is not material.  */
779       count += __builtin_popcountl (elt->bits[ix]);
780 #else
781       count += bitmap_popcount (elt->bits[ix]);
782 #endif
783       if (count > 1)
784         return false;
785     }
786
787   return count == 1;
788 }
789
790
791 /* Return the bit number of the first set bit in the bitmap.  The
792    bitmap must be non-empty.  */
793
794 unsigned
795 bitmap_first_set_bit (const_bitmap a)
796 {
797   const bitmap_element *elt = a->first;
798   unsigned bit_no;
799   BITMAP_WORD word;
800   unsigned ix;
801
802   gcc_checking_assert (elt);
803   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
804   for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
805     {
806       word = elt->bits[ix];
807       if (word)
808         goto found_bit;
809     }
810   gcc_unreachable ();
811  found_bit:
812   bit_no += ix * BITMAP_WORD_BITS;
813
814 #if GCC_VERSION >= 3004
815   gcc_assert (sizeof (long) == sizeof (word));
816   bit_no += __builtin_ctzl (word);
817 #else
818   /* Binary search for the first set bit.  */
819 #if BITMAP_WORD_BITS > 64
820 #error "Fill out the table."
821 #endif
822 #if BITMAP_WORD_BITS > 32
823   if (!(word & 0xffffffff))
824     word >>= 32, bit_no += 32;
825 #endif
826   if (!(word & 0xffff))
827     word >>= 16, bit_no += 16;
828   if (!(word & 0xff))
829     word >>= 8, bit_no += 8;
830   if (!(word & 0xf))
831     word >>= 4, bit_no += 4;
832   if (!(word & 0x3))
833     word >>= 2, bit_no += 2;
834   if (!(word & 0x1))
835     word >>= 1, bit_no += 1;
836
837  gcc_checking_assert (word & 1);
838 #endif
839  return bit_no;
840 }
841
842 /* Return the bit number of the first set bit in the bitmap.  The
843    bitmap must be non-empty.  */
844
845 unsigned
846 bitmap_last_set_bit (const_bitmap a)
847 {
848   const bitmap_element *elt = a->current ? a->current : a->first;
849   unsigned bit_no;
850   BITMAP_WORD word;
851   int ix;
852
853   gcc_checking_assert (elt);
854   while (elt->next)
855     elt = elt->next;
856   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
857   for (ix = BITMAP_ELEMENT_WORDS - 1; ix >= 0; ix--)
858     {
859       word = elt->bits[ix];
860       if (word)
861         goto found_bit;
862     }
863   gcc_unreachable ();
864  found_bit:
865   bit_no += ix * BITMAP_WORD_BITS;
866 #if GCC_VERSION >= 3004
867   gcc_assert (sizeof (long) == sizeof (word));
868   bit_no += BITMAP_WORD_BITS - __builtin_clzl (word) - 1;
869 #else
870   /* Hopefully this is a twos-complement host...  */
871   BITMAP_WORD x = word;
872   x |= (x >> 1);
873   x |= (x >> 2);
874   x |= (x >> 4);
875   x |= (x >> 8);
876   x |= (x >> 16);
877 #if BITMAP_WORD_BITS > 32
878   x |= (x >> 32);
879 #endif
880   bit_no += bitmap_popcount (x) - 1;
881 #endif
882
883   return bit_no;
884 }
885 \f
886
887 /* DST = A & B.  */
888
889 void
890 bitmap_and (bitmap dst, const_bitmap a, const_bitmap b)
891 {
892   bitmap_element *dst_elt = dst->first;
893   const bitmap_element *a_elt = a->first;
894   const bitmap_element *b_elt = b->first;
895   bitmap_element *dst_prev = NULL;
896
897   gcc_assert (dst != a && dst != b);
898
899   if (a == b)
900     {
901       bitmap_copy (dst, a);
902       return;
903     }
904
905   while (a_elt && b_elt)
906     {
907       if (a_elt->indx < b_elt->indx)
908         a_elt = a_elt->next;
909       else if (b_elt->indx < a_elt->indx)
910         b_elt = b_elt->next;
911       else
912         {
913           /* Matching elts, generate A & B.  */
914           unsigned ix;
915           BITMAP_WORD ior = 0;
916
917           if (!dst_elt)
918             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
919           else
920             dst_elt->indx = a_elt->indx;
921           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
922             {
923               BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
924
925               dst_elt->bits[ix] = r;
926               ior |= r;
927             }
928           if (ior)
929             {
930               dst_prev = dst_elt;
931               dst_elt = dst_elt->next;
932             }
933           a_elt = a_elt->next;
934           b_elt = b_elt->next;
935         }
936     }
937   /* Ensure that dst->current is valid.  */
938   dst->current = dst->first;
939   bitmap_elt_clear_from (dst, dst_elt);
940   gcc_checking_assert (!dst->current == !dst->first);
941   if (dst->current)
942     dst->indx = dst->current->indx;
943 }
944
945 /* A &= B.  Return true if A changed.  */
946
947 bool
948 bitmap_and_into (bitmap a, const_bitmap b)
949 {
950   bitmap_element *a_elt = a->first;
951   const bitmap_element *b_elt = b->first;
952   bitmap_element *next;
953   bool changed = false;
954
955   if (a == b)
956     return false;
957
958   while (a_elt && b_elt)
959     {
960       if (a_elt->indx < b_elt->indx)
961         {
962           next = a_elt->next;
963           bitmap_element_free (a, a_elt);
964           a_elt = next;
965           changed = true;
966         }
967       else if (b_elt->indx < a_elt->indx)
968         b_elt = b_elt->next;
969       else
970         {
971           /* Matching elts, generate A &= B.  */
972           unsigned ix;
973           BITMAP_WORD ior = 0;
974
975           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
976             {
977               BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
978               if (a_elt->bits[ix] != r)
979                 changed = true;
980               a_elt->bits[ix] = r;
981               ior |= r;
982             }
983           next = a_elt->next;
984           if (!ior)
985             bitmap_element_free (a, a_elt);
986           a_elt = next;
987           b_elt = b_elt->next;
988         }
989     }
990
991   if (a_elt)
992     {
993       changed = true;
994       bitmap_elt_clear_from (a, a_elt);
995     }
996
997   gcc_checking_assert (!a->current == !a->first
998                        && (!a->current || a->indx == a->current->indx));
999
1000   return changed;
1001 }
1002
1003
1004 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
1005    if non-NULL.  CHANGED is true if the destination bitmap had already been
1006    changed; the new value of CHANGED is returned.  */
1007
1008 static inline bool
1009 bitmap_elt_copy (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
1010                  const bitmap_element *src_elt, bool changed)
1011 {
1012   if (!changed && dst_elt && dst_elt->indx == src_elt->indx)
1013     {
1014       unsigned ix;
1015
1016       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1017         if (src_elt->bits[ix] != dst_elt->bits[ix])
1018           {
1019             dst_elt->bits[ix] = src_elt->bits[ix];
1020             changed = true;
1021           }
1022     }
1023   else
1024     {
1025       changed = true;
1026       if (!dst_elt)
1027         dst_elt = bitmap_elt_insert_after (dst, dst_prev, src_elt->indx);
1028       else
1029         dst_elt->indx = src_elt->indx;
1030       memcpy (dst_elt->bits, src_elt->bits, sizeof (dst_elt->bits));
1031     }
1032   return changed;
1033 }
1034
1035
1036
1037 /* DST = A & ~B  */
1038
1039 bool
1040 bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
1041 {
1042   bitmap_element *dst_elt = dst->first;
1043   const bitmap_element *a_elt = a->first;
1044   const bitmap_element *b_elt = b->first;
1045   bitmap_element *dst_prev = NULL;
1046   bitmap_element **dst_prev_pnext = &dst->first;
1047   bool changed = false;
1048
1049   gcc_assert (dst != a && dst != b);
1050
1051   if (a == b)
1052     {
1053       changed = !bitmap_empty_p (dst);
1054       bitmap_clear (dst);
1055       return changed;
1056     }
1057
1058   while (a_elt)
1059     {
1060       while (b_elt && b_elt->indx < a_elt->indx)
1061         b_elt = b_elt->next;
1062
1063       if (!b_elt || b_elt->indx > a_elt->indx)
1064         {
1065           changed = bitmap_elt_copy (dst, dst_elt, dst_prev, a_elt, changed);
1066           dst_prev = *dst_prev_pnext;
1067           dst_prev_pnext = &dst_prev->next;
1068           dst_elt = *dst_prev_pnext;
1069           a_elt = a_elt->next;
1070         }
1071
1072       else
1073         {
1074           /* Matching elts, generate A & ~B.  */
1075           unsigned ix;
1076           BITMAP_WORD ior = 0;
1077
1078           if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1079             {
1080               for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1081                 {
1082                   BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1083
1084                   if (dst_elt->bits[ix] != r)
1085                     {
1086                       changed = true;
1087                       dst_elt->bits[ix] = r;
1088                     }
1089                   ior |= r;
1090                 }
1091             }
1092           else
1093             {
1094               bool new_element;
1095               if (!dst_elt || dst_elt->indx > a_elt->indx)
1096                 {
1097                   dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1098                   new_element = true;
1099                 }
1100               else
1101                 {
1102                   dst_elt->indx = a_elt->indx;
1103                   new_element = false;
1104                 }
1105
1106               for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1107                 {
1108                   BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1109
1110                   dst_elt->bits[ix] = r;
1111                   ior |= r;
1112                 }
1113
1114               if (ior)
1115                 changed = true;
1116               else
1117                 {
1118                   changed |= !new_element;
1119                   bitmap_element_free (dst, dst_elt);
1120                   dst_elt = *dst_prev_pnext;
1121                 }
1122             }
1123
1124           if (ior)
1125             {
1126               dst_prev = *dst_prev_pnext;
1127               dst_prev_pnext = &dst_prev->next;
1128               dst_elt = *dst_prev_pnext;
1129             }
1130           a_elt = a_elt->next;
1131           b_elt = b_elt->next;
1132         }
1133     }
1134
1135   /* Ensure that dst->current is valid.  */
1136   dst->current = dst->first;
1137
1138   if (dst_elt)
1139     {
1140       changed = true;
1141       bitmap_elt_clear_from (dst, dst_elt);
1142     }
1143   gcc_checking_assert (!dst->current == !dst->first);
1144   if (dst->current)
1145     dst->indx = dst->current->indx;
1146
1147   return changed;
1148 }
1149
1150 /* A &= ~B. Returns true if A changes */
1151
1152 bool
1153 bitmap_and_compl_into (bitmap a, const_bitmap b)
1154 {
1155   bitmap_element *a_elt = a->first;
1156   const bitmap_element *b_elt = b->first;
1157   bitmap_element *next;
1158   BITMAP_WORD changed = 0;
1159
1160   if (a == b)
1161     {
1162       if (bitmap_empty_p (a))
1163         return false;
1164       else
1165         {
1166           bitmap_clear (a);
1167           return true;
1168         }
1169     }
1170
1171   while (a_elt && b_elt)
1172     {
1173       if (a_elt->indx < b_elt->indx)
1174         a_elt = a_elt->next;
1175       else if (b_elt->indx < a_elt->indx)
1176         b_elt = b_elt->next;
1177       else
1178         {
1179           /* Matching elts, generate A &= ~B.  */
1180           unsigned ix;
1181           BITMAP_WORD ior = 0;
1182
1183           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1184             {
1185               BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1186               BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
1187
1188               a_elt->bits[ix] = r;
1189               changed |= cleared;
1190               ior |= r;
1191             }
1192           next = a_elt->next;
1193           if (!ior)
1194             bitmap_element_free (a, a_elt);
1195           a_elt = next;
1196           b_elt = b_elt->next;
1197         }
1198     }
1199   gcc_checking_assert (!a->current == !a->first
1200                        && (!a->current || a->indx == a->current->indx));
1201   return changed != 0;
1202 }
1203
1204 /* Set COUNT bits from START in HEAD.  */
1205 void
1206 bitmap_set_range (bitmap head, unsigned int start, unsigned int count)
1207 {
1208   unsigned int first_index, end_bit_plus1, last_index;
1209   bitmap_element *elt, *elt_prev;
1210   unsigned int i;
1211
1212   if (!count)
1213     return;
1214
1215   first_index = start / BITMAP_ELEMENT_ALL_BITS;
1216   end_bit_plus1 = start + count;
1217   last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1218   elt = bitmap_find_bit (head, start);
1219
1220   /* If bitmap_find_bit returns zero, the current is the closest block
1221      to the result.  Otherwise, just use bitmap_element_allocate to
1222      ensure ELT is set; in the loop below, ELT == NULL means "insert
1223      at the end of the bitmap".  */
1224   if (!elt)
1225     {
1226       elt = bitmap_element_allocate (head);
1227       elt->indx = first_index;
1228       bitmap_element_link (head, elt);
1229     }
1230
1231   gcc_checking_assert (elt->indx == first_index);
1232   elt_prev = elt->prev;
1233   for (i = first_index; i <= last_index; i++)
1234     {
1235       unsigned elt_start_bit = i * BITMAP_ELEMENT_ALL_BITS;
1236       unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1237
1238       unsigned int first_word_to_mod;
1239       BITMAP_WORD first_mask;
1240       unsigned int last_word_to_mod;
1241       BITMAP_WORD last_mask;
1242       unsigned int ix;
1243
1244       if (!elt || elt->indx != i)
1245         elt = bitmap_elt_insert_after (head, elt_prev, i);
1246
1247       if (elt_start_bit <= start)
1248         {
1249           /* The first bit to turn on is somewhere inside this
1250              elt.  */
1251           first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1252
1253           /* This mask should have 1s in all bits >= start position. */
1254           first_mask =
1255             (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1256           first_mask = ~first_mask;
1257         }
1258       else
1259         {
1260           /* The first bit to turn on is below this start of this elt.  */
1261           first_word_to_mod = 0;
1262           first_mask = ~(BITMAP_WORD) 0;
1263         }
1264
1265       if (elt_end_bit_plus1 <= end_bit_plus1)
1266         {
1267           /* The last bit to turn on is beyond this elt.  */
1268           last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1269           last_mask = ~(BITMAP_WORD) 0;
1270         }
1271       else
1272         {
1273           /* The last bit to turn on is inside to this elt.  */
1274           last_word_to_mod =
1275             (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1276
1277           /* The last mask should have 1s below the end bit.  */
1278           last_mask =
1279             (((BITMAP_WORD) 1) << ((end_bit_plus1 % BITMAP_WORD_BITS))) - 1;
1280         }
1281
1282       if (first_word_to_mod == last_word_to_mod)
1283         {
1284           BITMAP_WORD mask = first_mask & last_mask;
1285           elt->bits[first_word_to_mod] |= mask;
1286         }
1287       else
1288         {
1289           elt->bits[first_word_to_mod] |= first_mask;
1290           if (BITMAP_ELEMENT_WORDS > 2)
1291             for (ix = first_word_to_mod + 1; ix < last_word_to_mod; ix++)
1292               elt->bits[ix] = ~(BITMAP_WORD) 0;
1293           elt->bits[last_word_to_mod] |= last_mask;
1294         }
1295
1296       elt_prev = elt;
1297       elt = elt->next;
1298     }
1299
1300   head->current = elt ? elt : elt_prev;
1301   head->indx = head->current->indx;
1302 }
1303
1304 /* Clear COUNT bits from START in HEAD.  */
1305 void
1306 bitmap_clear_range (bitmap head, unsigned int start, unsigned int count)
1307 {
1308   unsigned int first_index, end_bit_plus1, last_index;
1309   bitmap_element *elt;
1310
1311   if (!count)
1312     return;
1313
1314   first_index = start / BITMAP_ELEMENT_ALL_BITS;
1315   end_bit_plus1 = start + count;
1316   last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1317   elt = bitmap_find_bit (head, start);
1318
1319   /* If bitmap_find_bit returns zero, the current is the closest block
1320      to the result.  If the current is less than first index, find the
1321      next one.  Otherwise, just set elt to be current.  */
1322   if (!elt)
1323     {
1324       if (head->current)
1325         {
1326           if (head->indx < first_index)
1327             {
1328               elt = head->current->next;
1329               if (!elt)
1330                 return;
1331             }
1332           else
1333             elt = head->current;
1334         }
1335       else
1336         return;
1337     }
1338
1339   while (elt && (elt->indx <= last_index))
1340     {
1341       bitmap_element * next_elt = elt->next;
1342       unsigned elt_start_bit = (elt->indx) * BITMAP_ELEMENT_ALL_BITS;
1343       unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1344
1345
1346       if (elt_start_bit >= start && elt_end_bit_plus1 <= end_bit_plus1)
1347         /* Get rid of the entire elt and go to the next one.  */
1348         bitmap_element_free (head, elt);
1349       else
1350         {
1351           /* Going to have to knock out some bits in this elt.  */
1352           unsigned int first_word_to_mod;
1353           BITMAP_WORD first_mask;
1354           unsigned int last_word_to_mod;
1355           BITMAP_WORD last_mask;
1356           unsigned int i;
1357           bool clear = true;
1358
1359           if (elt_start_bit <= start)
1360             {
1361               /* The first bit to turn off is somewhere inside this
1362                  elt.  */
1363               first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1364
1365               /* This mask should have 1s in all bits >= start position. */
1366               first_mask =
1367                 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1368               first_mask = ~first_mask;
1369             }
1370           else
1371             {
1372               /* The first bit to turn off is below this start of this elt.  */
1373               first_word_to_mod = 0;
1374               first_mask = 0;
1375               first_mask = ~first_mask;
1376             }
1377
1378           if (elt_end_bit_plus1 <= end_bit_plus1)
1379             {
1380               /* The last bit to turn off is beyond this elt.  */
1381               last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1382               last_mask = 0;
1383               last_mask = ~last_mask;
1384             }
1385           else
1386             {
1387               /* The last bit to turn off is inside to this elt.  */
1388               last_word_to_mod =
1389                 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1390
1391               /* The last mask should have 1s below the end bit.  */
1392               last_mask =
1393                 (((BITMAP_WORD) 1) << (((end_bit_plus1) % BITMAP_WORD_BITS))) - 1;
1394             }
1395
1396
1397           if (first_word_to_mod == last_word_to_mod)
1398             {
1399               BITMAP_WORD mask = first_mask & last_mask;
1400               elt->bits[first_word_to_mod] &= ~mask;
1401             }
1402           else
1403             {
1404               elt->bits[first_word_to_mod] &= ~first_mask;
1405               if (BITMAP_ELEMENT_WORDS > 2)
1406                 for (i = first_word_to_mod + 1; i < last_word_to_mod; i++)
1407                   elt->bits[i] = 0;
1408               elt->bits[last_word_to_mod] &= ~last_mask;
1409             }
1410           for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1411             if (elt->bits[i])
1412               {
1413                 clear = false;
1414                 break;
1415               }
1416           /* Check to see if there are any bits left.  */
1417           if (clear)
1418             bitmap_element_free (head, elt);
1419         }
1420       elt = next_elt;
1421     }
1422
1423   if (elt)
1424     {
1425       head->current = elt;
1426       head->indx = head->current->indx;
1427     }
1428 }
1429
1430 /* A = ~A & B. */
1431
1432 void
1433 bitmap_compl_and_into (bitmap a, const_bitmap b)
1434 {
1435   bitmap_element *a_elt = a->first;
1436   const bitmap_element *b_elt = b->first;
1437   bitmap_element *a_prev = NULL;
1438   bitmap_element *next;
1439
1440   gcc_assert (a != b);
1441
1442   if (bitmap_empty_p (a))
1443     {
1444       bitmap_copy (a, b);
1445       return;
1446     }
1447   if (bitmap_empty_p (b))
1448     {
1449       bitmap_clear (a);
1450       return;
1451     }
1452
1453   while (a_elt || b_elt)
1454     {
1455       if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1456         {
1457           /* A is before B.  Remove A */
1458           next = a_elt->next;
1459           a_prev = a_elt->prev;
1460           bitmap_element_free (a, a_elt);
1461           a_elt = next;
1462         }
1463       else if (!a_elt || b_elt->indx < a_elt->indx)
1464         {
1465           /* B is before A.  Copy B. */
1466           next = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1467           memcpy (next->bits, b_elt->bits, sizeof (next->bits));
1468           a_prev = next;
1469           b_elt = b_elt->next;
1470         }
1471       else
1472         {
1473           /* Matching elts, generate A = ~A & B.  */
1474           unsigned ix;
1475           BITMAP_WORD ior = 0;
1476
1477           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1478             {
1479               BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1480               BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
1481
1482               a_elt->bits[ix] = r;
1483               ior |= r;
1484             }
1485           next = a_elt->next;
1486           if (!ior)
1487             bitmap_element_free (a, a_elt);
1488           else
1489             a_prev = a_elt;
1490           a_elt = next;
1491           b_elt = b_elt->next;
1492         }
1493     }
1494   gcc_checking_assert (!a->current == !a->first
1495                        && (!a->current || a->indx == a->current->indx));
1496   return;
1497 }
1498
1499
1500 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1501    overwriting DST_ELT if non-NULL.  CHANGED is true if the destination bitmap
1502    had already been changed; the new value of CHANGED is returned.  */
1503
1504 static inline bool
1505 bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
1506                 const bitmap_element *a_elt, const bitmap_element *b_elt,
1507                 bool changed)
1508 {
1509   gcc_assert (a_elt || b_elt);
1510
1511   if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1512     {
1513       /* Matching elts, generate A | B.  */
1514       unsigned ix;
1515
1516       if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1517         {
1518           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1519             {
1520               BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1521               if (r != dst_elt->bits[ix])
1522                 {
1523                   dst_elt->bits[ix] = r;
1524                   changed = true;
1525                 }
1526             }
1527         }
1528       else
1529         {
1530           changed = true;
1531           if (!dst_elt)
1532             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1533           else
1534             dst_elt->indx = a_elt->indx;
1535           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1536             {
1537               BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1538               dst_elt->bits[ix] = r;
1539             }
1540         }
1541     }
1542   else
1543     {
1544       /* Copy a single element.  */
1545       const bitmap_element *src;
1546
1547       if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1548         src = a_elt;
1549       else
1550         src = b_elt;
1551
1552       gcc_checking_assert (src);
1553       changed = bitmap_elt_copy (dst, dst_elt, dst_prev, src, changed);
1554     }
1555   return changed;
1556 }
1557
1558
1559 /* DST = A | B.  Return true if DST changes.  */
1560
1561 bool
1562 bitmap_ior (bitmap dst, const_bitmap a, const_bitmap b)
1563 {
1564   bitmap_element *dst_elt = dst->first;
1565   const bitmap_element *a_elt = a->first;
1566   const bitmap_element *b_elt = b->first;
1567   bitmap_element *dst_prev = NULL;
1568   bitmap_element **dst_prev_pnext = &dst->first;
1569   bool changed = false;
1570
1571   gcc_assert (dst != a && dst != b);
1572
1573   while (a_elt || b_elt)
1574     {
1575       changed = bitmap_elt_ior (dst, dst_elt, dst_prev, a_elt, b_elt, changed);
1576
1577       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1578         {
1579           a_elt = a_elt->next;
1580           b_elt = b_elt->next;
1581         }
1582       else
1583         {
1584           if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
1585             a_elt = a_elt->next;
1586           else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
1587             b_elt = b_elt->next;
1588         }
1589
1590       dst_prev = *dst_prev_pnext;
1591       dst_prev_pnext = &dst_prev->next;
1592       dst_elt = *dst_prev_pnext;
1593     }
1594
1595   if (dst_elt)
1596     {
1597       changed = true;
1598       /* Ensure that dst->current is valid.  */
1599       dst->current = dst->first;
1600       bitmap_elt_clear_from (dst, dst_elt);
1601     }
1602   gcc_checking_assert (!dst->current == !dst->first);
1603   if (dst->current)
1604     dst->indx = dst->current->indx;
1605   return changed;
1606 }
1607
1608 /* A |= B.  Return true if A changes.  */
1609
1610 bool
1611 bitmap_ior_into (bitmap a, const_bitmap b)
1612 {
1613   bitmap_element *a_elt = a->first;
1614   const bitmap_element *b_elt = b->first;
1615   bitmap_element *a_prev = NULL;
1616   bitmap_element **a_prev_pnext = &a->first;
1617   bool changed = false;
1618
1619   if (a == b)
1620     return false;
1621
1622   while (b_elt)
1623     {
1624       /* If A lags behind B, just advance it.  */
1625       if (!a_elt || a_elt->indx == b_elt->indx)
1626         {
1627           changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
1628           b_elt = b_elt->next;
1629         }
1630       else if (a_elt->indx > b_elt->indx)
1631         {
1632           changed = bitmap_elt_copy (a, NULL, a_prev, b_elt, changed);
1633           b_elt = b_elt->next;
1634         }
1635
1636       a_prev = *a_prev_pnext;
1637       a_prev_pnext = &a_prev->next;
1638       a_elt = *a_prev_pnext;
1639     }
1640
1641   gcc_checking_assert (!a->current == !a->first);
1642   if (a->current)
1643     a->indx = a->current->indx;
1644   return changed;
1645 }
1646
1647 /* DST = A ^ B  */
1648
1649 void
1650 bitmap_xor (bitmap dst, const_bitmap a, const_bitmap b)
1651 {
1652   bitmap_element *dst_elt = dst->first;
1653   const bitmap_element *a_elt = a->first;
1654   const bitmap_element *b_elt = b->first;
1655   bitmap_element *dst_prev = NULL;
1656
1657   gcc_assert (dst != a && dst != b);
1658   if (a == b)
1659     {
1660       bitmap_clear (dst);
1661       return;
1662     }
1663
1664   while (a_elt || b_elt)
1665     {
1666       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1667         {
1668           /* Matching elts, generate A ^ B.  */
1669           unsigned ix;
1670           BITMAP_WORD ior = 0;
1671
1672           if (!dst_elt)
1673             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1674           else
1675             dst_elt->indx = a_elt->indx;
1676           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1677             {
1678               BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1679
1680               ior |= r;
1681               dst_elt->bits[ix] = r;
1682             }
1683           a_elt = a_elt->next;
1684           b_elt = b_elt->next;
1685           if (ior)
1686             {
1687               dst_prev = dst_elt;
1688               dst_elt = dst_elt->next;
1689             }
1690         }
1691       else
1692         {
1693           /* Copy a single element.  */
1694           const bitmap_element *src;
1695
1696           if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1697             {
1698               src = a_elt;
1699               a_elt = a_elt->next;
1700             }
1701           else
1702             {
1703               src = b_elt;
1704               b_elt = b_elt->next;
1705             }
1706
1707           if (!dst_elt)
1708             dst_elt = bitmap_elt_insert_after (dst, dst_prev, src->indx);
1709           else
1710             dst_elt->indx = src->indx;
1711           memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
1712           dst_prev = dst_elt;
1713           dst_elt = dst_elt->next;
1714         }
1715     }
1716   /* Ensure that dst->current is valid.  */
1717   dst->current = dst->first;
1718   bitmap_elt_clear_from (dst, dst_elt);
1719   gcc_checking_assert (!dst->current == !dst->first);
1720   if (dst->current)
1721     dst->indx = dst->current->indx;
1722 }
1723
1724 /* A ^= B */
1725
1726 void
1727 bitmap_xor_into (bitmap a, const_bitmap b)
1728 {
1729   bitmap_element *a_elt = a->first;
1730   const bitmap_element *b_elt = b->first;
1731   bitmap_element *a_prev = NULL;
1732
1733   if (a == b)
1734     {
1735       bitmap_clear (a);
1736       return;
1737     }
1738
1739   while (b_elt)
1740     {
1741       if (!a_elt || b_elt->indx < a_elt->indx)
1742         {
1743           /* Copy b_elt.  */
1744           bitmap_element *dst = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1745           memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
1746           a_prev = dst;
1747           b_elt = b_elt->next;
1748         }
1749       else if (a_elt->indx < b_elt->indx)
1750         {
1751           a_prev = a_elt;
1752           a_elt = a_elt->next;
1753         }
1754       else
1755         {
1756           /* Matching elts, generate A ^= B.  */
1757           unsigned ix;
1758           BITMAP_WORD ior = 0;
1759           bitmap_element *next = a_elt->next;
1760
1761           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1762             {
1763               BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1764
1765               ior |= r;
1766               a_elt->bits[ix] = r;
1767             }
1768           b_elt = b_elt->next;
1769           if (ior)
1770             a_prev = a_elt;
1771           else
1772             bitmap_element_free (a, a_elt);
1773           a_elt = next;
1774         }
1775     }
1776   gcc_checking_assert (!a->current == !a->first);
1777   if (a->current)
1778     a->indx = a->current->indx;
1779 }
1780
1781 /* Return true if two bitmaps are identical.
1782    We do not bother with a check for pointer equality, as that never
1783    occurs in practice.  */
1784
1785 bool
1786 bitmap_equal_p (const_bitmap a, const_bitmap b)
1787 {
1788   const bitmap_element *a_elt;
1789   const bitmap_element *b_elt;
1790   unsigned ix;
1791
1792   for (a_elt = a->first, b_elt = b->first;
1793        a_elt && b_elt;
1794        a_elt = a_elt->next, b_elt = b_elt->next)
1795     {
1796       if (a_elt->indx != b_elt->indx)
1797         return false;
1798       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1799         if (a_elt->bits[ix] != b_elt->bits[ix])
1800           return false;
1801     }
1802   return !a_elt && !b_elt;
1803 }
1804
1805 /* Return true if A AND B is not empty.  */
1806
1807 bool
1808 bitmap_intersect_p (const_bitmap a, const_bitmap b)
1809 {
1810   const bitmap_element *a_elt;
1811   const bitmap_element *b_elt;
1812   unsigned ix;
1813
1814   for (a_elt = a->first, b_elt = b->first;
1815        a_elt && b_elt;)
1816     {
1817       if (a_elt->indx < b_elt->indx)
1818         a_elt = a_elt->next;
1819       else if (b_elt->indx < a_elt->indx)
1820         b_elt = b_elt->next;
1821       else
1822         {
1823           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1824             if (a_elt->bits[ix] & b_elt->bits[ix])
1825               return true;
1826           a_elt = a_elt->next;
1827           b_elt = b_elt->next;
1828         }
1829     }
1830   return false;
1831 }
1832
1833 /* Return true if A AND NOT B is not empty.  */
1834
1835 bool
1836 bitmap_intersect_compl_p (const_bitmap a, const_bitmap b)
1837 {
1838   const bitmap_element *a_elt;
1839   const bitmap_element *b_elt;
1840   unsigned ix;
1841   for (a_elt = a->first, b_elt = b->first;
1842        a_elt && b_elt;)
1843     {
1844       if (a_elt->indx < b_elt->indx)
1845         return true;
1846       else if (b_elt->indx < a_elt->indx)
1847         b_elt = b_elt->next;
1848       else
1849         {
1850           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1851             if (a_elt->bits[ix] & ~b_elt->bits[ix])
1852               return true;
1853           a_elt = a_elt->next;
1854           b_elt = b_elt->next;
1855         }
1856     }
1857   return a_elt != NULL;
1858 }
1859
1860 \f
1861 /* DST = A | (FROM1 & ~FROM2).  Return true if DST changes.  */
1862
1863 bool
1864 bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b, const_bitmap kill)
1865 {
1866   bool changed = false;
1867
1868   bitmap_element *dst_elt = dst->first;
1869   const bitmap_element *a_elt = a->first;
1870   const bitmap_element *b_elt = b->first;
1871   const bitmap_element *kill_elt = kill->first;
1872   bitmap_element *dst_prev = NULL;
1873   bitmap_element **dst_prev_pnext = &dst->first;
1874
1875   gcc_assert (dst != a && dst != b && dst != kill);
1876
1877   /* Special cases.  We don't bother checking for bitmap_equal_p (b, kill).  */
1878   if (b == kill || bitmap_empty_p (b))
1879     {
1880       changed = !bitmap_equal_p (dst, a);
1881       if (changed)
1882         bitmap_copy (dst, a);
1883       return changed;
1884     }
1885   if (bitmap_empty_p (kill))
1886     return bitmap_ior (dst, a, b);
1887   if (bitmap_empty_p (a))
1888     return bitmap_and_compl (dst, b, kill);
1889
1890   while (a_elt || b_elt)
1891     {
1892       bool new_element = false;
1893
1894       if (b_elt)
1895         while (kill_elt && kill_elt->indx < b_elt->indx)
1896           kill_elt = kill_elt->next;
1897
1898       if (b_elt && kill_elt && kill_elt->indx == b_elt->indx
1899           && (!a_elt || a_elt->indx >= b_elt->indx))
1900         {
1901           bitmap_element tmp_elt;
1902           unsigned ix;
1903
1904           BITMAP_WORD ior = 0;
1905           tmp_elt.indx = b_elt->indx;
1906           for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1907             {
1908               BITMAP_WORD r = b_elt->bits[ix] & ~kill_elt->bits[ix];
1909               ior |= r;
1910               tmp_elt.bits[ix] = r;
1911             }
1912
1913           if (ior)
1914             {
1915               changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
1916                                         a_elt, &tmp_elt, changed);
1917               new_element = true;
1918               if (a_elt && a_elt->indx == b_elt->indx)
1919                 a_elt = a_elt->next;
1920             }
1921
1922           b_elt = b_elt->next;
1923           kill_elt = kill_elt->next;
1924         }
1925       else
1926         {
1927           changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
1928                                     a_elt, b_elt, changed);
1929           new_element = true;
1930
1931           if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1932             {
1933               a_elt = a_elt->next;
1934               b_elt = b_elt->next;
1935             }
1936           else
1937             {
1938               if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
1939                 a_elt = a_elt->next;
1940               else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
1941                 b_elt = b_elt->next;
1942             }
1943         }
1944
1945       if (new_element)
1946         {
1947           dst_prev = *dst_prev_pnext;
1948           dst_prev_pnext = &dst_prev->next;
1949           dst_elt = *dst_prev_pnext;
1950         }
1951     }
1952
1953   if (dst_elt)
1954     {
1955       changed = true;
1956       /* Ensure that dst->current is valid.  */
1957       dst->current = dst->first;
1958       bitmap_elt_clear_from (dst, dst_elt);
1959     }
1960   gcc_checking_assert (!dst->current == !dst->first);
1961   if (dst->current)
1962     dst->indx = dst->current->indx;
1963
1964   return changed;
1965 }
1966
1967 /* A |= (FROM1 & ~FROM2).  Return true if A changes.  */
1968
1969 bool
1970 bitmap_ior_and_compl_into (bitmap a, const_bitmap from1, const_bitmap from2)
1971 {
1972   bitmap_head tmp;
1973   bool changed;
1974
1975   bitmap_initialize (&tmp, &bitmap_default_obstack);
1976   bitmap_and_compl (&tmp, from1, from2);
1977   changed = bitmap_ior_into (a, &tmp);
1978   bitmap_clear (&tmp);
1979
1980   return changed;
1981 }
1982
1983 /* A |= (B & C).  Return true if A changes.  */
1984
1985 bool
1986 bitmap_ior_and_into (bitmap a, const_bitmap b, const_bitmap c)
1987 {
1988   bitmap_element *a_elt = a->first;
1989   const bitmap_element *b_elt = b->first;
1990   const bitmap_element *c_elt = c->first;
1991   bitmap_element and_elt;
1992   bitmap_element *a_prev = NULL;
1993   bitmap_element **a_prev_pnext = &a->first;
1994   bool changed = false;
1995   unsigned ix;
1996
1997   if (b == c)
1998     return bitmap_ior_into (a, b);
1999   if (bitmap_empty_p (b) || bitmap_empty_p (c))
2000     return false;
2001
2002   and_elt.indx = -1;
2003   while (b_elt && c_elt)
2004     {
2005       BITMAP_WORD overall;
2006
2007       /* Find a common item of B and C.  */
2008       while (b_elt->indx != c_elt->indx)
2009         {
2010           if (b_elt->indx < c_elt->indx)
2011             {
2012               b_elt = b_elt->next;
2013               if (!b_elt)
2014                 goto done;
2015             }
2016           else
2017             {
2018               c_elt = c_elt->next;
2019               if (!c_elt)
2020                 goto done;
2021             }
2022         }
2023
2024       overall = 0;
2025       and_elt.indx = b_elt->indx;
2026       for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2027         {
2028           and_elt.bits[ix] = b_elt->bits[ix] & c_elt->bits[ix];
2029           overall |= and_elt.bits[ix];
2030         }
2031
2032       b_elt = b_elt->next;
2033       c_elt = c_elt->next;
2034       if (!overall)
2035         continue;
2036
2037       /* Now find a place to insert AND_ELT.  */
2038       do
2039         {
2040           ix = a_elt ? a_elt->indx : and_elt.indx;
2041           if (ix == and_elt.indx)
2042             changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, &and_elt, changed);
2043           else if (ix > and_elt.indx)
2044             changed = bitmap_elt_copy (a, NULL, a_prev, &and_elt, changed);
2045
2046           a_prev = *a_prev_pnext;
2047           a_prev_pnext = &a_prev->next;
2048           a_elt = *a_prev_pnext;
2049
2050           /* If A lagged behind B/C, we advanced it so loop once more.  */
2051         }
2052       while (ix < and_elt.indx);
2053     }
2054
2055  done:
2056   gcc_checking_assert (!a->current == !a->first);
2057   if (a->current)
2058     a->indx = a->current->indx;
2059   return changed;
2060 }
2061
2062 /* Compute hash of bitmap (for purposes of hashing).  */
2063 hashval_t
2064 bitmap_hash (const_bitmap head)
2065 {
2066   const bitmap_element *ptr;
2067   BITMAP_WORD hash = 0;
2068   int ix;
2069
2070   for (ptr = head->first; ptr; ptr = ptr->next)
2071     {
2072       hash ^= ptr->indx;
2073       for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
2074         hash ^= ptr->bits[ix];
2075     }
2076   return (hashval_t)hash;
2077 }
2078
2079 \f
2080 /* Debugging function to print out the contents of a bitmap.  */
2081
2082 DEBUG_FUNCTION void
2083 debug_bitmap_file (FILE *file, const_bitmap head)
2084 {
2085   const bitmap_element *ptr;
2086
2087   fprintf (file, "\nfirst = " HOST_PTR_PRINTF
2088            " current = " HOST_PTR_PRINTF " indx = %u\n",
2089            (void *) head->first, (void *) head->current, head->indx);
2090
2091   for (ptr = head->first; ptr; ptr = ptr->next)
2092     {
2093       unsigned int i, j, col = 26;
2094
2095       fprintf (file, "\t" HOST_PTR_PRINTF " next = " HOST_PTR_PRINTF
2096                " prev = " HOST_PTR_PRINTF " indx = %u\n\t\tbits = {",
2097                (const void*) ptr, (const void*) ptr->next,
2098                (const void*) ptr->prev, ptr->indx);
2099
2100       for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
2101         for (j = 0; j < BITMAP_WORD_BITS; j++)
2102           if ((ptr->bits[i] >> j) & 1)
2103             {
2104               if (col > 70)
2105                 {
2106                   fprintf (file, "\n\t\t\t");
2107                   col = 24;
2108                 }
2109
2110               fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
2111                                      + i * BITMAP_WORD_BITS + j));
2112               col += 4;
2113             }
2114
2115       fprintf (file, " }\n");
2116     }
2117 }
2118
2119 /* Function to be called from the debugger to print the contents
2120    of a bitmap.  */
2121
2122 DEBUG_FUNCTION void
2123 debug_bitmap (const_bitmap head)
2124 {
2125   debug_bitmap_file (stderr, head);
2126 }
2127
2128 /* Function to print out the contents of a bitmap.  Unlike debug_bitmap_file,
2129    it does not print anything but the bits.  */
2130
2131 DEBUG_FUNCTION void
2132 bitmap_print (FILE *file, const_bitmap head, const char *prefix,
2133               const char *suffix)
2134 {
2135   const char *comma = "";
2136   unsigned i;
2137   bitmap_iterator bi;
2138
2139   fputs (prefix, file);
2140   EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
2141     {
2142       fprintf (file, "%s%d", comma, i);
2143       comma = ", ";
2144     }
2145   fputs (suffix, file);
2146 }
2147
2148
2149 /* Used to accumulate statistics about bitmap sizes.  */
2150 struct bitmap_output_info
2151 {
2152   uint64_t size;
2153   uint64_t count;
2154 };
2155
2156 /* Called via hash_table::traverse.  Output bitmap descriptor pointed out by
2157    SLOT and update statistics.  */
2158 int
2159 print_statistics (bitmap_descriptor_d **slot, bitmap_output_info *i)
2160 {
2161   bitmap_descriptor d = *slot;
2162   char s[4096];
2163
2164   if (d->allocated)
2165     {
2166       const char *s1 = d->file;
2167       const char *s2;
2168       while ((s2 = strstr (s1, "gcc/")))
2169         s1 = s2 + 4;
2170       sprintf (s, "%s:%i (%s)", s1, d->line, d->function);
2171       s[41] = 0;
2172       fprintf (stderr,
2173                "%-41s %9u %15" PRId64" %15" PRId64" %15" PRId64
2174                " %10" PRId64" %10" PRId64"\n",
2175                s, d->created,
2176                d->allocated, d->peak, d->current,
2177                d->nsearches, d->search_iter);
2178       i->size += d->allocated;
2179       i->count += d->created;
2180     }
2181   return 1;
2182 }
2183
2184 /* Output per-bitmap memory usage statistics.  */
2185 void
2186 dump_bitmap_statistics (void)
2187 {
2188   struct bitmap_output_info info;
2189
2190   if (! GATHER_STATISTICS)
2191     return;
2192
2193   if (!bitmap_desc_hash)
2194     return;
2195
2196   fprintf (stderr,
2197            "\n%-41s %9s %15s %15s %15s %10s %10s\n",
2198            "Bitmap", "Overall",
2199            "Allocated", "Peak", "Leak",
2200            "searched", "search_itr");
2201   fprintf (stderr, "---------------------------------------------------------------------------------\n");
2202   info.count = 0;
2203   info.size = 0;
2204   bitmap_desc_hash->traverse <bitmap_output_info *, print_statistics> (&info);
2205   fprintf (stderr, "---------------------------------------------------------------------------------\n");
2206   fprintf (stderr,
2207            "%-41s %9" PRId64" %15" PRId64"\n",
2208            "Total", info.count, info.size);
2209   fprintf (stderr, "---------------------------------------------------------------------------------\n");
2210 }
2211
2212 DEBUG_FUNCTION void
2213 debug (const bitmap_head &ref)
2214 {
2215   dump_bitmap (stderr, &ref);
2216 }
2217
2218 DEBUG_FUNCTION void
2219 debug (const bitmap_head *ptr)
2220 {
2221   if (ptr)
2222     debug (*ptr);
2223   else
2224     fprintf (stderr, "<nil>\n");
2225 }
2226
2227
2228 #include "gt-bitmap.h"