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