/* Return the bit number of the first set bit in the bitmap. The
- bitmap must be non-empty. */
+ bitmap must be non-empty. When CLEAR is true it clears the bit. */
-unsigned
-bitmap_first_set_bit (const_bitmap a)
+static unsigned
+bitmap_first_set_bit_worker (bitmap a, bool clear)
{
- const bitmap_element *elt = a->first;
+ bitmap_element *elt = a->first;
unsigned bit_no;
BITMAP_WORD word;
unsigned ix;
gcc_checking_assert (word & 1);
#endif
+
+ if (clear)
+ {
+ elt->bits[ix] &= ~((BITMAP_WORD) 1 << (bit_no % BITMAP_WORD_BITS));
+ /* If we cleared the entire word, free up the element. */
+ if (!elt->bits[ix]
+ && bitmap_element_zerop (elt))
+ {
+ if (!a->tree_form)
+ bitmap_list_unlink_element (a, elt);
+ else
+ bitmap_tree_unlink_element (a, elt);
+ }
+ }
+
return bit_no;
}
+/* Return the bit number of the first set bit in the bitmap. The
+ bitmap must be non-empty. */
+
+unsigned
+bitmap_first_set_bit (const_bitmap a)
+{
+ return bitmap_first_set_bit_worker (const_cast<bitmap> (a), false);
+}
+
+/* Return and clear the bit number of the first set bit in the bitmap. The
+ bitmap must be non-empty. */
+
+unsigned
+bitmap_clear_first_set_bit (bitmap a)
+{
+ return bitmap_first_set_bit_worker (a, true);
+}
+
/* Return the bit number of the first set bit in the bitmap. The
bitmap must be non-empty. */
* clear : bitmap_clear
* smallest_member : bitmap_first_set_bit
+ * pop_smallest : bitmap_clear_first_set_bit
* choose_one : (not implemented, but could be
in constant time)
amortized time with O(E) worst-case behavior.
* smallest_member
+ * pop_smallest
* largest_member
* set_size
* member_p
extern void debug (const bitmap_head *ptr);
extern unsigned bitmap_first_set_bit (const_bitmap);
+extern unsigned bitmap_clear_first_set_bit (bitmap);
extern unsigned bitmap_last_set_bit (const_bitmap);
/* Compute bitmap hash (for purposes of hashing etc.) */
do
{
- unsigned index = bitmap_first_set_bit (worklist);
- bitmap_clear_bit (worklist, index);
+ unsigned index = bitmap_clear_first_set_bit (worklist);
unsigned bb_index;
dcount++;
its border it acts more like a visited bitmap. */
do
{
- int index = bitmap_first_set_bit (worklist);
- bitmap_clear_bit (worklist, index);
+ int index = bitmap_clear_first_set_bit (worklist);
basic_block bb = BASIC_BLOCK_FOR_FN (cfun, index);
edge_iterator ei;
edge e;
/* 2) Propagate the information to all reachable blocks. */
while (!bitmap_empty_p (worklist))
{
- unsigned i = bitmap_first_set_bit (worklist);
- bitmap_clear_bit (worklist, i);
+ unsigned i = bitmap_clear_first_set_bit (worklist);
basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
gcc_assert (bb);
/* 2) Propagate the information to all definitions blocks. */
while (!bitmap_empty_p (worklist))
{
- unsigned i = bitmap_first_set_bit (worklist);
- bitmap_clear_bit (worklist, i);
+ unsigned i = bitmap_clear_first_set_bit (worklist);
basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
gcc_assert (bb);
/* Now process the altered blocks, as long as any are available. */
while (!bitmap_empty_p (cfgcleanup_altered_bbs))
{
- unsigned i = bitmap_first_set_bit (cfgcleanup_altered_bbs);
- bitmap_clear_bit (cfgcleanup_altered_bbs, i);
+ unsigned i = bitmap_clear_first_set_bit (cfgcleanup_altered_bbs);
if (i < NUM_FIXED_BLOCKS)
continue;
}
while (!bitmap_empty_p (worklist))
{
- int idx = bitmap_first_set_bit (worklist);
- bitmap_clear_bit (worklist, idx);
+ int idx = bitmap_clear_first_set_bit (worklist);
basic_block bb = BASIC_BLOCK_FOR_FN (cfun, idx);
bb->flags |= in_region;
extra_rgn.safe_push (bb);
while (! bitmap_empty_p (worklist))
{
/* Pop item. */
- unsigned i = bitmap_first_set_bit (worklist);
- bitmap_clear_bit (worklist, i);
+ unsigned i = bitmap_clear_first_set_bit (worklist);
tree def = ssa_name (i);
/* Removed by somebody else or still in use. */
bitmap_set_bit (worklist, 0);
while (!bitmap_empty_p (worklist))
{
- int idx = bitmap_first_set_bit (worklist);
- bitmap_clear_bit (worklist, idx);
+ int idx = bitmap_clear_first_set_bit (worklist);
basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[idx]);
gcc_assert ((bb->flags & BB_EXECUTABLE)
&& !rpo_state[idx].visited);