]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/bitmap.cc
libstdc++: fix C header include guards
[thirdparty/gcc.git] / gcc / bitmap.cc
CommitLineData
096ab9ea 1/* Functions to support general ended bitmaps.
a945c346 2 Copyright (C) 1997-2024 Free Software Foundation, Inc.
096ab9ea 3
1322177d 4This file is part of GCC.
096ab9ea 5
1322177d
LB
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
1322177d 9version.
096ab9ea 10
1322177d
LB
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
096ab9ea
RK
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
096ab9ea 19
096ab9ea 20#include "config.h"
670ee920 21#include "system.h"
4977bab6 22#include "coretypes.h"
efc9bd41 23#include "bitmap.h"
d9b950dd 24#include "selftest.h"
f75709c6 25
2d44c7de
ML
26/* Memory allocation statistics purpose instance. */
27mem_alloc_description<bitmap_usage> bitmap_mem_desc;
f75709c6 28
1c252ef3
RB
29/* Static zero-initialized bitmap obstack used for default initialization
30 of bitmap_head. */
31bitmap_obstack bitmap_head::crashme;
32
d1e14d97
SB
33static bitmap_element *bitmap_tree_listify_from (bitmap, bitmap_element *);
34
f75709c6
JH
35/* Register new bitmap. */
36void
37bitmap_register (bitmap b MEM_STAT_DECL)
38{
7664eeb7
ML
39 static unsigned alloc_descriptor_max_uid = 1;
40 gcc_assert (b->alloc_descriptor == 0);
41 b->alloc_descriptor = alloc_descriptor_max_uid++;
42
43 bitmap_mem_desc.register_descriptor (b->get_descriptor (), BITMAP_ORIGIN,
44 false FINAL_PASS_MEM_STAT);
f75709c6
JH
45}
46
47/* Account the overhead. */
48static void
43331dfb 49register_overhead (bitmap b, size_t amount)
f75709c6 50{
7664eeb7
ML
51 unsigned *d = b->get_descriptor ();
52 if (bitmap_mem_desc.contains_descriptor_for_instance (d))
53 bitmap_mem_desc.register_instance_overhead (amount, d);
54}
55
56/* Release the overhead. */
57static void
58release_overhead (bitmap b, size_t amount, bool remove_from_map)
59{
60 unsigned *d = b->get_descriptor ();
61 if (bitmap_mem_desc.contains_descriptor_for_instance (d))
62 bitmap_mem_desc.release_instance_overhead (d, amount, remove_from_map);
f75709c6 63}
096ab9ea 64
7664eeb7 65
096ab9ea 66/* Global data */
7932a3db
NS
67bitmap_element bitmap_zero_bits; /* An element of all zero bits. */
68bitmap_obstack bitmap_default_obstack; /* The default bitmap obstack. */
a68ab351 69static int bitmap_default_obstack_depth;
7932a3db
NS
70static GTY((deletable)) bitmap_element *bitmap_ggc_free; /* Freelist of
71 GC'd elements. */
096ab9ea 72
096ab9ea 73\f
d1e14d97 74/* Bitmap memory management. */
88c4f655 75
d1e14d97 76/* Add ELT to the appropriate freelist. */
47c321d4 77static inline void
4682ae04 78bitmap_elem_to_freelist (bitmap head, bitmap_element *elt)
e2500fed 79{
7932a3db 80 bitmap_obstack *bit_obstack = head->obstack;
c22cacf3 81
d1e14d97 82 if (GATHER_STATISTICS)
7664eeb7 83 release_overhead (head, sizeof (bitmap_element), false);
d1e14d97 84
5765e552 85 elt->next = NULL;
a30fe4b6 86 elt->indx = -1;
7932a3db 87 if (bit_obstack)
e2500fed 88 {
5765e552 89 elt->prev = bit_obstack->elements;
7932a3db 90 bit_obstack->elements = elt;
e2500fed
GK
91 }
92 else
93 {
5765e552 94 elt->prev = bitmap_ggc_free;
e2500fed
GK
95 bitmap_ggc_free = elt;
96 }
97}
98
096ab9ea
RK
99/* Allocate a bitmap element. The bits are cleared, but nothing else is. */
100
47c321d4 101static inline bitmap_element *
4682ae04 102bitmap_element_allocate (bitmap head)
096ab9ea
RK
103{
104 bitmap_element *element;
7932a3db 105 bitmap_obstack *bit_obstack = head->obstack;
c22cacf3 106
7932a3db 107 if (bit_obstack)
22fa5b8a 108 {
7932a3db 109 element = bit_obstack->elements;
c22cacf3 110
7932a3db 111 if (element)
5765e552
KZ
112 /* Use up the inner list first before looking at the next
113 element of the outer list. */
114 if (element->next)
115 {
116 bit_obstack->elements = element->next;
117 bit_obstack->elements->prev = element->prev;
118 }
119 else
120 /* Inner list was just a singleton. */
121 bit_obstack->elements = element->prev;
e2500fed 122 else
7932a3db 123 element = XOBNEW (&bit_obstack->obstack, bitmap_element);
e2500fed
GK
124 }
125 else
126 {
7932a3db
NS
127 element = bitmap_ggc_free;
128 if (element)
5765e552
KZ
129 /* Use up the inner list first before looking at the next
130 element of the outer list. */
131 if (element->next)
132 {
133 bitmap_ggc_free = element->next;
134 bitmap_ggc_free->prev = element->prev;
135 }
136 else
137 /* Inner list was just a singleton. */
138 bitmap_ggc_free = element->prev;
e2500fed 139 else
766090c2 140 element = ggc_alloc<bitmap_element> ();
22fa5b8a 141 }
096ab9ea 142
7aa6d18a
SB
143 if (GATHER_STATISTICS)
144 register_overhead (head, sizeof (bitmap_element));
145
a615c28a 146 memset (element->bits, 0, sizeof (element->bits));
096ab9ea
RK
147
148 return element;
149}
150
d1e14d97
SB
151/* Remove ELT and all following elements from bitmap HEAD.
152 Put the released elements in the freelist for HEAD. */
87e08c69
RH
153
154void
7932a3db
NS
155bitmap_elt_clear_from (bitmap head, bitmap_element *elt)
156{
5765e552
KZ
157 bitmap_element *prev;
158 bitmap_obstack *bit_obstack = head->obstack;
159
d1e14d97
SB
160 if (!elt)
161 return;
162
163 if (head->tree_form)
164 elt = bitmap_tree_listify_from (head, elt);
7aa6d18a
SB
165
166 if (GATHER_STATISTICS)
167 {
168 int n = 0;
169 for (prev = elt; prev; prev = prev->next)
170 n++;
7664eeb7 171 release_overhead (head, sizeof (bitmap_element) * n, false);
7aa6d18a 172 }
7932a3db 173
5765e552
KZ
174 prev = elt->prev;
175 if (prev)
176 {
177 prev->next = NULL;
178 if (head->current->indx > prev->indx)
179 {
180 head->current = prev;
181 head->indx = prev->indx;
182 }
c22cacf3 183 }
5765e552
KZ
184 else
185 {
186 head->first = NULL;
187 head->current = NULL;
188 head->indx = 0;
189 }
190
d1e14d97 191 /* Put the entire list onto the freelist in one operation. */
5765e552 192 if (bit_obstack)
7932a3db 193 {
c22cacf3 194 elt->prev = bit_obstack->elements;
5765e552
KZ
195 bit_obstack->elements = elt;
196 }
197 else
198 {
d1e14d97
SB
199 elt->prev = bitmap_ggc_free;
200 bitmap_ggc_free = elt;
201 }
202}
203\f
204/* Linked-list view of bitmaps.
205
206 In this representation, the bitmap elements form a double-linked list
207 with elements sorted by increasing index. */
208
209/* Link the bitmap element into the current bitmap linked list. */
210
211static inline void
212bitmap_list_link_element (bitmap head, bitmap_element *element)
213{
214 unsigned int indx = element->indx;
215 bitmap_element *ptr;
216
217 gcc_checking_assert (!head->tree_form);
218
219 /* If this is the first and only element, set it in. */
220 if (head->first == 0)
221 {
222 element->next = element->prev = 0;
223 head->first = element;
224 }
225
226 /* If this index is less than that of the current element, it goes someplace
227 before the current element. */
228 else if (indx < head->indx)
229 {
230 for (ptr = head->current;
231 ptr->prev != 0 && ptr->prev->indx > indx;
232 ptr = ptr->prev)
233 ;
234
235 if (ptr->prev)
236 ptr->prev->next = element;
237 else
238 head->first = element;
239
240 element->prev = ptr->prev;
241 element->next = ptr;
242 ptr->prev = element;
243 }
244
245 /* Otherwise, it must go someplace after the current element. */
246 else
247 {
248 for (ptr = head->current;
249 ptr->next != 0 && ptr->next->indx < indx;
250 ptr = ptr->next)
251 ;
252
253 if (ptr->next)
254 ptr->next->prev = element;
255
256 element->next = ptr->next;
257 element->prev = ptr;
258 ptr->next = element;
259 }
260
261 /* Set up so this is the first element searched. */
262 head->current = element;
263 head->indx = indx;
264}
265
266/* Unlink the bitmap element from the current bitmap linked list,
267 and return it to the freelist. */
268
269static inline void
029ca388
RB
270bitmap_list_unlink_element (bitmap head, bitmap_element *element,
271 bool to_freelist = true)
d1e14d97
SB
272{
273 bitmap_element *next = element->next;
274 bitmap_element *prev = element->prev;
275
276 gcc_checking_assert (!head->tree_form);
277
278 if (prev)
279 prev->next = next;
280
281 if (next)
282 next->prev = prev;
283
284 if (head->first == element)
285 head->first = next;
286
287 /* Since the first thing we try is to insert before current,
288 make current the next entry in preference to the previous. */
289 if (head->current == element)
290 {
291 head->current = next != 0 ? next : prev;
292 if (head->current)
293 head->indx = head->current->indx;
294 else
295 head->indx = 0;
296 }
297
029ca388
RB
298 if (to_freelist)
299 bitmap_elem_to_freelist (head, element);
d1e14d97
SB
300}
301
029ca388
RB
302/* Insert a new uninitialized element (or NODE if not NULL) into bitmap
303 HEAD after element ELT. If ELT is NULL, insert the element at the start.
304 Return the new element. */
d1e14d97
SB
305
306static bitmap_element *
307bitmap_list_insert_element_after (bitmap head,
029ca388
RB
308 bitmap_element *elt, unsigned int indx,
309 bitmap_element *node = NULL)
d1e14d97 310{
029ca388
RB
311 if (!node)
312 node = bitmap_element_allocate (head);
d1e14d97
SB
313 node->indx = indx;
314
315 gcc_checking_assert (!head->tree_form);
316
317 if (!elt)
318 {
319 if (!head->current)
320 {
321 head->current = node;
322 head->indx = indx;
323 }
324 node->next = head->first;
325 if (node->next)
326 node->next->prev = node;
327 head->first = node;
328 node->prev = NULL;
329 }
330 else
331 {
332 gcc_checking_assert (head->current);
333 node->next = elt->next;
334 if (node->next)
335 node->next->prev = node;
336 elt->next = node;
337 node->prev = elt;
338 }
339 return node;
340}
341
342/* Return the element for INDX, or NULL if the element doesn't exist.
343 Update the `current' field even if we can't find an element that
344 would hold the bitmap's bit to make eventual allocation
345 faster. */
346
347static inline bitmap_element *
348bitmap_list_find_element (bitmap head, unsigned int indx)
349{
350 bitmap_element *element;
351
352 if (head->current == NULL
353 || head->indx == indx)
354 return head->current;
355
356 if (head->current == head->first
357 && head->first->next == NULL)
358 return NULL;
359
360 /* Usage can be NULL due to allocated bitmaps for which we do not
361 call initialize function. */
362 bitmap_usage *usage = NULL;
363 if (GATHER_STATISTICS)
364 usage = bitmap_mem_desc.get_descriptor_for_instance (head);
365
366 /* This bitmap has more than one element, and we're going to look
367 through the elements list. Count that as a search. */
368 if (GATHER_STATISTICS && usage)
369 usage->m_nsearches++;
370
371 if (head->indx < indx)
372 /* INDX is beyond head->indx. Search from head->current
373 forward. */
374 for (element = head->current;
375 element->next != 0 && element->indx < indx;
376 element = element->next)
377 {
378 if (GATHER_STATISTICS && usage)
379 usage->m_search_iter++;
380 }
381
382 else if (head->indx / 2 < indx)
383 /* INDX is less than head->indx and closer to head->indx than to
384 0. Search from head->current backward. */
385 for (element = head->current;
386 element->prev != 0 && element->indx > indx;
387 element = element->prev)
388 {
389 if (GATHER_STATISTICS && usage)
390 usage->m_search_iter++;
391 }
392
393 else
394 /* INDX is less than head->indx and closer to 0 than to
395 head->indx. Search from head->first forward. */
396 for (element = head->first;
397 element->next != 0 && element->indx < indx;
398 element = element->next)
399 {
400 if (GATHER_STATISTICS && usage)
401 usage->m_search_iter++;
402 }
403
404 /* `element' is the nearest to the one we want. If it's not the one we
405 want, the one we want doesn't exist. */
406 gcc_checking_assert (element != NULL);
407 head->current = element;
408 head->indx = element->indx;
409 if (element->indx != indx)
410 element = 0;
411 return element;
412}
413
414\f
415/* Splay-tree view of bitmaps.
416
417 This is an almost one-to-one the implementatin of the simple top-down
418 splay tree in Sleator and Tarjan's "Self-adjusting Binary Search Trees".
419 It is probably not the most efficient form of splay trees, but it should
420 be good enough to experiment with this idea of bitmaps-as-trees.
421
422 For all functions below, the variable or function argument "t" is a node
423 in the tree, and "e" is a temporary or new node in the tree. The rest
424 is sufficiently straigh-forward (and very well explained in the paper)
425 that comment would only clutter things. */
426
427static inline void
428bitmap_tree_link_left (bitmap_element * &t, bitmap_element * &l)
429{
430 l->next = t;
431 l = t;
432 t = t->next;
433}
434
435static inline void
436bitmap_tree_link_right (bitmap_element * &t, bitmap_element * &r)
437{
438 r->prev = t;
439 r = t;
440 t = t->prev;
441}
442
443static inline void
444bitmap_tree_rotate_left (bitmap_element * &t)
445{
446 bitmap_element *e = t->next;
447 t->next = t->next->prev;
448 e->prev = t;
449 t = e;
450}
451
452static inline void
453bitmap_tree_rotate_right (bitmap_element * &t)
454{
455 bitmap_element *e = t->prev;
456 t->prev = t->prev->next;
457 e->next = t;
458 t = e;
459}
460
461static bitmap_element *
462bitmap_tree_splay (bitmap head, bitmap_element *t, unsigned int indx)
463{
464 bitmap_element N, *l, *r;
465
466 if (t == NULL)
467 return NULL;
468
469 bitmap_usage *usage = NULL;
470 if (GATHER_STATISTICS)
471 usage = bitmap_mem_desc.get_descriptor_for_instance (head);
472
473 N.prev = N.next = NULL;
474 l = r = &N;
475
476 while (indx != t->indx)
477 {
478 if (GATHER_STATISTICS && usage)
479 usage->m_search_iter++;
480
481 if (indx < t->indx)
482 {
483 if (t->prev != NULL && indx < t->prev->indx)
484 bitmap_tree_rotate_right (t);
485 if (t->prev == NULL)
486 break;
487 bitmap_tree_link_right (t, r);
488 }
489 else if (indx > t->indx)
490 {
491 if (t->next != NULL && indx > t->next->indx)
492 bitmap_tree_rotate_left (t);
493 if (t->next == NULL)
494 break;
495 bitmap_tree_link_left (t, l);
496 }
497 }
498
499 l->next = t->prev;
500 r->prev = t->next;
501 t->prev = N.next;
502 t->next = N.prev;
503 return t;
504}
505
506/* Link bitmap element E into the current bitmap splay tree. */
507
508static inline void
509bitmap_tree_link_element (bitmap head, bitmap_element *e)
510{
511 if (head->first == NULL)
512 e->prev = e->next = NULL;
513 else
514 {
515 bitmap_element *t = bitmap_tree_splay (head, head->first, e->indx);
516 if (e->indx < t->indx)
517 {
518 e->prev = t->prev;
519 e->next = t;
520 t->prev = NULL;
521 }
522 else if (e->indx > t->indx)
523 {
524 e->next = t->next;
525 e->prev = t;
526 t->next = NULL;
527 }
528 else
529 gcc_unreachable ();
530 }
531 head->first = e;
532 head->current = e;
533 head->indx = e->indx;
534}
535
536/* Unlink bitmap element E from the current bitmap splay tree,
537 and return it to the freelist. */
538
539static void
540bitmap_tree_unlink_element (bitmap head, bitmap_element *e)
541{
542 bitmap_element *t = bitmap_tree_splay (head, head->first, e->indx);
543
544 gcc_checking_assert (t == e);
545
546 if (e->prev == NULL)
547 t = e->next;
548 else
549 {
550 t = bitmap_tree_splay (head, e->prev, e->indx);
551 t->next = e->next;
552 }
553 head->first = t;
554 head->current = t;
555 head->indx = (t != NULL) ? t->indx : 0;
556
557 bitmap_elem_to_freelist (head, e);
558}
559
560/* Return the element for INDX, or NULL if the element doesn't exist. */
561
562static inline bitmap_element *
563bitmap_tree_find_element (bitmap head, unsigned int indx)
564{
565 if (head->current == NULL
566 || head->indx == indx)
567 return head->current;
568
569 /* Usage can be NULL due to allocated bitmaps for which we do not
570 call initialize function. */
571 bitmap_usage *usage = NULL;
572 if (GATHER_STATISTICS)
573 usage = bitmap_mem_desc.get_descriptor_for_instance (head);
574
575 /* This bitmap has more than one element, and we're going to look
576 through the elements list. Count that as a search. */
577 if (GATHER_STATISTICS && usage)
578 usage->m_nsearches++;
579
580 bitmap_element *element = bitmap_tree_splay (head, head->first, indx);
581 gcc_checking_assert (element != NULL);
582 head->first = element;
583 head->current = element;
584 head->indx = element->indx;
585 if (element->indx != indx)
586 element = 0;
587 return element;
588}
589\f
590/* Converting bitmap views from linked-list to tree and vice versa. */
591
592/* Splice element E and all elements with a larger index from
593 bitmap HEAD, convert the spliced elements to the linked-list
594 view, and return the head of the list (which should be E again), */
595
596static bitmap_element *
597bitmap_tree_listify_from (bitmap head, bitmap_element *e)
598{
599 bitmap_element *t, *erb;
600
601 /* Detach the right branch from E (all elements with indx > E->indx),
602 and splay E to the root. */
603 erb = e->next;
604 e->next = NULL;
605 t = bitmap_tree_splay (head, head->first, e->indx);
606 gcc_checking_assert (t == e);
607
608 /* Because E has no right branch, and we rotated it to the root,
609 the left branch is the new root. */
610 t = e->prev;
611 head->first = t;
612 head->current = t;
613 head->indx = (t != NULL) ? t->indx : 0;
614
615 /* Detach the tree from E, and re-attach the right branch of E. */
616 e->prev = NULL;
617 e->next = erb;
618
619 /* The tree is now valid again. Now we need to "un-tree" E.
620 It is imperative that a non-recursive implementation is used
621 for this, because splay trees have a worst case depth of O(N)
622 for a tree with N nodes. A recursive implementation could
623 result in a stack overflow for a sufficiently large, unbalanced
624 bitmap tree. */
625
626 auto_vec<bitmap_element *, 32> stack;
627 auto_vec<bitmap_element *, 32> sorted_elements;
628 bitmap_element *n = e;
629
630 while (true)
631 {
632 while (n != NULL)
633 {
634 stack.safe_push (n);
635 n = n->prev;
636 }
637
638 if (stack.is_empty ())
639 break;
640
641 n = stack.pop ();
642 sorted_elements.safe_push (n);
643 n = n->next;
644 }
645
646 gcc_assert (sorted_elements[0] == e);
647
648 bitmap_element *prev = NULL;
649 unsigned ix;
650 FOR_EACH_VEC_ELT (sorted_elements, ix, n)
651 {
652 if (prev != NULL)
653 prev->next = n;
654 n->prev = prev;
655 n->next = NULL;
656 prev = n;
657 }
658
659 return e;
660}
661
662/* Convert bitmap HEAD from splay-tree view to linked-list view. */
663
664void
665bitmap_list_view (bitmap head)
666{
667 bitmap_element *ptr;
668
669 gcc_assert (head->tree_form);
670
671 ptr = head->first;
672 if (ptr)
673 {
674 while (ptr->prev)
675 bitmap_tree_rotate_right (ptr);
676 head->first = ptr;
677 head->first = bitmap_tree_listify_from (head, ptr);
7932a3db 678 }
d1e14d97
SB
679
680 head->tree_form = false;
896db49a
RB
681 if (!head->current)
682 {
683 head->current = head->first;
684 head->indx = head->current ? head->current->indx : 0;
685 }
7932a3db
NS
686}
687
d1e14d97
SB
688/* Convert bitmap HEAD from linked-list view to splay-tree view.
689 This is simply a matter of dropping the prev or next pointers
690 and setting the tree_form flag. The tree will balance itself
691 if and when it is used. */
692
693void
694bitmap_tree_view (bitmap head)
695{
696 bitmap_element *ptr;
697
698 gcc_assert (! head->tree_form);
699
700 ptr = head->first;
701 while (ptr)
702 {
703 ptr->prev = NULL;
704 ptr = ptr->next;
705 }
706
707 head->tree_form = true;
708}
709\f
710/* Clear a bitmap by freeing all its elements. */
7932a3db 711
5fd8300b 712void
7932a3db 713bitmap_clear (bitmap head)
87e08c69 714{
d1e14d97
SB
715 if (head->first == NULL)
716 return;
717 if (head->tree_form)
718 {
719 bitmap_element *e, *t;
720 for (e = head->first; e->prev; e = e->prev)
721 /* Loop to find the element with the smallest index. */ ;
722 t = bitmap_tree_splay (head, head->first, e->indx);
723 gcc_checking_assert (t == e);
724 head->first = t;
725 }
726 bitmap_elt_clear_from (head, head->first);
7932a3db
NS
727}
728\f
729/* Initialize a bitmap obstack. If BIT_OBSTACK is NULL, initialize
730 the default bitmap obstack. */
731
732void
733bitmap_obstack_initialize (bitmap_obstack *bit_obstack)
734{
735 if (!bit_obstack)
a68ab351
JJ
736 {
737 if (bitmap_default_obstack_depth++)
738 return;
739 bit_obstack = &bitmap_default_obstack;
740 }
7932a3db
NS
741
742#if !defined(__GNUC__) || (__GNUC__ < 2)
743#define __alignof__(type) 0
744#endif
745
746 bit_obstack->elements = NULL;
747 bit_obstack->heads = NULL;
748 obstack_specify_allocation (&bit_obstack->obstack, OBSTACK_CHUNK_SIZE,
749 __alignof__ (bitmap_element),
750 obstack_chunk_alloc,
751 obstack_chunk_free);
87e08c69
RH
752}
753
7932a3db
NS
754/* Release the memory from a bitmap obstack. If BIT_OBSTACK is NULL,
755 release the default bitmap obstack. */
756
757void
758bitmap_obstack_release (bitmap_obstack *bit_obstack)
759{
760 if (!bit_obstack)
a68ab351
JJ
761 {
762 if (--bitmap_default_obstack_depth)
763 {
764 gcc_assert (bitmap_default_obstack_depth > 0);
765 return;
766 }
767 bit_obstack = &bitmap_default_obstack;
768 }
c22cacf3 769
7932a3db
NS
770 bit_obstack->elements = NULL;
771 bit_obstack->heads = NULL;
772 obstack_free (&bit_obstack->obstack, NULL);
773}
774
775/* Create a new bitmap on an obstack. If BIT_OBSTACK is NULL, create
776 it on the default bitmap obstack. */
777
778bitmap
3fe793df 779bitmap_alloc (bitmap_obstack *bit_obstack MEM_STAT_DECL)
7932a3db
NS
780{
781 bitmap map;
782
783 if (!bit_obstack)
a2e9032d
RB
784 {
785 gcc_assert (bitmap_default_obstack_depth > 0);
786 bit_obstack = &bitmap_default_obstack;
787 }
7932a3db
NS
788 map = bit_obstack->heads;
789 if (map)
99b1c316 790 bit_obstack->heads = (class bitmap_head *) map->first;
7932a3db
NS
791 else
792 map = XOBNEW (&bit_obstack->obstack, bitmap_head);
2a1a5f30 793 bitmap_initialize (map, bit_obstack PASS_MEM_STAT);
7aa6d18a
SB
794
795 if (GATHER_STATISTICS)
796 register_overhead (map, sizeof (bitmap_head));
7932a3db
NS
797
798 return map;
799}
800
801/* Create a new GCd bitmap. */
802
803bitmap
3fe793df 804bitmap_gc_alloc (ALONE_MEM_STAT_DECL)
7932a3db
NS
805{
806 bitmap map;
807
766090c2 808 map = ggc_alloc<bitmap_head> ();
2a1a5f30 809 bitmap_initialize (map, NULL PASS_MEM_STAT);
7aa6d18a
SB
810
811 if (GATHER_STATISTICS)
812 register_overhead (map, sizeof (bitmap_head));
7932a3db
NS
813
814 return map;
815}
816
7932a3db
NS
817/* Release an obstack allocated bitmap. */
818
819void
820bitmap_obstack_free (bitmap map)
821{
cc175e7c
NS
822 if (map)
823 {
824 bitmap_clear (map);
dba2cc0c 825 map->first = (bitmap_element *) map->obstack->heads;
7aa6d18a
SB
826
827 if (GATHER_STATISTICS)
7664eeb7 828 release_overhead (map, sizeof (bitmap_head), true);
7aa6d18a 829
cc175e7c
NS
830 map->obstack->heads = map;
831 }
7932a3db
NS
832}
833
7932a3db 834\f
096ab9ea
RK
835/* Return nonzero if all bits in an element are zero. */
836
47c321d4 837static inline int
e326eeb5 838bitmap_element_zerop (const bitmap_element *element)
096ab9ea
RK
839{
840#if BITMAP_ELEMENT_WORDS == 2
841 return (element->bits[0] | element->bits[1]) == 0;
842#else
65a6f342 843 unsigned i;
096ab9ea
RK
844
845 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
846 if (element->bits[i] != 0)
847 return 0;
848
849 return 1;
850#endif
851}
852\f
a615c28a 853/* Copy a bitmap to another bitmap. */
096ab9ea
RK
854
855void
e326eeb5 856bitmap_copy (bitmap to, const_bitmap from)
096ab9ea 857{
e326eeb5
KG
858 const bitmap_element *from_ptr;
859 bitmap_element *to_ptr = 0;
096ab9ea 860
d1e14d97
SB
861 gcc_checking_assert (!to->tree_form && !from->tree_form);
862
096ab9ea
RK
863 bitmap_clear (to);
864
f9da5064 865 /* Copy elements in forward direction one at a time. */
096ab9ea
RK
866 for (from_ptr = from->first; from_ptr; from_ptr = from_ptr->next)
867 {
e2500fed 868 bitmap_element *to_elt = bitmap_element_allocate (to);
096ab9ea
RK
869
870 to_elt->indx = from_ptr->indx;
fd6132db 871 memcpy (to_elt->bits, from_ptr->bits, sizeof (to_elt->bits));
096ab9ea 872
d1e14d97
SB
873 /* Here we have a special case of bitmap_list_link_element,
874 for the case where we know the links are being entered
875 in sequence. */
096ab9ea
RK
876 if (to_ptr == 0)
877 {
878 to->first = to->current = to_elt;
879 to->indx = from_ptr->indx;
880 to_elt->next = to_elt->prev = 0;
881 }
882 else
883 {
884 to_elt->prev = to_ptr;
885 to_elt->next = 0;
886 to_ptr->next = to_elt;
887 }
888
889 to_ptr = to_elt;
890 }
891}
43331dfb
RB
892
893/* Move a bitmap to another bitmap. */
894
895void
896bitmap_move (bitmap to, bitmap from)
897{
898 gcc_assert (to->obstack == from->obstack);
899
900 bitmap_clear (to);
901
7664eeb7 902 size_t sz = 0;
43331dfb
RB
903 if (GATHER_STATISTICS)
904 {
43331dfb
RB
905 for (bitmap_element *e = to->first; e; e = e->next)
906 sz += sizeof (bitmap_element);
907 register_overhead (to, sz);
43331dfb 908 }
7664eeb7
ML
909
910 *to = *from;
911
912 if (GATHER_STATISTICS)
913 release_overhead (from, sz, false);
43331dfb 914}
096ab9ea 915\f
5f0d975b 916/* Clear a single bit in a bitmap. Return true if the bit changed. */
096ab9ea 917
5f0d975b 918bool
4682ae04 919bitmap_clear_bit (bitmap head, int bit)
096ab9ea 920{
d1e14d97
SB
921 unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
922 bitmap_element *ptr;
096ab9ea 923
d1e14d97
SB
924 if (!head->tree_form)
925 ptr = bitmap_list_find_element (head, indx);
926 else
927 ptr = bitmap_tree_find_element (head, indx);
096ab9ea
RK
928 if (ptr != 0)
929 {
72e42e26
SB
930 unsigned bit_num = bit % BITMAP_WORD_BITS;
931 unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
5f0d975b
RG
932 BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
933 bool res = (ptr->bits[word_num] & bit_val) != 0;
934 if (res)
07309d58
UB
935 {
936 ptr->bits[word_num] &= ~bit_val;
937 /* If we cleared the entire word, free up the element. */
938 if (!ptr->bits[word_num]
939 && bitmap_element_zerop (ptr))
d1e14d97
SB
940 {
941 if (!head->tree_form)
942 bitmap_list_unlink_element (head, ptr);
943 else
944 bitmap_tree_unlink_element (head, ptr);
945 }
07309d58 946 }
5f0d975b
RG
947
948 return res;
096ab9ea 949 }
5f0d975b
RG
950
951 return false;
096ab9ea
RK
952}
953
5f0d975b 954/* Set a single bit in a bitmap. Return true if the bit changed. */
096ab9ea 955
5f0d975b 956bool
4682ae04 957bitmap_set_bit (bitmap head, int bit)
096ab9ea 958{
d1e14d97
SB
959 unsigned indx = bit / BITMAP_ELEMENT_ALL_BITS;
960 bitmap_element *ptr;
961 if (!head->tree_form)
962 ptr = bitmap_list_find_element (head, indx);
963 else
964 ptr = bitmap_tree_find_element (head, indx);
72e42e26
SB
965 unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
966 unsigned bit_num = bit % BITMAP_WORD_BITS;
967 BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
096ab9ea 968
d1e14d97 969 if (ptr != 0)
5f0d975b
RG
970 {
971 bool res = (ptr->bits[word_num] & bit_val) == 0;
972 if (res)
973 ptr->bits[word_num] |= bit_val;
974 return res;
975 }
d1e14d97
SB
976
977 ptr = bitmap_element_allocate (head);
978 ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
979 ptr->bits[word_num] = bit_val;
980 if (!head->tree_form)
981 bitmap_list_link_element (head, ptr);
982 else
983 bitmap_tree_link_element (head, ptr);
984 return true;
096ab9ea 985}
a615c28a 986
096ab9ea
RK
987/* Return whether a bit is set within a bitmap. */
988
73658e70 989bool
148909bc 990bitmap_bit_p (const_bitmap head, int bit)
096ab9ea 991{
d1e14d97 992 unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
148909bc 993 const bitmap_element *ptr;
096ab9ea
RK
994 unsigned bit_num;
995 unsigned word_num;
996
d1e14d97 997 if (!head->tree_form)
148909bc 998 ptr = bitmap_list_find_element (const_cast<bitmap> (head), indx);
d1e14d97 999 else
148909bc 1000 ptr = bitmap_tree_find_element (const_cast<bitmap> (head), indx);
096ab9ea
RK
1001 if (ptr == 0)
1002 return 0;
1003
72e42e26
SB
1004 bit_num = bit % BITMAP_WORD_BITS;
1005 word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
096ab9ea 1006
8229306b 1007 return (ptr->bits[word_num] >> bit_num) & 1;
096ab9ea
RK
1008}
1009\f
5ad089a3
AM
1010/* Set CHUNK_SIZE bits at a time in bitmap HEAD.
1011 Store CHUNK_VALUE starting at bits CHUNK * chunk_size.
1012 This is the set routine for viewing bitmap as a multi-bit sparse array. */
1013
1014void
1015bitmap_set_aligned_chunk (bitmap head, unsigned int chunk,
1016 unsigned int chunk_size, BITMAP_WORD chunk_value)
1017{
1018 // Ensure chunk size is a power of 2 and fits in BITMAP_WORD.
1019 gcc_checking_assert (pow2p_hwi (chunk_size));
1020 gcc_checking_assert (chunk_size < (sizeof (BITMAP_WORD) * CHAR_BIT));
1021
1022 // Ensure chunk_value is within range of chunk_size bits.
1023 BITMAP_WORD max_value = (1 << chunk_size) - 1;
1024 gcc_checking_assert (chunk_value <= max_value);
1025
1026 unsigned bit = chunk * chunk_size;
1027 unsigned indx = bit / BITMAP_ELEMENT_ALL_BITS;
1028 bitmap_element *ptr;
1029 if (!head->tree_form)
1030 ptr = bitmap_list_find_element (head, indx);
1031 else
1032 ptr = bitmap_tree_find_element (head, indx);
1033 unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
1034 unsigned bit_num = bit % BITMAP_WORD_BITS;
1035 BITMAP_WORD bit_val = chunk_value << bit_num;
1036 BITMAP_WORD mask = ~(max_value << bit_num);
1037
1038 if (ptr != 0)
1039 {
1040 ptr->bits[word_num] &= mask;
1041 ptr->bits[word_num] |= bit_val;
1042 return;
1043 }
1044
1045 ptr = bitmap_element_allocate (head);
1046 ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
1047 ptr->bits[word_num] = bit_val;
1048 if (!head->tree_form)
1049 bitmap_list_link_element (head, ptr);
1050 else
1051 bitmap_tree_link_element (head, ptr);
1052}
1053
1054/* This is the get routine for viewing bitmap as a multi-bit sparse array.
1055 Return a set of CHUNK_SIZE consecutive bits from HEAD, starting at bit
1056 CHUNK * chunk_size. */
1057
1058BITMAP_WORD
1059bitmap_get_aligned_chunk (const_bitmap head, unsigned int chunk,
1060 unsigned int chunk_size)
1061{
1062 // Ensure chunk size is a power of 2, fits in BITMAP_WORD and is in range.
1063 gcc_checking_assert (pow2p_hwi (chunk_size));
1064 gcc_checking_assert (chunk_size < (sizeof (BITMAP_WORD) * CHAR_BIT));
1065
1066 BITMAP_WORD max_value = (1 << chunk_size) - 1;
1067 unsigned bit = chunk * chunk_size;
1068 unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
1069 const bitmap_element *ptr;
1070 unsigned bit_num;
1071 unsigned word_num;
1072
1073 if (!head->tree_form)
1074 ptr = bitmap_list_find_element (const_cast<bitmap> (head), indx);
1075 else
1076 ptr = bitmap_tree_find_element (const_cast<bitmap> (head), indx);
1077 if (ptr == 0)
1078 return 0;
1079
1080 bit_num = bit % BITMAP_WORD_BITS;
1081 word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
1082
1083 // Return 4 bits.
1084 return (ptr->bits[word_num] >> bit_num) & max_value;
1085}
1086\f
1bc40c7e
KZ
1087#if GCC_VERSION < 3400
1088/* Table of number of set bits in a character, indexed by value of char. */
e326eeb5 1089static const unsigned char popcount_table[] =
1bc40c7e
KZ
1090{
1091 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,
1092 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
1093 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,
1094 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
1095 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,
1096 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,
1097 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,
1098 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,
1099};
1100
1101static unsigned long
1102bitmap_popcount (BITMAP_WORD a)
1103{
1104 unsigned long ret = 0;
1105 unsigned i;
1106
1107 /* Just do this the table way for now */
1108 for (i = 0; i < BITMAP_WORD_BITS; i+= 8)
1109 ret += popcount_table[(a >> i) & 0xff];
1110 return ret;
1111}
1112#endif
478baf91
JL
1113
1114/* Count and return the number of bits set in the bitmap word BITS. */
1115static unsigned long
1116bitmap_count_bits_in_word (const BITMAP_WORD *bits)
1117{
1118 unsigned long count = 0;
1119
1120 for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1121 {
1122#if GCC_VERSION >= 3400
1123 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
1124 of BITMAP_WORD is not material. */
1125 count += __builtin_popcountl (bits[ix]);
1126#else
1127 count += bitmap_popcount (bits[ix]);
1128#endif
1129 }
1130 return count;
1131}
1132
1bc40c7e
KZ
1133/* Count the number of bits set in the bitmap, and return it. */
1134
1135unsigned long
e326eeb5 1136bitmap_count_bits (const_bitmap a)
1bc40c7e
KZ
1137{
1138 unsigned long count = 0;
e326eeb5 1139 const bitmap_element *elt;
1bc40c7e 1140
d1e14d97 1141 gcc_checking_assert (!a->tree_form);
1bc40c7e 1142 for (elt = a->first; elt; elt = elt->next)
478baf91
JL
1143 count += bitmap_count_bits_in_word (elt->bits);
1144
1145 return count;
1146}
1147
1148/* Count the number of unique bits set in A and B and return it. */
1149
1150unsigned long
1151bitmap_count_unique_bits (const_bitmap a, const_bitmap b)
1152{
1153 unsigned long count = 0;
1154 const bitmap_element *elt_a, *elt_b;
1155
1156 for (elt_a = a->first, elt_b = b->first; elt_a && elt_b; )
1bc40c7e 1157 {
478baf91
JL
1158 /* If we're at different indices, then count all the bits
1159 in the lower element. If we're at the same index, then
1160 count the bits in the IOR of the two elements. */
1161 if (elt_a->indx < elt_b->indx)
1bc40c7e 1162 {
478baf91
JL
1163 count += bitmap_count_bits_in_word (elt_a->bits);
1164 elt_a = elt_a->next;
1165 }
1166 else if (elt_b->indx < elt_a->indx)
1167 {
1168 count += bitmap_count_bits_in_word (elt_b->bits);
1169 elt_b = elt_b->next;
1170 }
1171 else
1172 {
1173 BITMAP_WORD bits[BITMAP_ELEMENT_WORDS];
1174 for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1175 bits[ix] = elt_a->bits[ix] | elt_b->bits[ix];
1176 count += bitmap_count_bits_in_word (bits);
1177 elt_a = elt_a->next;
1178 elt_b = elt_b->next;
1bc40c7e
KZ
1179 }
1180 }
1181 return count;
1182}
c22cacf3 1183
76e910c6
RG
1184/* Return true if the bitmap has a single bit set. Otherwise return
1185 false. */
1186
1187bool
1188bitmap_single_bit_set_p (const_bitmap a)
1189{
1190 unsigned long count = 0;
1191 const bitmap_element *elt;
1192 unsigned ix;
1193
1194 if (bitmap_empty_p (a))
1195 return false;
1196
1197 elt = a->first;
d1e14d97 1198
76e910c6
RG
1199 /* As there are no completely empty bitmap elements, a second one
1200 means we have more than one bit set. */
d1e14d97
SB
1201 if (elt->next != NULL
1202 && (!a->tree_form || elt->prev != NULL))
76e910c6
RG
1203 return false;
1204
1205 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1206 {
1207#if GCC_VERSION >= 3400
1208 /* Note that popcountl matches BITMAP_WORD in type, so the actual size
1209 of BITMAP_WORD is not material. */
1210 count += __builtin_popcountl (elt->bits[ix]);
1211#else
1212 count += bitmap_popcount (elt->bits[ix]);
1213#endif
1214 if (count > 1)
1215 return false;
1216 }
1217
1218 return count == 1;
1219}
1bc40c7e
KZ
1220
1221
65a6f342 1222/* Return the bit number of the first set bit in the bitmap. The
f548ece7 1223 bitmap must be non-empty. When CLEAR is true it clears the bit. */
87e08c69 1224
f548ece7
RB
1225static unsigned
1226bitmap_first_set_bit_worker (bitmap a, bool clear)
87e08c69 1227{
f548ece7 1228 bitmap_element *elt = a->first;
65a6f342 1229 unsigned bit_no;
72e42e26 1230 BITMAP_WORD word;
65a6f342 1231 unsigned ix;
c22cacf3 1232
377002a9 1233 gcc_checking_assert (elt);
d1e14d97
SB
1234
1235 if (a->tree_form)
1236 while (elt->prev)
1237 elt = elt->prev;
1238
65a6f342
NS
1239 bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
1240 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
1241 {
1242 word = elt->bits[ix];
1243 if (word)
1244 goto found_bit;
1245 }
298e6adc 1246 gcc_unreachable ();
65a6f342
NS
1247 found_bit:
1248 bit_no += ix * BITMAP_WORD_BITS;
87e08c69 1249
65a6f342 1250#if GCC_VERSION >= 3004
c3284718 1251 gcc_assert (sizeof (long) == sizeof (word));
65a6f342 1252 bit_no += __builtin_ctzl (word);
87e08c69 1253#else
65a6f342
NS
1254 /* Binary search for the first set bit. */
1255#if BITMAP_WORD_BITS > 64
1256#error "Fill out the table."
87e08c69 1257#endif
65a6f342
NS
1258#if BITMAP_WORD_BITS > 32
1259 if (!(word & 0xffffffff))
1260 word >>= 32, bit_no += 32;
87e08c69 1261#endif
65a6f342
NS
1262 if (!(word & 0xffff))
1263 word >>= 16, bit_no += 16;
1264 if (!(word & 0xff))
1265 word >>= 8, bit_no += 8;
1266 if (!(word & 0xf))
1267 word >>= 4, bit_no += 4;
1268 if (!(word & 0x3))
1269 word >>= 2, bit_no += 2;
1270 if (!(word & 0x1))
1271 word >>= 1, bit_no += 1;
c22cacf3 1272
377002a9 1273 gcc_checking_assert (word & 1);
87e08c69 1274#endif
f548ece7
RB
1275
1276 if (clear)
1277 {
1278 elt->bits[ix] &= ~((BITMAP_WORD) 1 << (bit_no % BITMAP_WORD_BITS));
1279 /* If we cleared the entire word, free up the element. */
1280 if (!elt->bits[ix]
1281 && bitmap_element_zerop (elt))
1282 {
1283 if (!a->tree_form)
1284 bitmap_list_unlink_element (a, elt);
1285 else
1286 bitmap_tree_unlink_element (a, elt);
1287 }
1288 }
1289
65a6f342 1290 return bit_no;
87e08c69 1291}
12802c2b 1292
f548ece7
RB
1293/* Return the bit number of the first set bit in the bitmap. The
1294 bitmap must be non-empty. */
1295
1296unsigned
1297bitmap_first_set_bit (const_bitmap a)
1298{
1299 return bitmap_first_set_bit_worker (const_cast<bitmap> (a), false);
1300}
1301
1302/* Return and clear the bit number of the first set bit in the bitmap. The
1303 bitmap must be non-empty. */
1304
1305unsigned
1306bitmap_clear_first_set_bit (bitmap a)
1307{
1308 return bitmap_first_set_bit_worker (a, true);
1309}
1310
12802c2b
JH
1311/* Return the bit number of the first set bit in the bitmap. The
1312 bitmap must be non-empty. */
1313
1314unsigned
1315bitmap_last_set_bit (const_bitmap a)
1316{
d1e14d97 1317 const bitmap_element *elt;
12802c2b
JH
1318 unsigned bit_no;
1319 BITMAP_WORD word;
1320 int ix;
1321
d1e14d97
SB
1322 if (a->tree_form)
1323 elt = a->first;
1324 else
1325 elt = a->current ? a->current : a->first;
377002a9 1326 gcc_checking_assert (elt);
d1e14d97 1327
12802c2b
JH
1328 while (elt->next)
1329 elt = elt->next;
d1e14d97 1330
12802c2b 1331 bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
566422e0 1332 for (ix = BITMAP_ELEMENT_WORDS - 1; ix >= 1; ix--)
12802c2b
JH
1333 {
1334 word = elt->bits[ix];
1335 if (word)
1336 goto found_bit;
1337 }
566422e0 1338 gcc_assert (elt->bits[ix] != 0);
12802c2b
JH
1339 found_bit:
1340 bit_no += ix * BITMAP_WORD_BITS;
12802c2b 1341#if GCC_VERSION >= 3004
c3284718 1342 gcc_assert (sizeof (long) == sizeof (word));
d630245f 1343 bit_no += BITMAP_WORD_BITS - __builtin_clzl (word) - 1;
12802c2b 1344#else
d630245f
SB
1345 /* Hopefully this is a twos-complement host... */
1346 BITMAP_WORD x = word;
1347 x |= (x >> 1);
1348 x |= (x >> 2);
1349 x |= (x >> 4);
1350 x |= (x >> 8);
1351 x |= (x >> 16);
12802c2b 1352#if BITMAP_WORD_BITS > 32
d630245f 1353 x |= (x >> 32);
12802c2b 1354#endif
d630245f 1355 bit_no += bitmap_popcount (x) - 1;
12802c2b
JH
1356#endif
1357
d630245f 1358 return bit_no;
12802c2b 1359}
87e08c69 1360\f
096ab9ea 1361
e28d0cfb 1362/* DST = A & B. */
88c4f655
NS
1363
1364void
e326eeb5 1365bitmap_and (bitmap dst, const_bitmap a, const_bitmap b)
096ab9ea 1366{
88c4f655 1367 bitmap_element *dst_elt = dst->first;
e326eeb5
KG
1368 const bitmap_element *a_elt = a->first;
1369 const bitmap_element *b_elt = b->first;
88c4f655 1370 bitmap_element *dst_prev = NULL;
8229306b 1371
d1e14d97 1372 gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
08a3c5cd
KZ
1373 gcc_assert (dst != a && dst != b);
1374
1375 if (a == b)
1376 {
1377 bitmap_copy (dst, a);
1378 return;
1379 }
1380
88c4f655
NS
1381 while (a_elt && b_elt)
1382 {
1383 if (a_elt->indx < b_elt->indx)
1384 a_elt = a_elt->next;
1385 else if (b_elt->indx < a_elt->indx)
1386 b_elt = b_elt->next;
1387 else
1388 {
1389 /* Matching elts, generate A & B. */
1390 unsigned ix;
1391 BITMAP_WORD ior = 0;
1392
1393 if (!dst_elt)
d1e14d97
SB
1394 dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1395 a_elt->indx);
c22cacf3 1396 else
1bc40c7e 1397 dst_elt->indx = a_elt->indx;
a2b709cc 1398 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
88c4f655
NS
1399 {
1400 BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
096ab9ea 1401
88c4f655
NS
1402 dst_elt->bits[ix] = r;
1403 ior |= r;
1404 }
1405 if (ior)
1406 {
1407 dst_prev = dst_elt;
1408 dst_elt = dst_elt->next;
1409 }
1410 a_elt = a_elt->next;
1411 b_elt = b_elt->next;
1412 }
1413 }
5ce02e40
SP
1414 /* Ensure that dst->current is valid. */
1415 dst->current = dst->first;
88c4f655 1416 bitmap_elt_clear_from (dst, dst_elt);
7a40b8b1 1417 gcc_checking_assert (!dst->current == !dst->first);
88c4f655
NS
1418 if (dst->current)
1419 dst->indx = dst->current->indx;
1420}
1421
7b19209f 1422/* A &= B. Return true if A changed. */
88c4f655 1423
7b19209f 1424bool
e326eeb5 1425bitmap_and_into (bitmap a, const_bitmap b)
88c4f655
NS
1426{
1427 bitmap_element *a_elt = a->first;
e326eeb5 1428 const bitmap_element *b_elt = b->first;
88c4f655 1429 bitmap_element *next;
7b19209f 1430 bool changed = false;
096ab9ea 1431
d1e14d97
SB
1432 gcc_checking_assert (!a->tree_form && !b->tree_form);
1433
c22cacf3 1434 if (a == b)
7b19209f 1435 return false;
08a3c5cd 1436
88c4f655 1437 while (a_elt && b_elt)
096ab9ea 1438 {
88c4f655
NS
1439 if (a_elt->indx < b_elt->indx)
1440 {
1441 next = a_elt->next;
d1e14d97 1442 bitmap_list_unlink_element (a, a_elt);
88c4f655 1443 a_elt = next;
7b19209f 1444 changed = true;
88c4f655
NS
1445 }
1446 else if (b_elt->indx < a_elt->indx)
1447 b_elt = b_elt->next;
1448 else
096ab9ea 1449 {
88c4f655
NS
1450 /* Matching elts, generate A &= B. */
1451 unsigned ix;
1452 BITMAP_WORD ior = 0;
1453
a2b709cc 1454 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
88c4f655
NS
1455 {
1456 BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
7b19209f
SB
1457 if (a_elt->bits[ix] != r)
1458 changed = true;
88c4f655
NS
1459 a_elt->bits[ix] = r;
1460 ior |= r;
1461 }
1462 next = a_elt->next;
1463 if (!ior)
d1e14d97 1464 bitmap_list_unlink_element (a, a_elt);
88c4f655
NS
1465 a_elt = next;
1466 b_elt = b_elt->next;
096ab9ea 1467 }
88c4f655 1468 }
7b19209f
SB
1469
1470 if (a_elt)
1471 {
1472 changed = true;
1473 bitmap_elt_clear_from (a, a_elt);
1474 }
1475
7a40b8b1
JH
1476 gcc_checking_assert (!a->current == !a->first
1477 && (!a->current || a->indx == a->current->indx));
7b19209f
SB
1478
1479 return changed;
88c4f655
NS
1480}
1481
6fb5fa3c
DB
1482
1483/* Insert an element equal to SRC_ELT after DST_PREV, overwriting DST_ELT
1484 if non-NULL. CHANGED is true if the destination bitmap had already been
1485 changed; the new value of CHANGED is returned. */
1486
1487static inline bool
1488bitmap_elt_copy (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
e326eeb5 1489 const bitmap_element *src_elt, bool changed)
6fb5fa3c
DB
1490{
1491 if (!changed && dst_elt && dst_elt->indx == src_elt->indx)
1492 {
1493 unsigned ix;
1494
a2b709cc 1495 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
6fb5fa3c
DB
1496 if (src_elt->bits[ix] != dst_elt->bits[ix])
1497 {
1498 dst_elt->bits[ix] = src_elt->bits[ix];
1499 changed = true;
1500 }
1501 }
1502 else
1503 {
1504 changed = true;
1505 if (!dst_elt)
d1e14d97
SB
1506 dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1507 src_elt->indx);
6fb5fa3c
DB
1508 else
1509 dst_elt->indx = src_elt->indx;
1510 memcpy (dst_elt->bits, src_elt->bits, sizeof (dst_elt->bits));
1511 }
1512 return changed;
1513}
1514
1515
1516
88c4f655
NS
1517/* DST = A & ~B */
1518
6fb5fa3c 1519bool
e326eeb5 1520bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
88c4f655
NS
1521{
1522 bitmap_element *dst_elt = dst->first;
e326eeb5
KG
1523 const bitmap_element *a_elt = a->first;
1524 const bitmap_element *b_elt = b->first;
88c4f655 1525 bitmap_element *dst_prev = NULL;
6fb5fa3c
DB
1526 bitmap_element **dst_prev_pnext = &dst->first;
1527 bool changed = false;
88c4f655 1528
d1e14d97 1529 gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
08a3c5cd 1530 gcc_assert (dst != a && dst != b);
c22cacf3 1531
08a3c5cd
KZ
1532 if (a == b)
1533 {
6fb5fa3c 1534 changed = !bitmap_empty_p (dst);
08a3c5cd 1535 bitmap_clear (dst);
6fb5fa3c 1536 return changed;
08a3c5cd
KZ
1537 }
1538
88c4f655
NS
1539 while (a_elt)
1540 {
6fb5fa3c
DB
1541 while (b_elt && b_elt->indx < a_elt->indx)
1542 b_elt = b_elt->next;
1543
1544 if (!b_elt || b_elt->indx > a_elt->indx)
096ab9ea 1545 {
6fb5fa3c
DB
1546 changed = bitmap_elt_copy (dst, dst_elt, dst_prev, a_elt, changed);
1547 dst_prev = *dst_prev_pnext;
1548 dst_prev_pnext = &dst_prev->next;
1549 dst_elt = *dst_prev_pnext;
88c4f655 1550 a_elt = a_elt->next;
096ab9ea 1551 }
6fb5fa3c 1552
096ab9ea
RK
1553 else
1554 {
88c4f655
NS
1555 /* Matching elts, generate A & ~B. */
1556 unsigned ix;
1557 BITMAP_WORD ior = 0;
1558
6fb5fa3c
DB
1559 if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
1560 {
a2b709cc 1561 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
6fb5fa3c
DB
1562 {
1563 BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1564
1565 if (dst_elt->bits[ix] != r)
1566 {
1567 changed = true;
1568 dst_elt->bits[ix] = r;
1569 }
1570 ior |= r;
1571 }
1572 }
c22cacf3 1573 else
88c4f655 1574 {
6fb5fa3c
DB
1575 bool new_element;
1576 if (!dst_elt || dst_elt->indx > a_elt->indx)
1577 {
d1e14d97
SB
1578 dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
1579 a_elt->indx);
6fb5fa3c
DB
1580 new_element = true;
1581 }
1582 else
1583 {
1584 dst_elt->indx = a_elt->indx;
1585 new_element = false;
1586 }
88c4f655 1587
a2b709cc 1588 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
6fb5fa3c
DB
1589 {
1590 BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
1591
1592 dst_elt->bits[ix] = r;
1593 ior |= r;
1594 }
1595
1596 if (ior)
1597 changed = true;
1598 else
1599 {
1600 changed |= !new_element;
d1e14d97 1601 bitmap_list_unlink_element (dst, dst_elt);
6fb5fa3c
DB
1602 dst_elt = *dst_prev_pnext;
1603 }
88c4f655 1604 }
6fb5fa3c 1605
88c4f655
NS
1606 if (ior)
1607 {
6fb5fa3c
DB
1608 dst_prev = *dst_prev_pnext;
1609 dst_prev_pnext = &dst_prev->next;
1610 dst_elt = *dst_prev_pnext;
88c4f655
NS
1611 }
1612 a_elt = a_elt->next;
1613 b_elt = b_elt->next;
096ab9ea 1614 }
88c4f655 1615 }
6fb5fa3c 1616
5ce02e40
SP
1617 /* Ensure that dst->current is valid. */
1618 dst->current = dst->first;
6fb5fa3c
DB
1619
1620 if (dst_elt)
1621 {
1622 changed = true;
1623 bitmap_elt_clear_from (dst, dst_elt);
1624 }
7a40b8b1 1625 gcc_checking_assert (!dst->current == !dst->first);
88c4f655
NS
1626 if (dst->current)
1627 dst->indx = dst->current->indx;
6fb5fa3c
DB
1628
1629 return changed;
88c4f655
NS
1630}
1631
90bb1c1f 1632/* A &= ~B. Returns true if A changes */
096ab9ea 1633
90bb1c1f 1634bool
e326eeb5 1635bitmap_and_compl_into (bitmap a, const_bitmap b)
88c4f655
NS
1636{
1637 bitmap_element *a_elt = a->first;
e326eeb5 1638 const bitmap_element *b_elt = b->first;
88c4f655 1639 bitmap_element *next;
90bb1c1f 1640 BITMAP_WORD changed = 0;
88c4f655 1641
d1e14d97
SB
1642 gcc_checking_assert (!a->tree_form && !b->tree_form);
1643
08a3c5cd
KZ
1644 if (a == b)
1645 {
1646 if (bitmap_empty_p (a))
1647 return false;
1648 else
1649 {
1650 bitmap_clear (a);
1651 return true;
1652 }
1653 }
1654
88c4f655
NS
1655 while (a_elt && b_elt)
1656 {
1657 if (a_elt->indx < b_elt->indx)
1658 a_elt = a_elt->next;
1659 else if (b_elt->indx < a_elt->indx)
1660 b_elt = b_elt->next;
1661 else
8229306b 1662 {
88c4f655
NS
1663 /* Matching elts, generate A &= ~B. */
1664 unsigned ix;
1665 BITMAP_WORD ior = 0;
1666
a2b709cc 1667 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
88c4f655 1668 {
90bb1c1f
NS
1669 BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1670 BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
88c4f655
NS
1671
1672 a_elt->bits[ix] = r;
90bb1c1f 1673 changed |= cleared;
88c4f655
NS
1674 ior |= r;
1675 }
1676 next = a_elt->next;
1677 if (!ior)
d1e14d97 1678 bitmap_list_unlink_element (a, a_elt);
88c4f655
NS
1679 a_elt = next;
1680 b_elt = b_elt->next;
8229306b 1681 }
88c4f655 1682 }
7a40b8b1
JH
1683 gcc_checking_assert (!a->current == !a->first
1684 && (!a->current || a->indx == a->current->indx));
90bb1c1f 1685 return changed != 0;
88c4f655
NS
1686}
1687
6fb5fa3c
DB
1688/* Set COUNT bits from START in HEAD. */
1689void
1690bitmap_set_range (bitmap head, unsigned int start, unsigned int count)
1691{
1692 unsigned int first_index, end_bit_plus1, last_index;
1693 bitmap_element *elt, *elt_prev;
1694 unsigned int i;
1695
d1e14d97
SB
1696 gcc_checking_assert (!head->tree_form);
1697
6fb5fa3c
DB
1698 if (!count)
1699 return;
1700
07a737f3
RS
1701 if (count == 1)
1702 {
1703 bitmap_set_bit (head, start);
1704 return;
1705 }
1706
6fb5fa3c
DB
1707 first_index = start / BITMAP_ELEMENT_ALL_BITS;
1708 end_bit_plus1 = start + count;
1709 last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
d1e14d97 1710 elt = bitmap_list_find_element (head, first_index);
6fb5fa3c 1711
d1e14d97 1712 /* If bitmap_list_find_element returns zero, the current is the closest block
6fb5fa3c
DB
1713 to the result. Otherwise, just use bitmap_element_allocate to
1714 ensure ELT is set; in the loop below, ELT == NULL means "insert
1715 at the end of the bitmap". */
1716 if (!elt)
1717 {
1718 elt = bitmap_element_allocate (head);
1719 elt->indx = first_index;
d1e14d97 1720 bitmap_list_link_element (head, elt);
6fb5fa3c
DB
1721 }
1722
377002a9 1723 gcc_checking_assert (elt->indx == first_index);
6fb5fa3c
DB
1724 elt_prev = elt->prev;
1725 for (i = first_index; i <= last_index; i++)
1726 {
1727 unsigned elt_start_bit = i * BITMAP_ELEMENT_ALL_BITS;
1728 unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1729
1730 unsigned int first_word_to_mod;
1731 BITMAP_WORD first_mask;
1732 unsigned int last_word_to_mod;
1733 BITMAP_WORD last_mask;
1734 unsigned int ix;
1735
1736 if (!elt || elt->indx != i)
d1e14d97 1737 elt = bitmap_list_insert_element_after (head, elt_prev, i);
6fb5fa3c
DB
1738
1739 if (elt_start_bit <= start)
1740 {
1741 /* The first bit to turn on is somewhere inside this
1742 elt. */
1743 first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1744
1745 /* This mask should have 1s in all bits >= start position. */
1746 first_mask =
1747 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1748 first_mask = ~first_mask;
1749 }
1750 else
1751 {
1752 /* The first bit to turn on is below this start of this elt. */
1753 first_word_to_mod = 0;
1754 first_mask = ~(BITMAP_WORD) 0;
1755 }
1756
1757 if (elt_end_bit_plus1 <= end_bit_plus1)
1758 {
1759 /* The last bit to turn on is beyond this elt. */
1760 last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1761 last_mask = ~(BITMAP_WORD) 0;
1762 }
1763 else
1764 {
1765 /* The last bit to turn on is inside to this elt. */
1766 last_word_to_mod =
1767 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1768
1769 /* The last mask should have 1s below the end bit. */
1770 last_mask =
1771 (((BITMAP_WORD) 1) << ((end_bit_plus1 % BITMAP_WORD_BITS))) - 1;
1772 }
1773
1774 if (first_word_to_mod == last_word_to_mod)
1775 {
1776 BITMAP_WORD mask = first_mask & last_mask;
1777 elt->bits[first_word_to_mod] |= mask;
1778 }
1779 else
1780 {
1781 elt->bits[first_word_to_mod] |= first_mask;
1782 if (BITMAP_ELEMENT_WORDS > 2)
1783 for (ix = first_word_to_mod + 1; ix < last_word_to_mod; ix++)
1784 elt->bits[ix] = ~(BITMAP_WORD) 0;
1785 elt->bits[last_word_to_mod] |= last_mask;
1786 }
1787
1788 elt_prev = elt;
1789 elt = elt->next;
1790 }
1791
1792 head->current = elt ? elt : elt_prev;
1793 head->indx = head->current->indx;
1794}
1795
1bc40c7e
KZ
1796/* Clear COUNT bits from START in HEAD. */
1797void
1798bitmap_clear_range (bitmap head, unsigned int start, unsigned int count)
1799{
6fb5fa3c
DB
1800 unsigned int first_index, end_bit_plus1, last_index;
1801 bitmap_element *elt;
1802
d1e14d97
SB
1803 gcc_checking_assert (!head->tree_form);
1804
6fb5fa3c
DB
1805 if (!count)
1806 return;
1807
07a737f3
RS
1808 if (count == 1)
1809 {
1810 bitmap_clear_bit (head, start);
1811 return;
1812 }
1813
6fb5fa3c
DB
1814 first_index = start / BITMAP_ELEMENT_ALL_BITS;
1815 end_bit_plus1 = start + count;
1816 last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS;
d1e14d97 1817 elt = bitmap_list_find_element (head, first_index);
1bc40c7e 1818
d1e14d97 1819 /* If bitmap_list_find_element returns zero, the current is the closest block
1bc40c7e
KZ
1820 to the result. If the current is less than first index, find the
1821 next one. Otherwise, just set elt to be current. */
1822 if (!elt)
c22cacf3 1823 {
1bc40c7e
KZ
1824 if (head->current)
1825 {
1826 if (head->indx < first_index)
1827 {
1828 elt = head->current->next;
1829 if (!elt)
1830 return;
1831 }
c22cacf3 1832 else
1bc40c7e
KZ
1833 elt = head->current;
1834 }
1835 else
1836 return;
1837 }
1838
1839 while (elt && (elt->indx <= last_index))
1840 {
1841 bitmap_element * next_elt = elt->next;
1842 unsigned elt_start_bit = (elt->indx) * BITMAP_ELEMENT_ALL_BITS;
1843 unsigned elt_end_bit_plus1 = elt_start_bit + BITMAP_ELEMENT_ALL_BITS;
1844
1845
1846 if (elt_start_bit >= start && elt_end_bit_plus1 <= end_bit_plus1)
1847 /* Get rid of the entire elt and go to the next one. */
d1e14d97 1848 bitmap_list_unlink_element (head, elt);
c22cacf3 1849 else
1bc40c7e
KZ
1850 {
1851 /* Going to have to knock out some bits in this elt. */
c22cacf3
MS
1852 unsigned int first_word_to_mod;
1853 BITMAP_WORD first_mask;
1bc40c7e
KZ
1854 unsigned int last_word_to_mod;
1855 BITMAP_WORD last_mask;
1856 unsigned int i;
1857 bool clear = true;
1858
1859 if (elt_start_bit <= start)
1860 {
1861 /* The first bit to turn off is somewhere inside this
1862 elt. */
1863 first_word_to_mod = (start - elt_start_bit) / BITMAP_WORD_BITS;
1864
1865 /* This mask should have 1s in all bits >= start position. */
c22cacf3 1866 first_mask =
1bc40c7e
KZ
1867 (((BITMAP_WORD) 1) << ((start % BITMAP_WORD_BITS))) - 1;
1868 first_mask = ~first_mask;
1869 }
1870 else
1871 {
1872 /* The first bit to turn off is below this start of this elt. */
1873 first_word_to_mod = 0;
1874 first_mask = 0;
1875 first_mask = ~first_mask;
c22cacf3
MS
1876 }
1877
1bc40c7e
KZ
1878 if (elt_end_bit_plus1 <= end_bit_plus1)
1879 {
1880 /* The last bit to turn off is beyond this elt. */
1881 last_word_to_mod = BITMAP_ELEMENT_WORDS - 1;
1882 last_mask = 0;
1883 last_mask = ~last_mask;
1884 }
1885 else
1886 {
1887 /* The last bit to turn off is inside to this elt. */
c22cacf3 1888 last_word_to_mod =
1bc40c7e
KZ
1889 (end_bit_plus1 - elt_start_bit) / BITMAP_WORD_BITS;
1890
1891 /* The last mask should have 1s below the end bit. */
c22cacf3 1892 last_mask =
1bc40c7e
KZ
1893 (((BITMAP_WORD) 1) << (((end_bit_plus1) % BITMAP_WORD_BITS))) - 1;
1894 }
1895
1896
1897 if (first_word_to_mod == last_word_to_mod)
1898 {
1899 BITMAP_WORD mask = first_mask & last_mask;
1900 elt->bits[first_word_to_mod] &= ~mask;
1901 }
1902 else
1903 {
1904 elt->bits[first_word_to_mod] &= ~first_mask;
6fb5fa3c
DB
1905 if (BITMAP_ELEMENT_WORDS > 2)
1906 for (i = first_word_to_mod + 1; i < last_word_to_mod; i++)
1907 elt->bits[i] = 0;
1bc40c7e
KZ
1908 elt->bits[last_word_to_mod] &= ~last_mask;
1909 }
1910 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
1911 if (elt->bits[i])
1912 {
1913 clear = false;
1914 break;
1915 }
1916 /* Check to see if there are any bits left. */
1917 if (clear)
d1e14d97 1918 bitmap_list_unlink_element (head, elt);
1bc40c7e
KZ
1919 }
1920 elt = next_elt;
1921 }
c22cacf3 1922
1bc40c7e
KZ
1923 if (elt)
1924 {
1925 head->current = elt;
1926 head->indx = head->current->indx;
1927 }
1928}
1929
1930/* A = ~A & B. */
1931
1932void
e326eeb5 1933bitmap_compl_and_into (bitmap a, const_bitmap b)
1bc40c7e
KZ
1934{
1935 bitmap_element *a_elt = a->first;
e326eeb5 1936 const bitmap_element *b_elt = b->first;
1bc40c7e
KZ
1937 bitmap_element *a_prev = NULL;
1938 bitmap_element *next;
1939
d1e14d97 1940 gcc_checking_assert (!a->tree_form && !b->tree_form);
1bc40c7e
KZ
1941 gcc_assert (a != b);
1942
1943 if (bitmap_empty_p (a))
1944 {
1945 bitmap_copy (a, b);
1946 return;
1947 }
1948 if (bitmap_empty_p (b))
1949 {
1950 bitmap_clear (a);
1951 return;
1952 }
1953
1954 while (a_elt || b_elt)
1955 {
1956 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
1957 {
1958 /* A is before B. Remove A */
1959 next = a_elt->next;
1960 a_prev = a_elt->prev;
d1e14d97 1961 bitmap_list_unlink_element (a, a_elt);
1bc40c7e
KZ
1962 a_elt = next;
1963 }
1964 else if (!a_elt || b_elt->indx < a_elt->indx)
1965 {
1966 /* B is before A. Copy B. */
d1e14d97 1967 next = bitmap_list_insert_element_after (a, a_prev, b_elt->indx);
1bc40c7e
KZ
1968 memcpy (next->bits, b_elt->bits, sizeof (next->bits));
1969 a_prev = next;
1970 b_elt = b_elt->next;
1971 }
1972 else
1973 {
1974 /* Matching elts, generate A = ~A & B. */
1975 unsigned ix;
1976 BITMAP_WORD ior = 0;
1977
a2b709cc 1978 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
1bc40c7e
KZ
1979 {
1980 BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
1981 BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
1982
1983 a_elt->bits[ix] = r;
1984 ior |= r;
1985 }
1986 next = a_elt->next;
1987 if (!ior)
d1e14d97 1988 bitmap_list_unlink_element (a, a_elt);
1bc40c7e
KZ
1989 else
1990 a_prev = a_elt;
1991 a_elt = next;
1992 b_elt = b_elt->next;
1993 }
1994 }
7a40b8b1
JH
1995 gcc_checking_assert (!a->current == !a->first
1996 && (!a->current || a->indx == a->current->indx));
1bc40c7e
KZ
1997 return;
1998}
1999
6fb5fa3c
DB
2000
2001/* Insert an element corresponding to A_ELT | B_ELT after DST_PREV,
2002 overwriting DST_ELT if non-NULL. CHANGED is true if the destination bitmap
2003 had already been changed; the new value of CHANGED is returned. */
2004
2005static inline bool
2006bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
e326eeb5 2007 const bitmap_element *a_elt, const bitmap_element *b_elt,
6fb5fa3c
DB
2008 bool changed)
2009{
2010 gcc_assert (a_elt || b_elt);
2011
2012 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
2013 {
2014 /* Matching elts, generate A | B. */
2015 unsigned ix;
2016
2017 if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
2018 {
a2b709cc 2019 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
6fb5fa3c
DB
2020 {
2021 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
2022 if (r != dst_elt->bits[ix])
2023 {
2024 dst_elt->bits[ix] = r;
2025 changed = true;
2026 }
2027 }
2028 }
2029 else
2030 {
2031 changed = true;
2032 if (!dst_elt)
d1e14d97
SB
2033 dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
2034 a_elt->indx);
6fb5fa3c
DB
2035 else
2036 dst_elt->indx = a_elt->indx;
a2b709cc 2037 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
6fb5fa3c
DB
2038 {
2039 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
2040 dst_elt->bits[ix] = r;
2041 }
2042 }
2043 }
2044 else
2045 {
2046 /* Copy a single element. */
e326eeb5 2047 const bitmap_element *src;
6fb5fa3c
DB
2048
2049 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
2050 src = a_elt;
2051 else
2052 src = b_elt;
2053
377002a9 2054 gcc_checking_assert (src);
6fb5fa3c
DB
2055 changed = bitmap_elt_copy (dst, dst_elt, dst_prev, src, changed);
2056 }
2057 return changed;
2058}
2059
2060
88c4f655
NS
2061/* DST = A | B. Return true if DST changes. */
2062
2063bool
e326eeb5 2064bitmap_ior (bitmap dst, const_bitmap a, const_bitmap b)
88c4f655
NS
2065{
2066 bitmap_element *dst_elt = dst->first;
e326eeb5
KG
2067 const bitmap_element *a_elt = a->first;
2068 const bitmap_element *b_elt = b->first;
88c4f655 2069 bitmap_element *dst_prev = NULL;
6fb5fa3c 2070 bitmap_element **dst_prev_pnext = &dst->first;
c22cacf3 2071 bool changed = false;
88c4f655 2072
d1e14d97 2073 gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
08a3c5cd
KZ
2074 gcc_assert (dst != a && dst != b);
2075
88c4f655
NS
2076 while (a_elt || b_elt)
2077 {
6fb5fa3c
DB
2078 changed = bitmap_elt_ior (dst, dst_elt, dst_prev, a_elt, b_elt, changed);
2079
88c4f655 2080 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
8229306b 2081 {
88c4f655
NS
2082 a_elt = a_elt->next;
2083 b_elt = b_elt->next;
8229306b
RH
2084 }
2085 else
096ab9ea 2086 {
6fb5fa3c
DB
2087 if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
2088 a_elt = a_elt->next;
2089 else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
2090 b_elt = b_elt->next;
096ab9ea 2091 }
6fb5fa3c
DB
2092
2093 dst_prev = *dst_prev_pnext;
2094 dst_prev_pnext = &dst_prev->next;
2095 dst_elt = *dst_prev_pnext;
88c4f655
NS
2096 }
2097
2098 if (dst_elt)
2099 {
2100 changed = true;
9e5d3a2c
MS
2101 /* Ensure that dst->current is valid. */
2102 dst->current = dst->first;
88c4f655
NS
2103 bitmap_elt_clear_from (dst, dst_elt);
2104 }
7a40b8b1 2105 gcc_checking_assert (!dst->current == !dst->first);
88c4f655
NS
2106 if (dst->current)
2107 dst->indx = dst->current->indx;
2108 return changed;
2109}
096ab9ea 2110
88c4f655
NS
2111/* A |= B. Return true if A changes. */
2112
2113bool
e326eeb5 2114bitmap_ior_into (bitmap a, const_bitmap b)
88c4f655
NS
2115{
2116 bitmap_element *a_elt = a->first;
e326eeb5 2117 const bitmap_element *b_elt = b->first;
88c4f655 2118 bitmap_element *a_prev = NULL;
6fb5fa3c 2119 bitmap_element **a_prev_pnext = &a->first;
88c4f655
NS
2120 bool changed = false;
2121
d1e14d97 2122 gcc_checking_assert (!a->tree_form && !b->tree_form);
08a3c5cd
KZ
2123 if (a == b)
2124 return false;
2125
88c4f655
NS
2126 while (b_elt)
2127 {
6fb5fa3c
DB
2128 /* If A lags behind B, just advance it. */
2129 if (!a_elt || a_elt->indx == b_elt->indx)
88c4f655 2130 {
6fb5fa3c 2131 changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
88c4f655 2132 b_elt = b_elt->next;
b9a73e32 2133 }
6fb5fa3c 2134 else if (a_elt->indx > b_elt->indx)
b9a73e32 2135 {
6fb5fa3c 2136 changed = bitmap_elt_copy (a, NULL, a_prev, b_elt, changed);
88c4f655 2137 b_elt = b_elt->next;
096ab9ea 2138 }
6fb5fa3c
DB
2139
2140 a_prev = *a_prev_pnext;
2141 a_prev_pnext = &a_prev->next;
2142 a_elt = *a_prev_pnext;
096ab9ea 2143 }
6fb5fa3c 2144
7a40b8b1 2145 gcc_checking_assert (!a->current == !a->first);
88c4f655
NS
2146 if (a->current)
2147 a->indx = a->current->indx;
2148 return changed;
2149}
2150
029ca388
RB
2151/* A |= B. Return true if A changes. Free B (re-using its storage
2152 for the result). */
2153
2154bool
2155bitmap_ior_into_and_free (bitmap a, bitmap *b_)
2156{
2157 bitmap b = *b_;
2158 bitmap_element *a_elt = a->first;
2159 bitmap_element *b_elt = b->first;
2160 bitmap_element *a_prev = NULL;
2161 bitmap_element **a_prev_pnext = &a->first;
2162 bool changed = false;
2163
2164 gcc_checking_assert (!a->tree_form && !b->tree_form);
2165 gcc_assert (a->obstack == b->obstack);
2166 if (a == b)
2167 return false;
2168
2169 while (b_elt)
2170 {
2171 /* If A lags behind B, just advance it. */
2172 if (!a_elt || a_elt->indx == b_elt->indx)
2173 {
2174 changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, b_elt, changed);
2175 b_elt = b_elt->next;
2176 }
2177 else if (a_elt->indx > b_elt->indx)
2178 {
2179 bitmap_element *b_elt_next = b_elt->next;
2180 bitmap_list_unlink_element (b, b_elt, false);
2181 bitmap_list_insert_element_after (a, a_prev, b_elt->indx, b_elt);
2182 b_elt = b_elt_next;
2183 }
2184
2185 a_prev = *a_prev_pnext;
2186 a_prev_pnext = &a_prev->next;
2187 a_elt = *a_prev_pnext;
2188 }
2189
2190 gcc_checking_assert (!a->current == !a->first);
2191 if (a->current)
2192 a->indx = a->current->indx;
2193
2194 if (b->obstack)
2195 BITMAP_FREE (*b_);
2196 else
2197 bitmap_clear (b);
2198 return changed;
2199}
2200
88c4f655 2201/* DST = A ^ B */
096ab9ea 2202
88c4f655 2203void
e326eeb5 2204bitmap_xor (bitmap dst, const_bitmap a, const_bitmap b)
88c4f655
NS
2205{
2206 bitmap_element *dst_elt = dst->first;
e326eeb5
KG
2207 const bitmap_element *a_elt = a->first;
2208 const bitmap_element *b_elt = b->first;
88c4f655
NS
2209 bitmap_element *dst_prev = NULL;
2210
d1e14d97 2211 gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form);
08a3c5cd 2212 gcc_assert (dst != a && dst != b);
d1e14d97 2213
08a3c5cd
KZ
2214 if (a == b)
2215 {
2216 bitmap_clear (dst);
2217 return;
2218 }
2219
88c4f655 2220 while (a_elt || b_elt)
096ab9ea 2221 {
88c4f655 2222 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
e2500fed 2223 {
88c4f655
NS
2224 /* Matching elts, generate A ^ B. */
2225 unsigned ix;
2226 BITMAP_WORD ior = 0;
2227
2228 if (!dst_elt)
d1e14d97
SB
2229 dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
2230 a_elt->indx);
1bc40c7e
KZ
2231 else
2232 dst_elt->indx = a_elt->indx;
a2b709cc 2233 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
88c4f655
NS
2234 {
2235 BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
2236
2237 ior |= r;
2238 dst_elt->bits[ix] = r;
2239 }
2240 a_elt = a_elt->next;
2241 b_elt = b_elt->next;
2242 if (ior)
2243 {
2244 dst_prev = dst_elt;
2245 dst_elt = dst_elt->next;
2246 }
e2500fed
GK
2247 }
2248 else
2249 {
88c4f655 2250 /* Copy a single element. */
e326eeb5 2251 const bitmap_element *src;
88c4f655
NS
2252
2253 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
2254 {
2255 src = a_elt;
2256 a_elt = a_elt->next;
2257 }
2258 else
2259 {
2260 src = b_elt;
2261 b_elt = b_elt->next;
2262 }
2263
2264 if (!dst_elt)
d1e14d97
SB
2265 dst_elt = bitmap_list_insert_element_after (dst, dst_prev,
2266 src->indx);
c22cacf3 2267 else
1bc40c7e 2268 dst_elt->indx = src->indx;
88c4f655
NS
2269 memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
2270 dst_prev = dst_elt;
2271 dst_elt = dst_elt->next;
e2500fed 2272 }
096ab9ea 2273 }
5ce02e40
SP
2274 /* Ensure that dst->current is valid. */
2275 dst->current = dst->first;
88c4f655 2276 bitmap_elt_clear_from (dst, dst_elt);
7a40b8b1 2277 gcc_checking_assert (!dst->current == !dst->first);
88c4f655
NS
2278 if (dst->current)
2279 dst->indx = dst->current->indx;
2280}
096ab9ea 2281
88c4f655 2282/* A ^= B */
8229306b 2283
88c4f655 2284void
e326eeb5 2285bitmap_xor_into (bitmap a, const_bitmap b)
88c4f655
NS
2286{
2287 bitmap_element *a_elt = a->first;
e326eeb5 2288 const bitmap_element *b_elt = b->first;
88c4f655
NS
2289 bitmap_element *a_prev = NULL;
2290
d1e14d97
SB
2291 gcc_checking_assert (!a->tree_form && !b->tree_form);
2292
08a3c5cd
KZ
2293 if (a == b)
2294 {
2295 bitmap_clear (a);
2296 return;
2297 }
2298
88c4f655
NS
2299 while (b_elt)
2300 {
2301 if (!a_elt || b_elt->indx < a_elt->indx)
2302 {
2303 /* Copy b_elt. */
d1e14d97
SB
2304 bitmap_element *dst = bitmap_list_insert_element_after (a, a_prev,
2305 b_elt->indx);
88c4f655
NS
2306 memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
2307 a_prev = dst;
2308 b_elt = b_elt->next;
2309 }
2310 else if (a_elt->indx < b_elt->indx)
2311 {
2312 a_prev = a_elt;
2313 a_elt = a_elt->next;
2314 }
2315 else
2316 {
2317 /* Matching elts, generate A ^= B. */
2318 unsigned ix;
2319 BITMAP_WORD ior = 0;
2320 bitmap_element *next = a_elt->next;
2321
a2b709cc 2322 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
88c4f655
NS
2323 {
2324 BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
2325
2326 ior |= r;
2327 a_elt->bits[ix] = r;
2328 }
2329 b_elt = b_elt->next;
2330 if (ior)
2331 a_prev = a_elt;
2332 else
d1e14d97 2333 bitmap_list_unlink_element (a, a_elt);
88c4f655
NS
2334 a_elt = next;
2335 }
2336 }
7a40b8b1 2337 gcc_checking_assert (!a->current == !a->first);
88c4f655
NS
2338 if (a->current)
2339 a->indx = a->current->indx;
8229306b
RH
2340}
2341
55994078
NS
2342/* Return true if two bitmaps are identical.
2343 We do not bother with a check for pointer equality, as that never
2344 occurs in practice. */
8229306b 2345
55994078 2346bool
e326eeb5 2347bitmap_equal_p (const_bitmap a, const_bitmap b)
8229306b 2348{
e326eeb5
KG
2349 const bitmap_element *a_elt;
2350 const bitmap_element *b_elt;
55994078 2351 unsigned ix;
c22cacf3 2352
d1e14d97
SB
2353 gcc_checking_assert (!a->tree_form && !b->tree_form);
2354
55994078
NS
2355 for (a_elt = a->first, b_elt = b->first;
2356 a_elt && b_elt;
2357 a_elt = a_elt->next, b_elt = b_elt->next)
2358 {
2359 if (a_elt->indx != b_elt->indx)
2360 return false;
a2b709cc 2361 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
55994078
NS
2362 if (a_elt->bits[ix] != b_elt->bits[ix])
2363 return false;
2364 }
2365 return !a_elt && !b_elt;
2366}
2367
2368/* Return true if A AND B is not empty. */
2369
2370bool
e326eeb5 2371bitmap_intersect_p (const_bitmap a, const_bitmap b)
55994078 2372{
e326eeb5
KG
2373 const bitmap_element *a_elt;
2374 const bitmap_element *b_elt;
55994078 2375 unsigned ix;
c22cacf3 2376
d1e14d97
SB
2377 gcc_checking_assert (!a->tree_form && !b->tree_form);
2378
55994078
NS
2379 for (a_elt = a->first, b_elt = b->first;
2380 a_elt && b_elt;)
2381 {
2382 if (a_elt->indx < b_elt->indx)
2383 a_elt = a_elt->next;
2384 else if (b_elt->indx < a_elt->indx)
2385 b_elt = b_elt->next;
2386 else
2387 {
a2b709cc 2388 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
55994078
NS
2389 if (a_elt->bits[ix] & b_elt->bits[ix])
2390 return true;
2391 a_elt = a_elt->next;
2392 b_elt = b_elt->next;
2393 }
2394 }
2395 return false;
2396}
8229306b 2397
55994078 2398/* Return true if A AND NOT B is not empty. */
8229306b 2399
55994078 2400bool
e326eeb5 2401bitmap_intersect_compl_p (const_bitmap a, const_bitmap b)
55994078 2402{
e326eeb5
KG
2403 const bitmap_element *a_elt;
2404 const bitmap_element *b_elt;
55994078 2405 unsigned ix;
d1e14d97
SB
2406
2407 gcc_checking_assert (!a->tree_form && !b->tree_form);
2408
55994078
NS
2409 for (a_elt = a->first, b_elt = b->first;
2410 a_elt && b_elt;)
2411 {
2412 if (a_elt->indx < b_elt->indx)
2413 return true;
2414 else if (b_elt->indx < a_elt->indx)
2415 b_elt = b_elt->next;
2416 else
2417 {
a2b709cc 2418 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
55994078
NS
2419 if (a_elt->bits[ix] & ~b_elt->bits[ix])
2420 return true;
2421 a_elt = a_elt->next;
2422 b_elt = b_elt->next;
2423 }
2424 }
2425 return a_elt != NULL;
096ab9ea 2426}
55994078 2427
096ab9ea 2428\f
88c4f655 2429/* DST = A | (FROM1 & ~FROM2). Return true if DST changes. */
096ab9ea 2430
7ef7b345 2431bool
e326eeb5 2432bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b, const_bitmap kill)
096ab9ea 2433{
6fb5fa3c 2434 bool changed = false;
7932a3db 2435
6fb5fa3c 2436 bitmap_element *dst_elt = dst->first;
e326eeb5
KG
2437 const bitmap_element *a_elt = a->first;
2438 const bitmap_element *b_elt = b->first;
2439 const bitmap_element *kill_elt = kill->first;
6fb5fa3c
DB
2440 bitmap_element *dst_prev = NULL;
2441 bitmap_element **dst_prev_pnext = &dst->first;
2442
d1e14d97
SB
2443 gcc_checking_assert (!dst->tree_form && !a->tree_form && !b->tree_form
2444 && !kill->tree_form);
6fb5fa3c
DB
2445 gcc_assert (dst != a && dst != b && dst != kill);
2446
2447 /* Special cases. We don't bother checking for bitmap_equal_p (b, kill). */
2448 if (b == kill || bitmap_empty_p (b))
2449 {
2450 changed = !bitmap_equal_p (dst, a);
2451 if (changed)
2452 bitmap_copy (dst, a);
2453 return changed;
2454 }
2455 if (bitmap_empty_p (kill))
2456 return bitmap_ior (dst, a, b);
2457 if (bitmap_empty_p (a))
2458 return bitmap_and_compl (dst, b, kill);
2459
2460 while (a_elt || b_elt)
2461 {
2462 bool new_element = false;
2463
2464 if (b_elt)
2465 while (kill_elt && kill_elt->indx < b_elt->indx)
2466 kill_elt = kill_elt->next;
2467
2468 if (b_elt && kill_elt && kill_elt->indx == b_elt->indx
2469 && (!a_elt || a_elt->indx >= b_elt->indx))
2470 {
2471 bitmap_element tmp_elt;
2472 unsigned ix;
2473
2474 BITMAP_WORD ior = 0;
2475 tmp_elt.indx = b_elt->indx;
a2b709cc 2476 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
6fb5fa3c
DB
2477 {
2478 BITMAP_WORD r = b_elt->bits[ix] & ~kill_elt->bits[ix];
2479 ior |= r;
2480 tmp_elt.bits[ix] = r;
2481 }
2482
2483 if (ior)
2484 {
2485 changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
2486 a_elt, &tmp_elt, changed);
2487 new_element = true;
2488 if (a_elt && a_elt->indx == b_elt->indx)
2489 a_elt = a_elt->next;
2490 }
2491
2492 b_elt = b_elt->next;
2493 kill_elt = kill_elt->next;
2494 }
2495 else
2496 {
2497 changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
2498 a_elt, b_elt, changed);
2499 new_element = true;
2500
2501 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
2502 {
2503 a_elt = a_elt->next;
2504 b_elt = b_elt->next;
2505 }
2506 else
2507 {
2508 if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
2509 a_elt = a_elt->next;
2510 else if (b_elt && (!a_elt || b_elt->indx <= a_elt->indx))
2511 b_elt = b_elt->next;
2512 }
2513 }
2514
2515 if (new_element)
2516 {
2517 dst_prev = *dst_prev_pnext;
2518 dst_prev_pnext = &dst_prev->next;
2519 dst_elt = *dst_prev_pnext;
2520 }
2521 }
2522
2523 if (dst_elt)
2524 {
2525 changed = true;
9e5d3a2c
MS
2526 /* Ensure that dst->current is valid. */
2527 dst->current = dst->first;
6fb5fa3c
DB
2528 bitmap_elt_clear_from (dst, dst_elt);
2529 }
7a40b8b1 2530 gcc_checking_assert (!dst->current == !dst->first);
6fb5fa3c
DB
2531 if (dst->current)
2532 dst->indx = dst->current->indx;
88c4f655 2533
eb59b8de 2534 return changed;
096ab9ea 2535}
87e08c69 2536
d1e14d97 2537/* A |= (B & ~C). Return true if A changes. */
7ef7b345
NS
2538
2539bool
d1e14d97 2540bitmap_ior_and_compl_into (bitmap a, const_bitmap b, const_bitmap c)
87e08c69 2541{
0e5b369e
RB
2542 bitmap_element *a_elt = a->first;
2543 const bitmap_element *b_elt = b->first;
2544 const bitmap_element *c_elt = c->first;
2545 bitmap_element and_elt;
2546 bitmap_element *a_prev = NULL;
2547 bitmap_element **a_prev_pnext = &a->first;
2548 bool changed = false;
2549 unsigned ix;
c22cacf3 2550
d1e14d97
SB
2551 gcc_checking_assert (!a->tree_form && !b->tree_form && !c->tree_form);
2552
0e5b369e
RB
2553 if (a == b)
2554 return false;
2555 if (bitmap_empty_p (c))
2556 return bitmap_ior_into (a, b);
2557 else if (bitmap_empty_p (a))
2558 return bitmap_and_compl (a, b, c);
87e08c69 2559
0e5b369e
RB
2560 and_elt.indx = -1;
2561 while (b_elt)
2562 {
2563 /* Advance C. */
2564 while (c_elt && c_elt->indx < b_elt->indx)
2565 c_elt = c_elt->next;
2566
2567 const bitmap_element *and_elt_ptr;
2568 if (c_elt && c_elt->indx == b_elt->indx)
2569 {
2570 BITMAP_WORD overall = 0;
2571 and_elt_ptr = &and_elt;
2572 and_elt.indx = b_elt->indx;
2573 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
2574 {
2575 and_elt.bits[ix] = b_elt->bits[ix] & ~c_elt->bits[ix];
2576 overall |= and_elt.bits[ix];
2577 }
2578 if (!overall)
2579 {
2580 b_elt = b_elt->next;
2581 continue;
2582 }
2583 }
2584 else
2585 and_elt_ptr = b_elt;
2586
2587 b_elt = b_elt->next;
2588
2589 /* Now find a place to insert AND_ELT. */
2590 do
2591 {
2592 ix = a_elt ? a_elt->indx : and_elt_ptr->indx;
2593 if (ix == and_elt_ptr->indx)
2594 changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt,
2595 and_elt_ptr, changed);
2596 else if (ix > and_elt_ptr->indx)
2597 changed = bitmap_elt_copy (a, NULL, a_prev, and_elt_ptr, changed);
2598
2599 a_prev = *a_prev_pnext;
2600 a_prev_pnext = &a_prev->next;
2601 a_elt = *a_prev_pnext;
2602
2603 /* If A lagged behind B/C, we advanced it so loop once more. */
2604 }
2605 while (ix < and_elt_ptr->indx);
2606 }
2607
2608 gcc_checking_assert (!a->current == !a->first);
2609 if (a->current)
2610 a->indx = a->current->indx;
87e08c69
RH
2611 return changed;
2612}
6fb5fa3c 2613
7ff23740
PB
2614/* A |= (B & C). Return true if A changes. */
2615
2616bool
2617bitmap_ior_and_into (bitmap a, const_bitmap b, const_bitmap c)
2618{
2619 bitmap_element *a_elt = a->first;
2620 const bitmap_element *b_elt = b->first;
2621 const bitmap_element *c_elt = c->first;
2622 bitmap_element and_elt;
2623 bitmap_element *a_prev = NULL;
2624 bitmap_element **a_prev_pnext = &a->first;
2625 bool changed = false;
2626 unsigned ix;
2627
d1e14d97
SB
2628 gcc_checking_assert (!a->tree_form && !b->tree_form && !c->tree_form);
2629
7ff23740
PB
2630 if (b == c)
2631 return bitmap_ior_into (a, b);
2632 if (bitmap_empty_p (b) || bitmap_empty_p (c))
2633 return false;
2634
2635 and_elt.indx = -1;
2636 while (b_elt && c_elt)
2637 {
2638 BITMAP_WORD overall;
2639
2640 /* Find a common item of B and C. */
2641 while (b_elt->indx != c_elt->indx)
2642 {
2643 if (b_elt->indx < c_elt->indx)
2644 {
2645 b_elt = b_elt->next;
2646 if (!b_elt)
2647 goto done;
2648 }
2649 else
2650 {
2651 c_elt = c_elt->next;
2652 if (!c_elt)
2653 goto done;
2654 }
2655 }
2656
2657 overall = 0;
2658 and_elt.indx = b_elt->indx;
a2b709cc 2659 for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
7ff23740
PB
2660 {
2661 and_elt.bits[ix] = b_elt->bits[ix] & c_elt->bits[ix];
2662 overall |= and_elt.bits[ix];
2663 }
2664
2665 b_elt = b_elt->next;
2666 c_elt = c_elt->next;
2667 if (!overall)
2668 continue;
2669
2670 /* Now find a place to insert AND_ELT. */
2671 do
2672 {
2673 ix = a_elt ? a_elt->indx : and_elt.indx;
2674 if (ix == and_elt.indx)
2675 changed = bitmap_elt_ior (a, a_elt, a_prev, a_elt, &and_elt, changed);
2676 else if (ix > and_elt.indx)
2677 changed = bitmap_elt_copy (a, NULL, a_prev, &and_elt, changed);
2678
2679 a_prev = *a_prev_pnext;
2680 a_prev_pnext = &a_prev->next;
2681 a_elt = *a_prev_pnext;
2682
2683 /* If A lagged behind B/C, we advanced it so loop once more. */
2684 }
2685 while (ix < and_elt.indx);
2686 }
2687
2688 done:
7a40b8b1 2689 gcc_checking_assert (!a->current == !a->first);
7ff23740
PB
2690 if (a->current)
2691 a->indx = a->current->indx;
2692 return changed;
2693}
7aa6d18a
SB
2694
2695/* Compute hash of bitmap (for purposes of hashing). */
d1e14d97 2696
7aa6d18a
SB
2697hashval_t
2698bitmap_hash (const_bitmap head)
2699{
2700 const bitmap_element *ptr;
2701 BITMAP_WORD hash = 0;
2702 int ix;
2703
d1e14d97
SB
2704 gcc_checking_assert (!head->tree_form);
2705
7aa6d18a
SB
2706 for (ptr = head->first; ptr; ptr = ptr->next)
2707 {
2708 hash ^= ptr->indx;
2709 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
2710 hash ^= ptr->bits[ix];
2711 }
ad7a365a 2712 return iterative_hash (&hash, sizeof (hash), 0);
7aa6d18a
SB
2713}
2714
096ab9ea 2715\f
d1e14d97
SB
2716/* Function to obtain a vector of bitmap elements in bit order from
2717 HEAD in tree view. */
2718
2719static void
2720bitmap_tree_to_vec (vec<bitmap_element *> &elts, const_bitmap head)
2721{
2722 gcc_checking_assert (head->tree_form);
2723 auto_vec<bitmap_element *, 32> stack;
2724 bitmap_element *e = head->first;
2725 while (true)
2726 {
2727 while (e != NULL)
2728 {
2729 stack.safe_push (e);
2730 e = e->prev;
2731 }
2732 if (stack.is_empty ())
2733 break;
2734
2735 e = stack.pop ();
2736 elts.safe_push (e);
2737 e = e->next;
2738 }
2739}
2740
2741/* Debugging function to print out the contents of a bitmap element. */
2742
2743DEBUG_FUNCTION void
2744debug_bitmap_elt_file (FILE *file, const bitmap_element *ptr)
2745{
2746 unsigned int i, j, col = 26;
2747
2748 fprintf (file, "\t" HOST_PTR_PRINTF " next = " HOST_PTR_PRINTF
2749 " prev = " HOST_PTR_PRINTF " indx = %u\n\t\tbits = {",
2750 (const void*) ptr, (const void*) ptr->next,
2751 (const void*) ptr->prev, ptr->indx);
2752
2753 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
2754 for (j = 0; j < BITMAP_WORD_BITS; j++)
2755 if ((ptr->bits[i] >> j) & 1)
2756 {
2757 if (col > 70)
2758 {
2759 fprintf (file, "\n\t\t\t");
2760 col = 24;
2761 }
2762
2763 fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
2764 + i * BITMAP_WORD_BITS + j));
2765 col += 4;
2766 }
2767
2768 fprintf (file, " }\n");
2769}
2770
096ab9ea
RK
2771/* Debugging function to print out the contents of a bitmap. */
2772
24e47c76 2773DEBUG_FUNCTION void
e326eeb5 2774debug_bitmap_file (FILE *file, const_bitmap head)
096ab9ea 2775{
e326eeb5 2776 const bitmap_element *ptr;
096ab9ea 2777
edb89024
DR
2778 fprintf (file, "\nfirst = " HOST_PTR_PRINTF
2779 " current = " HOST_PTR_PRINTF " indx = %u\n",
75b6f3fd 2780 (void *) head->first, (void *) head->current, head->indx);
096ab9ea 2781
d1e14d97 2782 if (head->tree_form)
096ab9ea 2783 {
d1e14d97
SB
2784 auto_vec<bitmap_element *, 32> elts;
2785 bitmap_tree_to_vec (elts, head);
2786 for (unsigned i = 0; i < elts.length (); ++i)
2787 debug_bitmap_elt_file (file, elts[i]);
096ab9ea 2788 }
d1e14d97
SB
2789 else
2790 for (ptr = head->first; ptr; ptr = ptr->next)
2791 debug_bitmap_elt_file (file, ptr);
096ab9ea 2792}
a615c28a 2793
096ab9ea
RK
2794/* Function to be called from the debugger to print the contents
2795 of a bitmap. */
2796
24e47c76 2797DEBUG_FUNCTION void
e326eeb5 2798debug_bitmap (const_bitmap head)
096ab9ea 2799{
3d224d46 2800 debug_bitmap_file (stderr, head);
096ab9ea 2801}
a615c28a 2802
bfd38496 2803/* Function to print out the contents of a bitmap. Unlike debug_bitmap_file,
22fa5b8a
MM
2804 it does not print anything but the bits. */
2805
24e47c76 2806DEBUG_FUNCTION void
7b3b6ae4
LC
2807bitmap_print (FILE *file, const_bitmap head, const char *prefix,
2808 const char *suffix)
22fa5b8a 2809{
5d5993dd 2810 const char *comma = "";
3cd8c58a 2811 unsigned i;
22fa5b8a
MM
2812
2813 fputs (prefix, file);
d1e14d97
SB
2814 if (head->tree_form)
2815 {
2816 auto_vec<bitmap_element *, 32> elts;
2817 bitmap_tree_to_vec (elts, head);
2818 for (i = 0; i < elts.length (); ++i)
2819 for (unsigned ix = 0; ix != BITMAP_ELEMENT_WORDS; ++ix)
2820 {
2821 BITMAP_WORD word = elts[i]->bits[ix];
2822 for (unsigned bit = 0; bit != BITMAP_WORD_BITS; ++bit)
2823 if (word & ((BITMAP_WORD)1 << bit))
2824 {
2825 fprintf (file, "%s%d", comma,
2826 (bit + BITMAP_WORD_BITS * ix
2827 + elts[i]->indx * BITMAP_ELEMENT_ALL_BITS));
2828 comma = ", ";
2829 }
2830 }
2831 }
2832 else
87c476a2 2833 {
d1e14d97
SB
2834 bitmap_iterator bi;
2835 EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
2836 {
2837 fprintf (file, "%s%d", comma, i);
2838 comma = ", ";
2839 }
87c476a2 2840 }
22fa5b8a
MM
2841 fputs (suffix, file);
2842}
f75709c6 2843
f75709c6
JH
2844/* Output per-bitmap memory usage statistics. */
2845void
2846dump_bitmap_statistics (void)
2847{
ca30789c 2848 if (!GATHER_STATISTICS)
7aa6d18a
SB
2849 return;
2850
643e0a30 2851 bitmap_mem_desc.dump (BITMAP_ORIGIN);
1af4bba8
JH
2852}
2853
7b3b6ae4 2854DEBUG_FUNCTION void
84562394 2855debug (const bitmap_head &ref)
7b3b6ae4
LC
2856{
2857 dump_bitmap (stderr, &ref);
2858}
2859
2860DEBUG_FUNCTION void
84562394 2861debug (const bitmap_head *ptr)
7b3b6ae4
LC
2862{
2863 if (ptr)
2864 debug (*ptr);
2865 else
2866 fprintf (stderr, "<nil>\n");
2867}
2868
3d0a7271
AH
2869DEBUG_FUNCTION void
2870debug (const auto_bitmap &ref)
2871{
2872 debug ((const bitmap_head &) ref);
2873}
2874
2875DEBUG_FUNCTION void
2876debug (const auto_bitmap *ptr)
2877{
2878 debug ((const bitmap_head *) ptr);
2879}
2880
54994253
AH
2881void
2882bitmap_head::dump ()
2883{
2884 debug (this);
2885}
2886
d9b950dd
DM
2887#if CHECKING_P
2888
2889namespace selftest {
2890
2891/* Selftests for bitmaps. */
2892
2893/* Freshly-created bitmaps ought to be empty. */
2894
2895static void
2896test_gc_alloc ()
2897{
2898 bitmap b = bitmap_gc_alloc ();
2899 ASSERT_TRUE (bitmap_empty_p (b));
2900}
2901
2902/* Verify bitmap_set_range. */
2903
2904static void
2905test_set_range ()
2906{
2907 bitmap b = bitmap_gc_alloc ();
2908 ASSERT_TRUE (bitmap_empty_p (b));
2909
2910 bitmap_set_range (b, 7, 5);
2911 ASSERT_FALSE (bitmap_empty_p (b));
2912 ASSERT_EQ (5, bitmap_count_bits (b));
2913
2914 /* Verify bitmap_bit_p at the boundaries. */
2915 ASSERT_FALSE (bitmap_bit_p (b, 6));
2916 ASSERT_TRUE (bitmap_bit_p (b, 7));
2917 ASSERT_TRUE (bitmap_bit_p (b, 11));
2918 ASSERT_FALSE (bitmap_bit_p (b, 12));
2919}
2920
2921/* Verify splitting a range into two pieces using bitmap_clear_bit. */
2922
2923static void
2924test_clear_bit_in_middle ()
2925{
2926 bitmap b = bitmap_gc_alloc ();
2927
2928 /* Set b to [100..200]. */
2929 bitmap_set_range (b, 100, 100);
2930 ASSERT_EQ (100, bitmap_count_bits (b));
2931
2932 /* Clear a bit in the middle. */
2933 bool changed = bitmap_clear_bit (b, 150);
2934 ASSERT_TRUE (changed);
2935 ASSERT_EQ (99, bitmap_count_bits (b));
2936 ASSERT_TRUE (bitmap_bit_p (b, 149));
2937 ASSERT_FALSE (bitmap_bit_p (b, 150));
2938 ASSERT_TRUE (bitmap_bit_p (b, 151));
2939}
2940
2941/* Verify bitmap_copy. */
2942
2943static void
2944test_copying ()
2945{
2946 bitmap src = bitmap_gc_alloc ();
2947 bitmap_set_range (src, 40, 10);
2948
2949 bitmap dst = bitmap_gc_alloc ();
2950 ASSERT_FALSE (bitmap_equal_p (src, dst));
2951 bitmap_copy (dst, src);
2952 ASSERT_TRUE (bitmap_equal_p (src, dst));
2953
2954 /* Verify that we can make them unequal again... */
2955 bitmap_set_range (src, 70, 5);
2956 ASSERT_FALSE (bitmap_equal_p (src, dst));
2957
2958 /* ...and that changing src after the copy didn't affect
2959 the other: */
2960 ASSERT_FALSE (bitmap_bit_p (dst, 70));
2961}
2962
2963/* Verify bitmap_single_bit_set_p. */
2964
2965static void
2966test_bitmap_single_bit_set_p ()
2967{
2968 bitmap b = bitmap_gc_alloc ();
2969
2970 ASSERT_FALSE (bitmap_single_bit_set_p (b));
2971
2972 bitmap_set_range (b, 42, 1);
2973 ASSERT_TRUE (bitmap_single_bit_set_p (b));
2974 ASSERT_EQ (42, bitmap_first_set_bit (b));
2975
2976 bitmap_set_range (b, 1066, 1);
2977 ASSERT_FALSE (bitmap_single_bit_set_p (b));
2978 ASSERT_EQ (42, bitmap_first_set_bit (b));
2979
2980 bitmap_clear_range (b, 0, 100);
2981 ASSERT_TRUE (bitmap_single_bit_set_p (b));
2982 ASSERT_EQ (1066, bitmap_first_set_bit (b));
2983}
2984
5ad089a3
AM
2985/* Verify accessing aligned bit chunks works as expected. */
2986
2987static void
2988test_aligned_chunk (unsigned num_bits)
2989{
2990 bitmap b = bitmap_gc_alloc ();
2991 int limit = 2 ^ num_bits;
2992
2993 int index = 3;
2994 for (int x = 0; x < limit; x++)
2995 {
2996 bitmap_set_aligned_chunk (b, index, num_bits, (BITMAP_WORD) x);
2997 ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b, index, num_bits) == x);
2998 ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b, index + 1,
2999 num_bits) == 0);
3000 ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b, index - 1,
3001 num_bits) == 0);
3002 index += 3;
3003 }
3004 index = 3;
3005 for (int x = 0; x < limit ; x++)
3006 {
3007 ASSERT_TRUE ((int) bitmap_get_aligned_chunk (b, index, num_bits) == x);
3008 index += 3;
3009 }
3010}
3011
d9b950dd
DM
3012/* Run all of the selftests within this file. */
3013
3014void
d5148d4f 3015bitmap_cc_tests ()
d9b950dd
DM
3016{
3017 test_gc_alloc ();
3018 test_set_range ();
3019 test_clear_bit_in_middle ();
3020 test_copying ();
3021 test_bitmap_single_bit_set_p ();
5ad089a3
AM
3022 /* Test 2, 4 and 8 bit aligned chunks. */
3023 test_aligned_chunk (2);
3024 test_aligned_chunk (4);
3025 test_aligned_chunk (8);
d9b950dd
DM
3026}
3027
3028} // namespace selftest
3029#endif /* CHECKING_P */
7b3b6ae4 3030
e2500fed 3031#include "gt-bitmap.h"