bitmap.h 18.5 KB
Newer Older
Richard Kenner committed
1
/* Functions to support general ended bitmaps.
2
   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3
   2006, 2007, 2008, 2009 Free Software Foundation, Inc.
Richard Kenner committed
4

5
This file is part of GCC.
Richard Kenner committed
6

7 8
GCC is free software; you can redistribute it and/or modify it under
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.
Richard Kenner committed
11

12 13 14 15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
Richard Kenner committed
16 17

You should have received a copy of the GNU General Public License
18 19
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
Richard Kenner committed
20

21
#ifndef GCC_BITMAP_H
Kazu Hirata committed
22
#define GCC_BITMAP_H
23
#include "hashtab.h"
24
#include "statistics.h"
25
#include "obstack.h"
26

27 28 29
/* Fundamental storage type for bitmap.  */

typedef unsigned long BITMAP_WORD;
30 31 32
/* BITMAP_WORD_BITS needs to be unsigned, but cannot contain casts as
   it is used in preprocessor directives -- hence the 1u.  */
#define BITMAP_WORD_BITS (CHAR_BIT * SIZEOF_LONG * 1u)
33

Richard Kenner committed
34 35 36
/* Number of words to use for each element in the linked list.  */

#ifndef BITMAP_ELEMENT_WORDS
37
#define BITMAP_ELEMENT_WORDS ((128 + BITMAP_WORD_BITS - 1) / BITMAP_WORD_BITS)
Richard Kenner committed
38 39
#endif

40
/* Number of bits in each actual element of a bitmap.  */
Richard Kenner committed
41

42
#define BITMAP_ELEMENT_ALL_BITS (BITMAP_ELEMENT_WORDS * BITMAP_WORD_BITS)
Richard Kenner committed
43

44 45 46 47 48 49 50 51
/* Obstack for allocating bitmaps and elements from.  */
typedef struct bitmap_obstack GTY (())
{
  struct bitmap_element_def *elements;
  struct bitmap_head_def *heads;
  struct obstack GTY ((skip)) obstack;
} bitmap_obstack;

Richard Kenner committed
52 53
/* Bitmap set element.  We use a linked list to hold only the bits that
   are set.  This allows for use to grow the bitset dynamically without
Mike Stump committed
54
   having to realloc and copy a giant bit array.
55 56 57 58 59 60 61 62

   The free list is implemented as a list of lists.  There is one
   outer list connected together by prev fields.  Each element of that
   outer is an inner list (that may consist only of the outer list
   element) that are connected by the next fields.  The prev pointer
   is undefined for interior elements.  This allows
   bitmap_elt_clear_from to be implemented in unit time rather than
   linear in the number of elements to be freed.  */
Richard Kenner committed
63

64
typedef struct bitmap_element_def GTY(())
Richard Kenner committed
65
{
Kazu Hirata committed
66 67 68
  struct bitmap_element_def *next;		/* Next element.  */
  struct bitmap_element_def *prev;		/* Previous element.  */
  unsigned int indx;			/* regno/BITMAP_ELEMENT_ALL_BITS.  */
69
  BITMAP_WORD bits[BITMAP_ELEMENT_WORDS]; /* Bits that are set.  */
Richard Kenner committed
70 71
} bitmap_element;

72
struct bitmap_descriptor;
73 74 75 76
/* Head of bitmap linked list.  gengtype ignores ifdefs, but for
   statistics we need to add a bitmap descriptor pointer.  As it is
   not collected, we can just GTY((skip)) it.   */

77
typedef struct bitmap_head_def GTY(()) {
Kazu Hirata committed
78 79 80
  bitmap_element *first;	/* First element in linked list.  */
  bitmap_element *current;	/* Last element looked at.  */
  unsigned int indx;		/* Index of last element looked at.  */
81 82
  bitmap_obstack *obstack;	/* Obstack to allocate elements from.
				   If NULL, then use ggc_alloc.  */
83
#ifdef GATHER_STATISTICS
84
  struct bitmap_descriptor GTY((skip)) *desc;
85
#endif
86
} bitmap_head;
87

