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