Merge -r 127928:132243 from trunk
[official-gcc.git] / gcc / bitmap.c
blobc2a66f96a73f2e1bd9090b49b05f2ddd2f778c0b
1 /* Functions to support general ended bitmaps.
2 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
3 2006, 2007 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
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.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "flags.h"
27 #include "obstack.h"
28 #include "ggc.h"
29 #include "bitmap.h"
30 #include "hashtab.h"
32 #ifdef GATHER_STATISTICS
34 /* Store information about each particular bitmap. */
35 struct bitmap_descriptor
37 const char *function;
38 const char *file;
39 int line;
40 int allocated;
41 int created;
42 int peak;
43 int current;
44 int nsearches;
47 /* Hashtable mapping bitmap names to descriptors. */
48 static htab_t bitmap_desc_hash;
50 /* Hashtable helpers. */
51 static hashval_t
52 hash_descriptor (const void *p)
54 const struct bitmap_descriptor *const d = p;
55 return htab_hash_pointer (d->file) + d->line;
57 struct loc
59 const char *file;
60 const char *function;
61 int line;
63 static int
64 eq_descriptor (const void *p1, const void *p2)
66 const struct bitmap_descriptor *const d = p1;
67 const struct loc *const l = p2;
68 return d->file == l->file && d->function == l->function && d->line == l->line;
71 /* For given file and line, return descriptor, create new if needed. */
72 static struct bitmap_descriptor *
73 bitmap_descriptor (const char *file, const char *function, int line)
75 struct bitmap_descriptor **slot;
76 struct loc loc;
78 loc.file = file;
79 loc.function = function;
80 loc.line = line;
82 if (!bitmap_desc_hash)
83 bitmap_desc_hash = htab_create (10, hash_descriptor, eq_descriptor, NULL);
85 slot = (struct bitmap_descriptor **)
86 htab_find_slot_with_hash (bitmap_desc_hash, &loc,
87 htab_hash_pointer (file) + line,
88 1);
89 if (*slot)
90 return *slot;
91 *slot = xcalloc (sizeof (**slot), 1);
92 (*slot)->file = file;
93 (*slot)->function = function;
94 (*slot)->line = line;
95 return *slot;
98 /* Register new bitmap. */
99 void
100 bitmap_register (bitmap b MEM_STAT_DECL)
102 b->desc = bitmap_descriptor (_loc_name, _loc_function, _loc_line);
103 b->desc->created++;
106 /* Account the overhead. */
107 static void
108 register_overhead (bitmap b, int amount)
110 b->desc->current += amount;
111 if (amount > 0)
112 b->desc->allocated += amount;
113 gcc_assert (b->desc->current >= 0);
114 if (b->desc->peak < b->desc->current)
115 b->desc->peak = b->desc->current;
117 #endif
119 /* Global data */
120 bitmap_element bitmap_zero_bits; /* An element of all zero bits. */
121 bitmap_obstack bitmap_default_obstack; /* The default bitmap obstack. */
122 static GTY((deletable)) bitmap_element *bitmap_ggc_free; /* Freelist of
123 GC'd elements. */
125 static void bitmap_elem_to_freelist (bitmap, bitmap_element *);
126 static void bitmap_element_free (bitmap, bitmap_element *);
127 static bitmap_element *bitmap_element_allocate (bitmap);
128 static int bitmap_element_zerop (const bitmap_element *);
129 static void bitmap_element_link (bitmap, bitmap_element *);
130 static bitmap_element *bitmap_elt_insert_after (bitmap, bitmap_element *, unsigned int);
131 static void bitmap_elt_clear_from (bitmap, bitmap_element *);
132 static bitmap_element *bitmap_find_bit (bitmap, unsigned int);
135 /* Add ELEM to the appropriate freelist. */
136 static inline void
137 bitmap_elem_to_freelist (bitmap head, bitmap_element *elt)
139 bitmap_obstack *bit_obstack = head->obstack;
141 elt->next = NULL;
142 if (bit_obstack)
144 elt->prev = bit_obstack->elements;
145 bit_obstack->elements = elt;
147 else
149 elt->prev = bitmap_ggc_free;
150 bitmap_ggc_free = elt;
154 /* Free a bitmap element. Since these are allocated off the
155 bitmap_obstack, "free" actually means "put onto the freelist". */
157 static inline void
158 bitmap_element_free (bitmap head, bitmap_element *elt)
160 bitmap_element *next = elt->next;
161 bitmap_element *prev = elt->prev;
163 if (prev)
164 prev->next = next;
166 if (next)
167 next->prev = prev;
169 if (head->first == elt)
170 head->first = next;
172 /* Since the first thing we try is to insert before current,
173 make current the next entry in preference to the previous. */
174 if (head->current == elt)
176 head->current = next != 0 ? next : prev;
177 if (head->current)
178 head->indx = head->current->indx;
179 else
180 head->indx = 0;
182 #ifdef GATHER_STATISTICS
183 register_overhead (head, -((int)sizeof (bitmap_element)));
184 #endif
185 bitmap_elem_to_freelist (head, elt);
188 /* Allocate a bitmap element. The bits are cleared, but nothing else is. */
190 static inline bitmap_element *
191 bitmap_element_allocate (bitmap head)
193 bitmap_element *element;
194 bitmap_obstack *bit_obstack = head->obstack;
196 if (bit_obstack)
198 element = bit_obstack->elements;
200 if (element)
201 /* Use up the inner list first before looking at the next
202 element of the outer list. */
203 if (element->next)
205 bit_obstack->elements = element->next;
206 bit_obstack->elements->prev = element->prev;
208 else
209 /* Inner list was just a singleton. */
210 bit_obstack->elements = element->prev;
211 else
212 element = XOBNEW (&bit_obstack->obstack, bitmap_element);
214 else
216 element = bitmap_ggc_free;
217 if (element)
218 /* Use up the inner list first before looking at the next
219 element of the outer list. */
220 if (element->next)
222 bitmap_ggc_free = element->next;
223 bitmap_ggc_free->prev = element->prev;
225 else
226 /* Inner list was just a singleton. */
227 bitmap_ggc_free = element->prev;
228 else
229 element = GGC_NEW (bitmap_element);
232 #ifdef GATHER_STATISTICS
233 register_overhead (head, sizeof (bitmap_element));
234 #endif
235 memset (element->bits, 0, sizeof (element->bits));
237 return element;
240 /* Remove ELT and all following elements from bitmap HEAD. */
242 void
243 bitmap_elt_clear_from (bitmap head, bitmap_element *elt)
245 bitmap_element *prev;
246 bitmap_obstack *bit_obstack = head->obstack;
247 #ifdef GATHER_STATISTICS
248 int n;
249 #endif
251 if (!elt) return;
252 #ifdef GATHER_STATISTICS
253 n = 0;
254 for (prev = elt; prev; prev = prev->next)
255 n++;
256 register_overhead (head, -sizeof (bitmap_element) * n);
257 #endif
259 prev = elt->prev;
260 if (prev)
262 prev->next = NULL;
263 if (head->current->indx > prev->indx)
265 head->current = prev;
266 head->indx = prev->indx;
269 else
271 head->first = NULL;
272 head->current = NULL;
273 head->indx = 0;
276 /* Put the entire list onto the free list in one operation. */
277 if (bit_obstack)
279 elt->prev = bit_obstack->elements;
280 bit_obstack->elements = elt;
282 else
284 elt->prev = bitmap_ggc_free;
285 bitmap_ggc_free = elt;
289 /* Clear a bitmap by freeing the linked list. */
291 inline void
292 bitmap_clear (bitmap head)
294 if (head->first)
295 bitmap_elt_clear_from (head, head->first);
298 /* Initialize a bitmap obstack. If BIT_OBSTACK is NULL, initialize
299 the default bitmap obstack. */
301 void
302 bitmap_obstack_initialize (bitmap_obstack *bit_obstack)
304 if (!bit_obstack)
305 bit_obstack = &bitmap_default_obstack;
307 #if !defined(__GNUC__) || (__GNUC__ < 2)
308 #define __alignof__(type) 0
309 #endif
311 bit_obstack->elements = NULL;
312 bit_obstack->heads = NULL;
313 obstack_specify_allocation (&bit_obstack->obstack, OBSTACK_CHUNK_SIZE,
314 __alignof__ (bitmap_element),
315 obstack_chunk_alloc,
316 obstack_chunk_free);
319 /* Release the memory from a bitmap obstack. If BIT_OBSTACK is NULL,
320 release the default bitmap obstack. */
322 void
323 bitmap_obstack_release (bitmap_obstack *bit_obstack)
325 if (!bit_obstack)
326 bit_obstack = &bitmap_default_obstack;
328 bit_obstack->elements = NULL;
329 bit_obstack->heads = NULL;
330 obstack_free (&bit_obstack->obstack, NULL);
333 /* Create a new bitmap on an obstack. If BIT_OBSTACK is NULL, create
334 it on the default bitmap obstack. */
336 bitmap
337 bitmap_obstack_alloc_stat (bitmap_obstack *bit_obstack MEM_STAT_DECL)
339 bitmap map;
341 if (!bit_obstack)
342 bit_obstack = &bitmap_default_obstack;
343 map = bit_obstack->heads;
344 if (map)
345 bit_obstack->heads = (void *)map->first;
346 else
347 map = XOBNEW (&bit_obstack->obstack, bitmap_head);
348 bitmap_initialize_stat (map, bit_obstack PASS_MEM_STAT);
349 #ifdef GATHER_STATISTICS
350 register_overhead (map, sizeof (bitmap_head));
351 #endif
353 return map;
356 /* Create a new GCd bitmap. */
358 bitmap
359 bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL)
361 bitmap map;
363 map = GGC_NEW (struct bitmap_head_def);
364 bitmap_initialize_stat (map, NULL PASS_MEM_STAT);
365 #ifdef GATHER_STATISTICS
366 register_overhead (map, sizeof (bitmap_head));
367 #endif
369 return map;
372 /* Release an obstack allocated bitmap. */
374 void
375 bitmap_obstack_free (bitmap map)
377 if (map)
379 bitmap_clear (map);
380 map->first = (void *)map->obstack->heads;
381 #ifdef GATHER_STATISTICS
382 register_overhead (map, -((int)sizeof (bitmap_head)));
383 #endif
384 map->obstack->heads = map;
389 /* Return nonzero if all bits in an element are zero. */
391 static inline int
392 bitmap_element_zerop (const bitmap_element *element)
394 #if BITMAP_ELEMENT_WORDS == 2
395 return (element->bits[0] | element->bits[1]) == 0;
396 #else
397 unsigned i;
399 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
400 if (element->bits[i] != 0)
401 return 0;
403 return 1;
404 #endif
407 /* Link the bitmap element into the current bitmap linked list. */
409 static inline void
410 bitmap_element_link (bitmap head, bitmap_element *element)
412 unsigned int indx = element->indx;
413 bitmap_element *ptr;
415 /* If this is the first and only element, set it in. */
416 if (head->first == 0)
418 element->next = element->prev = 0;
419 head->first = element;
422 /* If this index is less than that of the current element, it goes someplace
423 before the current element. */
424 else if (indx < head->indx)
426 for (ptr = head->current;
427 ptr->prev != 0 && ptr->prev->indx > indx;
428 ptr = ptr->prev)
431 if (ptr->prev)
432 ptr->prev->next = element;
433 else
434 head->first = element;
436 element->prev = ptr->prev;
437 element->next = ptr;
438 ptr->prev = element;
441 /* Otherwise, it must go someplace after the current element. */
442 else
444 for (ptr = head->current;
445 ptr->next != 0 && ptr->next->indx < indx;
446 ptr = ptr->next)
449 if (ptr->next)
450 ptr->next->prev = element;
452 element->next = ptr->next;
453 element->prev = ptr;
454 ptr->next = element;
457 /* Set up so this is the first element searched. */
458 head->current = element;
459 head->indx = indx;
462 /* Insert a new uninitialized element into bitmap HEAD after element
463 ELT. If ELT is NULL, insert the element at the start. Return the
464 new element. */
466 static bitmap_element *
467 bitmap_elt_insert_after (bitmap head, bitmap_element *elt, unsigned int indx)
469 bitmap_element *node = bitmap_element_allocate (head);
470 node->indx = indx;
472 if (!elt)
474 if (!head->current)
476 head->current = node;
477 head->indx = indx;
479 node->next = head->first;
480 if (node->next)
481 node->next->prev = node;
482 head->first = node;
483 node->prev = NULL;
485 else
487 gcc_assert (head->current);
488 node->next = elt->next;
489 if (node->next)
490 node->next->prev = node;
491 elt->next = node;
492 node->prev = elt;
494 return node;
497 /* Copy a bitmap to another bitmap. */
499 void
500 bitmap_copy (bitmap to, const_bitmap from)
502 const bitmap_element *from_ptr;
503 bitmap_element *to_ptr = 0;
505 bitmap_clear (to);
507 /* Copy elements in forward direction one at a time. */
508 for (from_ptr = from->first; from_ptr; from_ptr = from_ptr->next)
510 bitmap_element *to_elt = bitmap_element_allocate (to);
512 to_elt->indx = from_ptr->indx;
513 memcpy (to_elt->bits, from_ptr->bits, sizeof (to_elt->bits));
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)
519 to->first = to->current = to_elt;
520 to->indx = from_ptr->indx;
521 to_elt->next = to_elt->prev = 0;
523 else
525 to_elt->prev = to_ptr;
526 to_elt->next = 0;
527 to_ptr->next = to_elt;
530 to_ptr = to_elt;
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. */
539 static inline bitmap_element *
540 bitmap_find_bit (bitmap head, unsigned int bit)
542 bitmap_element *element;
543 unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
545 #ifdef GATHER_STATISTICS
546 head->desc->nsearches++;
547 #endif
548 if (head->current == 0
549 || head->indx == indx)
550 return head->current;
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)
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)
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)
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;
583 return element;
586 /* Clear a single bit in a bitmap. */
588 void
589 bitmap_clear_bit (bitmap head, int bit)
591 bitmap_element *const ptr = bitmap_find_bit (head, bit);
593 if (ptr != 0)
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);
599 /* If we cleared the entire word, free up the element. */
600 if (bitmap_element_zerop (ptr))
601 bitmap_element_free (head, ptr);
605 /* Set a single bit in a bitmap. */
607 void
608 bitmap_set_bit (bitmap head, int bit)
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;
615 if (ptr == 0)
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);
622 else
623 ptr->bits[word_num] |= bit_val;
626 /* Return whether a bit is set within a bitmap. */
629 bitmap_bit_p (bitmap head, int bit)
631 bitmap_element *ptr;
632 unsigned bit_num;
633 unsigned word_num;
635 ptr = bitmap_find_bit (head, bit);
636 if (ptr == 0)
637 return 0;
639 bit_num = bit % BITMAP_WORD_BITS;
640 word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
642 return (ptr->bits[word_num] >> bit_num) & 1;
645 #if GCC_VERSION < 3400
646 /* Table of number of set bits in a character, indexed by value of char. */
647 static const unsigned char popcount_table[] =
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,
659 static unsigned long
660 bitmap_popcount (BITMAP_WORD a)
662 unsigned long ret = 0;
663 unsigned i;
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;
670 #endif
671 /* Count the number of bits set in the bitmap, and return it. */
673 unsigned long
674 bitmap_count_bits (const_bitmap a)
676 unsigned long count = 0;
677 const bitmap_element *elt;
678 unsigned ix;
680 for (elt = a->first; elt; elt = elt->next)
682 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
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
693 return count;
696 /* Return true if the bitmap has a single bit set. Otherwise return
697 false. */
699 bool
700 bitmap_single_bit_set_p (const_bitmap a)
702 unsigned long count = 0;
703 const bitmap_element *elt;
704 unsigned ix;
706 if (bitmap_empty_p (a))
707 return false;
709 elt = a->first;
710 /* As there are no completely empty bitmap elements, a second one
711 means we have more than one bit set. */
712 if (elt->next != NULL)
713 return false;
715 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
717 #if GCC_VERSION >= 3400
718 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
719 of BITMAP_WORD is not material. */
720 count += __builtin_popcountl (elt->bits[ix]);
721 #else
722 count += bitmap_popcount (elt->bits[ix]);
723 #endif
724 if (count > 1)
725 return false;
728 return count == 1;
732 /* Return the bit number of the first set bit in the bitmap. The
733 bitmap must be non-empty. */
735 unsigned
736 bitmap_first_set_bit (const_bitmap a)
738 const bitmap_element *elt = a->first;
739 unsigned bit_no;
740 BITMAP_WORD word;
741 unsigned ix;
743 gcc_assert (elt);
744 bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
745 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
747 word = elt->bits[ix];
748 if (word)
749 goto found_bit;
751 gcc_unreachable ();
752 found_bit:
753 bit_no += ix * BITMAP_WORD_BITS;
755 #if GCC_VERSION >= 3004
756 gcc_assert (sizeof(long) == sizeof (word));
757 bit_no += __builtin_ctzl (word);
758 #else
759 /* Binary search for the first set bit. */
760 #if BITMAP_WORD_BITS > 64
761 #error "Fill out the table."
762 #endif
763 #if BITMAP_WORD_BITS > 32
764 if (!(word & 0xffffffff))
765 word >>= 32, bit_no += 32;
766 #endif
767 if (!(word & 0xffff))
768 word >>= 16, bit_no += 16;
769 if (!(word & 0xff))
770 word >>= 8, bit_no += 8;
771 if (!(word & 0xf))
772 word >>= 4, bit_no += 4;
773 if (!(word & 0x3))
774 word >>= 2, bit_no += 2;
775 if (!(word & 0x1))
776 word >>= 1, bit_no += 1;
778 gcc_assert (word & 1);
779 #endif
780 return bit_no;
784 /* DST = A & B. */
786 void
787 bitmap_and (bitmap dst, const_bitmap a, const_bitmap b)
789 bitmap_element *dst_elt = dst->first;
790 const bitmap_element *a_elt = a->first;
791 const bitmap_element *b_elt = b->first;
792 bitmap_element *dst_prev = NULL;
794 gcc_assert (dst != a && dst != b);
796 if (a == b)
798 bitmap_copy (dst, a);
799 return;
802 while (a_elt && b_elt)
804 if (a_elt->indx < b_elt->indx)
805 a_elt = a_elt->next;
806 else if (b_elt->indx < a_elt->indx)
807 b_elt = b_elt->next;
808 else
810 /* Matching elts, generate A & B. */
811 unsigned ix;
812 BITMAP_WORD ior = 0;
814 if (!dst_elt)
815 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
816 else
817 dst_elt->indx = a_elt->indx;
818 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
820 BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
822 dst_elt->bits[ix] = r;
823 ior |= r;
825 if (ior)
827 dst_prev = dst_elt;
828 dst_elt = dst_elt->next;
830 a_elt = a_elt->next;
831 b_elt = b_elt->next;
834 /* Ensure that dst->current is valid. */
835 dst->current = dst->first;
836 bitmap_elt_clear_from (dst, dst_elt);
837 gcc_assert (!dst->current == !dst->first);
838 if (dst->current)
839 dst->indx = dst->current->indx;
842 /* A &= B. */
844 void
845 bitmap_and_into (bitmap a, const_bitmap b)
847 bitmap_element *a_elt = a->first;
848 const bitmap_element *b_elt = b->first;
849 bitmap_element *next;
851 if (a == b)
852 return;
854 while (a_elt && b_elt)
856 if (a_elt->indx < b_elt->indx)
858 next = a_elt->next;
859 bitmap_element_free (a, a_elt);
860 a_elt = next;
862 else if (b_elt->indx < a_elt->indx)
863 b_elt = b_elt->next;
864 else
866 /* Matching elts, generate A &= B. */
867 unsigned ix;
868 BITMAP_WORD ior = 0;
870 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
872 BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
874 a_elt->bits[ix] = r;
875 ior |= r;
877 next = a_elt->next;
878 if (!ior)
879 bitmap_element_free (a, a_elt);
880 a_elt = next;
881 b_elt = b_elt->next;
884 bitmap_elt_clear_from (a, a_elt);
885 gcc_assert (!a->current == !a->first);
886 gcc_assert (!a->current || a->indx == a->current->indx);
890 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
891 if non-NULL. CHANGED is true if the destination bitmap had already been
892 changed; the new value of CHANGED is returned. */
894 static inline bool
895 bitmap_elt_copy (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
896 const bitmap_element *src_elt, bool changed)
898 if (!changed && dst_elt && dst_elt->indx == src_elt->indx)
900 unsigned ix;
902 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
903 if (src_elt->bits[ix] != dst_elt->bits[ix])
905 dst_elt->bits[ix] = src_elt->bits[ix];
906 changed = true;
909 else
911 changed = true;
912 if (!dst_elt)
913 dst_elt = bitmap_elt_insert_after (dst, dst_prev, src_elt->indx);
914 else
915 dst_elt->indx = src_elt->indx;
916 memcpy (dst_elt->bits, src_elt->bits, sizeof (dst_elt->bits));
918 return changed;
923 /* DST = A & ~B */
925 bool
926 bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
928 bitmap_element *dst_elt = dst->first;
929 const bitmap_element *a_elt = a->first;
930 const bitmap_element *b_elt = b->first;
931 bitmap_element *dst_prev = NULL;
932 bitmap_element **dst_prev_pnext = &dst->first;
933 bool changed = false;
935 gcc_assert (dst != a && dst != b);
937 if (a == b)
939 changed = !bitmap_empty_p (dst);
940 bitmap_clear (dst);
941 return changed;
944 while (a_elt)
946 while (b_elt && b_elt->indx < a_elt->indx)
947 b_elt = b_elt->next;
949 if (!b_elt || b_elt->indx > a_elt->indx)
951 changed = bitmap_elt_copy (dst, dst_elt, dst_prev, a_elt, changed);
952 dst_prev = *dst_prev_pnext;
953 dst_prev_pnext = &dst_prev->next;
954 dst_elt = *dst_prev_pnext;
955 a_elt = a_elt->next;
958 else
960 /* Matching elts, generate A & ~B. */
961 unsigned ix;
962 BITMAP_WORD ior = 0;
964 if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
966 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
968 BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
970 if (dst_elt->bits[ix] != r)
972 changed = true;
973 dst_elt->bits[ix] = r;
975 ior |= r;
978 else
980 bool new_element;
981 if (!dst_elt || dst_elt->indx > a_elt->indx)
983 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
984 new_element = true;
986 else
988 dst_elt->indx = a_elt->indx;
989 new_element = false;
992 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
994 BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
996 dst_elt->bits[ix] = r;
997 ior |= r;
1000 if (ior)
1001 changed = true;
1002 else
1004 changed |= !new_element;
1005 bitmap_element_free (dst, dst_elt);
1006 dst_elt = *dst_prev_pnext;
1010 if (ior)
1012 dst_prev = *dst_prev_pnext;
1013 dst_prev_pnext = &dst_prev->next;
1014 dst_elt = *dst_prev_pnext;
1016 a_elt = a_elt->next;
1017 b_elt = b_elt->next;
1021 /* Ensure that dst->current is valid. */
1022 dst->current = dst->first;
1024 if (dst_elt)
1026 changed = true;
1027 bitmap_elt_clear_from (dst, dst_elt);
1029 gcc_assert (!dst->current == !dst->first);
1030 if (dst->current)
1031 dst->indx = dst->current->indx;
1033 return changed;
1036 /* A &= ~B. Returns true if A changes */
1038 bool
1039 bitmap_and_compl_into (bitmap a, const_bitmap b)
1041 bitmap_element *a_elt = a->first;
1042 const bitmap_element *b_elt = b->first;
1043 bitmap_element *next;
1044 BITMAP_WORD changed = 0;
1046 if (a == b)
1048 if (bitmap_empty_p (a))
1049 return false;
1050 else
1052 bitmap_clear (a);
1053 return true;
1057 while (a_elt && b_elt)
1059 if (a_elt->indx < b_elt->indx)
1060 a_elt = a_elt->next;
1061 else if (b_elt->indx < a_elt->indx)
1062 b_elt = b_elt->next;
1063 else
1065 /* Matching elts, generate A &= ~B. */
1066 unsigned ix;
1067 BITMAP_WORD ior = 0;
1069 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1071 BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1072 BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
1074 a_elt->bits[ix] = r;
1075 changed |= cleared;
1076 ior |= r;
1078 next = a_elt->next;
1079 if (!ior)
1080 bitmap_element_free (a, a_elt);
1081 a_elt = next;
1082 b_elt = b_elt->next;
1085 gcc_assert (!a->current == !a->first);
1086 gcc_assert (!a->current || a->indx == a->current->indx);
1087 return changed != 0;
1090 /* Set COUNT bits from START in HEAD. */
1091 void
1092 bitmap_set_range (bitmap head, unsigned int start, unsigned int count)
1094 unsigned int first_index, end_bit_plus1, last_index;
1095 bitmap_element *elt, *elt_prev;
1096 unsigned int i;
1098 if (!count)
1099 return;
1101 first_index = start / BITMAP_ELEMENT_ALL_BITS;
1102 end_bit_plus1 = start + count;
1103 last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1104 elt = bitmap_find_bit (head, start);
1106 /* If bitmap_find_bit returns zero, the current is the closest block
1107 to the result. Otherwise, just use bitmap_element_allocate to
1108 ensure ELT is set; in the loop below, ELT == NULL means "insert
1109 at the end of the bitmap". */
1110 if (!elt)
1112 elt = bitmap_element_allocate (head);
1113 elt->indx = first_index;
1114 bitmap_element_link (head, elt);
1117 gcc_assert (elt->indx == first_index);
1118 elt_prev = elt->prev;
1119 for (i = first_index; i <= last_index; i++)
1121 unsigned elt_start_bit = i * BITMAP_ELEMENT_ALL_BITS;
1122 unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1124 unsigned int first_word_to_mod;
1125 BITMAP_WORD first_mask;
1126 unsigned int last_word_to_mod;
1127 BITMAP_WORD last_mask;
1128 unsigned int ix;
1130 if (!elt || elt->indx != i)
1131 elt = bitmap_elt_insert_after (head, elt_prev, i);
1133 if (elt_start_bit <= start)
1135 /* The first bit to turn on is somewhere inside this
1136 elt. */
1137 first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1139 /* This mask should have 1s in all bits >= start position. */
1140 first_mask =
1141 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1142 first_mask = ~first_mask;
1144 else
1146 /* The first bit to turn on is below this start of this elt. */
1147 first_word_to_mod = 0;
1148 first_mask = ~(BITMAP_WORD) 0;
1151 if (elt_end_bit_plus1 <= end_bit_plus1)
1153 /* The last bit to turn on is beyond this elt. */
1154 last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1155 last_mask = ~(BITMAP_WORD) 0;
1157 else
1159 /* The last bit to turn on is inside to this elt. */
1160 last_word_to_mod =
1161 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1163 /* The last mask should have 1s below the end bit. */
1164 last_mask =
1165 (((BITMAP_WORD) 1) << ((end_bit_plus1 % BITMAP_WORD_BITS))) - 1;
1168 if (first_word_to_mod == last_word_to_mod)
1170 BITMAP_WORD mask = first_mask & last_mask;
1171 elt->bits[first_word_to_mod] |= mask;
1173 else
1175 elt->bits[first_word_to_mod] |= first_mask;
1176 if (BITMAP_ELEMENT_WORDS > 2)
1177 for (ix = first_word_to_mod + 1; ix < last_word_to_mod; ix++)
1178 elt->bits[ix] = ~(BITMAP_WORD) 0;
1179 elt->bits[last_word_to_mod] |= last_mask;
1182 elt_prev = elt;
1183 elt = elt->next;
1186 head->current = elt ? elt : elt_prev;
1187 head->indx = head->current->indx;
1190 /* Clear COUNT bits from START in HEAD. */
1191 void
1192 bitmap_clear_range (bitmap head, unsigned int start, unsigned int count)
1194 unsigned int first_index, end_bit_plus1, last_index;
1195 bitmap_element *elt;
1197 if (!count)
1198 return;
1200 first_index = start / BITMAP_ELEMENT_ALL_BITS;
1201 end_bit_plus1 = start + count;
1202 last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1203 elt = bitmap_find_bit (head, start);
1205 /* If bitmap_find_bit returns zero, the current is the closest block
1206 to the result. If the current is less than first index, find the
1207 next one. Otherwise, just set elt to be current. */
1208 if (!elt)
1210 if (head->current)
1212 if (head->indx < first_index)
1214 elt = head->current->next;
1215 if (!elt)
1216 return;
1218 else
1219 elt = head->current;
1221 else
1222 return;
1225 while (elt && (elt->indx <= last_index))
1227 bitmap_element * next_elt = elt->next;
1228 unsigned elt_start_bit = (elt->indx) * BITMAP_ELEMENT_ALL_BITS;
1229 unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1232 if (elt_start_bit >= start && elt_end_bit_plus1 <= end_bit_plus1)
1233 /* Get rid of the entire elt and go to the next one. */
1234 bitmap_element_free (head, elt);
1235 else
1237 /* Going to have to knock out some bits in this elt. */
1238 unsigned int first_word_to_mod;
1239 BITMAP_WORD first_mask;
1240 unsigned int last_word_to_mod;
1241 BITMAP_WORD last_mask;
1242 unsigned int i;
1243 bool clear = true;
1245 if (elt_start_bit <= start)
1247 /* The first bit to turn off is somewhere inside this
1248 elt. */
1249 first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1251 /* This mask should have 1s in all bits >= start position. */
1252 first_mask =
1253 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1254 first_mask = ~first_mask;
1256 else
1258 /* The first bit to turn off is below this start of this elt. */
1259 first_word_to_mod = 0;
1260 first_mask = 0;
1261 first_mask = ~first_mask;
1264 if (elt_end_bit_plus1 <= end_bit_plus1)
1266 /* The last bit to turn off is beyond this elt. */
1267 last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1268 last_mask = 0;
1269 last_mask = ~last_mask;
1271 else
1273 /* The last bit to turn off is inside to this elt. */
1274 last_word_to_mod =
1275 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1277 /* The last mask should have 1s below the end bit. */
1278 last_mask =
1279 (((BITMAP_WORD) 1) << (((end_bit_plus1) % BITMAP_WORD_BITS))) - 1;
1283 if (first_word_to_mod == last_word_to_mod)
1285 BITMAP_WORD mask = first_mask & last_mask;
1286 elt->bits[first_word_to_mod] &= ~mask;
1288 else
1290 elt->bits[first_word_to_mod] &= ~first_mask;
1291 if (BITMAP_ELEMENT_WORDS > 2)
1292 for (i = first_word_to_mod + 1; i < last_word_to_mod; i++)
1293 elt->bits[i] = 0;
1294 elt->bits[last_word_to_mod] &= ~last_mask;
1296 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1297 if (elt->bits[i])
1299 clear = false;
1300 break;
1302 /* Check to see if there are any bits left. */
1303 if (clear)
1304 bitmap_element_free (head, elt);
1306 elt = next_elt;
1309 if (elt)
1311 head->current = elt;
1312 head->indx = head->current->indx;
1316 /* A = ~A & B. */
1318 void
1319 bitmap_compl_and_into (bitmap a, const_bitmap b)
1321 bitmap_element *a_elt = a->first;
1322 const bitmap_element *b_elt = b->first;
1323 bitmap_element *a_prev = NULL;
1324 bitmap_element *next;
1326 gcc_assert (a != b);
1328 if (bitmap_empty_p (a))
1330 bitmap_copy (a, b);
1331 return;
1333 if (bitmap_empty_p (b))
1335 bitmap_clear (a);
1336 return;
1339 while (a_elt || b_elt)
1341 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1343 /* A is before B. Remove A */
1344 next = a_elt->next;
1345 a_prev = a_elt->prev;
1346 bitmap_element_free (a, a_elt);
1347 a_elt = next;
1349 else if (!a_elt || b_elt->indx < a_elt->indx)
1351 /* B is before A. Copy B. */
1352 next = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1353 memcpy (next->bits, b_elt->bits, sizeof (next->bits));
1354 a_prev = next;
1355 b_elt = b_elt->next;
1357 else
1359 /* Matching elts, generate A = ~A & B. */
1360 unsigned ix;
1361 BITMAP_WORD ior = 0;
1363 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1365 BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1366 BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
1368 a_elt->bits[ix] = r;
1369 ior |= r;
1371 next = a_elt->next;
1372 if (!ior)
1373 bitmap_element_free (a, a_elt);
1374 else
1375 a_prev = a_elt;
1376 a_elt = next;
1377 b_elt = b_elt->next;
1380 gcc_assert (!a->current == !a->first);
1381 gcc_assert (!a->current || a->indx == a->current->indx);
1382 return;
1386 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1387 overwriting DST_ELT if non-NULL. CHANGED is true if the destination bitmap
1388 had already been changed; the new value of CHANGED is returned. */
1390 static inline bool
1391 bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
1392 const bitmap_element *a_elt, const bitmap_element *b_elt,
1393 bool changed)
1395 gcc_assert (a_elt || b_elt);
1397 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1399 /* Matching elts, generate A | B. */
1400 unsigned ix;
1402 if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1404 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1406 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1407 if (r != dst_elt->bits[ix])
1409 dst_elt->bits[ix] = r;
1410 changed = true;
1414 else
1416 changed = true;
1417 if (!dst_elt)
1418 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1419 else
1420 dst_elt->indx = a_elt->indx;
1421 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1423 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1424 dst_elt->bits[ix] = r;
1428 else
1430 /* Copy a single element. */
1431 const bitmap_element *src;
1433 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1434 src = a_elt;
1435 else
1436 src = b_elt;
1438 gcc_assert (src);
1439 changed = bitmap_elt_copy (dst, dst_elt, dst_prev, src, changed);
1441 return changed;
1445 /* DST = A | B. Return true if DST changes. */
1447 bool
1448 bitmap_ior (bitmap dst, const_bitmap a, const_bitmap b)
1450 bitmap_element *dst_elt = dst->first;
1451 const bitmap_element *a_elt = a->first;
1452 const bitmap_element *b_elt = b->first;
1453 bitmap_element *dst_prev = NULL;
1454 bitmap_element **dst_prev_pnext = &dst->first;
1455 bool changed = false;
1457 gcc_assert (dst != a && dst != b);
1459 while (a_elt || b_elt)
1461 changed = bitmap_elt_ior (dst, dst_elt, dst_prev, a_elt, b_elt, changed);
1463 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1465 a_elt = a_elt->next;
1466 b_elt = b_elt->next;
1468 else
1470 if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
1471 a_elt = a_elt->next;
1472 else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
1473 b_elt = b_elt->next;
1476 dst_prev = *dst_prev_pnext;
1477 dst_prev_pnext = &dst_prev->next;
1478 dst_elt = *dst_prev_pnext;
1481 if (dst_elt)
1483 changed = true;
1484 bitmap_elt_clear_from (dst, dst_elt);
1486 gcc_assert (!dst->current == !dst->first);
1487 if (dst->current)
1488 dst->indx = dst->current->indx;
1489 return changed;
1492 /* A |= B. Return true if A changes. */
1494 bool
1495 bitmap_ior_into (bitmap a, const_bitmap b)
1497 bitmap_element *a_elt = a->first;
1498 const bitmap_element *b_elt = b->first;
1499 bitmap_element *a_prev = NULL;
1500 bitmap_element **a_prev_pnext = &a->first;
1501 bool changed = false;
1503 if (a == b)
1504 return false;
1506 while (b_elt)
1508 /* If A lags behind B, just advance it. */
1509 if (!a_elt || a_elt->indx == b_elt->indx)
1511 changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
1512 b_elt = b_elt->next;
1514 else if (a_elt->indx > b_elt->indx)
1516 changed = bitmap_elt_copy (a, NULL, a_prev, b_elt, changed);
1517 b_elt = b_elt->next;
1520 a_prev = *a_prev_pnext;
1521 a_prev_pnext = &a_prev->next;
1522 a_elt = *a_prev_pnext;
1525 gcc_assert (!a->current == !a->first);
1526 if (a->current)
1527 a->indx = a->current->indx;
1528 return changed;
1531 /* DST = A ^ B */
1533 void
1534 bitmap_xor (bitmap dst, const_bitmap a, const_bitmap b)
1536 bitmap_element *dst_elt = dst->first;
1537 const bitmap_element *a_elt = a->first;
1538 const bitmap_element *b_elt = b->first;
1539 bitmap_element *dst_prev = NULL;
1541 gcc_assert (dst != a && dst != b);
1542 if (a == b)
1544 bitmap_clear (dst);
1545 return;
1548 while (a_elt || b_elt)
1550 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1552 /* Matching elts, generate A ^ B. */
1553 unsigned ix;
1554 BITMAP_WORD ior = 0;
1556 if (!dst_elt)
1557 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1558 else
1559 dst_elt->indx = a_elt->indx;
1560 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1562 BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1564 ior |= r;
1565 dst_elt->bits[ix] = r;
1567 a_elt = a_elt->next;
1568 b_elt = b_elt->next;
1569 if (ior)
1571 dst_prev = dst_elt;
1572 dst_elt = dst_elt->next;
1575 else
1577 /* Copy a single element. */
1578 const bitmap_element *src;
1580 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1582 src = a_elt;
1583 a_elt = a_elt->next;
1585 else
1587 src = b_elt;
1588 b_elt = b_elt->next;
1591 if (!dst_elt)
1592 dst_elt = bitmap_elt_insert_after (dst, dst_prev, src->indx);
1593 else
1594 dst_elt->indx = src->indx;
1595 memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
1596 dst_prev = dst_elt;
1597 dst_elt = dst_elt->next;
1600 /* Ensure that dst->current is valid. */
1601 dst->current = dst->first;
1602 bitmap_elt_clear_from (dst, dst_elt);
1603 gcc_assert (!dst->current == !dst->first);
1604 if (dst->current)
1605 dst->indx = dst->current->indx;
1608 /* A ^= B */
1610 void
1611 bitmap_xor_into (bitmap a, const_bitmap b)
1613 bitmap_element *a_elt = a->first;
1614 const bitmap_element *b_elt = b->first;
1615 bitmap_element *a_prev = NULL;
1617 if (a == b)
1619 bitmap_clear (a);
1620 return;
1623 while (b_elt)
1625 if (!a_elt || b_elt->indx < a_elt->indx)
1627 /* Copy b_elt. */
1628 bitmap_element *dst = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1629 memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
1630 a_prev = dst;
1631 b_elt = b_elt->next;
1633 else if (a_elt->indx < b_elt->indx)
1635 a_prev = a_elt;
1636 a_elt = a_elt->next;
1638 else
1640 /* Matching elts, generate A ^= B. */
1641 unsigned ix;
1642 BITMAP_WORD ior = 0;
1643 bitmap_element *next = a_elt->next;
1645 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1647 BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1649 ior |= r;
1650 a_elt->bits[ix] = r;
1652 b_elt = b_elt->next;
1653 if (ior)
1654 a_prev = a_elt;
1655 else
1656 bitmap_element_free (a, a_elt);
1657 a_elt = next;
1660 gcc_assert (!a->current == !a->first);
1661 if (a->current)
1662 a->indx = a->current->indx;
1665 /* Return true if two bitmaps are identical.
1666 We do not bother with a check for pointer equality, as that never
1667 occurs in practice. */
1669 bool
1670 bitmap_equal_p (const_bitmap a, const_bitmap b)
1672 const bitmap_element *a_elt;
1673 const bitmap_element *b_elt;
1674 unsigned ix;
1676 for (a_elt = a->first, b_elt = b->first;
1677 a_elt && b_elt;
1678 a_elt = a_elt->next, b_elt = b_elt->next)
1680 if (a_elt->indx != b_elt->indx)
1681 return false;
1682 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1683 if (a_elt->bits[ix] != b_elt->bits[ix])
1684 return false;
1686 return !a_elt && !b_elt;
1689 /* Return true if A AND B is not empty. */
1691 bool
1692 bitmap_intersect_p (const_bitmap a, const_bitmap b)
1694 const bitmap_element *a_elt;
1695 const bitmap_element *b_elt;
1696 unsigned ix;
1698 for (a_elt = a->first, b_elt = b->first;
1699 a_elt && b_elt;)
1701 if (a_elt->indx < b_elt->indx)
1702 a_elt = a_elt->next;
1703 else if (b_elt->indx < a_elt->indx)
1704 b_elt = b_elt->next;
1705 else
1707 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1708 if (a_elt->bits[ix] & b_elt->bits[ix])
1709 return true;
1710 a_elt = a_elt->next;
1711 b_elt = b_elt->next;
1714 return false;
1717 /* Return true if A AND NOT B is not empty. */
1719 bool
1720 bitmap_intersect_compl_p (const_bitmap a, const_bitmap b)
1722 const bitmap_element *a_elt;
1723 const bitmap_element *b_elt;
1724 unsigned ix;
1725 for (a_elt = a->first, b_elt = b->first;
1726 a_elt && b_elt;)
1728 if (a_elt->indx < b_elt->indx)
1729 return true;
1730 else if (b_elt->indx < a_elt->indx)
1731 b_elt = b_elt->next;
1732 else
1734 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1735 if (a_elt->bits[ix] & ~b_elt->bits[ix])
1736 return true;
1737 a_elt = a_elt->next;
1738 b_elt = b_elt->next;
1741 return a_elt != NULL;
1745 /* DST = A | (FROM1 & ~FROM2). Return true if DST changes. */
1747 bool
1748 bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b, const_bitmap kill)
1750 bool changed = false;
1752 bitmap_element *dst_elt = dst->first;
1753 const bitmap_element *a_elt = a->first;
1754 const bitmap_element *b_elt = b->first;
1755 const bitmap_element *kill_elt = kill->first;
1756 bitmap_element *dst_prev = NULL;
1757 bitmap_element **dst_prev_pnext = &dst->first;
1759 gcc_assert (dst != a && dst != b && dst != kill);
1761 /* Special cases. We don't bother checking for bitmap_equal_p (b, kill). */
1762 if (b == kill || bitmap_empty_p (b))
1764 changed = !bitmap_equal_p (dst, a);
1765 if (changed)
1766 bitmap_copy (dst, a);
1767 return changed;
1769 if (bitmap_empty_p (kill))
1770 return bitmap_ior (dst, a, b);
1771 if (bitmap_empty_p (a))
1772 return bitmap_and_compl (dst, b, kill);
1774 while (a_elt || b_elt)
1776 bool new_element = false;
1778 if (b_elt)
1779 while (kill_elt && kill_elt->indx < b_elt->indx)
1780 kill_elt = kill_elt->next;
1782 if (b_elt && kill_elt && kill_elt->indx == b_elt->indx
1783 && (!a_elt || a_elt->indx >= b_elt->indx))
1785 bitmap_element tmp_elt;
1786 unsigned ix;
1788 BITMAP_WORD ior = 0;
1789 tmp_elt.indx = b_elt->indx;
1790 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1792 BITMAP_WORD r = b_elt->bits[ix] & ~kill_elt->bits[ix];
1793 ior |= r;
1794 tmp_elt.bits[ix] = r;
1797 if (ior)
1799 changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
1800 a_elt, &tmp_elt, changed);
1801 new_element = true;
1802 if (a_elt && a_elt->indx == b_elt->indx)
1803 a_elt = a_elt->next;
1806 b_elt = b_elt->next;
1807 kill_elt = kill_elt->next;
1809 else
1811 changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
1812 a_elt, b_elt, changed);
1813 new_element = true;
1815 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1817 a_elt = a_elt->next;
1818 b_elt = b_elt->next;
1820 else
1822 if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
1823 a_elt = a_elt->next;
1824 else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
1825 b_elt = b_elt->next;
1829 if (new_element)
1831 dst_prev = *dst_prev_pnext;
1832 dst_prev_pnext = &dst_prev->next;
1833 dst_elt = *dst_prev_pnext;
1837 if (dst_elt)
1839 changed = true;
1840 bitmap_elt_clear_from (dst, dst_elt);
1842 gcc_assert (!dst->current == !dst->first);
1843 if (dst->current)
1844 dst->indx = dst->current->indx;
1846 return changed;
1849 /* A |= (FROM1 & ~FROM2). Return true if A changes. */
1851 bool
1852 bitmap_ior_and_compl_into (bitmap a, const_bitmap from1, const_bitmap from2)
1854 bitmap_head tmp;
1855 bool changed;
1857 bitmap_initialize (&tmp, &bitmap_default_obstack);
1858 bitmap_and_compl (&tmp, from1, from2);
1859 changed = bitmap_ior_into (a, &tmp);
1860 bitmap_clear (&tmp);
1862 return changed;
1866 /* Debugging function to print out the contents of a bitmap. */
1868 void
1869 debug_bitmap_file (FILE *file, const_bitmap head)
1871 const bitmap_element *ptr;
1873 fprintf (file, "\nfirst = %p current = %p indx = %u\n",
1874 (void *) head->first, (void *) head->current, head->indx);
1876 for (ptr = head->first; ptr; ptr = ptr->next)
1878 unsigned int i, j, col = 26;
1880 fprintf (file, "\t%p next = %p prev = %p indx = %u\n\t\tbits = {",
1881 (const void*) ptr, (const void*) ptr->next,
1882 (const void*) ptr->prev, ptr->indx);
1884 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1885 for (j = 0; j < BITMAP_WORD_BITS; j++)
1886 if ((ptr->bits[i] >> j) & 1)
1888 if (col > 70)
1890 fprintf (file, "\n\t\t\t");
1891 col = 24;
1894 fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
1895 + i * BITMAP_WORD_BITS + j));
1896 col += 4;
1899 fprintf (file, " }\n");
1903 /* Function to be called from the debugger to print the contents
1904 of a bitmap. */
1906 void
1907 debug_bitmap (const_bitmap head)
1909 debug_bitmap_file (stdout, head);
1912 /* Function to print out the contents of a bitmap. Unlike debug_bitmap_file,
1913 it does not print anything but the bits. */
1915 void
1916 bitmap_print (FILE *file, const_bitmap head, const char *prefix, const char *suffix)
1918 const char *comma = "";
1919 unsigned i;
1920 bitmap_iterator bi;
1922 fputs (prefix, file);
1923 EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
1925 fprintf (file, "%s%d", comma, i);
1926 comma = ", ";
1928 fputs (suffix, file);
1930 #ifdef GATHER_STATISTICS
1933 /* Used to accumulate statistics about bitmap sizes. */
1934 struct output_info
1936 int count;
1937 int size;
1940 /* Called via htab_traverse. Output bitmap descriptor pointed out by SLOT
1941 and update statistics. */
1942 static int
1943 print_statistics (void **slot, void *b)
1945 struct bitmap_descriptor *d = (struct bitmap_descriptor *) *slot;
1946 struct output_info *i = (struct output_info *) b;
1947 char s[4096];
1949 if (d->allocated)
1951 const char *s1 = d->file;
1952 const char *s2;
1953 while ((s2 = strstr (s1, "gcc/")))
1954 s1 = s2 + 4;
1955 sprintf (s, "%s:%i (%s)", s1, d->line, d->function);
1956 s[41] = 0;
1957 fprintf (stderr, "%-41s %6d %10d %10d %10d %10d\n", s,
1958 d->created, d->allocated, d->peak, d->current, d->nsearches);
1959 i->size += d->allocated;
1960 i->count += d->created;
1962 return 1;
1964 #endif
1965 /* Output per-bitmap memory usage statistics. */
1966 void
1967 dump_bitmap_statistics (void)
1969 #ifdef GATHER_STATISTICS
1970 struct output_info info;
1972 if (!bitmap_desc_hash)
1973 return;
1975 fprintf (stderr, "\nBitmap Overall "
1976 "Allocated Peak Leak searched "
1977 " per search\n");
1978 fprintf (stderr, "---------------------------------------------------------------------------------\n");
1979 info.count = 0;
1980 info.size = 0;
1981 htab_traverse (bitmap_desc_hash, print_statistics, &info);
1982 fprintf (stderr, "---------------------------------------------------------------------------------\n");
1983 fprintf (stderr, "%-40s %7d %10d\n",
1984 "Total", info.count, info.size);
1985 fprintf (stderr, "---------------------------------------------------------------------------------\n");
1986 #endif
1989 /* Compute hash of bitmap (for purposes of hashing). */
1990 hashval_t
1991 bitmap_hash (const_bitmap head)
1993 const bitmap_element *ptr;
1994 BITMAP_WORD hash = 0;
1995 int ix;
1997 for (ptr = head->first; ptr; ptr = ptr->next)
1999 hash ^= ptr->indx;
2000 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
2001 hash ^= ptr->bits[ix];
2003 return (hashval_t)hash;
2006 #include "gt-bitmap.h"