OSDN Git Service

Move ChangeLog entry for testsuite/gcc.dg/20050922-1.c from
[pf3gnuchains/gcc-fork.git] / gcc / bitmap.c
1 /* Functions to support general ended bitmaps.
2    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
3    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 2, 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 COPYING.  If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "rtl.h"
27 #include "flags.h"
28 #include "obstack.h"
29 #include "ggc.h"
30 #include "bitmap.h"
31 #include "hashtab.h"
32
33 #ifdef GATHER_STATISTICS
34
35 /* Store information about each particular bitmap.  */
36 struct bitmap_descriptor
37 {
38   const char *function;
39   const char *file;
40   int line;
41   int allocated;
42   int created;
43   int peak;
44   int current;
45   int nsearches;
46 };
47
48 /* Hashtable mapping bitmap names to descriptors.  */
49 static htab_t bitmap_desc_hash;
50
51 /* Hashtable helpers.  */
52 static hashval_t
53 hash_descriptor (const void *p)
54 {
55   const struct bitmap_descriptor *d = p;
56   return htab_hash_pointer (d->file) + d->line;
57 }
58 struct loc
59 {
60   const char *file;
61   const char *function;
62   int line;
63 };
64 static int
65 eq_descriptor (const void *p1, const void *p2)
66 {
67   const struct bitmap_descriptor *d = p1;
68   const struct loc *l = p2;
69   return d->file == l->file && d->function == l->function && d->line == l->line;
70 }
71
72 /* For given file and line, return descriptor, create new if needed.  */
73 static struct bitmap_descriptor *
74 bitmap_descriptor (const char *file, const char *function, int line)
75 {
76   struct bitmap_descriptor **slot;
77   struct loc loc;
78
79   loc.file = file;
80   loc.function = function;
81   loc.line = line;
82
83   if (!bitmap_desc_hash)
84     bitmap_desc_hash = htab_create (10, hash_descriptor, eq_descriptor, NULL);
85
86   slot = (struct bitmap_descriptor **)
87     htab_find_slot_with_hash (bitmap_desc_hash, &loc,
88                               htab_hash_pointer (file) + line,
89                               1);
90   if (*slot)
91     return *slot;
92   *slot = xcalloc (sizeof (**slot), 1);
93   (*slot)->file = file;
94   (*slot)->function = function;
95   (*slot)->line = line;
96   return *slot;
97 }
98
99 /* Register new bitmap.  */
100 void
101 bitmap_register (bitmap b MEM_STAT_DECL)
102 {
103   b->desc = bitmap_descriptor (_loc_name, _loc_function, _loc_line);
104   b->desc->created++;
105 }
106
107 /* Account the overhead.  */
108 static void
109 register_overhead (bitmap b, int amount)
110 {
111   b->desc->current += amount;
112   if (amount > 0)
113     b->desc->allocated += amount;
114   gcc_assert (b->desc->current >= 0);
115   if (b->desc->peak < b->desc->current)
116     b->desc->peak = b->desc->current;
117 }
118 #endif
119
120 /* Global data */
121 bitmap_element bitmap_zero_bits;  /* An element of all zero bits.  */
122 bitmap_obstack bitmap_default_obstack;    /* The default bitmap obstack.  */
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 (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 \f
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 \f
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_NEW (bitmap_element);
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 inline void
293 bitmap_clear (bitmap head)
294 {
295   if (head->first)
296     bitmap_elt_clear_from (head, head->first);
297 }
298 \f
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     bit_obstack = &bitmap_default_obstack;
307
308 #if !defined(__GNUC__) || (__GNUC__ < 2)
309 #define __alignof__(type) 0
310 #endif
311
312   bit_obstack->elements = NULL;
313   bit_obstack->heads = NULL;
314   obstack_specify_allocation (&bit_obstack->obstack, OBSTACK_CHUNK_SIZE,
315                               __alignof__ (bitmap_element),
316                               obstack_chunk_alloc,
317                               obstack_chunk_free);
318 }
319
320 /* Release the memory from a bitmap obstack.  If BIT_OBSTACK is NULL,
321    release the default bitmap obstack.  */
322
323 void
324 bitmap_obstack_release (bitmap_obstack *bit_obstack)
325 {
326   if (!bit_obstack)
327     bit_obstack = &bitmap_default_obstack;
328
329   bit_obstack->elements = NULL;
330   bit_obstack->heads = NULL;
331   obstack_free (&bit_obstack->obstack, NULL);
332 }
333
334 /* Create a new bitmap on an obstack.  If BIT_OBSTACK is NULL, create
335    it on the default bitmap obstack.  */
336
337 bitmap
338 bitmap_obstack_alloc_stat (bitmap_obstack *bit_obstack MEM_STAT_DECL)
339 {
340   bitmap map;
341
342   if (!bit_obstack)
343     bit_obstack = &bitmap_default_obstack;
344   map = bit_obstack->heads;
345   if (map)
346     bit_obstack->heads = (void *)map->first;
347   else
348     map = XOBNEW (&bit_obstack->obstack, bitmap_head);
349   bitmap_initialize_stat (map, bit_obstack PASS_MEM_STAT);
350 #ifdef GATHER_STATISTICS
351   register_overhead (map, sizeof (bitmap_head));
352 #endif
353
354   return map;
355 }
356
357 /* Create a new GCd bitmap.  */
358
359 bitmap
360 bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL)
361 {
362   bitmap map;
363
364   map = GGC_NEW (struct bitmap_head_def);
365   bitmap_initialize_stat (map, NULL PASS_MEM_STAT);
366 #ifdef GATHER_STATISTICS
367   register_overhead (map, sizeof (bitmap_head));
368 #endif
369
370   return map;
371 }
372
373 /* Release an obstack allocated bitmap.  */
374
375 void
376 bitmap_obstack_free (bitmap map)
377 {
378   if (map)
379     {
380       bitmap_clear (map);
381       map->first = (void *)map->obstack->heads;
382 #ifdef GATHER_STATISTICS
383       register_overhead (map, -((int)sizeof (bitmap_head)));
384 #endif
385       map->obstack->heads = map;
386     }
387 }
388
389 \f
390 /* Return nonzero if all bits in an element are zero.  */
391
392 static inline int
393 bitmap_element_zerop (bitmap_element *element)
394 {
395 #if BITMAP_ELEMENT_WORDS == 2
396   return (element->bits[0] | element->bits[1]) == 0;
397 #else
398   unsigned i;
399
400   for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
401     if (element->bits[i] != 0)
402       return 0;
403
404   return 1;
405 #endif
406 }
407 \f
408 /* Link the bitmap element into the current bitmap linked list.  */
409
410 static inline void
411 bitmap_element_link (bitmap head, bitmap_element *element)
412 {
413   unsigned int indx = element->indx;
414   bitmap_element *ptr;
415
416   /* If this is the first and only element, set it in.  */
417   if (head->first == 0)
418     {
419       element->next = element->prev = 0;
420       head->first = element;
421     }
422
423   /* If this index is less than that of the current element, it goes someplace
424      before the current element.  */
425   else if (indx < head->indx)
426     {
427       for (ptr = head->current;
428            ptr->prev != 0 && ptr->prev->indx > indx;
429            ptr = ptr->prev)
430         ;
431
432       if (ptr->prev)
433         ptr->prev->next = element;
434       else
435         head->first = element;
436
437       element->prev = ptr->prev;
438       element->next = ptr;
439       ptr->prev = element;
440     }
441
442   /* Otherwise, it must go someplace after the current element.  */
443   else
444     {
445       for (ptr = head->current;
446            ptr->next != 0 && ptr->next->indx < indx;
447            ptr = ptr->next)
448         ;
449
450       if (ptr->next)
451         ptr->next->prev = element;
452
453       element->next = ptr->next;
454       element->prev = ptr;
455       ptr->next = element;
456     }
457
458   /* Set up so this is the first element searched.  */
459   head->current = element;
460   head->indx = indx;
461 }
462
463 /* Insert a new uninitialized element into bitmap HEAD after element
464    ELT.  If ELT is NULL, insert the element at the start.  Return the
465    new element.  */
466
467 static bitmap_element *
468 bitmap_elt_insert_after (bitmap head, bitmap_element *elt, unsigned int indx)
469 {
470   bitmap_element *node = bitmap_element_allocate (head);
471   node->indx = indx;
472
473   if (!elt)
474     {
475       if (!head->current)
476         {
477           head->current = node;
478           head->indx = indx;
479         }
480       node->next = head->first;
481       if (node->next)
482         node->next->prev = node;
483       head->first = node;
484       node->prev = NULL;
485     }
486   else
487     {
488       gcc_assert (head->current);
489       node->next = elt->next;
490       if (node->next)
491         node->next->prev = node;
492       elt->next = node;
493       node->prev = elt;
494     }
495   return node;
496 }
497 \f
498 /* Copy a bitmap to another bitmap.  */
499
500 void
501 bitmap_copy (bitmap to, bitmap from)
502 {
503   bitmap_element *from_ptr, *to_ptr = 0;
504
505   bitmap_clear (to);
506
507   /* Copy elements in forward direction one at a time.  */
508   for (from_ptr = from->first; from_ptr; from_ptr = from_ptr->next)
509     {
510       bitmap_element *to_elt = bitmap_element_allocate (to);
511
512       to_elt->indx = from_ptr->indx;
513       memcpy (to_elt->bits, from_ptr->bits, sizeof (to_elt->bits));
514
515       /* Here we have a special case of bitmap_element_link, for the case
516          where we know the links are being entered in sequence.  */
517       if (to_ptr == 0)
518         {
519           to->first = to->current = to_elt;
520           to->indx = from_ptr->indx;
521           to_elt->next = to_elt->prev = 0;
522         }
523       else
524         {
525           to_elt->prev = to_ptr;
526           to_elt->next = 0;
527           to_ptr->next = to_elt;
528         }
529
530       to_ptr = to_elt;
531     }
532 }
533 \f
534 /* Find a bitmap element that would hold a bitmap's bit.
535    Update the `current' field even if we can't find an element that
536    would hold the bitmap's bit to make eventual allocation
537    faster.  */
538
539 static inline bitmap_element *
540 bitmap_find_bit (bitmap head, unsigned int bit)
541 {
542   bitmap_element *element;
543   unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
544
545 #ifdef GATHER_STATISTICS
546   head->desc->nsearches++;
547 #endif
548   if (head->current == 0
549       || head->indx == indx)
550     return head->current;
551
552   if (head->indx < indx)
553     /* INDX is beyond head->indx.  Search from head->current
554        forward.  */
555     for (element = head->current;
556          element->next != 0 && element->indx < indx;
557          element = element->next)
558       ;
559
560   else if (head->indx / 2 < indx)
561     /* INDX is less than head->indx and closer to head->indx than to
562        0.  Search from head->current backward.  */
563     for (element = head->current;
564          element->prev != 0 && element->indx > indx;
565          element = element->prev)
566       ;
567
568   else
569     /* INDX is less than head->indx and closer to 0 than to
570        head->indx.  Search from head->first forward.  */
571     for (element = head->first;
572          element->next != 0 && element->indx < indx;
573          element = element->next)
574       ;
575
576   /* `element' is the nearest to the one we want.  If it's not the one we
577      want, the one we want doesn't exist.  */
578   head->current = element;
579   head->indx = element->indx;
580   if (element != 0 && element->indx != indx)
581     element = 0;
582
583   return element;
584 }
585 \f
586 /* Clear a single bit in a bitmap.  */
587
588 void
589 bitmap_clear_bit (bitmap head, int bit)
590 {
591   bitmap_element *ptr = bitmap_find_bit (head, bit);
592
593   if (ptr != 0)
594     {
595       unsigned bit_num  = bit % BITMAP_WORD_BITS;
596       unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
597       ptr->bits[word_num] &= ~ (((BITMAP_WORD) 1) << bit_num);
598
599       /* If we cleared the entire word, free up the element.  */
600       if (bitmap_element_zerop (ptr))
601         bitmap_element_free (head, ptr);
602     }
603 }
604
605 /* Set a single bit in a bitmap.  */
606
607 void
608 bitmap_set_bit (bitmap head, int bit)
609 {
610   bitmap_element *ptr = bitmap_find_bit (head, bit);
611   unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
612   unsigned bit_num  = bit % BITMAP_WORD_BITS;
613   BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
614
615   if (ptr == 0)
616     {
617       ptr = bitmap_element_allocate (head);
618       ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
619       ptr->bits[word_num] = bit_val;
620       bitmap_element_link (head, ptr);
621     }
622   else
623     ptr->bits[word_num] |= bit_val;
624 }
625
626 /* Return whether a bit is set within a bitmap.  */
627
628 int
629 bitmap_bit_p (bitmap head, int bit)
630 {
631   bitmap_element *ptr;
632   unsigned bit_num;
633   unsigned word_num;
634
635   ptr = bitmap_find_bit (head, bit);
636   if (ptr == 0)
637     return 0;
638
639   bit_num = bit % BITMAP_WORD_BITS;
640   word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
641
642   return (ptr->bits[word_num] >> bit_num) & 1;
643 }
644 \f
645 #if GCC_VERSION < 3400
646 /* Table of number of set bits in a character, indexed by value of char.  */
647 static unsigned char popcount_table[] =
648 {
649     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,
650     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,
651     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,
652     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,
653     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,
654     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,
655     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,
656     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,
657 };
658
659 static unsigned long
660 bitmap_popcount (BITMAP_WORD a)
661 {
662   unsigned long ret = 0;
663   unsigned i;
664
665   /* Just do this the table way for now  */
666   for (i = 0; i < BITMAP_WORD_BITS; i+= 8)
667     ret += popcount_table[(a >> i) & 0xff];
668   return ret;
669 }
670 #endif
671 /* Count the number of bits set in the bitmap, and return it.  */
672
673 unsigned long
674 bitmap_count_bits (bitmap a)
675 {
676   unsigned long count = 0;
677   bitmap_element *elt;
678   unsigned ix;
679
680   for (elt = a->first; elt; elt = elt->next)
681     {
682       for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
683         {
684 #if GCC_VERSION >= 3400
685           /* Note that popcountl matches BITMAP_WORD in type, so the actual size
686          of BITMAP_WORD is not material.  */
687           count += __builtin_popcountl (elt->bits[ix]);
688 #else
689           count += bitmap_popcount (elt->bits[ix]);
690 #endif
691         }
692     }
693   return count;
694 }
695
696
697
698 /* Return the bit number of the first set bit in the bitmap.  The
699    bitmap must be non-empty.  */
700
701 unsigned
702 bitmap_first_set_bit (bitmap a)
703 {
704   bitmap_element *elt = a->first;
705   unsigned bit_no;
706   BITMAP_WORD word;
707   unsigned ix;
708
709   gcc_assert (elt);
710   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
711   for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
712     {
713       word = elt->bits[ix];
714       if (word)
715         goto found_bit;
716     }
717   gcc_unreachable ();
718  found_bit:
719   bit_no += ix * BITMAP_WORD_BITS;
720
721 #if GCC_VERSION >= 3004
722   gcc_assert (sizeof(long) == sizeof (word));
723   bit_no += __builtin_ctzl (word);
724 #else
725   /* Binary search for the first set bit.  */
726 #if BITMAP_WORD_BITS > 64
727 #error "Fill out the table."
728 #endif
729 #if BITMAP_WORD_BITS > 32
730   if (!(word & 0xffffffff))
731     word >>= 32, bit_no += 32;
732 #endif
733   if (!(word & 0xffff))
734     word >>= 16, bit_no += 16;
735   if (!(word & 0xff))
736     word >>= 8, bit_no += 8;
737   if (!(word & 0xf))
738     word >>= 4, bit_no += 4;
739   if (!(word & 0x3))
740     word >>= 2, bit_no += 2;
741   if (!(word & 0x1))
742     word >>= 1, bit_no += 1;
743
744  gcc_assert (word & 1);
745 #endif
746  return bit_no;
747 }
748 \f
749
750 /* DST = A & B.  */
751
752 void
753 bitmap_and (bitmap dst, bitmap a, bitmap b)
754 {
755   bitmap_element *dst_elt = dst->first;
756   bitmap_element *a_elt = a->first;
757   bitmap_element *b_elt = b->first;
758   bitmap_element *dst_prev = NULL;
759
760   gcc_assert (dst != a && dst != b);
761
762   if (a == b)
763     {
764       bitmap_copy (dst, a);
765       return;
766     }
767
768   while (a_elt && b_elt)
769     {
770       if (a_elt->indx < b_elt->indx)
771         a_elt = a_elt->next;
772       else if (b_elt->indx < a_elt->indx)
773         b_elt = b_elt->next;
774       else
775         {
776           /* Matching elts, generate A & B.  */
777           unsigned ix;
778           BITMAP_WORD ior = 0;
779
780           if (!dst_elt)
781             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
782           else
783             dst_elt->indx = a_elt->indx;
784           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
785             {
786               BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
787
788               dst_elt->bits[ix] = r;
789               ior |= r;
790             }
791           if (ior)
792             {
793               dst_prev = dst_elt;
794               dst_elt = dst_elt->next;
795             }
796           a_elt = a_elt->next;
797           b_elt = b_elt->next;
798         }
799     }
800   bitmap_elt_clear_from (dst, dst_elt);
801   gcc_assert (!dst->current == !dst->first);
802   if (dst->current)
803     dst->indx = dst->current->indx;
804 }
805
806 /* A &= B.  */
807
808 void
809 bitmap_and_into (bitmap a, bitmap b)
810 {
811   bitmap_element *a_elt = a->first;
812   bitmap_element *b_elt = b->first;
813   bitmap_element *next;
814
815   if (a == b)
816     return;
817
818   while (a_elt && b_elt)
819     {
820       if (a_elt->indx < b_elt->indx)
821         {
822           next = a_elt->next;
823           bitmap_element_free (a, a_elt);
824           a_elt = next;
825         }
826       else if (b_elt->indx < a_elt->indx)
827         b_elt = b_elt->next;
828       else
829         {
830           /* Matching elts, generate A &= B.  */
831           unsigned ix;
832           BITMAP_WORD ior = 0;
833
834           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
835             {
836               BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
837
838               a_elt->bits[ix] = r;
839               ior |= r;
840             }
841           next = a_elt->next;
842           if (!ior)
843             bitmap_element_free (a, a_elt);
844           a_elt = next;
845           b_elt = b_elt->next;
846         }
847     }
848   bitmap_elt_clear_from (a, a_elt);
849   gcc_assert (!a->current == !a->first);
850   gcc_assert (!a->current || a->indx == a->current->indx);
851 }
852
853 /* DST = A & ~B  */
854
855 void
856 bitmap_and_compl (bitmap dst, bitmap a, bitmap b)
857 {
858   bitmap_element *dst_elt = dst->first;
859   bitmap_element *a_elt = a->first;
860   bitmap_element *b_elt = b->first;
861   bitmap_element *dst_prev = NULL;
862
863   gcc_assert (dst != a && dst != b);
864
865   if (a == b)
866     {
867       bitmap_clear (dst);
868       return;
869     }
870
871   while (a_elt)
872     {
873       if (!b_elt || a_elt->indx < b_elt->indx)
874         {
875           /* Copy a_elt.  */
876           if (!dst_elt)
877             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
878           else
879             dst_elt->indx = a_elt->indx;
880           memcpy (dst_elt->bits, a_elt->bits, sizeof (dst_elt->bits));
881           dst_prev = dst_elt;
882           dst_elt = dst_elt->next;
883           a_elt = a_elt->next;
884         }
885       else if (b_elt->indx < a_elt->indx)
886         b_elt = b_elt->next;
887       else
888         {
889           /* Matching elts, generate A & ~B.  */
890           unsigned ix;
891           BITMAP_WORD ior = 0;
892
893           if (!dst_elt)
894             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
895           else
896             dst_elt->indx = a_elt->indx;
897           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
898             {
899               BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
900
901               dst_elt->bits[ix] = r;
902               ior |= r;
903             }
904           if (ior)
905             {
906               dst_prev = dst_elt;
907               dst_elt = dst_elt->next;
908             }
909           a_elt = a_elt->next;
910           b_elt = b_elt->next;
911         }
912     }
913   bitmap_elt_clear_from (dst, dst_elt);
914   gcc_assert (!dst->current == !dst->first);
915   if (dst->current)
916     dst->indx = dst->current->indx;
917 }
918
919 /* A &= ~B. Returns true if A changes */
920
921 bool
922 bitmap_and_compl_into (bitmap a, bitmap b)
923 {
924   bitmap_element *a_elt = a->first;
925   bitmap_element *b_elt = b->first;
926   bitmap_element *next;
927   BITMAP_WORD changed = 0;
928
929   if (a == b)
930     {
931       if (bitmap_empty_p (a))
932         return false;
933       else
934         {
935           bitmap_clear (a);
936           return true;
937         }
938     }
939
940   while (a_elt && b_elt)
941     {
942       if (a_elt->indx < b_elt->indx)
943         a_elt = a_elt->next;
944       else if (b_elt->indx < a_elt->indx)
945         b_elt = b_elt->next;
946       else
947         {
948           /* Matching elts, generate A &= ~B.  */
949           unsigned ix;
950           BITMAP_WORD ior = 0;
951
952           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
953             {
954               BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
955               BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
956
957               a_elt->bits[ix] = r;
958               changed |= cleared;
959               ior |= r;
960             }
961           next = a_elt->next;
962           if (!ior)
963             bitmap_element_free (a, a_elt);
964           a_elt = next;
965           b_elt = b_elt->next;
966         }
967     }
968   gcc_assert (!a->current == !a->first);
969   gcc_assert (!a->current || a->indx == a->current->indx);
970   return changed != 0;
971 }
972
973 /* Clear COUNT bits from START in HEAD.  */
974 void
975 bitmap_clear_range (bitmap head, unsigned int start, unsigned int count)
976 {
977   unsigned int first_index = start / BITMAP_ELEMENT_ALL_BITS;
978   unsigned int end_bit_plus1 = start + count;
979   unsigned int end_bit = end_bit_plus1 - 1;
980   unsigned int last_index = (end_bit) / BITMAP_ELEMENT_ALL_BITS;
981   bitmap_element *elt = bitmap_find_bit (head, start);
982
983   /* If bitmap_find_bit returns zero, the current is the closest block
984      to the result.  If the current is less than first index, find the
985      next one.  Otherwise, just set elt to be current.  */
986   if (!elt)
987     {
988       if (head->current)
989         {
990           if (head->indx < first_index)
991             {
992               elt = head->current->next;
993               if (!elt)
994                 return;
995             }
996           else
997             elt = head->current;
998         }
999       else
1000         return;
1001     }
1002
1003   while (elt && (elt->indx <= last_index))
1004     {
1005       bitmap_element * next_elt = elt->next;
1006       unsigned elt_start_bit = (elt->indx) * BITMAP_ELEMENT_ALL_BITS;
1007       unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1008
1009
1010       if (elt_start_bit >= start && elt_end_bit_plus1 <= end_bit_plus1)
1011         /* Get rid of the entire elt and go to the next one.  */
1012         bitmap_element_free (head, elt);
1013       else
1014         {
1015           /* Going to have to knock out some bits in this elt.  */
1016           unsigned int first_word_to_mod;
1017           BITMAP_WORD first_mask;
1018           unsigned int last_word_to_mod;
1019           BITMAP_WORD last_mask;
1020           unsigned int i;
1021           bool clear = true;
1022
1023           if (elt_start_bit <= start)
1024             {
1025               /* The first bit to turn off is somewhere inside this
1026                  elt.  */
1027               first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1028
1029               /* This mask should have 1s in all bits >= start position. */
1030               first_mask =
1031                 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1032               first_mask = ~first_mask;
1033             }
1034           else
1035             {
1036               /* The first bit to turn off is below this start of this elt.  */
1037               first_word_to_mod = 0;
1038               first_mask = 0;
1039               first_mask = ~first_mask;
1040             }
1041
1042           if (elt_end_bit_plus1 <= end_bit_plus1)
1043             {
1044               /* The last bit to turn off is beyond this elt.  */
1045               last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1046               last_mask = 0;
1047               last_mask = ~last_mask;
1048             }
1049           else
1050             {
1051               /* The last bit to turn off is inside to this elt.  */
1052               last_word_to_mod =
1053                 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1054
1055               /* The last mask should have 1s below the end bit.  */
1056               last_mask =
1057                 (((BITMAP_WORD) 1) << (((end_bit_plus1) % BITMAP_WORD_BITS))) - 1;
1058             }
1059
1060
1061           if (first_word_to_mod == last_word_to_mod)
1062             {
1063               BITMAP_WORD mask = first_mask & last_mask;
1064               elt->bits[first_word_to_mod] &= ~mask;
1065             }
1066           else
1067             {
1068               elt->bits[first_word_to_mod] &= ~first_mask;
1069               for (i = first_word_to_mod + 1; i < last_word_to_mod; i++)
1070                 elt->bits[i] = 0;
1071               elt->bits[last_word_to_mod] &= ~last_mask;
1072             }
1073           for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1074             if (elt->bits[i])
1075               {
1076                 clear = false;
1077                 break;
1078               }
1079           /* Check to see if there are any bits left.  */
1080           if (clear)
1081             bitmap_element_free (head, elt);
1082         }
1083       elt = next_elt;
1084     }
1085
1086   if (elt)
1087     {
1088       head->current = elt;
1089       head->indx = head->current->indx;
1090     }
1091 }
1092
1093 /* A = ~A & B. */
1094
1095 void
1096 bitmap_compl_and_into (bitmap a, bitmap b)
1097 {
1098   bitmap_element *a_elt = a->first;
1099   bitmap_element *b_elt = b->first;
1100   bitmap_element *a_prev = NULL;
1101   bitmap_element *next;
1102
1103   gcc_assert (a != b);
1104
1105   if (bitmap_empty_p (a))
1106     {
1107       bitmap_copy (a, b);
1108       return;
1109     }
1110   if (bitmap_empty_p (b))
1111     {
1112       bitmap_clear (a);
1113       return;
1114     }
1115
1116   while (a_elt || b_elt)
1117     {
1118       if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1119         {
1120           /* A is before B.  Remove A */
1121           next = a_elt->next;
1122           a_prev = a_elt->prev;
1123           bitmap_element_free (a, a_elt);
1124           a_elt = next;
1125         }
1126       else if (!a_elt || b_elt->indx < a_elt->indx)
1127         {
1128           /* B is before A.  Copy B. */
1129           next = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1130           memcpy (next->bits, b_elt->bits, sizeof (next->bits));
1131           a_prev = next;
1132           b_elt = b_elt->next;
1133         }
1134       else
1135         {
1136           /* Matching elts, generate A = ~A & B.  */
1137           unsigned ix;
1138           BITMAP_WORD ior = 0;
1139
1140           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1141             {
1142               BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1143               BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
1144
1145               a_elt->bits[ix] = r;
1146               ior |= r;
1147             }
1148           next = a_elt->next;
1149           if (!ior)
1150             bitmap_element_free (a, a_elt);
1151           else
1152             a_prev = a_elt;
1153           a_elt = next;
1154           b_elt = b_elt->next;
1155         }
1156     }
1157   gcc_assert (!a->current == !a->first);
1158   gcc_assert (!a->current || a->indx == a->current->indx);
1159   return;
1160 }
1161
1162 /* DST = A | B.  Return true if DST changes.  */
1163
1164 bool
1165 bitmap_ior (bitmap dst, bitmap a, bitmap b)
1166 {
1167   bitmap_element *dst_elt = dst->first;
1168   bitmap_element *a_elt = a->first;
1169   bitmap_element *b_elt = b->first;
1170   bitmap_element *dst_prev = NULL;
1171   bool changed = false;
1172
1173   gcc_assert (dst != a && dst != b);
1174
1175   while (a_elt || b_elt)
1176     {
1177       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1178         {
1179           /* Matching elts, generate A | B.  */
1180           unsigned ix;
1181
1182           if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1183             {
1184               for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1185                 {
1186                   BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1187
1188                   if (r != dst_elt->bits[ix])
1189                     {
1190                       dst_elt->bits[ix] = r;
1191                       changed = true;
1192                     }
1193                 }
1194             }
1195           else
1196             {
1197               changed = true;
1198               if (!dst_elt)
1199                 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1200               else
1201                 dst_elt->indx = a_elt->indx;
1202               for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1203                 {
1204                   BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1205
1206                   dst_elt->bits[ix] = r;
1207                 }
1208             }
1209           a_elt = a_elt->next;
1210           b_elt = b_elt->next;
1211           dst_prev = dst_elt;
1212           dst_elt = dst_elt->next;
1213         }
1214       else
1215         {
1216           /* Copy a single element.  */
1217           bitmap_element *src;
1218
1219           if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1220             {
1221               src = a_elt;
1222               a_elt = a_elt->next;
1223             }
1224           else
1225             {
1226               src = b_elt;
1227               b_elt = b_elt->next;
1228             }
1229
1230           if (!changed && dst_elt && dst_elt->indx == src->indx)
1231             {
1232               unsigned ix;
1233
1234               for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1235                 if (src->bits[ix] != dst_elt->bits[ix])
1236                   {
1237                     dst_elt->bits[ix] = src->bits[ix];
1238                     changed = true;
1239                   }
1240             }
1241           else
1242             {
1243               changed = true;
1244               if (!dst_elt)
1245                 dst_elt = bitmap_elt_insert_after (dst, dst_prev, src->indx);
1246               else
1247                 dst_elt->indx = src->indx;
1248               memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
1249             }
1250
1251           dst_prev = dst_elt;
1252           dst_elt = dst_elt->next;
1253         }
1254     }
1255
1256   if (dst_elt)
1257     {
1258       changed = true;
1259       bitmap_elt_clear_from (dst, dst_elt);
1260     }
1261   gcc_assert (!dst->current == !dst->first);
1262   if (dst->current)
1263     dst->indx = dst->current->indx;
1264   return changed;
1265 }
1266
1267 /* A |= B.  Return true if A changes.  */
1268
1269 bool
1270 bitmap_ior_into (bitmap a, bitmap b)
1271 {
1272   bitmap_element *a_elt = a->first;
1273   bitmap_element *b_elt = b->first;
1274   bitmap_element *a_prev = NULL;
1275   bool changed = false;
1276
1277   if (a == b)
1278     return false;
1279
1280   while (b_elt)
1281     {
1282       if (!a_elt || b_elt->indx < a_elt->indx)
1283         {
1284           /* Copy b_elt.  */
1285           bitmap_element *dst = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1286           memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
1287           a_prev = dst;
1288           b_elt = b_elt->next;
1289           changed = true;
1290         }
1291       else if (a_elt->indx < b_elt->indx)
1292         {
1293           a_prev = a_elt;
1294           a_elt = a_elt->next;
1295         }
1296       else
1297         {
1298           /* Matching elts, generate A |= B.  */
1299           unsigned ix;
1300
1301           if (changed)
1302             for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1303               {
1304                 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1305
1306                 a_elt->bits[ix] = r;
1307               }
1308           else
1309             for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1310               {
1311                 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1312
1313                 if (a_elt->bits[ix] != r)
1314                   {
1315                     changed = true;
1316                     a_elt->bits[ix] = r;
1317                   }
1318               }
1319           b_elt = b_elt->next;
1320           a_prev = a_elt;
1321           a_elt = a_elt->next;
1322         }
1323     }
1324   gcc_assert (!a->current == !a->first);
1325   if (a->current)
1326     a->indx = a->current->indx;
1327   return changed;
1328 }
1329
1330 /* DST = A ^ B  */
1331
1332 void
1333 bitmap_xor (bitmap dst, bitmap a, bitmap b)
1334 {
1335   bitmap_element *dst_elt = dst->first;
1336   bitmap_element *a_elt = a->first;
1337   bitmap_element *b_elt = b->first;
1338   bitmap_element *dst_prev = NULL;
1339
1340   gcc_assert (dst != a && dst != b);
1341   if (a == b)
1342     {
1343       bitmap_clear (dst);
1344       return;
1345     }
1346
1347   while (a_elt || b_elt)
1348     {
1349       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1350         {
1351           /* Matching elts, generate A ^ B.  */
1352           unsigned ix;
1353           BITMAP_WORD ior = 0;
1354
1355           if (!dst_elt)
1356             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1357           else
1358             dst_elt->indx = a_elt->indx;
1359           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1360             {
1361               BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1362
1363               ior |= r;
1364               dst_elt->bits[ix] = r;
1365             }
1366           a_elt = a_elt->next;
1367           b_elt = b_elt->next;
1368           if (ior)
1369             {
1370               dst_prev = dst_elt;
1371               dst_elt = dst_elt->next;
1372             }
1373         }
1374       else
1375         {
1376           /* Copy a single element.  */
1377           bitmap_element *src;
1378
1379           if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1380             {
1381               src = a_elt;
1382               a_elt = a_elt->next;
1383             }
1384           else
1385             {
1386               src = b_elt;
1387               b_elt = b_elt->next;
1388             }
1389
1390           if (!dst_elt)
1391             dst_elt = bitmap_elt_insert_after (dst, dst_prev, src->indx);
1392           else
1393             dst_elt->indx = src->indx;
1394           memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
1395           dst_prev = dst_elt;
1396           dst_elt = dst_elt->next;
1397         }
1398     }
1399   bitmap_elt_clear_from (dst, dst_elt);
1400   gcc_assert (!dst->current == !dst->first);
1401   if (dst->current)
1402     dst->indx = dst->current->indx;
1403 }
1404
1405 /* A ^= B */
1406
1407 void
1408 bitmap_xor_into (bitmap a, bitmap b)
1409 {
1410   bitmap_element *a_elt = a->first;
1411   bitmap_element *b_elt = b->first;
1412   bitmap_element *a_prev = NULL;
1413
1414   if (a == b)
1415     {
1416       bitmap_clear (a);
1417       return;
1418     }
1419
1420   while (b_elt)
1421     {
1422       if (!a_elt || b_elt->indx < a_elt->indx)
1423         {
1424           /* Copy b_elt.  */
1425           bitmap_element *dst = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1426           memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
1427           a_prev = dst;
1428           b_elt = b_elt->next;
1429         }
1430       else if (a_elt->indx < b_elt->indx)
1431         {
1432           a_prev = a_elt;
1433           a_elt = a_elt->next;
1434         }
1435       else
1436         {
1437           /* Matching elts, generate A ^= B.  */
1438           unsigned ix;
1439           BITMAP_WORD ior = 0;
1440           bitmap_element *next = a_elt->next;
1441
1442           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1443             {
1444               BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1445
1446               ior |= r;
1447               a_elt->bits[ix] = r;
1448             }
1449           b_elt = b_elt->next;
1450           if (ior)
1451             a_prev = a_elt;
1452           else
1453             bitmap_element_free (a, a_elt);
1454           a_elt = next;
1455         }
1456     }
1457   gcc_assert (!a->current == !a->first);
1458   if (a->current)
1459     a->indx = a->current->indx;
1460 }
1461
1462 /* Return true if two bitmaps are identical.
1463    We do not bother with a check for pointer equality, as that never
1464    occurs in practice.  */
1465
1466 bool
1467 bitmap_equal_p (bitmap a, bitmap b)
1468 {
1469   bitmap_element *a_elt;
1470   bitmap_element *b_elt;
1471   unsigned ix;
1472
1473   for (a_elt = a->first, b_elt = b->first;
1474        a_elt && b_elt;
1475        a_elt = a_elt->next, b_elt = b_elt->next)
1476     {
1477       if (a_elt->indx != b_elt->indx)
1478         return false;
1479       for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1480         if (a_elt->bits[ix] != b_elt->bits[ix])
1481           return false;
1482     }
1483   return !a_elt && !b_elt;
1484 }
1485
1486 /* Return true if A AND B is not empty.  */
1487
1488 bool
1489 bitmap_intersect_p (bitmap a, bitmap b)
1490 {
1491   bitmap_element *a_elt;
1492   bitmap_element *b_elt;
1493   unsigned ix;
1494
1495   for (a_elt = a->first, b_elt = b->first;
1496        a_elt && b_elt;)
1497     {
1498       if (a_elt->indx < b_elt->indx)
1499         a_elt = a_elt->next;
1500       else if (b_elt->indx < a_elt->indx)
1501         b_elt = b_elt->next;
1502       else
1503         {
1504           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1505             if (a_elt->bits[ix] & b_elt->bits[ix])
1506               return true;
1507           a_elt = a_elt->next;
1508           b_elt = b_elt->next;
1509         }
1510     }
1511   return false;
1512 }
1513
1514 /* Return true if A AND NOT B is not empty.  */
1515
1516 bool
1517 bitmap_intersect_compl_p (bitmap a, bitmap b)
1518 {
1519   bitmap_element *a_elt;
1520   bitmap_element *b_elt;
1521   unsigned ix;
1522   for (a_elt = a->first, b_elt = b->first;
1523        a_elt && b_elt;)
1524     {
1525       if (a_elt->indx < b_elt->indx)
1526         return true;
1527       else if (b_elt->indx < a_elt->indx)
1528         b_elt = b_elt->next;
1529       else
1530         {
1531           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1532             if (a_elt->bits[ix] & ~b_elt->bits[ix])
1533               return true;
1534           a_elt = a_elt->next;
1535           b_elt = b_elt->next;
1536         }
1537     }
1538   return a_elt != NULL;
1539 }
1540
1541 \f
1542 /* DST = A | (FROM1 & ~FROM2).  Return true if DST changes.  */
1543
1544 bool
1545 bitmap_ior_and_compl (bitmap dst, bitmap a, bitmap from1, bitmap from2)
1546 {
1547   bitmap_head tmp;
1548   bool changed;
1549
1550   bitmap_initialize (&tmp, &bitmap_default_obstack);
1551   bitmap_and_compl (&tmp, from1, from2);
1552   changed = bitmap_ior (dst, a, &tmp);
1553   bitmap_clear (&tmp);
1554
1555   return changed;
1556 }
1557
1558 /* A |= (FROM1 & ~FROM2).  Return true if A changes.  */
1559
1560 bool
1561 bitmap_ior_and_compl_into (bitmap a, bitmap from1, bitmap from2)
1562 {
1563   bitmap_head tmp;
1564   bool changed;
1565
1566   bitmap_initialize (&tmp, &bitmap_default_obstack);
1567   bitmap_and_compl (&tmp, from1, from2);
1568   changed = bitmap_ior_into (a, &tmp);
1569   bitmap_clear (&tmp);
1570
1571   return changed;
1572 }
1573 \f
1574 /* Debugging function to print out the contents of a bitmap.  */
1575
1576 void
1577 debug_bitmap_file (FILE *file, bitmap head)
1578 {
1579   bitmap_element *ptr;
1580
1581   fprintf (file, "\nfirst = %p current = %p indx = %u\n",
1582            (void *) head->first, (void *) head->current, head->indx);
1583
1584   for (ptr = head->first; ptr; ptr = ptr->next)
1585     {
1586       unsigned int i, j, col = 26;
1587
1588       fprintf (file, "\t%p next = %p prev = %p indx = %u\n\t\tbits = {",
1589                (void*) ptr, (void*) ptr->next, (void*) ptr->prev, ptr->indx);
1590
1591       for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1592         for (j = 0; j < BITMAP_WORD_BITS; j++)
1593           if ((ptr->bits[i] >> j) & 1)
1594             {
1595               if (col > 70)
1596                 {
1597                   fprintf (file, "\n\t\t\t");
1598                   col = 24;
1599                 }
1600
1601               fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
1602                                      + i * BITMAP_WORD_BITS + j));
1603               col += 4;
1604             }
1605
1606       fprintf (file, " }\n");
1607     }
1608 }
1609
1610 /* Function to be called from the debugger to print the contents
1611    of a bitmap.  */
1612
1613 void
1614 debug_bitmap (bitmap head)
1615 {
1616   debug_bitmap_file (stdout, head);
1617 }
1618
1619 /* Function to print out the contents of a bitmap.  Unlike debug_bitmap_file,
1620    it does not print anything but the bits.  */
1621
1622 void
1623 bitmap_print (FILE *file, bitmap head, const char *prefix, const char *suffix)
1624 {
1625   const char *comma = "";
1626   unsigned i;
1627   bitmap_iterator bi;
1628
1629   fputs (prefix, file);
1630   EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
1631     {
1632       fprintf (file, "%s%d", comma, i);
1633       comma = ", ";
1634     }
1635   fputs (suffix, file);
1636 }
1637 #ifdef GATHER_STATISTICS
1638
1639
1640 /* Used to accumulate statistics about bitmap sizes.  */
1641 struct output_info
1642 {
1643   int count;
1644   int size;
1645 };
1646
1647 /* Called via htab_traverse.  Output bitmap descriptor pointed out by SLOT
1648    and update statistics.  */
1649 static int
1650 print_statistics (void **slot, void *b)
1651 {
1652   struct bitmap_descriptor *d = (struct bitmap_descriptor *) *slot;
1653   struct output_info *i = (struct output_info *) b;
1654   char s[4096];
1655
1656   if (d->allocated)
1657     {
1658       const char *s1 = d->file;
1659       const char *s2;
1660       while ((s2 = strstr (s1, "gcc/")))
1661         s1 = s2 + 4;
1662       sprintf (s, "%s:%i (%s)", s1, d->line, d->function);
1663       s[41] = 0;
1664       fprintf (stderr, "%-41s %6d %10d %10d %10d %10d\n", s,
1665                d->created, d->allocated, d->peak, d->current, d->nsearches);
1666       i->size += d->allocated;
1667       i->count += d->created;
1668     }
1669   return 1;
1670 }
1671 #endif
1672 /* Output per-bitmap memory usage statistics.  */
1673 void
1674 dump_bitmap_statistics (void)
1675 {
1676 #ifdef GATHER_STATISTICS
1677   struct output_info info;
1678
1679   if (!bitmap_desc_hash)
1680     return;
1681
1682   fprintf (stderr, "\nBitmap                                     Overall "
1683                    "Allocated     Peak        Leak   searched "
1684                    "  per search\n");
1685   fprintf (stderr, "---------------------------------------------------------------------------------\n");
1686   info.count = 0;
1687   info.size = 0;
1688   htab_traverse (bitmap_desc_hash, print_statistics, &info);
1689   fprintf (stderr, "---------------------------------------------------------------------------------\n");
1690   fprintf (stderr, "%-40s %7d %10d\n",
1691            "Total", info.count, info.size);
1692   fprintf (stderr, "---------------------------------------------------------------------------------\n");
1693 #endif
1694 }
1695
1696 /* Compute hash of bitmap (for purposes of hashing).  */
1697 hashval_t
1698 bitmap_hash (bitmap head)
1699 {
1700   bitmap_element *ptr;
1701   BITMAP_WORD hash = 0;
1702   int ix;
1703
1704   for (ptr = head->first; ptr; ptr = ptr->next)
1705     {
1706       hash ^= ptr->indx;
1707       for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1708         hash ^= ptr->bits[ix];
1709     }
1710   return (hashval_t)hash;
1711 }
1712
1713 #include "gt-bitmap.h"