GCC Middle and Back End API Reference
bitmap.h File Reference

Go to the source code of this file.

Data Structures

struct  bitmap_obstack
struct  bitmap_element_def
struct  bitmap_head_def
struct  bitmap_iterator

Typedefs

typedef unsigned long BITMAP_WORD
typedef struct bitmap_obstack bitmap_obstack
typedef struct bitmap_element_def bitmap_element
typedef struct bitmap_head_def bitmap_head

Functions

void bitmap_clear (bitmap)
void bitmap_copy (bitmap, const_bitmap)
bool bitmap_equal_p (const_bitmap, const_bitmap)
bool bitmap_intersect_p (const_bitmap, const_bitmap)
bool bitmap_intersect_compl_p (const_bitmap, const_bitmap)
bool bitmap_empty_p (const_bitmap map)
bool bitmap_single_bit_set_p (const_bitmap)
unsigned long bitmap_count_bits (const_bitmap)
void bitmap_and (bitmap, const_bitmap, const_bitmap)
bool bitmap_and_into (bitmap, const_bitmap)
bool bitmap_and_compl (bitmap, const_bitmap, const_bitmap)
bool bitmap_and_compl_into (bitmap, const_bitmap)
void bitmap_compl_and_into (bitmap, const_bitmap)
void bitmap_clear_range (bitmap, unsigned int, unsigned int)
void bitmap_set_range (bitmap, unsigned int, unsigned int)
bool bitmap_ior (bitmap, const_bitmap, const_bitmap)
bool bitmap_ior_into (bitmap, const_bitmap)
void bitmap_xor (bitmap, const_bitmap, const_bitmap)
void bitmap_xor_into (bitmap, const_bitmap)
bool bitmap_ior_and_into (bitmap DST, const_bitmap B, const_bitmap C)
bool bitmap_ior_and_compl (bitmap DST, const_bitmap A, const_bitmap B, const_bitmap C)
bool bitmap_ior_and_compl_into (bitmap A, const_bitmap B, const_bitmap C)
bool bitmap_clear_bit (bitmap, int)
bool bitmap_set_bit (bitmap, int)
int bitmap_bit_p (bitmap, int)
void debug_bitmap (const_bitmap)
void debug_bitmap_file (FILE *, const_bitmap)
void bitmap_print (FILE *, const_bitmap, const char *, const char *)
void bitmap_obstack_initialize (bitmap_obstack *)
void bitmap_obstack_release (bitmap_obstack *)
void bitmap_register (bitmap MEM_STAT_DECL)
void dump_bitmap_statistics (void)
static void bitmap_initialize_stat ()
bitmap bitmap_obstack_alloc_stat (bitmap_obstack *obstack MEM_STAT_DECL)
bitmap bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL)
void bitmap_obstack_free (bitmap)
void dump_bitmap (FILE *file, const_bitmap map)
void debug (const bitmap_head_def &ref)
void debug (const bitmap_head_def *ptr)
unsigned bitmap_first_set_bit (const_bitmap)
unsigned bitmap_last_set_bit (const_bitmap)
hashval_t bitmap_hash (const_bitmap)
static void bmp_iter_set_init (bitmap_iterator *bi, const_bitmap map, unsigned start_bit, unsigned *bit_no)
static void bmp_iter_and_init (bitmap_iterator *bi, const_bitmap map1, const_bitmap map2, unsigned start_bit, unsigned *bit_no)
static void bmp_iter_and_compl_init (bitmap_iterator *bi, const_bitmap map1, const_bitmap map2, unsigned start_bit, unsigned *bit_no)
static void bmp_iter_next ()
static void bmp_iter_next_bit ()
static bool bmp_iter_set ()
static bool bmp_iter_and ()
static bool bmp_iter_and_compl ()

Variables

bitmap_element bitmap_zero_bits
bitmap_obstack bitmap_default_obstack

Typedef Documentation

   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
   having to realloc and copy a giant bit array.

   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.  
typedef struct bitmap_head_def bitmap_head
   Head of bitmap linked list.  The 'current' member points to something
   already pointed to by the chain started by first, so it.  
   Obstack for allocating bitmaps and elements from.  
