1 /* Functions to support general ended bitmaps.
2 Copyright (C) 1997-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
26 /* Memory allocation statistics purpose instance. */
27 mem_alloc_description
<bitmap_usage
> bitmap_mem_desc
;
29 /* Static zero-initialized bitmap obstack used for default initialization
31 bitmap_obstack
bitmap_head::crashme
;
33 static bitmap_element
*bitmap_tree_listify_from (bitmap
, bitmap_element
*);
35 /* Register new bitmap. */
37 bitmap_register (bitmap b MEM_STAT_DECL
)
39 static unsigned alloc_descriptor_max_uid
= 1;
40 gcc_assert (b
->alloc_descriptor
== 0);
41 b
->alloc_descriptor
= alloc_descriptor_max_uid
++;
43 bitmap_mem_desc
.register_descriptor (b
->get_descriptor (), BITMAP_ORIGIN
,
44 false FINAL_PASS_MEM_STAT
);
47 /* Account the overhead. */
49 register_overhead (bitmap b
, size_t amount
)
51 unsigned *d
= b
->get_descriptor ();
52 if (bitmap_mem_desc
.contains_descriptor_for_instance (d
))
53 bitmap_mem_desc
.register_instance_overhead (amount
, d
);
56 /* Release the overhead. */
58 release_overhead (bitmap b
, size_t amount
, bool remove_from_map
)
60 unsigned *d
= b
->get_descriptor ();
61 if (bitmap_mem_desc
.contains_descriptor_for_instance (d
))
62 bitmap_mem_desc
.release_instance_overhead (d
, amount
, remove_from_map
);
67 bitmap_element bitmap_zero_bits
; /* An element of all zero bits. */
68 bitmap_obstack bitmap_default_obstack
; /* The default bitmap obstack. */
69 static int bitmap_default_obstack_depth
;
70 static GTY((deletable
)) bitmap_element
*bitmap_ggc_free
; /* Freelist of
74 /* Bitmap memory management. */
76 /* Add ELT to the appropriate freelist. */
78 bitmap_elem_to_freelist (bitmap head
, bitmap_element
*elt
)
80 bitmap_obstack
*bit_obstack
= head
->obstack
;
82 if (GATHER_STATISTICS
)
83 release_overhead (head
, sizeof (bitmap_element
), false);
89 elt
->prev
= bit_obstack
->elements
;
90 bit_obstack
->elements
= elt
;
94 elt
->prev
= bitmap_ggc_free
;
95 bitmap_ggc_free
= elt
;
99 /* Allocate a bitmap element. The bits are cleared, but nothing else is. */
101 static inline bitmap_element
*
102 bitmap_element_allocate (bitmap head
)
104 bitmap_element
*element
;
105 bitmap_obstack
*bit_obstack
= head
->obstack
;
109 element
= bit_obstack
->elements
;
112 /* Use up the inner list first before looking at the next
113 element of the outer list. */
116 bit_obstack
->elements
= element
->next
;
117 bit_obstack
->elements
->prev
= element
->prev
;
120 /* Inner list was just a singleton. */
121 bit_obstack
->elements
= element
->prev
;
123 element
= XOBNEW (&bit_obstack
->obstack
, bitmap_element
);
127 element
= bitmap_ggc_free
;
129 /* Use up the inner list first before looking at the next
130 element of the outer list. */
133 bitmap_ggc_free
= element
->next
;
134 bitmap_ggc_free
->prev
= element
->prev
;
137 /* Inner list was just a singleton. */
138 bitmap_ggc_free
= element
->prev
;
140 element
= ggc_alloc
<bitmap_element
> ();
143 if (GATHER_STATISTICS
)
144 register_overhead (head
, sizeof (bitmap_element
));
146 memset (element
->bits
, 0, sizeof (element
->bits
));
151 /* Remove ELT and all following elements from bitmap HEAD.
152 Put the released elements in the freelist for HEAD. */
155 bitmap_elt_clear_from (bitmap head
, bitmap_element
*elt
)
157 bitmap_element
*prev
;
158 bitmap_obstack
*bit_obstack
= head
->obstack
;
164 elt
= bitmap_tree_listify_from (head
, elt
);
166 if (GATHER_STATISTICS
)
169 for (prev
= elt
; prev
; prev
= prev
->next
)
171 release_overhead (head
, sizeof (bitmap_element
) * n
, false);
178 if (head
->current
->indx
> prev
->indx
)
180 head
->current
= prev
;
181 head
->indx
= prev
->indx
;
187 head
->current
= NULL
;
191 /* Put the entire list onto the freelist in one operation. */
194 elt
->prev
= bit_obstack
->elements
;
195 bit_obstack
->elements
= elt
;
199 elt
->prev
= bitmap_ggc_free
;
200 bitmap_ggc_free
= elt
;
204 /* Linked-list view of bitmaps.
206 In this representation, the bitmap elements form a double-linked list
207 with elements sorted by increasing index. */
209 /* Link the bitmap element into the current bitmap linked list. */
212 bitmap_list_link_element (bitmap head
, bitmap_element
*element
)
214 unsigned int indx
= element
->indx
;
217 gcc_checking_assert (!head
->tree_form
);
219 /* If this is the first and only element, set it in. */
220 if (head
->first
== 0)
222 element
->next
= element
->prev
= 0;
223 head
->first
= element
;
226 /* If this index is less than that of the current element, it goes someplace
227 before the current element. */
228 else if (indx
< head
->indx
)
230 for (ptr
= head
->current
;
231 ptr
->prev
!= 0 && ptr
->prev
->indx
> indx
;
236 ptr
->prev
->next
= element
;
238 head
->first
= element
;
240 element
->prev
= ptr
->prev
;
245 /* Otherwise, it must go someplace after the current element. */
248 for (ptr
= head
->current
;
249 ptr
->next
!= 0 && ptr
->next
->indx
< indx
;
254 ptr
->next
->prev
= element
;
256 element
->next
= ptr
->next
;
261 /* Set up so this is the first element searched. */
262 head
->current
= element
;
266 /* Unlink the bitmap element from the current bitmap linked list,
267 and return it to the freelist. */
270 bitmap_list_unlink_element (bitmap head
, bitmap_element
*element
,
271 bool to_freelist
= true)
273 bitmap_element
*next
= element
->next
;
274 bitmap_element
*prev
= element
->prev
;
276 gcc_checking_assert (!head
->tree_form
);
284 if (head
->first
== element
)
287 /* Since the first thing we try is to insert before current,
288 make current the next entry in preference to the previous. */
289 if (head
->current
== element
)
291 head
->current
= next
!= 0 ? next
: prev
;
293 head
->indx
= head
->current
->indx
;
299 bitmap_elem_to_freelist (head
, element
);
302 /* Insert a new uninitialized element (or NODE if not NULL) into bitmap
303 HEAD after element ELT. If ELT is NULL, insert the element at the start.
304 Return the new element. */
306 static bitmap_element
*
307 bitmap_list_insert_element_after (bitmap head
,
308 bitmap_element
*elt
, unsigned int indx
,
309 bitmap_element
*node
= NULL
)
312 node
= bitmap_element_allocate (head
);
315 gcc_checking_assert (!head
->tree_form
);
321 head
->current
= node
;
324 node
->next
= head
->first
;
326 node
->next
->prev
= node
;
332 gcc_checking_assert (head
->current
);
333 node
->next
= elt
->next
;
335 node
->next
->prev
= node
;
342 /* Return the element for INDX, or NULL if the element doesn't exist.
343 Update the `current' field even if we can't find an element that
344 would hold the bitmap's bit to make eventual allocation
347 static inline bitmap_element
*
348 bitmap_list_find_element (bitmap head
, unsigned int indx
)
350 bitmap_element
*element
;
352 if (head
->current
== NULL
353 || head
->indx
== indx
)
354 return head
->current
;
356 if (head
->current
== head
->first
357 && head
->first
->next
== NULL
)
360 /* Usage can be NULL due to allocated bitmaps for which we do not
361 call initialize function. */
362 bitmap_usage
*usage
= NULL
;
363 if (GATHER_STATISTICS
)
364 usage
= bitmap_mem_desc
.get_descriptor_for_instance (head
);
366 /* This bitmap has more than one element, and we're going to look
367 through the elements list. Count that as a search. */
368 if (GATHER_STATISTICS
&& usage
)
369 usage
->m_nsearches
++;
371 if (head
->indx
< indx
)
372 /* INDX is beyond head->indx. Search from head->current
374 for (element
= head
->current
;
375 element
->next
!= 0 && element
->indx
< indx
;
376 element
= element
->next
)
378 if (GATHER_STATISTICS
&& usage
)
379 usage
->m_search_iter
++;
382 else if (head
->indx
/ 2 < indx
)
383 /* INDX is less than head->indx and closer to head->indx than to
384 0. Search from head->current backward. */
385 for (element
= head
->current
;
386 element
->prev
!= 0 && element
->indx
> indx
;
387 element
= element
->prev
)
389 if (GATHER_STATISTICS
&& usage
)
390 usage
->m_search_iter
++;
394 /* INDX is less than head->indx and closer to 0 than to
395 head->indx. Search from head->first forward. */
396 for (element
= head
->first
;
397 element
->next
!= 0 && element
->indx
< indx
;
398 element
= element
->next
)
400 if (GATHER_STATISTICS
&& usage
)
401 usage
->m_search_iter
++;
404 /* `element' is the nearest to the one we want. If it's not the one we
405 want, the one we want doesn't exist. */
406 gcc_checking_assert (element
!= NULL
);
407 head
->current
= element
;
408 head
->indx
= element
->indx
;
409 if (element
->indx
!= indx
)
415 /* Splay-tree view of bitmaps.
417 This is an almost one-to-one the implementatin of the simple top-down
418 splay tree in Sleator and Tarjan's "Self-adjusting Binary Search Trees".
419 It is probably not the most efficient form of splay trees, but it should
420 be good enough to experiment with this idea of bitmaps-as-trees.
422 For all functions below, the variable or function argument "t" is a node
423 in the tree, and "e" is a temporary or new node in the tree. The rest
424 is sufficiently straigh-forward (and very well explained in the paper)
425 that comment would only clutter things. */
428 bitmap_tree_link_left (bitmap_element
* &t
, bitmap_element
* &l
)
436 bitmap_tree_link_right (bitmap_element
* &t
, bitmap_element
* &r
)
444 bitmap_tree_rotate_left (bitmap_element
* &t
)
446 bitmap_element
*e
= t
->next
;
447 t
->next
= t
->next
->prev
;
453 bitmap_tree_rotate_right (bitmap_element
* &t
)
455 bitmap_element
*e
= t
->prev
;
456 t
->prev
= t
->prev
->next
;
461 static bitmap_element
*
462 bitmap_tree_splay (bitmap head
, bitmap_element
*t
, unsigned int indx
)
464 bitmap_element N
, *l
, *r
;
469 bitmap_usage
*usage
= NULL
;
470 if (GATHER_STATISTICS
)
471 usage
= bitmap_mem_desc
.get_descriptor_for_instance (head
);
473 N
.prev
= N
.next
= NULL
;
476 while (indx
!= t
->indx
)
478 if (GATHER_STATISTICS
&& usage
)
479 usage
->m_search_iter
++;
483 if (t
->prev
!= NULL
&& indx
< t
->prev
->indx
)
484 bitmap_tree_rotate_right (t
);
487 bitmap_tree_link_right (t
, r
);
489 else if (indx
> t
->indx
)
491 if (t
->next
!= NULL
&& indx
> t
->next
->indx
)
492 bitmap_tree_rotate_left (t
);
495 bitmap_tree_link_left (t
, l
);
506 /* Link bitmap element E into the current bitmap splay tree. */
509 bitmap_tree_link_element (bitmap head
, bitmap_element
*e
)
511 if (head
->first
== NULL
)
512 e
->prev
= e
->next
= NULL
;
515 bitmap_element
*t
= bitmap_tree_splay (head
, head
->first
, e
->indx
);
516 if (e
->indx
< t
->indx
)
522 else if (e
->indx
> t
->indx
)
533 head
->indx
= e
->indx
;
536 /* Unlink bitmap element E from the current bitmap splay tree,
537 and return it to the freelist. */
540 bitmap_tree_unlink_element (bitmap head
, bitmap_element
*e
)
542 bitmap_element
*t
= bitmap_tree_splay (head
, head
->first
, e
->indx
);
544 gcc_checking_assert (t
== e
);
550 t
= bitmap_tree_splay (head
, e
->prev
, e
->indx
);
555 head
->indx
= (t
!= NULL
) ? t
->indx
: 0;
557 bitmap_elem_to_freelist (head
, e
);
560 /* Return the element for INDX, or NULL if the element doesn't exist. */
562 static inline bitmap_element
*
563 bitmap_tree_find_element (bitmap head
, unsigned int indx
)
565 if (head
->current
== NULL
566 || head
->indx
== indx
)
567 return head
->current
;
569 /* Usage can be NULL due to allocated bitmaps for which we do not
570 call initialize function. */
571 bitmap_usage
*usage
= NULL
;
572 if (GATHER_STATISTICS
)
573 usage
= bitmap_mem_desc
.get_descriptor_for_instance (head
);
575 /* This bitmap has more than one element, and we're going to look
576 through the elements list. Count that as a search. */
577 if (GATHER_STATISTICS
&& usage
)
578 usage
->m_nsearches
++;
580 bitmap_element
*element
= bitmap_tree_splay (head
, head
->first
, indx
);
581 gcc_checking_assert (element
!= NULL
);
582 head
->first
= element
;
583 head
->current
= element
;
584 head
->indx
= element
->indx
;
585 if (element
->indx
!= indx
)
590 /* Converting bitmap views from linked-list to tree and vice versa. */
592 /* Splice element E and all elements with a larger index from
593 bitmap HEAD, convert the spliced elements to the linked-list
594 view, and return the head of the list (which should be E again), */
596 static bitmap_element
*
597 bitmap_tree_listify_from (bitmap head
, bitmap_element
*e
)
599 bitmap_element
*t
, *erb
;
601 /* Detach the right branch from E (all elements with indx > E->indx),
602 and splay E to the root. */
605 t
= bitmap_tree_splay (head
, head
->first
, e
->indx
);
606 gcc_checking_assert (t
== e
);
608 /* Because E has no right branch, and we rotated it to the root,
609 the left branch is the new root. */
613 head
->indx
= (t
!= NULL
) ? t
->indx
: 0;
615 /* Detach the tree from E, and re-attach the right branch of E. */
619 /* The tree is now valid again. Now we need to "un-tree" E.
620 It is imperative that a non-recursive implementation is used
621 for this, because splay trees have a worst case depth of O(N)
622 for a tree with N nodes. A recursive implementation could
623 result in a stack overflow for a sufficiently large, unbalanced
626 auto_vec
<bitmap_element
*, 32> stack
;
627 auto_vec
<bitmap_element
*, 32> sorted_elements
;
628 bitmap_element
*n
= e
;
638 if (stack
.is_empty ())
642 sorted_elements
.safe_push (n
);
646 gcc_assert (sorted_elements
[0] == e
);
648 bitmap_element
*prev
= NULL
;
650 FOR_EACH_VEC_ELT (sorted_elements
, ix
, n
)
662 /* Convert bitmap HEAD from splay-tree view to linked-list view. */
665 bitmap_list_view (bitmap head
)
669 gcc_assert (head
->tree_form
);
675 bitmap_tree_rotate_right (ptr
);
677 head
->first
= bitmap_tree_listify_from (head
, ptr
);
680 head
->tree_form
= false;
683 head
->current
= head
->first
;
684 head
->indx
= head
->current
? head
->current
->indx
: 0;
688 /* Convert bitmap HEAD from linked-list view to splay-tree view.
689 This is simply a matter of dropping the prev or next pointers
690 and setting the tree_form flag. The tree will balance itself
691 if and when it is used. */
694 bitmap_tree_view (bitmap head
)
698 gcc_assert (! head
->tree_form
);
707 head
->tree_form
= true;
710 /* Clear a bitmap by freeing all its elements. */
713 bitmap_clear (bitmap head
)
715 if (head
->first
== NULL
)
719 bitmap_element
*e
, *t
;
720 for (e
= head
->first
; e
->prev
; e
= e
->prev
)
721 /* Loop to find the element with the smallest index. */ ;
722 t
= bitmap_tree_splay (head
, head
->first
, e
->indx
);
723 gcc_checking_assert (t
== e
);
726 bitmap_elt_clear_from (head
, head
->first
);
729 /* Initialize a bitmap obstack. If BIT_OBSTACK is NULL, initialize
730 the default bitmap obstack. */
733 bitmap_obstack_initialize (bitmap_obstack
*bit_obstack
)
737 if (bitmap_default_obstack_depth
++)
739 bit_obstack
= &bitmap_default_obstack
;
742 #if !defined(__GNUC__) || (__GNUC__ < 2)
743 #define __alignof__(type) 0
746 bit_obstack
->elements
= NULL
;
747 bit_obstack
->heads
= NULL
;
748 obstack_specify_allocation (&bit_obstack
->obstack
, OBSTACK_CHUNK_SIZE
,
749 __alignof__ (bitmap_element
),
754 /* Release the memory from a bitmap obstack. If BIT_OBSTACK is NULL,
755 release the default bitmap obstack. */
758 bitmap_obstack_release (bitmap_obstack
*bit_obstack
)
762 if (--bitmap_default_obstack_depth
)
764 gcc_assert (bitmap_default_obstack_depth
> 0);
767 bit_obstack
= &bitmap_default_obstack
;
770 bit_obstack
->elements
= NULL
;
771 bit_obstack
->heads
= NULL
;
772 obstack_free (&bit_obstack
->obstack
, NULL
);
775 /* Create a new bitmap on an obstack. If BIT_OBSTACK is NULL, create
776 it on the default bitmap obstack. */
779 bitmap_alloc (bitmap_obstack
*bit_obstack MEM_STAT_DECL
)
784 bit_obstack
= &bitmap_default_obstack
;
785 map
= bit_obstack
->heads
;
787 bit_obstack
->heads
= (class bitmap_head
*) map
->first
;
789 map
= XOBNEW (&bit_obstack
->obstack
, bitmap_head
);
790 bitmap_initialize (map
, bit_obstack PASS_MEM_STAT
);
792 if (GATHER_STATISTICS
)
793 register_overhead (map
, sizeof (bitmap_head
));
798 /* Create a new GCd bitmap. */
801 bitmap_gc_alloc (ALONE_MEM_STAT_DECL
)
805 map
= ggc_alloc
<bitmap_head
> ();
806 bitmap_initialize (map
, NULL PASS_MEM_STAT
);
808 if (GATHER_STATISTICS
)
809 register_overhead (map
, sizeof (bitmap_head
));
814 /* Release an obstack allocated bitmap. */
817 bitmap_obstack_free (bitmap map
)
822 map
->first
= (bitmap_element
*) map
->obstack
->heads
;
824 if (GATHER_STATISTICS
)
825 release_overhead (map
, sizeof (bitmap_head
), true);
827 map
->obstack
->heads
= map
;
832 /* Return nonzero if all bits in an element are zero. */
835 bitmap_element_zerop (const bitmap_element
*element
)
837 #if BITMAP_ELEMENT_WORDS == 2
838 return (element
->bits
[0] | element
->bits
[1]) == 0;
842 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
843 if (element
->bits
[i
] != 0)
850 /* Copy a bitmap to another bitmap. */
853 bitmap_copy (bitmap to
, const_bitmap from
)
855 const bitmap_element
*from_ptr
;
856 bitmap_element
*to_ptr
= 0;
858 gcc_checking_assert (!to
->tree_form
&& !from
->tree_form
);
862 /* Copy elements in forward direction one at a time. */
863 for (from_ptr
= from
->first
; from_ptr
; from_ptr
= from_ptr
->next
)
865 bitmap_element
*to_elt
= bitmap_element_allocate (to
);
867 to_elt
->indx
= from_ptr
->indx
;
868 memcpy (to_elt
->bits
, from_ptr
->bits
, sizeof (to_elt
->bits
));
870 /* Here we have a special case of bitmap_list_link_element,
871 for the case where we know the links are being entered
875 to
->first
= to
->current
= to_elt
;
876 to
->indx
= from_ptr
->indx
;
877 to_elt
->next
= to_elt
->prev
= 0;
881 to_elt
->prev
= to_ptr
;
883 to_ptr
->next
= to_elt
;
890 /* Move a bitmap to another bitmap. */
893 bitmap_move (bitmap to
, bitmap from
)
895 gcc_assert (to
->obstack
== from
->obstack
);
900 if (GATHER_STATISTICS
)
902 for (bitmap_element
*e
= to
->first
; e
; e
= e
->next
)
903 sz
+= sizeof (bitmap_element
);
904 register_overhead (to
, sz
);
909 if (GATHER_STATISTICS
)
910 release_overhead (from
, sz
, false);
913 /* Clear a single bit in a bitmap. Return true if the bit changed. */
916 bitmap_clear_bit (bitmap head
, int bit
)
918 unsigned int indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
921 if (!head
->tree_form
)
922 ptr
= bitmap_list_find_element (head
, indx
);
924 ptr
= bitmap_tree_find_element (head
, indx
);
927 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
928 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
929 BITMAP_WORD bit_val
= ((BITMAP_WORD
) 1) << bit_num
;
930 bool res
= (ptr
->bits
[word_num
] & bit_val
) != 0;
933 ptr
->bits
[word_num
] &= ~bit_val
;
934 /* If we cleared the entire word, free up the element. */
935 if (!ptr
->bits
[word_num
]
936 && bitmap_element_zerop (ptr
))
938 if (!head
->tree_form
)
939 bitmap_list_unlink_element (head
, ptr
);
941 bitmap_tree_unlink_element (head
, ptr
);
951 /* Set a single bit in a bitmap. Return true if the bit changed. */
954 bitmap_set_bit (bitmap head
, int bit
)
956 unsigned indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
958 if (!head
->tree_form
)
959 ptr
= bitmap_list_find_element (head
, indx
);
961 ptr
= bitmap_tree_find_element (head
, indx
);
962 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
963 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
964 BITMAP_WORD bit_val
= ((BITMAP_WORD
) 1) << bit_num
;
968 bool res
= (ptr
->bits
[word_num
] & bit_val
) == 0;
970 ptr
->bits
[word_num
] |= bit_val
;
974 ptr
= bitmap_element_allocate (head
);
975 ptr
->indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
976 ptr
->bits
[word_num
] = bit_val
;
977 if (!head
->tree_form
)
978 bitmap_list_link_element (head
, ptr
);
980 bitmap_tree_link_element (head
, ptr
);
984 /* Return whether a bit is set within a bitmap. */
987 bitmap_bit_p (const_bitmap head
, int bit
)
989 unsigned int indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
990 const bitmap_element
*ptr
;
994 if (!head
->tree_form
)
995 ptr
= bitmap_list_find_element (const_cast<bitmap
> (head
), indx
);
997 ptr
= bitmap_tree_find_element (const_cast<bitmap
> (head
), indx
);
1001 bit_num
= bit
% BITMAP_WORD_BITS
;
1002 word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
1004 return (ptr
->bits
[word_num
] >> bit_num
) & 1;
1007 /* Set CHUNK_SIZE bits at a time in bitmap HEAD.
1008 Store CHUNK_VALUE starting at bits CHUNK * chunk_size.
1009 This is the set routine for viewing bitmap as a multi-bit sparse array. */
1012 bitmap_set_aligned_chunk (bitmap head
, unsigned int chunk
,
1013 unsigned int chunk_size
, BITMAP_WORD chunk_value
)
1015 // Ensure chunk size is a power of 2 and fits in BITMAP_WORD.
1016 gcc_checking_assert (pow2p_hwi (chunk_size
));
1017 gcc_checking_assert (chunk_size
< (sizeof (BITMAP_WORD
) * CHAR_BIT
));
1019 // Ensure chunk_value is within range of chunk_size bits.
1020 BITMAP_WORD max_value
= (1 << chunk_size
) - 1;
1021 gcc_checking_assert (chunk_value
<= max_value
);
1023 unsigned bit
= chunk
* chunk_size
;
1024 unsigned indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
1025 bitmap_element
*ptr
;
1026 if (!head
->tree_form
)
1027 ptr
= bitmap_list_find_element (head
, indx
);
1029 ptr
= bitmap_tree_find_element (head
, indx
);
1030 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
1031 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
1032 BITMAP_WORD bit_val
= chunk_value
<< bit_num
;
1033 BITMAP_WORD mask
= ~(max_value
<< bit_num
);
1037 ptr
->bits
[word_num
] &= mask
;
1038 ptr
->bits
[word_num
] |= bit_val
;
1042 ptr
= bitmap_element_allocate (head
);
1043 ptr
->indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
1044 ptr
->bits
[word_num
] = bit_val
;
1045 if (!head
->tree_form
)
1046 bitmap_list_link_element (head
, ptr
);
1048 bitmap_tree_link_element (head
, ptr
);
1051 /* This is the get routine for viewing bitmap as a multi-bit sparse array.
1052 Return a set of CHUNK_SIZE consecutive bits from HEAD, starting at bit
1053 CHUNK * chunk_size. */
1056 bitmap_get_aligned_chunk (const_bitmap head
, unsigned int chunk
,
1057 unsigned int chunk_size
)
1059 // Ensure chunk size is a power of 2, fits in BITMAP_WORD and is in range.
1060 gcc_checking_assert (pow2p_hwi (chunk_size
));
1061 gcc_checking_assert (chunk_size
< (sizeof (BITMAP_WORD
) * CHAR_BIT
));
1063 BITMAP_WORD max_value
= (1 << chunk_size
) - 1;
1064 unsigned bit
= chunk
* chunk_size
;
1065 unsigned int indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
1066 const bitmap_element
*ptr
;
1070 if (!head
->tree_form
)
1071 ptr
= bitmap_list_find_element (const_cast<bitmap
> (head
), indx
);
1073 ptr
= bitmap_tree_find_element (const_cast<bitmap
> (head
), indx
);
1077 bit_num
= bit
% BITMAP_WORD_BITS
;
1078 word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
1081 return (ptr
->bits
[word_num
] >> bit_num
) & max_value
;
1084 #if GCC_VERSION < 3400
1085 /* Table of number of set bits in a character, indexed by value of char. */
1086 static const unsigned char popcount_table
[] =
1088 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,
1089 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,
1090 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,
1091 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,
1092 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,
1093 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,
1094 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,
1095 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,
1098 static unsigned long
1099 bitmap_popcount (BITMAP_WORD a
)
1101 unsigned long ret
= 0;
1104 /* Just do this the table way for now */
1105 for (i
= 0; i
< BITMAP_WORD_BITS
; i
+= 8)
1106 ret
+= popcount_table
[(a
>> i
) & 0xff];
1111 /* Count and return the number of bits set in the bitmap word BITS. */
1112 static unsigned long
1113 bitmap_count_bits_in_word (const BITMAP_WORD
*bits
)
1115 unsigned long count
= 0;
1117 for (unsigned ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
1119 #if GCC_VERSION >= 3400
1120 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
1121 of BITMAP_WORD is not material. */
1122 count
+= __builtin_popcountl (bits
[ix
]);
1124 count
+= bitmap_popcount (bits
[ix
]);
1130 /* Count the number of bits set in the bitmap, and return it. */
1133 bitmap_count_bits (const_bitmap a
)
1135 unsigned long count
= 0;
1136 const bitmap_element
*elt
;
1138 gcc_checking_assert (!a
->tree_form
);
1139 for (elt
= a
->first
; elt
; elt
= elt
->next
)
1140 count
+= bitmap_count_bits_in_word (elt
->bits
);
1145 /* Count the number of unique bits set in A and B and return it. */
1148 bitmap_count_unique_bits (const_bitmap a
, const_bitmap b
)
1150 unsigned long count
= 0;
1151 const bitmap_element
*elt_a
, *elt_b
;
1153 for (elt_a
= a
->first
, elt_b
= b
->first
; elt_a
&& elt_b
; )
1155 /* If we're at different indices, then count all the bits
1156 in the lower element. If we're at the same index, then
1157 count the bits in the IOR of the two elements. */
1158 if (elt_a
->indx
< elt_b
->indx
)
1160 count
+= bitmap_count_bits_in_word (elt_a
->bits
);
1161 elt_a
= elt_a
->next
;
1163 else if (elt_b
->indx
< elt_a
->indx
)
1165 count
+= bitmap_count_bits_in_word (elt_b
->bits
);
1166 elt_b
= elt_b
->next
;
1170 BITMAP_WORD bits
[BITMAP_ELEMENT_WORDS
];
1171 for (unsigned ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
1172 bits
[ix
] = elt_a
->bits
[ix
] | elt_b
->bits
[ix
];
1173 count
+= bitmap_count_bits_in_word (bits
);
1174 elt_a
= elt_a
->next
;
1175 elt_b
= elt_b
->next
;
1181 /* Return true if the bitmap has a single bit set. Otherwise return
1185 bitmap_single_bit_set_p (const_bitmap a
)
1187 unsigned long count
= 0;
1188 const bitmap_element
*elt
;
1191 if (bitmap_empty_p (a
))
1196 /* As there are no completely empty bitmap elements, a second one
1197 means we have more than one bit set. */
1198 if (elt
->next
!= NULL
1199 && (!a
->tree_form
|| elt
->prev
!= NULL
))
1202 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
1204 #if GCC_VERSION >= 3400
1205 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
1206 of BITMAP_WORD is not material. */
1207 count
+= __builtin_popcountl (elt
->bits
[ix
]);
1209 count
+= bitmap_popcount (elt
->bits
[ix
]);
1219 /* Return the bit number of the first set bit in the bitmap. The
1220 bitmap must be non-empty. When CLEAR is true it clears the bit. */
1223 bitmap_first_set_bit_worker (bitmap a
, bool clear
)
1225 bitmap_element
*elt
= a
->first
;
1230 gcc_checking_assert (elt
);
1236 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
1237 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
1239 word
= elt
->bits
[ix
];
1245 bit_no
+= ix
* BITMAP_WORD_BITS
;
1247 #if GCC_VERSION >= 3004
1248 gcc_assert (sizeof (long) == sizeof (word
));
1249 bit_no
+= __builtin_ctzl (word
);
1251 /* Binary search for the first set bit. */
1252 #if BITMAP_WORD_BITS > 64
1253 #error "Fill out the table."
1255 #if BITMAP_WORD_BITS > 32
1256 if (!(word
& 0xffffffff))
1257 word
>>= 32, bit_no
+= 32;
1259 if (!(word
& 0xffff))
1260 word
>>= 16, bit_no
+= 16;
1262 word
>>= 8, bit_no
+= 8;
1264 word
>>= 4, bit_no
+= 4;
1266 word
>>= 2, bit_no
+= 2;
1268 word
>>= 1, bit_no
+= 1;
1270 gcc_checking_assert (word
& 1);
1275 elt
->bits
[ix
] &= ~((BITMAP_WORD
) 1 << (bit_no
% BITMAP_WORD_BITS
));
1276 /* If we cleared the entire word, free up the element. */
1278 && bitmap_element_zerop (elt
))
1281 bitmap_list_unlink_element (a
, elt
);
1283 bitmap_tree_unlink_element (a
, elt
);
1290 /* Return the bit number of the first set bit in the bitmap. The
1291 bitmap must be non-empty. */
1294 bitmap_first_set_bit (const_bitmap a
)
1296 return bitmap_first_set_bit_worker (const_cast<bitmap
> (a
), false);
1299 /* Return and clear the bit number of the first set bit in the bitmap. The
1300 bitmap must be non-empty. */
1303 bitmap_clear_first_set_bit (bitmap a
)
1305 return bitmap_first_set_bit_worker (a
, true);
1308 /* Return the bit number of the first set bit in the bitmap. The
1309 bitmap must be non-empty. */
1312 bitmap_last_set_bit (const_bitmap a
)
1314 const bitmap_element
*elt
;
1322 elt
= a
->current
? a
->current
: a
->first
;
1323 gcc_checking_assert (elt
);
1328 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
1329 for (ix
= BITMAP_ELEMENT_WORDS
- 1; ix
>= 1; ix
--)
1331 word
= elt
->bits
[ix
];
1335 gcc_assert (elt
->bits
[ix
] != 0);
1337 bit_no
+= ix
* BITMAP_WORD_BITS
;
1338 #if GCC_VERSION >= 3004
1339 gcc_assert (sizeof (long) == sizeof (word
));
1340 bit_no
+= BITMAP_WORD_BITS
- __builtin_clzl (word
) - 1;
1342 /* Hopefully this is a twos-complement host... */
1343 BITMAP_WORD x
= word
;
1349 #if BITMAP_WORD_BITS > 32
1352 bit_no
+= bitmap_popcount (x
) - 1;
1362 bitmap_and (bitmap dst
, const_bitmap a
, const_bitmap b
)
1364 bitmap_element
*dst_elt
= dst
->first
;
1365 const bitmap_element
*a_elt
= a
->first
;
1366 const bitmap_element
*b_elt
= b
->first
;
1367 bitmap_element
*dst_prev
= NULL
;
1369 gcc_checking_assert (!dst
->tree_form
&& !a
->tree_form
&& !b
->tree_form
);
1370 gcc_assert (dst
!= a
&& dst
!= b
);
1374 bitmap_copy (dst
, a
);
1378 while (a_elt
&& b_elt
)
1380 if (a_elt
->indx
< b_elt
->indx
)
1381 a_elt
= a_elt
->next
;
1382 else if (b_elt
->indx
< a_elt
->indx
)
1383 b_elt
= b_elt
->next
;
1386 /* Matching elts, generate A & B. */
1388 BITMAP_WORD ior
= 0;
1391 dst_elt
= bitmap_list_insert_element_after (dst
, dst_prev
,
1394 dst_elt
->indx
= a_elt
->indx
;
1395 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1397 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1399 dst_elt
->bits
[ix
] = r
;
1405 dst_elt
= dst_elt
->next
;
1407 a_elt
= a_elt
->next
;
1408 b_elt
= b_elt
->next
;
1411 /* Ensure that dst->current is valid. */
1412 dst
->current
= dst
->first
;
1413 bitmap_elt_clear_from (dst
, dst_elt
);
1414 gcc_checking_assert (!dst
->current
== !dst
->first
);
1416 dst
->indx
= dst
->current
->indx
;
1419 /* A &= B. Return true if A changed. */
1422 bitmap_and_into (bitmap a
, const_bitmap b
)
1424 bitmap_element
*a_elt
= a
->first
;
1425 const bitmap_element
*b_elt
= b
->first
;
1426 bitmap_element
*next
;
1427 bool changed
= false;
1429 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
1434 while (a_elt
&& b_elt
)
1436 if (a_elt
->indx
< b_elt
->indx
)
1439 bitmap_list_unlink_element (a
, a_elt
);
1443 else if (b_elt
->indx
< a_elt
->indx
)
1444 b_elt
= b_elt
->next
;
1447 /* Matching elts, generate A &= B. */
1449 BITMAP_WORD ior
= 0;
1451 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1453 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1454 if (a_elt
->bits
[ix
] != r
)
1456 a_elt
->bits
[ix
] = r
;
1461 bitmap_list_unlink_element (a
, a_elt
);
1463 b_elt
= b_elt
->next
;
1470 bitmap_elt_clear_from (a
, a_elt
);
1473 gcc_checking_assert (!a
->current
== !a
->first
1474 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1480 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
1481 if non-NULL. CHANGED is true if the destination bitmap had already been
1482 changed; the new value of CHANGED is returned. */
1485 bitmap_elt_copy (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
1486 const bitmap_element
*src_elt
, bool changed
)
1488 if (!changed
&& dst_elt
&& dst_elt
->indx
== src_elt
->indx
)
1492 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1493 if (src_elt
->bits
[ix
] != dst_elt
->bits
[ix
])
1495 dst_elt
->bits
[ix
] = src_elt
->bits
[ix
];
1503 dst_elt
= bitmap_list_insert_element_after (dst
, dst_prev
,
1506 dst_elt
->indx
= src_elt
->indx
;
1507 memcpy (dst_elt
->bits
, src_elt
->bits
, sizeof (dst_elt
->bits
));
1517 bitmap_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
)
1519 bitmap_element
*dst_elt
= dst
->first
;
1520 const bitmap_element
*a_elt
= a
->first
;
1521 const bitmap_element
*b_elt
= b
->first
;
1522 bitmap_element
*dst_prev
= NULL
;
1523 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1524 bool changed
= false;
1526 gcc_checking_assert (!dst
->tree_form
&& !a
->tree_form
&& !b
->tree_form
);
1527 gcc_assert (dst
!= a
&& dst
!= b
);
1531 changed
= !bitmap_empty_p (dst
);
1538 while (b_elt
&& b_elt
->indx
< a_elt
->indx
)
1539 b_elt
= b_elt
->next
;
1541 if (!b_elt
|| b_elt
->indx
> a_elt
->indx
)
1543 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, a_elt
, changed
);
1544 dst_prev
= *dst_prev_pnext
;
1545 dst_prev_pnext
= &dst_prev
->next
;
1546 dst_elt
= *dst_prev_pnext
;
1547 a_elt
= a_elt
->next
;
1552 /* Matching elts, generate A & ~B. */
1554 BITMAP_WORD ior
= 0;
1556 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1558 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1560 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1562 if (dst_elt
->bits
[ix
] != r
)
1565 dst_elt
->bits
[ix
] = r
;
1573 if (!dst_elt
|| dst_elt
->indx
> a_elt
->indx
)
1575 dst_elt
= bitmap_list_insert_element_after (dst
, dst_prev
,
1581 dst_elt
->indx
= a_elt
->indx
;
1582 new_element
= false;
1585 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1587 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1589 dst_elt
->bits
[ix
] = r
;
1597 changed
|= !new_element
;
1598 bitmap_list_unlink_element (dst
, dst_elt
);
1599 dst_elt
= *dst_prev_pnext
;
1605 dst_prev
= *dst_prev_pnext
;
1606 dst_prev_pnext
= &dst_prev
->next
;
1607 dst_elt
= *dst_prev_pnext
;
1609 a_elt
= a_elt
->next
;
1610 b_elt
= b_elt
->next
;
1614 /* Ensure that dst->current is valid. */
1615 dst
->current
= dst
->first
;
1620 bitmap_elt_clear_from (dst
, dst_elt
);
1622 gcc_checking_assert (!dst
->current
== !dst
->first
);
1624 dst
->indx
= dst
->current
->indx
;
1629 /* A &= ~B. Returns true if A changes */
1632 bitmap_and_compl_into (bitmap a
, const_bitmap b
)
1634 bitmap_element
*a_elt
= a
->first
;
1635 const bitmap_element
*b_elt
= b
->first
;
1636 bitmap_element
*next
;
1637 BITMAP_WORD changed
= 0;
1639 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
1643 if (bitmap_empty_p (a
))
1652 while (a_elt
&& b_elt
)
1654 if (a_elt
->indx
< b_elt
->indx
)
1655 a_elt
= a_elt
->next
;
1656 else if (b_elt
->indx
< a_elt
->indx
)
1657 b_elt
= b_elt
->next
;
1660 /* Matching elts, generate A &= ~B. */
1662 BITMAP_WORD ior
= 0;
1664 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1666 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1667 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ cleared
;
1669 a_elt
->bits
[ix
] = r
;
1675 bitmap_list_unlink_element (a
, a_elt
);
1677 b_elt
= b_elt
->next
;
1680 gcc_checking_assert (!a
->current
== !a
->first
1681 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1682 return changed
!= 0;
1685 /* Set COUNT bits from START in HEAD. */
1687 bitmap_set_range (bitmap head
, unsigned int start
, unsigned int count
)
1689 unsigned int first_index
, end_bit_plus1
, last_index
;
1690 bitmap_element
*elt
, *elt_prev
;
1693 gcc_checking_assert (!head
->tree_form
);
1700 bitmap_set_bit (head
, start
);
1704 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1705 end_bit_plus1
= start
+ count
;
1706 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1707 elt
= bitmap_list_find_element (head
, first_index
);
1709 /* If bitmap_list_find_element returns zero, the current is the closest block
1710 to the result. Otherwise, just use bitmap_element_allocate to
1711 ensure ELT is set; in the loop below, ELT == NULL means "insert
1712 at the end of the bitmap". */
1715 elt
= bitmap_element_allocate (head
);
1716 elt
->indx
= first_index
;
1717 bitmap_list_link_element (head
, elt
);
1720 gcc_checking_assert (elt
->indx
== first_index
);
1721 elt_prev
= elt
->prev
;
1722 for (i
= first_index
; i
<= last_index
; i
++)
1724 unsigned elt_start_bit
= i
* BITMAP_ELEMENT_ALL_BITS
;
1725 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1727 unsigned int first_word_to_mod
;
1728 BITMAP_WORD first_mask
;
1729 unsigned int last_word_to_mod
;
1730 BITMAP_WORD last_mask
;
1733 if (!elt
|| elt
->indx
!= i
)
1734 elt
= bitmap_list_insert_element_after (head
, elt_prev
, i
);
1736 if (elt_start_bit
<= start
)
1738 /* The first bit to turn on is somewhere inside this
1740 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1742 /* This mask should have 1s in all bits >= start position. */
1744 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1745 first_mask
= ~first_mask
;
1749 /* The first bit to turn on is below this start of this elt. */
1750 first_word_to_mod
= 0;
1751 first_mask
= ~(BITMAP_WORD
) 0;
1754 if (elt_end_bit_plus1
<= end_bit_plus1
)
1756 /* The last bit to turn on is beyond this elt. */
1757 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1758 last_mask
= ~(BITMAP_WORD
) 0;
1762 /* The last bit to turn on is inside to this elt. */
1764 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1766 /* The last mask should have 1s below the end bit. */
1768 (((BITMAP_WORD
) 1) << ((end_bit_plus1
% BITMAP_WORD_BITS
))) - 1;
1771 if (first_word_to_mod
== last_word_to_mod
)
1773 BITMAP_WORD mask
= first_mask
& last_mask
;
1774 elt
->bits
[first_word_to_mod
] |= mask
;
1778 elt
->bits
[first_word_to_mod
] |= first_mask
;
1779 if (BITMAP_ELEMENT_WORDS
> 2)
1780 for (ix
= first_word_to_mod
+ 1; ix
< last_word_to_mod
; ix
++)
1781 elt
->bits
[ix
] = ~(BITMAP_WORD
) 0;
1782 elt
->bits
[last_word_to_mod
] |= last_mask
;
1789 head
->current
= elt
? elt
: elt_prev
;
1790 head
->indx
= head
->current
->indx
;
1793 /* Clear COUNT bits from START in HEAD. */
1795 bitmap_clear_range (bitmap head
, unsigned int start
, unsigned int count
)
1797 unsigned int first_index
, end_bit_plus1
, last_index
;
1798 bitmap_element
*elt
;
1800 gcc_checking_assert (!head
->tree_form
);
1807 bitmap_clear_bit (head
, start
);
1811 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1812 end_bit_plus1
= start
+ count
;
1813 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1814 elt
= bitmap_list_find_element (head
, first_index
);
1816 /* If bitmap_list_find_element returns zero, the current is the closest block
1817 to the result. If the current is less than first index, find the
1818 next one. Otherwise, just set elt to be current. */
1823 if (head
->indx
< first_index
)
1825 elt
= head
->current
->next
;
1830 elt
= head
->current
;
1836 while (elt
&& (elt
->indx
<= last_index
))
1838 bitmap_element
* next_elt
= elt
->next
;
1839 unsigned elt_start_bit
= (elt
->indx
) * BITMAP_ELEMENT_ALL_BITS
;
1840 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1843 if (elt_start_bit
>= start
&& elt_end_bit_plus1
<= end_bit_plus1
)
1844 /* Get rid of the entire elt and go to the next one. */
1845 bitmap_list_unlink_element (head
, elt
);
1848 /* Going to have to knock out some bits in this elt. */
1849 unsigned int first_word_to_mod
;
1850 BITMAP_WORD first_mask
;
1851 unsigned int last_word_to_mod
;
1852 BITMAP_WORD last_mask
;
1856 if (elt_start_bit
<= start
)
1858 /* The first bit to turn off is somewhere inside this
1860 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1862 /* This mask should have 1s in all bits >= start position. */
1864 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1865 first_mask
= ~first_mask
;
1869 /* The first bit to turn off is below this start of this elt. */
1870 first_word_to_mod
= 0;
1872 first_mask
= ~first_mask
;
1875 if (elt_end_bit_plus1
<= end_bit_plus1
)
1877 /* The last bit to turn off is beyond this elt. */
1878 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1880 last_mask
= ~last_mask
;
1884 /* The last bit to turn off is inside to this elt. */
1886 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1888 /* The last mask should have 1s below the end bit. */
1890 (((BITMAP_WORD
) 1) << (((end_bit_plus1
) % BITMAP_WORD_BITS
))) - 1;
1894 if (first_word_to_mod
== last_word_to_mod
)
1896 BITMAP_WORD mask
= first_mask
& last_mask
;
1897 elt
->bits
[first_word_to_mod
] &= ~mask
;
1901 elt
->bits
[first_word_to_mod
] &= ~first_mask
;
1902 if (BITMAP_ELEMENT_WORDS
> 2)
1903 for (i
= first_word_to_mod
+ 1; i
< last_word_to_mod
; i
++)
1905 elt
->bits
[last_word_to_mod
] &= ~last_mask
;
1907 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
1913 /* Check to see if there are any bits left. */
1915 bitmap_list_unlink_element (head
, elt
);
1922 head
->current
= elt
;
1923 head
->indx
= head
->current
->indx
;
1930 bitmap_compl_and_into (bitmap a
, const_bitmap b
)
1932 bitmap_element
*a_elt
= a
->first
;
1933 const bitmap_element
*b_elt
= b
->first
;
1934 bitmap_element
*a_prev
= NULL
;
1935 bitmap_element
*next
;
1937 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
1938 gcc_assert (a
!= b
);
1940 if (bitmap_empty_p (a
))
1945 if (bitmap_empty_p (b
))
1951 while (a_elt
|| b_elt
)
1953 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1955 /* A is before B. Remove A */
1957 a_prev
= a_elt
->prev
;
1958 bitmap_list_unlink_element (a
, a_elt
);
1961 else if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1963 /* B is before A. Copy B. */
1964 next
= bitmap_list_insert_element_after (a
, a_prev
, b_elt
->indx
);
1965 memcpy (next
->bits
, b_elt
->bits
, sizeof (next
->bits
));
1967 b_elt
= b_elt
->next
;
1971 /* Matching elts, generate A = ~A & B. */
1973 BITMAP_WORD ior
= 0;
1975 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1977 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1978 BITMAP_WORD r
= b_elt
->bits
[ix
] ^ cleared
;
1980 a_elt
->bits
[ix
] = r
;
1985 bitmap_list_unlink_element (a
, a_elt
);
1989 b_elt
= b_elt
->next
;
1992 gcc_checking_assert (!a
->current
== !a
->first
1993 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1998 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1999 overwriting DST_ELT if non-NULL. CHANGED is true if the destination bitmap
2000 had already been changed; the new value of CHANGED is returned. */
2003 bitmap_elt_ior (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
2004 const bitmap_element
*a_elt
, const bitmap_element
*b_elt
,
2007 gcc_assert (a_elt
|| b_elt
);
2009 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
2011 /* Matching elts, generate A | B. */
2014 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
2016 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2018 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
2019 if (r
!= dst_elt
->bits
[ix
])
2021 dst_elt
->bits
[ix
] = r
;
2030 dst_elt
= bitmap_list_insert_element_after (dst
, dst_prev
,
2033 dst_elt
->indx
= a_elt
->indx
;
2034 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2036 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
2037 dst_elt
->bits
[ix
] = r
;
2043 /* Copy a single element. */
2044 const bitmap_element
*src
;
2046 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
2051 gcc_checking_assert (src
);
2052 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, src
, changed
);
2058 /* DST = A | B. Return true if DST changes. */
2061 bitmap_ior (bitmap dst
, const_bitmap a
, const_bitmap b
)
2063 bitmap_element
*dst_elt
= dst
->first
;
2064 const bitmap_element
*a_elt
= a
->first
;
2065 const bitmap_element
*b_elt
= b
->first
;
2066 bitmap_element
*dst_prev
= NULL
;
2067 bitmap_element
**dst_prev_pnext
= &dst
->first
;
2068 bool changed
= false;
2070 gcc_checking_assert (!dst
->tree_form
&& !a
->tree_form
&& !b
->tree_form
);
2071 gcc_assert (dst
!= a
&& dst
!= b
);
2073 while (a_elt
|| b_elt
)
2075 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
, a_elt
, b_elt
, changed
);
2077 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
2079 a_elt
= a_elt
->next
;
2080 b_elt
= b_elt
->next
;
2084 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
2085 a_elt
= a_elt
->next
;
2086 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
2087 b_elt
= b_elt
->next
;
2090 dst_prev
= *dst_prev_pnext
;
2091 dst_prev_pnext
= &dst_prev
->next
;
2092 dst_elt
= *dst_prev_pnext
;
2098 /* Ensure that dst->current is valid. */
2099 dst
->current
= dst
->first
;
2100 bitmap_elt_clear_from (dst
, dst_elt
);
2102 gcc_checking_assert (!dst
->current
== !dst
->first
);
2104 dst
->indx
= dst
->current
->indx
;
2108 /* A |= B. Return true if A changes. */
2111 bitmap_ior_into (bitmap a
, const_bitmap b
)
2113 bitmap_element
*a_elt
= a
->first
;
2114 const bitmap_element
*b_elt
= b
->first
;
2115 bitmap_element
*a_prev
= NULL
;
2116 bitmap_element
**a_prev_pnext
= &a
->first
;
2117 bool changed
= false;
2119 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
2125 /* If A lags behind B, just advance it. */
2126 if (!a_elt
|| a_elt
->indx
== b_elt
->indx
)
2128 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, b_elt
, changed
);
2129 b_elt
= b_elt
->next
;
2131 else if (a_elt
->indx
> b_elt
->indx
)
2133 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, b_elt
, changed
);
2134 b_elt
= b_elt
->next
;
2137 a_prev
= *a_prev_pnext
;
2138 a_prev_pnext
= &a_prev
->next
;
2139 a_elt
= *a_prev_pnext
;
2142 gcc_checking_assert (!a
->current
== !a
->first
);
2144 a
->indx
= a
->current
->indx
;
2148 /* A |= B. Return true if A changes. Free B (re-using its storage
2152 bitmap_ior_into_and_free (bitmap a
, bitmap
*b_
)
2155 bitmap_element
*a_elt
= a
->first
;
2156 bitmap_element
*b_elt
= b
->first
;
2157 bitmap_element
*a_prev
= NULL
;
2158 bitmap_element
**a_prev_pnext
= &a
->first
;
2159 bool changed
= false;
2161 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
2162 gcc_assert (a
->obstack
== b
->obstack
);
2168 /* If A lags behind B, just advance it. */
2169 if (!a_elt
|| a_elt
->indx
== b_elt
->indx
)
2171 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, b_elt
, changed
);
2172 b_elt
= b_elt
->next
;
2174 else if (a_elt
->indx
> b_elt
->indx
)
2176 bitmap_element
*b_elt_next
= b_elt
->next
;
2177 bitmap_list_unlink_element (b
, b_elt
, false);
2178 bitmap_list_insert_element_after (a
, a_prev
, b_elt
->indx
, b_elt
);
2182 a_prev
= *a_prev_pnext
;
2183 a_prev_pnext
= &a_prev
->next
;
2184 a_elt
= *a_prev_pnext
;
2187 gcc_checking_assert (!a
->current
== !a
->first
);
2189 a
->indx
= a
->current
->indx
;
2201 bitmap_xor (bitmap dst
, const_bitmap a
, const_bitmap b
)
2203 bitmap_element
*dst_elt
= dst
->first
;
2204 const bitmap_element
*a_elt
= a
->first
;
2205 const bitmap_element
*b_elt
= b
->first
;
2206 bitmap_element
*dst_prev
= NULL
;
2208 gcc_checking_assert (!dst
->tree_form
&& !a
->tree_form
&& !b
->tree_form
);
2209 gcc_assert (dst
!= a
&& dst
!= b
);
2217 while (a_elt
|| b_elt
)
2219 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
2221 /* Matching elts, generate A ^ B. */
2223 BITMAP_WORD ior
= 0;
2226 dst_elt
= bitmap_list_insert_element_after (dst
, dst_prev
,
2229 dst_elt
->indx
= a_elt
->indx
;
2230 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2232 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
2235 dst_elt
->bits
[ix
] = r
;
2237 a_elt
= a_elt
->next
;
2238 b_elt
= b_elt
->next
;
2242 dst_elt
= dst_elt
->next
;
2247 /* Copy a single element. */
2248 const bitmap_element
*src
;
2250 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
2253 a_elt
= a_elt
->next
;
2258 b_elt
= b_elt
->next
;
2262 dst_elt
= bitmap_list_insert_element_after (dst
, dst_prev
,
2265 dst_elt
->indx
= src
->indx
;
2266 memcpy (dst_elt
->bits
, src
->bits
, sizeof (dst_elt
->bits
));
2268 dst_elt
= dst_elt
->next
;
2271 /* Ensure that dst->current is valid. */
2272 dst
->current
= dst
->first
;
2273 bitmap_elt_clear_from (dst
, dst_elt
);
2274 gcc_checking_assert (!dst
->current
== !dst
->first
);
2276 dst
->indx
= dst
->current
->indx
;
2282 bitmap_xor_into (bitmap a
, const_bitmap b
)
2284 bitmap_element
*a_elt
= a
->first
;
2285 const bitmap_element
*b_elt
= b
->first
;
2286 bitmap_element
*a_prev
= NULL
;
2288 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
2298 if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
2301 bitmap_element
*dst
= bitmap_list_insert_element_after (a
, a_prev
,
2303 memcpy (dst
->bits
, b_elt
->bits
, sizeof (dst
->bits
));
2305 b_elt
= b_elt
->next
;
2307 else if (a_elt
->indx
< b_elt
->indx
)
2310 a_elt
= a_elt
->next
;
2314 /* Matching elts, generate A ^= B. */
2316 BITMAP_WORD ior
= 0;
2317 bitmap_element
*next
= a_elt
->next
;
2319 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2321 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
2324 a_elt
->bits
[ix
] = r
;
2326 b_elt
= b_elt
->next
;
2330 bitmap_list_unlink_element (a
, a_elt
);
2334 gcc_checking_assert (!a
->current
== !a
->first
);
2336 a
->indx
= a
->current
->indx
;
2339 /* Return true if two bitmaps are identical.
2340 We do not bother with a check for pointer equality, as that never
2341 occurs in practice. */
2344 bitmap_equal_p (const_bitmap a
, const_bitmap b
)
2346 const bitmap_element
*a_elt
;
2347 const bitmap_element
*b_elt
;
2350 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
2352 for (a_elt
= a
->first
, b_elt
= b
->first
;
2354 a_elt
= a_elt
->next
, b_elt
= b_elt
->next
)
2356 if (a_elt
->indx
!= b_elt
->indx
)
2358 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2359 if (a_elt
->bits
[ix
] != b_elt
->bits
[ix
])
2362 return !a_elt
&& !b_elt
;
2365 /* Return true if A AND B is not empty. */
2368 bitmap_intersect_p (const_bitmap a
, const_bitmap b
)
2370 const bitmap_element
*a_elt
;
2371 const bitmap_element
*b_elt
;
2374 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
2376 for (a_elt
= a
->first
, b_elt
= b
->first
;
2379 if (a_elt
->indx
< b_elt
->indx
)
2380 a_elt
= a_elt
->next
;
2381 else if (b_elt
->indx
< a_elt
->indx
)
2382 b_elt
= b_elt
->next
;
2385 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2386 if (a_elt
->bits
[ix
] & b_elt
->bits
[ix
])
2388 a_elt
= a_elt
->next
;
2389 b_elt
= b_elt
->next
;
2395 /* Return true if A AND NOT B is not empty. */
2398 bitmap_intersect_compl_p (const_bitmap a
, const_bitmap b
)
2400 const bitmap_element
*a_elt
;
2401 const bitmap_element
*b_elt
;
2404 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
);
2406 for (a_elt
= a
->first
, b_elt
= b
->first
;
2409 if (a_elt
->indx
< b_elt
->indx
)
2411 else if (b_elt
->indx
< a_elt
->indx
)
2412 b_elt
= b_elt
->next
;
2415 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2416 if (a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
])
2418 a_elt
= a_elt
->next
;
2419 b_elt
= b_elt
->next
;
2422 return a_elt
!= NULL
;
2426 /* DST = A | (FROM1 & ~FROM2). Return true if DST changes. */
2429 bitmap_ior_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
, const_bitmap kill
)
2431 bool changed
= false;
2433 bitmap_element
*dst_elt
= dst
->first
;
2434 const bitmap_element
*a_elt
= a
->first
;
2435 const bitmap_element
*b_elt
= b
->first
;
2436 const bitmap_element
*kill_elt
= kill
->first
;
2437 bitmap_element
*dst_prev
= NULL
;
2438 bitmap_element
**dst_prev_pnext
= &dst
->first
;
2440 gcc_checking_assert (!dst
->tree_form
&& !a
->tree_form
&& !b
->tree_form
2441 && !kill
->tree_form
);
2442 gcc_assert (dst
!= a
&& dst
!= b
&& dst
!= kill
);
2444 /* Special cases. We don't bother checking for bitmap_equal_p (b, kill). */
2445 if (b
== kill
|| bitmap_empty_p (b
))
2447 changed
= !bitmap_equal_p (dst
, a
);
2449 bitmap_copy (dst
, a
);
2452 if (bitmap_empty_p (kill
))
2453 return bitmap_ior (dst
, a
, b
);
2454 if (bitmap_empty_p (a
))
2455 return bitmap_and_compl (dst
, b
, kill
);
2457 while (a_elt
|| b_elt
)
2459 bool new_element
= false;
2462 while (kill_elt
&& kill_elt
->indx
< b_elt
->indx
)
2463 kill_elt
= kill_elt
->next
;
2465 if (b_elt
&& kill_elt
&& kill_elt
->indx
== b_elt
->indx
2466 && (!a_elt
|| a_elt
->indx
>= b_elt
->indx
))
2468 bitmap_element tmp_elt
;
2471 BITMAP_WORD ior
= 0;
2472 tmp_elt
.indx
= b_elt
->indx
;
2473 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2475 BITMAP_WORD r
= b_elt
->bits
[ix
] & ~kill_elt
->bits
[ix
];
2477 tmp_elt
.bits
[ix
] = r
;
2482 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
2483 a_elt
, &tmp_elt
, changed
);
2485 if (a_elt
&& a_elt
->indx
== b_elt
->indx
)
2486 a_elt
= a_elt
->next
;
2489 b_elt
= b_elt
->next
;
2490 kill_elt
= kill_elt
->next
;
2494 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
2495 a_elt
, b_elt
, changed
);
2498 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
2500 a_elt
= a_elt
->next
;
2501 b_elt
= b_elt
->next
;
2505 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
2506 a_elt
= a_elt
->next
;
2507 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
2508 b_elt
= b_elt
->next
;
2514 dst_prev
= *dst_prev_pnext
;
2515 dst_prev_pnext
= &dst_prev
->next
;
2516 dst_elt
= *dst_prev_pnext
;
2523 /* Ensure that dst->current is valid. */
2524 dst
->current
= dst
->first
;
2525 bitmap_elt_clear_from (dst
, dst_elt
);
2527 gcc_checking_assert (!dst
->current
== !dst
->first
);
2529 dst
->indx
= dst
->current
->indx
;
2534 /* A |= (B & ~C). Return true if A changes. */
2537 bitmap_ior_and_compl_into (bitmap a
, const_bitmap b
, const_bitmap c
)
2539 bitmap_element
*a_elt
= a
->first
;
2540 const bitmap_element
*b_elt
= b
->first
;
2541 const bitmap_element
*c_elt
= c
->first
;
2542 bitmap_element and_elt
;
2543 bitmap_element
*a_prev
= NULL
;
2544 bitmap_element
**a_prev_pnext
= &a
->first
;
2545 bool changed
= false;
2548 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
&& !c
->tree_form
);
2552 if (bitmap_empty_p (c
))
2553 return bitmap_ior_into (a
, b
);
2554 else if (bitmap_empty_p (a
))
2555 return bitmap_and_compl (a
, b
, c
);
2561 while (c_elt
&& c_elt
->indx
< b_elt
->indx
)
2562 c_elt
= c_elt
->next
;
2564 const bitmap_element
*and_elt_ptr
;
2565 if (c_elt
&& c_elt
->indx
== b_elt
->indx
)
2567 BITMAP_WORD overall
= 0;
2568 and_elt_ptr
= &and_elt
;
2569 and_elt
.indx
= b_elt
->indx
;
2570 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2572 and_elt
.bits
[ix
] = b_elt
->bits
[ix
] & ~c_elt
->bits
[ix
];
2573 overall
|= and_elt
.bits
[ix
];
2577 b_elt
= b_elt
->next
;
2582 and_elt_ptr
= b_elt
;
2584 b_elt
= b_elt
->next
;
2586 /* Now find a place to insert AND_ELT. */
2589 ix
= a_elt
? a_elt
->indx
: and_elt_ptr
->indx
;
2590 if (ix
== and_elt_ptr
->indx
)
2591 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
,
2592 and_elt_ptr
, changed
);
2593 else if (ix
> and_elt_ptr
->indx
)
2594 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, and_elt_ptr
, changed
);
2596 a_prev
= *a_prev_pnext
;
2597 a_prev_pnext
= &a_prev
->next
;
2598 a_elt
= *a_prev_pnext
;
2600 /* If A lagged behind B/C, we advanced it so loop once more. */
2602 while (ix
< and_elt_ptr
->indx
);
2605 gcc_checking_assert (!a
->current
== !a
->first
);
2607 a
->indx
= a
->current
->indx
;
2611 /* A |= (B & C). Return true if A changes. */
2614 bitmap_ior_and_into (bitmap a
, const_bitmap b
, const_bitmap c
)
2616 bitmap_element
*a_elt
= a
->first
;
2617 const bitmap_element
*b_elt
= b
->first
;
2618 const bitmap_element
*c_elt
= c
->first
;
2619 bitmap_element and_elt
;
2620 bitmap_element
*a_prev
= NULL
;
2621 bitmap_element
**a_prev_pnext
= &a
->first
;
2622 bool changed
= false;
2625 gcc_checking_assert (!a
->tree_form
&& !b
->tree_form
&& !c
->tree_form
);
2628 return bitmap_ior_into (a
, b
);
2629 if (bitmap_empty_p (b
) || bitmap_empty_p (c
))
2633 while (b_elt
&& c_elt
)
2635 BITMAP_WORD overall
;
2637 /* Find a common item of B and C. */
2638 while (b_elt
->indx
!= c_elt
->indx
)
2640 if (b_elt
->indx
< c_elt
->indx
)
2642 b_elt
= b_elt
->next
;
2648 c_elt
= c_elt
->next
;
2655 and_elt
.indx
= b_elt
->indx
;
2656 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
2658 and_elt
.bits
[ix
] = b_elt
->bits
[ix
] & c_elt
->bits
[ix
];
2659 overall
|= and_elt
.bits
[ix
];
2662 b_elt
= b_elt
->next
;
2663 c_elt
= c_elt
->next
;
2667 /* Now find a place to insert AND_ELT. */
2670 ix
= a_elt
? a_elt
->indx
: and_elt
.indx
;
2671 if (ix
== and_elt
.indx
)
2672 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, &and_elt
, changed
);
2673 else if (ix
> and_elt
.indx
)
2674 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, &and_elt
, changed
);
2676 a_prev
= *a_prev_pnext
;
2677 a_prev_pnext
= &a_prev
->next
;
2678 a_elt
= *a_prev_pnext
;
2680 /* If A lagged behind B/C, we advanced it so loop once more. */
2682 while (ix
< and_elt
.indx
);
2686 gcc_checking_assert (!a
->current
== !a
->first
);
2688 a
->indx
= a
->current
->indx
;
2692 /* Compute hash of bitmap (for purposes of hashing). */
2695 bitmap_hash (const_bitmap head
)
2697 const bitmap_element
*ptr
;
2698 BITMAP_WORD hash
= 0;
2701 gcc_checking_assert (!head
->tree_form
);
2703 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2706 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
2707 hash
^= ptr
->bits
[ix
];
2709 return (hashval_t
)hash
;
2713 /* Function to obtain a vector of bitmap elements in bit order from
2714 HEAD in tree view. */
2717 bitmap_tree_to_vec (vec
<bitmap_element
*> &elts
, const_bitmap head
)
2719 gcc_checking_assert (head
->tree_form
);
2720 auto_vec
<bitmap_element
*, 32> stack
;
2721 bitmap_element
*e
= head
->first
;
2726 stack
.safe_push (e
);
2729 if (stack
.is_empty ())
2738 /* Debugging function to print out the contents of a bitmap element. */
2741 debug_bitmap_elt_file (FILE *file
, const bitmap_element
*ptr
)
2743 unsigned int i
, j
, col
= 26;
2745 fprintf (file
, "\t" HOST_PTR_PRINTF
" next = " HOST_PTR_PRINTF
2746 " prev = " HOST_PTR_PRINTF
" indx = %u\n\t\tbits = {",
2747 (const void*) ptr
, (const void*) ptr
->next
,
2748 (const void*) ptr
->prev
, ptr
->indx
);
2750 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
2751 for (j
= 0; j
< BITMAP_WORD_BITS
; j
++)
2752 if ((ptr
->bits
[i
] >> j
) & 1)
2756 fprintf (file
, "\n\t\t\t");
2760 fprintf (file
, " %u", (ptr
->indx
* BITMAP_ELEMENT_ALL_BITS
2761 + i
* BITMAP_WORD_BITS
+ j
));
2765 fprintf (file
, " }\n");
2768 /* Debugging function to print out the contents of a bitmap. */
2771 debug_bitmap_file (FILE *file
, const_bitmap head
)
2773 const bitmap_element
*ptr
;
2775 fprintf (file
, "\nfirst = " HOST_PTR_PRINTF
2776 " current = " HOST_PTR_PRINTF
" indx = %u\n",
2777 (void *) head
->first
, (void *) head
->current
, head
->indx
);
2779 if (head
->tree_form
)
2781 auto_vec
<bitmap_element
*, 32> elts
;
2782 bitmap_tree_to_vec (elts
, head
);
2783 for (unsigned i
= 0; i
< elts
.length (); ++i
)
2784 debug_bitmap_elt_file (file
, elts
[i
]);
2787 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2788 debug_bitmap_elt_file (file
, ptr
);
2791 /* Function to be called from the debugger to print the contents
2795 debug_bitmap (const_bitmap head
)
2797 debug_bitmap_file (stderr
, head
);
2800 /* Function to print out the contents of a bitmap. Unlike debug_bitmap_file,
2801 it does not print anything but the bits. */
2804 bitmap_print (FILE *file
, const_bitmap head
, const char *prefix
,
2807 const char *comma
= "";
2810 fputs (prefix
, file
);
2811 if (head
->tree_form
)
2813 auto_vec
<bitmap_element
*, 32> elts
;
2814 bitmap_tree_to_vec (elts
, head
);
2815 for (i
= 0; i
< elts
.length (); ++i
)
2816 for (unsigned ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ++ix
)
2818 BITMAP_WORD word
= elts
[i
]->bits
[ix
];
2819 for (unsigned bit
= 0; bit
!= BITMAP_WORD_BITS
; ++bit
)
2820 if (word
& ((BITMAP_WORD
)1 << bit
))
2822 fprintf (file
, "%s%d", comma
,
2823 (bit
+ BITMAP_WORD_BITS
* ix
2824 + elts
[i
]->indx
* BITMAP_ELEMENT_ALL_BITS
));
2832 EXECUTE_IF_SET_IN_BITMAP (head
, 0, i
, bi
)
2834 fprintf (file
, "%s%d", comma
, i
);
2838 fputs (suffix
, file
);
2841 /* Output per-bitmap memory usage statistics. */
2843 dump_bitmap_statistics (void)
2845 if (!GATHER_STATISTICS
)
2848 bitmap_mem_desc
.dump (BITMAP_ORIGIN
);
2852 debug (const bitmap_head
&ref
)
2854 dump_bitmap (stderr
, &ref
);
2858 debug (const bitmap_head
*ptr
)
2863 fprintf (stderr
, "<nil>\n");
2867 debug (const auto_bitmap
&ref
)
2869 debug ((const bitmap_head
&) ref
);
2873 debug (const auto_bitmap
*ptr
)
2875 debug ((const bitmap_head
*) ptr
);
2879 bitmap_head::dump ()
2886 namespace selftest
{
2888 /* Selftests for bitmaps. */
2890 /* Freshly-created bitmaps ought to be empty. */
2895 bitmap b
= bitmap_gc_alloc ();
2896 ASSERT_TRUE (bitmap_empty_p (b
));
2899 /* Verify bitmap_set_range. */
2904 bitmap b
= bitmap_gc_alloc ();
2905 ASSERT_TRUE (bitmap_empty_p (b
));
2907 bitmap_set_range (b
, 7, 5);
2908 ASSERT_FALSE (bitmap_empty_p (b
));
2909 ASSERT_EQ (5, bitmap_count_bits (b
));
2911 /* Verify bitmap_bit_p at the boundaries. */
2912 ASSERT_FALSE (bitmap_bit_p (b
, 6));
2913 ASSERT_TRUE (bitmap_bit_p (b
, 7));
2914 ASSERT_TRUE (bitmap_bit_p (b
, 11));
2915 ASSERT_FALSE (bitmap_bit_p (b
, 12));
2918 /* Verify splitting a range into two pieces using bitmap_clear_bit. */
2921 test_clear_bit_in_middle ()
2923 bitmap b
= bitmap_gc_alloc ();
2925 /* Set b to [100..200]. */
2926 bitmap_set_range (b
, 100, 100);
2927 ASSERT_EQ (100, bitmap_count_bits (b
));
2929 /* Clear a bit in the middle. */
2930 bool changed
= bitmap_clear_bit (b
, 150);
2931 ASSERT_TRUE (changed
);
2932 ASSERT_EQ (99, bitmap_count_bits (b
));
2933 ASSERT_TRUE (bitmap_bit_p (b
, 149));
2934 ASSERT_FALSE (bitmap_bit_p (b
, 150));
2935 ASSERT_TRUE (bitmap_bit_p (b
, 151));
2938 /* Verify bitmap_copy. */
2943 bitmap src
= bitmap_gc_alloc ();
2944 bitmap_set_range (src
, 40, 10);
2946 bitmap dst
= bitmap_gc_alloc ();
2947 ASSERT_FALSE (bitmap_equal_p (src
, dst
));
2948 bitmap_copy (dst
, src
);
2949 ASSERT_TRUE (bitmap_equal_p (src
, dst
));
2951 /* Verify that we can make them unequal again... */
2952 bitmap_set_range (src
, 70, 5);
2953 ASSERT_FALSE (bitmap_equal_p (src
, dst
));
2955 /* ...and that changing src after the copy didn't affect
2957 ASSERT_FALSE (bitmap_bit_p (dst
, 70));
2960 /* Verify bitmap_single_bit_set_p. */
2963 test_bitmap_single_bit_set_p ()
2965 bitmap b
= bitmap_gc_alloc ();
2967 ASSERT_FALSE (bitmap_single_bit_set_p (b
));
2969 bitmap_set_range (b
, 42, 1);
2970 ASSERT_TRUE (bitmap_single_bit_set_p (b
));
2971 ASSERT_EQ (42, bitmap_first_set_bit (b
));
2973 bitmap_set_range (b
, 1066, 1);
2974 ASSERT_FALSE (bitmap_single_bit_set_p (b
));
2975 ASSERT_EQ (42, bitmap_first_set_bit (b
));
2977 bitmap_clear_range (b
, 0, 100);
2978 ASSERT_TRUE (bitmap_single_bit_set_p (b
));
2979 ASSERT_EQ (1066, bitmap_first_set_bit (b
));
2982 /* Verify accessing aligned bit chunks works as expected. */
2985 test_aligned_chunk (unsigned num_bits
)
2987 bitmap b
= bitmap_gc_alloc ();
2988 int limit
= 2 ^ num_bits
;
2991 for (int x
= 0; x
< limit
; x
++)
2993 bitmap_set_aligned_chunk (b
, index
, num_bits
, (BITMAP_WORD
) x
);
2994 ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b
, index
, num_bits
) == x
);
2995 ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b
, index
+ 1,
2997 ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b
, index
- 1,
3002 for (int x
= 0; x
< limit
; x
++)
3004 ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b
, index
, num_bits
) == x
);
3009 /* Run all of the selftests within this file. */
3016 test_clear_bit_in_middle ();
3018 test_bitmap_single_bit_set_p ();
3019 /* Test 2, 4 and 8 bit aligned chunks. */
3020 test_aligned_chunk (2);
3021 test_aligned_chunk (4);
3022 test_aligned_chunk (8);
3025 } // namespace selftest
3026 #endif /* CHECKING_P */
3028 #include "gt-bitmap.h"