Richard Kenner committed
88
/* Global data */
89
extern bitmap_element bitmap_zero_bits;	/* Zero bitmap element */
90
extern bitmap_obstack bitmap_default_obstack;   /* Default bitmap obstack */
Richard Kenner committed
91 92

/* Clear a bitmap by freeing up the linked list.  */
93
extern void bitmap_clear (bitmap);
Richard Kenner committed
94

Kazu Hirata committed
95
/* Copy a bitmap to another bitmap.  */
96
extern void bitmap_copy (bitmap, const_bitmap);
Richard Kenner committed
97

98
/* True if two bitmaps are identical.  */
99
extern bool bitmap_equal_p (const_bitmap, const_bitmap);
100

101
/* True if the bitmaps intersect (their AND is non-empty).  */
102
extern bool bitmap_intersect_p (const_bitmap, const_bitmap);
103 104 105

/* True if the complement of the second intersects the first (their
   AND_COMPL is non-empty).  */
106
extern bool bitmap_intersect_compl_p (const_bitmap, const_bitmap);
107 108

/* True if MAP is an empty bitmap.  */
109 110
#define bitmap_empty_p(MAP) (!(MAP)->first)

111 112 113
/* True if the bitmap has only a single bit set.  */
extern bool bitmap_single_bit_set_p (const_bitmap);

114
/* Count the number of bits set in the bitmap.  */
115
extern unsigned long bitmap_count_bits (const_bitmap);
116

117 118 119 120
/* Boolean operations on bitmaps.  The _into variants are two operand
   versions that modify the first source operand.  The other variants
   are three operand versions that to not destroy the source bitmaps.
   The operations supported are &, & ~, |, ^.  */
121 122 123 124
extern void bitmap_and (bitmap, const_bitmap, const_bitmap);
extern void bitmap_and_into (bitmap, const_bitmap);
extern bool bitmap_and_compl (bitmap, const_bitmap, const_bitmap);
extern bool bitmap_and_compl_into (bitmap, const_bitmap);
125
#define bitmap_compl_and(DST, A, B) bitmap_and_compl (DST, B, A)
126
extern void bitmap_compl_and_into (bitmap, const_bitmap);
127
extern void bitmap_clear_range (bitmap, unsigned int, unsigned int);
128
extern void bitmap_set_range (bitmap, unsigned int, unsigned int);
129 130 131 132
extern bool bitmap_ior (bitmap, const_bitmap, const_bitmap);
extern bool bitmap_ior_into (bitmap, const_bitmap);
extern void bitmap_xor (bitmap, const_bitmap, const_bitmap);
extern void bitmap_xor_into (bitmap, const_bitmap);
133 134

/* DST = A | (B & ~C).  Return true if DST changes.  */
135
extern bool bitmap_ior_and_compl (bitmap DST, const_bitmap A, const_bitmap B, const_bitmap C);
136
/* A |= (B & ~C).  Return true if A changes.  */
137
extern bool bitmap_ior_and_compl_into (bitmap DST, const_bitmap B, const_bitmap C);
Richard Kenner committed
138

139 140
/* Clear a single bit in a bitmap.  Return true if the bit changed.  */
extern bool bitmap_clear_bit (bitmap, int);
Richard Kenner committed
141

142 143
/* Set a single bit in a bitmap.  Return true if the bit changed.  */
extern bool bitmap_set_bit (bitmap, int);
Richard Kenner committed
144 145

/* Return true if a register is set in a register set.  */
146
extern int bitmap_bit_p (bitmap, int);
Richard Kenner committed
147 148

/* Debug functions to print a bitmap linked list.  */
149 150
extern void debug_bitmap (const_bitmap);
extern void debug_bitmap_file (FILE *, const_bitmap);
Richard Kenner committed
151

152
/* Print a bitmap.  */
153
extern void bitmap_print (FILE *, const_bitmap, const char *, const char *);
154

155
/* Initialize and release a bitmap obstack.  */
156 157
extern void bitmap_obstack_initialize (bitmap_obstack *);
extern void bitmap_obstack_release (bitmap_obstack *);
158 159
extern void bitmap_register (bitmap MEM_STAT_DECL);
extern void dump_bitmap_statistics (void);
Richard Kenner committed
160

