]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/bitmap.c
alloc-pool.c (alloc_pool_descriptor): Use an insert_opion value instead of an int.
[thirdparty/gcc.git] / gcc / bitmap.c
1 /* Functions to support general ended bitmaps.
2 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
3 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "flags.h"
27 #include "obstack.h"
28 #include "ggc.h"
29 #include "bitmap.h"
30 #include "hashtab.h"
31
32 #ifdef GATHER_STATISTICS
33
34 /* Store information about each particular bitmap. */
35 struct bitmap_descriptor
36 {
37 const char *function;
38 const char *file;
39 int line;
40 int allocated;
41 int created;
42 int peak;
43 int current;
44 int nsearches;
45 };
46
47 /* Hashtable mapping bitmap names to descriptors. */
48 static htab_t bitmap_desc_hash;
49
50 /* Hashtable helpers. */
51 static hashval_t
52 hash_descriptor (const void *p)
53 {
54 const struct bitmap_descriptor *const d =
55 (const struct bitmap_descriptor *) p;
56 return htab_hash_pointer (d->file) + d->line;
57 }
58 struct loc
59 {
60 const char *file;
61 const char *function;
62 int line;
63 };
64 static int
65 eq_descriptor (const void *p1, const void *p2)
66 {
67 const struct bitmap_descriptor *const d =
68 (const struct bitmap_descriptor *) p1;
69 const struct loc *const l = (const struct loc *) p2;
70 return d->file == l->file && d->function == l->function && d->line == l->line;
71 }
72
73 /* For given file and line, return descriptor, create new if needed. */
74 static struct bitmap_descriptor *
75 bitmap_descriptor (const char *file, const char *function, int line)
76 {
77 struct bitmap_descriptor **slot;
78 struct loc loc;
79
80 loc.file = file;
81 loc.function = function;
82 loc.line = line;
83
84 if (!bitmap_desc_hash)
85 bitmap_desc_hash = htab_create (10, hash_descriptor, eq_descriptor, NULL);
86
87 slot = (struct bitmap_descriptor **)
88 htab_find_slot_with_hash (bitmap_desc_hash, &loc,
89 htab_hash_pointer (file) + line,
90 INSERT);
91 if (*slot)
92 return *slot;
93 *slot = XCNEW (struct bitmap_descriptor);
94 (*slot)->file = file;
95 (*slot)->function = function;
96 (*slot)->line = line;
97 return *slot;
98 }
99
100 /* Register new bitmap. */
101 void
102 bitmap_register (bitmap b MEM_STAT_DECL)
103 {
104 b->desc = bitmap_descriptor (_loc_name, _loc_function, _loc_line);
105 b->desc->created++;
106 }
107
108 /* Account the overhead. */
109 static void
110 register_overhead (bitmap b, int amount)
111 {
112 b->desc->current += amount;
113 if (amount > 0)
114 b->desc->allocated += amount;
115 gcc_assert (b->desc->current >= 0);
116 if (b->desc->peak < b->desc->current)
117 b->desc->peak = b->desc->current;
118 }
119 #endif
120
121 /* Global data */
122 bitmap_element bitmap_zero_bits; /* An element of all zero bits. */
123 bitmap_obstack bitmap_default_obstack; /* The default bitmap obstack. */
124 static int bitmap_default_obstack_depth;
125 static GTY((deletable)) bitmap_element *bitmap_ggc_free; /* Freelist of
126 GC'd elements. */
127
128 static void bitmap_elem_to_freelist (bitmap, bitmap_element *);
129 static void bitmap_element_free (bitmap, bitmap_element *);
130 static bitmap_element *bitmap_element_allocate (bitmap);
131 static int bitmap_element_zerop (const bitmap_element *);
132 static void bitmap_element_link (bitmap, bitmap_element *);
133 static bitmap_element *bitmap_elt_insert_after (bitmap, bitmap_element *, unsigned int);
134 static void bitmap_elt_clear_from (bitmap, bitmap_element *);
135 static bitmap_element *bitmap_find_bit (bitmap, unsigned int);
136 \f
137
138 /* Add ELEM to the appropriate freelist. */
139 static inline void
140 bitmap_elem_to_freelist (bitmap head, bitmap_element *elt)
141 {
142 bitmap_obstack *bit_obstack = head->obstack;
143
144 elt->next = NULL;
145 if (bit_obstack)
146 {
147 elt->prev = bit_obstack->elements;
148 bit_obstack->elements = elt;
149 }
150 else
151 {
152 elt->prev = bitmap_ggc_free;
153 bitmap_ggc_free = elt;
154 }
155 }
156
157 /* Free a bitmap element. Since these are allocated off the
158 bitmap_obstack, "free" actually means "put onto the freelist". */
159
160 static inline void
161 bitmap_element_free (bitmap head, bitmap_element *elt)
162 {
163 bitmap_element *next = elt->next;
164 bitmap_element *prev = elt->prev;
165
166 if (prev)
167 prev->next = next;
168
169 if (next)
170 next->prev = prev;
171
172 if (head->first == elt)
173 head->first = next;
174
175 /* Since the first thing we try is to insert before current,
176 make current the next entry in preference to the previous. */
177 if (head->current == elt)
178 {
179 head->current = next != 0 ? next : prev;
180 if (head->current)
181 head->indx = head->current->indx;
182 else
183 head->indx = 0;
184 }
185 #ifdef GATHER_STATISTICS
186 register_overhead (head, -((int)sizeof (bitmap_element)));
187 #endif
188 bitmap_elem_to_freelist (head, elt);
189 }
190 \f
191 /* Allocate a bitmap element. The bits are cleared, but nothing else is. */
192
193 static inline bitmap_element *
194 bitmap_element_allocate (bitmap head)
195 {
196 bitmap_element *element;
197 bitmap_obstack *bit_obstack = head->obstack;
198
199 if (bit_obstack)
200 {
201 element = bit_obstack->elements;
202
203 if (element)
204 /* Use up the inner list first before looking at the next
205 element of the outer list. */
206 if (element->next)
207 {
208 bit_obstack->elements = element->next;
209 bit_obstack->elements->prev = element->prev;
210 }
211 else
212 /* Inner list was just a singleton. */
213 bit_obstack->elements = element->prev;
214 else
215 element = XOBNEW (&bit_obstack->obstack, bitmap_element);
216 }
217 else
218 {
219 element = bitmap_ggc_free;
220 if (element)
221 /* Use up the inner list first before looking at the next
222 element of the outer list. */
223 if (element->next)
224 {
225 bitmap_ggc_free = element->next;
226 bitmap_ggc_free->prev = element->prev;
227 }
228 else
229 /* Inner list was just a singleton. */
230 bitmap_ggc_free = element->prev;
231 else
232 element = GGC_NEW (bitmap_element);
233 }
234
235 #ifdef GATHER_STATISTICS
236 register_overhead (head, sizeof (bitmap_element));
237 #endif
238 memset (element->bits, 0, sizeof (element->bits));
239
240 return element;
241 }
242
243 /* Remove ELT and all following elements from bitmap HEAD. */
244
245 void
246 bitmap_elt_clear_from (bitmap head, bitmap_element *elt)
247 {
248 bitmap_element *prev;
249 bitmap_obstack *bit_obstack = head->obstack;
250 #ifdef GATHER_STATISTICS
251 int n;
252 #endif
253
254 if (!elt) return;
255 #ifdef GATHER_STATISTICS
256 n = 0;
257 for (prev = elt; prev; prev = prev->next)
258 n++;
259 register_overhead (head, -sizeof (bitmap_element) * n);
260 #endif
261
262 prev = elt->prev;
263 if (prev)
264 {
265 prev->next = NULL;
266 if (head->current->indx > prev->indx)
267 {
268 head->current = prev;
269 head->indx = prev->indx;
270 }
271 }
272 else
273 {
274 head->first = NULL;
275 head->current = NULL;
276 head->indx = 0;
277 }
278
279 /* Put the entire list onto the free list in one operation. */
280 if (bit_obstack)
281 {
282 elt->prev = bit_obstack->elements;
283 bit_obstack->elements = elt;
284 }
285 else
286 {
287 elt->prev = bitmap_ggc_free;
288 bitmap_ggc_free = elt;
289 }
290 }
291
292 /* Clear a bitmap by freeing the linked list. */
293
294 inline void
295 bitmap_clear (bitmap head)
296 {
297 if (head->first)
298 bitmap_elt_clear_from (head, head->first);
299 }
300 \f
301 /* Initialize a bitmap obstack. If BIT_OBSTACK is NULL, initialize
302 the default bitmap obstack. */
303
304 void
305 bitmap_obstack_initialize (bitmap_obstack *bit_obstack)
306 {
307 if (!bit_obstack)
308 {
309 if (bitmap_default_obstack_depth++)
310 return;
311 bit_obstack = &bitmap_default_obstack;
312 }
313
314 #if !defined(__GNUC__) || (__GNUC__ < 2)
315 #define __alignof__(type) 0
316 #endif
317
318 bit_obstack->elements = NULL;
319 bit_obstack->heads = NULL;
320 obstack_specify_allocation (&bit_obstack->obstack, OBSTACK_CHUNK_SIZE,
321 __alignof__ (bitmap_element),
322 obstack_chunk_alloc,
323 obstack_chunk_free);
324 }
325
326 /* Release the memory from a bitmap obstack. If BIT_OBSTACK is NULL,
327 release the default bitmap obstack. */
328
329 void
330 bitmap_obstack_release (bitmap_obstack *bit_obstack)
331 {
332 if (!bit_obstack)
333 {
334 if (--bitmap_default_obstack_depth)
335 {
336 gcc_assert (bitmap_default_obstack_depth > 0);
337 return;
338 }
339 bit_obstack = &bitmap_default_obstack;
340 }
341
342 bit_obstack->elements = NULL;
343 bit_obstack->heads = NULL;
344 obstack_free (&bit_obstack->obstack, NULL);
345 }
346
347 /* Create a new bitmap on an obstack. If BIT_OBSTACK is NULL, create
348 it on the default bitmap obstack. */
349
350 bitmap
351 bitmap_obstack_alloc_stat (bitmap_obstack *bit_obstack MEM_STAT_DECL)
352 {
353 bitmap map;
354
355 if (!bit_obstack)
356 bit_obstack = &bitmap_default_obstack;
357 map = bit_obstack->heads;
358 if (map)
359 bit_obstack->heads = (struct bitmap_head_def *) map->first;
360 else
361 map = XOBNEW (&bit_obstack->obstack, bitmap_head);
362 bitmap_initialize_stat (map, bit_obstack PASS_MEM_STAT);
363 #ifdef GATHER_STATISTICS
364 register_overhead (map, sizeof (bitmap_head));
365 #endif
366
367 return map;
368 }
369
370 /* Create a new GCd bitmap. */
371
372 bitmap
373 bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL)
374 {
375 bitmap map;
376
377 map = GGC_NEW (struct bitmap_head_def);
378 bitmap_initialize_stat (map, NULL PASS_MEM_STAT);
379 #ifdef GATHER_STATISTICS
380 register_overhead (map, sizeof (bitmap_head));
381 #endif
382
383 return map;
384 }
385
386 /* Release an obstack allocated bitmap. */
387
388 void
389 bitmap_obstack_free (bitmap map)
390 {
391 if (map)
392 {
393 bitmap_clear (map);
394 map->first = (bitmap_element *) map->obstack->heads;
395 #ifdef GATHER_STATISTICS
396 register_overhead (map, -((int)sizeof (bitmap_head)));
397 #endif
398 map->obstack->heads = map;
399 }
400 }
401
402 \f
403 /* Return nonzero if all bits in an element are zero. */
404
405 static inline int
406 bitmap_element_zerop (const bitmap_element *element)
407 {
408 #if BITMAP_ELEMENT_WORDS == 2
409 return (element->bits[0] | element->bits[1]) == 0;
410 #else
411 unsigned i;
412
413 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
414 if (element->bits[i] != 0)
415 return 0;
416
417 return 1;
418 #endif
419 }
420 \f
421 /* Link the bitmap element into the current bitmap linked list. */
422
423 static inline void
424 bitmap_element_link (bitmap head, bitmap_element *element)
425 {
426 unsigned int indx = element->indx;
427 bitmap_element *ptr;
428
429 /* If this is the first and only element, set it in. */
430 if (head->first == 0)
431 {
432 element->next = element->prev = 0;
433 head->first = element;
434 }
435
436 /* If this index is less than that of the current element, it goes someplace
437 before the current element. */
438 else if (indx < head->indx)
439 {
440 for (ptr = head->current;
441 ptr->prev != 0 && ptr->prev->indx > indx;
442 ptr = ptr->prev)
443 ;
444
445 if (ptr->prev)
446 ptr->prev->next = element;
447 else
448 head->first = element;
449
450 element->prev = ptr->prev;
451 element->next = ptr;
452 ptr->prev = element;
453 }
454
455 /* Otherwise, it must go someplace after the current element. */
456 else
457 {
458 for (ptr = head->current;
459 ptr->next != 0 && ptr->next->indx < indx;
460 ptr = ptr->next)
461 ;
462
463 if (ptr->next)
464 ptr->next->prev = element;
465
466 element->next = ptr->next;
467 element->prev = ptr;
468 ptr->next = element;
469 }
470
471 /* Set up so this is the first element searched. */
472 head->current = element;
473 head->indx = indx;
474 }
475
476 /* Insert a new uninitialized element into bitmap HEAD after element
477 ELT. If ELT is NULL, insert the element at the start. Return the
478 new element. */
479
480 static bitmap_element *
481 bitmap_elt_insert_after (bitmap head, bitmap_element *elt, unsigned int indx)
482 {
483 bitmap_element *node = bitmap_element_allocate (head);
484 node->indx = indx;
485
486 if (!elt)
487 {
488 if (!head->current)
489 {
490 head->current = node;
491 head->indx = indx;
492 }
493 node->next = head->first;
494 if (node->next)
495 node->next->prev = node;
496 head->first = node;
497 node->prev = NULL;
498 }
499 else
500 {
501 gcc_assert (head->current);
502 node->next = elt->next;
503 if (node->next)
504 node->next->prev = node;
505 elt->next = node;
506 node->prev = elt;
507 }
508 return node;
509 }
510 \f
511 /* Copy a bitmap to another bitmap. */
512
513 void
514 bitmap_copy (bitmap to, const_bitmap from)
515 {
516 const bitmap_element *from_ptr;
517 bitmap_element *to_ptr = 0;
518
519 bitmap_clear (to);
520
521 /* Copy elements in forward direction one at a time. */
522 for (from_ptr = from->first; from_ptr; from_ptr = from_ptr->next)
523 {
524 bitmap_element *to_elt = bitmap_element_allocate (to);
525
526 to_elt->indx = from_ptr->indx;
527 memcpy (to_elt->bits, from_ptr->bits, sizeof (to_elt->bits));
528
529 /* Here we have a special case of bitmap_element_link, for the case
530 where we know the links are being entered in sequence. */
531 if (to_ptr == 0)
532 {
533 to->first = to->current = to_elt;
534 to->indx = from_ptr->indx;
535 to_elt->next = to_elt->prev = 0;
536 }
537 else
538 {
539 to_elt->prev = to_ptr;
540 to_elt->next = 0;
541 to_ptr->next = to_elt;
542 }
543
544 to_ptr = to_elt;
545 }
546 }
547 \f
548 /* Find a bitmap element that would hold a bitmap's bit.
549 Update the `current' field even if we can't find an element that
550 would hold the bitmap's bit to make eventual allocation
551 faster. */
552
553 static inline bitmap_element *
554 bitmap_find_bit (bitmap head, unsigned int bit)
555 {
556 bitmap_element *element;
557 unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
558
559 #ifdef GATHER_STATISTICS
560 head->desc->nsearches++;
561 #endif
562 if (head->current == 0
563 || head->indx == indx)
564 return head->current;
565
566 if (head->indx < indx)
567 /* INDX is beyond head->indx. Search from head->current
568 forward. */
569 for (element = head->current;
570 element->next != 0 && element->indx < indx;
571 element = element->next)
572 ;
573
574 else if (head->indx / 2 < indx)
575 /* INDX is less than head->indx and closer to head->indx than to
576 0. Search from head->current backward. */
577 for (element = head->current;
578 element->prev != 0 && element->indx > indx;
579 element = element->prev)
580 ;
581
582 else
583 /* INDX is less than head->indx and closer to 0 than to
584 head->indx. Search from head->first forward. */
585 for (element = head->first;
586 element->next != 0 && element->indx < indx;
587 element = element->next)
588 ;
589
590 /* `element' is the nearest to the one we want. If it's not the one we
591 want, the one we want doesn't exist. */
592 head->current = element;
593 head->indx = element->indx;
594 if (element != 0 && element->indx != indx)
595 element = 0;
596
597 return element;
598 }
599 \f
600 /* Clear a single bit in a bitmap. Return true if the bit changed. */
601
602 bool
603 bitmap_clear_bit (bitmap head, int bit)
604 {
605 bitmap_element *const ptr = bitmap_find_bit (head, bit);
606
607 if (ptr != 0)
608 {
609 unsigned bit_num = bit % BITMAP_WORD_BITS;
610 unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
611 BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
612 bool res = (ptr->bits[word_num] & bit_val) != 0;
613 if (res)
614 ptr->bits[word_num] &= ~bit_val;
615
616 /* If we cleared the entire word, free up the element. */
617 if (bitmap_element_zerop (ptr))
618 bitmap_element_free (head, ptr);
619
620 return res;
621 }
622
623 return false;
624 }
625
626 /* Set a single bit in a bitmap. Return true if the bit changed. */
627
628 bool
629 bitmap_set_bit (bitmap head, int bit)
630 {
631 bitmap_element *ptr = bitmap_find_bit (head, bit);
632 unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
633 unsigned bit_num = bit % BITMAP_WORD_BITS;
634 BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
635
636 if (ptr == 0)
637 {
638 ptr = bitmap_element_allocate (head);
639 ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
640 ptr->bits[word_num] = bit_val;
641 bitmap_element_link (head, ptr);
642 return true;
643 }
644 else
645 {
646 bool res = (ptr->bits[word_num] & bit_val) == 0;
647 if (res)
648 ptr->bits[word_num] |= bit_val;
649 return res;
650 }
651 }
652
653 /* Return whether a bit is set within a bitmap. */
654
655 int
656 bitmap_bit_p (bitmap head, int bit)
657 {
658 bitmap_element *ptr;
659 unsigned bit_num;
660 unsigned word_num;
661
662 ptr = bitmap_find_bit (head, bit);
663 if (ptr == 0)
664 return 0;
665
666 bit_num = bit % BITMAP_WORD_BITS;
667 word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
668
669 return (ptr->bits[word_num] >> bit_num) & 1;
670 }
671 \f
672 #if GCC_VERSION < 3400
673 /* Table of number of set bits in a character, indexed by value of char. */
674 static const unsigned char popcount_table[] =
675 {
676 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
677 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
678 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
679 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
680 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
681 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
682 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
683 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,
684 };
685
686 static unsigned long
687 bitmap_popcount (BITMAP_WORD a)
688 {
689 unsigned long ret = 0;
690 unsigned i;
691
692 /* Just do this the table way for now */
693 for (i = 0; i < BITMAP_WORD_BITS; i+= 8)
694 ret += popcount_table[(a >> i) & 0xff];
695 return ret;
696 }
697 #endif
698 /* Count the number of bits set in the bitmap, and return it. */
699
700 unsigned long
701 bitmap_count_bits (const_bitmap a)
702 {
703 unsigned long count = 0;
704 const bitmap_element *elt;
705 unsigned ix;
706
707 for (elt = a->first; elt; elt = elt->next)
708 {
709 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
710 {
711 #if GCC_VERSION >= 3400
712 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
713 of BITMAP_WORD is not material. */
714 count += __builtin_popcountl (elt->bits[ix]);
715 #else
716 count += bitmap_popcount (elt->bits[ix]);
717 #endif
718 }
719 }
720 return count;
721 }
722
723 /* Return true if the bitmap has a single bit set. Otherwise return
724 false. */
725
726 bool
727 bitmap_single_bit_set_p (const_bitmap a)
728 {
729 unsigned long count = 0;
730 const bitmap_element *elt;
731 unsigned ix;
732
733 if (bitmap_empty_p (a))
734 return false;
735
736 elt = a->first;
737 /* As there are no completely empty bitmap elements, a second one
738 means we have more than one bit set. */
739 if (elt->next != NULL)
740 return false;
741
742 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
743 {
744 #if GCC_VERSION >= 3400
745 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
746 of BITMAP_WORD is not material. */
747 count += __builtin_popcountl (elt->bits[ix]);
748 #else
749 count += bitmap_popcount (elt->bits[ix]);
750 #endif
751 if (count > 1)
752 return false;
753 }
754
755 return count == 1;
756 }
757
758
759 /* Return the bit number of the first set bit in the bitmap. The
760 bitmap must be non-empty. */
761
762 unsigned
763 bitmap_first_set_bit (const_bitmap a)
764 {
765 const bitmap_element *elt = a->first;
766 unsigned bit_no;
767 BITMAP_WORD word;
768 unsigned ix;
769
770 gcc_assert (elt);
771 bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
772 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
773 {
774 word = elt->bits[ix];
775 if (word)
776 goto found_bit;
777 }
778 gcc_unreachable ();
779 found_bit:
780 bit_no += ix * BITMAP_WORD_BITS;
781
782 #if GCC_VERSION >= 3004
783 gcc_assert (sizeof(long) == sizeof (word));
784 bit_no += __builtin_ctzl (word);
785 #else
786 /* Binary search for the first set bit. */
787 #if BITMAP_WORD_BITS > 64
788 #error "Fill out the table."
789 #endif
790 #if BITMAP_WORD_BITS > 32
791 if (!(word & 0xffffffff))
792 word >>= 32, bit_no += 32;
793 #endif
794 if (!(word & 0xffff))
795 word >>= 16, bit_no += 16;
796 if (!(word & 0xff))
797 word >>= 8, bit_no += 8;
798 if (!(word & 0xf))
799 word >>= 4, bit_no += 4;
800 if (!(word & 0x3))
801 word >>= 2, bit_no += 2;
802 if (!(word & 0x1))
803 word >>= 1, bit_no += 1;
804
805 gcc_assert (word & 1);
806 #endif
807 return bit_no;
808 }
809
810 /* Return the bit number of the first set bit in the bitmap. The
811 bitmap must be non-empty. */
812
813 unsigned
814 bitmap_last_set_bit (const_bitmap a)
815 {
816 const bitmap_element *elt = a->current ? a->current : a->first;
817 unsigned bit_no;
818 BITMAP_WORD word;
819 int ix;
820
821 gcc_assert (elt);
822 while (elt->next)
823 elt = elt->next;
824 bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
825 for (ix = BITMAP_ELEMENT_WORDS - 1; ix >= 0; ix--)
826 {
827 word = elt->bits[ix];
828 if (word)
829 goto found_bit;
830 }
831 gcc_unreachable ();
832 found_bit:
833 bit_no += ix * BITMAP_WORD_BITS;
834
835 /* Binary search for the last set bit. */
836 #if GCC_VERSION >= 3004
837 gcc_assert (sizeof(long) == sizeof (word));
838 bit_no += sizeof (long) * 8 - __builtin_ctzl (word);
839 #else
840 #if BITMAP_WORD_BITS > 64
841 #error "Fill out the table."
842 #endif
843 #if BITMAP_WORD_BITS > 32
844 if ((word & 0xffffffff00000000))
845 word >>= 32, bit_no += 32;
846 #endif
847 if (word & 0xffff0000)
848 word >>= 16, bit_no += 16;
849 if (!(word & 0xff00))
850 word >>= 8, bit_no += 8;
851 if (!(word & 0xf0))
852 word >>= 4, bit_no += 4;
853 if (!(word & 12))
854 word >>= 2, bit_no += 2;
855 if (!(word & 2))
856 word >>= 1, bit_no += 1;
857 #endif
858
859 gcc_assert (word & 1);
860 return bit_no;
861 }
862 \f
863
864 /* DST = A & B. */
865
866 void
867 bitmap_and (bitmap dst, const_bitmap a, const_bitmap b)
868 {
869 bitmap_element *dst_elt = dst->first;
870 const bitmap_element *a_elt = a->first;
871 const bitmap_element *b_elt = b->first;
872 bitmap_element *dst_prev = NULL;
873
874 gcc_assert (dst != a && dst != b);
875
876 if (a == b)
877 {
878 bitmap_copy (dst, a);
879 return;
880 }
881
882 while (a_elt && b_elt)
883 {
884 if (a_elt->indx < b_elt->indx)
885 a_elt = a_elt->next;
886 else if (b_elt->indx < a_elt->indx)
887 b_elt = b_elt->next;
888 else
889 {
890 /* Matching elts, generate A & B. */
891 unsigned ix;
892 BITMAP_WORD ior = 0;
893
894 if (!dst_elt)
895 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
896 else
897 dst_elt->indx = a_elt->indx;
898 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
899 {
900 BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
901
902 dst_elt->bits[ix] = r;
903 ior |= r;
904 }
905 if (ior)
906 {
907 dst_prev = dst_elt;
908 dst_elt = dst_elt->next;
909 }
910 a_elt = a_elt->next;
911 b_elt = b_elt->next;
912 }
913 }
914 /* Ensure that dst->current is valid. */
915 dst->current = dst->first;
916 bitmap_elt_clear_from (dst, dst_elt);
917 gcc_assert (!dst->current == !dst->first);
918 if (dst->current)
919 dst->indx = dst->current->indx;
920 }
921
922 /* A &= B. */
923
924 void
925 bitmap_and_into (bitmap a, const_bitmap b)
926 {
927 bitmap_element *a_elt = a->first;
928 const bitmap_element *b_elt = b->first;
929 bitmap_element *next;
930
931 if (a == b)
932 return;
933
934 while (a_elt && b_elt)
935 {
936 if (a_elt->indx < b_elt->indx)
937 {
938 next = a_elt->next;
939 bitmap_element_free (a, a_elt);
940 a_elt = next;
941 }
942 else if (b_elt->indx < a_elt->indx)
943 b_elt = b_elt->next;
944 else
945 {
946 /* Matching elts, generate A &= B. */
947 unsigned ix;
948 BITMAP_WORD ior = 0;
949
950 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
951 {
952 BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
953
954 a_elt->bits[ix] = r;
955 ior |= r;
956 }
957 next = a_elt->next;
958 if (!ior)
959 bitmap_element_free (a, a_elt);
960 a_elt = next;
961 b_elt = b_elt->next;
962 }
963 }
964 bitmap_elt_clear_from (a, a_elt);
965 gcc_assert (!a->current == !a->first);
966 gcc_assert (!a->current || a->indx == a->current->indx);
967 }
968
969
970 /* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
971 if non-NULL. CHANGED is true if the destination bitmap had already been
972 changed; the new value of CHANGED is returned. */
973
974 static inline bool
975 bitmap_elt_copy (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
976 const bitmap_element *src_elt, bool changed)
977 {
978 if (!changed && dst_elt && dst_elt->indx == src_elt->indx)
979 {
980 unsigned ix;
981
982 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
983 if (src_elt->bits[ix] != dst_elt->bits[ix])
984 {
985 dst_elt->bits[ix] = src_elt->bits[ix];
986 changed = true;
987 }
988 }
989 else
990 {
991 changed = true;
992 if (!dst_elt)
993 dst_elt = bitmap_elt_insert_after (dst, dst_prev, src_elt->indx);
994 else
995 dst_elt->indx = src_elt->indx;
996 memcpy (dst_elt->bits, src_elt->bits, sizeof (dst_elt->bits));
997 }
998 return changed;
999 }
1000
1001
1002
1003 /* DST = A & ~B */
1004
1005 bool
1006 bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
1007 {
1008 bitmap_element *dst_elt = dst->first;
1009 const bitmap_element *a_elt = a->first;
1010 const bitmap_element *b_elt = b->first;
1011 bitmap_element *dst_prev = NULL;
1012 bitmap_element **dst_prev_pnext = &dst->first;
1013 bool changed = false;
1014
1015 gcc_assert (dst != a && dst != b);
1016
1017 if (a == b)
1018 {
1019 changed = !bitmap_empty_p (dst);
1020 bitmap_clear (dst);
1021 return changed;
1022 }
1023
1024 while (a_elt)
1025 {
1026 while (b_elt && b_elt->indx < a_elt->indx)
1027 b_elt = b_elt->next;
1028
1029 if (!b_elt || b_elt->indx > a_elt->indx)
1030 {
1031 changed = bitmap_elt_copy (dst, dst_elt, dst_prev, a_elt, changed);
1032 dst_prev = *dst_prev_pnext;
1033 dst_prev_pnext = &dst_prev->next;
1034 dst_elt = *dst_prev_pnext;
1035 a_elt = a_elt->next;
1036 }
1037
1038 else
1039 {
1040 /* Matching elts, generate A & ~B. */
1041 unsigned ix;
1042 BITMAP_WORD ior = 0;
1043
1044 if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1045 {
1046 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1047 {
1048 BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1049
1050 if (dst_elt->bits[ix] != r)
1051 {
1052 changed = true;
1053 dst_elt->bits[ix] = r;
1054 }
1055 ior |= r;
1056 }
1057 }
1058 else
1059 {
1060 bool new_element;
1061 if (!dst_elt || dst_elt->indx > a_elt->indx)
1062 {
1063 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1064 new_element = true;
1065 }
1066 else
1067 {
1068 dst_elt->indx = a_elt->indx;
1069 new_element = false;
1070 }
1071
1072 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1073 {
1074 BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1075
1076 dst_elt->bits[ix] = r;
1077 ior |= r;
1078 }
1079
1080 if (ior)
1081 changed = true;
1082 else
1083 {
1084 changed |= !new_element;
1085 bitmap_element_free (dst, dst_elt);
1086 dst_elt = *dst_prev_pnext;
1087 }
1088 }
1089
1090 if (ior)
1091 {
1092 dst_prev = *dst_prev_pnext;
1093 dst_prev_pnext = &dst_prev->next;
1094 dst_elt = *dst_prev_pnext;
1095 }
1096 a_elt = a_elt->next;
1097 b_elt = b_elt->next;
1098 }
1099 }
1100
1101 /* Ensure that dst->current is valid. */
1102 dst->current = dst->first;
1103
1104 if (dst_elt)
1105 {
1106 changed = true;
1107 bitmap_elt_clear_from (dst, dst_elt);
1108 }
1109 gcc_assert (!dst->current == !dst->first);
1110 if (dst->current)
1111 dst->indx = dst->current->indx;
1112
1113 return changed;
1114 }
1115
1116 /* A &= ~B. Returns true if A changes */
1117
1118 bool
1119 bitmap_and_compl_into (bitmap a, const_bitmap b)
1120 {
1121 bitmap_element *a_elt = a->first;
1122 const bitmap_element *b_elt = b->first;
1123 bitmap_element *next;
1124 BITMAP_WORD changed = 0;
1125
1126 if (a == b)
1127 {
1128 if (bitmap_empty_p (a))
1129 return false;
1130 else
1131 {
1132 bitmap_clear (a);
1133 return true;
1134 }
1135 }
1136
1137 while (a_elt && b_elt)
1138 {
1139 if (a_elt->indx < b_elt->indx)
1140 a_elt = a_elt->next;
1141 else if (b_elt->indx < a_elt->indx)
1142 b_elt = b_elt->next;
1143 else
1144 {
1145 /* Matching elts, generate A &= ~B. */
1146 unsigned ix;
1147 BITMAP_WORD ior = 0;
1148
1149 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1150 {
1151 BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1152 BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
1153
1154 a_elt->bits[ix] = r;
1155 changed |= cleared;
1156 ior |= r;
1157 }
1158 next = a_elt->next;
1159 if (!ior)
1160 bitmap_element_free (a, a_elt);
1161 a_elt = next;
1162 b_elt = b_elt->next;
1163 }
1164 }
1165 gcc_assert (!a->current == !a->first);
1166 gcc_assert (!a->current || a->indx == a->current->indx);
1167 return changed != 0;
1168 }
1169
1170 /* Set COUNT bits from START in HEAD. */
1171 void
1172 bitmap_set_range (bitmap head, unsigned int start, unsigned int count)
1173 {
1174 unsigned int first_index, end_bit_plus1, last_index;
1175 bitmap_element *elt, *elt_prev;
1176 unsigned int i;
1177
1178 if (!count)
1179 return;
1180
1181 first_index = start / BITMAP_ELEMENT_ALL_BITS;
1182 end_bit_plus1 = start + count;
1183 last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1184 elt = bitmap_find_bit (head, start);
1185
1186 /* If bitmap_find_bit returns zero, the current is the closest block
1187 to the result. Otherwise, just use bitmap_element_allocate to
1188 ensure ELT is set; in the loop below, ELT == NULL means "insert
1189 at the end of the bitmap". */
1190 if (!elt)
1191 {
1192 elt = bitmap_element_allocate (head);
1193 elt->indx = first_index;
1194 bitmap_element_link (head, elt);
1195 }
1196
1197 gcc_assert (elt->indx == first_index);
1198 elt_prev = elt->prev;
1199 for (i = first_index; i <= last_index; i++)
1200 {
1201 unsigned elt_start_bit = i * BITMAP_ELEMENT_ALL_BITS;
1202 unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1203
1204 unsigned int first_word_to_mod;
1205 BITMAP_WORD first_mask;
1206 unsigned int last_word_to_mod;
1207 BITMAP_WORD last_mask;
1208 unsigned int ix;
1209
1210 if (!elt || elt->indx != i)
1211 elt = bitmap_elt_insert_after (head, elt_prev, i);
1212
1213 if (elt_start_bit <= start)
1214 {
1215 /* The first bit to turn on is somewhere inside this
1216 elt. */
1217 first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1218
1219 /* This mask should have 1s in all bits >= start position. */
1220 first_mask =
1221 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1222 first_mask = ~first_mask;
1223 }
1224 else
1225 {
1226 /* The first bit to turn on is below this start of this elt. */
1227 first_word_to_mod = 0;
1228 first_mask = ~(BITMAP_WORD) 0;
1229 }
1230
1231 if (elt_end_bit_plus1 <= end_bit_plus1)
1232 {
1233 /* The last bit to turn on is beyond this elt. */
1234 last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1235 last_mask = ~(BITMAP_WORD) 0;
1236 }
1237 else
1238 {
1239 /* The last bit to turn on is inside to this elt. */
1240 last_word_to_mod =
1241 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1242
1243 /* The last mask should have 1s below the end bit. */
1244 last_mask =
1245 (((BITMAP_WORD) 1) << ((end_bit_plus1 % BITMAP_WORD_BITS))) - 1;
1246 }
1247
1248 if (first_word_to_mod == last_word_to_mod)
1249 {
1250 BITMAP_WORD mask = first_mask & last_mask;
1251 elt->bits[first_word_to_mod] |= mask;
1252 }
1253 else
1254 {
1255 elt->bits[first_word_to_mod] |= first_mask;
1256 if (BITMAP_ELEMENT_WORDS > 2)
1257 for (ix = first_word_to_mod + 1; ix < last_word_to_mod; ix++)
1258 elt->bits[ix] = ~(BITMAP_WORD) 0;
1259 elt->bits[last_word_to_mod] |= last_mask;
1260 }
1261
1262 elt_prev = elt;
1263 elt = elt->next;
1264 }
1265
1266 head->current = elt ? elt : elt_prev;
1267 head->indx = head->current->indx;
1268 }
1269
1270 /* Clear COUNT bits from START in HEAD. */
1271 void
1272 bitmap_clear_range (bitmap head, unsigned int start, unsigned int count)
1273 {
1274 unsigned int first_index, end_bit_plus1, last_index;
1275 bitmap_element *elt;
1276
1277 if (!count)
1278 return;
1279
1280 first_index = start / BITMAP_ELEMENT_ALL_BITS;
1281 end_bit_plus1 = start + count;
1282 last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
1283 elt = bitmap_find_bit (head, start);
1284
1285 /* If bitmap_find_bit returns zero, the current is the closest block
1286 to the result. If the current is less than first index, find the
1287 next one. Otherwise, just set elt to be current. */
1288 if (!elt)
1289 {
1290 if (head->current)
1291 {
1292 if (head->indx < first_index)
1293 {
1294 elt = head->current->next;
1295 if (!elt)
1296 return;
1297 }
1298 else
1299 elt = head->current;
1300 }
1301 else
1302 return;
1303 }
1304
1305 while (elt && (elt->indx <= last_index))
1306 {
1307 bitmap_element * next_elt = elt->next;
1308 unsigned elt_start_bit = (elt->indx) * BITMAP_ELEMENT_ALL_BITS;
1309 unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1310
1311
1312 if (elt_start_bit >= start && elt_end_bit_plus1 <= end_bit_plus1)
1313 /* Get rid of the entire elt and go to the next one. */
1314 bitmap_element_free (head, elt);
1315 else
1316 {
1317 /* Going to have to knock out some bits in this elt. */
1318 unsigned int first_word_to_mod;
1319 BITMAP_WORD first_mask;
1320 unsigned int last_word_to_mod;
1321 BITMAP_WORD last_mask;
1322 unsigned int i;
1323 bool clear = true;
1324
1325 if (elt_start_bit <= start)
1326 {
1327 /* The first bit to turn off is somewhere inside this
1328 elt. */
1329 first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1330
1331 /* This mask should have 1s in all bits >= start position. */
1332 first_mask =
1333 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1334 first_mask = ~first_mask;
1335 }
1336 else
1337 {
1338 /* The first bit to turn off is below this start of this elt. */
1339 first_word_to_mod = 0;
1340 first_mask = 0;
1341 first_mask = ~first_mask;
1342 }
1343
1344 if (elt_end_bit_plus1 <= end_bit_plus1)
1345 {
1346 /* The last bit to turn off is beyond this elt. */
1347 last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1348 last_mask = 0;
1349 last_mask = ~last_mask;
1350 }
1351 else
1352 {
1353 /* The last bit to turn off is inside to this elt. */
1354 last_word_to_mod =
1355 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1356
1357 /* The last mask should have 1s below the end bit. */
1358 last_mask =
1359 (((BITMAP_WORD) 1) << (((end_bit_plus1) % BITMAP_WORD_BITS))) - 1;
1360 }
1361
1362
1363 if (first_word_to_mod == last_word_to_mod)
1364 {
1365 BITMAP_WORD mask = first_mask & last_mask;
1366 elt->bits[first_word_to_mod] &= ~mask;
1367 }
1368 else
1369 {
1370 elt->bits[first_word_to_mod] &= ~first_mask;
1371 if (BITMAP_ELEMENT_WORDS > 2)
1372 for (i = first_word_to_mod + 1; i < last_word_to_mod; i++)
1373 elt->bits[i] = 0;
1374 elt->bits[last_word_to_mod] &= ~last_mask;
1375 }
1376 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1377 if (elt->bits[i])
1378 {
1379 clear = false;
1380 break;
1381 }
1382 /* Check to see if there are any bits left. */
1383 if (clear)
1384 bitmap_element_free (head, elt);
1385 }
1386 elt = next_elt;
1387 }
1388
1389 if (elt)
1390 {
1391 head->current = elt;
1392 head->indx = head->current->indx;
1393 }
1394 }
1395
1396 /* A = ~A & B. */
1397
1398 void
1399 bitmap_compl_and_into (bitmap a, const_bitmap b)
1400 {
1401 bitmap_element *a_elt = a->first;
1402 const bitmap_element *b_elt = b->first;
1403 bitmap_element *a_prev = NULL;
1404 bitmap_element *next;
1405
1406 gcc_assert (a != b);
1407
1408 if (bitmap_empty_p (a))
1409 {
1410 bitmap_copy (a, b);
1411 return;
1412 }
1413 if (bitmap_empty_p (b))
1414 {
1415 bitmap_clear (a);
1416 return;
1417 }
1418
1419 while (a_elt || b_elt)
1420 {
1421 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1422 {
1423 /* A is before B. Remove A */
1424 next = a_elt->next;
1425 a_prev = a_elt->prev;
1426 bitmap_element_free (a, a_elt);
1427 a_elt = next;
1428 }
1429 else if (!a_elt || b_elt->indx < a_elt->indx)
1430 {
1431 /* B is before A. Copy B. */
1432 next = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1433 memcpy (next->bits, b_elt->bits, sizeof (next->bits));
1434 a_prev = next;
1435 b_elt = b_elt->next;
1436 }
1437 else
1438 {
1439 /* Matching elts, generate A = ~A & B. */
1440 unsigned ix;
1441 BITMAP_WORD ior = 0;
1442
1443 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1444 {
1445 BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1446 BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
1447
1448 a_elt->bits[ix] = r;
1449 ior |= r;
1450 }
1451 next = a_elt->next;
1452 if (!ior)
1453 bitmap_element_free (a, a_elt);
1454 else
1455 a_prev = a_elt;
1456 a_elt = next;
1457 b_elt = b_elt->next;
1458 }
1459 }
1460 gcc_assert (!a->current == !a->first);
1461 gcc_assert (!a->current || a->indx == a->current->indx);
1462 return;
1463 }
1464
1465
1466 /* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
1467 overwriting DST_ELT if non-NULL. CHANGED is true if the destination bitmap
1468 had already been changed; the new value of CHANGED is returned. */
1469
1470 static inline bool
1471 bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
1472 const bitmap_element *a_elt, const bitmap_element *b_elt,
1473 bool changed)
1474 {
1475 gcc_assert (a_elt || b_elt);
1476
1477 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1478 {
1479 /* Matching elts, generate A | B. */
1480 unsigned ix;
1481
1482 if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1483 {
1484 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1485 {
1486 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1487 if (r != dst_elt->bits[ix])
1488 {
1489 dst_elt->bits[ix] = r;
1490 changed = true;
1491 }
1492 }
1493 }
1494 else
1495 {
1496 changed = true;
1497 if (!dst_elt)
1498 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1499 else
1500 dst_elt->indx = a_elt->indx;
1501 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1502 {
1503 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
1504 dst_elt->bits[ix] = r;
1505 }
1506 }
1507 }
1508 else
1509 {
1510 /* Copy a single element. */
1511 const bitmap_element *src;
1512
1513 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1514 src = a_elt;
1515 else
1516 src = b_elt;
1517
1518 gcc_assert (src);
1519 changed = bitmap_elt_copy (dst, dst_elt, dst_prev, src, changed);
1520 }
1521 return changed;
1522 }
1523
1524
1525 /* DST = A | B. Return true if DST changes. */
1526
1527 bool
1528 bitmap_ior (bitmap dst, const_bitmap a, const_bitmap b)
1529 {
1530 bitmap_element *dst_elt = dst->first;
1531 const bitmap_element *a_elt = a->first;
1532 const bitmap_element *b_elt = b->first;
1533 bitmap_element *dst_prev = NULL;
1534 bitmap_element **dst_prev_pnext = &dst->first;
1535 bool changed = false;
1536
1537 gcc_assert (dst != a && dst != b);
1538
1539 while (a_elt || b_elt)
1540 {
1541 changed = bitmap_elt_ior (dst, dst_elt, dst_prev, a_elt, b_elt, changed);
1542
1543 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1544 {
1545 a_elt = a_elt->next;
1546 b_elt = b_elt->next;
1547 }
1548 else
1549 {
1550 if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
1551 a_elt = a_elt->next;
1552 else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
1553 b_elt = b_elt->next;
1554 }
1555
1556 dst_prev = *dst_prev_pnext;
1557 dst_prev_pnext = &dst_prev->next;
1558 dst_elt = *dst_prev_pnext;
1559 }
1560
1561 if (dst_elt)
1562 {
1563 changed = true;
1564 bitmap_elt_clear_from (dst, dst_elt);
1565 }
1566 gcc_assert (!dst->current == !dst->first);
1567 if (dst->current)
1568 dst->indx = dst->current->indx;
1569 return changed;
1570 }
1571
1572 /* A |= B. Return true if A changes. */
1573
1574 bool
1575 bitmap_ior_into (bitmap a, const_bitmap b)
1576 {
1577 bitmap_element *a_elt = a->first;
1578 const bitmap_element *b_elt = b->first;
1579 bitmap_element *a_prev = NULL;
1580 bitmap_element **a_prev_pnext = &a->first;
1581 bool changed = false;
1582
1583 if (a == b)
1584 return false;
1585
1586 while (b_elt)
1587 {
1588 /* If A lags behind B, just advance it. */
1589 if (!a_elt || a_elt->indx == b_elt->indx)
1590 {
1591 changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
1592 b_elt = b_elt->next;
1593 }
1594 else if (a_elt->indx > b_elt->indx)
1595 {
1596 changed = bitmap_elt_copy (a, NULL, a_prev, b_elt, changed);
1597 b_elt = b_elt->next;
1598 }
1599
1600 a_prev = *a_prev_pnext;
1601 a_prev_pnext = &a_prev->next;
1602 a_elt = *a_prev_pnext;
1603 }
1604
1605 gcc_assert (!a->current == !a->first);
1606 if (a->current)
1607 a->indx = a->current->indx;
1608 return changed;
1609 }
1610
1611 /* DST = A ^ B */
1612
1613 void
1614 bitmap_xor (bitmap dst, const_bitmap a, const_bitmap b)
1615 {
1616 bitmap_element *dst_elt = dst->first;
1617 const bitmap_element *a_elt = a->first;
1618 const bitmap_element *b_elt = b->first;
1619 bitmap_element *dst_prev = NULL;
1620
1621 gcc_assert (dst != a && dst != b);
1622 if (a == b)
1623 {
1624 bitmap_clear (dst);
1625 return;
1626 }
1627
1628 while (a_elt || b_elt)
1629 {
1630 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1631 {
1632 /* Matching elts, generate A ^ B. */
1633 unsigned ix;
1634 BITMAP_WORD ior = 0;
1635
1636 if (!dst_elt)
1637 dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
1638 else
1639 dst_elt->indx = a_elt->indx;
1640 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1641 {
1642 BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1643
1644 ior |= r;
1645 dst_elt->bits[ix] = r;
1646 }
1647 a_elt = a_elt->next;
1648 b_elt = b_elt->next;
1649 if (ior)
1650 {
1651 dst_prev = dst_elt;
1652 dst_elt = dst_elt->next;
1653 }
1654 }
1655 else
1656 {
1657 /* Copy a single element. */
1658 const bitmap_element *src;
1659
1660 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1661 {
1662 src = a_elt;
1663 a_elt = a_elt->next;
1664 }
1665 else
1666 {
1667 src = b_elt;
1668 b_elt = b_elt->next;
1669 }
1670
1671 if (!dst_elt)
1672 dst_elt = bitmap_elt_insert_after (dst, dst_prev, src->indx);
1673 else
1674 dst_elt->indx = src->indx;
1675 memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
1676 dst_prev = dst_elt;
1677 dst_elt = dst_elt->next;
1678 }
1679 }
1680 /* Ensure that dst->current is valid. */
1681 dst->current = dst->first;
1682 bitmap_elt_clear_from (dst, dst_elt);
1683 gcc_assert (!dst->current == !dst->first);
1684 if (dst->current)
1685 dst->indx = dst->current->indx;
1686 }
1687
1688 /* A ^= B */
1689
1690 void
1691 bitmap_xor_into (bitmap a, const_bitmap b)
1692 {
1693 bitmap_element *a_elt = a->first;
1694 const bitmap_element *b_elt = b->first;
1695 bitmap_element *a_prev = NULL;
1696
1697 if (a == b)
1698 {
1699 bitmap_clear (a);
1700 return;
1701 }
1702
1703 while (b_elt)
1704 {
1705 if (!a_elt || b_elt->indx < a_elt->indx)
1706 {
1707 /* Copy b_elt. */
1708 bitmap_element *dst = bitmap_elt_insert_after (a, a_prev, b_elt->indx);
1709 memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
1710 a_prev = dst;
1711 b_elt = b_elt->next;
1712 }
1713 else if (a_elt->indx < b_elt->indx)
1714 {
1715 a_prev = a_elt;
1716 a_elt = a_elt->next;
1717 }
1718 else
1719 {
1720 /* Matching elts, generate A ^= B. */
1721 unsigned ix;
1722 BITMAP_WORD ior = 0;
1723 bitmap_element *next = a_elt->next;
1724
1725 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1726 {
1727 BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
1728
1729 ior |= r;
1730 a_elt->bits[ix] = r;
1731 }
1732 b_elt = b_elt->next;
1733 if (ior)
1734 a_prev = a_elt;
1735 else
1736 bitmap_element_free (a, a_elt);
1737 a_elt = next;
1738 }
1739 }
1740 gcc_assert (!a->current == !a->first);
1741 if (a->current)
1742 a->indx = a->current->indx;
1743 }
1744
1745 /* Return true if two bitmaps are identical.
1746 We do not bother with a check for pointer equality, as that never
1747 occurs in practice. */
1748
1749 bool
1750 bitmap_equal_p (const_bitmap a, const_bitmap b)
1751 {
1752 const bitmap_element *a_elt;
1753 const bitmap_element *b_elt;
1754 unsigned ix;
1755
1756 for (a_elt = a->first, b_elt = b->first;
1757 a_elt && b_elt;
1758 a_elt = a_elt->next, b_elt = b_elt->next)
1759 {
1760 if (a_elt->indx != b_elt->indx)
1761 return false;
1762 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1763 if (a_elt->bits[ix] != b_elt->bits[ix])
1764 return false;
1765 }
1766 return !a_elt && !b_elt;
1767 }
1768
1769 /* Return true if A AND B is not empty. */
1770
1771 bool
1772 bitmap_intersect_p (const_bitmap a, const_bitmap b)
1773 {
1774 const bitmap_element *a_elt;
1775 const bitmap_element *b_elt;
1776 unsigned ix;
1777
1778 for (a_elt = a->first, b_elt = b->first;
1779 a_elt && b_elt;)
1780 {
1781 if (a_elt->indx < b_elt->indx)
1782 a_elt = a_elt->next;
1783 else if (b_elt->indx < a_elt->indx)
1784 b_elt = b_elt->next;
1785 else
1786 {
1787 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1788 if (a_elt->bits[ix] & b_elt->bits[ix])
1789 return true;
1790 a_elt = a_elt->next;
1791 b_elt = b_elt->next;
1792 }
1793 }
1794 return false;
1795 }
1796
1797 /* Return true if A AND NOT B is not empty. */
1798
1799 bool
1800 bitmap_intersect_compl_p (const_bitmap a, const_bitmap b)
1801 {
1802 const bitmap_element *a_elt;
1803 const bitmap_element *b_elt;
1804 unsigned ix;
1805 for (a_elt = a->first, b_elt = b->first;
1806 a_elt && b_elt;)
1807 {
1808 if (a_elt->indx < b_elt->indx)
1809 return true;
1810 else if (b_elt->indx < a_elt->indx)
1811 b_elt = b_elt->next;
1812 else
1813 {
1814 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1815 if (a_elt->bits[ix] & ~b_elt->bits[ix])
1816 return true;
1817 a_elt = a_elt->next;
1818 b_elt = b_elt->next;
1819 }
1820 }
1821 return a_elt != NULL;
1822 }
1823
1824 \f
1825 /* DST = A | (FROM1 & ~FROM2). Return true if DST changes. */
1826
1827 bool
1828 bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b, const_bitmap kill)
1829 {
1830 bool changed = false;
1831
1832 bitmap_element *dst_elt = dst->first;
1833 const bitmap_element *a_elt = a->first;
1834 const bitmap_element *b_elt = b->first;
1835 const bitmap_element *kill_elt = kill->first;
1836 bitmap_element *dst_prev = NULL;
1837 bitmap_element **dst_prev_pnext = &dst->first;
1838
1839 gcc_assert (dst != a && dst != b && dst != kill);
1840
1841 /* Special cases. We don't bother checking for bitmap_equal_p (b, kill). */
1842 if (b == kill || bitmap_empty_p (b))
1843 {
1844 changed = !bitmap_equal_p (dst, a);
1845 if (changed)
1846 bitmap_copy (dst, a);
1847 return changed;
1848 }
1849 if (bitmap_empty_p (kill))
1850 return bitmap_ior (dst, a, b);
1851 if (bitmap_empty_p (a))
1852 return bitmap_and_compl (dst, b, kill);
1853
1854 while (a_elt || b_elt)
1855 {
1856 bool new_element = false;
1857
1858 if (b_elt)
1859 while (kill_elt && kill_elt->indx < b_elt->indx)
1860 kill_elt = kill_elt->next;
1861
1862 if (b_elt && kill_elt && kill_elt->indx == b_elt->indx
1863 && (!a_elt || a_elt->indx >= b_elt->indx))
1864 {
1865 bitmap_element tmp_elt;
1866 unsigned ix;
1867
1868 BITMAP_WORD ior = 0;
1869 tmp_elt.indx = b_elt->indx;
1870 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
1871 {
1872 BITMAP_WORD r = b_elt->bits[ix] & ~kill_elt->bits[ix];
1873 ior |= r;
1874 tmp_elt.bits[ix] = r;
1875 }
1876
1877 if (ior)
1878 {
1879 changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
1880 a_elt, &tmp_elt, changed);
1881 new_element = true;
1882 if (a_elt && a_elt->indx == b_elt->indx)
1883 a_elt = a_elt->next;
1884 }
1885
1886 b_elt = b_elt->next;
1887 kill_elt = kill_elt->next;
1888 }
1889 else
1890 {
1891 changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
1892 a_elt, b_elt, changed);
1893 new_element = true;
1894
1895 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
1896 {
1897 a_elt = a_elt->next;
1898 b_elt = b_elt->next;
1899 }
1900 else
1901 {
1902 if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
1903 a_elt = a_elt->next;
1904 else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
1905 b_elt = b_elt->next;
1906 }
1907 }
1908
1909 if (new_element)
1910 {
1911 dst_prev = *dst_prev_pnext;
1912 dst_prev_pnext = &dst_prev->next;
1913 dst_elt = *dst_prev_pnext;
1914 }
1915 }
1916
1917 if (dst_elt)
1918 {
1919 changed = true;
1920 bitmap_elt_clear_from (dst, dst_elt);
1921 }
1922 gcc_assert (!dst->current == !dst->first);
1923 if (dst->current)
1924 dst->indx = dst->current->indx;
1925
1926 return changed;
1927 }
1928
1929 /* A |= (FROM1 & ~FROM2). Return true if A changes. */
1930
1931 bool
1932 bitmap_ior_and_compl_into (bitmap a, const_bitmap from1, const_bitmap from2)
1933 {
1934 bitmap_head tmp;
1935 bool changed;
1936
1937 bitmap_initialize (&tmp, &bitmap_default_obstack);
1938 bitmap_and_compl (&tmp, from1, from2);
1939 changed = bitmap_ior_into (a, &tmp);
1940 bitmap_clear (&tmp);
1941
1942 return changed;
1943 }
1944
1945 \f
1946 /* Debugging function to print out the contents of a bitmap. */
1947
1948 void
1949 debug_bitmap_file (FILE *file, const_bitmap head)
1950 {
1951 const bitmap_element *ptr;
1952
1953 fprintf (file, "\nfirst = %p current = %p indx = %u\n",
1954 (void *) head->first, (void *) head->current, head->indx);
1955
1956 for (ptr = head->first; ptr; ptr = ptr->next)
1957 {
1958 unsigned int i, j, col = 26;
1959
1960 fprintf (file, "\t%p next = %p prev = %p indx = %u\n\t\tbits = {",
1961 (const void*) ptr, (const void*) ptr->next,
1962 (const void*) ptr->prev, ptr->indx);
1963
1964 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1965 for (j = 0; j < BITMAP_WORD_BITS; j++)
1966 if ((ptr->bits[i] >> j) & 1)
1967 {
1968 if (col > 70)
1969 {
1970 fprintf (file, "\n\t\t\t");
1971 col = 24;
1972 }
1973
1974 fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
1975 + i * BITMAP_WORD_BITS + j));
1976 col += 4;
1977 }
1978
1979 fprintf (file, " }\n");
1980 }
1981 }
1982
1983 /* Function to be called from the debugger to print the contents
1984 of a bitmap. */
1985
1986 void
1987 debug_bitmap (const_bitmap head)
1988 {
1989 debug_bitmap_file (stdout, head);
1990 }
1991
1992 /* Function to print out the contents of a bitmap. Unlike debug_bitmap_file,
1993 it does not print anything but the bits. */
1994
1995 void
1996 bitmap_print (FILE *file, const_bitmap head, const char *prefix, const char *suffix)
1997 {
1998 const char *comma = "";
1999 unsigned i;
2000 bitmap_iterator bi;
2001
2002 fputs (prefix, file);
2003 EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
2004 {
2005 fprintf (file, "%s%d", comma, i);
2006 comma = ", ";
2007 }
2008 fputs (suffix, file);
2009 }
2010 #ifdef GATHER_STATISTICS
2011
2012
2013 /* Used to accumulate statistics about bitmap sizes. */
2014 struct output_info
2015 {
2016 int count;
2017 int size;
2018 };
2019
2020 /* Called via htab_traverse. Output bitmap descriptor pointed out by SLOT
2021 and update statistics. */
2022 static int
2023 print_statistics (void **slot, void *b)
2024 {
2025 struct bitmap_descriptor *d = (struct bitmap_descriptor *) *slot;
2026 struct output_info *i = (struct output_info *) b;
2027 char s[4096];
2028
2029 if (d->allocated)
2030 {
2031 const char *s1 = d->file;
2032 const char *s2;
2033 while ((s2 = strstr (s1, "gcc/")))
2034 s1 = s2 + 4;
2035 sprintf (s, "%s:%i (%s)", s1, d->line, d->function);
2036 s[41] = 0;
2037 fprintf (stderr, "%-41s %6d %10d %10d %10d %10d\n", s,
2038 d->created, d->allocated, d->peak, d->current, d->nsearches);
2039 i->size += d->allocated;
2040 i->count += d->created;
2041 }
2042 return 1;
2043 }
2044 #endif
2045 /* Output per-bitmap memory usage statistics. */
2046 void
2047 dump_bitmap_statistics (void)
2048 {
2049 #ifdef GATHER_STATISTICS
2050 struct output_info info;
2051
2052 if (!bitmap_desc_hash)
2053 return;
2054
2055 fprintf (stderr, "\nBitmap Overall "
2056 "Allocated Peak Leak searched "
2057 " per search\n");
2058 fprintf (stderr, "---------------------------------------------------------------------------------\n");
2059 info.count = 0;
2060 info.size = 0;
2061 htab_traverse (bitmap_desc_hash, print_statistics, &info);
2062 fprintf (stderr, "---------------------------------------------------------------------------------\n");
2063 fprintf (stderr, "%-40s %7d %10d\n",
2064 "Total", info.count, info.size);
2065 fprintf (stderr, "---------------------------------------------------------------------------------\n");
2066 #endif
2067 }
2068
2069 /* Compute hash of bitmap (for purposes of hashing). */
2070 hashval_t
2071 bitmap_hash (const_bitmap head)
2072 {
2073 const bitmap_element *ptr;
2074 BITMAP_WORD hash = 0;
2075 int ix;
2076
2077 for (ptr = head->first; ptr; ptr = ptr->next)
2078 {
2079 hash ^= ptr->indx;
2080 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
2081 hash ^= ptr->bits[ix];
2082 }
2083 return (hashval_t)hash;
2084 }
2085
2086 #include "gt-bitmap.h"