typedef unsigned long BITMAP_WORD
   Implementation of sparse integer sets as a linked list.

   This sparse set representation is suitable for sparse sets with an
   unknown (a priori) universe.  The set is represented as a double-linked
   list of container nodes (struct bitmap_element_def).  Each node consists
   of an index for the first member that could be held in the container,
   a small array of integers that represent the members in the container,
   and pointers to the next and previous element in the linked list.  The
   elements in the list are sorted in ascending order, i.e. the head of
   the list holds the element with the smallest member of the set.

   For a given member I in the set:
     - the element for I will have index is I / (bits per element)
     - the position for I within element is I % (bits per element)

   This representation is very space-efficient for large sparse sets, and
   the size of the set can be changed dynamically without much overhead.
   An important parameter is the number of bits per element.  In this
   implementation, there are 128 bits per element.  This results in a
   high storage overhead *per element*, but a small overall overhead if
   the set is very sparse.

   The downside is that many operations are relatively slow because the
   linked list has to be traversed to test membership (i.e. member_p/
   add_member/remove_member).  To improve the performance of this set
   representation, the last accessed element and its index are cached.
   For membership tests on members close to recently accessed members,
   the cached last element improves membership test to a constant-time
   operation.

   The following operations can always be performed in O(1) time:

     * clear                    : bitmap_clear
     * choose_one               : (not implemented, but could be
                                   implemented in constant time)

   The following operations can be performed in O(E) time worst-case (with
   E the number of elements in the linked list), but in O(1) time with a
   suitable access patterns:

     * member_p                 : bitmap_bit_p
     * add_member               : bitmap_set_bit
     * remove_member            : bitmap_clear_bit

   The following operations can be performed in O(E) time:

     * cardinality              : bitmap_count_bits
     * set_size                 : bitmap_last_set_bit (but this could
                                  in constant time with a pointer to
                                  the last element in the chain)

   Additionally, the linked-list sparse set representation supports
   enumeration of the members in O(E) time:

     * forall                   : EXECUTE_IF_SET_IN_BITMAP
     * set_copy                 : bitmap_copy
     * set_intersection         : bitmap_intersect_p /
                                  bitmap_and / bitmap_and_into /
                                  EXECUTE_IF_AND_IN_BITMAP
     * set_union                : bitmap_ior / bitmap_ior_into
     * set_difference           : bitmap_intersect_compl_p /
                                  bitmap_and_comp / bitmap_and_comp_into /
                                  EXECUTE_IF_AND_COMPL_IN_BITMAP
     * set_disjuction           : bitmap_xor_comp / bitmap_xor_comp_into
     * set_compare              : bitmap_equal_p

   Some operations on 3 sets that occur frequently in in data flow problems
   are also implemented:

     * A | (B & C)              : bitmap_ior_and_into
     * A | (B & ~C)             : bitmap_ior_and_compl /
                                  bitmap_ior_and_compl_into

   The storage requirements for linked-list sparse sets are O(E), with E->N
   in the worst case (a sparse set with large distances between the values
   of the set members).

   The linked-list set representation works well for problems involving very
   sparse sets.  The canonical example in GCC is, of course, the "set of
   sets" for some CFG-based data flow problems (liveness analysis, dominance
   frontiers, etc.).
   
   This representation also works well for data flow problems where the size
   of the set may grow dynamically, but care must be taken that the member_p,
   add_member, and remove_member operations occur with a suitable access
   pattern.
   
   For random-access sets with a known, relatively small universe size, the
   SparseSet or simple bitmap representations may be more efficient than a
   linked-list set.  For random-access sets of unknown universe, a hash table
   or a balanced binary tree representation is likely to be a more suitable
   choice.

   Traversing linked lists is usually cache-unfriendly, even with the last
   accessed element cached.
   
   Cache performance can be improved by keeping the elements in the set
   grouped together in memory, using a dedicated obstack for a set (or group
   of related sets).  Elements allocated on obstacks are released to a
   free-list and taken off the free list.  If multiple sets are allocated on
   the same obstack, elements freed from one set may be re-used for one of
   the other sets.  This usually helps avoid cache misses.

   A single free-list is used for all sets allocated in GGC space.  This is
   bad for persistent sets, so persistent sets should be allocated on an
   obstack whenever possible.  
   Fundamental storage type for bitmap.  

