OSDN Git Service

* config/xtensa/xtensa.c (xtensa_expand_builtin): Use CALL_EXPR_FN.
[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   /* Ensure that dst->current is valid.  */
801   dst->current = dst->first;
802   bitmap_elt_clear_from (dst, dst_elt);
803   gcc_assert (!dst->current == !dst->first);
804   if (dst->current)
805     dst->indx = dst->current->indx;
806 }
807
808 /* A &= B.  */
809
810 void
811 bitmap_and_into (bitmap a, bitmap b)
812 {
813   bitmap_element *a_elt = a->first;
814   bitmap_element *b_elt = b->first;
815   bitmap_element *next;
816
817   if (a == b)
818     return;
819
820   while (a_elt && b_elt)
821     {
822       if (a_elt->indx < b_elt->indx)
823         {
824           next = a_elt->next;
825           bitmap_element_free (a, a_elt);
826           a_elt = next;
827         }
828       else if (b_elt->indx < a_elt->indx)
829         b_elt = b_elt->next;
830       else
831         {
832           /* Matching elts, generate A &= B.  */
833           unsigned ix;
834           BITMAP_WORD ior = 0;
835
836           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
837             {
838               BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
839
840               a_elt->bits[ix] = r;
841               ior |= r;
842             }
843           next = a_elt->next;
844           if (!ior)
845             bitmap_element_free (a, a_elt);
846           a_elt = next;
847           b_elt = b_elt->next;
848         }
849     }
850   bitmap_elt_clear_from (a, a_elt);
851   gcc_assert (!a->current == !a->first);
852   gcc_assert (!a->current || a->indx == a->current->indx);
853 }
854
855 /* DST = A & ~B  */
856
857 void
858 bitmap_and_compl (bitmap dst, bitmap a, bitmap b)
859 {
860   bitmap_element *dst_elt = dst->first;
861   bitmap_element *a_elt = a->first;
862   bitmap_element *b_elt = b->first;
863   bitmap_element *dst_prev = NULL;
864
865   gcc_assert (dst != a && dst != b);
866
867   if (a == b)
868     {
869       bitmap_clear (dst);
870       return;
871     }
872
873   while (a_elt)
874     {
875       if (!b_elt || a_elt->indx < b_elt->indx)
876         {
877           /* Copy a_elt.  */
878           if (!dst_elt)
879             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
880           else
881             dst_elt->indx = a_elt->indx;
882           memcpy (dst_elt->bits, a_elt->bits, sizeof (dst_elt->bits));
883           dst_prev = dst_elt;
884           dst_elt = dst_elt->next;
885           a_elt = a_elt->next;
886         }
887       else if (b_elt->indx < a_elt->indx)
888         b_elt = b_elt->next;
889       else
890         {
891           /* Matching elts, generate A & ~B.  */
892           unsigned ix;
893           BITMAP_WORD ior = 0;
894
895           if (!dst_elt)
896             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
897           else
898             dst_elt->indx = a_elt->indx;
899           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
900             {
901               BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
902
903               dst_elt->bits[ix] = r;
904               ior |= r;
905             }
906           if (ior)
907             {
908               dst_prev = dst_elt;
909               dst_elt = dst_elt->next;
910             }
911           a_elt = a_elt->next;
912           b_elt = b_elt->next;
913         }
914     }
915   /* Ensure that dst->current is valid.  */
916   dst->current = dst->first;
917   bitmap_elt_clear_from (dst, dst_elt);
918   gcc_assert (!dst->current == !dst->first);
919   if (dst->current)
920     dst->indx = dst->current->indx;
921 }
922
923 /* A &= ~B. Returns true if A changes */
924
925 bool
926 bitmap_and_compl_into (bitmap a, bitmap b)
927 {
928   bitmap_element *a_elt = a->first;
929   bitmap_element *b_elt = b->first;
930   bitmap_element *next;
931   BITMAP_WORD changed = 0;
932
933   if (a == b)
934     {
935       if (bitmap_empty_p (a))
936         return false;
937       else
938         {
939           bitmap_clear (a);
940           return true;
941         }
942     }
943
944   while (a_elt && b_elt)
945     {
946       if (a_elt->indx < b_elt->indx)
947         a_elt = a_elt->next;
948       else if (b_elt->indx < a_elt->indx)
949         b_elt = b_elt->next;
950       else
951         {
952           /* Matching elts, generate A &= ~B.  */
953           unsigned ix;
954           BITMAP_WORD ior = 0;
955
956           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
957             {
958               BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
959               BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
960
961               a_elt->bits[ix] = r;
962               changed |= cleared;
963               ior |= r;
964             }
965           next = a_elt->next;
966           if (!ior)
967             bitmap_element_free (a, a_elt);
968           a_elt = next;
969           b_elt = b_elt->next;
970         }
971     }
972   gcc_assert (!a->current == !a->first);
973   gcc_assert (!a->current || a->indx == a->current->indx);
974   return changed != 0;
975 }
976
977 /* Clear COUNT bits from START in HEAD.  */
978 void
979 bitmap_clear_range (bitmap head, unsigned int start, unsigned int count)
980 {
981   unsigned int first_index = start / BITMAP_ELEMENT_ALL_BITS;
982   unsigned int end_bit_plus1 = start + count;
983   unsigned int end_bit = end_bit_plus1 - 1;
984   unsigned int last_index = (end_bit) / BITMAP_ELEMENT_ALL_BITS;
985   bitmap_element *elt = bitmap_find_bit (head, start);
986
987   /* If bitmap_find_bit returns zero, the current is the closest block
988      to the result.  If the current is less than first index, find the
989      next one.  Otherwise, just set elt to be current.  */
990   if (!elt)
991     {
992       if (head->current)
993         {
994           if (head->indx < first_index)
995             {
996               elt = head->current->next;
997               if (!elt)
998                 return;
999             }
1000           else
1001             elt = head->current;
1002         }
1003       else
1004         return;
1005     }
1006
1007   while (elt && (elt->indx <= last_index))
1008     {
1009       bitmap_element * next_elt = elt->next;
1010       unsigned elt_start_bit = (elt->indx) * BITMAP_ELEMENT_ALL_BITS;
1011       unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1012
1013
1014       if (elt_start_bit >= start && elt_end_bit_plus1 <= end_bit_plus1)
1015         /* Get rid of the entire elt and go to the next one.  */
1016         bitmap_element_free (head, elt);
1017       else
1018         {
1019           /* Going to have to knock out some bits in this elt.  */
1020           unsigned int first_word_to_mod;
1021           BITMAP_WORD first_mask;
1022           unsigned int last_word_to_mod;
1023           BITMAP_WORD last_mask;
1024           unsigned int i;
1025           bool clear = true;
1026
1027           if (elt_start_bit <= start)
1028             {
1029               /* The first bit to turn off is somewhere inside this
1030                  elt.  */
1031               first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1032
1033               /* This mask should have 1s in all bits >= start position. */
1034               first_mask =
1035                 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1036               first_mask = ~first_mask;
1037             }
1038           else
1039             {
1040               /* The first bit to turn off is below this start of this elt.  */
1041               first_word_to_mod = 0;
1042               first_mask = 0;
1043               first_mask = ~first_mask;
1044             }
1045
1046           if (elt_end_bit_plus1 <= end_bit_plus1)
1047             {
1048               /* The last bit to turn off is beyond this elt.  */
1049               last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1050               last_mask = 0;
1051               last_mask = ~last_mask;
1052             }
1053           else
1054             {
1055               /* The last bit to turn off is inside to this elt.  */
1056               last_word_to_mod =
1057                 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1058
1059               /* The last mask should have 1s below the end bit.  */
1060               last_mask =
1061                 (((BITMAP_WORD) 1) << (((end_bit_plus1) % BITMAP_WORD_BITS))) - 1;
1062             }
1063
1064
1065           if (first_word_to_mod == last_word_to_mod)
1066             {
1067               BITMAP_WORD mask = first_mask & last_mask;
1068               elt->bits[first_word_to_mod] &= ~mask;
1069             }
1070           else
1071             {
1072               elt->bits[first_word_to_mod] &= ~first_mask;
1073               for (i = first_word_to_mod + 1; i < last_word_to_mod; i++)
1074                 elt->bits[i] = 0;
1075               elt->bits[last_word_to_mod] &= ~last_mask;
1076             }
1077           for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1078             if (elt->bits[i])
1079               {
1080                 clear = false;
1081                 break;
1082               }
1083           /* Check to see if there are any bits left.  */
1084           if (clear)
1085             bitmap_element_free (head, elt);
1086         }
1087       elt = next_elt;
1088     }
1089
1090   if (elt)
1091     {
1092       head->current = elt;
1093       head->indx = head->current->indx;
1094     }
1095 }
1096
1097 /* A = ~A & B. */
1098
1099 void
1100 bitmap_compl_and_into (bitmap a, bitmap b)
1101 {
1102   bitmap_element *a_elt = a->first;
1103   bitmap_element *b_elt = b->first;
1104   bitmap_element *a_prev = NULL;
1105   bitmap_element *next;
1106
1107   gcc_assert (a != b);
1108
1109   if (bitmap_empty_p (a))
1110     {
1111       bitmap_copy (a, b);
1112       return;
1113     }
1114   if (bitmap_empty_p (b))
1115     {
1116       bitmap_clear (a);
1117       return;
1118     }
1119
1120   while (a_elt || b_elt)
1121     {
1122       if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1123         {
1124           /* A is before B.  Remove A */
1125           next = a_elt->next;
1126           a_prev = a_elt->prev;
1127           bitmap_element_free (a, a_elt);
1128           a_elt = next;
1129         }
1130       else if (!a_elt || b_elt->indx < a_elt->indx)
1131         {
1132           /* B is before A.  Copy B. */
1133           next = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1134           memcpy (next->bits, b_elt->bits, sizeof (next->bits));
1135           a_prev = next;
1136           b_elt = b_elt->next;
1137         }
1138       else
1139         {
1140           /* Matching elts, generate A = ~A & B.  */
1141           unsigned ix;
1142           BITMAP_WORD ior = 0;
1143
1144           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1145             {
1146               BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1147               BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
1148
1149               a_elt->bits[ix] = r;
1150               ior |= r;
1151             }
1152           next = a_elt->next;
1153           if (!ior)
1154             bitmap_element_free (a, a_elt);
1155           else
1156             a_prev = a_elt;
1157           a_elt = next;
1158           b_elt = b_elt->next;
1159         }
1160     }
1161   gcc_assert (!a->current == !a->first);
1162   gcc_assert (!a->current || a->indx == a->current->indx);
1163   return;
1164 }
1165
1166 /* DST = A | B.  Return true if DST changes.  */
1167
1168 bool
1169 bitmap_ior (bitmap dst, bitmap a, bitmap b)
1170 {
1171   bitmap_element *dst_elt = dst->first;
1172   bitmap_element *a_elt = a->first;
1173   bitmap_element *b_elt = b->first;
1174   bitmap_element *dst_prev = NULL;
1175   bool changed = false;
1176
1177   gcc_assert (dst != a && dst != b);
1178
1179   while (a_elt || b_elt)
1180     {
1181       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1182         {
1183           /* Matching elts, generate A | B.  */
1184           unsigned ix;
1185
1186           if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1187             {
1188               for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1189                 {
1190                   BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1191
1192                   if (r != dst_elt->bits[ix])
1193                     {
1194                       dst_elt->bits[ix] = r;
1195                       changed = true;
1196                     }
1197                 }
1198             }
1199           else
1200             {
1201               changed = true;
1202               if (!dst_elt)
1203                 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1204               else
1205                 dst_elt->indx = a_elt->indx;
1206               for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1207                 {
1208                   BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1209
1210                   dst_elt->bits[ix] = r;
1211                 }
1212             }
1213           a_elt = a_elt->next;
1214           b_elt = b_elt->next;
1215           dst_prev = dst_elt;
1216           dst_elt = dst_elt->next;
1217         }
1218       else
1219         {
1220           /* Copy a single element.  */
1221           bitmap_element *src;
1222
1223           if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1224             {
1225               src = a_elt;
1226               a_elt = a_elt->next;
1227             }
1228           else
1229             {
1230               src = b_elt;
1231               b_elt = b_elt->next;
1232             }
1233
1234           if (!changed && dst_elt && dst_elt->indx == src->indx)
1235             {
1236               unsigned ix;
1237
1238               for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1239                 if (src->bits[ix] != dst_elt->bits[ix])
1240                   {
1241                     dst_elt->bits[ix] = src->bits[ix];
1242                     changed = true;
1243                   }
1244             }
1245           else
1246             {
1247               changed = true;
1248               if (!dst_elt)
1249                 dst_elt = bitmap_elt_insert_after (dst, dst_prev, src->indx);
1250               else
1251                 dst_elt->indx = src->indx;
1252               memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
1253             }
1254
1255           dst_prev = dst_elt;
1256           dst_elt = dst_elt->next;
1257         }
1258     }
1259
1260   if (dst_elt)
1261     {
1262       changed = true;
1263       bitmap_elt_clear_from (dst, dst_elt);
1264     }
1265   gcc_assert (!dst->current == !dst->first);
1266   if (dst->current)
1267     dst->indx = dst->current->indx;
1268   return changed;
1269 }
1270
1271 /* A |= B.  Return true if A changes.  */
1272
1273 bool
1274 bitmap_ior_into (bitmap a, bitmap b)
1275 {
1276   bitmap_element *a_elt = a->first;
1277   bitmap_element *b_elt = b->first;
1278   bitmap_element *a_prev = NULL;
1279   bool changed = false;
1280
1281   if (a == b)
1282     return false;
1283
1284   while (b_elt)
1285     {
1286       if (!a_elt || b_elt->indx < a_elt->indx)
1287         {
1288           /* Copy b_elt.  */
1289           bitmap_element *dst = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1290           memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
1291           a_prev = dst;
1292           b_elt = b_elt->next;
1293           changed = true;
1294         }
1295       else if (a_elt->indx < b_elt->indx)
1296         {
1297           a_prev = a_elt;
1298           a_elt = a_elt->next;
1299         }
1300       else
1301         {
1302           /* Matching elts, generate A |= B.  */
1303           unsigned ix;
1304
1305           if (changed)
1306             for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1307               {
1308                 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1309
1310                 a_elt->bits[ix] = r;
1311               }
1312           else
1313             for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1314               {
1315                 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1316
1317                 if (a_elt->bits[ix] != r)
1318                   {
1319                     changed = true;
1320                     a_elt->bits[ix] = r;
1321                   }
1322               }
1323           b_elt = b_elt->next;
1324           a_prev = a_elt;
1325           a_elt = a_elt->next;
1326         }
1327     }
1328   gcc_assert (!a->current == !a->first);
1329   if (a->current)
1330     a->indx = a->current->indx;
1331   return changed;
1332 }
1333
1334 /* DST = A ^ B  */
1335
1336 void
1337 bitmap_xor (bitmap dst, bitmap a, bitmap b)
1338 {
1339   bitmap_element *dst_elt = dst->first;
1340   bitmap_element *a_elt = a->first;
1341   bitmap_element *b_elt = b->first;
1342   bitmap_element *dst_prev = NULL;
1343
1344   gcc_assert (dst != a && dst != b);
1345   if (a == b)
1346     {
1347       bitmap_clear (dst);
1348       return;
1349     }
1350
1351   while (a_elt || b_elt)
1352     {
1353       if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1354         {
1355           /* Matching elts, generate A ^ B.  */
1356           unsigned ix;
1357           BITMAP_WORD ior = 0;
1358
1359           if (!dst_elt)
1360             dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1361           else
1362             dst_elt->indx = a_elt->indx;
1363           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1364             {
1365               BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1366
1367               ior |= r;
1368               dst_elt->bits[ix] = r;
1369             }
1370           a_elt = a_elt->next;
1371           b_elt = b_elt->next;
1372           if (ior)
1373             {
1374               dst_prev = dst_elt;
1375               dst_elt = dst_elt->next;
1376             }
1377         }
1378       else
1379         {
1380           /* Copy a single element.  */
1381           bitmap_element *src;
1382
1383           if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1384             {
1385               src = a_elt;
1386               a_elt = a_elt->next;
1387             }
1388           else
1389             {
1390               src = b_elt;
1391               b_elt = b_elt->next;
1392             }
1393
1394           if (!dst_elt)
1395             dst_elt = bitmap_elt_insert_after (dst, dst_prev, src->indx);
1396           else
1397             dst_elt->indx = src->indx;
1398           memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
1399           dst_prev = dst_elt;
1400           dst_elt = dst_elt->next;
1401         }
1402     }
1403   /* Ensure that dst->current is valid.  */
1404   dst->current = dst->first;
1405   bitmap_elt_clear_from (dst, dst_elt);
1406   gcc_assert (!dst->current == !dst->first);
1407   if (dst->current)
1408     dst->indx = dst->current->indx;
1409 }
1410
1411 /* A ^= B */
1412
1413 void
1414 bitmap_xor_into (bitmap a, bitmap b)
1415 {
1416   bitmap_element *a_elt = a->first;
1417   bitmap_element *b_elt = b->first;
1418   bitmap_element *a_prev = NULL;
1419
1420   if (a == b)
1421     {
1422       bitmap_clear (a);
1423       return;
1424     }
1425
1426   while (b_elt)
1427     {
1428       if (!a_elt || b_elt->indx < a_elt->indx)
1429         {
1430           /* Copy b_elt.  */
1431           bitmap_element *dst = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1432           memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
1433           a_prev = dst;
1434           b_elt = b_elt->next;
1435         }
1436       else if (a_elt->indx < b_elt->indx)
1437         {
1438           a_prev = a_elt;
1439           a_elt = a_elt->next;
1440         }
1441       else
1442         {
1443           /* Matching elts, generate A ^= B.  */
1444           unsigned ix;
1445           BITMAP_WORD ior = 0;
1446           bitmap_element *next = a_elt->next;
1447
1448           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1449             {
1450               BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1451
1452               ior |= r;
1453               a_elt->bits[ix] = r;
1454             }
1455           b_elt = b_elt->next;
1456           if (ior)
1457             a_prev = a_elt;
1458           else
1459             bitmap_element_free (a, a_elt);
1460           a_elt = next;
1461         }
1462     }
1463   gcc_assert (!a->current == !a->first);
1464   if (a->current)
1465     a->indx = a->current->indx;
1466 }
1467
1468 /* Return true if two bitmaps are identical.
1469    We do not bother with a check for pointer equality, as that never
1470    occurs in practice.  */
1471
1472 bool
1473 bitmap_equal_p (bitmap a, bitmap b)
1474 {
1475   bitmap_element *a_elt;
1476   bitmap_element *b_elt;
1477   unsigned ix;
1478
1479   for (a_elt = a->first, b_elt = b->first;
1480        a_elt && b_elt;
1481        a_elt = a_elt->next, b_elt = b_elt->next)
1482     {
1483       if (a_elt->indx != b_elt->indx)
1484         return false;
1485       for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1486         if (a_elt->bits[ix] != b_elt->bits[ix])
1487           return false;
1488     }
1489   return !a_elt && !b_elt;
1490 }
1491
1492 /* Return true if A AND B is not empty.  */
1493
1494 bool
1495 bitmap_intersect_p (bitmap a, bitmap b)
1496 {
1497   bitmap_element *a_elt;
1498   bitmap_element *b_elt;
1499   unsigned ix;
1500
1501   for (a_elt = a->first, b_elt = b->first;
1502        a_elt && b_elt;)
1503     {
1504       if (a_elt->indx < b_elt->indx)
1505         a_elt = a_elt->next;
1506       else if (b_elt->indx < a_elt->indx)
1507         b_elt = b_elt->next;
1508       else
1509         {
1510           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1511             if (a_elt->bits[ix] & b_elt->bits[ix])
1512               return true;
1513           a_elt = a_elt->next;
1514           b_elt = b_elt->next;
1515         }
1516     }
1517   return false;
1518 }
1519
1520 /* Return true if A AND NOT B is not empty.  */
1521
1522 bool
1523 bitmap_intersect_compl_p (bitmap a, bitmap b)
1524 {
1525   bitmap_element *a_elt;
1526   bitmap_element *b_elt;
1527   unsigned ix;
1528   for (a_elt = a->first, b_elt = b->first;
1529        a_elt && b_elt;)
1530     {
1531       if (a_elt->indx < b_elt->indx)
1532         return true;
1533       else if (b_elt->indx < a_elt->indx)
1534         b_elt = b_elt->next;
1535       else
1536         {
1537           for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1538             if (a_elt->bits[ix] & ~b_elt->bits[ix])
1539               return true;
1540           a_elt = a_elt->next;
1541           b_elt = b_elt->next;
1542         }
1543     }
1544   return a_elt != NULL;
1545 }
1546
1547 \f
1548 /* DST = A | (FROM1 & ~FROM2).  Return true if DST changes.  */
1549
1550 bool
1551 bitmap_ior_and_compl (bitmap dst, bitmap a, bitmap from1, bitmap from2)
1552 {
1553   bitmap_head tmp;
1554   bool changed;
1555
1556   bitmap_initialize (&tmp, &bitmap_default_obstack);
1557   bitmap_and_compl (&tmp, from1, from2);
1558   changed = bitmap_ior (dst, a, &tmp);
1559   bitmap_clear (&tmp);
1560
1561   return changed;
1562 }
1563
1564 /* A |= (FROM1 & ~FROM2).  Return true if A changes.  */
1565
1566 bool
1567 bitmap_ior_and_compl_into (bitmap a, bitmap from1, bitmap from2)
1568 {
1569   bitmap_head tmp;
1570   bool changed;
1571
1572   bitmap_initialize (&tmp, &bitmap_default_obstack);
1573   bitmap_and_compl (&tmp, from1, from2);
1574   changed = bitmap_ior_into (a, &tmp);
1575   bitmap_clear (&tmp);
1576
1577   return changed;
1578 }
1579 \f
1580 /* Debugging function to print out the contents of a bitmap.  */
1581
1582 void
1583 debug_bitmap_file (FILE *file, bitmap head)
1584 {
1585   bitmap_element *ptr;
1586
1587   fprintf (file, "\nfirst = %p current = %p indx = %u\n",
1588            (void *) head->first, (void *) head->current, head->indx);
1589
1590   for (ptr = head->first; ptr; ptr = ptr->next)
1591     {
1592       unsigned int i, j, col = 26;
1593
1594       fprintf (file, "\t%p next = %p prev = %p indx = %u\n\t\tbits = {",
1595                (void*) ptr, (void*) ptr->next, (void*) ptr->prev, ptr->indx);
1596
1597       for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1598         for (j = 0; j < BITMAP_WORD_BITS; j++)
1599           if ((ptr->bits[i] >> j) & 1)
1600             {
1601               if (col > 70)
1602                 {
1603                   fprintf (file, "\n\t\t\t");
1604                   col = 24;
1605                 }
1606
1607               fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
1608                                      + i * BITMAP_WORD_BITS + j));
1609               col += 4;
1610             }
1611
1612       fprintf (file, " }\n");
1613     }
1614 }
1615
1616 /* Function to be called from the debugger to print the contents
1617    of a bitmap.  */
1618
1619 void
1620 debug_bitmap (bitmap head)
1621 {
1622   debug_bitmap_file (stdout, head);
1623 }
1624
1625 /* Function to print out the contents of a bitmap.  Unlike debug_bitmap_file,
1626    it does not print anything but the bits.  */
1627
1628 void
1629 bitmap_print (FILE *file, bitmap head, const char *prefix, const char *suffix)
1630 {
1631   const char *comma = "";
1632   unsigned i;
1633   bitmap_iterator bi;
1634
1635   fputs (prefix, file);
1636   EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
1637     {
1638       fprintf (file, "%s%d", comma, i);
1639       comma = ", ";
1640     }
1641   fputs (suffix, file);
1642 }
1643 #ifdef GATHER_STATISTICS
1644
1645
1646 /* Used to accumulate statistics about bitmap sizes.  */
1647 struct output_info
1648 {
1649   int count;
1650   int size;
1651 };
1652
1653 /* Called via htab_traverse.  Output bitmap descriptor pointed out by SLOT
1654    and update statistics.  */
1655 static int
1656 print_statistics (void **slot, void *b)
1657 {
1658   struct bitmap_descriptor *d = (struct bitmap_descriptor *) *slot;
1659   struct output_info *i = (struct output_info *) b;
1660   char s[4096];
1661
1662   if (d->allocated)
1663     {
1664       const char *s1 = d->file;
1665       const char *s2;
1666       while ((s2 = strstr (s1, "gcc/")))
1667         s1 = s2 + 4;
1668       sprintf (s, "%s:%i (%s)", s1, d->line, d->function);
1669       s[41] = 0;
1670       fprintf (stderr, "%-41s %6d %10d %10d %10d %10d\n", s,
1671                d->created, d->allocated, d->peak, d->current, d->nsearches);
1672       i->size += d->allocated;
1673       i->count += d->created;
1674     }
1675   return 1;
1676 }
1677 #endif
1678 /* Output per-bitmap memory usage statistics.  */
1679 void
1680 dump_bitmap_statistics (void)
1681 {
1682 #ifdef GATHER_STATISTICS
1683   struct output_info info;
1684
1685   if (!bitmap_desc_hash)
1686     return;
1687
1688   fprintf (stderr, "\nBitmap                                     Overall "
1689                    "Allocated     Peak        Leak   searched "
1690                    "  per search\n");
1691   fprintf (stderr, "---------------------------------------------------------------------------------\n");
1692   info.count = 0;
1693   info.size = 0;
1694   htab_traverse (bitmap_desc_hash, print_statistics, &info);
1695   fprintf (stderr, "---------------------------------------------------------------------------------\n");
1696   fprintf (stderr, "%-40s %7d %10d\n",
1697            "Total", info.count, info.size);
1698   fprintf (stderr, "---------------------------------------------------------------------------------\n");
1699 #endif
1700 }
1701
1702 /* Compute hash of bitmap (for purposes of hashing).  */
1703 hashval_t
1704 bitmap_hash (bitmap head)
1705 {
1706   bitmap_element *ptr;
1707   BITMAP_WORD hash = 0;
1708   int ix;
1709
1710   for (ptr = head->first; ptr; ptr = ptr->next)
1711     {
1712       hash ^= ptr->indx;
1713       for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1714         hash ^= ptr->bits[ix];
1715     }
1716   return (hashval_t)hash;
1717 }
1718
1719 #include "gt-bitmap.h"