2 Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 #include "coretypes.h"
27 #include "hard-reg-set.h"
29 #include "basic-block.h"
31 /* Bitmap manipulation routines. */
33 /* Allocate a simple bitmap of N_ELMS bits. */
36 sbitmap_alloc (unsigned int n_elms
)
38 unsigned int bytes
, size
, amt
;
41 size
= SBITMAP_SET_SIZE (n_elms
);
42 bytes
= size
* sizeof (SBITMAP_ELT_TYPE
);
43 amt
= (sizeof (struct simple_bitmap_def
)
44 + bytes
- sizeof (SBITMAP_ELT_TYPE
));
46 bmap
->n_bits
= n_elms
;
52 /* Resize a simple bitmap BMAP to N_ELMS bits. If increasing the
53 size of BMAP, clear the new bits to zero if the DEF argument
54 is zero, and set them to one otherwise. */
57 sbitmap_resize (sbitmap bmap
, unsigned int n_elms
, int def
)
59 unsigned int bytes
, size
, amt
;
60 unsigned int last_bit
;
62 size
= SBITMAP_SET_SIZE (n_elms
);
63 bytes
= size
* sizeof (SBITMAP_ELT_TYPE
);
64 if (bytes
> bmap
->bytes
)
66 amt
= (sizeof (struct simple_bitmap_def
)
67 + bytes
- sizeof (SBITMAP_ELT_TYPE
));
68 bmap
= xrealloc (bmap
, amt
);
71 if (n_elms
> bmap
->n_bits
)
75 memset (bmap
->elms
+ bmap
->size
, -1, bytes
- bmap
->bytes
);
77 /* Set the new bits if the original last element. */
78 last_bit
= bmap
->n_bits
% SBITMAP_ELT_BITS
;
80 bmap
->elms
[bmap
->size
- 1]
81 |= ~((SBITMAP_ELT_TYPE
)-1 >> (SBITMAP_ELT_BITS
- last_bit
));
83 /* Clear the unused bit in the new last element. */
84 last_bit
= n_elms
% SBITMAP_ELT_BITS
;
87 &= (SBITMAP_ELT_TYPE
)-1 >> (SBITMAP_ELT_BITS
- last_bit
);
90 memset (bmap
->elms
+ bmap
->size
, 0, bytes
- bmap
->bytes
);
92 else if (n_elms
< bmap
->n_bits
)
94 /* Clear the surplus bits in the last word. */
95 last_bit
= n_elms
% SBITMAP_ELT_BITS
;
98 &= (SBITMAP_ELT_TYPE
)-1 >> (SBITMAP_ELT_BITS
- last_bit
);
101 bmap
->n_bits
= n_elms
;
107 /* Re-allocate a simple bitmap of N_ELMS bits. New storage is uninitialized. */
110 sbitmap_realloc (sbitmap src
, unsigned int n_elms
)
112 unsigned int bytes
, size
, amt
;
115 size
= SBITMAP_SET_SIZE (n_elms
);
116 bytes
= size
* sizeof (SBITMAP_ELT_TYPE
);
117 amt
= (sizeof (struct simple_bitmap_def
)
118 + bytes
- sizeof (SBITMAP_ELT_TYPE
));
120 if (src
->bytes
>= bytes
)
122 src
->n_bits
= n_elms
;
126 bmap
= (sbitmap
) xrealloc (src
, amt
);
127 bmap
->n_bits
= n_elms
;
133 /* Allocate a vector of N_VECS bitmaps of N_ELMS bits. */
136 sbitmap_vector_alloc (unsigned int n_vecs
, unsigned int n_elms
)
138 unsigned int i
, bytes
, offset
, elm_bytes
, size
, amt
, vector_bytes
;
139 sbitmap
*bitmap_vector
;
141 size
= SBITMAP_SET_SIZE (n_elms
);
142 bytes
= size
* sizeof (SBITMAP_ELT_TYPE
);
143 elm_bytes
= (sizeof (struct simple_bitmap_def
)
144 + bytes
- sizeof (SBITMAP_ELT_TYPE
));
145 vector_bytes
= n_vecs
* sizeof (sbitmap
*);
147 /* Round up `vector_bytes' to account for the alignment requirements
148 of an sbitmap. One could allocate the vector-table and set of sbitmaps
149 separately, but that requires maintaining two pointers or creating
150 a cover struct to hold both pointers (so our result is still just
151 one pointer). Neither is a bad idea, but this is simpler for now. */
153 /* Based on DEFAULT_ALIGNMENT computation in obstack.c. */
154 struct { char x
; SBITMAP_ELT_TYPE y
; } align
;
155 int alignment
= (char *) & align
.y
- & align
.x
;
156 vector_bytes
= (vector_bytes
+ alignment
- 1) & ~ (alignment
- 1);
159 amt
= vector_bytes
+ (n_vecs
* elm_bytes
);
160 bitmap_vector
= xmalloc (amt
);
162 for (i
= 0, offset
= vector_bytes
; i
< n_vecs
; i
++, offset
+= elm_bytes
)
164 sbitmap b
= (sbitmap
) ((char *) bitmap_vector
+ offset
);
166 bitmap_vector
[i
] = b
;
172 return bitmap_vector
;
175 /* Copy sbitmap SRC to DST. */
178 sbitmap_copy (sbitmap dst
, sbitmap src
)
180 memcpy (dst
->elms
, src
->elms
, sizeof (SBITMAP_ELT_TYPE
) * dst
->size
);
183 /* Determine if a == b. */
185 sbitmap_equal (sbitmap a
, sbitmap b
)
187 return !memcmp (a
->elms
, b
->elms
, sizeof (SBITMAP_ELT_TYPE
) * a
->size
);
190 /* Zero all elements in a bitmap. */
193 sbitmap_zero (sbitmap bmap
)
195 memset (bmap
->elms
, 0, bmap
->bytes
);
198 /* Set all elements in a bitmap to ones. */
201 sbitmap_ones (sbitmap bmap
)
203 unsigned int last_bit
;
205 memset (bmap
->elms
, -1, bmap
->bytes
);
207 last_bit
= bmap
->n_bits
% SBITMAP_ELT_BITS
;
209 bmap
->elms
[bmap
->size
- 1]
210 = (SBITMAP_ELT_TYPE
)-1 >> (SBITMAP_ELT_BITS
- last_bit
);
213 /* Zero a vector of N_VECS bitmaps. */
216 sbitmap_vector_zero (sbitmap
*bmap
, unsigned int n_vecs
)
220 for (i
= 0; i
< n_vecs
; i
++)
221 sbitmap_zero (bmap
[i
]);
224 /* Set a vector of N_VECS bitmaps to ones. */
227 sbitmap_vector_ones (sbitmap
*bmap
, unsigned int n_vecs
)
231 for (i
= 0; i
< n_vecs
; i
++)
232 sbitmap_ones (bmap
[i
]);
235 /* Set DST to be A union (B - C).
237 Returns true if any change is made. */
240 sbitmap_union_of_diff_cg (sbitmap dst
, sbitmap a
, sbitmap b
, sbitmap c
)
242 unsigned int i
, n
= dst
->size
;
243 sbitmap_ptr dstp
= dst
->elms
;
244 sbitmap_ptr ap
= a
->elms
;
245 sbitmap_ptr bp
= b
->elms
;
246 sbitmap_ptr cp
= c
->elms
;
247 SBITMAP_ELT_TYPE changed
= 0;
249 for (i
= 0; i
< n
; i
++)
251 SBITMAP_ELT_TYPE tmp
= *ap
++ | (*bp
++ & ~*cp
++);
252 changed
|= *dstp
^ tmp
;
260 sbitmap_union_of_diff (sbitmap dst
, sbitmap a
, sbitmap b
, sbitmap c
)
262 unsigned int i
, n
= dst
->size
;
263 sbitmap_ptr dstp
= dst
->elms
;
264 sbitmap_ptr ap
= a
->elms
;
265 sbitmap_ptr bp
= b
->elms
;
266 sbitmap_ptr cp
= c
->elms
;
268 for (i
= 0; i
< n
; i
++)
269 *dstp
++ = *ap
++ | (*bp
++ & ~*cp
++);
272 /* Set bitmap DST to the bitwise negation of the bitmap SRC. */
275 sbitmap_not (sbitmap dst
, sbitmap src
)
277 unsigned int i
, n
= dst
->size
;
278 sbitmap_ptr dstp
= dst
->elms
;
279 sbitmap_ptr srcp
= src
->elms
;
280 unsigned int last_bit
;
282 for (i
= 0; i
< n
; i
++)
285 /* Zero all bits past n_bits, by ANDing dst with sbitmap_ones. */
286 last_bit
= src
->n_bits
% SBITMAP_ELT_BITS
;
288 dst
->elms
[n
-1] = dst
->elms
[n
-1]
289 & ((SBITMAP_ELT_TYPE
)-1 >> (SBITMAP_ELT_BITS
- last_bit
));
292 /* Set the bits in DST to be the difference between the bits
293 in A and the bits in B. i.e. dst = a & (~b). */
296 sbitmap_difference (sbitmap dst
, sbitmap a
, sbitmap b
)
298 unsigned int i
, dst_size
= dst
->size
;
299 unsigned int min_size
= dst
->size
;
300 sbitmap_ptr dstp
= dst
->elms
;
301 sbitmap_ptr ap
= a
->elms
;
302 sbitmap_ptr bp
= b
->elms
;
304 /* A should be at least as large as DEST, to have a defined source. */
305 gcc_assert (a
->size
>= dst_size
);
306 /* If minuend is smaller, we simply pretend it to be zero bits, i.e.
307 only copy the subtrahend into dest. */
308 if (b
->size
< min_size
)
310 for (i
= 0; i
< min_size
; i
++)
311 *dstp
++ = *ap
++ & (~*bp
++);
312 /* Now fill the rest of dest from A, if B was too short.
313 This makes sense only when destination and A differ. */
314 if (dst
!= a
&& i
!= dst_size
)
315 for (; i
< dst_size
; i
++)
319 /* Set DST to be (A and B).
320 Return nonzero if any change is made. */
323 sbitmap_a_and_b_cg (sbitmap dst
, sbitmap a
, sbitmap b
)
325 unsigned int i
, n
= dst
->size
;
326 sbitmap_ptr dstp
= dst
->elms
;
327 sbitmap_ptr ap
= a
->elms
;
328 sbitmap_ptr bp
= b
->elms
;
329 SBITMAP_ELT_TYPE changed
= 0;
331 for (i
= 0; i
< n
; i
++)
333 SBITMAP_ELT_TYPE tmp
= *ap
++ & *bp
++;
334 changed
|= *dstp
^ tmp
;
342 sbitmap_a_and_b (sbitmap dst
, sbitmap a
, sbitmap b
)
344 unsigned int i
, n
= dst
->size
;
345 sbitmap_ptr dstp
= dst
->elms
;
346 sbitmap_ptr ap
= a
->elms
;
347 sbitmap_ptr bp
= b
->elms
;
349 for (i
= 0; i
< n
; i
++)
350 *dstp
++ = *ap
++ & *bp
++;
353 /* Set DST to be (A xor B)).
354 Return nonzero if any change is made. */
357 sbitmap_a_xor_b_cg (sbitmap dst
, sbitmap a
, sbitmap b
)
359 unsigned int i
, n
= dst
->size
;
360 sbitmap_ptr dstp
= dst
->elms
;
361 sbitmap_ptr ap
= a
->elms
;
362 sbitmap_ptr bp
= b
->elms
;
363 SBITMAP_ELT_TYPE changed
= 0;
365 for (i
= 0; i
< n
; i
++)
367 SBITMAP_ELT_TYPE tmp
= *ap
++ ^ *bp
++;
368 changed
|= *dstp
^ tmp
;
376 sbitmap_a_xor_b (sbitmap dst
, sbitmap a
, sbitmap b
)
378 unsigned int i
, n
= dst
->size
;
379 sbitmap_ptr dstp
= dst
->elms
;
380 sbitmap_ptr ap
= a
->elms
;
381 sbitmap_ptr bp
= b
->elms
;
383 for (i
= 0; i
< n
; i
++)
384 *dstp
++ = *ap
++ ^ *bp
++;
387 /* Set DST to be (A or B)).
388 Return nonzero if any change is made. */
391 sbitmap_a_or_b_cg (sbitmap dst
, sbitmap a
, sbitmap b
)
393 unsigned int i
, n
= dst
->size
;
394 sbitmap_ptr dstp
= dst
->elms
;
395 sbitmap_ptr ap
= a
->elms
;
396 sbitmap_ptr bp
= b
->elms
;
397 SBITMAP_ELT_TYPE changed
= 0;
399 for (i
= 0; i
< n
; i
++)
401 SBITMAP_ELT_TYPE tmp
= *ap
++ | *bp
++;
402 changed
|= *dstp
^ tmp
;
410 sbitmap_a_or_b (sbitmap dst
, sbitmap a
, sbitmap b
)
412 unsigned int i
, n
= dst
->size
;
413 sbitmap_ptr dstp
= dst
->elms
;
414 sbitmap_ptr ap
= a
->elms
;
415 sbitmap_ptr bp
= b
->elms
;
417 for (i
= 0; i
< n
; i
++)
418 *dstp
++ = *ap
++ | *bp
++;
421 /* Return nonzero if A is a subset of B. */
424 sbitmap_a_subset_b_p (sbitmap a
, sbitmap b
)
426 unsigned int i
, n
= a
->size
;
429 for (ap
= a
->elms
, bp
= b
->elms
, i
= 0; i
< n
; i
++, ap
++, bp
++)
430 if ((*ap
| *bp
) != *bp
)
436 /* Set DST to be (A or (B and C)).
437 Return nonzero if any change is made. */
440 sbitmap_a_or_b_and_c_cg (sbitmap dst
, sbitmap a
, sbitmap b
, sbitmap c
)
442 unsigned int i
, n
= dst
->size
;
443 sbitmap_ptr dstp
= dst
->elms
;
444 sbitmap_ptr ap
= a
->elms
;
445 sbitmap_ptr bp
= b
->elms
;
446 sbitmap_ptr cp
= c
->elms
;
447 SBITMAP_ELT_TYPE changed
= 0;
449 for (i
= 0; i
< n
; i
++)
451 SBITMAP_ELT_TYPE tmp
= *ap
++ | (*bp
++ & *cp
++);
452 changed
|= *dstp
^ tmp
;
460 sbitmap_a_or_b_and_c (sbitmap dst
, sbitmap a
, sbitmap b
, sbitmap c
)
462 unsigned int i
, n
= dst
->size
;
463 sbitmap_ptr dstp
= dst
->elms
;
464 sbitmap_ptr ap
= a
->elms
;
465 sbitmap_ptr bp
= b
->elms
;
466 sbitmap_ptr cp
= c
->elms
;
468 for (i
= 0; i
< n
; i
++)
469 *dstp
++ = *ap
++ | (*bp
++ & *cp
++);
472 /* Set DST to be (A and (B or C)).
473 Return nonzero if any change is made. */
476 sbitmap_a_and_b_or_c_cg (sbitmap dst
, sbitmap a
, sbitmap b
, sbitmap c
)
478 unsigned int i
, n
= dst
->size
;
479 sbitmap_ptr dstp
= dst
->elms
;
480 sbitmap_ptr ap
= a
->elms
;
481 sbitmap_ptr bp
= b
->elms
;
482 sbitmap_ptr cp
= c
->elms
;
483 SBITMAP_ELT_TYPE changed
= 0;
485 for (i
= 0; i
< n
; i
++)
487 SBITMAP_ELT_TYPE tmp
= *ap
++ & (*bp
++ | *cp
++);
488 changed
|= *dstp
^ tmp
;
496 sbitmap_a_and_b_or_c (sbitmap dst
, sbitmap a
, sbitmap b
, sbitmap c
)
498 unsigned int i
, n
= dst
->size
;
499 sbitmap_ptr dstp
= dst
->elms
;
500 sbitmap_ptr ap
= a
->elms
;
501 sbitmap_ptr bp
= b
->elms
;
502 sbitmap_ptr cp
= c
->elms
;
504 for (i
= 0; i
< n
; i
++)
505 *dstp
++ = *ap
++ & (*bp
++ | *cp
++);
509 /* Set the bitmap DST to the intersection of SRC of successors of
510 block number BB, using the new flow graph structures. */
513 sbitmap_intersection_of_succs (sbitmap dst
, sbitmap
*src
, int bb
)
515 basic_block b
= BASIC_BLOCK (bb
);
516 unsigned int set_size
= dst
->size
;
520 for (e
= NULL
, ix
= 0; ix
< EDGE_COUNT (b
->succs
); ix
++)
522 e
= EDGE_SUCC (b
, ix
);
523 if (e
->dest
== EXIT_BLOCK_PTR
)
526 sbitmap_copy (dst
, src
[e
->dest
->index
]);
533 for (++ix
; ix
< EDGE_COUNT (b
->succs
); ix
++)
538 e
= EDGE_SUCC (b
, ix
);
539 if (e
->dest
== EXIT_BLOCK_PTR
)
542 p
= src
[e
->dest
->index
]->elms
;
544 for (i
= 0; i
< set_size
; i
++)
549 /* Set the bitmap DST to the intersection of SRC of predecessors of
550 block number BB, using the new flow graph structures. */
553 sbitmap_intersection_of_preds (sbitmap dst
, sbitmap
*src
, int bb
)
555 basic_block b
= BASIC_BLOCK (bb
);
556 unsigned int set_size
= dst
->size
;
560 for (e
= NULL
, ix
= 0; ix
< EDGE_COUNT (b
->preds
); ix
++)
562 e
= EDGE_PRED (b
, ix
);
563 if (e
->src
== ENTRY_BLOCK_PTR
)
566 sbitmap_copy (dst
, src
[e
->src
->index
]);
573 for (++ix
; ix
< EDGE_COUNT (b
->preds
); ix
++)
578 e
= EDGE_PRED (b
, ix
);
579 if (e
->src
== ENTRY_BLOCK_PTR
)
582 p
= src
[e
->src
->index
]->elms
;
584 for (i
= 0; i
< set_size
; i
++)
589 /* Set the bitmap DST to the union of SRC of successors of
590 block number BB, using the new flow graph structures. */
593 sbitmap_union_of_succs (sbitmap dst
, sbitmap
*src
, int bb
)
595 basic_block b
= BASIC_BLOCK (bb
);
596 unsigned int set_size
= dst
->size
;
600 for (ix
= 0; ix
< EDGE_COUNT (b
->succs
); ix
++)
602 e
= EDGE_SUCC (b
, ix
);
603 if (e
->dest
== EXIT_BLOCK_PTR
)
606 sbitmap_copy (dst
, src
[e
->dest
->index
]);
610 if (ix
== EDGE_COUNT (b
->succs
))
613 for (ix
++; ix
< EDGE_COUNT (b
->succs
); ix
++)
618 e
= EDGE_SUCC (b
, ix
);
619 if (e
->dest
== EXIT_BLOCK_PTR
)
622 p
= src
[e
->dest
->index
]->elms
;
624 for (i
= 0; i
< set_size
; i
++)
629 /* Set the bitmap DST to the union of SRC of predecessors of
630 block number BB, using the new flow graph structures. */
633 sbitmap_union_of_preds (sbitmap dst
, sbitmap
*src
, int bb
)
635 basic_block b
= BASIC_BLOCK (bb
);
636 unsigned int set_size
= dst
->size
;
640 for (ix
= 0; ix
< EDGE_COUNT (b
->preds
); ix
++)
642 e
= EDGE_PRED (b
, ix
);
643 if (e
->src
== ENTRY_BLOCK_PTR
)
646 sbitmap_copy (dst
, src
[e
->src
->index
]);
650 if (ix
== EDGE_COUNT (b
->preds
))
653 for (ix
++; ix
< EDGE_COUNT (b
->preds
); ix
++)
658 e
= EDGE_PRED (b
, ix
);
659 if (e
->src
== ENTRY_BLOCK_PTR
)
662 p
= src
[e
->src
->index
]->elms
;
664 for (i
= 0; i
< set_size
; i
++)
670 /* Return number of first bit set in the bitmap, -1 if none. */
673 sbitmap_first_set_bit (sbitmap bmap
)
677 EXECUTE_IF_SET_IN_SBITMAP (bmap
, 0, n
, { return n
; });
681 /* Return number of last bit set in the bitmap, -1 if none. */
684 sbitmap_last_set_bit (sbitmap bmap
)
687 SBITMAP_ELT_TYPE
*ptr
= bmap
->elms
;
689 for (i
= bmap
->size
- 1; i
>= 0; i
--)
691 SBITMAP_ELT_TYPE word
= ptr
[i
];
695 unsigned int index
= (i
+ 1) * SBITMAP_ELT_BITS
- 1;
696 SBITMAP_ELT_TYPE mask
697 = (SBITMAP_ELT_TYPE
) 1 << (SBITMAP_ELT_BITS
- 1);
701 if ((word
& mask
) != 0)
714 dump_sbitmap (FILE *file
, sbitmap bmap
)
716 unsigned int i
, n
, j
;
717 unsigned int set_size
= bmap
->size
;
718 unsigned int total_bits
= bmap
->n_bits
;
721 for (i
= n
= 0; i
< set_size
&& n
< total_bits
; i
++)
722 for (j
= 0; j
< SBITMAP_ELT_BITS
&& n
< total_bits
; j
++, n
++)
724 if (n
!= 0 && n
% 10 == 0)
728 (bmap
->elms
[i
] & ((SBITMAP_ELT_TYPE
) 1 << j
)) != 0);
731 fprintf (file
, "\n");
735 dump_sbitmap_file (FILE *file
, sbitmap bmap
)
739 fprintf (file
, "n_bits = %d, set = {", bmap
->n_bits
);
741 for (pos
= 30, i
= 0; i
< bmap
->n_bits
; i
++)
742 if (TEST_BIT (bmap
, i
))
746 fprintf (file
, "\n ");
750 fprintf (file
, "%d ", i
);
751 pos
+= 2 + (i
>= 10) + (i
>= 100) + (i
>= 1000);
754 fprintf (file
, "}\n");
758 debug_sbitmap (sbitmap bmap
)
760 dump_sbitmap_file (stderr
, bmap
);
764 dump_sbitmap_vector (FILE *file
, const char *title
, const char *subtitle
,
765 sbitmap
*bmaps
, int n_maps
)
769 fprintf (file
, "%s\n", title
);
770 for (bb
= 0; bb
< n_maps
; bb
++)
772 fprintf (file
, "%s %d\n", subtitle
, bb
);
773 dump_sbitmap (file
, bmaps
[bb
]);
776 fprintf (file
, "\n");