161 162 163 164
/* Initialize a bitmap header.  OBSTACK indicates the bitmap obstack
   to allocate from, NULL for GC'd bitmap.  */

static inline void
165
bitmap_initialize_stat (bitmap head, bitmap_obstack *obstack MEM_STAT_DECL)
166 167 168
{
  head->first = head->current = NULL;
  head->obstack = obstack;
169 170 171
#ifdef GATHER_STATISTICS
  bitmap_register (head PASS_MEM_STAT);
#endif
172
}
173
#define bitmap_initialize(h,o) bitmap_initialize_stat (h,o MEM_STAT_INFO)
174 175

/* Allocate and free bitmaps from obstack, malloc and gc'd memory.  */
176 177 178 179
extern bitmap bitmap_obstack_alloc_stat (bitmap_obstack *obstack MEM_STAT_DECL);
#define bitmap_obstack_alloc(t) bitmap_obstack_alloc_stat (t MEM_STAT_INFO)
extern bitmap bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL);
#define bitmap_gc_alloc() bitmap_gc_alloc_stat (ALONE_MEM_STAT_INFO)
180
extern void bitmap_obstack_free (bitmap);
Richard Kenner committed
181

182 183 184
/* A few compatibility/functions macros for compatibility with sbitmaps */
#define dump_bitmap(file, bitmap) bitmap_print (file, bitmap, "", "\n")
#define bitmap_zero(a) bitmap_clear (a)
185
extern unsigned bitmap_first_set_bit (const_bitmap);
186
extern unsigned bitmap_last_set_bit (const_bitmap);
187

188
/* Compute bitmap hash (for purposes of hashing etc.)  */
189
extern hashval_t bitmap_hash(const_bitmap);
190

191
/* Allocate a bitmap from a bit obstack.  */
192
#define BITMAP_ALLOC(OBSTACK) bitmap_obstack_alloc (OBSTACK)
193

194 195
/* Allocate a gc'd bitmap.  */
#define BITMAP_GGC_ALLOC() bitmap_gc_alloc ()
Kazu Hirata committed
196

Richard Kenner committed
197
/* Do any cleanup needed on a bitmap when it is no longer used.  */
198 199
#define BITMAP_FREE(BITMAP) \
       ((void) (bitmap_obstack_free ((bitmap) BITMAP), (BITMAP) = (bitmap) NULL))
200

201
/* Iterator for bitmaps.  */
Richard Kenner committed
202

203 204
typedef struct
{
205 206
  /* Pointer to the current bitmap element.  */
  bitmap_element *elt1;
Mike Stump committed
207

208 209 210 211 212
  /* Pointer to 2nd bitmap element when two are involved.  */
  bitmap_element *elt2;

  /* Word within the current element.  */
  unsigned word_no;
Mike Stump committed
213

214 215 216
  /* Contents of the actually processed word.  When finding next bit
     it is shifted right, so that the actual bit is always the least
     significant bit of ACTUAL.  */
217
  BITMAP_WORD bits;
218 219
} bitmap_iterator;

220 221
/* Initialize a single bitmap iterator.  START_BIT is the first bit to
   iterate from.  */
222

223
static inline void
224
bmp_iter_set_init (bitmap_iterator *bi, const_bitmap map,
225
		   unsigned start_bit, unsigned *bit_no)
226
{
227 228 229 230 231
  bi->elt1 = map->first;
  bi->elt2 = NULL;

  /* Advance elt1 until it is not before the block containing start_bit.  */
  while (1)
232
    {
233 234 235 236 237
      if (!bi->elt1)
	{
	  bi->elt1 = &bitmap_zero_bits;
	  break;
	}
Mike Stump committed
238

239 240 241
      if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
	break;
      bi->elt1 = bi->elt1->next;
242 243
    }

244 245 246
  /* We might have gone past the start bit, so reinitialize it.  */
  if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
    start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
Mike Stump committed
247

248 249 250 251 252 253 254 255 256 257
  /* Initialize for what is now start_bit.  */
  bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
  bi->bits = bi->elt1->bits[bi->word_no];
  bi->bits >>= start_bit % BITMAP_WORD_BITS;

  /* If this word is zero, we must make sure we're not pointing at the
     first bit, otherwise our incrementing to the next word boundary
     will fail.  It won't matter if this increment moves us into the
     next word.  */
  start_bit += !bi->bits;
Mike Stump committed
258

259
  *bit_no = start_bit;
260 261
}