Function Documentation

void bitmap_and ( bitmap  ,
const_bitmap  ,
const_bitmap   
)
   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 &, & ~, |, ^.  
bool bitmap_and_compl ( bitmap  ,
const_bitmap  ,
const_bitmap   
)
bool bitmap_and_compl_into ( bitmap  ,
const_bitmap   
)
bool bitmap_and_into ( bitmap  ,
const_bitmap   
)
int bitmap_bit_p ( bitmap  ,
int   
)
   Return true if a register is set in a register set.  
void bitmap_clear ( bitmap  )
   Clear a bitmap by freeing up the linked list.  
bool bitmap_clear_bit ( bitmap  ,
int   
)
   Clear a single bit in a bitmap.  Return true if the bit changed.  
void bitmap_clear_range ( bitmap  ,
unsigned  int,
unsigned  int 
)
void bitmap_compl_and_into ( bitmap  ,
const_bitmap   
)
void bitmap_copy ( bitmap  ,
const_bitmap   
)
   Copy a bitmap to another bitmap.  
unsigned long bitmap_count_bits ( const_bitmap  )
   Count the number of bits set in the bitmap.  
bool bitmap_equal_p ( const_bitmap  ,
const_bitmap   
)
   True if two bitmaps are identical.  
unsigned bitmap_first_set_bit ( const_bitmap  )
bitmap bitmap_gc_alloc_stat ( ALONE_MEM_STAT_DECL  )
hashval_t bitmap_hash ( const_bitmap  )
   Compute bitmap hash (for purposes of hashing etc.)  
static void bitmap_initialize_stat ( )
inlinestatic
   Initialize a bitmap header.  OBSTACK indicates the bitmap obstack
   to allocate from, NULL for GC'd bitmap.  
bool bitmap_intersect_compl_p ( const_bitmap  ,
const_bitmap   
)
   True if the complement of the second intersects the first (their
   AND_COMPL is non-empty).  
bool bitmap_intersect_p ( const_bitmap  ,
const_bitmap   
)
   True if the bitmaps intersect (their AND is non-empty).  
bool bitmap_ior ( bitmap  ,
const_bitmap  ,
const_bitmap   
)
bool bitmap_ior_and_compl ( bitmap  DST,
const_bitmap  A,
const_bitmap  B,
const_bitmap  C 
)
   DST = A | (B & ~C).  Return true if DST changes.  
bool bitmap_ior_and_compl_into ( bitmap  A,
const_bitmap  B,
const_bitmap  C 
)
   A |= (B & ~C).  Return true if A changes.  
bool bitmap_ior_and_into ( bitmap  DST,
const_bitmap  B,
const_bitmap  C 
)
   DST = A | (B & C).  Return true if DST changes.  
bool bitmap_ior_into ( bitmap  ,
const_bitmap   
)
unsigned bitmap_last_set_bit ( const_bitmap  )
bitmap bitmap_obstack_alloc_stat ( bitmap_obstack *obstack  MEM_STAT_DECL)
   Allocate and free bitmaps from obstack, malloc and gc'd memory.  
void bitmap_obstack_free ( bitmap  )
void bitmap_obstack_initialize ( bitmap_obstack )
   Initialize and release a bitmap obstack.  
void bitmap_obstack_release ( bitmap_obstack )
void bitmap_print ( FILE *  file,
const_bitmap  head,
const char *  prefix,
const char *  suffix 
)
   Print a bitmap.  
   Function to print out the contents of a bitmap.  Unlike debug_bitmap_file,
   it does not print anything but the bits.  

Referenced by df_clear_flags(), and dse_step3().

void bitmap_register ( bitmap  MEM_STAT_DECL)
bool bitmap_set_bit ( bitmap  ,
int   
)
   Set a single bit in a bitmap.  Return true if the bit changed.  
