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
;
47 /* Hashtable mapping bitmap names to descriptors. */
48 static htab_t bitmap_desc_hash
;
50 /* Hashtable helpers. */
52 hash_descriptor (const void *p
)
54 const struct bitmap_descriptor
*const d
=
55 (const struct bitmap_descriptor
*) p
;
56 return htab_hash_pointer (d
->file
) + d
->line
;
65 eq_descriptor (const void *p1
, const void *p2
)
67 const struct bitmap_descriptor
*const d
=
68 (const struct bitmap_descriptor
*) p1
;
69 const struct loc
*const l
= (const struct loc
*) p2
;
70 return d
->file
== l
->file
&& d
->function
== l
->function
&& d
->line
== l
->line
;
73 /* For given file and line, return descriptor, create new if needed. */
74 static struct bitmap_descriptor
*
75 bitmap_descriptor (const char *file
, const char *function
, int line
)
77 struct bitmap_descriptor
**slot
;
81 loc
.function
= function
;
84 if (!bitmap_desc_hash
)
85 bitmap_desc_hash
= htab_create (10, hash_descriptor
, eq_descriptor
, NULL
);
87 slot
= (struct bitmap_descriptor
**)
88 htab_find_slot_with_hash (bitmap_desc_hash
, &loc
,
89 htab_hash_pointer (file
) + line
,
93 *slot
= XCNEW (struct bitmap_descriptor
);
95 (*slot
)->function
= function
;
100 /* Register new bitmap. */
102 bitmap_register (bitmap b MEM_STAT_DECL
)
104 b
->desc
= bitmap_descriptor (_loc_name
, _loc_function
, _loc_line
);
108 /* Account the overhead. */
110 register_overhead (bitmap b
, int amount
)
112 b
->desc
->current
+= amount
;
114 b
->desc
->allocated
+= amount
;
115 gcc_assert (b
->desc
->current
>= 0);
116 if (b
->desc
->peak
< b
->desc
->current
)
117 b
->desc
->peak
= b
->desc
->current
;
122 bitmap_element bitmap_zero_bits
; /* An element of all zero bits. */
123 bitmap_obstack bitmap_default_obstack
; /* The default bitmap obstack. */
124 static int bitmap_default_obstack_depth
;
125 static GTY((deletable
)) bitmap_element
*bitmap_ggc_free
; /* Freelist of
128 static void bitmap_elem_to_freelist (bitmap
, bitmap_element
*);
129 static void bitmap_element_free (bitmap
, bitmap_element
*);
130 static bitmap_element
*bitmap_element_allocate (bitmap
);
131 static int bitmap_element_zerop (const bitmap_element
*);
132 static void bitmap_element_link (bitmap
, bitmap_element
*);
133 static bitmap_element
*bitmap_elt_insert_after (bitmap
, bitmap_element
*, unsigned int);
134 static void bitmap_elt_clear_from (bitmap
, bitmap_element
*);
135 static bitmap_element
*bitmap_find_bit (bitmap
, unsigned int);
138 /* Add ELEM to the appropriate freelist. */
140 bitmap_elem_to_freelist (bitmap head
, bitmap_element
*elt
)
142 bitmap_obstack
*bit_obstack
= head
->obstack
;
147 elt
->prev
= bit_obstack
->elements
;
148 bit_obstack
->elements
= elt
;
152 elt
->prev
= bitmap_ggc_free
;
153 bitmap_ggc_free
= elt
;
157 /* Free a bitmap element. Since these are allocated off the
158 bitmap_obstack, "free" actually means "put onto the freelist". */
161 bitmap_element_free (bitmap head
, bitmap_element
*elt
)
163 bitmap_element
*next
= elt
->next
;
164 bitmap_element
*prev
= elt
->prev
;
172 if (head
->first
== elt
)
175 /* Since the first thing we try is to insert before current,
176 make current the next entry in preference to the previous. */
177 if (head
->current
== elt
)
179 head
->current
= next
!= 0 ? next
: prev
;
181 head
->indx
= head
->current
->indx
;
185 #ifdef GATHER_STATISTICS
186 register_overhead (head
, -((int)sizeof (bitmap_element
)));
188 bitmap_elem_to_freelist (head
, elt
);
191 /* Allocate a bitmap element. The bits are cleared, but nothing else is. */
193 static inline bitmap_element
*
194 bitmap_element_allocate (bitmap head
)
196 bitmap_element
*element
;
197 bitmap_obstack
*bit_obstack
= head
->obstack
;
201 element
= bit_obstack
->elements
;
204 /* Use up the inner list first before looking at the next
205 element of the outer list. */
208 bit_obstack
->elements
= element
->next
;
209 bit_obstack
->elements
->prev
= element
->prev
;
212 /* Inner list was just a singleton. */
213 bit_obstack
->elements
= element
->prev
;
215 element
= XOBNEW (&bit_obstack
->obstack
, bitmap_element
);
219 element
= bitmap_ggc_free
;
221 /* Use up the inner list first before looking at the next
222 element of the outer list. */
225 bitmap_ggc_free
= element
->next
;
226 bitmap_ggc_free
->prev
= element
->prev
;
229 /* Inner list was just a singleton. */
230 bitmap_ggc_free
= element
->prev
;
232 element
= GGC_NEW (bitmap_element
);
235 #ifdef GATHER_STATISTICS
236 register_overhead (head
, sizeof (bitmap_element
));
238 memset (element
->bits
, 0, sizeof (element
->bits
));
243 /* Remove ELT and all following elements from bitmap HEAD. */
246 bitmap_elt_clear_from (bitmap head
, bitmap_element
*elt
)
248 bitmap_element
*prev
;
249 bitmap_obstack
*bit_obstack
= head
->obstack
;
250 #ifdef GATHER_STATISTICS
255 #ifdef GATHER_STATISTICS
257 for (prev
= elt
; prev
; prev
= prev
->next
)
259 register_overhead (head
, -sizeof (bitmap_element
) * n
);
266 if (head
->current
->indx
> prev
->indx
)
268 head
->current
= prev
;
269 head
->indx
= prev
->indx
;
275 head
->current
= NULL
;
279 /* Put the entire list onto the free list in one operation. */
282 elt
->prev
= bit_obstack
->elements
;
283 bit_obstack
->elements
= elt
;
287 elt
->prev
= bitmap_ggc_free
;
288 bitmap_ggc_free
= elt
;
292 /* Clear a bitmap by freeing the linked list. */
295 bitmap_clear (bitmap head
)
298 bitmap_elt_clear_from (head
, head
->first
);
301 /* Initialize a bitmap obstack. If BIT_OBSTACK is NULL, initialize
302 the default bitmap obstack. */
305 bitmap_obstack_initialize (bitmap_obstack
*bit_obstack
)
309 if (bitmap_default_obstack_depth
++)
311 bit_obstack
= &bitmap_default_obstack
;
314 #if !defined(__GNUC__) || (__GNUC__ < 2)
315 #define __alignof__(type) 0
318 bit_obstack
->elements
= NULL
;
319 bit_obstack
->heads
= NULL
;
320 obstack_specify_allocation (&bit_obstack
->obstack
, OBSTACK_CHUNK_SIZE
,
321 __alignof__ (bitmap_element
),
326 /* Release the memory from a bitmap obstack. If BIT_OBSTACK is NULL,
327 release the default bitmap obstack. */
330 bitmap_obstack_release (bitmap_obstack
*bit_obstack
)
334 if (--bitmap_default_obstack_depth
)
336 gcc_assert (bitmap_default_obstack_depth
> 0);
339 bit_obstack
= &bitmap_default_obstack
;
342 bit_obstack
->elements
= NULL
;
343 bit_obstack
->heads
= NULL
;
344 obstack_free (&bit_obstack
->obstack
, NULL
);
347 /* Create a new bitmap on an obstack. If BIT_OBSTACK is NULL, create
348 it on the default bitmap obstack. */
351 bitmap_obstack_alloc_stat (bitmap_obstack
*bit_obstack MEM_STAT_DECL
)
356 bit_obstack
= &bitmap_default_obstack
;
357 map
= bit_obstack
->heads
;
359 bit_obstack
->heads
= (struct bitmap_head_def
*) map
->first
;
361 map
= XOBNEW (&bit_obstack
->obstack
, bitmap_head
);
362 bitmap_initialize_stat (map
, bit_obstack PASS_MEM_STAT
);
363 #ifdef GATHER_STATISTICS
364 register_overhead (map
, sizeof (bitmap_head
));
370 /* Create a new GCd bitmap. */
373 bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL
)
377 map
= GGC_NEW (struct bitmap_head_def
);
378 bitmap_initialize_stat (map
, NULL PASS_MEM_STAT
);
379 #ifdef GATHER_STATISTICS
380 register_overhead (map
, sizeof (bitmap_head
));
386 /* Release an obstack allocated bitmap. */
389 bitmap_obstack_free (bitmap map
)
394 map
->first
= (bitmap_element
*) map
->obstack
->heads
;
395 #ifdef GATHER_STATISTICS
396 register_overhead (map
, -((int)sizeof (bitmap_head
)));
398 map
->obstack
->heads
= map
;
403 /* Return nonzero if all bits in an element are zero. */
406 bitmap_element_zerop (const bitmap_element
*element
)
408 #if BITMAP_ELEMENT_WORDS == 2
409 return (element
->bits
[0] | element
->bits
[1]) == 0;
413 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
414 if (element
->bits
[i
] != 0)
421 /* Link the bitmap element into the current bitmap linked list. */
424 bitmap_element_link (bitmap head
, bitmap_element
*element
)
426 unsigned int indx
= element
->indx
;
429 /* If this is the first and only element, set it in. */
430 if (head
->first
== 0)
432 element
->next
= element
->prev
= 0;
433 head
->first
= element
;
436 /* If this index is less than that of the current element, it goes someplace
437 before the current element. */
438 else if (indx
< head
->indx
)
440 for (ptr
= head
->current
;
441 ptr
->prev
!= 0 && ptr
->prev
->indx
> indx
;
446 ptr
->prev
->next
= element
;
448 head
->first
= element
;
450 element
->prev
= ptr
->prev
;
455 /* Otherwise, it must go someplace after the current element. */
458 for (ptr
= head
->current
;
459 ptr
->next
!= 0 && ptr
->next
->indx
< indx
;
464 ptr
->next
->prev
= element
;
466 element
->next
= ptr
->next
;
471 /* Set up so this is the first element searched. */
472 head
->current
= element
;
476 /* Insert a new uninitialized element into bitmap HEAD after element
477 ELT. If ELT is NULL, insert the element at the start. Return the
480 static bitmap_element
*
481 bitmap_elt_insert_after (bitmap head
, bitmap_element
*elt
, unsigned int indx
)
483 bitmap_element
*node
= bitmap_element_allocate (head
);
490 head
->current
= node
;
493 node
->next
= head
->first
;
495 node
->next
->prev
= node
;
501 gcc_assert (head
->current
);
502 node
->next
= elt
->next
;
504 node
->next
->prev
= node
;
511 /* Copy a bitmap to another bitmap. */
514 bitmap_copy (bitmap to
, const_bitmap from
)
516 const bitmap_element
*from_ptr
;
517 bitmap_element
*to_ptr
= 0;
521 /* Copy elements in forward direction one at a time. */
522 for (from_ptr
= from
->first
; from_ptr
; from_ptr
= from_ptr
->next
)
524 bitmap_element
*to_elt
= bitmap_element_allocate (to
);
526 to_elt
->indx
= from_ptr
->indx
;
527 memcpy (to_elt
->bits
, from_ptr
->bits
, sizeof (to_elt
->bits
));
529 /* Here we have a special case of bitmap_element_link, for the case
530 where we know the links are being entered in sequence. */
533 to
->first
= to
->current
= to_elt
;
534 to
->indx
= from_ptr
->indx
;
535 to_elt
->next
= to_elt
->prev
= 0;
539 to_elt
->prev
= to_ptr
;
541 to_ptr
->next
= to_elt
;
548 /* Find a bitmap element that would hold a bitmap's bit.
549 Update the `current' field even if we can't find an element that
550 would hold the bitmap's bit to make eventual allocation
553 static inline bitmap_element
*
554 bitmap_find_bit (bitmap head
, unsigned int bit
)
556 bitmap_element
*element
;
557 unsigned int indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
559 #ifdef GATHER_STATISTICS
560 head
->desc
->nsearches
++;
562 if (head
->current
== 0
563 || head
->indx
== indx
)
564 return head
->current
;
566 if (head
->indx
< indx
)
567 /* INDX is beyond head->indx. Search from head->current
569 for (element
= head
->current
;
570 element
->next
!= 0 && element
->indx
< indx
;
571 element
= element
->next
)
574 else if (head
->indx
/ 2 < indx
)
575 /* INDX is less than head->indx and closer to head->indx than to
576 0. Search from head->current backward. */
577 for (element
= head
->current
;
578 element
->prev
!= 0 && element
->indx
> indx
;
579 element
= element
->prev
)
583 /* INDX is less than head->indx and closer to 0 than to
584 head->indx. Search from head->first forward. */
585 for (element
= head
->first
;
586 element
->next
!= 0 && element
->indx
< indx
;
587 element
= element
->next
)
590 /* `element' is the nearest to the one we want. If it's not the one we
591 want, the one we want doesn't exist. */
592 head
->current
= element
;
593 head
->indx
= element
->indx
;
594 if (element
!= 0 && element
->indx
!= indx
)
600 /* Clear a single bit in a bitmap. Return true if the bit changed. */
603 bitmap_clear_bit (bitmap head
, int bit
)
605 bitmap_element
*const ptr
= bitmap_find_bit (head
, bit
);
609 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
610 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
611 BITMAP_WORD bit_val
= ((BITMAP_WORD
) 1) << bit_num
;
612 bool res
= (ptr
->bits
[word_num
] & bit_val
) != 0;
614 ptr
->bits
[word_num
] &= ~bit_val
;
616 /* If we cleared the entire word, free up the element. */
617 if (bitmap_element_zerop (ptr
))
618 bitmap_element_free (head
, ptr
);
626 /* Set a single bit in a bitmap. Return true if the bit changed. */
629 bitmap_set_bit (bitmap head
, int bit
)
631 bitmap_element
*ptr
= bitmap_find_bit (head
, bit
);
632 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
633 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
634 BITMAP_WORD bit_val
= ((BITMAP_WORD
) 1) << bit_num
;
638 ptr
= bitmap_element_allocate (head
);
639 ptr
->indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
640 ptr
->bits
[word_num
] = bit_val
;
641 bitmap_element_link (head
, ptr
);
646 bool res
= (ptr
->bits
[word_num
] & bit_val
) == 0;
648 ptr
->bits
[word_num
] |= bit_val
;
653 /* Return whether a bit is set within a bitmap. */
656 bitmap_bit_p (bitmap head
, int bit
)
662 ptr
= bitmap_find_bit (head
, bit
);
666 bit_num
= bit
% BITMAP_WORD_BITS
;
667 word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
669 return (ptr
->bits
[word_num
] >> bit_num
) & 1;
672 #if GCC_VERSION < 3400
673 /* Table of number of set bits in a character, indexed by value of char. */
674 static const unsigned char popcount_table
[] =
676 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,
677 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,
678 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,
679 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,
680 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,
681 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,
682 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,
683 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,
687 bitmap_popcount (BITMAP_WORD a
)
689 unsigned long ret
= 0;
692 /* Just do this the table way for now */
693 for (i
= 0; i
< BITMAP_WORD_BITS
; i
+= 8)
694 ret
+= popcount_table
[(a
>> i
) & 0xff];
698 /* Count the number of bits set in the bitmap, and return it. */
701 bitmap_count_bits (const_bitmap a
)
703 unsigned long count
= 0;
704 const bitmap_element
*elt
;
707 for (elt
= a
->first
; elt
; elt
= elt
->next
)
709 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
711 #if GCC_VERSION >= 3400
712 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
713 of BITMAP_WORD is not material. */
714 count
+= __builtin_popcountl (elt
->bits
[ix
]);
716 count
+= bitmap_popcount (elt
->bits
[ix
]);
723 /* Return true if the bitmap has a single bit set. Otherwise return
727 bitmap_single_bit_set_p (const_bitmap a
)
729 unsigned long count
= 0;
730 const bitmap_element
*elt
;
733 if (bitmap_empty_p (a
))
737 /* As there are no completely empty bitmap elements, a second one
738 means we have more than one bit set. */
739 if (elt
->next
!= NULL
)
742 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
744 #if GCC_VERSION >= 3400
745 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
746 of BITMAP_WORD is not material. */
747 count
+= __builtin_popcountl (elt
->bits
[ix
]);
749 count
+= bitmap_popcount (elt
->bits
[ix
]);
759 /* Return the bit number of the first set bit in the bitmap. The
760 bitmap must be non-empty. */
763 bitmap_first_set_bit (const_bitmap a
)
765 const bitmap_element
*elt
= a
->first
;
771 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
772 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
774 word
= elt
->bits
[ix
];
780 bit_no
+= ix
* BITMAP_WORD_BITS
;
782 #if GCC_VERSION >= 3004
783 gcc_assert (sizeof(long) == sizeof (word
));
784 bit_no
+= __builtin_ctzl (word
);
786 /* Binary search for the first set bit. */
787 #if BITMAP_WORD_BITS > 64
788 #error "Fill out the table."
790 #if BITMAP_WORD_BITS > 32
791 if (!(word
& 0xffffffff))
792 word
>>= 32, bit_no
+= 32;
794 if (!(word
& 0xffff))
795 word
>>= 16, bit_no
+= 16;
797 word
>>= 8, bit_no
+= 8;
799 word
>>= 4, bit_no
+= 4;
801 word
>>= 2, bit_no
+= 2;
803 word
>>= 1, bit_no
+= 1;
805 gcc_assert (word
& 1);
810 /* Return the bit number of the first set bit in the bitmap. The
811 bitmap must be non-empty. */
814 bitmap_last_set_bit (const_bitmap a
)
816 const bitmap_element
*elt
= a
->current
? a
->current
: a
->first
;
824 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
825 for (ix
= BITMAP_ELEMENT_WORDS
- 1; ix
>= 0; ix
--)
827 word
= elt
->bits
[ix
];
833 bit_no
+= ix
* BITMAP_WORD_BITS
;
835 /* Binary search for the last set bit. */
836 #if GCC_VERSION >= 3004
837 gcc_assert (sizeof(long) == sizeof (word
));
838 bit_no
+= sizeof (long) * 8 - __builtin_ctzl (word
);
840 #if BITMAP_WORD_BITS > 64
841 #error "Fill out the table."
843 #if BITMAP_WORD_BITS > 32
844 if ((word
& 0xffffffff00000000))
845 word
>>= 32, bit_no
+= 32;
847 if (word
& 0xffff0000)
848 word
>>= 16, bit_no
+= 16;
849 if (!(word
& 0xff00))
850 word
>>= 8, bit_no
+= 8;
852 word
>>= 4, bit_no
+= 4;
854 word
>>= 2, bit_no
+= 2;
856 word
>>= 1, bit_no
+= 1;
859 gcc_assert (word
& 1);
867 bitmap_and (bitmap dst
, const_bitmap a
, const_bitmap b
)
869 bitmap_element
*dst_elt
= dst
->first
;
870 const bitmap_element
*a_elt
= a
->first
;
871 const bitmap_element
*b_elt
= b
->first
;
872 bitmap_element
*dst_prev
= NULL
;
874 gcc_assert (dst
!= a
&& dst
!= b
);
878 bitmap_copy (dst
, a
);
882 while (a_elt
&& b_elt
)
884 if (a_elt
->indx
< b_elt
->indx
)
886 else if (b_elt
->indx
< a_elt
->indx
)
890 /* Matching elts, generate A & B. */
895 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
897 dst_elt
->indx
= a_elt
->indx
;
898 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
900 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
902 dst_elt
->bits
[ix
] = r
;
908 dst_elt
= dst_elt
->next
;
914 /* Ensure that dst->current is valid. */
915 dst
->current
= dst
->first
;
916 bitmap_elt_clear_from (dst
, dst_elt
);
917 gcc_assert (!dst
->current
== !dst
->first
);
919 dst
->indx
= dst
->current
->indx
;
925 bitmap_and_into (bitmap a
, const_bitmap b
)
927 bitmap_element
*a_elt
= a
->first
;
928 const bitmap_element
*b_elt
= b
->first
;
929 bitmap_element
*next
;
934 while (a_elt
&& b_elt
)
936 if (a_elt
->indx
< b_elt
->indx
)
939 bitmap_element_free (a
, a_elt
);
942 else if (b_elt
->indx
< a_elt
->indx
)
946 /* Matching elts, generate A &= B. */
950 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
952 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
959 bitmap_element_free (a
, a_elt
);
964 bitmap_elt_clear_from (a
, a_elt
);
965 gcc_assert (!a
->current
== !a
->first
);
966 gcc_assert (!a
->current
|| a
->indx
== a
->current
->indx
);
970 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
971 if non-NULL. CHANGED is true if the destination bitmap had already been
972 changed; the new value of CHANGED is returned. */
975 bitmap_elt_copy (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
976 const bitmap_element
*src_elt
, bool changed
)
978 if (!changed
&& dst_elt
&& dst_elt
->indx
== src_elt
->indx
)
982 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
983 if (src_elt
->bits
[ix
] != dst_elt
->bits
[ix
])
985 dst_elt
->bits
[ix
] = src_elt
->bits
[ix
];
993 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src_elt
->indx
);
995 dst_elt
->indx
= src_elt
->indx
;
996 memcpy (dst_elt
->bits
, src_elt
->bits
, sizeof (dst_elt
->bits
));
1006 bitmap_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
)
1008 bitmap_element
*dst_elt
= dst
->first
;
1009 const bitmap_element
*a_elt
= a
->first
;
1010 const bitmap_element
*b_elt
= b
->first
;
1011 bitmap_element
*dst_prev
= NULL
;
1012 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1013 bool changed
= false;
1015 gcc_assert (dst
!= a
&& dst
!= b
);
1019 changed
= !bitmap_empty_p (dst
);
1026 while (b_elt
&& b_elt
->indx
< a_elt
->indx
)
1027 b_elt
= b_elt
->next
;
1029 if (!b_elt
|| b_elt
->indx
> a_elt
->indx
)
1031 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, a_elt
, changed
);
1032 dst_prev
= *dst_prev_pnext
;
1033 dst_prev_pnext
= &dst_prev
->next
;
1034 dst_elt
= *dst_prev_pnext
;
1035 a_elt
= a_elt
->next
;
1040 /* Matching elts, generate A & ~B. */
1042 BITMAP_WORD ior
= 0;
1044 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1046 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1048 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1050 if (dst_elt
->bits
[ix
] != r
)
1053 dst_elt
->bits
[ix
] = r
;
1061 if (!dst_elt
|| dst_elt
->indx
> a_elt
->indx
)
1063 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1068 dst_elt
->indx
= a_elt
->indx
;
1069 new_element
= false;
1072 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1074 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1076 dst_elt
->bits
[ix
] = r
;
1084 changed
|= !new_element
;
1085 bitmap_element_free (dst
, dst_elt
);
1086 dst_elt
= *dst_prev_pnext
;
1092 dst_prev
= *dst_prev_pnext
;
1093 dst_prev_pnext
= &dst_prev
->next
;
1094 dst_elt
= *dst_prev_pnext
;
1096 a_elt
= a_elt
->next
;
1097 b_elt
= b_elt
->next
;
1101 /* Ensure that dst->current is valid. */
1102 dst
->current
= dst
->first
;
1107 bitmap_elt_clear_from (dst
, dst_elt
);
1109 gcc_assert (!dst
->current
== !dst
->first
);
1111 dst
->indx
= dst
->current
->indx
;
1116 /* A &= ~B. Returns true if A changes */
1119 bitmap_and_compl_into (bitmap a
, const_bitmap b
)
1121 bitmap_element
*a_elt
= a
->first
;
1122 const bitmap_element
*b_elt
= b
->first
;
1123 bitmap_element
*next
;
1124 BITMAP_WORD changed
= 0;
1128 if (bitmap_empty_p (a
))
1137 while (a_elt
&& b_elt
)
1139 if (a_elt
->indx
< b_elt
->indx
)
1140 a_elt
= a_elt
->next
;
1141 else if (b_elt
->indx
< a_elt
->indx
)
1142 b_elt
= b_elt
->next
;
1145 /* Matching elts, generate A &= ~B. */
1147 BITMAP_WORD ior
= 0;
1149 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1151 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1152 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ cleared
;
1154 a_elt
->bits
[ix
] = r
;
1160 bitmap_element_free (a
, a_elt
);
1162 b_elt
= b_elt
->next
;
1165 gcc_assert (!a
->current
== !a
->first
);
1166 gcc_assert (!a
->current
|| a
->indx
== a
->current
->indx
);
1167 return changed
!= 0;
1170 /* Set COUNT bits from START in HEAD. */
1172 bitmap_set_range (bitmap head
, unsigned int start
, unsigned int count
)
1174 unsigned int first_index
, end_bit_plus1
, last_index
;
1175 bitmap_element
*elt
, *elt_prev
;
1181 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1182 end_bit_plus1
= start
+ count
;
1183 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1184 elt
= bitmap_find_bit (head
, start
);
1186 /* If bitmap_find_bit returns zero, the current is the closest block
1187 to the result. Otherwise, just use bitmap_element_allocate to
1188 ensure ELT is set; in the loop below, ELT == NULL means "insert
1189 at the end of the bitmap". */
1192 elt
= bitmap_element_allocate (head
);
1193 elt
->indx
= first_index
;
1194 bitmap_element_link (head
, elt
);
1197 gcc_assert (elt
->indx
== first_index
);
1198 elt_prev
= elt
->prev
;
1199 for (i
= first_index
; i
<= last_index
; i
++)
1201 unsigned elt_start_bit
= i
* BITMAP_ELEMENT_ALL_BITS
;
1202 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1204 unsigned int first_word_to_mod
;
1205 BITMAP_WORD first_mask
;
1206 unsigned int last_word_to_mod
;
1207 BITMAP_WORD last_mask
;
1210 if (!elt
|| elt
->indx
!= i
)
1211 elt
= bitmap_elt_insert_after (head
, elt_prev
, i
);
1213 if (elt_start_bit
<= start
)
1215 /* The first bit to turn on is somewhere inside this
1217 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1219 /* This mask should have 1s in all bits >= start position. */
1221 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1222 first_mask
= ~first_mask
;
1226 /* The first bit to turn on is below this start of this elt. */
1227 first_word_to_mod
= 0;
1228 first_mask
= ~(BITMAP_WORD
) 0;
1231 if (elt_end_bit_plus1
<= end_bit_plus1
)
1233 /* The last bit to turn on is beyond this elt. */
1234 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1235 last_mask
= ~(BITMAP_WORD
) 0;
1239 /* The last bit to turn on is inside to this elt. */
1241 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1243 /* The last mask should have 1s below the end bit. */
1245 (((BITMAP_WORD
) 1) << ((end_bit_plus1
% BITMAP_WORD_BITS
))) - 1;
1248 if (first_word_to_mod
== last_word_to_mod
)
1250 BITMAP_WORD mask
= first_mask
& last_mask
;
1251 elt
->bits
[first_word_to_mod
] |= mask
;
1255 elt
->bits
[first_word_to_mod
] |= first_mask
;
1256 if (BITMAP_ELEMENT_WORDS
> 2)
1257 for (ix
= first_word_to_mod
+ 1; ix
< last_word_to_mod
; ix
++)
1258 elt
->bits
[ix
] = ~(BITMAP_WORD
) 0;
1259 elt
->bits
[last_word_to_mod
] |= last_mask
;
1266 head
->current
= elt
? elt
: elt_prev
;
1267 head
->indx
= head
->current
->indx
;
1270 /* Clear COUNT bits from START in HEAD. */
1272 bitmap_clear_range (bitmap head
, unsigned int start
, unsigned int count
)
1274 unsigned int first_index
, end_bit_plus1
, last_index
;
1275 bitmap_element
*elt
;
1280 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1281 end_bit_plus1
= start
+ count
;
1282 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1283 elt
= bitmap_find_bit (head
, start
);
1285 /* If bitmap_find_bit returns zero, the current is the closest block
1286 to the result. If the current is less than first index, find the
1287 next one. Otherwise, just set elt to be current. */
1292 if (head
->indx
< first_index
)
1294 elt
= head
->current
->next
;
1299 elt
= head
->current
;
1305 while (elt
&& (elt
->indx
<= last_index
))
1307 bitmap_element
* next_elt
= elt
->next
;
1308 unsigned elt_start_bit
= (elt
->indx
) * BITMAP_ELEMENT_ALL_BITS
;
1309 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1312 if (elt_start_bit
>= start
&& elt_end_bit_plus1
<= end_bit_plus1
)
1313 /* Get rid of the entire elt and go to the next one. */
1314 bitmap_element_free (head
, elt
);
1317 /* Going to have to knock out some bits in this elt. */
1318 unsigned int first_word_to_mod
;
1319 BITMAP_WORD first_mask
;
1320 unsigned int last_word_to_mod
;
1321 BITMAP_WORD last_mask
;
1325 if (elt_start_bit
<= start
)
1327 /* The first bit to turn off is somewhere inside this
1329 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1331 /* This mask should have 1s in all bits >= start position. */
1333 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1334 first_mask
= ~first_mask
;
1338 /* The first bit to turn off is below this start of this elt. */
1339 first_word_to_mod
= 0;
1341 first_mask
= ~first_mask
;
1344 if (elt_end_bit_plus1
<= end_bit_plus1
)
1346 /* The last bit to turn off is beyond this elt. */
1347 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1349 last_mask
= ~last_mask
;
1353 /* The last bit to turn off is inside to this elt. */
1355 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1357 /* The last mask should have 1s below the end bit. */
1359 (((BITMAP_WORD
) 1) << (((end_bit_plus1
) % BITMAP_WORD_BITS
))) - 1;
1363 if (first_word_to_mod
== last_word_to_mod
)
1365 BITMAP_WORD mask
= first_mask
& last_mask
;
1366 elt
->bits
[first_word_to_mod
] &= ~mask
;
1370 elt
->bits
[first_word_to_mod
] &= ~first_mask
;
1371 if (BITMAP_ELEMENT_WORDS
> 2)
1372 for (i
= first_word_to_mod
+ 1; i
< last_word_to_mod
; i
++)
1374 elt
->bits
[last_word_to_mod
] &= ~last_mask
;
1376 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
1382 /* Check to see if there are any bits left. */
1384 bitmap_element_free (head
, elt
);
1391 head
->current
= elt
;
1392 head
->indx
= head
->current
->indx
;
1399 bitmap_compl_and_into (bitmap a
, const_bitmap b
)
1401 bitmap_element
*a_elt
= a
->first
;
1402 const bitmap_element
*b_elt
= b
->first
;
1403 bitmap_element
*a_prev
= NULL
;
1404 bitmap_element
*next
;
1406 gcc_assert (a
!= b
);
1408 if (bitmap_empty_p (a
))
1413 if (bitmap_empty_p (b
))
1419 while (a_elt
|| b_elt
)
1421 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1423 /* A is before B. Remove A */
1425 a_prev
= a_elt
->prev
;
1426 bitmap_element_free (a
, a_elt
);
1429 else if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1431 /* B is before A. Copy B. */
1432 next
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1433 memcpy (next
->bits
, b_elt
->bits
, sizeof (next
->bits
));
1435 b_elt
= b_elt
->next
;
1439 /* Matching elts, generate A = ~A & B. */
1441 BITMAP_WORD ior
= 0;
1443 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1445 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1446 BITMAP_WORD r
= b_elt
->bits
[ix
] ^ cleared
;
1448 a_elt
->bits
[ix
] = r
;
1453 bitmap_element_free (a
, a_elt
);
1457 b_elt
= b_elt
->next
;
1460 gcc_assert (!a
->current
== !a
->first
);
1461 gcc_assert (!a
->current
|| a
->indx
== a
->current
->indx
);
1466 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1467 overwriting DST_ELT if non-NULL. CHANGED is true if the destination bitmap
1468 had already been changed; the new value of CHANGED is returned. */
1471 bitmap_elt_ior (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
1472 const bitmap_element
*a_elt
, const bitmap_element
*b_elt
,
1475 gcc_assert (a_elt
|| b_elt
);
1477 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1479 /* Matching elts, generate A | B. */
1482 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1484 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1486 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
1487 if (r
!= dst_elt
->bits
[ix
])
1489 dst_elt
->bits
[ix
] = r
;
1498 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1500 dst_elt
->indx
= a_elt
->indx
;
1501 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1503 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
1504 dst_elt
->bits
[ix
] = r
;
1510 /* Copy a single element. */
1511 const bitmap_element
*src
;
1513 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1519 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, src
, changed
);
1525 /* DST = A | B. Return true if DST changes. */
1528 bitmap_ior (bitmap dst
, const_bitmap a
, const_bitmap b
)
1530 bitmap_element
*dst_elt
= dst
->first
;
1531 const bitmap_element
*a_elt
= a
->first
;
1532 const bitmap_element
*b_elt
= b
->first
;
1533 bitmap_element
*dst_prev
= NULL
;
1534 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1535 bool changed
= false;
1537 gcc_assert (dst
!= a
&& dst
!= b
);
1539 while (a_elt
|| b_elt
)
1541 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
, a_elt
, b_elt
, changed
);
1543 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1545 a_elt
= a_elt
->next
;
1546 b_elt
= b_elt
->next
;
1550 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
1551 a_elt
= a_elt
->next
;
1552 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
1553 b_elt
= b_elt
->next
;
1556 dst_prev
= *dst_prev_pnext
;
1557 dst_prev_pnext
= &dst_prev
->next
;
1558 dst_elt
= *dst_prev_pnext
;
1564 bitmap_elt_clear_from (dst
, dst_elt
);
1566 gcc_assert (!dst
->current
== !dst
->first
);
1568 dst
->indx
= dst
->current
->indx
;
1572 /* A |= B. Return true if A changes. */
1575 bitmap_ior_into (bitmap a
, const_bitmap b
)
1577 bitmap_element
*a_elt
= a
->first
;
1578 const bitmap_element
*b_elt
= b
->first
;
1579 bitmap_element
*a_prev
= NULL
;
1580 bitmap_element
**a_prev_pnext
= &a
->first
;
1581 bool changed
= false;
1588 /* If A lags behind B, just advance it. */
1589 if (!a_elt
|| a_elt
->indx
== b_elt
->indx
)
1591 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, b_elt
, changed
);
1592 b_elt
= b_elt
->next
;
1594 else if (a_elt
->indx
> b_elt
->indx
)
1596 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, b_elt
, changed
);
1597 b_elt
= b_elt
->next
;
1600 a_prev
= *a_prev_pnext
;
1601 a_prev_pnext
= &a_prev
->next
;
1602 a_elt
= *a_prev_pnext
;
1605 gcc_assert (!a
->current
== !a
->first
);
1607 a
->indx
= a
->current
->indx
;
1614 bitmap_xor (bitmap dst
, const_bitmap a
, const_bitmap b
)
1616 bitmap_element
*dst_elt
= dst
->first
;
1617 const bitmap_element
*a_elt
= a
->first
;
1618 const bitmap_element
*b_elt
= b
->first
;
1619 bitmap_element
*dst_prev
= NULL
;
1621 gcc_assert (dst
!= a
&& dst
!= b
);
1628 while (a_elt
|| b_elt
)
1630 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1632 /* Matching elts, generate A ^ B. */
1634 BITMAP_WORD ior
= 0;
1637 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1639 dst_elt
->indx
= a_elt
->indx
;
1640 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1642 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
1645 dst_elt
->bits
[ix
] = r
;
1647 a_elt
= a_elt
->next
;
1648 b_elt
= b_elt
->next
;
1652 dst_elt
= dst_elt
->next
;
1657 /* Copy a single element. */
1658 const bitmap_element
*src
;
1660 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1663 a_elt
= a_elt
->next
;
1668 b_elt
= b_elt
->next
;
1672 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src
->indx
);
1674 dst_elt
->indx
= src
->indx
;
1675 memcpy (dst_elt
->bits
, src
->bits
, sizeof (dst_elt
->bits
));
1677 dst_elt
= dst_elt
->next
;
1680 /* Ensure that dst->current is valid. */
1681 dst
->current
= dst
->first
;
1682 bitmap_elt_clear_from (dst
, dst_elt
);
1683 gcc_assert (!dst
->current
== !dst
->first
);
1685 dst
->indx
= dst
->current
->indx
;
1691 bitmap_xor_into (bitmap a
, const_bitmap b
)
1693 bitmap_element
*a_elt
= a
->first
;
1694 const bitmap_element
*b_elt
= b
->first
;
1695 bitmap_element
*a_prev
= NULL
;
1705 if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1708 bitmap_element
*dst
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1709 memcpy (dst
->bits
, b_elt
->bits
, sizeof (dst
->bits
));
1711 b_elt
= b_elt
->next
;
1713 else if (a_elt
->indx
< b_elt
->indx
)
1716 a_elt
= a_elt
->next
;
1720 /* Matching elts, generate A ^= B. */
1722 BITMAP_WORD ior
= 0;
1723 bitmap_element
*next
= a_elt
->next
;
1725 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1727 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
1730 a_elt
->bits
[ix
] = r
;
1732 b_elt
= b_elt
->next
;
1736 bitmap_element_free (a
, a_elt
);
1740 gcc_assert (!a
->current
== !a
->first
);
1742 a
->indx
= a
->current
->indx
;
1745 /* Return true if two bitmaps are identical.
1746 We do not bother with a check for pointer equality, as that never
1747 occurs in practice. */
1750 bitmap_equal_p (const_bitmap a
, const_bitmap b
)
1752 const bitmap_element
*a_elt
;
1753 const bitmap_element
*b_elt
;
1756 for (a_elt
= a
->first
, b_elt
= b
->first
;
1758 a_elt
= a_elt
->next
, b_elt
= b_elt
->next
)
1760 if (a_elt
->indx
!= b_elt
->indx
)
1762 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1763 if (a_elt
->bits
[ix
] != b_elt
->bits
[ix
])
1766 return !a_elt
&& !b_elt
;
1769 /* Return true if A AND B is not empty. */
1772 bitmap_intersect_p (const_bitmap a
, const_bitmap b
)
1774 const bitmap_element
*a_elt
;
1775 const bitmap_element
*b_elt
;
1778 for (a_elt
= a
->first
, b_elt
= b
->first
;
1781 if (a_elt
->indx
< b_elt
->indx
)
1782 a_elt
= a_elt
->next
;
1783 else if (b_elt
->indx
< a_elt
->indx
)
1784 b_elt
= b_elt
->next
;
1787 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1788 if (a_elt
->bits
[ix
] & b_elt
->bits
[ix
])
1790 a_elt
= a_elt
->next
;
1791 b_elt
= b_elt
->next
;
1797 /* Return true if A AND NOT B is not empty. */
1800 bitmap_intersect_compl_p (const_bitmap a
, const_bitmap b
)
1802 const bitmap_element
*a_elt
;
1803 const bitmap_element
*b_elt
;
1805 for (a_elt
= a
->first
, b_elt
= b
->first
;
1808 if (a_elt
->indx
< b_elt
->indx
)
1810 else if (b_elt
->indx
< a_elt
->indx
)
1811 b_elt
= b_elt
->next
;
1814 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1815 if (a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
])
1817 a_elt
= a_elt
->next
;
1818 b_elt
= b_elt
->next
;
1821 return a_elt
!= NULL
;
1825 /* DST = A | (FROM1 & ~FROM2). Return true if DST changes. */
1828 bitmap_ior_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
, const_bitmap kill
)
1830 bool changed
= false;
1832 bitmap_element
*dst_elt
= dst
->first
;
1833 const bitmap_element
*a_elt
= a
->first
;
1834 const bitmap_element
*b_elt
= b
->first
;
1835 const bitmap_element
*kill_elt
= kill
->first
;
1836 bitmap_element
*dst_prev
= NULL
;
1837 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1839 gcc_assert (dst
!= a
&& dst
!= b
&& dst
!= kill
);
1841 /* Special cases. We don't bother checking for bitmap_equal_p (b, kill). */
1842 if (b
== kill
|| bitmap_empty_p (b
))
1844 changed
= !bitmap_equal_p (dst
, a
);
1846 bitmap_copy (dst
, a
);
1849 if (bitmap_empty_p (kill
))
1850 return bitmap_ior (dst
, a
, b
);
1851 if (bitmap_empty_p (a
))
1852 return bitmap_and_compl (dst
, b
, kill
);
1854 while (a_elt
|| b_elt
)
1856 bool new_element
= false;
1859 while (kill_elt
&& kill_elt
->indx
< b_elt
->indx
)
1860 kill_elt
= kill_elt
->next
;
1862 if (b_elt
&& kill_elt
&& kill_elt
->indx
== b_elt
->indx
1863 && (!a_elt
|| a_elt
->indx
>= b_elt
->indx
))
1865 bitmap_element tmp_elt
;
1868 BITMAP_WORD ior
= 0;
1869 tmp_elt
.indx
= b_elt
->indx
;
1870 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1872 BITMAP_WORD r
= b_elt
->bits
[ix
] & ~kill_elt
->bits
[ix
];
1874 tmp_elt
.bits
[ix
] = r
;
1879 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1880 a_elt
, &tmp_elt
, changed
);
1882 if (a_elt
&& a_elt
->indx
== b_elt
->indx
)
1883 a_elt
= a_elt
->next
;
1886 b_elt
= b_elt
->next
;
1887 kill_elt
= kill_elt
->next
;
1891 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1892 a_elt
, b_elt
, changed
);
1895 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1897 a_elt
= a_elt
->next
;
1898 b_elt
= b_elt
->next
;
1902 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
1903 a_elt
= a_elt
->next
;
1904 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
1905 b_elt
= b_elt
->next
;
1911 dst_prev
= *dst_prev_pnext
;
1912 dst_prev_pnext
= &dst_prev
->next
;
1913 dst_elt
= *dst_prev_pnext
;
1920 bitmap_elt_clear_from (dst
, dst_elt
);
1922 gcc_assert (!dst
->current
== !dst
->first
);
1924 dst
->indx
= dst
->current
->indx
;
1929 /* A |= (FROM1 & ~FROM2). Return true if A changes. */
1932 bitmap_ior_and_compl_into (bitmap a
, const_bitmap from1
, const_bitmap from2
)
1937 bitmap_initialize (&tmp
, &bitmap_default_obstack
);
1938 bitmap_and_compl (&tmp
, from1
, from2
);
1939 changed
= bitmap_ior_into (a
, &tmp
);
1940 bitmap_clear (&tmp
);
1945 /* A |= (B & C). Return true if A changes. */
1948 bitmap_ior_and_into (bitmap a
, const_bitmap b
, const_bitmap c
)
1950 bitmap_element
*a_elt
= a
->first
;
1951 const bitmap_element
*b_elt
= b
->first
;
1952 const bitmap_element
*c_elt
= c
->first
;
1953 bitmap_element and_elt
;
1954 bitmap_element
*a_prev
= NULL
;
1955 bitmap_element
**a_prev_pnext
= &a
->first
;
1956 bool changed
= false;
1960 return bitmap_ior_into (a
, b
);
1961 if (bitmap_empty_p (b
) || bitmap_empty_p (c
))
1965 while (b_elt
&& c_elt
)
1967 BITMAP_WORD overall
;
1969 /* Find a common item of B and C. */
1970 while (b_elt
->indx
!= c_elt
->indx
)
1972 if (b_elt
->indx
< c_elt
->indx
)
1974 b_elt
= b_elt
->next
;
1980 c_elt
= c_elt
->next
;
1987 and_elt
.indx
= b_elt
->indx
;
1988 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1990 and_elt
.bits
[ix
] = b_elt
->bits
[ix
] & c_elt
->bits
[ix
];
1991 overall
|= and_elt
.bits
[ix
];
1994 b_elt
= b_elt
->next
;
1995 c_elt
= c_elt
->next
;
1999 /* Now find a place to insert AND_ELT. */
2002 ix
= a_elt
? a_elt
->indx
: and_elt
.indx
;
2003 if (ix
== and_elt
.indx
)
2004 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, &and_elt
, changed
);
2005 else if (ix
> and_elt
.indx
)
2006 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, &and_elt
, changed
);
2008 a_prev
= *a_prev_pnext
;
2009 a_prev_pnext
= &a_prev
->next
;
2010 a_elt
= *a_prev_pnext
;
2012 /* If A lagged behind B/C, we advanced it so loop once more. */
2014 while (ix
< and_elt
.indx
);
2018 gcc_assert (!a
->current
== !a
->first
);
2020 a
->indx
= a
->current
->indx
;
2024 /* Debugging function to print out the contents of a bitmap. */
2027 debug_bitmap_file (FILE *file
, const_bitmap head
)
2029 const bitmap_element
*ptr
;
2031 fprintf (file
, "\nfirst = " HOST_PTR_PRINTF
2032 " current = " HOST_PTR_PRINTF
" indx = %u\n",
2033 (void *) head
->first
, (void *) head
->current
, head
->indx
);
2035 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2037 unsigned int i
, j
, col
= 26;
2039 fprintf (file
, "\t" HOST_PTR_PRINTF
" next = " HOST_PTR_PRINTF
2040 " prev = " HOST_PTR_PRINTF
" indx = %u\n\t\tbits = {",
2041 (const void*) ptr
, (const void*) ptr
->next
,
2042 (const void*) ptr
->prev
, ptr
->indx
);
2044 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
2045 for (j
= 0; j
< BITMAP_WORD_BITS
; j
++)
2046 if ((ptr
->bits
[i
] >> j
) & 1)
2050 fprintf (file
, "\n\t\t\t");
2054 fprintf (file
, " %u", (ptr
->indx
* BITMAP_ELEMENT_ALL_BITS
2055 + i
* BITMAP_WORD_BITS
+ j
));
2059 fprintf (file
, " }\n");
2063 /* Function to be called from the debugger to print the contents
2067 debug_bitmap (const_bitmap head
)
2069 debug_bitmap_file (stdout
, head
);
2072 /* Function to print out the contents of a bitmap. Unlike debug_bitmap_file,
2073 it does not print anything but the bits. */
2076 bitmap_print (FILE *file
, const_bitmap head
, const char *prefix
, const char *suffix
)
2078 const char *comma
= "";
2082 fputs (prefix
, file
);
2083 EXECUTE_IF_SET_IN_BITMAP (head
, 0, i
, bi
)
2085 fprintf (file
, "%s%d", comma
, i
);
2088 fputs (suffix
, file
);
2090 #ifdef GATHER_STATISTICS
2093 /* Used to accumulate statistics about bitmap sizes. */
2096 HOST_WIDEST_INT size
;
2100 /* Called via htab_traverse. Output bitmap descriptor pointed out by SLOT
2101 and update statistics. */
2103 print_statistics (void **slot
, void *b
)
2105 struct bitmap_descriptor
*d
= (struct bitmap_descriptor
*) *slot
;
2106 struct output_info
*i
= (struct output_info
*) b
;
2111 const char *s1
= d
->file
;
2113 while ((s2
= strstr (s1
, "gcc/")))
2115 sprintf (s
, "%s:%i (%s)", s1
, d
->line
, d
->function
);
2117 fprintf (stderr
, "%-41s %8d %15"HOST_WIDEST_INT_PRINT
"d %15"
2118 HOST_WIDEST_INT_PRINT
"d %15"HOST_WIDEST_INT_PRINT
"d %10d\n",
2119 s
, d
->created
, d
->allocated
, d
->peak
, d
->current
, d
->nsearches
);
2120 i
->size
+= d
->allocated
;
2121 i
->count
+= d
->created
;
2126 /* Output per-bitmap memory usage statistics. */
2128 dump_bitmap_statistics (void)
2130 #ifdef GATHER_STATISTICS
2131 struct output_info info
;
2133 if (!bitmap_desc_hash
)
2136 fprintf (stderr
, "\nBitmap Overall "
2137 " Allocated Peak Leak searched "
2139 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2142 htab_traverse (bitmap_desc_hash
, print_statistics
, &info
);
2143 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2144 fprintf (stderr
, "%-40s %9d %15"HOST_WIDEST_INT_PRINT
"d\n",
2145 "Total", info
.count
, info
.size
);
2146 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2150 /* Compute hash of bitmap (for purposes of hashing). */
2152 bitmap_hash (const_bitmap head
)
2154 const bitmap_element
*ptr
;
2155 BITMAP_WORD hash
= 0;
2158 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2161 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
2162 hash
^= ptr
->bits
[ix
];
2164 return (hashval_t
)hash
;
2167 #include "gt-bitmap.h"