262 263
/* Initialize an iterator to iterate over the intersection of two
   bitmaps.  START_BIT is the bit to commence from.  */
264

265
static inline void
266
bmp_iter_and_init (bitmap_iterator *bi, const_bitmap map1, const_bitmap map2,
267
		   unsigned start_bit, unsigned *bit_no)
268
{
269 270
  bi->elt1 = map1->first;
  bi->elt2 = map2->first;
271

272 273
  /* Advance elt1 until it is not before the block containing
     start_bit.  */
274 275
  while (1)
    {
276
      if (!bi->elt1)
277
	{
278 279
	  bi->elt2 = NULL;
	  break;
280
	}
Mike Stump committed
281

282 283 284
      if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
	break;
      bi->elt1 = bi->elt1->next;
285
    }
Mike Stump committed
286

287 288
  /* Advance elt2 until it is not before elt1.  */
  while (1)
289
    {
290 291 292 293 294
      if (!bi->elt2)
	{
	  bi->elt1 = bi->elt2 = &bitmap_zero_bits;
	  break;
	}
Mike Stump committed
295

296 297 298
      if (bi->elt2->indx >= bi->elt1->indx)
	break;
      bi->elt2 = bi->elt2->next;
299 300
    }

301
  /* If we're at the same index, then we have some intersecting bits.  */
302
  if (bi->elt1->indx == bi->elt2->indx)
303
    {
304
      /* We might have advanced beyond the start_bit, so reinitialize
Mike Stump committed
305
	 for that.  */
306 307
      if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
	start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
Mike Stump committed
308

309 310 311
      bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
      bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
      bi->bits >>= start_bit % BITMAP_WORD_BITS;
312 313 314
    }
  else
    {
315 316 317 318
      /* Otherwise we must immediately advance elt1, so initialize for
	 that.  */
      bi->word_no = BITMAP_ELEMENT_WORDS - 1;
      bi->bits = 0;
319
    }
Mike Stump committed
320

321 322 323 324 325
  /* If this word is zero, we must make sure we're not pointing at the
     first bit, otherwise our incrementing to the next word boundary
     will fail.  It won't matter if this increment moves us into the
     next word.  */
  start_bit += !bi->bits;
Mike Stump committed
326

327
  *bit_no = start_bit;
328 329
}

330 331
/* Initialize an iterator to iterate over the bits in MAP1 & ~MAP2.
   */
332

333
static inline void
334
bmp_iter_and_compl_init (bitmap_iterator *bi, const_bitmap map1, const_bitmap map2,
335
			 unsigned start_bit, unsigned *bit_no)
336
{
337 338
  bi->elt1 = map1->first;
  bi->elt2 = map2->first;
339

340
  /* Advance elt1 until it is not before the block containing start_bit.  */
341 342
  while (1)
    {
343
      if (!bi->elt1)
344
	{
345 346
	  bi->elt1 = &bitmap_zero_bits;
	  break;
347
	}
Mike Stump committed
348

349 350 351
      if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
	break;
      bi->elt1 = bi->elt1->next;
352
    }
353 354 355 356 357 358 359 360 361

  /* Advance elt2 until it is not before elt1.  */
  while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
    bi->elt2 = bi->elt2->next;

  /* We might have advanced beyond the start_bit, so reinitialize for
     that.  */
  if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
    start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
Mike Stump committed
362

363 364 365 366 367
  bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
  bi->bits = bi->elt1->bits[bi->word_no];
  if (bi->elt2 && bi->elt1->indx == bi->elt2->indx)
    bi->bits &= ~bi->elt2->bits[bi->word_no];
  bi->bits >>= start_bit % BITMAP_WORD_BITS;
Mike Stump committed
368

369 370 371 372 373
  /* If this word is zero, we must make sure we're not pointing at the
     first bit, otherwise our incrementing to the next word boundary
     will fail.  It won't matter if this increment moves us into the
     next word.  */
  start_bit += !bi->bits;
Mike Stump committed
374

375
  *bit_no = start_bit;
376 377
}

