00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "coretypes.h"
00025 #include "tm.h"
00026 #include "rtl.h"
00027 #include "flags.h"
00028 #include "obstack.h"
00029 #include "ggc.h"
00030 #include "bitmap.h"
00031
00032
00033 bitmap_element bitmap_zero_bits;
00034 bitmap_obstack bitmap_default_obstack;
00035 static GTY((deletable)) bitmap_element *bitmap_ggc_free;
00036
00037
00038 static void bitmap_elem_to_freelist (bitmap, bitmap_element *);
00039 static void bitmap_element_free (bitmap, bitmap_element *);
00040 static bitmap_element *bitmap_element_allocate (bitmap);
00041 static int bitmap_element_zerop (bitmap_element *);
00042 static void bitmap_element_link (bitmap, bitmap_element *);
00043 static bitmap_element *bitmap_elt_insert_after (bitmap, bitmap_element *);
00044 static void bitmap_elt_clear_from (bitmap, bitmap_element *);
00045 static bitmap_element *bitmap_find_bit (bitmap, unsigned int);
00046
00047
00048
00049 static inline void
00050 bitmap_elem_to_freelist (bitmap head, bitmap_element *elt)
00051 {
00052 bitmap_obstack *bit_obstack = head->obstack;
00053
00054 if (bit_obstack)
00055 {
00056 elt->next = bit_obstack->elements;
00057 bit_obstack->elements = elt;
00058 }
00059 else
00060 {
00061 elt->next = bitmap_ggc_free;
00062 bitmap_ggc_free = elt;
00063 }
00064 }
00065
00066
00067
00068
00069 static inline void
00070 bitmap_element_free (bitmap head, bitmap_element *elt)
00071 {
00072 bitmap_element *next = elt->next;
00073 bitmap_element *prev = elt->prev;
00074
00075 if (prev)
00076 prev->next = next;
00077
00078 if (next)
00079 next->prev = prev;
00080
00081 if (head->first == elt)
00082 head->first = next;
00083
00084
00085
00086 if (head->current == elt)
00087 {
00088 head->current = next != 0 ? next : prev;
00089 if (head->current)
00090 head->indx = head->current->indx;
00091 }
00092 bitmap_elem_to_freelist (head, elt);
00093 }
00094
00095
00096
00097 static inline bitmap_element *
00098 bitmap_element_allocate (bitmap head)
00099 {
00100 bitmap_element *element;
00101 bitmap_obstack *bit_obstack = head->obstack;
00102
00103 if (bit_obstack)
00104 {
00105 element = bit_obstack->elements;
00106
00107 if (element)
00108 bit_obstack->elements = element->next;
00109 else
00110 element = XOBNEW (&bit_obstack->obstack, bitmap_element);
00111 }
00112 else
00113 {
00114 element = bitmap_ggc_free;
00115 if (element)
00116 bitmap_ggc_free = element->next;
00117 else
00118 element = GGC_NEW (bitmap_element);
00119 }
00120
00121 memset (element->bits, 0, sizeof (element->bits));
00122
00123 return element;
00124 }
00125
00126
00127
00128 void
00129 bitmap_elt_clear_from (bitmap head, bitmap_element *elt)
00130 {
00131 bitmap_element *next;
00132
00133 while (elt)
00134 {
00135 next = elt->next;
00136 bitmap_element_free (head, elt);
00137 elt = next;
00138 }
00139 }
00140
00141
00142
00143 inline void
00144 bitmap_clear (bitmap head)
00145 {
00146 bitmap_element *element, *next;
00147
00148 for (element = head->first; element != 0; element = next)
00149 {
00150 next = element->next;
00151 bitmap_elem_to_freelist (head, element);
00152 }
00153
00154 head->first = head->current = 0;
00155 }
00156
00157
00158
00159
00160 void
00161 bitmap_obstack_initialize (bitmap_obstack *bit_obstack)
00162 {
00163 if (!bit_obstack)
00164 bit_obstack = &bitmap_default_obstack;
00165
00166 #if !defined(__GNUC__) || (__GNUC__ < 2)
00167 #define __alignof__(type) 0
00168 #endif
00169
00170 bit_obstack->elements = NULL;
00171 bit_obstack->heads = NULL;
00172 obstack_specify_allocation (&bit_obstack->obstack, OBSTACK_CHUNK_SIZE,
00173 __alignof__ (bitmap_element),
00174 obstack_chunk_alloc,
00175 obstack_chunk_free);
00176 }
00177
00178
00179
00180
00181 void
00182 bitmap_obstack_release (bitmap_obstack *bit_obstack)
00183 {
00184 if (!bit_obstack)
00185 bit_obstack = &bitmap_default_obstack;
00186
00187 bit_obstack->elements = NULL;
00188 bit_obstack->heads = NULL;
00189 obstack_free (&bit_obstack->obstack, NULL);
00190 }
00191
00192
00193
00194
00195 bitmap
00196 bitmap_obstack_alloc (bitmap_obstack *bit_obstack)
00197 {
00198 bitmap map;
00199
00200 if (!bit_obstack)
00201 bit_obstack = &bitmap_default_obstack;
00202 map = bit_obstack->heads;
00203 if (map)
00204 bit_obstack->heads = (void *)map->first;
00205 else
00206 map = XOBNEW (&bit_obstack->obstack, bitmap_head);
00207 bitmap_initialize (map, bit_obstack);
00208
00209 return map;
00210 }
00211
00212
00213
00214 bitmap
00215 bitmap_gc_alloc (void)
00216 {
00217 bitmap map;
00218
00219 map = GGC_NEW (struct bitmap_head_def);
00220 bitmap_initialize (map, NULL);
00221
00222 return map;
00223 }
00224
00225
00226
00227 void
00228 bitmap_obstack_free (bitmap map)
00229 {
00230 if (map)
00231 {
00232 bitmap_clear (map);
00233 map->first = (void *)map->obstack->heads;
00234 map->obstack->heads = map;
00235 }
00236 }
00237
00238
00239
00240
00241 static inline int
00242 bitmap_element_zerop (bitmap_element *element)
00243 {
00244 #if BITMAP_ELEMENT_WORDS == 2
00245 return (element->bits[0] | element->bits[1]) == 0;
00246 #else
00247 unsigned i;
00248
00249 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
00250 if (element->bits[i] != 0)
00251 return 0;
00252
00253 return 1;
00254 #endif
00255 }
00256
00257
00258
00259 static inline void
00260 bitmap_element_link (bitmap head, bitmap_element *element)
00261 {
00262 unsigned int indx = element->indx;
00263 bitmap_element *ptr;
00264
00265
00266 if (head->first == 0)
00267 {
00268 element->next = element->prev = 0;
00269 head->first = element;
00270 }
00271
00272
00273
00274 else if (indx < head->indx)
00275 {
00276 for (ptr = head->current;
00277 ptr->prev != 0 && ptr->prev->indx > indx;
00278 ptr = ptr->prev)
00279 ;
00280
00281 if (ptr->prev)
00282 ptr->prev->next = element;
00283 else
00284 head->first = element;
00285
00286 element->prev = ptr->prev;
00287 element->next = ptr;
00288 ptr->prev = element;
00289 }
00290
00291
00292 else
00293 {
00294 for (ptr = head->current;
00295 ptr->next != 0 && ptr->next->indx < indx;
00296 ptr = ptr->next)
00297 ;
00298
00299 if (ptr->next)
00300 ptr->next->prev = element;
00301
00302 element->next = ptr->next;
00303 element->prev = ptr;
00304 ptr->next = element;
00305 }
00306
00307
00308 head->current = element;
00309 head->indx = indx;
00310 }
00311
00312
00313
00314
00315
00316 static bitmap_element *
00317 bitmap_elt_insert_after (bitmap head, bitmap_element *elt)
00318 {
00319 bitmap_element *node = bitmap_element_allocate (head);
00320
00321 if (!elt)
00322 {
00323 if (!head->current)
00324 head->current = node;
00325 node->next = head->first;
00326 if (node->next)
00327 node->next->prev = node;
00328 head->first = node;
00329 node->prev = NULL;
00330 }
00331 else
00332 {
00333 gcc_assert (head->current);
00334 node->next = elt->next;
00335 if (node->next)
00336 node->next->prev = node;
00337 elt->next = node;
00338 node->prev = elt;
00339 }
00340 return node;
00341 }
00342
00343
00344
00345 void
00346 bitmap_copy (bitmap to, bitmap from)
00347 {
00348 bitmap_element *from_ptr, *to_ptr = 0;
00349 #if BITMAP_ELEMENT_WORDS != 2
00350 unsigned i;
00351 #endif
00352
00353 bitmap_clear (to);
00354
00355
00356 for (from_ptr = from->first; from_ptr; from_ptr = from_ptr->next)
00357 {
00358 bitmap_element *to_elt = bitmap_element_allocate (to);
00359
00360 to_elt->indx = from_ptr->indx;
00361
00362 #if BITMAP_ELEMENT_WORDS == 2
00363 to_elt->bits[0] = from_ptr->bits[0];
00364 to_elt->bits[1] = from_ptr->bits[1];
00365 #else
00366 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
00367 to_elt->bits[i] = from_ptr->bits[i];
00368 #endif
00369
00370
00371
00372 if (to_ptr == 0)
00373 {
00374 to->first = to->current = to_elt;
00375 to->indx = from_ptr->indx;
00376 to_elt->next = to_elt->prev = 0;
00377 }
00378 else
00379 {
00380 to_elt->prev = to_ptr;
00381 to_elt->next = 0;
00382 to_ptr->next = to_elt;
00383 }
00384
00385 to_ptr = to_elt;
00386 }
00387 }
00388
00389
00390
00391
00392
00393
00394 static inline bitmap_element *
00395 bitmap_find_bit (bitmap head, unsigned int bit)
00396 {
00397 bitmap_element *element;
00398 unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
00399
00400 if (head->current == 0
00401 || head->indx == indx)
00402 return head->current;
00403
00404 if (head->indx < indx)
00405
00406
00407 for (element = head->current;
00408 element->next != 0 && element->indx < indx;
00409 element = element->next)
00410 ;
00411
00412 else if (head->indx / 2 < indx)
00413
00414
00415 for (element = head->current;
00416 element->prev != 0 && element->indx > indx;
00417 element = element->prev)
00418 ;
00419
00420 else
00421
00422
00423 for (element = head->first;
00424 element->next != 0 && element->indx < indx;
00425 element = element->next)
00426 ;
00427
00428
00429
00430 head->current = element;
00431 head->indx = element->indx;
00432 if (element != 0 && element->indx != indx)
00433 element = 0;
00434
00435 return element;
00436 }
00437
00438
00439
00440 void
00441 bitmap_clear_bit (bitmap head, int bit)
00442 {
00443 bitmap_element *ptr = bitmap_find_bit (head, bit);
00444
00445 if (ptr != 0)
00446 {
00447 unsigned bit_num = bit % BITMAP_WORD_BITS;
00448 unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00449 ptr->bits[word_num] &= ~ (((BITMAP_WORD) 1) << bit_num);
00450
00451
00452 if (bitmap_element_zerop (ptr))
00453 bitmap_element_free (head, ptr);
00454 }
00455 }
00456
00457
00458
00459 void
00460 bitmap_set_bit (bitmap head, int bit)
00461 {
00462 bitmap_element *ptr = bitmap_find_bit (head, bit);
00463 unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00464 unsigned bit_num = bit % BITMAP_WORD_BITS;
00465 BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
00466
00467 if (ptr == 0)
00468 {
00469 ptr = bitmap_element_allocate (head);
00470 ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
00471 ptr->bits[word_num] = bit_val;
00472 bitmap_element_link (head, ptr);
00473 }
00474 else
00475 ptr->bits[word_num] |= bit_val;
00476 }
00477
00478
00479
00480 int
00481 bitmap_bit_p (bitmap head, int bit)
00482 {
00483 bitmap_element *ptr;
00484 unsigned bit_num;
00485 unsigned word_num;
00486
00487 ptr = bitmap_find_bit (head, bit);
00488 if (ptr == 0)
00489 return 0;
00490
00491 bit_num = bit % BITMAP_WORD_BITS;
00492 word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00493
00494 return (ptr->bits[word_num] >> bit_num) & 1;
00495 }
00496
00497
00498
00499
00500 unsigned
00501 bitmap_first_set_bit (bitmap a)
00502 {
00503 bitmap_element *elt = a->first;
00504 unsigned bit_no;
00505 BITMAP_WORD word;
00506 unsigned ix;
00507
00508 gcc_assert (elt);
00509 bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
00510 for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
00511 {
00512 word = elt->bits[ix];
00513 if (word)
00514 goto found_bit;
00515 }
00516 gcc_unreachable ();
00517 found_bit:
00518 bit_no += ix * BITMAP_WORD_BITS;
00519
00520 #if GCC_VERSION >= 3004
00521 gcc_assert (sizeof(long) == sizeof (word));
00522 bit_no += __builtin_ctzl (word);
00523 #else
00524
00525 #if BITMAP_WORD_BITS > 64
00526 #error "Fill out the table."
00527 #endif
00528 #if BITMAP_WORD_BITS > 32
00529 if (!(word & 0xffffffff))
00530 word >>= 32, bit_no += 32;
00531 #endif
00532 if (!(word & 0xffff))
00533 word >>= 16, bit_no += 16;
00534 if (!(word & 0xff))
00535 word >>= 8, bit_no += 8;
00536 if (!(word & 0xf))
00537 word >>= 4, bit_no += 4;
00538 if (!(word & 0x3))
00539 word >>= 2, bit_no += 2;
00540 if (!(word & 0x1))
00541 word >>= 1, bit_no += 1;
00542
00543 gcc_assert (word & 1);
00544 #endif
00545 return bit_no;
00546 }
00547
00548
00549
00550
00551 void
00552 bitmap_and (bitmap dst, bitmap a, bitmap b)
00553 {
00554 bitmap_element *dst_elt = dst->first;
00555 bitmap_element *a_elt = a->first;
00556 bitmap_element *b_elt = b->first;
00557 bitmap_element *dst_prev = NULL;
00558
00559 gcc_assert (dst != a && dst != b && a != b);
00560 while (a_elt && b_elt)
00561 {
00562 if (a_elt->indx < b_elt->indx)
00563 a_elt = a_elt->next;
00564 else if (b_elt->indx < a_elt->indx)
00565 b_elt = b_elt->next;
00566 else
00567 {
00568
00569 unsigned ix;
00570 BITMAP_WORD ior = 0;
00571
00572 if (!dst_elt)
00573 dst_elt = bitmap_elt_insert_after (dst, dst_prev);
00574
00575 dst_elt->indx = a_elt->indx;
00576 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00577 {
00578 BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
00579
00580 dst_elt->bits[ix] = r;
00581 ior |= r;
00582 }
00583 if (ior)
00584 {
00585 dst_prev = dst_elt;
00586 dst_elt = dst_elt->next;
00587 }
00588 a_elt = a_elt->next;
00589 b_elt = b_elt->next;
00590 }
00591 }
00592 bitmap_elt_clear_from (dst, dst_elt);
00593 gcc_assert (!dst->current == !dst->first);
00594 if (dst->current)
00595 dst->indx = dst->current->indx;
00596 }
00597
00598
00599
00600 void
00601 bitmap_and_into (bitmap a, bitmap b)
00602 {
00603 bitmap_element *a_elt = a->first;
00604 bitmap_element *b_elt = b->first;
00605 bitmap_element *next;
00606
00607 gcc_assert (a != b);
00608 while (a_elt && b_elt)
00609 {
00610 if (a_elt->indx < b_elt->indx)
00611 {
00612 next = a_elt->next;
00613 bitmap_element_free (a, a_elt);
00614 a_elt = next;
00615 }
00616 else if (b_elt->indx < a_elt->indx)
00617 b_elt = b_elt->next;
00618 else
00619 {
00620
00621 unsigned ix;
00622 BITMAP_WORD ior = 0;
00623
00624 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00625 {
00626 BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
00627
00628 a_elt->bits[ix] = r;
00629 ior |= r;
00630 }
00631 next = a_elt->next;
00632 if (!ior)
00633 bitmap_element_free (a, a_elt);
00634 a_elt = next;
00635 b_elt = b_elt->next;
00636 }
00637 }
00638 bitmap_elt_clear_from (a, a_elt);
00639 gcc_assert (!a->current == !a->first);
00640 gcc_assert (!a->current || a->indx == a->current->indx);
00641 }
00642
00643
00644
00645 void
00646 bitmap_and_compl (bitmap dst, bitmap a, bitmap b)
00647 {
00648 bitmap_element *dst_elt = dst->first;
00649 bitmap_element *a_elt = a->first;
00650 bitmap_element *b_elt = b->first;
00651 bitmap_element *dst_prev = NULL;
00652
00653 gcc_assert (dst != a && dst != b && a != b);
00654
00655 while (a_elt)
00656 {
00657 if (!b_elt || a_elt->indx < b_elt->indx)
00658 {
00659
00660 if (!dst_elt)
00661 dst_elt = bitmap_elt_insert_after (dst, dst_prev);
00662
00663 dst_elt->indx = a_elt->indx;
00664 memcpy (dst_elt->bits, a_elt->bits, sizeof (dst_elt->bits));
00665 dst_prev = dst_elt;
00666 dst_elt = dst_elt->next;
00667 a_elt = a_elt->next;
00668 }
00669 else if (b_elt->indx < a_elt->indx)
00670 b_elt = b_elt->next;
00671 else
00672 {
00673
00674 unsigned ix;
00675 BITMAP_WORD ior = 0;
00676
00677 if (!dst_elt)
00678 dst_elt = bitmap_elt_insert_after (dst, dst_prev);
00679
00680 dst_elt->indx = a_elt->indx;
00681 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00682 {
00683 BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
00684
00685 dst_elt->bits[ix] = r;
00686 ior |= r;
00687 }
00688 if (ior)
00689 {
00690 dst_prev = dst_elt;
00691 dst_elt = dst_elt->next;
00692 }
00693 a_elt = a_elt->next;
00694 b_elt = b_elt->next;
00695 }
00696 }
00697 bitmap_elt_clear_from (dst, dst_elt);
00698 gcc_assert (!dst->current == !dst->first);
00699 if (dst->current)
00700 dst->indx = dst->current->indx;
00701 }
00702
00703
00704
00705 bool
00706 bitmap_and_compl_into (bitmap a, bitmap b)
00707 {
00708 bitmap_element *a_elt = a->first;
00709 bitmap_element *b_elt = b->first;
00710 bitmap_element *next;
00711 BITMAP_WORD changed = 0;
00712
00713 gcc_assert (a != b);
00714 while (a_elt && b_elt)
00715 {
00716 if (a_elt->indx < b_elt->indx)
00717 a_elt = a_elt->next;
00718 else if (b_elt->indx < a_elt->indx)
00719 b_elt = b_elt->next;
00720 else
00721 {
00722
00723 unsigned ix;
00724 BITMAP_WORD ior = 0;
00725
00726 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00727 {
00728 BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
00729 BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
00730
00731 a_elt->bits[ix] = r;
00732 changed |= cleared;
00733 ior |= r;
00734 }
00735 next = a_elt->next;
00736 if (!ior)
00737 bitmap_element_free (a, a_elt);
00738 a_elt = next;
00739 b_elt = b_elt->next;
00740 }
00741 }
00742 gcc_assert (!a->current == !a->first);
00743 gcc_assert (!a->current || a->indx == a->current->indx);
00744 return changed != 0;
00745 }
00746
00747
00748
00749 bool
00750 bitmap_ior (bitmap dst, bitmap a, bitmap b)
00751 {
00752 bitmap_element *dst_elt = dst->first;
00753 bitmap_element *a_elt = a->first;
00754 bitmap_element *b_elt = b->first;
00755 bitmap_element *dst_prev = NULL;
00756 bool changed = false;
00757
00758 gcc_assert (dst != a && dst != b && a != b);
00759 while (a_elt || b_elt)
00760 {
00761 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
00762 {
00763
00764 unsigned ix;
00765
00766 if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
00767 {
00768 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00769 {
00770 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
00771
00772 if (r != dst_elt->bits[ix])
00773 {
00774 dst_elt->bits[ix] = r;
00775 changed = true;
00776 }
00777 }
00778 }
00779 else
00780 {
00781 changed = true;
00782 if (!dst_elt)
00783 dst_elt = bitmap_elt_insert_after (dst, dst_prev);
00784 dst_elt->indx = a_elt->indx;
00785 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00786 {
00787 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
00788
00789 dst_elt->bits[ix] = r;
00790 }
00791 }
00792 a_elt = a_elt->next;
00793 b_elt = b_elt->next;
00794 dst_prev = dst_elt;
00795 dst_elt = dst_elt->next;
00796 }
00797 else
00798 {
00799
00800 bitmap_element *src;
00801
00802 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
00803 {
00804 src = a_elt;
00805 a_elt = a_elt->next;
00806 }
00807 else
00808 {
00809 src = b_elt;
00810 b_elt = b_elt->next;
00811 }
00812
00813 if (!changed && dst_elt && dst_elt->indx == src->indx)
00814 {
00815 unsigned ix;
00816
00817 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00818 if (src->bits[ix] != dst_elt->bits[ix])
00819 {
00820 dst_elt->bits[ix] = src->bits[ix];
00821 changed = true;
00822 }
00823 }
00824 else
00825 {
00826 changed = true;
00827 if (!dst_elt)
00828 dst_elt = bitmap_elt_insert_after (dst, dst_prev);
00829 dst_elt->indx = src->indx;
00830 memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
00831 }
00832
00833 dst_prev = dst_elt;
00834 dst_elt = dst_elt->next;
00835 }
00836 }
00837
00838 if (dst_elt)
00839 {
00840 changed = true;
00841 bitmap_elt_clear_from (dst, dst_elt);
00842 }
00843 gcc_assert (!dst->current == !dst->first);
00844 if (dst->current)
00845 dst->indx = dst->current->indx;
00846 return changed;
00847 }
00848
00849
00850
00851 bool
00852 bitmap_ior_into (bitmap a, bitmap b)
00853 {
00854 bitmap_element *a_elt = a->first;
00855 bitmap_element *b_elt = b->first;
00856 bitmap_element *a_prev = NULL;
00857 bool changed = false;
00858
00859 gcc_assert (a != b);
00860 while (b_elt)
00861 {
00862 if (!a_elt || b_elt->indx < a_elt->indx)
00863 {
00864
00865 bitmap_element *dst = bitmap_elt_insert_after (a, a_prev);
00866
00867 dst->indx = b_elt->indx;
00868 memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
00869 a_prev = dst;
00870 b_elt = b_elt->next;
00871 changed = true;
00872 }
00873 else if (a_elt->indx < b_elt->indx)
00874 {
00875 a_prev = a_elt;
00876 a_elt = a_elt->next;
00877 }
00878 else
00879 {
00880
00881 unsigned ix;
00882
00883 if (changed)
00884 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00885 {
00886 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
00887
00888 a_elt->bits[ix] = r;
00889 }
00890 else
00891 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00892 {
00893 BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
00894
00895 if (a_elt->bits[ix] != r)
00896 {
00897 changed = true;
00898 a_elt->bits[ix] = r;
00899 }
00900 }
00901 b_elt = b_elt->next;
00902 a_prev = a_elt;
00903 a_elt = a_elt->next;
00904 }
00905 }
00906 gcc_assert (!a->current == !a->first);
00907 if (a->current)
00908 a->indx = a->current->indx;
00909 return changed;
00910 }
00911
00912
00913
00914 void
00915 bitmap_xor (bitmap dst, bitmap a, bitmap b)
00916 {
00917 bitmap_element *dst_elt = dst->first;
00918 bitmap_element *a_elt = a->first;
00919 bitmap_element *b_elt = b->first;
00920 bitmap_element *dst_prev = NULL;
00921
00922 gcc_assert (dst != a && dst != b && a != b);
00923 while (a_elt || b_elt)
00924 {
00925 if (a_elt && b_elt && a_elt->indx == b_elt->indx)
00926 {
00927
00928 unsigned ix;
00929 BITMAP_WORD ior = 0;
00930
00931 if (!dst_elt)
00932 dst_elt = bitmap_elt_insert_after (dst, dst_prev);
00933
00934 dst_elt->indx = a_elt->indx;
00935 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
00936 {
00937 BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
00938
00939 ior |= r;
00940 dst_elt->bits[ix] = r;
00941 }
00942 a_elt = a_elt->next;
00943 b_elt = b_elt->next;
00944 if (ior)
00945 {
00946 dst_prev = dst_elt;
00947 dst_elt = dst_elt->next;
00948 }
00949 }
00950 else
00951 {
00952
00953 bitmap_element *src;
00954
00955 if (!b_elt || (a_elt && a_elt->indx < b_elt->indx))
00956 {
00957 src = a_elt;
00958 a_elt = a_elt->next;
00959 }
00960 else
00961 {
00962 src = b_elt;
00963 b_elt = b_elt->next;
00964 }
00965
00966 if (!dst_elt)
00967 dst_elt = bitmap_elt_insert_after (dst, dst_prev);
00968
00969 dst_elt->indx = src->indx;
00970 memcpy (dst_elt->bits, src->bits, sizeof (dst_elt->bits));
00971 dst_prev = dst_elt;
00972 dst_elt = dst_elt->next;
00973 }
00974 }
00975 bitmap_elt_clear_from (dst, dst_elt);
00976 gcc_assert (!dst->current == !dst->first);
00977 if (dst->current)
00978 dst->indx = dst->current->indx;
00979 }
00980
00981
00982
00983 void
00984 bitmap_xor_into (bitmap a, bitmap b)
00985 {
00986 bitmap_element *a_elt = a->first;
00987 bitmap_element *b_elt = b->first;
00988 bitmap_element *a_prev = NULL;
00989
00990 gcc_assert (a != b);
00991 while (b_elt)
00992 {
00993 if (!a_elt || b_elt->indx < a_elt->indx)
00994 {
00995
00996 bitmap_element *dst = bitmap_elt_insert_after (a, a_prev);
00997
00998 dst->indx = b_elt->indx;
00999 memcpy (dst->bits, b_elt->bits, sizeof (dst->bits));
01000 a_prev = dst;
01001 b_elt = b_elt->next;
01002 }
01003 else if (a_elt->indx < b_elt->indx)
01004 {
01005 a_prev = a_elt;
01006 a_elt = a_elt->next;
01007 }
01008 else
01009 {
01010
01011 unsigned ix;
01012 BITMAP_WORD ior = 0;
01013 bitmap_element *next = a_elt->next;
01014
01015 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
01016 {
01017 BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
01018
01019 ior |= r;
01020 a_elt->bits[ix] = r;
01021 }
01022 b_elt = b_elt->next;
01023 if (ior)
01024 a_prev = a_elt;
01025 else
01026 bitmap_element_free (a, a_elt);
01027 a_elt = next;
01028 }
01029 }
01030 gcc_assert (!a->current == !a->first);
01031 if (a->current)
01032 a->indx = a->current->indx;
01033 }
01034
01035
01036
01037
01038
01039 bool
01040 bitmap_equal_p (bitmap a, bitmap b)
01041 {
01042 bitmap_element *a_elt;
01043 bitmap_element *b_elt;
01044 unsigned ix;
01045
01046 for (a_elt = a->first, b_elt = b->first;
01047 a_elt && b_elt;
01048 a_elt = a_elt->next, b_elt = b_elt->next)
01049 {
01050 if (a_elt->indx != b_elt->indx)
01051 return false;
01052 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
01053 if (a_elt->bits[ix] != b_elt->bits[ix])
01054 return false;
01055 }
01056 return !a_elt && !b_elt;
01057 }
01058
01059
01060
01061 bool
01062 bitmap_intersect_p (bitmap a, bitmap b)
01063 {
01064 bitmap_element *a_elt;
01065 bitmap_element *b_elt;
01066 unsigned ix;
01067
01068 for (a_elt = a->first, b_elt = b->first;
01069 a_elt && b_elt;)
01070 {
01071 if (a_elt->indx < b_elt->indx)
01072 a_elt = a_elt->next;
01073 else if (b_elt->indx < a_elt->indx)
01074 b_elt = b_elt->next;
01075 else
01076 {
01077 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
01078 if (a_elt->bits[ix] & b_elt->bits[ix])
01079 return true;
01080 a_elt = a_elt->next;
01081 b_elt = b_elt->next;
01082 }
01083 }
01084 return false;
01085 }
01086
01087
01088
01089 bool
01090 bitmap_intersect_compl_p (bitmap a, bitmap b)
01091 {
01092 bitmap_element *a_elt;
01093 bitmap_element *b_elt;
01094 unsigned ix;
01095 for (a_elt = a->first, b_elt = b->first;
01096 a_elt && b_elt;)
01097 {
01098 if (a_elt->indx < b_elt->indx)
01099 return true;
01100 else if (b_elt->indx < a_elt->indx)
01101 b_elt = b_elt->next;
01102 else
01103 {
01104 for (ix = BITMAP_ELEMENT_WORDS; ix--;)
01105 if (a_elt->bits[ix] & ~b_elt->bits[ix])
01106 return true;
01107 a_elt = a_elt->next;
01108 b_elt = b_elt->next;
01109 }
01110 }
01111 return a_elt != NULL;
01112 }
01113
01114
01115
01116
01117 bool
01118 bitmap_ior_and_compl (bitmap dst, bitmap a, bitmap from1, bitmap from2)
01119 {
01120 bitmap_head tmp;
01121 bool changed;
01122
01123 bitmap_initialize (&tmp, &bitmap_default_obstack);
01124 bitmap_and_compl (&tmp, from1, from2);
01125 changed = bitmap_ior (dst, a, &tmp);
01126 bitmap_clear (&tmp);
01127
01128 return changed;
01129 }
01130
01131
01132
01133 bool
01134 bitmap_ior_and_compl_into (bitmap a, bitmap from1, bitmap from2)
01135 {
01136 bitmap_head tmp;
01137 bool changed;
01138
01139 bitmap_initialize (&tmp, &bitmap_default_obstack);
01140 bitmap_and_compl (&tmp, from1, from2);
01141 changed = bitmap_ior_into (a, &tmp);
01142 bitmap_clear (&tmp);
01143
01144 return changed;
01145 }
01146
01147
01148
01149 void
01150 debug_bitmap_file (FILE *file, bitmap head)
01151 {
01152 bitmap_element *ptr;
01153
01154 fprintf (file, "\nfirst = " HOST_PTR_PRINTF
01155 " current = " HOST_PTR_PRINTF " indx = %u\n",
01156 (void *) head->first, (void *) head->current, head->indx);
01157
01158 for (ptr = head->first; ptr; ptr = ptr->next)
01159 {
01160 unsigned int i, j, col = 26;
01161
01162 fprintf (file, "\t" HOST_PTR_PRINTF " next = " HOST_PTR_PRINTF
01163 " prev = " HOST_PTR_PRINTF " indx = %u\n\t\tbits = {",
01164 (void*) ptr, (void*) ptr->next, (void*) ptr->prev, ptr->indx);
01165
01166 for (i = 0; i < BITMAP_ELEMENT_WORDS; i++)
01167 for (j = 0; j < BITMAP_WORD_BITS; j++)
01168 if ((ptr->bits[i] >> j) & 1)
01169 {
01170 if (col > 70)
01171 {
01172 fprintf (file, "\n\t\t\t");
01173 col = 24;
01174 }
01175
01176 fprintf (file, " %u", (ptr->indx * BITMAP_ELEMENT_ALL_BITS
01177 + i * BITMAP_WORD_BITS + j));
01178 col += 4;
01179 }
01180
01181 fprintf (file, " }\n");
01182 }
01183 }
01184
01185
01186
01187
01188 void
01189 debug_bitmap (bitmap head)
01190 {
01191 debug_bitmap_file (stdout, head);
01192 }
01193
01194
01195
01196
01197 void
01198 bitmap_print (FILE *file, bitmap head, const char *prefix, const char *suffix)
01199 {
01200 const char *comma = "";
01201 unsigned i;
01202 bitmap_iterator bi;
01203
01204 fputs (prefix, file);
01205 EXECUTE_IF_SET_IN_BITMAP (head, 0, i, bi)
01206 {
01207 fprintf (file, "%s%d", comma, i);
01208 comma = ", ";
01209 }
01210 fputs (suffix, file);
01211 }
01212
01213 #include "gt-bitmap.h"