s390.c (s390_function_value): Rename to ...
[gcc.git] / gcc / ebitmap.c
1 /* Sparse array-based bitmaps.
2 Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
3 Contributed by Daniel Berlin <dberlin@dberlin.org>
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 "ebitmap.h"
25
26 /* The ebitmap data structure is a sparse bitmap structure that works
27 by having two pieces:
28 1. An array of all nonzero words in the structures, organized as
29 an array of HOST_WIDE_INT's.
30 2. A non-sparse bitmap saying which bitmap words are present in the
31 array.
32
33 As a consequence of this representation, testing whether a bit
34 exists in the bitmap is faster than linked-list bitmaps. For bits
35 in words that are all zero, the time to test is O(1). For bits in
36 words that exist, it requires O(n/sizeof(word)) time to perform the
37 test (ignoring the one element cache). It also has much better
38 locality than linked-list bitmaps.
39
40 To test whether a bit exists, we do the following:
41 1. Test whether the word the bit would appear in exists in the
42 bitmap (O(1) check of the mask). If not, fail.
43
44 2. Population count the mask up to the word containing the bit, to
45 find the place in the array the word would be (popcount is cached,
46 but this is just as slow as the linked-list bitmap)
47 3. Test the word to see if the bit exists.
48
49 Just like linked-list bitmaps, we cache the last element that has
50 been tested in order to speed up common access patterns.
51
52 Most of the other speedups are simply due to better locality of the
53 single contiguous array.
54
55 As would be expected in a structure like this, insertion into an
56 empty word in the middle requires moving bits to make room for the
57 new word. As most operations that perform sets perform them in
58 order, this is rarely a problem. We also take advantage of the
59 same element cache to make repeated sets to the same word O(1).
60
61 Operations on the entire bitmap are also more efficient than linked
62 list bitmaps, as they are all operating on contiguous memory, and
63 can be easily vectorized. They are all O(number of words) +
64 O(number of bits that may end up in the destination), as the
65 appropriate operation is first performed on the word mask, and then
66 only those elements that may generate results are touched.
67
68 Memory wise, the ebitmap starts out using less memory than the
69 linked-list bitmap, but its size in memory is technically bounded
70 by ((index of the highest bit set) / (size of a word) + (index of
71 the highest bit set) / ((size of a word) * (size of a word))) This
72 is because the mask is non-sparse. The mask could be transformed
73 into a sparse bitmap at the cost of making bit testing
74 *theoretically* slower (real world numbers have not been computed
75 yet as to whether it matters or not). */
76
77 /* #define EBITMAP_DEBUGGING */
78
79 /* Find the last set bit in ebitmap MAP. */
80
81 int
82 ebitmap_last_set_bit (ebitmap map)
83 {
84 unsigned int i = 0;
85 ebitmap_iterator ebi;
86 bool foundbit = false;
87
88 /* This is not the fastest way to do this, we could simply look for
89 the popcount, and start there, but this function is not used
90 anywhere speed critical. */
91 EXECUTE_IF_SET_IN_EBITMAP (map, 0, i, ebi)
92 {
93 foundbit = true;
94 }
95
96
97 if (foundbit)
98 return i;
99 return -1;
100 }
101
102 /* Grow or shrink the internal word array for MAP to NEWSIZE
103 elements. */
104
105 static inline void
106 ebitmap_array_grow (ebitmap map, unsigned int newsize)
107 {
108 if (newsize <= map->n_elts)
109 {
110 map->n_elts = newsize;
111 return;
112 }
113
114 newsize += newsize / 4;
115
116 map->n_elts = newsize;
117 map->elts = XRESIZEVEC (EBITMAP_ELT_TYPE, map->elts, newsize);
118 }
119
120 /* Grow the internal word array for MAP so it is at least SIZE
121 elements. Will not shrink the array if it is already big
122 enough. */
123
124 static inline void
125 ebitmap_array_maybe_grow (ebitmap map, unsigned int size)
126 {
127 if (size >= map->n_elts)
128 ebitmap_array_grow (map, size + 1);
129 }
130
131 /* Retrieve the IDX'th element from the word array for MAP. */
132
133 static inline EBITMAP_ELT_TYPE
134 ebitmap_array_get (ebitmap map, unsigned int idx)
135 {
136 gcc_assert (idx < map->n_elts);
137 return map->elts[idx];
138 }
139
140 /* Retrieve a pointer to the IDX'th element from the word array for
141 MAP. If the element index is greater than the size of the array,
142 the array will be grown to the correct size. */
143
144 static inline EBITMAP_ELT_TYPE *
145 ebitmap_array_grow_get (ebitmap map, unsigned int idx)
146 {
147 if (idx >= map->n_elts)
148 ebitmap_array_grow (map, idx + 1);
149 return &map->elts[idx];
150 }
151
152 /* Initialize the internal word array for MAP, so that it is SIZE
153 elements. */
154
155 static inline void
156 ebitmap_array_init (ebitmap map, unsigned int size)
157 {
158 if (size > 0)
159 {
160 map->elts = XNEWVEC (EBITMAP_ELT_TYPE, size);
161 map->n_elts = size;
162 }
163 else
164 {
165 map->n_elts = 0;
166 map->elts = NULL;
167 }
168 }
169
170 /* Free the internal word array for MAP. */
171
172 static inline void
173 ebitmap_array_clear (ebitmap map)
174 {
175 if (map->elts)
176 {
177 free (map->elts);
178 map->elts = NULL;
179 }
180 map->n_elts = 0;
181 }
182
183 /* Clear ebitmap MAP. */
184
185 void
186 ebitmap_clear (ebitmap map)
187 {
188 ebitmap_array_clear (map);
189 sbitmap_zero (map->wordmask);
190 map->wordmask = sbitmap_resize (map->wordmask, 1, 0);
191 map->numwords = 0;
192 map->cache = NULL;
193 map->cacheindex = 0;
194 }
195
196 /* Allocate an ebitmap with enough room for SIZE bits to start out. */
197
198 ebitmap
199 ebitmap_alloc (unsigned int size)
200 {
201 ebitmap ret = XNEW (struct ebitmap_def);
202 if (size == 0)
203 size = EBITMAP_ELT_BITS;
204 ebitmap_array_init (ret, (size + EBITMAP_ELT_BITS - 1) / EBITMAP_ELT_BITS);
205 ret->wordmask = sbitmap_alloc_with_popcount (size);
206 sbitmap_zero (ret->wordmask);
207 ret->numwords = 0;
208 ret->cache = NULL;
209 ret->cacheindex = 0;
210
211 return ret;
212 }
213
214 /* Clear BIT from ebitmap MAP. */
215
216 void
217 ebitmap_clear_bit (ebitmap map, unsigned int bit)
218 {
219 unsigned int wordindex = bit / EBITMAP_ELT_BITS;
220 unsigned int eltwordindex = 0;
221 unsigned int bitindex, shift;
222 bool have_eltwordindex = false;
223 EBITMAP_ELT_TYPE *elt_ptr;
224
225 /* If the bit can't exist in our bitmap, just return. */
226 if (map->numwords == 0)
227 return;
228
229 if (wordindex >= map->wordmask->n_bits
230 || !TEST_BIT (map->wordmask, wordindex))
231 return;
232
233 if (map->cache != NULL && map->cacheindex == wordindex)
234 elt_ptr = map->cache;
235 else
236 {
237 eltwordindex = sbitmap_popcount (map->wordmask, wordindex);
238 elt_ptr = &map->elts[eltwordindex];
239 have_eltwordindex = true;
240 }
241
242 bitindex = bit % EBITMAP_ELT_BITS;
243 shift = bitindex;
244
245 *(elt_ptr) &= ~(((EBITMAP_ELT_TYPE)1) << shift);
246
247 /* Clear out the empty words. */
248 if (*(elt_ptr) == 0)
249 {
250 if (!have_eltwordindex)
251 eltwordindex = sbitmap_popcount (map->wordmask, wordindex);
252
253 if (map->cache != NULL)
254 {
255 if (map->cacheindex == wordindex)
256 map->cache = NULL;
257 else if (map->cacheindex > wordindex)
258 map->cache = map->cache - 1;
259 }
260
261 RESET_BIT (map->wordmask, wordindex);
262
263 memmove(&map->elts[eltwordindex], &map->elts[eltwordindex + 1],
264 sizeof (EBITMAP_ELT_TYPE) * (map->numwords - eltwordindex));
265 map->numwords--;
266 }
267 }
268
269 /* Set BIT in ebitmap MAP. */
270
271 void
272 ebitmap_set_bit (ebitmap map, unsigned int bit)
273 {
274 unsigned int wordindex = bit / EBITMAP_ELT_BITS;
275 unsigned int eltwordindex;
276 unsigned int bitindex = bit % EBITMAP_ELT_BITS;
277
278 /* If we have this element cached, just set the bit in it. */
279 if (map->cache && map->cacheindex == wordindex)
280 {
281 (*map->cache) |= (EBITMAP_ELT_TYPE)1 << bitindex;
282 return;
283 }
284
285 /* Resize the wordmask if necessary. */
286 if (wordindex >= map->wordmask->n_bits)
287 map->wordmask = sbitmap_resize (map->wordmask, wordindex + 1, 0);
288
289 /* Allocate a new word in the array and move whatever is in it's
290 place, if necessary. */
291 if (!TEST_BIT (map->wordmask, wordindex))
292 {
293 unsigned long count;
294 unsigned int i;
295
296 SET_BIT (map->wordmask, wordindex);
297 count = sbitmap_popcount (map->wordmask, wordindex);
298 gcc_assert (count <= map->numwords);
299
300 for (i = map->numwords; i > count; i--)
301 {
302 EBITMAP_ELT_TYPE *newelt;
303 newelt = ebitmap_array_grow_get (map, i);
304 *newelt = ebitmap_array_get (map, i - 1);
305 }
306 map->numwords++;
307 eltwordindex = count;
308 ebitmap_array_maybe_grow (map, eltwordindex);
309 map->elts[eltwordindex] = 0;
310 }
311 else
312 {
313 eltwordindex = sbitmap_popcount (map->wordmask, wordindex);
314 }
315
316 /* Set the actual bit. */
317 bitindex = bit % EBITMAP_ELT_BITS;
318
319 map->elts[eltwordindex] |= (EBITMAP_ELT_TYPE)1 << bitindex;
320 map->cache = &map->elts[eltwordindex];
321 map->cacheindex = wordindex;
322 }
323
324
325 /* Return true if MAP contains BIT. */
326
327 bool
328 ebitmap_bit_p (ebitmap map, unsigned int bit)
329 {
330 unsigned int wordindex = bit / EBITMAP_ELT_BITS;
331 unsigned int bitindex= bit % EBITMAP_ELT_BITS;
332
333 /* Trivial empty ebitmap case. */
334 if (map->numwords == 0)
335 return false;
336
337 if (map->cache && map->cacheindex == wordindex)
338 return ((*map->cache) >> bitindex) & 1;
339
340 /* If the wordindex is greater than the size of the wordmask, *or*
341 it's not set in the wordmask, this bit can't exist in our
342 ebitmap. */
343 if (wordindex >= map->wordmask->n_bits
344 || !TEST_BIT (map->wordmask, wordindex))
345 return false;
346
347 /* Find the bit and test it. */
348 map->cacheindex = wordindex;
349 wordindex = sbitmap_popcount (map->wordmask, wordindex);
350 map->cache = &map->elts[wordindex];
351
352 return (map->elts[wordindex] >> bitindex) & 1;
353 }
354
355 /* Copy ebitmap SRC to DST. */
356
357 void
358 ebitmap_copy (ebitmap dst, ebitmap src)
359 {
360 /* Blow away any existing wordmask, and copy the new one. */
361 sbitmap_free (dst->wordmask);
362 dst->wordmask = sbitmap_alloc_with_popcount (src->wordmask->n_bits);
363 sbitmap_copy (dst->wordmask, src->wordmask);
364
365 /* Make sure our destination array is big enough, and then copy the
366 actual words. */
367 ebitmap_array_grow (dst, src->numwords);
368 memcpy (dst->elts, src->elts,
369 src->numwords * sizeof (EBITMAP_ELT_TYPE));
370 dst->numwords = src->numwords;
371 dst->cache = NULL;
372 }
373
374 /* Dump ebitmap BMAP to FILE. */
375
376 void
377 dump_ebitmap (FILE *file, ebitmap bmap)
378 {
379 unsigned int pos;
380 unsigned int i;
381 int res;
382 unsigned int size;
383
384 res = sbitmap_last_set_bit (bmap->wordmask);
385 if (res == -1)
386 size = 0;
387 else
388 size = (res + 1) * EBITMAP_ELT_BITS;
389
390 fprintf (file, "n_words = %d, set = {", bmap->numwords);
391
392 for (pos = 30, i = 0; i < size; i++)
393 if (ebitmap_bit_p (bmap, i))
394 {
395 if (pos > 70)
396 {
397 fprintf (file, "\n ");
398 pos = 0;
399 }
400
401 pos += fprintf (file, "%d ", i);
402 }
403
404 fprintf (file, "}\n");
405 }
406
407 /* Dump ebitmap BMAP to stderr. */
408
409 DEBUG_FUNCTION void
410 debug_ebitmap (ebitmap bmap)
411 {
412 dump_ebitmap (stderr, bmap);
413 }
414
415 /* Perform the operation DST &= SRC. */
416
417 void
418 ebitmap_and_into (ebitmap dst, ebitmap src)
419 {
420 sbitmap_iterator sbi;
421 unsigned int i;
422 unsigned int neweltindex = 0;
423 unsigned int dsteltindex = 0;
424 unsigned int srceltindex = 0;
425
426 gcc_assert (dst != src);
427
428 dst->cache = NULL;
429
430 /* Short circuit the empty bitmap cases. */
431 if (src->numwords == 0 || dst->numwords == 0)
432 {
433 ebitmap_clear (dst);
434 return;
435 }
436
437 /* AND the masks, then walk the words that may actually appear in
438 the result, AND'ing them. */
439 sbitmap_a_and_b (dst->wordmask, dst->wordmask, src->wordmask);
440
441 EXECUTE_IF_SET_IN_SBITMAP (dst->wordmask, 0, i, sbi)
442 {
443 EBITMAP_ELT_TYPE tmpword = ebitmap_array_get (src, srceltindex++);
444 tmpword &= ebitmap_array_get (dst, dsteltindex++);
445 if (tmpword != 0)
446 {
447 EBITMAP_ELT_TYPE *dstplace;
448 dstplace = ebitmap_array_grow_get (dst, neweltindex++);
449 *dstplace = tmpword;
450 }
451 else
452 RESET_BIT (dst->wordmask, i);
453 }
454 #ifdef EBITMAP_DEBUGGING
455 {
456 unsigned int i;
457
458 for (i = 0; i < dst->numwords; i++)
459 gcc_assert (dst->elts[i] != 0);
460
461 sbitmap_verify_popcount (dst->wordmask);
462 gcc_assert (sbitmap_popcount (dst->wordmask,
463 dst->wordmask->n_bits) == dst->numwords);
464 }
465 #endif
466 dst->numwords = neweltindex;
467 }
468
469 /* Perform the operation DST = SRC1 & SRC2. */
470
471 void
472 ebitmap_and (ebitmap dst, ebitmap src1, ebitmap src2)
473 {
474 sbitmap_iterator sbi;
475 unsigned int i;
476 unsigned int neweltindex = 0;
477 unsigned int src1eltindex = 0;
478 unsigned int src2eltindex = 0;
479
480 dst->cache = NULL;
481 if (src1->numwords == 0 || src2->numwords == 0)
482 {
483 ebitmap_clear (dst);
484 return;
485 }
486
487 dst->wordmask
488 = sbitmap_resize (dst->wordmask,
489 MIN (src1->wordmask->n_bits, src2->wordmask->n_bits),
490 0);
491 sbitmap_a_and_b (dst->wordmask, src1->wordmask, src2->wordmask);
492
493 EXECUTE_IF_SET_IN_SBITMAP (dst->wordmask, 0, i, sbi)
494 {
495 bool src1hasword, src2hasword;
496
497 src1hasword = TEST_BIT (src1->wordmask, i);
498 src2hasword = TEST_BIT (src2->wordmask, i);
499
500 if (src1hasword && src2hasword)
501 {
502 EBITMAP_ELT_TYPE tmpword = ebitmap_array_get (src1, src1eltindex++);
503 tmpword &= ebitmap_array_get (src2, src2eltindex++);
504 if (tmpword != 0)
505 {
506 EBITMAP_ELT_TYPE *dstplace;
507 dstplace = ebitmap_array_grow_get (dst, neweltindex++);
508 *dstplace = tmpword;
509 }
510 else
511 RESET_BIT (dst->wordmask, i);
512 }
513 else if (src1hasword)
514 src1eltindex++;
515 else
516 src2eltindex++;
517 }
518 #ifdef EBITMAP_DEBUGGING
519 {
520 ebitmap_iterator ebi;
521 unsigned int i;
522
523 for (i = 0; i < dst->numwords; i++)
524 gcc_assert (dst->elts[i] != 0);
525
526 EXECUTE_IF_SET_IN_EBITMAP (src1, 0, i, ebi)
527 if (ebitmap_bit_p (src2, i))
528 gcc_assert (ebitmap_bit_p (dst, i));
529
530 for (i = 0; i < dst->numwords; i++)
531 gcc_assert (dst->elts[i] != 0);
532
533 sbitmap_verify_popcount (dst->wordmask);
534 gcc_assert (sbitmap_popcount (dst->wordmask,
535 dst->wordmask->n_bits) == dst->numwords);
536 }
537 #endif
538 dst->numwords = neweltindex;
539 }
540
541 /* Perform the operation DST |= SRC. Return true if any bits in DST
542 changed. */
543
544 bool
545 ebitmap_ior_into (ebitmap dst, ebitmap src)
546 {
547 unsigned int dstsize = dst->wordmask->n_bits;
548 unsigned int srcsize = src->wordmask->n_bits;
549 sbitmap_iterator sbi;
550 unsigned int i;
551 sbitmap tempmask;
552 unsigned int neweltindex = 0;
553 unsigned int dsteltindex = 0;
554 unsigned int srceltindex = 0;
555 bool changed = false;
556 EBITMAP_ELT_TYPE *newarray;
557 unsigned int newarraysize;
558 #ifdef EBITMAP_DEBUGGING
559 ebitmap dstcopy = ebitmap_alloc (1);
560 ebitmap_copy (dstcopy, dst);
561 #endif
562
563 dst->cache = NULL;
564 if (dst == src)
565 return false;
566
567 if (dst->numwords == 0 && src->numwords != 0)
568 {
569 ebitmap_copy (dst, src);
570 return true;
571 }
572 else if (src->numwords == 0)
573 return false;
574
575 /* We can do without the temp mask if it's faster, but it would mean
576 touching more words in the actual dense vector. */
577 tempmask = sbitmap_alloc (MAX (srcsize, dstsize));
578 sbitmap_zero (tempmask);
579 if (srcsize == dstsize)
580 {
581 sbitmap_a_or_b (tempmask, dst->wordmask, src->wordmask);
582 }
583 else
584 {
585 dst->wordmask = sbitmap_resize (dst->wordmask, MAX (srcsize, dstsize),
586 0);
587 if (srcsize >= dstsize)
588 {
589 sbitmap_copy_n (tempmask, dst->wordmask, dst->wordmask->size);
590 sbitmap_a_or_b (tempmask, tempmask, src->wordmask);
591 }
592 else
593 {
594 sbitmap_copy_n (tempmask, src->wordmask, src->wordmask->size);
595 sbitmap_a_or_b (tempmask, tempmask, dst->wordmask);
596 }
597 }
598 newarraysize = src->numwords + dst->numwords;
599 newarray = XNEWVEC (EBITMAP_ELT_TYPE, newarraysize);
600
601 EXECUTE_IF_SET_IN_SBITMAP (tempmask, 0, i, sbi)
602 {
603 bool dsthasword, srchasword;
604
605 dsthasword = (i < dst->wordmask->n_bits
606 && TEST_BIT (dst->wordmask, i));
607 srchasword = (i < src->wordmask->n_bits
608 && TEST_BIT (src->wordmask, i));
609
610 if (dsthasword && srchasword)
611 {
612 EBITMAP_ELT_TYPE tmpword = ebitmap_array_get (src, srceltindex++);
613 tmpword |= ebitmap_array_get (dst, dsteltindex);
614 if (!changed)
615 changed |= tmpword != ebitmap_array_get (dst, dsteltindex);
616 dsteltindex++;
617 newarray[neweltindex++] = tmpword;
618 }
619 else if (dsthasword)
620 {
621 newarray [neweltindex++] = ebitmap_array_get (dst, dsteltindex++);
622 }
623 else
624 {
625 newarray [neweltindex++] = ebitmap_array_get (src, srceltindex++);
626 gcc_assert (i < dst->wordmask->n_bits);
627 SET_BIT (dst->wordmask, i);
628 changed |= true;
629 }
630 }
631
632 sbitmap_free (tempmask);
633 if (changed)
634 {
635 dst->numwords = neweltindex;
636 free (dst->elts);
637 dst->elts = newarray;
638 dst->n_elts = newarraysize;
639 }
640 else
641 free (newarray);
642
643 #ifdef EBITMAP_DEBUGGING
644 {
645 ebitmap_iterator ebi;
646 unsigned int i;
647
648 for (i = 0; i < dst->numwords; i++)
649 gcc_assert (dst->elts[i] != 0);
650
651 EXECUTE_IF_SET_IN_EBITMAP (src, 0, i, ebi)
652 gcc_assert (ebitmap_bit_p (dst, i));
653 EXECUTE_IF_SET_IN_EBITMAP (dstcopy, 0, i, ebi)
654 gcc_assert (ebitmap_bit_p (dst, i));
655
656 sbitmap_verify_popcount (dst->wordmask);
657 gcc_assert (changed == !ebitmap_equal_p (dst, dstcopy));
658 gcc_assert (sbitmap_popcount (dst->wordmask,
659 dst->wordmask->n_bits) == dst->numwords);
660 }
661 #endif
662 return changed;
663 }
664
665 /* Perform the operation DST = SRC1 | SRC2. Return true if any bit
666 in DST has changed. */
667
668 bool
669 ebitmap_ior (ebitmap dst, ebitmap src1, ebitmap src2)
670 {
671 unsigned int src1size = src1->wordmask->n_bits;
672 unsigned int src2size = src2->wordmask->n_bits;
673 sbitmap_iterator sbi;
674 unsigned int i;
675 sbitmap tempmask;
676 unsigned int neweltindex = 0;
677 unsigned int src1eltindex = 0;
678 unsigned int src2eltindex = 0;
679 bool changed = false;
680 EBITMAP_ELT_TYPE *newarray;
681 unsigned int newarraysize;
682 #ifdef EBITMAP_DEBUGGING
683 ebitmap dstcopy = ebitmap_alloc (1);
684 ebitmap_copy (dstcopy, dst);
685 #endif
686
687 dst->cache = NULL;
688 tempmask = sbitmap_alloc_with_popcount (MAX (src1size, src2size));
689 sbitmap_zero (tempmask);
690 if (src1size == src2size)
691 {
692 sbitmap_a_or_b (tempmask, src1->wordmask, src2->wordmask);
693 }
694 else
695 {
696 if (src1size >= src2size)
697 {
698 sbitmap_copy_n (tempmask, src2->wordmask, src2->wordmask->size);
699 sbitmap_a_or_b (tempmask, tempmask, src1->wordmask);
700 }
701 else
702 {
703 sbitmap_copy_n (tempmask, src1->wordmask, src1->wordmask->size);
704 sbitmap_a_or_b (tempmask, tempmask, src2->wordmask);
705 }
706 }
707 newarraysize = src1->numwords + src2->numwords;
708 newarray = XNEWVEC (EBITMAP_ELT_TYPE, newarraysize);
709
710 EXECUTE_IF_SET_IN_SBITMAP (tempmask, 0, i, sbi)
711 {
712 bool src1hasword, src2hasword;
713 EBITMAP_ELT_TYPE tmpword;
714 src1hasword = (i < src1->wordmask->n_bits
715 && TEST_BIT (src1->wordmask, i));
716 src2hasword = (i < src2->wordmask->n_bits
717 && TEST_BIT (src2->wordmask, i));
718
719 if (src1hasword && src2hasword)
720 {
721 tmpword = (ebitmap_array_get (src1, src1eltindex++)
722 | ebitmap_array_get (src2, src2eltindex++));
723 newarray[neweltindex++] = tmpword;
724 }
725 else if (src1hasword)
726 {
727 tmpword = ebitmap_array_get (src1, src1eltindex++);
728 newarray [neweltindex++] = tmpword;
729 }
730 else
731 {
732 tmpword = ebitmap_array_get (src2, src2eltindex++);
733 newarray [neweltindex++] = tmpword;
734 }
735
736 if (i >= dst->wordmask->n_bits || !TEST_BIT (dst->wordmask, i))
737 {
738 changed = true;
739 }
740 else if (!changed)
741 {
742 unsigned int count = sbitmap_popcount (dst->wordmask, i);
743 changed |= ebitmap_array_get (dst, count) != tmpword;
744 }
745 }
746
747 if (changed)
748 {
749 sbitmap_free (dst->wordmask);
750 dst->wordmask = tempmask;
751 dst->numwords = neweltindex;
752 free (dst->elts);
753 dst->elts = newarray;
754 dst->n_elts = newarraysize;
755 }
756 else
757 {
758 sbitmap_free (tempmask);
759 free (newarray);
760 }
761
762 #ifdef EBITMAP_DEBUGGING
763 {
764 ebitmap_iterator ebi;
765 unsigned int i;
766
767 for (i = 0; i < dst->numwords; i++)
768 gcc_assert (dst->elts[i] != 0);
769
770 EXECUTE_IF_SET_IN_EBITMAP (src1, 0, i, ebi)
771 gcc_assert (ebitmap_bit_p (dst, i));
772
773 EXECUTE_IF_SET_IN_EBITMAP (src2, 0, i, ebi)
774 gcc_assert (ebitmap_bit_p (dst, i));
775 }
776 sbitmap_verify_popcount (dst->wordmask);
777 gcc_assert (changed == !ebitmap_equal_p (dst, dstcopy));
778 gcc_assert (sbitmap_popcount (dst->wordmask,
779 dst->wordmask->n_bits) == dst->numwords);
780 #endif
781
782 return changed;
783 }
784
785 /* Perform the operation DST &= ~SRC. Return true if any bit in DST
786 has changed. */
787
788 bool
789 ebitmap_and_compl_into (ebitmap dst, ebitmap src)
790 {
791 bool changed = false;
792 unsigned int i;
793 unsigned int neweltindex = 0;
794 unsigned int dsteltindex = 0;
795 sbitmap_iterator sbi;
796 #ifdef EBITMAP_DEBUGGING
797 ebitmap dstcopy = ebitmap_alloc (1);
798 ebitmap_copy (dstcopy, dst);
799 #endif
800
801 gcc_assert (dst != src);
802 dst->cache = NULL;
803 if (src->numwords == 0)
804 return false;
805
806 EXECUTE_IF_SET_IN_SBITMAP (dst->wordmask, 0, i, sbi)
807 {
808 bool srchasword;
809
810 srchasword = (i < src->wordmask->n_bits
811 && TEST_BIT (src->wordmask, i));
812
813 if (srchasword)
814 {
815 unsigned int srccount = sbitmap_popcount (src->wordmask, i);
816 EBITMAP_ELT_TYPE tmpword = ebitmap_array_get (dst, dsteltindex);
817 tmpword &= ~(ebitmap_array_get (src, srccount));
818 if (!changed)
819 changed |= ebitmap_array_get (dst, dsteltindex) != tmpword;
820 dsteltindex++;
821 if (tmpword != 0)
822 {
823 EBITMAP_ELT_TYPE *dstplace;
824 dstplace = ebitmap_array_grow_get (dst, neweltindex++);
825 *dstplace = tmpword;
826 }
827 else
828 RESET_BIT (dst->wordmask, i);
829 }
830 else
831 {
832 dsteltindex++;
833 neweltindex++;
834 }
835 }
836 #ifdef EBITMAP_DEBUGGING
837 {
838 unsigned int i;
839 ebitmap_iterator ebi;
840
841 EXECUTE_IF_SET_IN_EBITMAP (dstcopy, 0, i, ebi)
842 {
843 if (!ebitmap_bit_p (src, i))
844 gcc_assert (ebitmap_bit_p (dst, i));
845 }
846
847 for (i = 0; i < dst->numwords; i++)
848 gcc_assert (dst->elts[i] != 0);
849
850 gcc_assert (sbitmap_popcount (dst->wordmask,
851 dst->wordmask->n_bits) == neweltindex);
852 sbitmap_verify_popcount (dst->wordmask);
853 gcc_assert (changed == !ebitmap_equal_p (dst, dstcopy));
854 gcc_assert (sbitmap_popcount (dst->wordmask,
855 dst->wordmask->n_bits) == dst->numwords);
856 }
857 #endif
858 dst->numwords = neweltindex;
859 /* sbitmap_popcount (dst->wordmask, -1); */
860
861 return changed;
862 }
863
864 /* Perform the operation DST = SRC1 & ~SRC2. Return true if any bit
865 in DST has changed. */
866
867 bool
868 ebitmap_and_compl (ebitmap dst, ebitmap src1, ebitmap src2)
869 {
870 unsigned int src1size = src1->wordmask->n_bits;
871 sbitmap_iterator sbi;
872 unsigned int i;
873 sbitmap tempmask;
874 unsigned int neweltindex = 0;
875 unsigned int src1eltindex = 0;
876 bool changed = false;
877 EBITMAP_ELT_TYPE *newarray;
878 unsigned int newarraysize;
879
880 /* XXX: Optimize like the into version. */
881 dst->cache = NULL;
882 tempmask = sbitmap_alloc_with_popcount (src1size);
883 sbitmap_zero (tempmask);
884 sbitmap_copy (tempmask, src1->wordmask);
885
886 newarraysize = src1->numwords;
887 newarray = XNEWVEC (EBITMAP_ELT_TYPE, newarraysize);
888
889 EXECUTE_IF_SET_IN_SBITMAP (src1->wordmask, 0, i, sbi)
890 {
891 bool src2hasword;
892 EBITMAP_ELT_TYPE tmpword;
893
894 src2hasword = (i < src2->wordmask->n_bits
895 && TEST_BIT (src2->wordmask, i));
896
897 if (src2hasword)
898 {
899 unsigned int src2count = sbitmap_popcount (src2->wordmask, i);
900 tmpword = ebitmap_array_get (src1, src1eltindex++)
901 & ~(ebitmap_array_get (src2, src2count));
902 if (tmpword)
903 {
904 newarray[neweltindex++] = tmpword;
905 }
906 else
907 RESET_BIT (tempmask, i);
908
909 }
910 else
911 {
912 tmpword = ebitmap_array_get (src1, src1eltindex++);
913 gcc_assert (tmpword != 0);
914 newarray[neweltindex++] = tmpword;
915 }
916
917 if (i >= dst->wordmask->n_bits || !TEST_BIT (dst->wordmask, i))
918 {
919 changed = true;
920 }
921 else if (!changed)
922 {
923 unsigned int count = sbitmap_popcount (dst->wordmask, i);
924 changed |= ebitmap_array_get (dst, count) != tmpword;
925 }
926 }
927 if (changed)
928 {
929 sbitmap_free (dst->wordmask);
930 dst->wordmask = tempmask;
931 dst->numwords = neweltindex;
932 free (dst->elts);
933 dst->elts = newarray;
934 dst->n_elts = newarraysize;
935 }
936 else
937 {
938 free (tempmask);
939 free (newarray);
940 }
941 #ifdef EBITMAP_DEBUGGING
942 {
943 unsigned int i;
944 ebitmap_iterator ebi;
945
946 EXECUTE_IF_SET_IN_EBITMAP (src1, 0, i, ebi)
947 {
948 if (!ebitmap_bit_p (src2, i))
949 gcc_assert (ebitmap_bit_p (dst, i));
950 }
951 for (i = 0; i < dst->numwords; i++)
952 gcc_assert (dst->elts[i] != 0);
953
954 sbitmap_verify_popcount (dst->wordmask);
955 gcc_assert (sbitmap_popcount (dst->wordmask,
956 dst->wordmask->n_bits) == dst->numwords);
957 }
958 #endif
959 return changed;
960 }
961
962 /* Perform the operation DST = A | (B & ~C). */
963
964 bool
965 ebitmap_ior_and_compl (ebitmap dst, ebitmap a, ebitmap b, ebitmap c)
966 {
967 bool changed;
968 ebitmap temp = ebitmap_alloc (1);
969 #ifdef EBITMAP_DEBUGGING
970 ebitmap dstcopy = ebitmap_alloc (1);
971 ebitmap_copy (dstcopy, dst);
972 #endif
973
974 dst->cache = NULL;
975 ebitmap_and_compl (temp, b, c);
976 changed = ebitmap_ior (dst, a, temp);
977 #ifdef EBITMAP_DEBUGGING
978 {
979 ebitmap_iterator ebi;
980 unsigned int i;
981
982 EXECUTE_IF_SET_IN_EBITMAP (a, 0, i, ebi)
983 gcc_assert (ebitmap_bit_p (dst, i));
984
985 EXECUTE_IF_SET_IN_EBITMAP (b, 0, i, ebi)
986 if (!ebitmap_bit_p (c, i))
987 gcc_assert (ebitmap_bit_p (dst, i));
988 gcc_assert (changed == !ebitmap_equal_p (dst, dstcopy));
989 }
990 #endif
991 ebitmap_free (temp);
992
993 return changed;
994 }
995
996 /* Return true if ebitmap DST is equal to ebitmap SRC. */
997
998 bool
999 ebitmap_equal_p (ebitmap dst, ebitmap src)
1000 {
1001 unsigned int which = MIN (dst->wordmask->size, src->wordmask->size);
1002
1003 if (dst->numwords != src->numwords)
1004 return false;
1005
1006 /* sbitmap_equal compares up to the size of the first argument, so
1007 if the two sbitmaps are not equally sized, we need to pass the
1008 smaller one as the first argument, or it will crash. */
1009 if (which == dst->wordmask->size
1010 && !sbitmap_equal (dst->wordmask, src->wordmask))
1011 return false;
1012 else if (which == src->wordmask->size
1013 && !sbitmap_equal (src->wordmask, dst->wordmask))
1014 return false;
1015
1016 return memcmp (dst->elts, src->elts,
1017 dst->numwords * sizeof (EBITMAP_ELT_TYPE)) == 0;
1018 return true;
1019 }