1 /* Functions to support general ended bitmaps.
2 Copyright (C) 1997-2012 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"
28 /* Store information about each particular bitmap. */
29 struct bitmap_descriptor
35 HOST_WIDEST_INT allocated
;
37 HOST_WIDEST_INT current
;
42 /* Hashtable mapping bitmap names to descriptors. */
43 static htab_t bitmap_desc_hash
;
45 /* Hashtable helpers. */
47 hash_descriptor (const void *p
)
49 const struct bitmap_descriptor
*const d
=
50 (const struct bitmap_descriptor
*) p
;
51 return htab_hash_pointer (d
->file
) + d
->line
;
60 eq_descriptor (const void *p1
, const void *p2
)
62 const struct bitmap_descriptor
*const d
=
63 (const struct bitmap_descriptor
*) p1
;
64 const struct loc
*const l
= (const struct loc
*) p2
;
65 return d
->file
== l
->file
&& d
->function
== l
->function
&& d
->line
== l
->line
;
68 /* For given file and line, return descriptor, create new if needed. */
69 static struct bitmap_descriptor
*
70 bitmap_descriptor (const char *file
, int line
, const char *function
)
72 struct bitmap_descriptor
**slot
;
76 loc
.function
= function
;
79 if (!bitmap_desc_hash
)
80 bitmap_desc_hash
= htab_create (10, hash_descriptor
, eq_descriptor
, NULL
);
82 slot
= (struct bitmap_descriptor
**)
83 htab_find_slot_with_hash (bitmap_desc_hash
, &loc
,
84 htab_hash_pointer (file
) + line
,
88 *slot
= XCNEW (struct bitmap_descriptor
);
90 (*slot
)->function
= function
;
95 /* Register new bitmap. */
97 bitmap_register (bitmap b MEM_STAT_DECL
)
99 b
->desc
= bitmap_descriptor (ALONE_FINAL_PASS_MEM_STAT
);
103 /* Account the overhead. */
105 register_overhead (bitmap b
, int amount
)
107 b
->desc
->current
+= amount
;
109 b
->desc
->allocated
+= amount
;
110 gcc_assert (b
->desc
->current
>= 0);
111 if (b
->desc
->peak
< b
->desc
->current
)
112 b
->desc
->peak
= b
->desc
->current
;
116 bitmap_element bitmap_zero_bits
; /* An element of all zero bits. */
117 bitmap_obstack bitmap_default_obstack
; /* The default bitmap obstack. */
118 static int bitmap_default_obstack_depth
;
119 static GTY((deletable
)) bitmap_element
*bitmap_ggc_free
; /* Freelist of
122 static void bitmap_elem_to_freelist (bitmap
, bitmap_element
*);
123 static void bitmap_element_free (bitmap
, bitmap_element
*);
124 static bitmap_element
*bitmap_element_allocate (bitmap
);
125 static int bitmap_element_zerop (const bitmap_element
*);
126 static void bitmap_element_link (bitmap
, bitmap_element
*);
127 static bitmap_element
*bitmap_elt_insert_after (bitmap
, bitmap_element
*, unsigned int);
128 static void bitmap_elt_clear_from (bitmap
, bitmap_element
*);
129 static bitmap_element
*bitmap_find_bit (bitmap
, unsigned int);
132 /* Add ELEM to the appropriate freelist. */
134 bitmap_elem_to_freelist (bitmap head
, bitmap_element
*elt
)
136 bitmap_obstack
*bit_obstack
= head
->obstack
;
141 elt
->prev
= bit_obstack
->elements
;
142 bit_obstack
->elements
= elt
;
146 elt
->prev
= bitmap_ggc_free
;
147 bitmap_ggc_free
= elt
;
151 /* Free a bitmap element. Since these are allocated off the
152 bitmap_obstack, "free" actually means "put onto the freelist". */
155 bitmap_element_free (bitmap head
, bitmap_element
*elt
)
157 bitmap_element
*next
= elt
->next
;
158 bitmap_element
*prev
= elt
->prev
;
166 if (head
->first
== elt
)
169 /* Since the first thing we try is to insert before current,
170 make current the next entry in preference to the previous. */
171 if (head
->current
== elt
)
173 head
->current
= next
!= 0 ? next
: prev
;
175 head
->indx
= head
->current
->indx
;
180 if (GATHER_STATISTICS
)
181 register_overhead (head
, -((int)sizeof (bitmap_element
)));
183 bitmap_elem_to_freelist (head
, elt
);
186 /* Allocate a bitmap element. The bits are cleared, but nothing else is. */
188 static inline bitmap_element
*
189 bitmap_element_allocate (bitmap head
)
191 bitmap_element
*element
;
192 bitmap_obstack
*bit_obstack
= head
->obstack
;
196 element
= bit_obstack
->elements
;
199 /* Use up the inner list first before looking at the next
200 element of the outer list. */
203 bit_obstack
->elements
= element
->next
;
204 bit_obstack
->elements
->prev
= element
->prev
;
207 /* Inner list was just a singleton. */
208 bit_obstack
->elements
= element
->prev
;
210 element
= XOBNEW (&bit_obstack
->obstack
, bitmap_element
);
214 element
= bitmap_ggc_free
;
216 /* Use up the inner list first before looking at the next
217 element of the outer list. */
220 bitmap_ggc_free
= element
->next
;
221 bitmap_ggc_free
->prev
= element
->prev
;
224 /* Inner list was just a singleton. */
225 bitmap_ggc_free
= element
->prev
;
227 element
= ggc_alloc_bitmap_element_def ();
230 if (GATHER_STATISTICS
)
231 register_overhead (head
, sizeof (bitmap_element
));
233 memset (element
->bits
, 0, sizeof (element
->bits
));
238 /* Remove ELT and all following elements from bitmap HEAD. */
241 bitmap_elt_clear_from (bitmap head
, bitmap_element
*elt
)
243 bitmap_element
*prev
;
244 bitmap_obstack
*bit_obstack
= head
->obstack
;
248 if (GATHER_STATISTICS
)
251 for (prev
= elt
; prev
; prev
= prev
->next
)
253 register_overhead (head
, -sizeof (bitmap_element
) * n
);
260 if (head
->current
->indx
> prev
->indx
)
262 head
->current
= prev
;
263 head
->indx
= prev
->indx
;
269 head
->current
= NULL
;
273 /* Put the entire list onto the free list in one operation. */
276 elt
->prev
= bit_obstack
->elements
;
277 bit_obstack
->elements
= elt
;
281 elt
->prev
= bitmap_ggc_free
;
282 bitmap_ggc_free
= elt
;
286 /* Clear a bitmap by freeing the linked list. */
289 bitmap_clear (bitmap head
)
292 bitmap_elt_clear_from (head
, head
->first
);
295 /* Initialize a bitmap obstack. If BIT_OBSTACK is NULL, initialize
296 the default bitmap obstack. */
299 bitmap_obstack_initialize (bitmap_obstack
*bit_obstack
)
303 if (bitmap_default_obstack_depth
++)
305 bit_obstack
= &bitmap_default_obstack
;
308 #if !defined(__GNUC__) || (__GNUC__ < 2)
309 #define __alignof__(type) 0
312 bit_obstack
->elements
= NULL
;
313 bit_obstack
->heads
= NULL
;
314 obstack_specify_allocation (&bit_obstack
->obstack
, OBSTACK_CHUNK_SIZE
,
315 __alignof__ (bitmap_element
),
320 /* Release the memory from a bitmap obstack. If BIT_OBSTACK is NULL,
321 release the default bitmap obstack. */
324 bitmap_obstack_release (bitmap_obstack
*bit_obstack
)
328 if (--bitmap_default_obstack_depth
)
330 gcc_assert (bitmap_default_obstack_depth
> 0);
333 bit_obstack
= &bitmap_default_obstack
;
336 bit_obstack
->elements
= NULL
;
337 bit_obstack
->heads
= NULL
;
338 obstack_free (&bit_obstack
->obstack
, NULL
);
341 /* Create a new bitmap on an obstack. If BIT_OBSTACK is NULL, create
342 it on the default bitmap obstack. */
345 bitmap_obstack_alloc_stat (bitmap_obstack
*bit_obstack MEM_STAT_DECL
)
350 bit_obstack
= &bitmap_default_obstack
;
351 map
= bit_obstack
->heads
;
353 bit_obstack
->heads
= (struct bitmap_head_def
*) map
->first
;
355 map
= XOBNEW (&bit_obstack
->obstack
, bitmap_head
);
356 bitmap_initialize_stat (map
, bit_obstack PASS_MEM_STAT
);
358 if (GATHER_STATISTICS
)
359 register_overhead (map
, sizeof (bitmap_head
));
364 /* Create a new GCd bitmap. */
367 bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL
)
371 map
= ggc_alloc_bitmap_head_def ();
372 bitmap_initialize_stat (map
, NULL PASS_MEM_STAT
);
374 if (GATHER_STATISTICS
)
375 register_overhead (map
, sizeof (bitmap_head
));
380 /* Release an obstack allocated bitmap. */
383 bitmap_obstack_free (bitmap map
)
388 map
->first
= (bitmap_element
*) map
->obstack
->heads
;
390 if (GATHER_STATISTICS
)
391 register_overhead (map
, -((int)sizeof (bitmap_head
)));
393 map
->obstack
->heads
= map
;
398 /* Return nonzero if all bits in an element are zero. */
401 bitmap_element_zerop (const bitmap_element
*element
)
403 #if BITMAP_ELEMENT_WORDS == 2
404 return (element
->bits
[0] | element
->bits
[1]) == 0;
408 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
409 if (element
->bits
[i
] != 0)
416 /* Link the bitmap element into the current bitmap linked list. */
419 bitmap_element_link (bitmap head
, bitmap_element
*element
)
421 unsigned int indx
= element
->indx
;
424 /* If this is the first and only element, set it in. */
425 if (head
->first
== 0)
427 element
->next
= element
->prev
= 0;
428 head
->first
= element
;
431 /* If this index is less than that of the current element, it goes someplace
432 before the current element. */
433 else if (indx
< head
->indx
)
435 for (ptr
= head
->current
;
436 ptr
->prev
!= 0 && ptr
->prev
->indx
> indx
;
441 ptr
->prev
->next
= element
;
443 head
->first
= element
;
445 element
->prev
= ptr
->prev
;
450 /* Otherwise, it must go someplace after the current element. */
453 for (ptr
= head
->current
;
454 ptr
->next
!= 0 && ptr
->next
->indx
< indx
;
459 ptr
->next
->prev
= element
;
461 element
->next
= ptr
->next
;
466 /* Set up so this is the first element searched. */
467 head
->current
= element
;
471 /* Insert a new uninitialized element into bitmap HEAD after element
472 ELT. If ELT is NULL, insert the element at the start. Return the
475 static bitmap_element
*
476 bitmap_elt_insert_after (bitmap head
, bitmap_element
*elt
, unsigned int indx
)
478 bitmap_element
*node
= bitmap_element_allocate (head
);
485 head
->current
= node
;
488 node
->next
= head
->first
;
490 node
->next
->prev
= node
;
496 gcc_checking_assert (head
->current
);
497 node
->next
= elt
->next
;
499 node
->next
->prev
= node
;
506 /* Copy a bitmap to another bitmap. */
509 bitmap_copy (bitmap to
, const_bitmap from
)
511 const bitmap_element
*from_ptr
;
512 bitmap_element
*to_ptr
= 0;
516 /* Copy elements in forward direction one at a time. */
517 for (from_ptr
= from
->first
; from_ptr
; from_ptr
= from_ptr
->next
)
519 bitmap_element
*to_elt
= bitmap_element_allocate (to
);
521 to_elt
->indx
= from_ptr
->indx
;
522 memcpy (to_elt
->bits
, from_ptr
->bits
, sizeof (to_elt
->bits
));
524 /* Here we have a special case of bitmap_element_link, for the case
525 where we know the links are being entered in sequence. */
528 to
->first
= to
->current
= to_elt
;
529 to
->indx
= from_ptr
->indx
;
530 to_elt
->next
= to_elt
->prev
= 0;
534 to_elt
->prev
= to_ptr
;
536 to_ptr
->next
= to_elt
;
543 /* Find a bitmap element that would hold a bitmap's bit.
544 Update the `current' field even if we can't find an element that
545 would hold the bitmap's bit to make eventual allocation
548 static inline bitmap_element
*
549 bitmap_find_bit (bitmap head
, unsigned int bit
)
551 bitmap_element
*element
;
552 unsigned int indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
554 if (head
->current
== 0
555 || head
->indx
== indx
)
556 return head
->current
;
558 if (GATHER_STATISTICS
)
559 head
->desc
->nsearches
++;
561 if (head
->indx
< indx
)
562 /* INDX is beyond head->indx. Search from head->current
564 for (element
= head
->current
;
565 element
->next
!= 0 && element
->indx
< indx
;
566 element
= element
->next
)
568 if (GATHER_STATISTICS
)
569 head
->desc
->search_iter
++;
572 else if (head
->indx
/ 2 < indx
)
573 /* INDX is less than head->indx and closer to head->indx than to
574 0. Search from head->current backward. */
575 for (element
= head
->current
;
576 element
->prev
!= 0 && element
->indx
> indx
;
577 element
= element
->prev
)
579 if (GATHER_STATISTICS
)
580 head
->desc
->search_iter
++;
584 /* INDX is less than head->indx and closer to 0 than to
585 head->indx. Search from head->first forward. */
586 for (element
= head
->first
;
587 element
->next
!= 0 && element
->indx
< indx
;
588 element
= element
->next
)
589 if (GATHER_STATISTICS
)
591 head
->desc
->search_iter
++;
594 /* `element' is the nearest to the one we want. If it's not the one we
595 want, the one we want doesn't exist. */
596 head
->current
= element
;
597 head
->indx
= element
->indx
;
598 if (element
!= 0 && element
->indx
!= indx
)
604 /* Clear a single bit in a bitmap. Return true if the bit changed. */
607 bitmap_clear_bit (bitmap head
, int bit
)
609 bitmap_element
*const ptr
= bitmap_find_bit (head
, bit
);
613 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
614 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
615 BITMAP_WORD bit_val
= ((BITMAP_WORD
) 1) << bit_num
;
616 bool res
= (ptr
->bits
[word_num
] & bit_val
) != 0;
619 ptr
->bits
[word_num
] &= ~bit_val
;
620 /* If we cleared the entire word, free up the element. */
621 if (!ptr
->bits
[word_num
]
622 && bitmap_element_zerop (ptr
))
623 bitmap_element_free (head
, ptr
);
632 /* Set a single bit in a bitmap. Return true if the bit changed. */
635 bitmap_set_bit (bitmap head
, int bit
)
637 bitmap_element
*ptr
= bitmap_find_bit (head
, bit
);
638 unsigned word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
639 unsigned bit_num
= bit
% BITMAP_WORD_BITS
;
640 BITMAP_WORD bit_val
= ((BITMAP_WORD
) 1) << bit_num
;
644 ptr
= bitmap_element_allocate (head
);
645 ptr
->indx
= bit
/ BITMAP_ELEMENT_ALL_BITS
;
646 ptr
->bits
[word_num
] = bit_val
;
647 bitmap_element_link (head
, ptr
);
652 bool res
= (ptr
->bits
[word_num
] & bit_val
) == 0;
654 ptr
->bits
[word_num
] |= bit_val
;
659 /* Return whether a bit is set within a bitmap. */
662 bitmap_bit_p (bitmap head
, int bit
)
668 ptr
= bitmap_find_bit (head
, bit
);
672 bit_num
= bit
% BITMAP_WORD_BITS
;
673 word_num
= bit
/ BITMAP_WORD_BITS
% BITMAP_ELEMENT_WORDS
;
675 return (ptr
->bits
[word_num
] >> bit_num
) & 1;
678 #if GCC_VERSION < 3400
679 /* Table of number of set bits in a character, indexed by value of char. */
680 static const unsigned char popcount_table
[] =
682 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,
683 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,
684 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,
685 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,
686 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,
687 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,
688 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,
689 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,
693 bitmap_popcount (BITMAP_WORD a
)
695 unsigned long ret
= 0;
698 /* Just do this the table way for now */
699 for (i
= 0; i
< BITMAP_WORD_BITS
; i
+= 8)
700 ret
+= popcount_table
[(a
>> i
) & 0xff];
704 /* Count the number of bits set in the bitmap, and return it. */
707 bitmap_count_bits (const_bitmap a
)
709 unsigned long count
= 0;
710 const bitmap_element
*elt
;
713 for (elt
= a
->first
; elt
; elt
= elt
->next
)
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
]);
729 /* Return true if the bitmap has a single bit set. Otherwise return
733 bitmap_single_bit_set_p (const_bitmap a
)
735 unsigned long count
= 0;
736 const bitmap_element
*elt
;
739 if (bitmap_empty_p (a
))
743 /* As there are no completely empty bitmap elements, a second one
744 means we have more than one bit set. */
745 if (elt
->next
!= NULL
)
748 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
750 #if GCC_VERSION >= 3400
751 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
752 of BITMAP_WORD is not material. */
753 count
+= __builtin_popcountl (elt
->bits
[ix
]);
755 count
+= bitmap_popcount (elt
->bits
[ix
]);
765 /* Return the bit number of the first set bit in the bitmap. The
766 bitmap must be non-empty. */
769 bitmap_first_set_bit (const_bitmap a
)
771 const bitmap_element
*elt
= a
->first
;
776 gcc_checking_assert (elt
);
777 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
778 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
780 word
= elt
->bits
[ix
];
786 bit_no
+= ix
* BITMAP_WORD_BITS
;
788 #if GCC_VERSION >= 3004
789 gcc_assert (sizeof(long) == sizeof (word
));
790 bit_no
+= __builtin_ctzl (word
);
792 /* Binary search for the first set bit. */
793 #if BITMAP_WORD_BITS > 64
794 #error "Fill out the table."
796 #if BITMAP_WORD_BITS > 32
797 if (!(word
& 0xffffffff))
798 word
>>= 32, bit_no
+= 32;
800 if (!(word
& 0xffff))
801 word
>>= 16, bit_no
+= 16;
803 word
>>= 8, bit_no
+= 8;
805 word
>>= 4, bit_no
+= 4;
807 word
>>= 2, bit_no
+= 2;
809 word
>>= 1, bit_no
+= 1;
811 gcc_checking_assert (word
& 1);
816 /* Return the bit number of the first set bit in the bitmap. The
817 bitmap must be non-empty. */
820 bitmap_last_set_bit (const_bitmap a
)
822 const bitmap_element
*elt
= a
->current
? a
->current
: a
->first
;
827 gcc_checking_assert (elt
);
830 bit_no
= elt
->indx
* BITMAP_ELEMENT_ALL_BITS
;
831 for (ix
= BITMAP_ELEMENT_WORDS
- 1; ix
>= 0; ix
--)
833 word
= elt
->bits
[ix
];
839 bit_no
+= ix
* BITMAP_WORD_BITS
;
841 /* Binary search for the last set bit. */
842 #if GCC_VERSION >= 3004
843 gcc_assert (sizeof(long) == sizeof (word
));
844 bit_no
+= sizeof (long) * 8 - __builtin_ctzl (word
);
846 #if BITMAP_WORD_BITS > 64
847 #error "Fill out the table."
849 #if BITMAP_WORD_BITS > 32
850 if ((word
& 0xffffffff00000000))
851 word
>>= 32, bit_no
+= 32;
853 if (word
& 0xffff0000)
854 word
>>= 16, bit_no
+= 16;
855 if (!(word
& 0xff00))
856 word
>>= 8, bit_no
+= 8;
858 word
>>= 4, bit_no
+= 4;
860 word
>>= 2, bit_no
+= 2;
862 word
>>= 1, bit_no
+= 1;
865 gcc_checking_assert (word
& 1);
873 bitmap_and (bitmap dst
, const_bitmap a
, const_bitmap b
)
875 bitmap_element
*dst_elt
= dst
->first
;
876 const bitmap_element
*a_elt
= a
->first
;
877 const bitmap_element
*b_elt
= b
->first
;
878 bitmap_element
*dst_prev
= NULL
;
880 gcc_assert (dst
!= a
&& dst
!= b
);
884 bitmap_copy (dst
, a
);
888 while (a_elt
&& b_elt
)
890 if (a_elt
->indx
< b_elt
->indx
)
892 else if (b_elt
->indx
< a_elt
->indx
)
896 /* Matching elts, generate A & B. */
901 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
903 dst_elt
->indx
= a_elt
->indx
;
904 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
906 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
908 dst_elt
->bits
[ix
] = r
;
914 dst_elt
= dst_elt
->next
;
920 /* Ensure that dst->current is valid. */
921 dst
->current
= dst
->first
;
922 bitmap_elt_clear_from (dst
, dst_elt
);
923 gcc_checking_assert (!dst
->current
== !dst
->first
);
925 dst
->indx
= dst
->current
->indx
;
931 bitmap_and_into (bitmap a
, const_bitmap b
)
933 bitmap_element
*a_elt
= a
->first
;
934 const bitmap_element
*b_elt
= b
->first
;
935 bitmap_element
*next
;
940 while (a_elt
&& b_elt
)
942 if (a_elt
->indx
< b_elt
->indx
)
945 bitmap_element_free (a
, a_elt
);
948 else if (b_elt
->indx
< a_elt
->indx
)
952 /* Matching elts, generate A &= B. */
956 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
958 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
965 bitmap_element_free (a
, a_elt
);
970 bitmap_elt_clear_from (a
, a_elt
);
971 gcc_checking_assert (!a
->current
== !a
->first
972 && (!a
->current
|| a
->indx
== a
->current
->indx
));
976 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
977 if non-NULL. CHANGED is true if the destination bitmap had already been
978 changed; the new value of CHANGED is returned. */
981 bitmap_elt_copy (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
982 const bitmap_element
*src_elt
, bool changed
)
984 if (!changed
&& dst_elt
&& dst_elt
->indx
== src_elt
->indx
)
988 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
989 if (src_elt
->bits
[ix
] != dst_elt
->bits
[ix
])
991 dst_elt
->bits
[ix
] = src_elt
->bits
[ix
];
999 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src_elt
->indx
);
1001 dst_elt
->indx
= src_elt
->indx
;
1002 memcpy (dst_elt
->bits
, src_elt
->bits
, sizeof (dst_elt
->bits
));
1012 bitmap_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
)
1014 bitmap_element
*dst_elt
= dst
->first
;
1015 const bitmap_element
*a_elt
= a
->first
;
1016 const bitmap_element
*b_elt
= b
->first
;
1017 bitmap_element
*dst_prev
= NULL
;
1018 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1019 bool changed
= false;
1021 gcc_assert (dst
!= a
&& dst
!= b
);
1025 changed
= !bitmap_empty_p (dst
);
1032 while (b_elt
&& b_elt
->indx
< a_elt
->indx
)
1033 b_elt
= b_elt
->next
;
1035 if (!b_elt
|| b_elt
->indx
> a_elt
->indx
)
1037 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, a_elt
, changed
);
1038 dst_prev
= *dst_prev_pnext
;
1039 dst_prev_pnext
= &dst_prev
->next
;
1040 dst_elt
= *dst_prev_pnext
;
1041 a_elt
= a_elt
->next
;
1046 /* Matching elts, generate A & ~B. */
1048 BITMAP_WORD ior
= 0;
1050 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1052 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1054 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1056 if (dst_elt
->bits
[ix
] != r
)
1059 dst_elt
->bits
[ix
] = r
;
1067 if (!dst_elt
|| dst_elt
->indx
> a_elt
->indx
)
1069 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1074 dst_elt
->indx
= a_elt
->indx
;
1075 new_element
= false;
1078 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1080 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1082 dst_elt
->bits
[ix
] = r
;
1090 changed
|= !new_element
;
1091 bitmap_element_free (dst
, dst_elt
);
1092 dst_elt
= *dst_prev_pnext
;
1098 dst_prev
= *dst_prev_pnext
;
1099 dst_prev_pnext
= &dst_prev
->next
;
1100 dst_elt
= *dst_prev_pnext
;
1102 a_elt
= a_elt
->next
;
1103 b_elt
= b_elt
->next
;
1107 /* Ensure that dst->current is valid. */
1108 dst
->current
= dst
->first
;
1113 bitmap_elt_clear_from (dst
, dst_elt
);
1115 gcc_checking_assert (!dst
->current
== !dst
->first
);
1117 dst
->indx
= dst
->current
->indx
;
1122 /* A &= ~B. Returns true if A changes */
1125 bitmap_and_compl_into (bitmap a
, const_bitmap b
)
1127 bitmap_element
*a_elt
= a
->first
;
1128 const bitmap_element
*b_elt
= b
->first
;
1129 bitmap_element
*next
;
1130 BITMAP_WORD changed
= 0;
1134 if (bitmap_empty_p (a
))
1143 while (a_elt
&& b_elt
)
1145 if (a_elt
->indx
< b_elt
->indx
)
1146 a_elt
= a_elt
->next
;
1147 else if (b_elt
->indx
< a_elt
->indx
)
1148 b_elt
= b_elt
->next
;
1151 /* Matching elts, generate A &= ~B. */
1153 BITMAP_WORD ior
= 0;
1155 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1157 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1158 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ cleared
;
1160 a_elt
->bits
[ix
] = r
;
1166 bitmap_element_free (a
, a_elt
);
1168 b_elt
= b_elt
->next
;
1171 gcc_checking_assert (!a
->current
== !a
->first
1172 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1173 return changed
!= 0;
1176 /* Set COUNT bits from START in HEAD. */
1178 bitmap_set_range (bitmap head
, unsigned int start
, unsigned int count
)
1180 unsigned int first_index
, end_bit_plus1
, last_index
;
1181 bitmap_element
*elt
, *elt_prev
;
1187 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1188 end_bit_plus1
= start
+ count
;
1189 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1190 elt
= bitmap_find_bit (head
, start
);
1192 /* If bitmap_find_bit returns zero, the current is the closest block
1193 to the result. Otherwise, just use bitmap_element_allocate to
1194 ensure ELT is set; in the loop below, ELT == NULL means "insert
1195 at the end of the bitmap". */
1198 elt
= bitmap_element_allocate (head
);
1199 elt
->indx
= first_index
;
1200 bitmap_element_link (head
, elt
);
1203 gcc_checking_assert (elt
->indx
== first_index
);
1204 elt_prev
= elt
->prev
;
1205 for (i
= first_index
; i
<= last_index
; i
++)
1207 unsigned elt_start_bit
= i
* BITMAP_ELEMENT_ALL_BITS
;
1208 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1210 unsigned int first_word_to_mod
;
1211 BITMAP_WORD first_mask
;
1212 unsigned int last_word_to_mod
;
1213 BITMAP_WORD last_mask
;
1216 if (!elt
|| elt
->indx
!= i
)
1217 elt
= bitmap_elt_insert_after (head
, elt_prev
, i
);
1219 if (elt_start_bit
<= start
)
1221 /* The first bit to turn on is somewhere inside this
1223 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1225 /* This mask should have 1s in all bits >= start position. */
1227 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1228 first_mask
= ~first_mask
;
1232 /* The first bit to turn on is below this start of this elt. */
1233 first_word_to_mod
= 0;
1234 first_mask
= ~(BITMAP_WORD
) 0;
1237 if (elt_end_bit_plus1
<= end_bit_plus1
)
1239 /* The last bit to turn on is beyond this elt. */
1240 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1241 last_mask
= ~(BITMAP_WORD
) 0;
1245 /* The last bit to turn on is inside to this elt. */
1247 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1249 /* The last mask should have 1s below the end bit. */
1251 (((BITMAP_WORD
) 1) << ((end_bit_plus1
% BITMAP_WORD_BITS
))) - 1;
1254 if (first_word_to_mod
== last_word_to_mod
)
1256 BITMAP_WORD mask
= first_mask
& last_mask
;
1257 elt
->bits
[first_word_to_mod
] |= mask
;
1261 elt
->bits
[first_word_to_mod
] |= first_mask
;
1262 if (BITMAP_ELEMENT_WORDS
> 2)
1263 for (ix
= first_word_to_mod
+ 1; ix
< last_word_to_mod
; ix
++)
1264 elt
->bits
[ix
] = ~(BITMAP_WORD
) 0;
1265 elt
->bits
[last_word_to_mod
] |= last_mask
;
1272 head
->current
= elt
? elt
: elt_prev
;
1273 head
->indx
= head
->current
->indx
;
1276 /* Clear COUNT bits from START in HEAD. */
1278 bitmap_clear_range (bitmap head
, unsigned int start
, unsigned int count
)
1280 unsigned int first_index
, end_bit_plus1
, last_index
;
1281 bitmap_element
*elt
;
1286 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1287 end_bit_plus1
= start
+ count
;
1288 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1289 elt
= bitmap_find_bit (head
, start
);
1291 /* If bitmap_find_bit returns zero, the current is the closest block
1292 to the result. If the current is less than first index, find the
1293 next one. Otherwise, just set elt to be current. */
1298 if (head
->indx
< first_index
)
1300 elt
= head
->current
->next
;
1305 elt
= head
->current
;
1311 while (elt
&& (elt
->indx
<= last_index
))
1313 bitmap_element
* next_elt
= elt
->next
;
1314 unsigned elt_start_bit
= (elt
->indx
) * BITMAP_ELEMENT_ALL_BITS
;
1315 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1318 if (elt_start_bit
>= start
&& elt_end_bit_plus1
<= end_bit_plus1
)
1319 /* Get rid of the entire elt and go to the next one. */
1320 bitmap_element_free (head
, elt
);
1323 /* Going to have to knock out some bits in this elt. */
1324 unsigned int first_word_to_mod
;
1325 BITMAP_WORD first_mask
;
1326 unsigned int last_word_to_mod
;
1327 BITMAP_WORD last_mask
;
1331 if (elt_start_bit
<= start
)
1333 /* The first bit to turn off is somewhere inside this
1335 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1337 /* This mask should have 1s in all bits >= start position. */
1339 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1340 first_mask
= ~first_mask
;
1344 /* The first bit to turn off is below this start of this elt. */
1345 first_word_to_mod
= 0;
1347 first_mask
= ~first_mask
;
1350 if (elt_end_bit_plus1
<= end_bit_plus1
)
1352 /* The last bit to turn off is beyond this elt. */
1353 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1355 last_mask
= ~last_mask
;
1359 /* The last bit to turn off is inside to this elt. */
1361 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1363 /* The last mask should have 1s below the end bit. */
1365 (((BITMAP_WORD
) 1) << (((end_bit_plus1
) % BITMAP_WORD_BITS
))) - 1;
1369 if (first_word_to_mod
== last_word_to_mod
)
1371 BITMAP_WORD mask
= first_mask
& last_mask
;
1372 elt
->bits
[first_word_to_mod
] &= ~mask
;
1376 elt
->bits
[first_word_to_mod
] &= ~first_mask
;
1377 if (BITMAP_ELEMENT_WORDS
> 2)
1378 for (i
= first_word_to_mod
+ 1; i
< last_word_to_mod
; i
++)
1380 elt
->bits
[last_word_to_mod
] &= ~last_mask
;
1382 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
1388 /* Check to see if there are any bits left. */
1390 bitmap_element_free (head
, elt
);
1397 head
->current
= elt
;
1398 head
->indx
= head
->current
->indx
;
1405 bitmap_compl_and_into (bitmap a
, const_bitmap b
)
1407 bitmap_element
*a_elt
= a
->first
;
1408 const bitmap_element
*b_elt
= b
->first
;
1409 bitmap_element
*a_prev
= NULL
;
1410 bitmap_element
*next
;
1412 gcc_assert (a
!= b
);
1414 if (bitmap_empty_p (a
))
1419 if (bitmap_empty_p (b
))
1425 while (a_elt
|| b_elt
)
1427 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1429 /* A is before B. Remove A */
1431 a_prev
= a_elt
->prev
;
1432 bitmap_element_free (a
, a_elt
);
1435 else if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1437 /* B is before A. Copy B. */
1438 next
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1439 memcpy (next
->bits
, b_elt
->bits
, sizeof (next
->bits
));
1441 b_elt
= b_elt
->next
;
1445 /* Matching elts, generate A = ~A & B. */
1447 BITMAP_WORD ior
= 0;
1449 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1451 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1452 BITMAP_WORD r
= b_elt
->bits
[ix
] ^ cleared
;
1454 a_elt
->bits
[ix
] = r
;
1459 bitmap_element_free (a
, a_elt
);
1463 b_elt
= b_elt
->next
;
1466 gcc_checking_assert (!a
->current
== !a
->first
1467 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1472 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1473 overwriting DST_ELT if non-NULL. CHANGED is true if the destination bitmap
1474 had already been changed; the new value of CHANGED is returned. */
1477 bitmap_elt_ior (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
1478 const bitmap_element
*a_elt
, const bitmap_element
*b_elt
,
1481 gcc_assert (a_elt
|| b_elt
);
1483 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1485 /* Matching elts, generate A | B. */
1488 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1490 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1492 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
1493 if (r
!= dst_elt
->bits
[ix
])
1495 dst_elt
->bits
[ix
] = r
;
1504 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1506 dst_elt
->indx
= a_elt
->indx
;
1507 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1509 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
1510 dst_elt
->bits
[ix
] = r
;
1516 /* Copy a single element. */
1517 const bitmap_element
*src
;
1519 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1524 gcc_checking_assert (src
);
1525 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, src
, changed
);
1531 /* DST = A | B. Return true if DST changes. */
1534 bitmap_ior (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
;
1540 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1541 bool changed
= false;
1543 gcc_assert (dst
!= a
&& dst
!= b
);
1545 while (a_elt
|| b_elt
)
1547 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
, a_elt
, b_elt
, changed
);
1549 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1551 a_elt
= a_elt
->next
;
1552 b_elt
= b_elt
->next
;
1556 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
1557 a_elt
= a_elt
->next
;
1558 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
1559 b_elt
= b_elt
->next
;
1562 dst_prev
= *dst_prev_pnext
;
1563 dst_prev_pnext
= &dst_prev
->next
;
1564 dst_elt
= *dst_prev_pnext
;
1570 bitmap_elt_clear_from (dst
, dst_elt
);
1572 gcc_checking_assert (!dst
->current
== !dst
->first
);
1574 dst
->indx
= dst
->current
->indx
;
1578 /* A |= B. Return true if A changes. */
1581 bitmap_ior_into (bitmap a
, const_bitmap b
)
1583 bitmap_element
*a_elt
= a
->first
;
1584 const bitmap_element
*b_elt
= b
->first
;
1585 bitmap_element
*a_prev
= NULL
;
1586 bitmap_element
**a_prev_pnext
= &a
->first
;
1587 bool changed
= false;
1594 /* If A lags behind B, just advance it. */
1595 if (!a_elt
|| a_elt
->indx
== b_elt
->indx
)
1597 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, b_elt
, changed
);
1598 b_elt
= b_elt
->next
;
1600 else if (a_elt
->indx
> b_elt
->indx
)
1602 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, b_elt
, changed
);
1603 b_elt
= b_elt
->next
;
1606 a_prev
= *a_prev_pnext
;
1607 a_prev_pnext
= &a_prev
->next
;
1608 a_elt
= *a_prev_pnext
;
1611 gcc_checking_assert (!a
->current
== !a
->first
);
1613 a
->indx
= a
->current
->indx
;
1620 bitmap_xor (bitmap dst
, const_bitmap a
, const_bitmap b
)
1622 bitmap_element
*dst_elt
= dst
->first
;
1623 const bitmap_element
*a_elt
= a
->first
;
1624 const bitmap_element
*b_elt
= b
->first
;
1625 bitmap_element
*dst_prev
= NULL
;
1627 gcc_assert (dst
!= a
&& dst
!= b
);
1634 while (a_elt
|| b_elt
)
1636 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1638 /* Matching elts, generate A ^ B. */
1640 BITMAP_WORD ior
= 0;
1643 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1645 dst_elt
->indx
= a_elt
->indx
;
1646 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1648 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
1651 dst_elt
->bits
[ix
] = r
;
1653 a_elt
= a_elt
->next
;
1654 b_elt
= b_elt
->next
;
1658 dst_elt
= dst_elt
->next
;
1663 /* Copy a single element. */
1664 const bitmap_element
*src
;
1666 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1669 a_elt
= a_elt
->next
;
1674 b_elt
= b_elt
->next
;
1678 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src
->indx
);
1680 dst_elt
->indx
= src
->indx
;
1681 memcpy (dst_elt
->bits
, src
->bits
, sizeof (dst_elt
->bits
));
1683 dst_elt
= dst_elt
->next
;
1686 /* Ensure that dst->current is valid. */
1687 dst
->current
= dst
->first
;
1688 bitmap_elt_clear_from (dst
, dst_elt
);
1689 gcc_checking_assert (!dst
->current
== !dst
->first
);
1691 dst
->indx
= dst
->current
->indx
;
1697 bitmap_xor_into (bitmap a
, const_bitmap b
)
1699 bitmap_element
*a_elt
= a
->first
;
1700 const bitmap_element
*b_elt
= b
->first
;
1701 bitmap_element
*a_prev
= NULL
;
1711 if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1714 bitmap_element
*dst
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1715 memcpy (dst
->bits
, b_elt
->bits
, sizeof (dst
->bits
));
1717 b_elt
= b_elt
->next
;
1719 else if (a_elt
->indx
< b_elt
->indx
)
1722 a_elt
= a_elt
->next
;
1726 /* Matching elts, generate A ^= B. */
1728 BITMAP_WORD ior
= 0;
1729 bitmap_element
*next
= a_elt
->next
;
1731 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1733 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
1736 a_elt
->bits
[ix
] = r
;
1738 b_elt
= b_elt
->next
;
1742 bitmap_element_free (a
, a_elt
);
1746 gcc_checking_assert (!a
->current
== !a
->first
);
1748 a
->indx
= a
->current
->indx
;
1751 /* Return true if two bitmaps are identical.
1752 We do not bother with a check for pointer equality, as that never
1753 occurs in practice. */
1756 bitmap_equal_p (const_bitmap a
, const_bitmap b
)
1758 const bitmap_element
*a_elt
;
1759 const bitmap_element
*b_elt
;
1762 for (a_elt
= a
->first
, b_elt
= b
->first
;
1764 a_elt
= a_elt
->next
, b_elt
= b_elt
->next
)
1766 if (a_elt
->indx
!= b_elt
->indx
)
1768 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1769 if (a_elt
->bits
[ix
] != b_elt
->bits
[ix
])
1772 return !a_elt
&& !b_elt
;
1775 /* Return true if A AND B is not empty. */
1778 bitmap_intersect_p (const_bitmap a
, const_bitmap b
)
1780 const bitmap_element
*a_elt
;
1781 const bitmap_element
*b_elt
;
1784 for (a_elt
= a
->first
, b_elt
= b
->first
;
1787 if (a_elt
->indx
< b_elt
->indx
)
1788 a_elt
= a_elt
->next
;
1789 else if (b_elt
->indx
< a_elt
->indx
)
1790 b_elt
= b_elt
->next
;
1793 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1794 if (a_elt
->bits
[ix
] & b_elt
->bits
[ix
])
1796 a_elt
= a_elt
->next
;
1797 b_elt
= b_elt
->next
;
1803 /* Return true if A AND NOT B is not empty. */
1806 bitmap_intersect_compl_p (const_bitmap a
, const_bitmap b
)
1808 const bitmap_element
*a_elt
;
1809 const bitmap_element
*b_elt
;
1811 for (a_elt
= a
->first
, b_elt
= b
->first
;
1814 if (a_elt
->indx
< b_elt
->indx
)
1816 else if (b_elt
->indx
< a_elt
->indx
)
1817 b_elt
= b_elt
->next
;
1820 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1821 if (a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
])
1823 a_elt
= a_elt
->next
;
1824 b_elt
= b_elt
->next
;
1827 return a_elt
!= NULL
;
1831 /* DST = A | (FROM1 & ~FROM2). Return true if DST changes. */
1834 bitmap_ior_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
, const_bitmap kill
)
1836 bool changed
= false;
1838 bitmap_element
*dst_elt
= dst
->first
;
1839 const bitmap_element
*a_elt
= a
->first
;
1840 const bitmap_element
*b_elt
= b
->first
;
1841 const bitmap_element
*kill_elt
= kill
->first
;
1842 bitmap_element
*dst_prev
= NULL
;
1843 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1845 gcc_assert (dst
!= a
&& dst
!= b
&& dst
!= kill
);
1847 /* Special cases. We don't bother checking for bitmap_equal_p (b, kill). */
1848 if (b
== kill
|| bitmap_empty_p (b
))
1850 changed
= !bitmap_equal_p (dst
, a
);
1852 bitmap_copy (dst
, a
);
1855 if (bitmap_empty_p (kill
))
1856 return bitmap_ior (dst
, a
, b
);
1857 if (bitmap_empty_p (a
))
1858 return bitmap_and_compl (dst
, b
, kill
);
1860 while (a_elt
|| b_elt
)
1862 bool new_element
= false;
1865 while (kill_elt
&& kill_elt
->indx
< b_elt
->indx
)
1866 kill_elt
= kill_elt
->next
;
1868 if (b_elt
&& kill_elt
&& kill_elt
->indx
== b_elt
->indx
1869 && (!a_elt
|| a_elt
->indx
>= b_elt
->indx
))
1871 bitmap_element tmp_elt
;
1874 BITMAP_WORD ior
= 0;
1875 tmp_elt
.indx
= b_elt
->indx
;
1876 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1878 BITMAP_WORD r
= b_elt
->bits
[ix
] & ~kill_elt
->bits
[ix
];
1880 tmp_elt
.bits
[ix
] = r
;
1885 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1886 a_elt
, &tmp_elt
, changed
);
1888 if (a_elt
&& a_elt
->indx
== b_elt
->indx
)
1889 a_elt
= a_elt
->next
;
1892 b_elt
= b_elt
->next
;
1893 kill_elt
= kill_elt
->next
;
1897 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1898 a_elt
, b_elt
, changed
);
1901 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1903 a_elt
= a_elt
->next
;
1904 b_elt
= b_elt
->next
;
1908 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
1909 a_elt
= a_elt
->next
;
1910 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
1911 b_elt
= b_elt
->next
;
1917 dst_prev
= *dst_prev_pnext
;
1918 dst_prev_pnext
= &dst_prev
->next
;
1919 dst_elt
= *dst_prev_pnext
;
1926 bitmap_elt_clear_from (dst
, dst_elt
);
1928 gcc_checking_assert (!dst
->current
== !dst
->first
);
1930 dst
->indx
= dst
->current
->indx
;
1935 /* A |= (FROM1 & ~FROM2). Return true if A changes. */
1938 bitmap_ior_and_compl_into (bitmap a
, const_bitmap from1
, const_bitmap from2
)
1943 bitmap_initialize (&tmp
, &bitmap_default_obstack
);
1944 bitmap_and_compl (&tmp
, from1
, from2
);
1945 changed
= bitmap_ior_into (a
, &tmp
);
1946 bitmap_clear (&tmp
);
1951 /* A |= (B & C). Return true if A changes. */
1954 bitmap_ior_and_into (bitmap a
, const_bitmap b
, const_bitmap c
)
1956 bitmap_element
*a_elt
= a
->first
;
1957 const bitmap_element
*b_elt
= b
->first
;
1958 const bitmap_element
*c_elt
= c
->first
;
1959 bitmap_element and_elt
;
1960 bitmap_element
*a_prev
= NULL
;
1961 bitmap_element
**a_prev_pnext
= &a
->first
;
1962 bool changed
= false;
1966 return bitmap_ior_into (a
, b
);
1967 if (bitmap_empty_p (b
) || bitmap_empty_p (c
))
1971 while (b_elt
&& c_elt
)
1973 BITMAP_WORD overall
;
1975 /* Find a common item of B and C. */
1976 while (b_elt
->indx
!= c_elt
->indx
)
1978 if (b_elt
->indx
< c_elt
->indx
)
1980 b_elt
= b_elt
->next
;
1986 c_elt
= c_elt
->next
;
1993 and_elt
.indx
= b_elt
->indx
;
1994 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1996 and_elt
.bits
[ix
] = b_elt
->bits
[ix
] & c_elt
->bits
[ix
];
1997 overall
|= and_elt
.bits
[ix
];
2000 b_elt
= b_elt
->next
;
2001 c_elt
= c_elt
->next
;
2005 /* Now find a place to insert AND_ELT. */
2008 ix
= a_elt
? a_elt
->indx
: and_elt
.indx
;
2009 if (ix
== and_elt
.indx
)
2010 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, &and_elt
, changed
);
2011 else if (ix
> and_elt
.indx
)
2012 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, &and_elt
, changed
);
2014 a_prev
= *a_prev_pnext
;
2015 a_prev_pnext
= &a_prev
->next
;
2016 a_elt
= *a_prev_pnext
;
2018 /* If A lagged behind B/C, we advanced it so loop once more. */
2020 while (ix
< and_elt
.indx
);
2024 gcc_checking_assert (!a
->current
== !a
->first
);
2026 a
->indx
= a
->current
->indx
;
2030 /* Compute hash of bitmap (for purposes of hashing). */
2032 bitmap_hash (const_bitmap head
)
2034 const bitmap_element
*ptr
;
2035 BITMAP_WORD hash
= 0;
2038 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2041 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
2042 hash
^= ptr
->bits
[ix
];
2044 return (hashval_t
)hash
;
2048 /* Debugging function to print out the contents of a bitmap. */
2051 debug_bitmap_file (FILE *file
, const_bitmap head
)
2053 const bitmap_element
*ptr
;
2055 fprintf (file
, "\nfirst = " HOST_PTR_PRINTF
2056 " current = " HOST_PTR_PRINTF
" indx = %u\n",
2057 (void *) head
->first
, (void *) head
->current
, head
->indx
);
2059 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2061 unsigned int i
, j
, col
= 26;
2063 fprintf (file
, "\t" HOST_PTR_PRINTF
" next = " HOST_PTR_PRINTF
2064 " prev = " HOST_PTR_PRINTF
" indx = %u\n\t\tbits = {",
2065 (const void*) ptr
, (const void*) ptr
->next
,
2066 (const void*) ptr
->prev
, ptr
->indx
);
2068 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
2069 for (j
= 0; j
< BITMAP_WORD_BITS
; j
++)
2070 if ((ptr
->bits
[i
] >> j
) & 1)
2074 fprintf (file
, "\n\t\t\t");
2078 fprintf (file
, " %u", (ptr
->indx
* BITMAP_ELEMENT_ALL_BITS
2079 + i
* BITMAP_WORD_BITS
+ j
));
2083 fprintf (file
, " }\n");
2087 /* Function to be called from the debugger to print the contents
2091 debug_bitmap (const_bitmap head
)
2093 debug_bitmap_file (stdout
, head
);
2096 /* Function to print out the contents of a bitmap. Unlike debug_bitmap_file,
2097 it does not print anything but the bits. */
2100 bitmap_print (FILE *file
, const_bitmap head
, const char *prefix
, const char *suffix
)
2102 const char *comma
= "";
2106 fputs (prefix
, file
);
2107 EXECUTE_IF_SET_IN_BITMAP (head
, 0, i
, bi
)
2109 fprintf (file
, "%s%d", comma
, i
);
2112 fputs (suffix
, file
);
2116 /* Used to accumulate statistics about bitmap sizes. */
2119 HOST_WIDEST_INT size
;
2123 /* Called via htab_traverse. Output bitmap descriptor pointed out by SLOT
2124 and update statistics. */
2126 print_statistics (void **slot
, void *b
)
2128 struct bitmap_descriptor
*d
= (struct bitmap_descriptor
*) *slot
;
2129 struct output_info
*i
= (struct output_info
*) b
;
2134 const char *s1
= d
->file
;
2136 while ((s2
= strstr (s1
, "gcc/")))
2138 sprintf (s
, "%s:%i (%s)", s1
, d
->line
, d
->function
);
2140 fprintf (stderr
, "%-41s %8d %15"HOST_WIDEST_INT_PRINT
"d %15"
2141 HOST_WIDEST_INT_PRINT
"d %15"HOST_WIDEST_INT_PRINT
"d %10d %10d\n",
2142 s
, d
->created
, d
->allocated
, d
->peak
, d
->current
, d
->nsearches
,
2144 i
->size
+= d
->allocated
;
2145 i
->count
+= d
->created
;
2150 /* Output per-bitmap memory usage statistics. */
2152 dump_bitmap_statistics (void)
2154 struct output_info info
;
2156 if (! GATHER_STATISTICS
)
2159 if (!bitmap_desc_hash
)
2162 fprintf (stderr
, "\nBitmap Overall "
2163 " Allocated Peak Leak searched "
2165 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2168 htab_traverse (bitmap_desc_hash
, print_statistics
, &info
);
2169 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2170 fprintf (stderr
, "%-40s %9d %15"HOST_WIDEST_INT_PRINT
"d\n",
2171 "Total", info
.count
, info
.size
);
2172 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2175 #include "gt-bitmap.h"