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
;
840 #if GCC_VERSION >= 3004
841 gcc_assert (sizeof(long) == sizeof (word
));
842 bit_no
+= BITMAP_WORD_BITS
- __builtin_clzl (word
) - 1;
844 /* Hopefully this is a twos-complement host... */
845 BITMAP_WORD x
= word
;
851 #if BITMAP_WORD_BITS > 32
854 bit_no
+= bitmap_popcount (x
) - 1;
864 bitmap_and (bitmap dst
, const_bitmap a
, const_bitmap b
)
866 bitmap_element
*dst_elt
= dst
->first
;
867 const bitmap_element
*a_elt
= a
->first
;
868 const bitmap_element
*b_elt
= b
->first
;
869 bitmap_element
*dst_prev
= NULL
;
871 gcc_assert (dst
!= a
&& dst
!= b
);
875 bitmap_copy (dst
, a
);
879 while (a_elt
&& b_elt
)
881 if (a_elt
->indx
< b_elt
->indx
)
883 else if (b_elt
->indx
< a_elt
->indx
)
887 /* Matching elts, generate A & B. */
892 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
894 dst_elt
->indx
= a_elt
->indx
;
895 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
897 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
899 dst_elt
->bits
[ix
] = r
;
905 dst_elt
= dst_elt
->next
;
911 /* Ensure that dst->current is valid. */
912 dst
->current
= dst
->first
;
913 bitmap_elt_clear_from (dst
, dst_elt
);
914 gcc_checking_assert (!dst
->current
== !dst
->first
);
916 dst
->indx
= dst
->current
->indx
;
922 bitmap_and_into (bitmap a
, const_bitmap b
)
924 bitmap_element
*a_elt
= a
->first
;
925 const bitmap_element
*b_elt
= b
->first
;
926 bitmap_element
*next
;
931 while (a_elt
&& b_elt
)
933 if (a_elt
->indx
< b_elt
->indx
)
936 bitmap_element_free (a
, a_elt
);
939 else if (b_elt
->indx
< a_elt
->indx
)
943 /* Matching elts, generate A &= B. */
947 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
949 BITMAP_WORD r
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
956 bitmap_element_free (a
, a_elt
);
961 bitmap_elt_clear_from (a
, a_elt
);
962 gcc_checking_assert (!a
->current
== !a
->first
963 && (!a
->current
|| a
->indx
== a
->current
->indx
));
967 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
968 if non-NULL. CHANGED is true if the destination bitmap had already been
969 changed; the new value of CHANGED is returned. */
972 bitmap_elt_copy (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
973 const bitmap_element
*src_elt
, bool changed
)
975 if (!changed
&& dst_elt
&& dst_elt
->indx
== src_elt
->indx
)
979 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
980 if (src_elt
->bits
[ix
] != dst_elt
->bits
[ix
])
982 dst_elt
->bits
[ix
] = src_elt
->bits
[ix
];
990 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src_elt
->indx
);
992 dst_elt
->indx
= src_elt
->indx
;
993 memcpy (dst_elt
->bits
, src_elt
->bits
, sizeof (dst_elt
->bits
));
1003 bitmap_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
)
1005 bitmap_element
*dst_elt
= dst
->first
;
1006 const bitmap_element
*a_elt
= a
->first
;
1007 const bitmap_element
*b_elt
= b
->first
;
1008 bitmap_element
*dst_prev
= NULL
;
1009 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1010 bool changed
= false;
1012 gcc_assert (dst
!= a
&& dst
!= b
);
1016 changed
= !bitmap_empty_p (dst
);
1023 while (b_elt
&& b_elt
->indx
< a_elt
->indx
)
1024 b_elt
= b_elt
->next
;
1026 if (!b_elt
|| b_elt
->indx
> a_elt
->indx
)
1028 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, a_elt
, changed
);
1029 dst_prev
= *dst_prev_pnext
;
1030 dst_prev_pnext
= &dst_prev
->next
;
1031 dst_elt
= *dst_prev_pnext
;
1032 a_elt
= a_elt
->next
;
1037 /* Matching elts, generate A & ~B. */
1039 BITMAP_WORD ior
= 0;
1041 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1043 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1045 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1047 if (dst_elt
->bits
[ix
] != r
)
1050 dst_elt
->bits
[ix
] = r
;
1058 if (!dst_elt
|| dst_elt
->indx
> a_elt
->indx
)
1060 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1065 dst_elt
->indx
= a_elt
->indx
;
1066 new_element
= false;
1069 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1071 BITMAP_WORD r
= a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
];
1073 dst_elt
->bits
[ix
] = r
;
1081 changed
|= !new_element
;
1082 bitmap_element_free (dst
, dst_elt
);
1083 dst_elt
= *dst_prev_pnext
;
1089 dst_prev
= *dst_prev_pnext
;
1090 dst_prev_pnext
= &dst_prev
->next
;
1091 dst_elt
= *dst_prev_pnext
;
1093 a_elt
= a_elt
->next
;
1094 b_elt
= b_elt
->next
;
1098 /* Ensure that dst->current is valid. */
1099 dst
->current
= dst
->first
;
1104 bitmap_elt_clear_from (dst
, dst_elt
);
1106 gcc_checking_assert (!dst
->current
== !dst
->first
);
1108 dst
->indx
= dst
->current
->indx
;
1113 /* A &= ~B. Returns true if A changes */
1116 bitmap_and_compl_into (bitmap a
, const_bitmap b
)
1118 bitmap_element
*a_elt
= a
->first
;
1119 const bitmap_element
*b_elt
= b
->first
;
1120 bitmap_element
*next
;
1121 BITMAP_WORD changed
= 0;
1125 if (bitmap_empty_p (a
))
1134 while (a_elt
&& b_elt
)
1136 if (a_elt
->indx
< b_elt
->indx
)
1137 a_elt
= a_elt
->next
;
1138 else if (b_elt
->indx
< a_elt
->indx
)
1139 b_elt
= b_elt
->next
;
1142 /* Matching elts, generate A &= ~B. */
1144 BITMAP_WORD ior
= 0;
1146 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1148 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1149 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ cleared
;
1151 a_elt
->bits
[ix
] = r
;
1157 bitmap_element_free (a
, a_elt
);
1159 b_elt
= b_elt
->next
;
1162 gcc_checking_assert (!a
->current
== !a
->first
1163 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1164 return changed
!= 0;
1167 /* Set COUNT bits from START in HEAD. */
1169 bitmap_set_range (bitmap head
, unsigned int start
, unsigned int count
)
1171 unsigned int first_index
, end_bit_plus1
, last_index
;
1172 bitmap_element
*elt
, *elt_prev
;
1178 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1179 end_bit_plus1
= start
+ count
;
1180 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1181 elt
= bitmap_find_bit (head
, start
);
1183 /* If bitmap_find_bit returns zero, the current is the closest block
1184 to the result. Otherwise, just use bitmap_element_allocate to
1185 ensure ELT is set; in the loop below, ELT == NULL means "insert
1186 at the end of the bitmap". */
1189 elt
= bitmap_element_allocate (head
);
1190 elt
->indx
= first_index
;
1191 bitmap_element_link (head
, elt
);
1194 gcc_checking_assert (elt
->indx
== first_index
);
1195 elt_prev
= elt
->prev
;
1196 for (i
= first_index
; i
<= last_index
; i
++)
1198 unsigned elt_start_bit
= i
* BITMAP_ELEMENT_ALL_BITS
;
1199 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1201 unsigned int first_word_to_mod
;
1202 BITMAP_WORD first_mask
;
1203 unsigned int last_word_to_mod
;
1204 BITMAP_WORD last_mask
;
1207 if (!elt
|| elt
->indx
!= i
)
1208 elt
= bitmap_elt_insert_after (head
, elt_prev
, i
);
1210 if (elt_start_bit
<= start
)
1212 /* The first bit to turn on is somewhere inside this
1214 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1216 /* This mask should have 1s in all bits >= start position. */
1218 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1219 first_mask
= ~first_mask
;
1223 /* The first bit to turn on is below this start of this elt. */
1224 first_word_to_mod
= 0;
1225 first_mask
= ~(BITMAP_WORD
) 0;
1228 if (elt_end_bit_plus1
<= end_bit_plus1
)
1230 /* The last bit to turn on is beyond this elt. */
1231 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1232 last_mask
= ~(BITMAP_WORD
) 0;
1236 /* The last bit to turn on is inside to this elt. */
1238 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1240 /* The last mask should have 1s below the end bit. */
1242 (((BITMAP_WORD
) 1) << ((end_bit_plus1
% BITMAP_WORD_BITS
))) - 1;
1245 if (first_word_to_mod
== last_word_to_mod
)
1247 BITMAP_WORD mask
= first_mask
& last_mask
;
1248 elt
->bits
[first_word_to_mod
] |= mask
;
1252 elt
->bits
[first_word_to_mod
] |= first_mask
;
1253 if (BITMAP_ELEMENT_WORDS
> 2)
1254 for (ix
= first_word_to_mod
+ 1; ix
< last_word_to_mod
; ix
++)
1255 elt
->bits
[ix
] = ~(BITMAP_WORD
) 0;
1256 elt
->bits
[last_word_to_mod
] |= last_mask
;
1263 head
->current
= elt
? elt
: elt_prev
;
1264 head
->indx
= head
->current
->indx
;
1267 /* Clear COUNT bits from START in HEAD. */
1269 bitmap_clear_range (bitmap head
, unsigned int start
, unsigned int count
)
1271 unsigned int first_index
, end_bit_plus1
, last_index
;
1272 bitmap_element
*elt
;
1277 first_index
= start
/ BITMAP_ELEMENT_ALL_BITS
;
1278 end_bit_plus1
= start
+ count
;
1279 last_index
= (end_bit_plus1
- 1) / BITMAP_ELEMENT_ALL_BITS
;
1280 elt
= bitmap_find_bit (head
, start
);
1282 /* If bitmap_find_bit returns zero, the current is the closest block
1283 to the result. If the current is less than first index, find the
1284 next one. Otherwise, just set elt to be current. */
1289 if (head
->indx
< first_index
)
1291 elt
= head
->current
->next
;
1296 elt
= head
->current
;
1302 while (elt
&& (elt
->indx
<= last_index
))
1304 bitmap_element
* next_elt
= elt
->next
;
1305 unsigned elt_start_bit
= (elt
->indx
) * BITMAP_ELEMENT_ALL_BITS
;
1306 unsigned elt_end_bit_plus1
= elt_start_bit
+ BITMAP_ELEMENT_ALL_BITS
;
1309 if (elt_start_bit
>= start
&& elt_end_bit_plus1
<= end_bit_plus1
)
1310 /* Get rid of the entire elt and go to the next one. */
1311 bitmap_element_free (head
, elt
);
1314 /* Going to have to knock out some bits in this elt. */
1315 unsigned int first_word_to_mod
;
1316 BITMAP_WORD first_mask
;
1317 unsigned int last_word_to_mod
;
1318 BITMAP_WORD last_mask
;
1322 if (elt_start_bit
<= start
)
1324 /* The first bit to turn off is somewhere inside this
1326 first_word_to_mod
= (start
- elt_start_bit
) / BITMAP_WORD_BITS
;
1328 /* This mask should have 1s in all bits >= start position. */
1330 (((BITMAP_WORD
) 1) << ((start
% BITMAP_WORD_BITS
))) - 1;
1331 first_mask
= ~first_mask
;
1335 /* The first bit to turn off is below this start of this elt. */
1336 first_word_to_mod
= 0;
1338 first_mask
= ~first_mask
;
1341 if (elt_end_bit_plus1
<= end_bit_plus1
)
1343 /* The last bit to turn off is beyond this elt. */
1344 last_word_to_mod
= BITMAP_ELEMENT_WORDS
- 1;
1346 last_mask
= ~last_mask
;
1350 /* The last bit to turn off is inside to this elt. */
1352 (end_bit_plus1
- elt_start_bit
) / BITMAP_WORD_BITS
;
1354 /* The last mask should have 1s below the end bit. */
1356 (((BITMAP_WORD
) 1) << (((end_bit_plus1
) % BITMAP_WORD_BITS
))) - 1;
1360 if (first_word_to_mod
== last_word_to_mod
)
1362 BITMAP_WORD mask
= first_mask
& last_mask
;
1363 elt
->bits
[first_word_to_mod
] &= ~mask
;
1367 elt
->bits
[first_word_to_mod
] &= ~first_mask
;
1368 if (BITMAP_ELEMENT_WORDS
> 2)
1369 for (i
= first_word_to_mod
+ 1; i
< last_word_to_mod
; i
++)
1371 elt
->bits
[last_word_to_mod
] &= ~last_mask
;
1373 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
1379 /* Check to see if there are any bits left. */
1381 bitmap_element_free (head
, elt
);
1388 head
->current
= elt
;
1389 head
->indx
= head
->current
->indx
;
1396 bitmap_compl_and_into (bitmap a
, const_bitmap b
)
1398 bitmap_element
*a_elt
= a
->first
;
1399 const bitmap_element
*b_elt
= b
->first
;
1400 bitmap_element
*a_prev
= NULL
;
1401 bitmap_element
*next
;
1403 gcc_assert (a
!= b
);
1405 if (bitmap_empty_p (a
))
1410 if (bitmap_empty_p (b
))
1416 while (a_elt
|| b_elt
)
1418 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1420 /* A is before B. Remove A */
1422 a_prev
= a_elt
->prev
;
1423 bitmap_element_free (a
, a_elt
);
1426 else if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1428 /* B is before A. Copy B. */
1429 next
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1430 memcpy (next
->bits
, b_elt
->bits
, sizeof (next
->bits
));
1432 b_elt
= b_elt
->next
;
1436 /* Matching elts, generate A = ~A & B. */
1438 BITMAP_WORD ior
= 0;
1440 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1442 BITMAP_WORD cleared
= a_elt
->bits
[ix
] & b_elt
->bits
[ix
];
1443 BITMAP_WORD r
= b_elt
->bits
[ix
] ^ cleared
;
1445 a_elt
->bits
[ix
] = r
;
1450 bitmap_element_free (a
, a_elt
);
1454 b_elt
= b_elt
->next
;
1457 gcc_checking_assert (!a
->current
== !a
->first
1458 && (!a
->current
|| a
->indx
== a
->current
->indx
));
1463 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1464 overwriting DST_ELT if non-NULL. CHANGED is true if the destination bitmap
1465 had already been changed; the new value of CHANGED is returned. */
1468 bitmap_elt_ior (bitmap dst
, bitmap_element
*dst_elt
, bitmap_element
*dst_prev
,
1469 const bitmap_element
*a_elt
, const bitmap_element
*b_elt
,
1472 gcc_assert (a_elt
|| b_elt
);
1474 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1476 /* Matching elts, generate A | B. */
1479 if (!changed
&& dst_elt
&& dst_elt
->indx
== a_elt
->indx
)
1481 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1483 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
1484 if (r
!= dst_elt
->bits
[ix
])
1486 dst_elt
->bits
[ix
] = r
;
1495 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1497 dst_elt
->indx
= a_elt
->indx
;
1498 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1500 BITMAP_WORD r
= a_elt
->bits
[ix
] | b_elt
->bits
[ix
];
1501 dst_elt
->bits
[ix
] = r
;
1507 /* Copy a single element. */
1508 const bitmap_element
*src
;
1510 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1515 gcc_checking_assert (src
);
1516 changed
= bitmap_elt_copy (dst
, dst_elt
, dst_prev
, src
, changed
);
1522 /* DST = A | B. Return true if DST changes. */
1525 bitmap_ior (bitmap dst
, const_bitmap a
, const_bitmap b
)
1527 bitmap_element
*dst_elt
= dst
->first
;
1528 const bitmap_element
*a_elt
= a
->first
;
1529 const bitmap_element
*b_elt
= b
->first
;
1530 bitmap_element
*dst_prev
= NULL
;
1531 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1532 bool changed
= false;
1534 gcc_assert (dst
!= a
&& dst
!= b
);
1536 while (a_elt
|| b_elt
)
1538 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
, a_elt
, b_elt
, changed
);
1540 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1542 a_elt
= a_elt
->next
;
1543 b_elt
= b_elt
->next
;
1547 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
1548 a_elt
= a_elt
->next
;
1549 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
1550 b_elt
= b_elt
->next
;
1553 dst_prev
= *dst_prev_pnext
;
1554 dst_prev_pnext
= &dst_prev
->next
;
1555 dst_elt
= *dst_prev_pnext
;
1561 bitmap_elt_clear_from (dst
, dst_elt
);
1563 gcc_checking_assert (!dst
->current
== !dst
->first
);
1565 dst
->indx
= dst
->current
->indx
;
1569 /* A |= B. Return true if A changes. */
1572 bitmap_ior_into (bitmap a
, const_bitmap b
)
1574 bitmap_element
*a_elt
= a
->first
;
1575 const bitmap_element
*b_elt
= b
->first
;
1576 bitmap_element
*a_prev
= NULL
;
1577 bitmap_element
**a_prev_pnext
= &a
->first
;
1578 bool changed
= false;
1585 /* If A lags behind B, just advance it. */
1586 if (!a_elt
|| a_elt
->indx
== b_elt
->indx
)
1588 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, b_elt
, changed
);
1589 b_elt
= b_elt
->next
;
1591 else if (a_elt
->indx
> b_elt
->indx
)
1593 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, b_elt
, changed
);
1594 b_elt
= b_elt
->next
;
1597 a_prev
= *a_prev_pnext
;
1598 a_prev_pnext
= &a_prev
->next
;
1599 a_elt
= *a_prev_pnext
;
1602 gcc_checking_assert (!a
->current
== !a
->first
);
1604 a
->indx
= a
->current
->indx
;
1611 bitmap_xor (bitmap dst
, const_bitmap a
, const_bitmap b
)
1613 bitmap_element
*dst_elt
= dst
->first
;
1614 const bitmap_element
*a_elt
= a
->first
;
1615 const bitmap_element
*b_elt
= b
->first
;
1616 bitmap_element
*dst_prev
= NULL
;
1618 gcc_assert (dst
!= a
&& dst
!= b
);
1625 while (a_elt
|| b_elt
)
1627 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1629 /* Matching elts, generate A ^ B. */
1631 BITMAP_WORD ior
= 0;
1634 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, a_elt
->indx
);
1636 dst_elt
->indx
= a_elt
->indx
;
1637 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1639 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
1642 dst_elt
->bits
[ix
] = r
;
1644 a_elt
= a_elt
->next
;
1645 b_elt
= b_elt
->next
;
1649 dst_elt
= dst_elt
->next
;
1654 /* Copy a single element. */
1655 const bitmap_element
*src
;
1657 if (!b_elt
|| (a_elt
&& a_elt
->indx
< b_elt
->indx
))
1660 a_elt
= a_elt
->next
;
1665 b_elt
= b_elt
->next
;
1669 dst_elt
= bitmap_elt_insert_after (dst
, dst_prev
, src
->indx
);
1671 dst_elt
->indx
= src
->indx
;
1672 memcpy (dst_elt
->bits
, src
->bits
, sizeof (dst_elt
->bits
));
1674 dst_elt
= dst_elt
->next
;
1677 /* Ensure that dst->current is valid. */
1678 dst
->current
= dst
->first
;
1679 bitmap_elt_clear_from (dst
, dst_elt
);
1680 gcc_checking_assert (!dst
->current
== !dst
->first
);
1682 dst
->indx
= dst
->current
->indx
;
1688 bitmap_xor_into (bitmap a
, const_bitmap b
)
1690 bitmap_element
*a_elt
= a
->first
;
1691 const bitmap_element
*b_elt
= b
->first
;
1692 bitmap_element
*a_prev
= NULL
;
1702 if (!a_elt
|| b_elt
->indx
< a_elt
->indx
)
1705 bitmap_element
*dst
= bitmap_elt_insert_after (a
, a_prev
, b_elt
->indx
);
1706 memcpy (dst
->bits
, b_elt
->bits
, sizeof (dst
->bits
));
1708 b_elt
= b_elt
->next
;
1710 else if (a_elt
->indx
< b_elt
->indx
)
1713 a_elt
= a_elt
->next
;
1717 /* Matching elts, generate A ^= B. */
1719 BITMAP_WORD ior
= 0;
1720 bitmap_element
*next
= a_elt
->next
;
1722 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1724 BITMAP_WORD r
= a_elt
->bits
[ix
] ^ b_elt
->bits
[ix
];
1727 a_elt
->bits
[ix
] = r
;
1729 b_elt
= b_elt
->next
;
1733 bitmap_element_free (a
, a_elt
);
1737 gcc_checking_assert (!a
->current
== !a
->first
);
1739 a
->indx
= a
->current
->indx
;
1742 /* Return true if two bitmaps are identical.
1743 We do not bother with a check for pointer equality, as that never
1744 occurs in practice. */
1747 bitmap_equal_p (const_bitmap a
, const_bitmap b
)
1749 const bitmap_element
*a_elt
;
1750 const bitmap_element
*b_elt
;
1753 for (a_elt
= a
->first
, b_elt
= b
->first
;
1755 a_elt
= a_elt
->next
, b_elt
= b_elt
->next
)
1757 if (a_elt
->indx
!= b_elt
->indx
)
1759 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1760 if (a_elt
->bits
[ix
] != b_elt
->bits
[ix
])
1763 return !a_elt
&& !b_elt
;
1766 /* Return true if A AND B is not empty. */
1769 bitmap_intersect_p (const_bitmap a
, const_bitmap b
)
1771 const bitmap_element
*a_elt
;
1772 const bitmap_element
*b_elt
;
1775 for (a_elt
= a
->first
, b_elt
= b
->first
;
1778 if (a_elt
->indx
< b_elt
->indx
)
1779 a_elt
= a_elt
->next
;
1780 else if (b_elt
->indx
< a_elt
->indx
)
1781 b_elt
= b_elt
->next
;
1784 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1785 if (a_elt
->bits
[ix
] & b_elt
->bits
[ix
])
1787 a_elt
= a_elt
->next
;
1788 b_elt
= b_elt
->next
;
1794 /* Return true if A AND NOT B is not empty. */
1797 bitmap_intersect_compl_p (const_bitmap a
, const_bitmap b
)
1799 const bitmap_element
*a_elt
;
1800 const bitmap_element
*b_elt
;
1802 for (a_elt
= a
->first
, b_elt
= b
->first
;
1805 if (a_elt
->indx
< b_elt
->indx
)
1807 else if (b_elt
->indx
< a_elt
->indx
)
1808 b_elt
= b_elt
->next
;
1811 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1812 if (a_elt
->bits
[ix
] & ~b_elt
->bits
[ix
])
1814 a_elt
= a_elt
->next
;
1815 b_elt
= b_elt
->next
;
1818 return a_elt
!= NULL
;
1822 /* DST = A | (FROM1 & ~FROM2). Return true if DST changes. */
1825 bitmap_ior_and_compl (bitmap dst
, const_bitmap a
, const_bitmap b
, const_bitmap kill
)
1827 bool changed
= false;
1829 bitmap_element
*dst_elt
= dst
->first
;
1830 const bitmap_element
*a_elt
= a
->first
;
1831 const bitmap_element
*b_elt
= b
->first
;
1832 const bitmap_element
*kill_elt
= kill
->first
;
1833 bitmap_element
*dst_prev
= NULL
;
1834 bitmap_element
**dst_prev_pnext
= &dst
->first
;
1836 gcc_assert (dst
!= a
&& dst
!= b
&& dst
!= kill
);
1838 /* Special cases. We don't bother checking for bitmap_equal_p (b, kill). */
1839 if (b
== kill
|| bitmap_empty_p (b
))
1841 changed
= !bitmap_equal_p (dst
, a
);
1843 bitmap_copy (dst
, a
);
1846 if (bitmap_empty_p (kill
))
1847 return bitmap_ior (dst
, a
, b
);
1848 if (bitmap_empty_p (a
))
1849 return bitmap_and_compl (dst
, b
, kill
);
1851 while (a_elt
|| b_elt
)
1853 bool new_element
= false;
1856 while (kill_elt
&& kill_elt
->indx
< b_elt
->indx
)
1857 kill_elt
= kill_elt
->next
;
1859 if (b_elt
&& kill_elt
&& kill_elt
->indx
== b_elt
->indx
1860 && (!a_elt
|| a_elt
->indx
>= b_elt
->indx
))
1862 bitmap_element tmp_elt
;
1865 BITMAP_WORD ior
= 0;
1866 tmp_elt
.indx
= b_elt
->indx
;
1867 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1869 BITMAP_WORD r
= b_elt
->bits
[ix
] & ~kill_elt
->bits
[ix
];
1871 tmp_elt
.bits
[ix
] = r
;
1876 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1877 a_elt
, &tmp_elt
, changed
);
1879 if (a_elt
&& a_elt
->indx
== b_elt
->indx
)
1880 a_elt
= a_elt
->next
;
1883 b_elt
= b_elt
->next
;
1884 kill_elt
= kill_elt
->next
;
1888 changed
= bitmap_elt_ior (dst
, dst_elt
, dst_prev
,
1889 a_elt
, b_elt
, changed
);
1892 if (a_elt
&& b_elt
&& a_elt
->indx
== b_elt
->indx
)
1894 a_elt
= a_elt
->next
;
1895 b_elt
= b_elt
->next
;
1899 if (a_elt
&& (!b_elt
|| a_elt
->indx
<= b_elt
->indx
))
1900 a_elt
= a_elt
->next
;
1901 else if (b_elt
&& (!a_elt
|| b_elt
->indx
<= a_elt
->indx
))
1902 b_elt
= b_elt
->next
;
1908 dst_prev
= *dst_prev_pnext
;
1909 dst_prev_pnext
= &dst_prev
->next
;
1910 dst_elt
= *dst_prev_pnext
;
1917 bitmap_elt_clear_from (dst
, dst_elt
);
1919 gcc_checking_assert (!dst
->current
== !dst
->first
);
1921 dst
->indx
= dst
->current
->indx
;
1926 /* A |= (FROM1 & ~FROM2). Return true if A changes. */
1929 bitmap_ior_and_compl_into (bitmap a
, const_bitmap from1
, const_bitmap from2
)
1934 bitmap_initialize (&tmp
, &bitmap_default_obstack
);
1935 bitmap_and_compl (&tmp
, from1
, from2
);
1936 changed
= bitmap_ior_into (a
, &tmp
);
1937 bitmap_clear (&tmp
);
1942 /* A |= (B & C). Return true if A changes. */
1945 bitmap_ior_and_into (bitmap a
, const_bitmap b
, const_bitmap c
)
1947 bitmap_element
*a_elt
= a
->first
;
1948 const bitmap_element
*b_elt
= b
->first
;
1949 const bitmap_element
*c_elt
= c
->first
;
1950 bitmap_element and_elt
;
1951 bitmap_element
*a_prev
= NULL
;
1952 bitmap_element
**a_prev_pnext
= &a
->first
;
1953 bool changed
= false;
1957 return bitmap_ior_into (a
, b
);
1958 if (bitmap_empty_p (b
) || bitmap_empty_p (c
))
1962 while (b_elt
&& c_elt
)
1964 BITMAP_WORD overall
;
1966 /* Find a common item of B and C. */
1967 while (b_elt
->indx
!= c_elt
->indx
)
1969 if (b_elt
->indx
< c_elt
->indx
)
1971 b_elt
= b_elt
->next
;
1977 c_elt
= c_elt
->next
;
1984 and_elt
.indx
= b_elt
->indx
;
1985 for (ix
= 0; ix
< BITMAP_ELEMENT_WORDS
; ix
++)
1987 and_elt
.bits
[ix
] = b_elt
->bits
[ix
] & c_elt
->bits
[ix
];
1988 overall
|= and_elt
.bits
[ix
];
1991 b_elt
= b_elt
->next
;
1992 c_elt
= c_elt
->next
;
1996 /* Now find a place to insert AND_ELT. */
1999 ix
= a_elt
? a_elt
->indx
: and_elt
.indx
;
2000 if (ix
== and_elt
.indx
)
2001 changed
= bitmap_elt_ior (a
, a_elt
, a_prev
, a_elt
, &and_elt
, changed
);
2002 else if (ix
> and_elt
.indx
)
2003 changed
= bitmap_elt_copy (a
, NULL
, a_prev
, &and_elt
, changed
);
2005 a_prev
= *a_prev_pnext
;
2006 a_prev_pnext
= &a_prev
->next
;
2007 a_elt
= *a_prev_pnext
;
2009 /* If A lagged behind B/C, we advanced it so loop once more. */
2011 while (ix
< and_elt
.indx
);
2015 gcc_checking_assert (!a
->current
== !a
->first
);
2017 a
->indx
= a
->current
->indx
;
2021 /* Compute hash of bitmap (for purposes of hashing). */
2023 bitmap_hash (const_bitmap head
)
2025 const bitmap_element
*ptr
;
2026 BITMAP_WORD hash
= 0;
2029 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2032 for (ix
= 0; ix
!= BITMAP_ELEMENT_WORDS
; ix
++)
2033 hash
^= ptr
->bits
[ix
];
2035 return (hashval_t
)hash
;
2039 /* Debugging function to print out the contents of a bitmap. */
2042 debug_bitmap_file (FILE *file
, const_bitmap head
)
2044 const bitmap_element
*ptr
;
2046 fprintf (file
, "\nfirst = " HOST_PTR_PRINTF
2047 " current = " HOST_PTR_PRINTF
" indx = %u\n",
2048 (void *) head
->first
, (void *) head
->current
, head
->indx
);
2050 for (ptr
= head
->first
; ptr
; ptr
= ptr
->next
)
2052 unsigned int i
, j
, col
= 26;
2054 fprintf (file
, "\t" HOST_PTR_PRINTF
" next = " HOST_PTR_PRINTF
2055 " prev = " HOST_PTR_PRINTF
" indx = %u\n\t\tbits = {",
2056 (const void*) ptr
, (const void*) ptr
->next
,
2057 (const void*) ptr
->prev
, ptr
->indx
);
2059 for (i
= 0; i
< BITMAP_ELEMENT_WORDS
; i
++)
2060 for (j
= 0; j
< BITMAP_WORD_BITS
; j
++)
2061 if ((ptr
->bits
[i
] >> j
) & 1)
2065 fprintf (file
, "\n\t\t\t");
2069 fprintf (file
, " %u", (ptr
->indx
* BITMAP_ELEMENT_ALL_BITS
2070 + i
* BITMAP_WORD_BITS
+ j
));
2074 fprintf (file
, " }\n");
2078 /* Function to be called from the debugger to print the contents
2082 debug_bitmap (const_bitmap head
)
2084 debug_bitmap_file (stdout
, head
);
2087 /* Function to print out the contents of a bitmap. Unlike debug_bitmap_file,
2088 it does not print anything but the bits. */
2091 bitmap_print (FILE *file
, const_bitmap head
, const char *prefix
, const char *suffix
)
2093 const char *comma
= "";
2097 fputs (prefix
, file
);
2098 EXECUTE_IF_SET_IN_BITMAP (head
, 0, i
, bi
)
2100 fprintf (file
, "%s%d", comma
, i
);
2103 fputs (suffix
, file
);
2107 /* Used to accumulate statistics about bitmap sizes. */
2110 HOST_WIDEST_INT size
;
2114 /* Called via htab_traverse. Output bitmap descriptor pointed out by SLOT
2115 and update statistics. */
2117 print_statistics (void **slot
, void *b
)
2119 struct bitmap_descriptor
*d
= (struct bitmap_descriptor
*) *slot
;
2120 struct output_info
*i
= (struct output_info
*) b
;
2125 const char *s1
= d
->file
;
2127 while ((s2
= strstr (s1
, "gcc/")))
2129 sprintf (s
, "%s:%i (%s)", s1
, d
->line
, d
->function
);
2131 fprintf (stderr
, "%-41s %8d %15"HOST_WIDEST_INT_PRINT
"d %15"
2132 HOST_WIDEST_INT_PRINT
"d %15"HOST_WIDEST_INT_PRINT
"d %10d %10d\n",
2133 s
, d
->created
, d
->allocated
, d
->peak
, d
->current
, d
->nsearches
,
2135 i
->size
+= d
->allocated
;
2136 i
->count
+= d
->created
;
2141 /* Output per-bitmap memory usage statistics. */
2143 dump_bitmap_statistics (void)
2145 struct output_info info
;
2147 if (! GATHER_STATISTICS
)
2150 if (!bitmap_desc_hash
)
2153 fprintf (stderr
, "\nBitmap Overall "
2154 " Allocated Peak Leak searched "
2156 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2159 htab_traverse (bitmap_desc_hash
, print_statistics
, &info
);
2160 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2161 fprintf (stderr
, "%-40s %9d %15"HOST_WIDEST_INT_PRINT
"d\n",
2162 "Total", info
.count
, info
.size
);
2163 fprintf (stderr
, "---------------------------------------------------------------------------------\n");
2166 #include "gt-bitmap.h"