OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [bitmap.c] - Blame information for rev 797

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.