]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/bitmap.h
Fix bitmap registration of overheads.
[thirdparty/gcc.git] / gcc / bitmap.h
1 /* Functions to support general ended bitmaps.
2 Copyright (C) 1997-2019 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #ifndef GCC_BITMAP_H
21 #define GCC_BITMAP_H
22
23 /* Implementation of sparse integer sets as a linked list or tree.
24
25 This sparse set representation is suitable for sparse sets with an
26 unknown (a priori) universe.
27
28 Sets are represented as double-linked lists of container nodes of
29 type "struct bitmap_element" or as a binary trees of the same
30 container nodes. Each container node consists of an index for the
31 first member that could be held in the container, a small array of
32 integers that represent the members in the container, and pointers
33 to the next and previous element in the linked list, or left and
34 right children in the tree. In linked-list form, the container
35 nodes in the list are sorted in ascending order, i.e. the head of
36 the list holds the element with the smallest member of the set.
37 In tree form, nodes to the left have a smaller container index.
38
39 For a given member I in the set:
40 - the element for I will have index is I / (bits per element)
41 - the position for I within element is I % (bits per element)
42
43 This representation is very space-efficient for large sparse sets, and
44 the size of the set can be changed dynamically without much overhead.
45 An important parameter is the number of bits per element. In this
46 implementation, there are 128 bits per element. This results in a
47 high storage overhead *per element*, but a small overall overhead if
48 the set is very sparse.
49
50 The storage requirements for linked-list sparse sets are O(E), with E->N
51 in the worst case (a sparse set with large distances between the values
52 of the set members).
53
54 This representation also works well for data flow problems where the size
55 of the set may grow dynamically, but care must be taken that the member_p,
56 add_member, and remove_member operations occur with a suitable access
57 pattern.
58
59 The linked-list set representation works well for problems involving very
60 sparse sets. The canonical example in GCC is, of course, the "set of
61 sets" for some CFG-based data flow problems (liveness analysis, dominance
62 frontiers, etc.).
63
64 For random-access sparse sets of unknown universe, the binary tree
65 representation is likely to be a more suitable choice. Theoretical
66 access times for the binary tree representation are better than those
67 for the linked-list, but in practice this is only true for truely
68 random access.
69
70 Often the most suitable representation during construction of the set
71 is not the best choice for the usage of the set. For such cases, the
72 "view" of the set can be changed from one representation to the other.
73 This is an O(E) operation:
74
75 * from list to tree view : bitmap_tree_view
76 * from tree to list view : bitmap_list_view
77
78 Traversing linked lists or trees can be cache-unfriendly. Performance
79 can be improved by keeping container nodes in the set grouped together
80 in memory, using a dedicated obstack for a set (or group of related
81 sets). Elements allocated on obstacks are released to a free-list and
82 taken off the free list. If multiple sets are allocated on the same
83 obstack, elements freed from one set may be re-used for one of the other
84 sets. This usually helps avoid cache misses.
85
86 A single free-list is used for all sets allocated in GGC space. This is
87 bad for persistent sets, so persistent sets should be allocated on an
88 obstack whenever possible.
89
90 For random-access sets with a known, relatively small universe size, the
91 SparseSet or simple bitmap representations may be more efficient than a
92 linked-list set.
93
94
95 LINKED LIST FORM
96 ================
97
98 In linked-list form, in-order iterations of the set can be executed
99 efficiently. The downside is that many random-access operations are
100 relatively slow, because the linked list has to be traversed to test
101 membership (i.e. member_p/ add_member/remove_member).
102
103 To improve the performance of this set representation, the last
104 accessed element and its index are cached. For membership tests on
105 members close to recently accessed members, the cached last element
106 improves membership test to a constant-time operation.
107
108 The following operations can always be performed in O(1) time in
109 list view:
110
111 * clear : bitmap_clear
112 * smallest_member : bitmap_first_set_bit
113 * choose_one : (not implemented, but could be
114 in constant time)
115
116 The following operations can be performed in O(E) time worst-case in
117 list view (with E the number of elements in the linked list), but in
118 O(1) time with a suitable access patterns:
119
120 * member_p : bitmap_bit_p
121 * add_member : bitmap_set_bit / bitmap_set_range
122 * remove_member : bitmap_clear_bit / bitmap_clear_range
123
124 The following operations can be performed in O(E) time in list view:
125
126 * cardinality : bitmap_count_bits
127 * largest_member : bitmap_last_set_bit (but this could
128 in constant time with a pointer to
129 the last element in the chain)
130 * set_size : bitmap_last_set_bit
131
132 In tree view the following operations can all be performed in O(log E)
133 amortized time with O(E) worst-case behavior.
134
135 * smallest_member
136 * largest_member
137 * set_size
138 * member_p
139 * add_member
140 * remove_member
141
142 Additionally, the linked-list sparse set representation supports
143 enumeration of the members in O(E) time:
144
145 * forall : EXECUTE_IF_SET_IN_BITMAP
146 * set_copy : bitmap_copy
147 * set_intersection : bitmap_intersect_p /
148 bitmap_and / bitmap_and_into /
149 EXECUTE_IF_AND_IN_BITMAP
150 * set_union : bitmap_ior / bitmap_ior_into
151 * set_difference : bitmap_intersect_compl_p /
152 bitmap_and_comp / bitmap_and_comp_into /
153 EXECUTE_IF_AND_COMPL_IN_BITMAP
154 * set_disjuction : bitmap_xor_comp / bitmap_xor_comp_into
155 * set_compare : bitmap_equal_p
156
157 Some operations on 3 sets that occur frequently in data flow problems
158 are also implemented:
159
160 * A | (B & C) : bitmap_ior_and_into
161 * A | (B & ~C) : bitmap_ior_and_compl /
162 bitmap_ior_and_compl_into
163
164
165 BINARY TREE FORM
166 ================
167 An alternate "view" of a bitmap is its binary tree representation.
168 For this representation, splay trees are used because they can be
169 implemented using the same data structures as the linked list, with
170 no overhead for meta-data (like color, or rank) on the tree nodes.
171
172 In binary tree form, random-access to the set is much more efficient
173 than for the linked-list representation. Downsides are the high cost
174 of clearing the set, and the relatively large number of operations
175 necessary to balance the tree. Also, iterating the set members is
176 not supported.
177
178 As for the linked-list representation, the last accessed element and
179 its index are cached, so that membership tests on the latest accessed
180 members is a constant-time operation. Other lookups take O(logE)
181 time amortized (but O(E) time worst-case).
182
183 The following operations can always be performed in O(1) time:
184
185 * choose_one : (not implemented, but could be
186 implemented in constant time)
187
188 The following operations can be performed in O(logE) time amortized
189 but O(E) time worst-case, but in O(1) time if the same element is
190 accessed.
191
192 * member_p : bitmap_bit_p
193 * add_member : bitmap_set_bit
194 * remove_member : bitmap_clear_bit
195
196 The following operations can be performed in O(logE) time amortized
197 but O(E) time worst-case:
198
199 * smallest_member : bitmap_first_set_bit
200 * largest_member : bitmap_last_set_bit
201 * set_size : bitmap_last_set_bit
202
203 The following operations can be performed in O(E) time:
204
205 * clear : bitmap_clear
206
207 The binary tree sparse set representation does *not* support any form
208 of enumeration, and does also *not* support logical operations on sets.
209 The binary tree representation is only supposed to be used for sets
210 on which many random-access membership tests will happen. */
211
212 #include "obstack.h"
213
214 /* Bitmap memory usage. */
215 struct bitmap_usage: public mem_usage
216 {
217 /* Default contructor. */
218 bitmap_usage (): m_nsearches (0), m_search_iter (0) {}
219 /* Constructor. */
220 bitmap_usage (size_t allocated, size_t times, size_t peak,
221 uint64_t nsearches, uint64_t search_iter)
222 : mem_usage (allocated, times, peak),
223 m_nsearches (nsearches), m_search_iter (search_iter) {}
224
225 /* Sum the usage with SECOND usage. */
226 bitmap_usage
227 operator+ (const bitmap_usage &second)
228 {
229 return bitmap_usage (m_allocated + second.m_allocated,
230 m_times + second.m_times,
231 m_peak + second.m_peak,
232 m_nsearches + second.m_nsearches,
233 m_search_iter + second.m_search_iter);
234 }
235
236 /* Dump usage coupled to LOC location, where TOTAL is sum of all rows. */
237 inline void
238 dump (mem_location *loc, mem_usage &total) const
239 {
240 char *location_string = loc->to_string ();
241
242 fprintf (stderr, "%-48s " PRsa (9) ":%5.1f%%"
243 PRsa (9) PRsa (9) ":%5.1f%%"
244 PRsa (11) PRsa (11) "%10s\n",
245 location_string, SIZE_AMOUNT (m_allocated),
246 get_percent (m_allocated, total.m_allocated),
247 SIZE_AMOUNT (m_peak), SIZE_AMOUNT (m_times),
248 get_percent (m_times, total.m_times),
249 SIZE_AMOUNT (m_nsearches), SIZE_AMOUNT (m_search_iter),
250 loc->m_ggc ? "ggc" : "heap");
251
252 free (location_string);
253 }
254
255 /* Dump header with NAME. */
256 static inline void
257 dump_header (const char *name)
258 {
259 fprintf (stderr, "%-48s %11s%16s%17s%12s%12s%10s\n", name, "Leak", "Peak",
260 "Times", "N searches", "Search iter", "Type");
261 }
262
263 /* Number search operations. */
264 uint64_t m_nsearches;
265 /* Number of search iterations. */
266 uint64_t m_search_iter;
267 };
268
269 /* Bitmap memory description. */
270 extern mem_alloc_description<bitmap_usage> bitmap_mem_desc;
271
272 /* Fundamental storage type for bitmap. */
273
274 typedef unsigned long BITMAP_WORD;
275 /* BITMAP_WORD_BITS needs to be unsigned, but cannot contain casts as
276 it is used in preprocessor directives -- hence the 1u. */
277 #define BITMAP_WORD_BITS (CHAR_BIT * SIZEOF_LONG * 1u)
278
279 /* Number of words to use for each element in the linked list. */
280
281 #ifndef BITMAP_ELEMENT_WORDS
282 #define BITMAP_ELEMENT_WORDS ((128 + BITMAP_WORD_BITS - 1) / BITMAP_WORD_BITS)
283 #endif
284
285 /* Number of bits in each actual element of a bitmap. */
286
287 #define BITMAP_ELEMENT_ALL_BITS (BITMAP_ELEMENT_WORDS * BITMAP_WORD_BITS)
288
289 /* Obstack for allocating bitmaps and elements from. */
290 struct bitmap_obstack {
291 struct bitmap_element *elements;
292 struct bitmap_head *heads;
293 struct obstack obstack;
294 };
295
296 /* Bitmap set element. We use a linked list to hold only the bits that
297 are set. This allows for use to grow the bitset dynamically without
298 having to realloc and copy a giant bit array.
299
300 The free list is implemented as a list of lists. There is one
301 outer list connected together by prev fields. Each element of that
302 outer is an inner list (that may consist only of the outer list
303 element) that are connected by the next fields. The prev pointer
304 is undefined for interior elements. This allows
305 bitmap_elt_clear_from to be implemented in unit time rather than
306 linear in the number of elements to be freed. */
307
308 struct GTY((chain_next ("%h.next"))) bitmap_element {
309 /* In list form, the next element in the linked list;
310 in tree form, the left child node in the tree. */
311 struct bitmap_element *next;
312 /* In list form, the previous element in the linked list;
313 in tree form, the right child node in the tree. */
314 struct bitmap_element *prev;
315 /* regno/BITMAP_ELEMENT_ALL_BITS. */
316 unsigned int indx;
317 /* Bits that are set, counting from INDX, inclusive */
318 BITMAP_WORD bits[BITMAP_ELEMENT_WORDS];
319 };
320
321 /* Head of bitmap linked list. The 'current' member points to something
322 already pointed to by the chain started by first, so GTY((skip)) it. */
323
324 struct GTY(()) bitmap_head {
325 static bitmap_obstack crashme;
326 /* Poison obstack to not make it not a valid initialized GC bitmap. */
327 CONSTEXPR bitmap_head()
328 : indx (0), tree_form (false), padding (0), alloc_descriptor (0), first (NULL),
329 current (NULL), obstack (&crashme)
330 {}
331 /* Index of last element looked at. */
332 unsigned int indx;
333 /* False if the bitmap is in list form; true if the bitmap is in tree form.
334 Bitmap iterators only work on bitmaps in list form. */
335 unsigned tree_form: 1;
336 /* Next integer is shifted, so padding is needed. */
337 unsigned padding: 2;
338 /* Bitmap UID used for memory allocation statistics. */
339 unsigned alloc_descriptor: 29;
340 /* In list form, the first element in the linked list;
341 in tree form, the root of the tree. */
342 bitmap_element *first;
343 /* Last element looked at. */
344 bitmap_element * GTY((skip(""))) current;
345 /* Obstack to allocate elements from. If NULL, then use GGC allocation. */
346 bitmap_obstack * GTY((skip(""))) obstack;
347
348 /* Dump bitmap. */
349 void dump ();
350
351 /* Get bitmap descriptor UID casted to an unsigned integer pointer.
352 Shift the descriptor because pointer_hash<Type>::hash is
353 doing >> 3 shift operation. */
354 unsigned *get_descriptor ()
355 {
356 return (unsigned *)(ptrdiff_t)(alloc_descriptor << 3);
357 }
358 };
359
360 /* Global data */
361 extern bitmap_element bitmap_zero_bits; /* Zero bitmap element */
362 extern bitmap_obstack bitmap_default_obstack; /* Default bitmap obstack */
363
364 /* Change the view of the bitmap to list, or tree. */
365 void bitmap_list_view (bitmap);
366 void bitmap_tree_view (bitmap);
367
368 /* Clear a bitmap by freeing up the linked list. */
369 extern void bitmap_clear (bitmap);
370
371 /* Copy a bitmap to another bitmap. */
372 extern void bitmap_copy (bitmap, const_bitmap);
373
374 /* Move a bitmap to another bitmap. */
375 extern void bitmap_move (bitmap, bitmap);
376
377 /* True if two bitmaps are identical. */
378 extern bool bitmap_equal_p (const_bitmap, const_bitmap);
379
380 /* True if the bitmaps intersect (their AND is non-empty). */
381 extern bool bitmap_intersect_p (const_bitmap, const_bitmap);
382
383 /* True if the complement of the second intersects the first (their
384 AND_COMPL is non-empty). */
385 extern bool bitmap_intersect_compl_p (const_bitmap, const_bitmap);
386
387 /* True if MAP is an empty bitmap. */
388 inline bool bitmap_empty_p (const_bitmap map)
389 {
390 return !map->first;
391 }
392
393 /* True if the bitmap has only a single bit set. */
394 extern bool bitmap_single_bit_set_p (const_bitmap);
395
396 /* Count the number of bits set in the bitmap. */
397 extern unsigned long bitmap_count_bits (const_bitmap);
398
399 /* Count the number of unique bits set across the two bitmaps. */
400 extern unsigned long bitmap_count_unique_bits (const_bitmap, const_bitmap);
401
402 /* Boolean operations on bitmaps. The _into variants are two operand
403 versions that modify the first source operand. The other variants
404 are three operand versions that to not destroy the source bitmaps.
405 The operations supported are &, & ~, |, ^. */
406 extern void bitmap_and (bitmap, const_bitmap, const_bitmap);
407 extern bool bitmap_and_into (bitmap, const_bitmap);
408 extern bool bitmap_and_compl (bitmap, const_bitmap, const_bitmap);
409 extern bool bitmap_and_compl_into (bitmap, const_bitmap);
410 #define bitmap_compl_and(DST, A, B) bitmap_and_compl (DST, B, A)
411 extern void bitmap_compl_and_into (bitmap, const_bitmap);
412 extern void bitmap_clear_range (bitmap, unsigned int, unsigned int);
413 extern void bitmap_set_range (bitmap, unsigned int, unsigned int);
414 extern bool bitmap_ior (bitmap, const_bitmap, const_bitmap);
415 extern bool bitmap_ior_into (bitmap, const_bitmap);
416 extern void bitmap_xor (bitmap, const_bitmap, const_bitmap);
417 extern void bitmap_xor_into (bitmap, const_bitmap);
418
419 /* DST = A | (B & C). Return true if DST changes. */
420 extern bool bitmap_ior_and_into (bitmap DST, const_bitmap B, const_bitmap C);
421 /* DST = A | (B & ~C). Return true if DST changes. */
422 extern bool bitmap_ior_and_compl (bitmap DST, const_bitmap A,
423 const_bitmap B, const_bitmap C);
424 /* A |= (B & ~C). Return true if A changes. */
425 extern bool bitmap_ior_and_compl_into (bitmap A,
426 const_bitmap B, const_bitmap C);
427
428 /* Clear a single bit in a bitmap. Return true if the bit changed. */
429 extern bool bitmap_clear_bit (bitmap, int);
430
431 /* Set a single bit in a bitmap. Return true if the bit changed. */
432 extern bool bitmap_set_bit (bitmap, int);
433
434 /* Return true if a bit is set in a bitmap. */
435 extern int bitmap_bit_p (bitmap, int);
436
437 /* Debug functions to print a bitmap. */
438 extern void debug_bitmap (const_bitmap);
439 extern void debug_bitmap_file (FILE *, const_bitmap);
440
441 /* Print a bitmap. */
442 extern void bitmap_print (FILE *, const_bitmap, const char *, const char *);
443
444 /* Initialize and release a bitmap obstack. */
445 extern void bitmap_obstack_initialize (bitmap_obstack *);
446 extern void bitmap_obstack_release (bitmap_obstack *);
447 extern void bitmap_register (bitmap MEM_STAT_DECL);
448 extern void dump_bitmap_statistics (void);
449
450 /* Initialize a bitmap header. OBSTACK indicates the bitmap obstack
451 to allocate from, NULL for GC'd bitmap. */
452
453 static inline void
454 bitmap_initialize (bitmap head, bitmap_obstack *obstack CXX_MEM_STAT_INFO)
455 {
456 head->first = head->current = NULL;
457 head->indx = head->tree_form = 0;
458 head->padding = 0;
459 head->alloc_descriptor = 0;
460 head->obstack = obstack;
461 if (GATHER_STATISTICS)
462 bitmap_register (head PASS_MEM_STAT);
463 }
464
465 /* Release a bitmap (but not its head). This is suitable for pairing with
466 bitmap_initialize. */
467
468 static inline void
469 bitmap_release (bitmap head)
470 {
471 bitmap_clear (head);
472 /* Poison the obstack pointer so the obstack can be safely released.
473 Do not zero it as the bitmap then becomes initialized GC. */
474 head->obstack = &bitmap_head::crashme;
475 }
476
477 /* Allocate and free bitmaps from obstack, malloc and gc'd memory. */
478 extern bitmap bitmap_alloc (bitmap_obstack *obstack CXX_MEM_STAT_INFO);
479 #define BITMAP_ALLOC bitmap_alloc
480 extern bitmap bitmap_gc_alloc (ALONE_CXX_MEM_STAT_INFO);
481 #define BITMAP_GGC_ALLOC bitmap_gc_alloc
482 extern void bitmap_obstack_free (bitmap);
483
484 /* A few compatibility/functions macros for compatibility with sbitmaps */
485 inline void dump_bitmap (FILE *file, const_bitmap map)
486 {
487 bitmap_print (file, map, "", "\n");
488 }
489 extern void debug (const bitmap_head &ref);
490 extern void debug (const bitmap_head *ptr);
491
492 extern unsigned bitmap_first_set_bit (const_bitmap);
493 extern unsigned bitmap_last_set_bit (const_bitmap);
494
495 /* Compute bitmap hash (for purposes of hashing etc.) */
496 extern hashval_t bitmap_hash (const_bitmap);
497
498 /* Do any cleanup needed on a bitmap when it is no longer used. */
499 #define BITMAP_FREE(BITMAP) \
500 ((void) (bitmap_obstack_free ((bitmap) BITMAP), (BITMAP) = (bitmap) NULL))
501
502 /* Iterator for bitmaps. */
503
504 struct bitmap_iterator
505 {
506 /* Pointer to the current bitmap element. */
507 bitmap_element *elt1;
508
509 /* Pointer to 2nd bitmap element when two are involved. */
510 bitmap_element *elt2;
511
512 /* Word within the current element. */
513 unsigned word_no;
514
515 /* Contents of the actually processed word. When finding next bit
516 it is shifted right, so that the actual bit is always the least
517 significant bit of ACTUAL. */
518 BITMAP_WORD bits;
519 };
520
521 /* Initialize a single bitmap iterator. START_BIT is the first bit to
522 iterate from. */
523
524 static inline void
525 bmp_iter_set_init (bitmap_iterator *bi, const_bitmap map,
526 unsigned start_bit, unsigned *bit_no)
527 {
528 bi->elt1 = map->first;
529 bi->elt2 = NULL;
530
531 gcc_checking_assert (!map->tree_form);
532
533 /* Advance elt1 until it is not before the block containing start_bit. */
534 while (1)
535 {
536 if (!bi->elt1)
537 {
538 bi->elt1 = &bitmap_zero_bits;
539 break;
540 }
541
542 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
543 break;
544 bi->elt1 = bi->elt1->next;
545 }
546
547 /* We might have gone past the start bit, so reinitialize it. */
548 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
549 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
550
551 /* Initialize for what is now start_bit. */
552 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
553 bi->bits = bi->elt1->bits[bi->word_no];
554 bi->bits >>= start_bit % BITMAP_WORD_BITS;
555
556 /* If this word is zero, we must make sure we're not pointing at the
557 first bit, otherwise our incrementing to the next word boundary
558 will fail. It won't matter if this increment moves us into the
559 next word. */
560 start_bit += !bi->bits;
561
562 *bit_no = start_bit;
563 }
564
565 /* Initialize an iterator to iterate over the intersection of two
566 bitmaps. START_BIT is the bit to commence from. */
567
568 static inline void
569 bmp_iter_and_init (bitmap_iterator *bi, const_bitmap map1, const_bitmap map2,
570 unsigned start_bit, unsigned *bit_no)
571 {
572 bi->elt1 = map1->first;
573 bi->elt2 = map2->first;
574
575 gcc_checking_assert (!map1->tree_form && !map2->tree_form);
576
577 /* Advance elt1 until it is not before the block containing
578 start_bit. */
579 while (1)
580 {
581 if (!bi->elt1)
582 {
583 bi->elt2 = NULL;
584 break;
585 }
586
587 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
588 break;
589 bi->elt1 = bi->elt1->next;
590 }
591
592 /* Advance elt2 until it is not before elt1. */
593 while (1)
594 {
595 if (!bi->elt2)
596 {
597 bi->elt1 = bi->elt2 = &bitmap_zero_bits;
598 break;
599 }
600
601 if (bi->elt2->indx >= bi->elt1->indx)
602 break;
603 bi->elt2 = bi->elt2->next;
604 }
605
606 /* If we're at the same index, then we have some intersecting bits. */
607 if (bi->elt1->indx == bi->elt2->indx)
608 {
609 /* We might have advanced beyond the start_bit, so reinitialize
610 for that. */
611 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
612 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
613
614 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
615 bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
616 bi->bits >>= start_bit % BITMAP_WORD_BITS;
617 }
618 else
619 {
620 /* Otherwise we must immediately advance elt1, so initialize for
621 that. */
622 bi->word_no = BITMAP_ELEMENT_WORDS - 1;
623 bi->bits = 0;
624 }
625
626 /* If this word is zero, we must make sure we're not pointing at the
627 first bit, otherwise our incrementing to the next word boundary
628 will fail. It won't matter if this increment moves us into the
629 next word. */
630 start_bit += !bi->bits;
631
632 *bit_no = start_bit;
633 }
634
635 /* Initialize an iterator to iterate over the bits in MAP1 & ~MAP2. */
636
637 static inline void
638 bmp_iter_and_compl_init (bitmap_iterator *bi,
639 const_bitmap map1, const_bitmap map2,
640 unsigned start_bit, unsigned *bit_no)
641 {
642 bi->elt1 = map1->first;
643 bi->elt2 = map2->first;
644
645 gcc_checking_assert (!map1->tree_form && !map2->tree_form);
646
647 /* Advance elt1 until it is not before the block containing start_bit. */
648 while (1)
649 {
650 if (!bi->elt1)
651 {
652 bi->elt1 = &bitmap_zero_bits;
653 break;
654 }
655
656 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
657 break;
658 bi->elt1 = bi->elt1->next;
659 }
660
661 /* Advance elt2 until it is not before elt1. */
662 while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
663 bi->elt2 = bi->elt2->next;
664
665 /* We might have advanced beyond the start_bit, so reinitialize for
666 that. */
667 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
668 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
669
670 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
671 bi->bits = bi->elt1->bits[bi->word_no];
672 if (bi->elt2 && bi->elt1->indx == bi->elt2->indx)
673 bi->bits &= ~bi->elt2->bits[bi->word_no];
674 bi->bits >>= start_bit % BITMAP_WORD_BITS;
675
676 /* If this word is zero, we must make sure we're not pointing at the
677 first bit, otherwise our incrementing to the next word boundary
678 will fail. It won't matter if this increment moves us into the
679 next word. */
680 start_bit += !bi->bits;
681
682 *bit_no = start_bit;
683 }
684
685 /* Advance to the next bit in BI. We don't advance to the next
686 nonzero bit yet. */
687
688 static inline void
689 bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no)
690 {
691 bi->bits >>= 1;
692 *bit_no += 1;
693 }
694
695 /* Advance to first set bit in BI. */
696
697 static inline void
698 bmp_iter_next_bit (bitmap_iterator * bi, unsigned *bit_no)
699 {
700 #if (GCC_VERSION >= 3004)
701 {
702 unsigned int n = __builtin_ctzl (bi->bits);
703 gcc_assert (sizeof (unsigned long) == sizeof (BITMAP_WORD));
704 bi->bits >>= n;
705 *bit_no += n;
706 }
707 #else
708 while (!(bi->bits & 1))
709 {
710 bi->bits >>= 1;
711 *bit_no += 1;
712 }
713 #endif
714 }
715
716 /* Advance to the next nonzero bit of a single bitmap, we will have
717 already advanced past the just iterated bit. Return true if there
718 is a bit to iterate. */
719
720 static inline bool
721 bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no)
722 {
723 /* If our current word is nonzero, it contains the bit we want. */
724 if (bi->bits)
725 {
726 next_bit:
727 bmp_iter_next_bit (bi, bit_no);
728 return true;
729 }
730
731 /* Round up to the word boundary. We might have just iterated past
732 the end of the last word, hence the -1. It is not possible for
733 bit_no to point at the beginning of the now last word. */
734 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
735 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
736 bi->word_no++;
737
738 while (1)
739 {
740 /* Find the next nonzero word in this elt. */
741 while (bi->word_no != BITMAP_ELEMENT_WORDS)
742 {
743 bi->bits = bi->elt1->bits[bi->word_no];
744 if (bi->bits)
745 goto next_bit;
746 *bit_no += BITMAP_WORD_BITS;
747 bi->word_no++;
748 }
749
750 /* Make sure we didn't remove the element while iterating. */
751 gcc_checking_assert (bi->elt1->indx != -1U);
752
753 /* Advance to the next element. */
754 bi->elt1 = bi->elt1->next;
755 if (!bi->elt1)
756 return false;
757 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
758 bi->word_no = 0;
759 }
760 }
761
762 /* Advance to the next nonzero bit of an intersecting pair of
763 bitmaps. We will have already advanced past the just iterated bit.
764 Return true if there is a bit to iterate. */
765
766 static inline bool
767 bmp_iter_and (bitmap_iterator *bi, unsigned *bit_no)
768 {
769 /* If our current word is nonzero, it contains the bit we want. */
770 if (bi->bits)
771 {
772 next_bit:
773 bmp_iter_next_bit (bi, bit_no);
774 return true;
775 }
776
777 /* Round up to the word boundary. We might have just iterated past
778 the end of the last word, hence the -1. It is not possible for
779 bit_no to point at the beginning of the now last word. */
780 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
781 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
782 bi->word_no++;
783
784 while (1)
785 {
786 /* Find the next nonzero word in this elt. */
787 while (bi->word_no != BITMAP_ELEMENT_WORDS)
788 {
789 bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
790 if (bi->bits)
791 goto next_bit;
792 *bit_no += BITMAP_WORD_BITS;
793 bi->word_no++;
794 }
795
796 /* Advance to the next identical element. */
797 do
798 {
799 /* Make sure we didn't remove the element while iterating. */
800 gcc_checking_assert (bi->elt1->indx != -1U);
801
802 /* Advance elt1 while it is less than elt2. We always want
803 to advance one elt. */
804 do
805 {
806 bi->elt1 = bi->elt1->next;
807 if (!bi->elt1)
808 return false;
809 }
810 while (bi->elt1->indx < bi->elt2->indx);
811
812 /* Make sure we didn't remove the element while iterating. */
813 gcc_checking_assert (bi->elt2->indx != -1U);
814
815 /* Advance elt2 to be no less than elt1. This might not
816 advance. */
817 while (bi->elt2->indx < bi->elt1->indx)
818 {
819 bi->elt2 = bi->elt2->next;
820 if (!bi->elt2)
821 return false;
822 }
823 }
824 while (bi->elt1->indx != bi->elt2->indx);
825
826 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
827 bi->word_no = 0;
828 }
829 }
830
831 /* Advance to the next nonzero bit in the intersection of
832 complemented bitmaps. We will have already advanced past the just
833 iterated bit. */
834
835 static inline bool
836 bmp_iter_and_compl (bitmap_iterator *bi, unsigned *bit_no)
837 {
838 /* If our current word is nonzero, it contains the bit we want. */
839 if (bi->bits)
840 {
841 next_bit:
842 bmp_iter_next_bit (bi, bit_no);
843 return true;
844 }
845
846 /* Round up to the word boundary. We might have just iterated past
847 the end of the last word, hence the -1. It is not possible for
848 bit_no to point at the beginning of the now last word. */
849 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
850 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
851 bi->word_no++;
852
853 while (1)
854 {
855 /* Find the next nonzero word in this elt. */
856 while (bi->word_no != BITMAP_ELEMENT_WORDS)
857 {
858 bi->bits = bi->elt1->bits[bi->word_no];
859 if (bi->elt2 && bi->elt2->indx == bi->elt1->indx)
860 bi->bits &= ~bi->elt2->bits[bi->word_no];
861 if (bi->bits)
862 goto next_bit;
863 *bit_no += BITMAP_WORD_BITS;
864 bi->word_no++;
865 }
866
867 /* Make sure we didn't remove the element while iterating. */
868 gcc_checking_assert (bi->elt1->indx != -1U);
869
870 /* Advance to the next element of elt1. */
871 bi->elt1 = bi->elt1->next;
872 if (!bi->elt1)
873 return false;
874
875 /* Make sure we didn't remove the element while iterating. */
876 gcc_checking_assert (! bi->elt2 || bi->elt2->indx != -1U);
877
878 /* Advance elt2 until it is no less than elt1. */
879 while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
880 bi->elt2 = bi->elt2->next;
881
882 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
883 bi->word_no = 0;
884 }
885 }
886
887 /* If you are modifying a bitmap you are currently iterating over you
888 have to ensure to
889 - never remove the current bit;
890 - if you set or clear a bit before the current bit this operation
891 will not affect the set of bits you are visiting during the iteration;
892 - if you set or clear a bit after the current bit it is unspecified
893 whether that affects the set of bits you are visiting during the
894 iteration.
895 If you want to remove the current bit you can delay this to the next
896 iteration (and after the iteration in case the last iteration is
897 affected). */
898
899 /* Loop over all bits set in BITMAP, starting with MIN and setting
900 BITNUM to the bit number. ITER is a bitmap iterator. BITNUM
901 should be treated as a read-only variable as it contains loop
902 state. */
903
904 #ifndef EXECUTE_IF_SET_IN_BITMAP
905 /* See sbitmap.h for the other definition of EXECUTE_IF_SET_IN_BITMAP. */
906 #define EXECUTE_IF_SET_IN_BITMAP(BITMAP, MIN, BITNUM, ITER) \
907 for (bmp_iter_set_init (&(ITER), (BITMAP), (MIN), &(BITNUM)); \
908 bmp_iter_set (&(ITER), &(BITNUM)); \
909 bmp_iter_next (&(ITER), &(BITNUM)))
910 #endif
911
912 /* Loop over all the bits set in BITMAP1 & BITMAP2, starting with MIN
913 and setting BITNUM to the bit number. ITER is a bitmap iterator.
914 BITNUM should be treated as a read-only variable as it contains
915 loop state. */
916
917 #define EXECUTE_IF_AND_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER) \
918 for (bmp_iter_and_init (&(ITER), (BITMAP1), (BITMAP2), (MIN), \
919 &(BITNUM)); \
920 bmp_iter_and (&(ITER), &(BITNUM)); \
921 bmp_iter_next (&(ITER), &(BITNUM)))
922
923 /* Loop over all the bits set in BITMAP1 & ~BITMAP2, starting with MIN
924 and setting BITNUM to the bit number. ITER is a bitmap iterator.
925 BITNUM should be treated as a read-only variable as it contains
926 loop state. */
927
928 #define EXECUTE_IF_AND_COMPL_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER) \
929 for (bmp_iter_and_compl_init (&(ITER), (BITMAP1), (BITMAP2), (MIN), \
930 &(BITNUM)); \
931 bmp_iter_and_compl (&(ITER), &(BITNUM)); \
932 bmp_iter_next (&(ITER), &(BITNUM)))
933
934 /* A class that ties the lifetime of a bitmap to its scope. */
935 class auto_bitmap
936 {
937 public:
938 auto_bitmap () { bitmap_initialize (&m_bits, &bitmap_default_obstack); }
939 explicit auto_bitmap (bitmap_obstack *o) { bitmap_initialize (&m_bits, o); }
940 ~auto_bitmap () { bitmap_clear (&m_bits); }
941 // Allow calling bitmap functions on our bitmap.
942 operator bitmap () { return &m_bits; }
943
944 private:
945 // Prevent making a copy that references our bitmap.
946 auto_bitmap (const auto_bitmap &);
947 auto_bitmap &operator = (const auto_bitmap &);
948 #if __cplusplus >= 201103L
949 auto_bitmap (auto_bitmap &&);
950 auto_bitmap &operator = (auto_bitmap &&);
951 #endif
952
953 bitmap_head m_bits;
954 };
955
956 #endif /* GCC_BITMAP_H */