1/* Functions to support general ended bitmaps.
2   Copyright (C) 1997-2015 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along 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.  */
30struct 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
44typedef struct bitmap_descriptor_d *bitmap_descriptor;
45typedef const struct bitmap_descriptor_d *const_bitmap_descriptor;
46
47/* Next available unique id number for bitmap desciptors.  */
48static int next_bitmap_desc_id = 0;
49
50/* Vector mapping descriptor ids to descriptors.  */
51static vec<bitmap_descriptor> bitmap_descriptors;
52
53/* Hashtable helpers.  */
54
55struct loc
56{
57  const char *file;
58  const char *function;
59  int line;
60};
61
62struct 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
70inline hashval_t
71bitmap_desc_hasher::hash (const value_type *d)
72{
73  return htab_hash_pointer (d->file) + d->line;
74}
75
76inline bool
77bitmap_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.  */
83static hash_table<bitmap_desc_hasher> *bitmap_desc_hash;
84
85/* For given file and line, return descriptor, create new if needed.  */
86static bitmap_descriptor
87get_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.  */
116void
117bitmap_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.  */
125static void
126register_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 */
137bitmap_element bitmap_zero_bits;  /* An element of all zero bits.  */
138bitmap_obstack bitmap_default_obstack;    /* The default bitmap obstack.  */
139static int bitmap_default_obstack_depth;
140static GTY((deletable)) bitmap_element *bitmap_ggc_free; /* Freelist of
141							    GC'd elements.  */
142
143static void bitmap_elem_to_freelist (bitmap, bitmap_element *);
144static void bitmap_element_free (bitmap, bitmap_element *);
145static bitmap_element *bitmap_element_allocate (bitmap);
146static int bitmap_element_zerop (const bitmap_element *);
147static void bitmap_element_link (bitmap, bitmap_element *);
148static bitmap_element *bitmap_elt_insert_after (bitmap, bitmap_element *, unsigned int);
149static void bitmap_elt_clear_from (bitmap, bitmap_element *);
150static bitmap_element *bitmap_find_bit (bitmap, unsigned int);
151
152
153/* Add ELEM to the appropriate freelist.  */
154static inline void
155bitmap_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
175static inline void
176bitmap_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
207/* Allocate a bitmap element.  The bits are cleared, but nothing else is.  */
208
209static inline bitmap_element *
210bitmap_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
261void
262bitmap_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
309void
310bitmap_clear (bitmap head)
311{
312  if (head->first)
313    bitmap_elt_clear_from (head, head->first);
314}
315
316/* Initialize a bitmap obstack.  If BIT_OBSTACK is NULL, initialize
317   the default bitmap obstack.  */
318
319void
320bitmap_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
344void
345bitmap_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
365bitmap
366bitmap_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
387bitmap
388bitmap_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
403void
404bitmap_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
419/* Return nonzero if all bits in an element are zero.  */
420
421static inline int
422bitmap_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
437/* Link the bitmap element into the current bitmap linked list.  */
438
439static inline void
440bitmap_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
496static bitmap_element *
497bitmap_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
527/* Copy a bitmap to another bitmap.  */
528
529void
530bitmap_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
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
569static inline bitmap_element *
570bitmap_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
630/* Clear a single bit in a bitmap.  Return true if the bit changed.  */
631
632bool
633bitmap_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
660bool
661bitmap_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
687int
688bitmap_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
704#if GCC_VERSION < 3400
705/* Table of number of set bits in a character, indexed by value of char.  */
706static 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
718static unsigned long
719bitmap_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
732unsigned long
733bitmap_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
758bool
759bitmap_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
794unsigned
795bitmap_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
845unsigned
846bitmap_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
886
887/* DST = A & B.  */
888
889void
890bitmap_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
947bool
948bitmap_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
1008static inline bool
1009bitmap_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
1039bool
1040bitmap_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
1152bool
1153bitmap_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.  */
1205void
1206bitmap_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.  */
1305void
1306bitmap_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
1432void
1433bitmap_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
1504static inline bool
1505bitmap_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
1561bool
1562bitmap_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
1610bool
1611bitmap_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
1649void
1650bitmap_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
1726void
1727bitmap_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
1785bool
1786bitmap_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
1807bool
1808bitmap_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
1835bool
1836bitmap_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
1861/* DST = A | (FROM1 & ~FROM2).  Return true if DST changes.  */
1862
1863bool
1864bitmap_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
1969bool
1970bitmap_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
1985bool
1986bitmap_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).  */
2063hashval_t
2064bitmap_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
2080/* Debugging function to print out the contents of a bitmap.  */
2081
2082DEBUG_FUNCTION void
2083debug_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
2122DEBUG_FUNCTION void
2123debug_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
2131DEBUG_FUNCTION void
2132bitmap_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.  */
2150struct 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.  */
2158int
2159print_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.  */
2185void
2186dump_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
2212DEBUG_FUNCTION void
2213debug (const bitmap_head &ref)
2214{
2215  dump_bitmap (stderr, &ref);
2216}
2217
2218DEBUG_FUNCTION void
2219debug (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"
2229