378
/* Advance to the next bit in BI.  We don't advance to the next
379
   nonzero bit yet.  */
380

381 382
static inline void
bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no)
383
{
384 385 386
  bi->bits >>= 1;
  *bit_no += 1;
}
387

388
/* Advance to the next nonzero bit of a single bitmap, we will have
389 390
   already advanced past the just iterated bit.  Return true if there
   is a bit to iterate.  */
391

392 393 394
static inline bool
bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no)
{
395
  /* If our current word is nonzero, it contains the bit we want.  */
396
  if (bi->bits)
397
    {
398 399 400 401 402 403 404
    next_bit:
      while (!(bi->bits & 1))
	{
	  bi->bits >>= 1;
	  *bit_no += 1;
	}
      return true;
405 406
    }

407 408 409 410 411 412
  /* Round up to the word boundary.  We might have just iterated past
     the end of the last word, hence the -1.  It is not possible for
     bit_no to point at the beginning of the now last word.  */
  *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
	     / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
  bi->word_no++;
413

414
  while (1)
415
    {
416
      /* Find the next nonzero word in this elt.  */
417 418 419 420 421 422 423 424
      while (bi->word_no != BITMAP_ELEMENT_WORDS)
	{
	  bi->bits = bi->elt1->bits[bi->word_no];
	  if (bi->bits)
	    goto next_bit;
	  *bit_no += BITMAP_WORD_BITS;
	  bi->word_no++;
	}
Mike Stump committed
425

426 427 428 429 430 431
      /* Advance to the next element.  */
      bi->elt1 = bi->elt1->next;
      if (!bi->elt1)
	return false;
      *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
      bi->word_no = 0;
432 433 434
    }
}

435 436
/* Advance to the next nonzero bit of an intersecting pair of
   bitmaps.  We will have already advanced past the just iterated bit.
437
   Return true if there is a bit to iterate.  */
438

439 440
static inline bool
bmp_iter_and (bitmap_iterator *bi, unsigned *bit_no)
441
{
442
  /* If our current word is nonzero, it contains the bit we want.  */
443 444 445 446 447 448 449 450 451 452
  if (bi->bits)
    {
    next_bit:
      while (!(bi->bits & 1))
	{
	  bi->bits >>= 1;
	  *bit_no += 1;
	}
      return true;
    }
453

454 455 456 457 458 459
  /* Round up to the word boundary.  We might have just iterated past
     the end of the last word, hence the -1.  It is not possible for
     bit_no to point at the beginning of the now last word.  */
  *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
	     / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
  bi->word_no++;
Mike Stump committed
460

461 462
  while (1)
    {
463
      /* Find the next nonzero word in this elt.  */
464
      while (bi->word_no != BITMAP_ELEMENT_WORDS)
465
	{
466 467 468 469 470
	  bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
	  if (bi->bits)
	    goto next_bit;
	  *bit_no += BITMAP_WORD_BITS;
	  bi->word_no++;
471
	}
Mike Stump committed
472

473
      /* Advance to the next identical element.  */
474 475
      do
	{
476 477 478
	  /* Advance elt1 while it is less than elt2.  We always want
	     to advance one elt.  */
	  do
479
	    {
480 481 482 483 484
	      bi->elt1 = bi->elt1->next;
	      if (!bi->elt1)
		return false;
	    }
	  while (bi->elt1->indx < bi->elt2->indx);
Mike Stump committed
485

486 487 488 489 490 491 492
	  /* Advance elt2 to be no less than elt1.  This might not
	     advance.  */
	  while (bi->elt2->indx < bi->elt1->indx)
	    {
	      bi->elt2 = bi->elt2->next;
	      if (!bi->elt2)
		return false;
493 494
	    }
	}
495
      while (bi->elt1->indx != bi->elt2->indx);
Mike Stump committed
496

497 498
      *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
      bi->word_no = 0;
499 500 501
    }
}

