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
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
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
= p
;
55 return htab_hash_pointer (d
->file
) + d
->line
;
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
;
79 loc
.function
= function
;
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
,
91 *slot
= xcalloc (sizeof (**slot
), 1);
93 (*slot
)->function
= function
;
98 /* Register new bitmap. */
100 bitmap_register (bitmap b MEM_STAT_DECL
)
102 b
->desc
= bitmap_descriptor (_loc_name
, _loc_function
, _loc_line
);
106 /* Account the overhead. */
108 register_overhead (bitmap b
, int amount
)
110 b
->desc
->current
+= amount
;
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
;
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
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. */
137 bitmap_elem_to_freelist (bitmap head
, bitmap_element
*elt
)
139 bitmap_obstack
*bit_obstack
= head
->obstack
;
144 elt
->prev
= bit_obstack
->elements
;
145 bit_obstack
->elements
= elt
;
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". */
158 bitmap_element_free (bitmap head
, bitmap_element
*elt
)
160 bitmap_element
*next
= elt
->next
;
161 bitmap_element
*prev
= elt
->prev
;
169 if (head
->first
== elt
)
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
;
178 head
->indx
= head
->current
->indx
;
182 #ifdef GATHER_STATISTICS
183 register_overhead (head
, -((int)sizeof (bitmap_element
)));
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
;
198 element
= bit_obstack
->elements
;
201 /* Use up the inner list first before looking at the next
202 element of the outer list. */
205 bit_obstack
->elements
= element
->next
;
206 bit_obstack
->elements
->prev
= element
->prev
;
209 /* Inner list was just a singleton. */
210 bit_obstack
->elements
= element
->prev
;
212 element
= XOBNEW (&bit_obstack
->obstack
, bitmap_element
);
216 element
= bitmap_ggc_free
;
218 /* Use up the inner list first before looking at the next
219 element of the outer list. */
222 bitmap_ggc_free
= element
->next
;
223 bitmap_ggc_free
->prev
= element
->prev
;
226 /* Inner list was just a singleton. */
227 bitmap_ggc_free
= element
->prev
;
229 element
= GGC_NEW (bitmap_element
);
232 #ifdef GATHER_STATISTICS
233 register_overhead (head
, sizeof (bitmap_element
));
235 memset (element
->bits
, 0, sizeof (element
->bits
));
240 /* Remove ELT and all following elements from bitmap HEAD. */
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
252 #ifdef GATHER_STATISTICS
254 for (prev
= elt
; prev
; prev
= prev
->next
)
256 register_overhead (head
, -sizeof (bitmap_element
) * n
);
263 if (head
->current
->indx
> prev
->indx
)
265 head
->current
= prev
;
266 head
->indx
= prev
->indx
;
272 head
->current
= NULL
;
276 /* Put the entire list onto the free list in one operation. */
279 elt
->prev
= bit_obstack
->elements
;
280 bit_obstack
->elements
= elt
;
284 elt
->prev
= bitmap_ggc_free
;
285 bitmap_ggc_free
= elt
;
289 /* Clear a bitmap by freeing the linked list. */
292 bitmap_clear (bitmap head
)
295 bitmap_elt_clear_from (head
, head
->first
);
298 /* Initialize a bitmap obstack. If BIT_OBSTACK is NULL, initialize
299 the default bitmap obstack. */
302 bitmap_obstack_initialize (bitmap_obstack
*bit_obstack
)
305 bit_obstack
= &bitmap_default_obstack
;
307 #if !defined(__GNUC__) || (__GNUC__ < 2)
308 #define __alignof__(type) 0
311 bit_obstack
->elements
= NULL
;
312 bit_obstack
->heads
= NULL
;
313 obstack_specify_allocation (&bit_obstack
->obstack
, OBSTACK_CHUNK_SIZE
,
314 __alignof__ (bitmap_element
),
319 /* Release the memory from a bitmap obstack. If BIT_OBSTACK is NULL,
320 release the default bitmap obstack. */
323 bitmap_obstack_release (bitmap_obstack
*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. */
337 bitmap_obstack_alloc_stat (bitmap_obstack
*bit_obstack MEM_STAT_DECL
)
342 bit_obstack
= &bitmap_default_obstack
;
343 map
= bit_obstack
->heads
;
345 bit_obstack
->heads
= (void *)map
->first
;
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
));
356 /* Create a new GCd bitmap. */
359 bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL
)
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
));
372 /* Release an obstack allocated bitmap. */
375 bitmap_obstack_free (bitmap map
)
380 map
->first
= (void *)map
->obstack
->heads
;
381 #ifdef GATHER_STATISTICS
382 register_overhead (map
, -((int)sizeof (bitmap_head
)));
384 map
->obstack
->heads
= map
;
389 /* Return nonzero if all bits in an element are zero. */
392 bitmap_element_zerop (const bitmap_element
*element
)
394 #if BITMAP_ELEMENT_WORDS == 2
395 return (element
->bits
[0] | element
->bits
[1]) == 0;
399 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
400 if (element
->bits
[i
] != 0)
407 /* Link the bitmap element into the current bitmap linked list. */
410 bitmap_element_link (bitmap head
, bitmap_element
*element
)
412 unsigned int indx
= element
->indx
;
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
;
432 ptr
->prev
->next
= element
;
434 head
->first
= element
;
436 element
->prev
= ptr
->prev
;
441 /* Otherwise, it must go someplace after the current element. */
444 for (ptr
= head
->current
;
445 ptr
->next
!= 0 && ptr
->next
->indx
< indx
;
450 ptr
->next
->prev
= element
;
452 element
->next
= ptr
->next
;
457 /* Set up so this is the first element searched. */
458 head
->current
= element
;
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
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
);
476 head
->current
= node
;
479 node
->next
= head
->first
;
481 node
->next
->prev
= node
;
487 gcc_assert (head
->current
);
488 node
->next
= elt
->next
;
490 node
->next
->prev
= node
;
497 /* Copy a bitmap to another bitmap. */
500 bitmap_copy (bitmap to
, const_bitmap from
)
502 const bitmap_element
*from_ptr
;
503 bitmap_element
*to_ptr
= 0;
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. */
519 to
->first
= to
->current
= to_elt
;
520 to
->indx
= from_ptr
->indx
;
521 to_elt
->next
= to_elt
->prev
= 0;
525 to_elt
->prev
= to_ptr
;
527 to_ptr
->next
= 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
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
++;
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
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
)
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
)
586 /* Clear a single bit in a bitmap. */
589 bitmap_clear_bit (bitmap head
, int bit
)
591 bitmap_element
*const ptr
= bitmap_find_bit (head
, bit
);
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. */
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
;
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
);
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
)
635 ptr
= bitmap_find_bit (head
, bit
);
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,
660 bitmap_popcount (BITMAP_WORD a
)
662 unsigned long ret
= 0;
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];
671 /* Count the number of bits set in the bitmap, and return it. */
674 bitmap_count_bits (const_bitmap a
)
676 unsigned long count
= 0;
677 const bitmap_element
*elt
;
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
]);
689 count
+= bitmap_popcount (elt
->bits
[ix
]);
696 /* Return true if the bitmap has a single bit set. Otherwise return
700 bitmap_single_bit_set_p (const_bitmap a
)
702 unsigned long count
= 0;
703 const bitmap_element
*elt
;
706 if (bitmap_empty_p (a
))
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
)
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
]);
722 count
+= bitmap_popcount (elt
->bits
[ix
]);
732 /* Return the bit number of the first set bit in the bitmap. The
733 bitmap must be non-empty. */
736 bitmap_first_set_bit (const_bitmap a
)
738 const bitmap_element
*elt
= a
->first
;
744 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
745 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
747 word
= elt
->bits
[ix
];
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
);
759 /* Binary search for the first set bit. */
760 #if BITMAP_WORD_BITS > 64
761 #error "Fill out the table."
763 #if BITMAP_WORD_BITS > 32
764 if (!(word
& 0xffffffff))
765 word
>>= 32, bit_no
+= 32;
767 if (!(word
& 0xffff))
768 word
>>= 16, bit_no
+= 16;
770 word
>>= 8, bit_no
+= 8;
772 word
>>= 4, bit_no
+= 4;
774 word
>>= 2, bit_no
+= 2;
776 word
>>= 1, bit_no
+= 1;
778 gcc_assert (word
& 1);
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
);
798 bitmap_copy (dst
, a
);
802 while (a_elt
&& b_elt
)
804 if (a_elt
->indx
< b_elt
->indx
)
806 else if (b_elt
->indx
< a_elt
->indx
)
810 /* Matching elts, generate A & B. */
815 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
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
;
828 dst_elt
= dst_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
);
839 dst
->indx
= dst
->current
->indx
;
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
;
854 while (a_elt
&& b_elt
)
856 if (a_elt
->indx
< b_elt
->indx
)
859 bitmap_element_free (a
, a_elt
);
862 else if (b_elt
->indx
< a_elt
->indx
)
866 /* Matching elts, generate A &= B. */
870 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
872 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
879 bitmap_element_free (a
, a_elt
);
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. */
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
)
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
];
913 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src_elt
->indx
);
915 dst_elt
->indx
= src_elt
->indx
;
916 memcpy (dst_elt
->bits
, src_elt
->bits
, sizeof (dst_elt
->bits
));
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
);
939 changed
= !bitmap_empty_p (dst
);
946 while (b_elt
&& b_elt
->indx
< a_elt
->indx
)
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
;
960 /* Matching elts, generate A & ~B. */
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
)
973 dst_elt
->bits
[ix
] = r
;
981 if (!dst_elt
|| dst_elt
->indx
> a_elt
->indx
)
983 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
988 dst_elt
->indx
= a_elt
->indx
;
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
;
1004 changed
|= !new_element
;
1005 bitmap_element_free (dst
, dst_elt
);
1006 dst_elt
= *dst_prev_pnext
;
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
;
1027 bitmap_elt_clear_from (dst
, dst_elt
);
1029 gcc_assert (!dst
->current
== !dst
->first
);
1031 dst
->indx
= dst
->current
->indx
;
1036 /* A &= ~B. Returns true if A changes */
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;
1048 if (bitmap_empty_p (a
))
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
;
1065 /* Matching elts, generate A &= ~B. */
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
;
1080 bitmap_element_free (a
, a_elt
);
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. */
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
;
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". */
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
;
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
1137 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1139 /* This mask should have 1s in all bits >= start position. */
1141 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1142 first_mask
= ~first_mask
;
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;
1159 /* The last bit to turn on is inside to this elt. */
1161 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1163 /* The last mask should have 1s below the end bit. */
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
;
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
;
1186 head
->current
= elt
? elt
: elt_prev
;
1187 head
->indx
= head
->current
->indx
;
1190 /* Clear COUNT bits from START in HEAD. */
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
;
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. */
1212 if (head
->indx
< first_index
)
1214 elt
= head
->current
->next
;
1219 elt
= head
->current
;
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
);
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
;
1245 if (elt_start_bit
<= start
)
1247 /* The first bit to turn off is somewhere inside this
1249 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1251 /* This mask should have 1s in all bits >= start position. */
1253 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1254 first_mask
= ~first_mask
;
1258 /* The first bit to turn off is below this start of this elt. */
1259 first_word_to_mod
= 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;
1269 last_mask
= ~last_mask
;
1273 /* The last bit to turn off is inside to this elt. */
1275 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1277 /* The last mask should have 1s below the end bit. */
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
;
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
++)
1294 elt
->bits
[last_word_to_mod
] &= ~last_mask
;
1296 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
1302 /* Check to see if there are any bits left. */
1304 bitmap_element_free (head
, elt
);
1311 head
->current
= elt
;
1312 head
->indx
= head
->current
->indx
;
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
))
1333 if (bitmap_empty_p (b
))
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 */
1345 a_prev
= a_elt
->prev
;
1346 bitmap_element_free (a
, a_elt
);
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
));
1355 b_elt
= b_elt
->next
;
1359 /* Matching elts, generate A = ~A & B. */
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
;
1373 bitmap_element_free (a
, a_elt
);
1377 b_elt
= b_elt
->next
;
1380 gcc_assert (!a
->current
== !a
->first
);
1381 gcc_assert (!a
->current
|| a
->indx
== a
->current
->indx
);
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. */
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
,
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. */
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
;
1418 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
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
;
1430 /* Copy a single element. */
1431 const bitmap_element
*src
;
1433 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1439 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, src
, changed
);
1445 /* DST = A | B. Return true if DST changes. */
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
;
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
;
1484 bitmap_elt_clear_from (dst
, dst_elt
);
1486 gcc_assert (!dst
->current
== !dst
->first
);
1488 dst
->indx
= dst
->current
->indx
;
1492 /* A |= B. Return true if A changes. */
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;
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
);
1527 a
->indx
= a
->current
->indx
;
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
);
1548 while (a_elt
|| b_elt
)
1550 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1552 /* Matching elts, generate A ^ B. */
1554 BITMAP_WORD ior
= 0;
1557 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
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
];
1565 dst_elt
->bits
[ix
] = r
;
1567 a_elt
= a_elt
->next
;
1568 b_elt
= b_elt
->next
;
1572 dst_elt
= dst_elt
->next
;
1577 /* Copy a single element. */
1578 const bitmap_element
*src
;
1580 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1583 a_elt
= a_elt
->next
;
1588 b_elt
= b_elt
->next
;
1592 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src
->indx
);
1594 dst_elt
->indx
= src
->indx
;
1595 memcpy (dst_elt
->bits
, src
->bits
, sizeof (dst_elt
->bits
));
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
);
1605 dst
->indx
= dst
->current
->indx
;
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
;
1625 if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1628 bitmap_element
*dst
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1629 memcpy (dst
->bits
, b_elt
->bits
, sizeof (dst
->bits
));
1631 b_elt
= b_elt
->next
;
1633 else if (a_elt
->indx
< b_elt
->indx
)
1636 a_elt
= a_elt
->next
;
1640 /* Matching elts, generate A ^= B. */
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
];
1650 a_elt
->bits
[ix
] = r
;
1652 b_elt
= b_elt
->next
;
1656 bitmap_element_free (a
, a_elt
);
1660 gcc_assert (!a
->current
== !a
->first
);
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. */
1670 bitmap_equal_p (const_bitmap a
, const_bitmap b
)
1672 const bitmap_element
*a_elt
;
1673 const bitmap_element
*b_elt
;
1676 for (a_elt
= a
->first
, b_elt
= b
->first
;
1678 a_elt
= a_elt
->next
, b_elt
= b_elt
->next
)
1680 if (a_elt
->indx
!= b_elt
->indx
)
1682 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1683 if (a_elt
->bits
[ix
] != b_elt
->bits
[ix
])
1686 return !a_elt
&& !b_elt
;
1689 /* Return true if A AND B is not empty. */
1692 bitmap_intersect_p (const_bitmap a
, const_bitmap b
)
1694 const bitmap_element
*a_elt
;
1695 const bitmap_element
*b_elt
;
1698 for (a_elt
= a
->first
, b_elt
= b
->first
;
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
;
1707 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1708 if (a_elt
->bits
[ix
] & b_elt
->bits
[ix
])
1710 a_elt
= a_elt
->next
;
1711 b_elt
= b_elt
->next
;
1717 /* Return true if A AND NOT B is not empty. */
1720 bitmap_intersect_compl_p (const_bitmap a
, const_bitmap b
)
1722 const bitmap_element
*a_elt
;
1723 const bitmap_element
*b_elt
;
1725 for (a_elt
= a
->first
, b_elt
= b
->first
;
1728 if (a_elt
->indx
< b_elt
->indx
)
1730 else if (b_elt
->indx
< a_elt
->indx
)
1731 b_elt
= b_elt
->next
;
1734 for (ix
= BITMAP_ELEMENT_WORDS
; ix
--;)
1735 if (a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
])
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. */
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
);
1766 bitmap_copy (dst
, a
);
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;
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
;
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
];
1794 tmp_elt
.bits
[ix
] = r
;
1799 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1800 a_elt
, &tmp_elt
, changed
);
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
;
1811 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1812 a_elt
, b_elt
, changed
);
1815 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1817 a_elt
= a_elt
->next
;
1818 b_elt
= b_elt
->next
;
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
;
1831 dst_prev
= *dst_prev_pnext
;
1832 dst_prev_pnext
= &dst_prev
->next
;
1833 dst_elt
= *dst_prev_pnext
;
1840 bitmap_elt_clear_from (dst
, dst_elt
);
1842 gcc_assert (!dst
->current
== !dst
->first
);
1844 dst
->indx
= dst
->current
->indx
;
1849 /* A |= (FROM1 & ~FROM2). Return true if A changes. */
1852 bitmap_ior_and_compl_into (bitmap a
, const_bitmap from1
, const_bitmap from2
)
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
);
1866 /* Debugging function to print out the contents of a bitmap. */
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)
1890 fprintf (file
, "\n\t\t\t");
1894 fprintf (file
, " %u", (ptr
->indx
* BITMAP_ELEMENT_ALL_BITS
1895 + i
* BITMAP_WORD_BITS
+ j
));
1899 fprintf (file
, " }\n");
1903 /* Function to be called from the debugger to print the contents
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. */
1916 bitmap_print (FILE *file
, const_bitmap head
, const char *prefix
, const char *suffix
)
1918 const char *comma
= "";
1922 fputs (prefix
, file
);
1923 EXECUTE_IF_SET_IN_BITMAP (head
, 0, i
, bi
)
1925 fprintf (file
, "%s%d", comma
, i
);
1928 fputs (suffix
, file
);
1930 #ifdef GATHER_STATISTICS
1933 /* Used to accumulate statistics about bitmap sizes. */
1940 /* Called via htab_traverse. Output bitmap descriptor pointed out by SLOT
1941 and update statistics. */
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
;
1951 const char *s1
= d
->file
;
1953 while ((s2
= strstr (s1
, "gcc/")))
1955 sprintf (s
, "%s:%i (%s)", s1
, d
->line
, d
->function
);
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
;
1965 /* Output per-bitmap memory usage statistics. */
1967 dump_bitmap_statistics (void)
1969 #ifdef GATHER_STATISTICS
1970 struct output_info info
;
1972 if (!bitmap_desc_hash
)
1975 fprintf (stderr
, "\nBitmap Overall "
1976 "Allocated Peak Leak searched "
1978 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
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");
1989 /* Compute hash of bitmap (for purposes of hashing). */
1991 bitmap_hash (const_bitmap head
)
1993 const bitmap_element
*ptr
;
1994 BITMAP_WORD hash
= 0;
1997 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2000 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
2001 hash
^= ptr
->bits
[ix
];
2003 return (hashval_t
)hash
;
2006 #include "gt-bitmap.h"