1 /* Functions to support general ended bitmaps.
2 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
3 2006, 2007, 2008, 2009 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
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
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/>. */
23 #include "coretypes.h"
32 #ifdef GATHER_STATISTICS
34 /* Store information about each particular bitmap. */
35 struct bitmap_descriptor
41 HOST_WIDEST_INT allocated
;
43 HOST_WIDEST_INT current
;
48 /* Hashtable mapping bitmap names to descriptors. */
49 static htab_t bitmap_desc_hash
;
51 /* Hashtable helpers. */
53 hash_descriptor (const void *p
)
55 const struct bitmap_descriptor
*const d
=
56 (const struct bitmap_descriptor
*) p
;
57 return htab_hash_pointer (d
->file
) + d
->line
;
66 eq_descriptor (const void *p1
, const void *p2
)
68 const struct bitmap_descriptor
*const d
=
69 (const struct bitmap_descriptor
*) p1
;
70 const struct loc
*const l
= (const struct loc
*) p2
;
71 return d
->file
== l
->file
&& d
->function
== l
->function
&& d
->line
== l
->line
;
74 /* For given file and line, return descriptor, create new if needed. */
75 static struct bitmap_descriptor
*
76 bitmap_descriptor (const char *file
, const char *function
, int line
)
78 struct bitmap_descriptor
**slot
;
82 loc
.function
= function
;
85 if (!bitmap_desc_hash
)
86 bitmap_desc_hash
= htab_create (10, hash_descriptor
, eq_descriptor
, NULL
);
88 slot
= (struct bitmap_descriptor
**)
89 htab_find_slot_with_hash (bitmap_desc_hash
, &loc
,
90 htab_hash_pointer (file
) + line
,
94 *slot
= XCNEW (struct bitmap_descriptor
);
96 (*slot
)->function
= function
;
101 /* Register new bitmap. */
103 bitmap_register (bitmap b MEM_STAT_DECL
)
105 b
->desc
= bitmap_descriptor (_loc_name
, _loc_function
, _loc_line
);
109 /* Account the overhead. */
111 register_overhead (bitmap b
, int amount
)
113 b
->desc
->current
+= amount
;
115 b
->desc
->allocated
+= amount
;
116 gcc_assert (b
->desc
->current
>= 0);
117 if (b
->desc
->peak
< b
->desc
->current
)
118 b
->desc
->peak
= b
->desc
->current
;
123 bitmap_element bitmap_zero_bits
; /* An element of all zero bits. */
124 bitmap_obstack bitmap_default_obstack
; /* The default bitmap obstack. */
125 static int bitmap_default_obstack_depth
;
126 static GTY((deletable
)) bitmap_element
*bitmap_ggc_free
; /* Freelist of
129 static void bitmap_elem_to_freelist (bitmap
, bitmap_element
*);
130 static void bitmap_element_free (bitmap
, bitmap_element
*);
131 static bitmap_element
*bitmap_element_allocate (bitmap
);
132 static int bitmap_element_zerop (const bitmap_element
*);
133 static void bitmap_element_link (bitmap
, bitmap_element
*);
134 static bitmap_element
*bitmap_elt_insert_after (bitmap
, bitmap_element
*, unsigned int);
135 static void bitmap_elt_clear_from (bitmap
, bitmap_element
*);
136 static bitmap_element
*bitmap_find_bit (bitmap
, unsigned int);
139 /* Add ELEM to the appropriate freelist. */
141 bitmap_elem_to_freelist (bitmap head
, bitmap_element
*elt
)
143 bitmap_obstack
*bit_obstack
= head
->obstack
;
148 elt
->prev
= bit_obstack
->elements
;
149 bit_obstack
->elements
= elt
;
153 elt
->prev
= bitmap_ggc_free
;
154 bitmap_ggc_free
= elt
;
158 /* Free a bitmap element. Since these are allocated off the
159 bitmap_obstack, "free" actually means "put onto the freelist". */
162 bitmap_element_free (bitmap head
, bitmap_element
*elt
)
164 bitmap_element
*next
= elt
->next
;
165 bitmap_element
*prev
= elt
->prev
;
173 if (head
->first
== elt
)
176 /* Since the first thing we try is to insert before current,
177 make current the next entry in preference to the previous. */
178 if (head
->current
== elt
)
180 head
->current
= next
!= 0 ? next
: prev
;
182 head
->indx
= head
->current
->indx
;
186 #ifdef GATHER_STATISTICS
187 register_overhead (head
, -((int)sizeof (bitmap_element
)));
189 bitmap_elem_to_freelist (head
, elt
);
192 /* Allocate a bitmap element. The bits are cleared, but nothing else is. */
194 static inline bitmap_element
*
195 bitmap_element_allocate (bitmap head
)
197 bitmap_element
*element
;
198 bitmap_obstack
*bit_obstack
= head
->obstack
;
202 element
= bit_obstack
->elements
;
205 /* Use up the inner list first before looking at the next
206 element of the outer list. */
209 bit_obstack
->elements
= element
->next
;
210 bit_obstack
->elements
->prev
= element
->prev
;
213 /* Inner list was just a singleton. */
214 bit_obstack
->elements
= element
->prev
;
216 element
= XOBNEW (&bit_obstack
->obstack
, bitmap_element
);
220 element
= bitmap_ggc_free
;
222 /* Use up the inner list first before looking at the next
223 element of the outer list. */
226 bitmap_ggc_free
= element
->next
;
227 bitmap_ggc_free
->prev
= element
->prev
;
230 /* Inner list was just a singleton. */
231 bitmap_ggc_free
= element
->prev
;
233 element
= ggc_alloc_bitmap_element_def ();
236 #ifdef GATHER_STATISTICS
237 register_overhead (head
, sizeof (bitmap_element
));
239 memset (element
->bits
, 0, sizeof (element
->bits
));
244 /* Remove ELT and all following elements from bitmap HEAD. */
247 bitmap_elt_clear_from (bitmap head
, bitmap_element
*elt
)
249 bitmap_element
*prev
;
250 bitmap_obstack
*bit_obstack
= head
->obstack
;
251 #ifdef GATHER_STATISTICS
256 #ifdef GATHER_STATISTICS
258 for (prev
= elt
; prev
; prev
= prev
->next
)
260 register_overhead (head
, -sizeof (bitmap_element
) * n
);
267 if (head
->current
->indx
> prev
->indx
)
269 head
->current
= prev
;
270 head
->indx
= prev
->indx
;
276 head
->current
= NULL
;
280 /* Put the entire list onto the free list in one operation. */
283 elt
->prev
= bit_obstack
->elements
;
284 bit_obstack
->elements
= elt
;
288 elt
->prev
= bitmap_ggc_free
;
289 bitmap_ggc_free
= elt
;
293 /* Clear a bitmap by freeing the linked list. */
296 bitmap_clear (bitmap head
)
299 bitmap_elt_clear_from (head
, head
->first
);
302 /* Initialize a bitmap obstack. If BIT_OBSTACK is NULL, initialize
303 the default bitmap obstack. */
306 bitmap_obstack_initialize (bitmap_obstack
*bit_obstack
)
310 if (bitmap_default_obstack_depth
++)
312 bit_obstack
= &bitmap_default_obstack
;
315 #if !defined(__GNUC__) || (__GNUC__ < 2)
316 #define __alignof__(type) 0
319 bit_obstack
->elements
= NULL
;
320 bit_obstack
->heads
= NULL
;
321 obstack_specify_allocation (&bit_obstack
->obstack
, OBSTACK_CHUNK_SIZE
,
322 __alignof__ (bitmap_element
),
327 /* Release the memory from a bitmap obstack. If BIT_OBSTACK is NULL,
328 release the default bitmap obstack. */
331 bitmap_obstack_release (bitmap_obstack
*bit_obstack
)
335 if (--bitmap_default_obstack_depth
)
337 gcc_assert (bitmap_default_obstack_depth
> 0);
340 bit_obstack
= &bitmap_default_obstack
;
343 bit_obstack
->elements
= NULL
;
344 bit_obstack
->heads
= NULL
;
345 obstack_free (&bit_obstack
->obstack
, NULL
);
348 /* Create a new bitmap on an obstack. If BIT_OBSTACK is NULL, create
349 it on the default bitmap obstack. */
352 bitmap_obstack_alloc_stat (bitmap_obstack
*bit_obstack MEM_STAT_DECL
)
357 bit_obstack
= &bitmap_default_obstack
;
358 map
= bit_obstack
->heads
;
360 bit_obstack
->heads
= (struct bitmap_head_def
*) map
->first
;
362 map
= XOBNEW (&bit_obstack
->obstack
, bitmap_head
);
363 bitmap_initialize_stat (map
, bit_obstack PASS_MEM_STAT
);
364 #ifdef GATHER_STATISTICS
365 register_overhead (map
, sizeof (bitmap_head
));
371 /* Create a new GCd bitmap. */
374 bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL
)
378 map
= ggc_alloc_bitmap_head_def ();
379 bitmap_initialize_stat (map
, NULL PASS_MEM_STAT
);
380 #ifdef GATHER_STATISTICS
381 register_overhead (map
, sizeof (bitmap_head
));
387 /* Release an obstack allocated bitmap. */
390 bitmap_obstack_free (bitmap map
)
395 map
->first
= (bitmap_element
*) map
->obstack
->heads
;
396 #ifdef GATHER_STATISTICS
397 register_overhead (map
, -((int)sizeof (bitmap_head
)));
399 map
->obstack
->heads
= map
;
404 /* Return nonzero if all bits in an element are zero. */
407 bitmap_element_zerop (const bitmap_element
*element
)
409 #if BITMAP_ELEMENT_WORDS == 2
410 return (element
->bits
[0] | element
->bits
[1]) == 0;
414 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
415 if (element
->bits
[i
] != 0)
422 /* Link the bitmap element into the current bitmap linked list. */
425 bitmap_element_link (bitmap head
, bitmap_element
*element
)
427 unsigned int indx
= element
->indx
;
430 /* If this is the first and only element, set it in. */
431 if (head
->first
== 0)
433 element
->next
= element
->prev
= 0;
434 head
->first
= element
;
437 /* If this index is less than that of the current element, it goes someplace
438 before the current element. */
439 else if (indx
< head
->indx
)
441 for (ptr
= head
->current
;
442 ptr
->prev
!= 0 && ptr
->prev
->indx
> indx
;
447 ptr
->prev
->next
= element
;
449 head
->first
= element
;
451 element
->prev
= ptr
->prev
;
456 /* Otherwise, it must go someplace after the current element. */
459 for (ptr
= head
->current
;
460 ptr
->next
!= 0 && ptr
->next
->indx
< indx
;
465 ptr
->next
->prev
= element
;
467 element
->next
= ptr
->next
;
472 /* Set up so this is the first element searched. */
473 head
->current
= element
;
477 /* Insert a new uninitialized element into bitmap HEAD after element
478 ELT. If ELT is NULL, insert the element at the start. Return the
481 static bitmap_element
*
482 bitmap_elt_insert_after (bitmap head
, bitmap_element
*elt
, unsigned int indx
)
484 bitmap_element
*node
= bitmap_element_allocate (head
);
491 head
->current
= node
;
494 node
->next
= head
->first
;
496 node
->next
->prev
= node
;
502 gcc_checking_assert (head
->current
);
503 node
->next
= elt
->next
;
505 node
->next
->prev
= node
;
512 /* Copy a bitmap to another bitmap. */
515 bitmap_copy (bitmap to
, const_bitmap from
)
517 const bitmap_element
*from_ptr
;
518 bitmap_element
*to_ptr
= 0;
522 /* Copy elements in forward direction one at a time. */
523 for (from_ptr
= from
->first
; from_ptr
; from_ptr
= from_ptr
->next
)
525 bitmap_element
*to_elt
= bitmap_element_allocate (to
);
527 to_elt
->indx
= from_ptr
->indx
;
528 memcpy (to_elt
->bits
, from_ptr
->bits
, sizeof (to_elt
->bits
));
530 /* Here we have a special case of bitmap_element_link, for the case
531 where we know the links are being entered in sequence. */
534 to
->first
= to
->current
= to_elt
;
535 to
->indx
= from_ptr
->indx
;
536 to_elt
->next
= to_elt
->prev
= 0;
540 to_elt
->prev
= to_ptr
;
542 to_ptr
->next
= to_elt
;
549 /* Find a bitmap element that would hold a bitmap's bit.
550 Update the `current' field even if we can't find an element that
551 would hold the bitmap's bit to make eventual allocation
554 static inline bitmap_element
*
555 bitmap_find_bit (bitmap head
, unsigned int bit
)
557 bitmap_element
*element
;
558 unsigned int indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
560 if (head
->current
== 0
561 || head
->indx
== indx
)
562 return head
->current
;
563 #ifdef GATHER_STATISTICS
564 head
->desc
->nsearches
++;
567 if (head
->indx
< indx
)
568 /* INDX is beyond head->indx. Search from head->current
570 for (element
= head
->current
;
571 element
->next
!= 0 && element
->indx
< indx
;
572 element
= element
->next
)
573 #ifdef GATHER_STATISTICS
574 head
->desc
->search_iter
++;
579 else if (head
->indx
/ 2 < indx
)
580 /* INDX is less than head->indx and closer to head->indx than to
581 0. Search from head->current backward. */
582 for (element
= head
->current
;
583 element
->prev
!= 0 && element
->indx
> indx
;
584 element
= element
->prev
)
585 #ifdef GATHER_STATISTICS
586 head
->desc
->search_iter
++;
592 /* INDX is less than head->indx and closer to 0 than to
593 head->indx. Search from head->first forward. */
594 for (element
= head
->first
;
595 element
->next
!= 0 && element
->indx
< indx
;
596 element
= element
->next
)
597 #ifdef GATHER_STATISTICS
598 head
->desc
->search_iter
++;
603 /* `element' is the nearest to the one we want. If it's not the one we
604 want, the one we want doesn't exist. */
605 head
->current
= element
;
606 head
->indx
= element
->indx
;
607 if (element
!= 0 && element
->indx
!= indx
)
613 /* Clear a single bit in a bitmap. Return true if the bit changed. */
616 bitmap_clear_bit (bitmap head
, int bit
)
618 bitmap_element
*const ptr
= bitmap_find_bit (head
, bit
);
622 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
623 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
624 BITMAP_WORD bit_val
= ((BITMAP_WORD
) 1) << bit_num
;
625 bool res
= (ptr
->bits
[word_num
] & bit_val
) != 0;
628 ptr
->bits
[word_num
] &= ~bit_val
;
629 /* If we cleared the entire word, free up the element. */
630 if (!ptr
->bits
[word_num
]
631 && bitmap_element_zerop (ptr
))
632 bitmap_element_free (head
, ptr
);
641 /* Set a single bit in a bitmap. Return true if the bit changed. */
644 bitmap_set_bit (bitmap head
, int bit
)
646 bitmap_element
*ptr
= bitmap_find_bit (head
, bit
);
647 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
648 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
649 BITMAP_WORD bit_val
= ((BITMAP_WORD
) 1) << bit_num
;
653 ptr
= bitmap_element_allocate (head
);
654 ptr
->indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
655 ptr
->bits
[word_num
] = bit_val
;
656 bitmap_element_link (head
, ptr
);
661 bool res
= (ptr
->bits
[word_num
] & bit_val
) == 0;
663 ptr
->bits
[word_num
] |= bit_val
;
668 /* Return whether a bit is set within a bitmap. */
671 bitmap_bit_p (bitmap head
, int bit
)
677 ptr
= bitmap_find_bit (head
, bit
);
681 bit_num
= bit
% BITMAP_WORD_BITS
;
682 word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
684 return (ptr
->bits
[word_num
] >> bit_num
) & 1;
687 #if GCC_VERSION < 3400
688 /* Table of number of set bits in a character, indexed by value of char. */
689 static const unsigned char popcount_table
[] =
691 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,
692 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
693 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,
694 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
695 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,
696 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,
697 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,
698 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,
702 bitmap_popcount (BITMAP_WORD a
)
704 unsigned long ret
= 0;
707 /* Just do this the table way for now */
708 for (i
= 0; i
< BITMAP_WORD_BITS
; i
+= 8)
709 ret
+= popcount_table
[(a
>> i
) & 0xff];
713 /* Count the number of bits set in the bitmap, and return it. */
716 bitmap_count_bits (const_bitmap a
)
718 unsigned long count
= 0;
719 const bitmap_element
*elt
;
722 for (elt
= a
->first
; elt
; elt
= elt
->next
)
724 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
726 #if GCC_VERSION >= 3400
727 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
728 of BITMAP_WORD is not material. */
729 count
+= __builtin_popcountl (elt
->bits
[ix
]);
731 count
+= bitmap_popcount (elt
->bits
[ix
]);
738 /* Return true if the bitmap has a single bit set. Otherwise return
742 bitmap_single_bit_set_p (const_bitmap a
)
744 unsigned long count
= 0;
745 const bitmap_element
*elt
;
748 if (bitmap_empty_p (a
))
752 /* As there are no completely empty bitmap elements, a second one
753 means we have more than one bit set. */
754 if (elt
->next
!= NULL
)
757 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
759 #if GCC_VERSION >= 3400
760 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
761 of BITMAP_WORD is not material. */
762 count
+= __builtin_popcountl (elt
->bits
[ix
]);
764 count
+= bitmap_popcount (elt
->bits
[ix
]);
774 /* Return the bit number of the first set bit in the bitmap. The
775 bitmap must be non-empty. */
778 bitmap_first_set_bit (const_bitmap a
)
780 const bitmap_element
*elt
= a
->first
;
785 gcc_checking_assert (elt
);
786 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
787 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
789 word
= elt
->bits
[ix
];
795 bit_no
+= ix
* BITMAP_WORD_BITS
;
797 #if GCC_VERSION >= 3004
798 gcc_assert (sizeof(long) == sizeof (word
));
799 bit_no
+= __builtin_ctzl (word
);
801 /* Binary search for the first set bit. */
802 #if BITMAP_WORD_BITS > 64
803 #error "Fill out the table."
805 #if BITMAP_WORD_BITS > 32
806 if (!(word
& 0xffffffff))
807 word
>>= 32, bit_no
+= 32;
809 if (!(word
& 0xffff))
810 word
>>= 16, bit_no
+= 16;
812 word
>>= 8, bit_no
+= 8;
814 word
>>= 4, bit_no
+= 4;
816 word
>>= 2, bit_no
+= 2;
818 word
>>= 1, bit_no
+= 1;
820 gcc_checking_assert (word
& 1);
825 /* Return the bit number of the first set bit in the bitmap. The
826 bitmap must be non-empty. */
829 bitmap_last_set_bit (const_bitmap a
)
831 const bitmap_element
*elt
= a
->current
? a
->current
: a
->first
;
836 gcc_checking_assert (elt
);
839 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
840 for (ix
= BITMAP_ELEMENT_WORDS
- 1; ix
>= 0; ix
--)
842 word
= elt
->bits
[ix
];
848 bit_no
+= ix
* BITMAP_WORD_BITS
;
850 /* Binary search for the last set bit. */
851 #if GCC_VERSION >= 3004
852 gcc_assert (sizeof(long) == sizeof (word
));
853 bit_no
+= sizeof (long) * 8 - __builtin_ctzl (word
);
855 #if BITMAP_WORD_BITS > 64
856 #error "Fill out the table."
858 #if BITMAP_WORD_BITS > 32
859 if ((word
& 0xffffffff00000000))
860 word
>>= 32, bit_no
+= 32;
862 if (word
& 0xffff0000)
863 word
>>= 16, bit_no
+= 16;
864 if (!(word
& 0xff00))
865 word
>>= 8, bit_no
+= 8;
867 word
>>= 4, bit_no
+= 4;
869 word
>>= 2, bit_no
+= 2;
871 word
>>= 1, bit_no
+= 1;
874 gcc_checking_assert (word
& 1);
882 bitmap_and (bitmap dst
, const_bitmap a
, const_bitmap b
)
884 bitmap_element
*dst_elt
= dst
->first
;
885 const bitmap_element
*a_elt
= a
->first
;
886 const bitmap_element
*b_elt
= b
->first
;
887 bitmap_element
*dst_prev
= NULL
;
889 gcc_assert (dst
!= a
&& dst
!= b
);
893 bitmap_copy (dst
, a
);
897 while (a_elt
&& b_elt
)
899 if (a_elt
->indx
< b_elt
->indx
)
901 else if (b_elt
->indx
< a_elt
->indx
)
905 /* Matching elts, generate A & B. */
910 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
912 dst_elt
->indx
= a_elt
->indx
;
913 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
915 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
917 dst_elt
->bits
[ix
] = r
;
923 dst_elt
= dst_elt
->next
;
929 /* Ensure that dst->current is valid. */
930 dst
->current
= dst
->first
;
931 bitmap_elt_clear_from (dst
, dst_elt
);
932 gcc_checking_assert (!dst
->current
== !dst
->first
);
934 dst
->indx
= dst
->current
->indx
;
940 bitmap_and_into (bitmap a
, const_bitmap b
)
942 bitmap_element
*a_elt
= a
->first
;
943 const bitmap_element
*b_elt
= b
->first
;
944 bitmap_element
*next
;
949 while (a_elt
&& b_elt
)
951 if (a_elt
->indx
< b_elt
->indx
)
954 bitmap_element_free (a
, a_elt
);
957 else if (b_elt
->indx
< a_elt
->indx
)
961 /* Matching elts, generate A &= B. */
965 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
967 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
974 bitmap_element_free (a
, a_elt
);
979 bitmap_elt_clear_from (a
, a_elt
);
980 gcc_checking_assert (!a
->current
== !a
->first
981 && (!a
->current
|| a
->indx
== a
->current
->indx
));
985 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
986 if non-NULL. CHANGED is true if the destination bitmap had already been
987 changed; the new value of CHANGED is returned. */
990 bitmap_elt_copy (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
991 const bitmap_element
*src_elt
, bool changed
)
993 if (!changed
&& dst_elt
&& dst_elt
->indx
== src_elt
->indx
)
997 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
998 if (src_elt
->bits
[ix
] != dst_elt
->bits
[ix
])
1000 dst_elt
->bits
[ix
] = src_elt
->bits
[ix
];
1008 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src_elt
->indx
);
1010 dst_elt
->indx
= src_elt
->indx
;
1011 memcpy (dst_elt
->bits
, src_elt
->bits
, sizeof (dst_elt
->bits
));
1021 bitmap_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
)
1023 bitmap_element
*dst_elt
= dst
->first
;
1024 const bitmap_element
*a_elt
= a
->first
;
1025 const bitmap_element
*b_elt
= b
->first
;
1026 bitmap_element
*dst_prev
= NULL
;
1027 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1028 bool changed
= false;
1030 gcc_assert (dst
!= a
&& dst
!= b
);
1034 changed
= !bitmap_empty_p (dst
);
1041 while (b_elt
&& b_elt
->indx
< a_elt
->indx
)
1042 b_elt
= b_elt
->next
;
1044 if (!b_elt
|| b_elt
->indx
> a_elt
->indx
)
1046 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, a_elt
, changed
);
1047 dst_prev
= *dst_prev_pnext
;
1048 dst_prev_pnext
= &dst_prev
->next
;
1049 dst_elt
= *dst_prev_pnext
;
1050 a_elt
= a_elt
->next
;
1055 /* Matching elts, generate A & ~B. */
1057 BITMAP_WORD ior
= 0;
1059 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1061 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1063 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1065 if (dst_elt
->bits
[ix
] != r
)
1068 dst_elt
->bits
[ix
] = r
;
1076 if (!dst_elt
|| dst_elt
->indx
> a_elt
->indx
)
1078 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1083 dst_elt
->indx
= a_elt
->indx
;
1084 new_element
= false;
1087 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1089 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1091 dst_elt
->bits
[ix
] = r
;
1099 changed
|= !new_element
;
1100 bitmap_element_free (dst
, dst_elt
);
1101 dst_elt
= *dst_prev_pnext
;
1107 dst_prev
= *dst_prev_pnext
;
1108 dst_prev_pnext
= &dst_prev
->next
;
1109 dst_elt
= *dst_prev_pnext
;
1111 a_elt
= a_elt
->next
;
1112 b_elt
= b_elt
->next
;
1116 /* Ensure that dst->current is valid. */
1117 dst
->current
= dst
->first
;
1122 bitmap_elt_clear_from (dst
, dst_elt
);
1124 gcc_checking_assert (!dst
->current
== !dst
->first
);
1126 dst
->indx
= dst
->current
->indx
;
1131 /* A &= ~B. Returns true if A changes */
1134 bitmap_and_compl_into (bitmap a
, const_bitmap b
)
1136 bitmap_element
*a_elt
= a
->first
;
1137 const bitmap_element
*b_elt
= b
->first
;
1138 bitmap_element
*next
;
1139 BITMAP_WORD changed
= 0;
1143 if (bitmap_empty_p (a
))
1152 while (a_elt
&& b_elt
)
1154 if (a_elt
->indx
< b_elt
->indx
)
1155 a_elt
= a_elt
->next
;
1156 else if (b_elt
->indx
< a_elt
->indx
)
1157 b_elt
= b_elt
->next
;
1160 /* Matching elts, generate A &= ~B. */
1162 BITMAP_WORD ior
= 0;
1164 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1166 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1167 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ cleared
;
1169 a_elt
->bits
[ix
] = r
;
1175 bitmap_element_free (a
, a_elt
);
1177 b_elt
= b_elt
->next
;
1180 gcc_checking_assert (!a
->current
== !a
->first
1181 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1182 return changed
!= 0;
1185 /* Set COUNT bits from START in HEAD. */
1187 bitmap_set_range (bitmap head
, unsigned int start
, unsigned int count
)
1189 unsigned int first_index
, end_bit_plus1
, last_index
;
1190 bitmap_element
*elt
, *elt_prev
;
1196 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1197 end_bit_plus1
= start
+ count
;
1198 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1199 elt
= bitmap_find_bit (head
, start
);
1201 /* If bitmap_find_bit returns zero, the current is the closest block
1202 to the result. Otherwise, just use bitmap_element_allocate to
1203 ensure ELT is set; in the loop below, ELT == NULL means "insert
1204 at the end of the bitmap". */
1207 elt
= bitmap_element_allocate (head
);
1208 elt
->indx
= first_index
;
1209 bitmap_element_link (head
, elt
);
1212 gcc_checking_assert (elt
->indx
== first_index
);
1213 elt_prev
= elt
->prev
;
1214 for (i
= first_index
; i
<= last_index
; i
++)
1216 unsigned elt_start_bit
= i
* BITMAP_ELEMENT_ALL_BITS
;
1217 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1219 unsigned int first_word_to_mod
;
1220 BITMAP_WORD first_mask
;
1221 unsigned int last_word_to_mod
;
1222 BITMAP_WORD last_mask
;
1225 if (!elt
|| elt
->indx
!= i
)
1226 elt
= bitmap_elt_insert_after (head
, elt_prev
, i
);
1228 if (elt_start_bit
<= start
)
1230 /* The first bit to turn on is somewhere inside this
1232 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1234 /* This mask should have 1s in all bits >= start position. */
1236 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1237 first_mask
= ~first_mask
;
1241 /* The first bit to turn on is below this start of this elt. */
1242 first_word_to_mod
= 0;
1243 first_mask
= ~(BITMAP_WORD
) 0;
1246 if (elt_end_bit_plus1
<= end_bit_plus1
)
1248 /* The last bit to turn on is beyond this elt. */
1249 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1250 last_mask
= ~(BITMAP_WORD
) 0;
1254 /* The last bit to turn on is inside to this elt. */
1256 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1258 /* The last mask should have 1s below the end bit. */
1260 (((BITMAP_WORD
) 1) << ((end_bit_plus1
% BITMAP_WORD_BITS
))) - 1;
1263 if (first_word_to_mod
== last_word_to_mod
)
1265 BITMAP_WORD mask
= first_mask
& last_mask
;
1266 elt
->bits
[first_word_to_mod
] |= mask
;
1270 elt
->bits
[first_word_to_mod
] |= first_mask
;
1271 if (BITMAP_ELEMENT_WORDS
> 2)
1272 for (ix
= first_word_to_mod
+ 1; ix
< last_word_to_mod
; ix
++)
1273 elt
->bits
[ix
] = ~(BITMAP_WORD
) 0;
1274 elt
->bits
[last_word_to_mod
] |= last_mask
;
1281 head
->current
= elt
? elt
: elt_prev
;
1282 head
->indx
= head
->current
->indx
;
1285 /* Clear COUNT bits from START in HEAD. */
1287 bitmap_clear_range (bitmap head
, unsigned int start
, unsigned int count
)
1289 unsigned int first_index
, end_bit_plus1
, last_index
;
1290 bitmap_element
*elt
;
1295 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1296 end_bit_plus1
= start
+ count
;
1297 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1298 elt
= bitmap_find_bit (head
, start
);
1300 /* If bitmap_find_bit returns zero, the current is the closest block
1301 to the result. If the current is less than first index, find the
1302 next one. Otherwise, just set elt to be current. */
1307 if (head
->indx
< first_index
)
1309 elt
= head
->current
->next
;
1314 elt
= head
->current
;
1320 while (elt
&& (elt
->indx
<= last_index
))
1322 bitmap_element
* next_elt
= elt
->next
;
1323 unsigned elt_start_bit
= (elt
->indx
) * BITMAP_ELEMENT_ALL_BITS
;
1324 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1327 if (elt_start_bit
>= start
&& elt_end_bit_plus1
<= end_bit_plus1
)
1328 /* Get rid of the entire elt and go to the next one. */
1329 bitmap_element_free (head
, elt
);
1332 /* Going to have to knock out some bits in this elt. */
1333 unsigned int first_word_to_mod
;
1334 BITMAP_WORD first_mask
;
1335 unsigned int last_word_to_mod
;
1336 BITMAP_WORD last_mask
;
1340 if (elt_start_bit
<= start
)
1342 /* The first bit to turn off is somewhere inside this
1344 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1346 /* This mask should have 1s in all bits >= start position. */
1348 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1349 first_mask
= ~first_mask
;
1353 /* The first bit to turn off is below this start of this elt. */
1354 first_word_to_mod
= 0;
1356 first_mask
= ~first_mask
;
1359 if (elt_end_bit_plus1
<= end_bit_plus1
)
1361 /* The last bit to turn off is beyond this elt. */
1362 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1364 last_mask
= ~last_mask
;
1368 /* The last bit to turn off is inside to this elt. */
1370 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1372 /* The last mask should have 1s below the end bit. */
1374 (((BITMAP_WORD
) 1) << (((end_bit_plus1
) % BITMAP_WORD_BITS
))) - 1;
1378 if (first_word_to_mod
== last_word_to_mod
)
1380 BITMAP_WORD mask
= first_mask
& last_mask
;
1381 elt
->bits
[first_word_to_mod
] &= ~mask
;
1385 elt
->bits
[first_word_to_mod
] &= ~first_mask
;
1386 if (BITMAP_ELEMENT_WORDS
> 2)
1387 for (i
= first_word_to_mod
+ 1; i
< last_word_to_mod
; i
++)
1389 elt
->bits
[last_word_to_mod
] &= ~last_mask
;
1391 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
1397 /* Check to see if there are any bits left. */
1399 bitmap_element_free (head
, elt
);
1406 head
->current
= elt
;
1407 head
->indx
= head
->current
->indx
;
1414 bitmap_compl_and_into (bitmap a
, const_bitmap b
)
1416 bitmap_element
*a_elt
= a
->first
;
1417 const bitmap_element
*b_elt
= b
->first
;
1418 bitmap_element
*a_prev
= NULL
;
1419 bitmap_element
*next
;
1421 gcc_assert (a
!= b
);
1423 if (bitmap_empty_p (a
))
1428 if (bitmap_empty_p (b
))
1434 while (a_elt
|| b_elt
)
1436 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1438 /* A is before B. Remove A */
1440 a_prev
= a_elt
->prev
;
1441 bitmap_element_free (a
, a_elt
);
1444 else if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1446 /* B is before A. Copy B. */
1447 next
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1448 memcpy (next
->bits
, b_elt
->bits
, sizeof (next
->bits
));
1450 b_elt
= b_elt
->next
;
1454 /* Matching elts, generate A = ~A & B. */
1456 BITMAP_WORD ior
= 0;
1458 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1460 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1461 BITMAP_WORD r
= b_elt
->bits
[ix
] ^ cleared
;
1463 a_elt
->bits
[ix
] = r
;
1468 bitmap_element_free (a
, a_elt
);
1472 b_elt
= b_elt
->next
;
1475 gcc_checking_assert (!a
->current
== !a
->first
1476 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1481 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1482 overwriting DST_ELT if non-NULL. CHANGED is true if the destination bitmap
1483 had already been changed; the new value of CHANGED is returned. */
1486 bitmap_elt_ior (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
1487 const bitmap_element
*a_elt
, const bitmap_element
*b_elt
,
1490 gcc_assert (a_elt
|| b_elt
);
1492 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1494 /* Matching elts, generate A | B. */
1497 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1499 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1501 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
1502 if (r
!= dst_elt
->bits
[ix
])
1504 dst_elt
->bits
[ix
] = r
;
1513 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1515 dst_elt
->indx
= a_elt
->indx
;
1516 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1518 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
1519 dst_elt
->bits
[ix
] = r
;
1525 /* Copy a single element. */
1526 const bitmap_element
*src
;
1528 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1533 gcc_checking_assert (src
);
1534 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, src
, changed
);
1540 /* DST = A | B. Return true if DST changes. */
1543 bitmap_ior (bitmap dst
, const_bitmap a
, const_bitmap b
)
1545 bitmap_element
*dst_elt
= dst
->first
;
1546 const bitmap_element
*a_elt
= a
->first
;
1547 const bitmap_element
*b_elt
= b
->first
;
1548 bitmap_element
*dst_prev
= NULL
;
1549 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1550 bool changed
= false;
1552 gcc_assert (dst
!= a
&& dst
!= b
);
1554 while (a_elt
|| b_elt
)
1556 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
, a_elt
, b_elt
, changed
);
1558 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1560 a_elt
= a_elt
->next
;
1561 b_elt
= b_elt
->next
;
1565 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
1566 a_elt
= a_elt
->next
;
1567 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
1568 b_elt
= b_elt
->next
;
1571 dst_prev
= *dst_prev_pnext
;
1572 dst_prev_pnext
= &dst_prev
->next
;
1573 dst_elt
= *dst_prev_pnext
;
1579 bitmap_elt_clear_from (dst
, dst_elt
);
1581 gcc_checking_assert (!dst
->current
== !dst
->first
);
1583 dst
->indx
= dst
->current
->indx
;
1587 /* A |= B. Return true if A changes. */
1590 bitmap_ior_into (bitmap a
, const_bitmap b
)
1592 bitmap_element
*a_elt
= a
->first
;
1593 const bitmap_element
*b_elt
= b
->first
;
1594 bitmap_element
*a_prev
= NULL
;
1595 bitmap_element
**a_prev_pnext
= &a
->first
;
1596 bool changed
= false;
1603 /* If A lags behind B, just advance it. */
1604 if (!a_elt
|| a_elt
->indx
== b_elt
->indx
)
1606 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, b_elt
, changed
);
1607 b_elt
= b_elt
->next
;
1609 else if (a_elt
->indx
> b_elt
->indx
)
1611 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, b_elt
, changed
);
1612 b_elt
= b_elt
->next
;
1615 a_prev
= *a_prev_pnext
;
1616 a_prev_pnext
= &a_prev
->next
;
1617 a_elt
= *a_prev_pnext
;
1620 gcc_checking_assert (!a
->current
== !a
->first
);
1622 a
->indx
= a
->current
->indx
;
1629 bitmap_xor (bitmap dst
, const_bitmap a
, const_bitmap b
)
1631 bitmap_element
*dst_elt
= dst
->first
;
1632 const bitmap_element
*a_elt
= a
->first
;
1633 const bitmap_element
*b_elt
= b
->first
;
1634 bitmap_element
*dst_prev
= NULL
;
1636 gcc_assert (dst
!= a
&& dst
!= b
);
1643 while (a_elt
|| b_elt
)
1645 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1647 /* Matching elts, generate A ^ B. */
1649 BITMAP_WORD ior
= 0;
1652 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1654 dst_elt
->indx
= a_elt
->indx
;
1655 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1657 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
1660 dst_elt
->bits
[ix
] = r
;
1662 a_elt
= a_elt
->next
;
1663 b_elt
= b_elt
->next
;
1667 dst_elt
= dst_elt
->next
;
1672 /* Copy a single element. */
1673 const bitmap_element
*src
;
1675 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1678 a_elt
= a_elt
->next
;
1683 b_elt
= b_elt
->next
;
1687 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src
->indx
);
1689 dst_elt
->indx
= src
->indx
;
1690 memcpy (dst_elt
->bits
, src
->bits
, sizeof (dst_elt
->bits
));
1692 dst_elt
= dst_elt
->next
;
1695 /* Ensure that dst->current is valid. */
1696 dst
->current
= dst
->first
;
1697 bitmap_elt_clear_from (dst
, dst_elt
);
1698 gcc_checking_assert (!dst
->current
== !dst
->first
);
1700 dst
->indx
= dst
->current
->indx
;
1706 bitmap_xor_into (bitmap a
, const_bitmap b
)
1708 bitmap_element
*a_elt
= a
->first
;
1709 const bitmap_element
*b_elt
= b
->first
;
1710 bitmap_element
*a_prev
= NULL
;
1720 if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1723 bitmap_element
*dst
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1724 memcpy (dst
->bits
, b_elt
->bits
, sizeof (dst
->bits
));
1726 b_elt
= b_elt
->next
;
1728 else if (a_elt
->indx
< b_elt
->indx
)
1731 a_elt
= a_elt
->next
;
1735 /* Matching elts, generate A ^= B. */
1737 BITMAP_WORD ior
= 0;
1738 bitmap_element
*next
= a_elt
->next
;
1740 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1742 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
1745 a_elt
->bits
[ix
] = r
;
1747 b_elt
= b_elt
->next
;
1751 bitmap_element_free (a
, a_elt
);
1755 gcc_checking_assert (!a
->current
== !a
->first
);
1757 a
->indx
= a
->current
->indx
;
1760 /* Return true if two bitmaps are identical.
1761 We do not bother with a check for pointer equality, as that never
1762 occurs in practice. */
1765 bitmap_equal_p (const_bitmap a
, const_bitmap b
)
1767 const bitmap_element
*a_elt
;
1768 const bitmap_element
*b_elt
;
1771 for (a_elt
= a
->first
, b_elt
= b
->first
;
1773 a_elt
= a_elt
->next
, b_elt
= b_elt
->next
)
1775 if (a_elt
->indx
!= b_elt
->indx
)
1777 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1778 if (a_elt
->bits
[ix
] != b_elt
->bits
[ix
])
1781 return !a_elt
&& !b_elt
;
1784 /* Return true if A AND B is not empty. */
1787 bitmap_intersect_p (const_bitmap a
, const_bitmap b
)
1789 const bitmap_element
*a_elt
;
1790 const bitmap_element
*b_elt
;
1793 for (a_elt
= a
->first
, b_elt
= b
->first
;
1796 if (a_elt
->indx
< b_elt
->indx
)
1797 a_elt
= a_elt
->next
;
1798 else if (b_elt
->indx
< a_elt
->indx
)
1799 b_elt
= b_elt
->next
;
1802 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1803 if (a_elt
->bits
[ix
] & b_elt
->bits
[ix
])
1805 a_elt
= a_elt
->next
;
1806 b_elt
= b_elt
->next
;
1812 /* Return true if A AND NOT B is not empty. */
1815 bitmap_intersect_compl_p (const_bitmap a
, const_bitmap b
)
1817 const bitmap_element
*a_elt
;
1818 const bitmap_element
*b_elt
;
1820 for (a_elt
= a
->first
, b_elt
= b
->first
;
1823 if (a_elt
->indx
< b_elt
->indx
)
1825 else if (b_elt
->indx
< a_elt
->indx
)
1826 b_elt
= b_elt
->next
;
1829 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1830 if (a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
])
1832 a_elt
= a_elt
->next
;
1833 b_elt
= b_elt
->next
;
1836 return a_elt
!= NULL
;
1840 /* DST = A | (FROM1 & ~FROM2). Return true if DST changes. */
1843 bitmap_ior_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
, const_bitmap kill
)
1845 bool changed
= false;
1847 bitmap_element
*dst_elt
= dst
->first
;
1848 const bitmap_element
*a_elt
= a
->first
;
1849 const bitmap_element
*b_elt
= b
->first
;
1850 const bitmap_element
*kill_elt
= kill
->first
;
1851 bitmap_element
*dst_prev
= NULL
;
1852 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1854 gcc_assert (dst
!= a
&& dst
!= b
&& dst
!= kill
);
1856 /* Special cases. We don't bother checking for bitmap_equal_p (b, kill). */
1857 if (b
== kill
|| bitmap_empty_p (b
))
1859 changed
= !bitmap_equal_p (dst
, a
);
1861 bitmap_copy (dst
, a
);
1864 if (bitmap_empty_p (kill
))
1865 return bitmap_ior (dst
, a
, b
);
1866 if (bitmap_empty_p (a
))
1867 return bitmap_and_compl (dst
, b
, kill
);
1869 while (a_elt
|| b_elt
)
1871 bool new_element
= false;
1874 while (kill_elt
&& kill_elt
->indx
< b_elt
->indx
)
1875 kill_elt
= kill_elt
->next
;
1877 if (b_elt
&& kill_elt
&& kill_elt
->indx
== b_elt
->indx
1878 && (!a_elt
|| a_elt
->indx
>= b_elt
->indx
))
1880 bitmap_element tmp_elt
;
1883 BITMAP_WORD ior
= 0;
1884 tmp_elt
.indx
= b_elt
->indx
;
1885 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1887 BITMAP_WORD r
= b_elt
->bits
[ix
] & ~kill_elt
->bits
[ix
];
1889 tmp_elt
.bits
[ix
] = r
;
1894 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1895 a_elt
, &tmp_elt
, changed
);
1897 if (a_elt
&& a_elt
->indx
== b_elt
->indx
)
1898 a_elt
= a_elt
->next
;
1901 b_elt
= b_elt
->next
;
1902 kill_elt
= kill_elt
->next
;
1906 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1907 a_elt
, b_elt
, changed
);
1910 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1912 a_elt
= a_elt
->next
;
1913 b_elt
= b_elt
->next
;
1917 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
1918 a_elt
= a_elt
->next
;
1919 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
1920 b_elt
= b_elt
->next
;
1926 dst_prev
= *dst_prev_pnext
;
1927 dst_prev_pnext
= &dst_prev
->next
;
1928 dst_elt
= *dst_prev_pnext
;
1935 bitmap_elt_clear_from (dst
, dst_elt
);
1937 gcc_checking_assert (!dst
->current
== !dst
->first
);
1939 dst
->indx
= dst
->current
->indx
;
1944 /* A |= (FROM1 & ~FROM2). Return true if A changes. */
1947 bitmap_ior_and_compl_into (bitmap a
, const_bitmap from1
, const_bitmap from2
)
1952 bitmap_initialize (&tmp
, &bitmap_default_obstack
);
1953 bitmap_and_compl (&tmp
, from1
, from2
);
1954 changed
= bitmap_ior_into (a
, &tmp
);
1955 bitmap_clear (&tmp
);
1960 /* A |= (B & C). Return true if A changes. */
1963 bitmap_ior_and_into (bitmap a
, const_bitmap b
, const_bitmap c
)
1965 bitmap_element
*a_elt
= a
->first
;
1966 const bitmap_element
*b_elt
= b
->first
;
1967 const bitmap_element
*c_elt
= c
->first
;
1968 bitmap_element and_elt
;
1969 bitmap_element
*a_prev
= NULL
;
1970 bitmap_element
**a_prev_pnext
= &a
->first
;
1971 bool changed
= false;
1975 return bitmap_ior_into (a
, b
);
1976 if (bitmap_empty_p (b
) || bitmap_empty_p (c
))
1980 while (b_elt
&& c_elt
)
1982 BITMAP_WORD overall
;
1984 /* Find a common item of B and C. */
1985 while (b_elt
->indx
!= c_elt
->indx
)
1987 if (b_elt
->indx
< c_elt
->indx
)
1989 b_elt
= b_elt
->next
;
1995 c_elt
= c_elt
->next
;
2002 and_elt
.indx
= b_elt
->indx
;
2003 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2005 and_elt
.bits
[ix
] = b_elt
->bits
[ix
] & c_elt
->bits
[ix
];
2006 overall
|= and_elt
.bits
[ix
];
2009 b_elt
= b_elt
->next
;
2010 c_elt
= c_elt
->next
;
2014 /* Now find a place to insert AND_ELT. */
2017 ix
= a_elt
? a_elt
->indx
: and_elt
.indx
;
2018 if (ix
== and_elt
.indx
)
2019 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, &and_elt
, changed
);
2020 else if (ix
> and_elt
.indx
)
2021 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, &and_elt
, changed
);
2023 a_prev
= *a_prev_pnext
;
2024 a_prev_pnext
= &a_prev
->next
;
2025 a_elt
= *a_prev_pnext
;
2027 /* If A lagged behind B/C, we advanced it so loop once more. */
2029 while (ix
< and_elt
.indx
);
2033 gcc_checking_assert (!a
->current
== !a
->first
);
2035 a
->indx
= a
->current
->indx
;
2039 /* Debugging function to print out the contents of a bitmap. */
2042 debug_bitmap_file (FILE *file
, const_bitmap head
)
2044 const bitmap_element
*ptr
;
2046 fprintf (file
, "\nfirst = " HOST_PTR_PRINTF
2047 " current = " HOST_PTR_PRINTF
" indx = %u\n",
2048 (void *) head
->first
, (void *) head
->current
, head
->indx
);
2050 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2052 unsigned int i
, j
, col
= 26;
2054 fprintf (file
, "\t" HOST_PTR_PRINTF
" next = " HOST_PTR_PRINTF
2055 " prev = " HOST_PTR_PRINTF
" indx = %u\n\t\tbits = {",
2056 (const void*) ptr
, (const void*) ptr
->next
,
2057 (const void*) ptr
->prev
, ptr
->indx
);
2059 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
2060 for (j
= 0; j
< BITMAP_WORD_BITS
; j
++)
2061 if ((ptr
->bits
[i
] >> j
) & 1)
2065 fprintf (file
, "\n\t\t\t");
2069 fprintf (file
, " %u", (ptr
->indx
* BITMAP_ELEMENT_ALL_BITS
2070 + i
* BITMAP_WORD_BITS
+ j
));
2074 fprintf (file
, " }\n");
2078 /* Function to be called from the debugger to print the contents
2082 debug_bitmap (const_bitmap head
)
2084 debug_bitmap_file (stdout
, head
);
2087 /* Function to print out the contents of a bitmap. Unlike debug_bitmap_file,
2088 it does not print anything but the bits. */
2091 bitmap_print (FILE *file
, const_bitmap head
, const char *prefix
, const char *suffix
)
2093 const char *comma
= "";
2097 fputs (prefix
, file
);
2098 EXECUTE_IF_SET_IN_BITMAP (head
, 0, i
, bi
)
2100 fprintf (file
, "%s%d", comma
, i
);
2103 fputs (suffix
, file
);
2105 #ifdef GATHER_STATISTICS
2108 /* Used to accumulate statistics about bitmap sizes. */
2111 HOST_WIDEST_INT size
;
2115 /* Called via htab_traverse. Output bitmap descriptor pointed out by SLOT
2116 and update statistics. */
2118 print_statistics (void **slot
, void *b
)
2120 struct bitmap_descriptor
*d
= (struct bitmap_descriptor
*) *slot
;
2121 struct output_info
*i
= (struct output_info
*) b
;
2126 const char *s1
= d
->file
;
2128 while ((s2
= strstr (s1
, "gcc/")))
2130 sprintf (s
, "%s:%i (%s)", s1
, d
->line
, d
->function
);
2132 fprintf (stderr
, "%-41s %8d %15"HOST_WIDEST_INT_PRINT
"d %15"
2133 HOST_WIDEST_INT_PRINT
"d %15"HOST_WIDEST_INT_PRINT
"d %10d %10d\n",
2134 s
, d
->created
, d
->allocated
, d
->peak
, d
->current
, d
->nsearches
,
2136 i
->size
+= d
->allocated
;
2137 i
->count
+= d
->created
;
2142 /* Output per-bitmap memory usage statistics. */
2144 dump_bitmap_statistics (void)
2146 #ifdef GATHER_STATISTICS
2147 struct output_info info
;
2149 if (!bitmap_desc_hash
)
2152 fprintf (stderr
, "\nBitmap Overall "
2153 " Allocated Peak Leak searched "
2155 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2158 htab_traverse (bitmap_desc_hash
, print_statistics
, &info
);
2159 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2160 fprintf (stderr
, "%-40s %9d %15"HOST_WIDEST_INT_PRINT
"d\n",
2161 "Total", info
.count
, info
.size
);
2162 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2166 /* Compute hash of bitmap (for purposes of hashing). */
2168 bitmap_hash (const_bitmap head
)
2170 const bitmap_element
*ptr
;
2171 BITMAP_WORD hash
= 0;
2174 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2177 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
2178 hash
^= ptr
->bits
[ix
];
2180 return (hashval_t
)hash
;
2183 #include "gt-bitmap.h"