void bitmap_set_range ( bitmap  ,
unsigned  int,
unsigned  int 
)
bool bitmap_single_bit_set_p ( const_bitmap  )
   True if the bitmap has only a single bit set.  
void bitmap_xor ( bitmap  ,
const_bitmap  ,
const_bitmap   
)
void bitmap_xor_into ( bitmap  ,
const_bitmap   
)
static bool bmp_iter_and ( )
inlinestatic
   Advance to the next nonzero bit of an intersecting pair of
   bitmaps.  We will have already advanced past the just iterated bit.
   Return true if there is a bit to iterate.  
     If our current word is nonzero, it contains the bit we want.  
     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.  
         Find the next nonzero word in this elt.  
         Advance to the next identical element.  
             Advance elt1 while it is less than elt2.  We always want
             to advance one elt.  
             Advance elt2 to be no less than elt1.  This might not
             advance.  
static bool bmp_iter_and_compl ( )
inlinestatic
   Advance to the next nonzero bit in the intersection of
   complemented bitmaps.  We will have already advanced past the just
   iterated bit.  
     If our current word is nonzero, it contains the bit we want.  
     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.  
         Find the next nonzero word in this elt.  
         Advance to the next element of elt1.  
         Advance elt2 until it is no less than elt1.  
static void bmp_iter_and_compl_init ( bitmap_iterator bi,
const_bitmap  map1,
const_bitmap  map2,
unsigned  start_bit,
unsigned *  bit_no 
)
inlinestatic
   Initialize an iterator to iterate over the bits in MAP1 & ~MAP2.
     Advance elt1 until it is not before the block containing start_bit.  
     Advance elt2 until it is not before elt1.  
     We might have advanced beyond the start_bit, so reinitialize for
     that.  
     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.  
static void bmp_iter_and_init ( bitmap_iterator bi,
const_bitmap  map1,
const_bitmap  map2,
unsigned  start_bit,
unsigned *  bit_no 
)
inlinestatic
   Initialize an iterator to iterate over the intersection of two
   bitmaps.  START_BIT is the bit to commence from.  
     Advance elt1 until it is not before the block containing
     start_bit.  
     Advance elt2 until it is not before elt1.  
     If we're at the same index, then we have some intersecting bits.  
         We might have advanced beyond the start_bit, so reinitialize
         for that.  
         Otherwise we must immediately advance elt1, so initialize for
         that.  
     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.  
static void bmp_iter_next ( )
inlinestatic
   Advance to the next bit in BI.  We don't advance to the next
   nonzero bit yet.  
static void bmp_iter_next_bit ( )
inlinestatic
   Advance to first set bit in BI.  
static bool bmp_iter_set ( )
inlinestatic
   Advance to the next nonzero bit of a single bitmap, we will have
   already advanced past the just iterated bit.  Return true if there
   is a bit to iterate.  
     If our current word is nonzero, it contains the bit we want.  
     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.  
         Find the next nonzero word in this elt.  
         Advance to the next element.  
static void bmp_iter_set_init ( bitmap_iterator bi,
const_bitmap  map,
unsigned  start_bit,
unsigned *  bit_no 
)
inlinestatic
   Initialize a single bitmap iterator.  START_BIT is the first bit to
   iterate from.  
     Advance elt1 until it is not before the block containing start_bit.  
     We might have gone past the start bit, so reinitialize it.  
     Initialize for what is now start_bit.  
     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.  
void debug ( const bitmap_head_def ref)
void debug ( const bitmap_head_def ptr)
void debug_bitmap ( const_bitmap  )
   Debug functions to print a bitmap linked list.  
void debug_bitmap_file ( FILE *  ,
const_bitmap   
)
void dump_bitmap ( FILE *  file,
const_bitmap  map 
)
inline
   A few compatibility/functions macros for compatibility with sbitmaps 

Referenced by cgraph_redirect_edge_call_stmt_to_callee(), distribute_loop(), and dump_use().

void dump_bitmap_statistics ( void  )
   Output per-bitmap memory usage statistics.  

Variable Documentation

bitmap_element bitmap_zero_bits
   Global data