502
/* Advance to the next nonzero bit in the intersection of
503 504
   complemented bitmaps.  We will have already advanced past the just
   iterated bit.  */
505

506 507
static inline bool
bmp_iter_and_compl (bitmap_iterator *bi, unsigned *bit_no)
508
{
509
  /* If our current word is nonzero, it contains the bit we want.  */
510
  if (bi->bits)
511
    {
512 513
    next_bit:
      while (!(bi->bits & 1))
514
	{
515 516
	  bi->bits >>= 1;
	  *bit_no += 1;
517
	}
518
      return true;
519 520
    }

521 522 523 524 525 526
  /* Round up to the word boundary.  We might have just iterated past
     the end of the last word, hence the -1.  It is not possible for
     bit_no to point at the beginning of the now last word.  */
  *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
	     / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
  bi->word_no++;
527

528
  while (1)
529
    {
530
      /* Find the next nonzero word in this elt.  */
531 532 533 534 535 536 537 538 539 540
      while (bi->word_no != BITMAP_ELEMENT_WORDS)
	{
	  bi->bits = bi->elt1->bits[bi->word_no];
	  if (bi->elt2 && bi->elt2->indx == bi->elt1->indx)
	    bi->bits &= ~bi->elt2->bits[bi->word_no];
	  if (bi->bits)
	    goto next_bit;
	  *bit_no += BITMAP_WORD_BITS;
	  bi->word_no++;
	}
Mike Stump committed
541

542 543 544 545 546 547 548 549
      /* Advance to the next element of elt1.  */
      bi->elt1 = bi->elt1->next;
      if (!bi->elt1)
	return false;

      /* Advance elt2 until it is no less than elt1.  */
      while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
	bi->elt2 = bi->elt2->next;
Mike Stump committed
550

551 552
      *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
      bi->word_no = 0;
553 554 555
    }
}

556 557 558 559
/* Loop over all bits set in BITMAP, starting with MIN and setting
   BITNUM to the bit number.  ITER is a bitmap iterator.  BITNUM
   should be treated as a read-only variable as it contains loop
   state.  */
560

561 562 563 564 565 566 567 568 569 570 571
#define EXECUTE_IF_SET_IN_BITMAP(BITMAP, MIN, BITNUM, ITER)		\
  for (bmp_iter_set_init (&(ITER), (BITMAP), (MIN), &(BITNUM));		\
       bmp_iter_set (&(ITER), &(BITNUM));				\
       bmp_iter_next (&(ITER), &(BITNUM)))

/* Loop over all the bits set in BITMAP1 & BITMAP2, starting with MIN
   and setting BITNUM to the bit number.  ITER is a bitmap iterator.
   BITNUM should be treated as a read-only variable as it contains
   loop state.  */

#define EXECUTE_IF_AND_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER)	\
Mike Stump committed
572
  for (bmp_iter_and_init (&(ITER), (BITMAP1), (BITMAP2), (MIN),		\
573 574 575 576 577 578 579 580 581 582 583
			  &(BITNUM));					\
       bmp_iter_and (&(ITER), &(BITNUM));				\
       bmp_iter_next (&(ITER), &(BITNUM)))

/* Loop over all the bits set in BITMAP1 & ~BITMAP2, starting with MIN
   and setting BITNUM to the bit number.  ITER is a bitmap iterator.
   BITNUM should be treated as a read-only variable as it contains
   loop state.  */

#define EXECUTE_IF_AND_COMPL_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER) \
  for (bmp_iter_and_compl_init (&(ITER), (BITMAP1), (BITMAP2), (MIN),	\
Mike Stump committed
584
				&(BITNUM));				\
585 586
       bmp_iter_and_compl (&(ITER), &(BITNUM));				\
       bmp_iter_next (&(ITER), &(BITNUM)))
587

588
#endif /* GCC_BITMAP_H */