GCC Middle and Back End API Reference
alias.c File Reference

Data Structures

struct  alias_set_entry_d

Typedefs

typedef struct alias_set_entry_dalias_set_entry

Functions

static int rtx_equal_for_memref_p (const_rtx, const_rtx)
static int memrefs_conflict_p (int, rtx, int, rtx, HOST_WIDE_INT)
static void record_set (rtx, const_rtx, void *)
static int base_alias_check (rtx, rtx, rtx, rtx, enum machine_mode, enum machine_mode)
static rtx find_base_value (rtx)
static int mems_in_disjoint_alias_sets_p (const_rtx, const_rtx)
static int insert_subset_children (splay_tree_node, void *)
static alias_set_entry get_alias_set_entry (alias_set_type)
static bool nonoverlapping_component_refs_p (const_rtx, const_rtx)
static tree decl_for_component_ref (tree)
static int write_dependence_p (const_rtx, const_rtx, enum machine_mode, rtx, bool, bool, bool)
static void memory_modified_1 (rtx, const_rtx, void *)
static bool ao_ref_from_mem ()
static bool rtx_refs_may_alias_p ()
static alias_set_entry get_alias_set_entry ()
static int mems_in_disjoint_alias_sets_p ()
static int insert_subset_children ()
bool alias_set_subset_of ()
int alias_sets_conflict_p ()
int alias_sets_must_conflict_p ()
int objects_must_conflict_p ()
bool component_uses_parent_alias_set ()
static alias_set_type get_deref_alias_set_1 ()
alias_set_type get_deref_alias_set ()
alias_set_type get_alias_set ()
alias_set_type new_alias_set ()
void record_alias_subset ()
void record_component_aliases ()
alias_set_type get_varargs_alias_set ()
alias_set_type get_frame_alias_set ()
static rtx unique_base_value ()
static bool unique_base_value_p ()
static bool known_base_value_p ()
static rtx find_base_value ()
static void record_set ()
rtx get_reg_base_value ()
rtx get_reg_known_value ()
static void set_reg_known_value ()
bool get_reg_known_equiv_p ()
static void set_reg_known_equiv_p ()
rtx canon_rtx ()
static int rtx_equal_for_memref_p ()
static rtx find_base_term ()
bool may_be_sp_based_p ()
static int refs_newer_value_cb ()
static bool refs_newer_value_p ()
rtx get_addr ()
static rtx addr_side_effect_eval ()
static bool offset_overlap_p ()
static int memrefs_conflict_p ()
int read_dependence ()
static bool nonoverlapping_component_refs_p ()
static tree decl_for_component_ref ()
static void adjust_offset_for_component_ref (tree x, bool *known_p, HOST_WIDE_INT *offset)
int nonoverlapping_memrefs_p ()
static int true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr, const_rtx x, rtx x_addr, bool mem_canonicalized)
int true_dependence ()
int canon_true_dependence (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr, const_rtx x, rtx x_addr)
int anti_dependence ()
int canon_anti_dependence (const_rtx mem, bool mem_canonicalized, const_rtx x, enum machine_mode x_mode, rtx x_addr)
int output_dependence ()
int may_alias_p ()
void init_alias_target ()
static void memory_modified_1 ()
bool memory_modified_in_insn_p ()
static bool set_dest_equal_p ()
bool memory_must_be_modified_in_insn_p ()
void init_alias_analysis ()
void vt_equate_reg_base_value ()
void end_alias_analysis ()

Variables

static vec< rtx, va_gc > * reg_base_value
static rtxnew_reg_base_value
static rtx arg_base_value
static int unique_id
static vec< rtx, va_gc > * old_reg_base_value
static vec< rtx, va_gc > * reg_known_value
static sbitmap reg_known_equiv_p
static bool copying_arguments
static vec< alias_set_entry,
va_gc > * 
alias_sets
static alias_set_type varargs_set = -1
static alias_set_type frame_set = -1
static sbitmap reg_seen
static bool memory_modified

Typedef Documentation


Function Documentation

static rtx addr_side_effect_eval ( )
static
Return the address of the (N_REFS + 1)th memory reference to ADDR
    where SIZE is the size in bytes of the memory reference.  If ADDR
    is not modified by the memory reference then ADDR is returned.   

References canon_rtx(), and offset.

Referenced by memrefs_conflict_p().

static void adjust_offset_for_component_ref ( tree  x,
bool *  known_p,
HOST_WIDE_INT offset 
)
static
Walk up the COMPONENT_REF list in X and adjust *OFFSET to compensate
   for the offset of the field reference.  *KNOWN_P says whether the
   offset is known.   

References component_ref_field_offset(), host_integerp(), and tree_low_cst().

Referenced by nonoverlapping_memrefs_p().

bool alias_set_subset_of ( )
Return true if the first alias set is a subset of the second.   

References alias_set_entry_d::children, get_alias_set_entry(), and alias_set_entry_d::has_zero_child.

Referenced by aliasing_component_refs_p().

int alias_sets_must_conflict_p ( )
Return 1 if the two specified alias sets will always conflict.   

Referenced by alias_sets_conflict_p(), and objects_must_conflict_p().

int anti_dependence ( )
Anti dependence: X is written after read in MEM takes place.   

References write_dependence_p().

Referenced by load_kills_store(), memory_modified_1(), sched_analyze_1(), and validate_equiv_mem_from_store().

static bool ao_ref_from_mem ( )
static
Build a decomposed reference object for querying the alias-oracle
   from the MEM rtx and store it in *REF.
   Returns false if MEM is not suitable for the alias-oracle.   

References ao_ref_base(), ao_ref_init(), cfun, gimple_df::decls_to_pointers, get_spill_slot_decl(), function::gimple_df, host_integerp(), is_global_var(), and pointer_map_contains().

Referenced by rtx_refs_may_alias_p().

static int base_alias_check ( rtx  x,
rtx  x_base,
rtx  y,
rtx  y_base,
enum machine_mode  x_mode,
enum machine_mode  y_mode 
)
static
Return 0 if the addresses X and Y are known to point to different
   objects, 1 if they might be pointers to the same object.   

References canon_rtx(), find_base_term(), rtx_equal_p(), and unique_base_value_p().

Referenced by may_alias_p(), true_dependence_1(), and write_dependence_p().

int canon_anti_dependence ( const_rtx  mem,
bool  mem_canonicalized,
const_rtx  x,
enum machine_mode  x_mode,
rtx  x_addr 
)
Likewise, but we already have a canonicalized MEM, and X_ADDR for X.
   Also, consider X in X_MODE (which might be from an enclosing
   STRICT_LOW_PART / ZERO_EXTRACT).
   If MEM_CANONICALIZED is true, MEM is canonicalized.   

References write_dependence_p().

Referenced by check_dependence(), and cselib_invalidate_mem().

rtx canon_rtx ( )
Returns a canonical version of X, from the point of view alias
   analysis.  (For example, if X is a MEM whose address is a register,
   and the register has a known value (say a SYMBOL_REF), then a MEM
   whose address is the SYMBOL_REF is returned.)   

References get_reg_known_value(), plus_constant(), and replace_equiv_address_nv().

Referenced by add_insn_mem_dependence(), addr_side_effect_eval(), base_alias_check(), canon_address(), canon_list_insert(), clobber_overlapping_mems(), compute_transp(), cse_insn(), cselib_invalidate_mem(), debug_mem_addr_value(), get_addr_from_global_cache(), get_group_info(), invalidate(), may_alias_p(), memrefs_conflict_p(), record_store(), rtx_equal_for_memref_p(), sched_analyze_1(), sched_analyze_2(), true_dependence_1(), vt_canonicalize_addr(), and write_dependence_p().

int canon_true_dependence ( const_rtx  mem,
enum machine_mode  mem_mode,
rtx  mem_addr,
const_rtx  x,
rtx  x_addr 
)
Canonical true dependence: X is read after store in MEM takes place.
   Variant of true_dependence which assumes MEM has already been
   canonicalized (hence we no longer do that here).
   The mem_addr argument has been added, since true_dependence_1 computed
   this value prior to canonicalizing.   

References true_dependence_1().

Referenced by check_mem_read_rtx(), compute_transp(), record_store(), scan_reads_nospill(), and vt_canon_true_dep().

bool component_uses_parent_alias_set ( )
Return true if all nested component references handled by
   get_inner_reference in T are such that we should use the alias set
   provided by the object at the heart of T.

   This is true for non-addressable components (which don't have their
   own alias set), as well as components of objects in alias set zero.
   This later point is a special case wherein we wish to override the
   alias set used by the component, but we don't have per-FIELD_DECL
   assignable alias sets.   

References get_alias_set(), and handled_component_p().

Referenced by get_alias_set(), and set_mem_attributes_minus_bitpos().

static tree decl_for_component_ref ( tree  )
static
static tree decl_for_component_ref ( )
static
Look at the bottom of the COMPONENT_REF list for a DECL, and return it.   
static rtx find_base_value ( rtx  )
static

Referenced by find_base_value(), and record_set().

static rtx find_base_value ( )
static
rtx get_addr ( )
Convert the address X into something we can use.  This is done by returning
   it unchanged unless it is a value; in the latter case we call cselib to get
   a more useful rtx.   

References canonical_cselib_val(), cselib_have_permanent_equivalences(), elt_loc_list::loc, cselib_val_struct::locs, elt_loc_list::next, refs_newer_value_p(), and cselib_val_struct::val_rtx.

Referenced by canon_list_insert(), compute_transp(), cselib_invalidate_mem(), debug_mem_addr_value(), get_addr_from_global_cache(), invalidate(), may_alias_p(), memrefs_conflict_p(), true_dependence_1(), and write_dependence_p().

static alias_set_entry get_alias_set_entry ( alias_set_type  )
static
static alias_set_entry get_alias_set_entry ( )
inlinestatic
Returns a pointer to the alias set entry for ALIAS_SET, if there is
   such an entry, or NULL otherwise.   

References alias_sets.

alias_set_type get_deref_alias_set ( )
Return the alias set for the memory pointed to by T, which may be
   either a type or an expression.   

References get_alias_set(), and get_deref_alias_set_1().

Referenced by ao_ref_init_from_vn_reference(), get_alias_set(), indirect_ref_may_alias_decl_p(), and indirect_refs_may_alias_p().

static alias_set_type get_deref_alias_set_1 ( )
static
Return the alias set for the memory pointed to by T, which may be
   either a type or an expression.  Return -1 if there is nothing
   special about dereferencing T.   

Referenced by get_alias_set(), and get_deref_alias_set().

alias_set_type get_frame_alias_set ( void  )
rtx get_reg_base_value ( )
Return REG_BASE_VALUE for REGNO.  Selective scheduler uses this to avoid
   using hard registers with non-null REG_BASE_VALUE for renaming.   

Referenced by init_regs_for_mode().

bool get_reg_known_equiv_p ( )
Similarly for reg_known_equiv_p.   

References bitmap_bit_p(), reg_known_equiv_p, reg_known_value, and vec_safe_length().

Referenced by sched_analyze_reg().

rtx get_reg_known_value ( )
If a value is known for REGNO, return it.   

References reg_known_value, and vec_safe_length().

Referenced by canon_rtx(), deps_may_trap_p(), init_alias_analysis(), and sched_analyze_reg().

alias_set_type get_varargs_alias_set ( void  )

References new_alias_set(), and varargs_set.

void init_alias_target ( void  )
static int insert_subset_children ( splay_tree_node  ,
void *   
)
static

Referenced by record_alias_subset().

static int insert_subset_children ( )
static
Insert the NODE into the splay tree given by DATA.  Used by
   record_alias_subset via splay_tree_foreach.   
static bool known_base_value_p ( )
static
Return true if X is known to be a base value.   

Referenced by find_base_term(), and find_base_value().

int may_alias_p ( )
Check whether X may be aliased with MEM.  Don't do offset-based
  memory disambiguation & TBAA.   

References base_alias_check(), canon_rtx(), find_base_term(), get_addr(), nonoverlapping_memrefs_p(), reg_mentioned_p(), and rtx_refs_may_alias_p().

Referenced by walk_mems_2().

bool may_be_sp_based_p ( )
Return true if accesses to address X may alias accesses based
   on the stack pointer.   

References find_base_term().

Referenced by record_store(), and store_killed_in_insn().

static void memory_modified_1 ( rtx  ,
const_rtx  ,
void *   
)
static
static void memory_modified_1 ( )
static
bool memory_modified_in_insn_p ( )
Return true when INSN possibly modify memory contents of MEM
   (i.e. address can be modified).   

References memory_modified, memory_modified_1(), and note_stores().

Referenced by modified_between_p(), and modified_in_p().

bool memory_must_be_modified_in_insn_p ( )
Like memory_modified_in_insn_p, but return TRUE if INSN will
   *DEFINITELY* modify the memory contents of MEM.   

References SET, and set_dest_equal_p().

Referenced by noce_can_store_speculate_p().

static int memrefs_conflict_p ( int  ,
rtx  ,
int  ,
rtx  ,
HOST_WIDE_INT   
)
static
static int memrefs_conflict_p ( )
static
Return one if X and Y (memory addresses) reference the
   same location in memory or if the references overlap.
   Return zero if they do not overlap, else return
   minus one in which case they still might reference the same location.

   C is an offset accumulator.  When
   C is nonzero, we are testing aliases between X and Y + C.
   XSIZE is the size in bytes of the X reference,
   similarly YSIZE is the size in bytes for Y.
   Expect that canon_rtx has been already called for X and Y.

   If XSIZE or YSIZE is zero, we do not know the amount of memory being
   referenced (the reference was BLKmode), so make the most pessimistic
   assumptions.

   If XSIZE or YSIZE is negative, we may access memory outside the object
   being referenced as a side effect.  This can happen when using AND to
   align memory references, as is done on the Alpha.

   Nice to notice that varying addresses cannot conflict with fp if no
   local variables had their addresses taken, but that's too hard now.

   ???  Contrary to the tree alias oracle this does not return
   one for X + non-constant and Y + non-constant when X and Y are equal.
   If that is fixed the TBAA hack for union type-punning can be removed.   

References addr_side_effect_eval(), canon_rtx(), canonical_cselib_val(), get_addr(), elt_loc_list::loc, memrefs_conflict_p(), elt_loc_list::next, offset_overlap_p(), rtx_equal_for_memref_p(), sc, and uc.

static int mems_in_disjoint_alias_sets_p ( const_rtx  ,
const_rtx   
)
static

Referenced by true_dependence_1().

static int mems_in_disjoint_alias_sets_p ( )
inlinestatic
Returns nonzero if the alias sets for MEM1 and MEM2 are such that
   the two MEMs cannot alias each other.   
Perform a basic sanity check.  Namely, that there are no alias sets
   if we're not using strict aliasing.  This helps to catch bugs
   whereby someone uses PUT_CODE, but doesn't clear MEM_ALIAS_SET, or
   where a MEM is allocated in some way other than by the use of
   gen_rtx_MEM, and the MEM_ALIAS_SET is not cleared.  If we begin to
   use alias sets to indicate that spilled registers cannot alias each
   other, we might need to remove this check.   

References alias_sets_conflict_p().

static bool nonoverlapping_component_refs_p ( const_rtx  ,
const_rtx   
)
static

Referenced by true_dependence_1().

static bool nonoverlapping_component_refs_p ( )
static
Return true if we can determine that the fields referenced cannot
   overlap for any pair of objects.   
int nonoverlapping_memrefs_p ( )
Return nonzero if we can determine the exprs corresponding to memrefs
   X and Y and they do not overlap. 
   If LOOP_VARIANT is set, skip offset-based disambiguation  

References adjust_offset_for_component_ref(), decl_for_component_ref(), get_spill_slot_decl(), and rtx_equal_p().

Referenced by cse_insn(), may_alias_p(), true_dependence_1(), and write_dependence_p().

int objects_must_conflict_p ( )
Return 1 if any MEM object of type T1 will always conflict (using the
   dependency routines in this file) with any MEM object of type T2.
   This is used when allocating temporary storage.  If T1 and/or T2 are
   NULL_TREE, it means we know nothing about the storage.   

References alias_sets_must_conflict_p(), and get_alias_set().

Referenced by assign_stack_temp_for_type().

static bool offset_overlap_p ( )
inlinestatic
Return TRUE if an object X sized at XSIZE bytes and another object
   Y sized at YSIZE bytes, starting C bytes after X, may overlap.  If
   any of the sizes is zero, assume an overlap, otherwise use the
   absolute value of the sizes as the actual sizes.   

Referenced by memrefs_conflict_p().

int output_dependence ( )
Output dependence: X is written after store in MEM takes place.   

References write_dependence_p().

Referenced by memory_modified_1(), sched_analyze_1(), and store_killed_in_pat().

int read_dependence ( )
Functions to compute memory dependencies.

   Since we process the insns in execution order, we can build tables
   to keep track of what registers are fixed (and not aliased), what registers
   are varying in known ways, and what registers are varying in unknown
   ways.

   If both memory references are volatile, then there must always be a
   dependence between the two references, since their order can not be
   changed.  A volatile and non-volatile reference can be interchanged
   though.

   We also must allow AND addresses, because they may generate accesses
   outside the object being referenced.  This is used to generate aligned
   addresses from unaligned addresses, for instance, the alpha
   storeqi_unaligned pattern.   
Read dependence: X is read after read in MEM takes place.  There can
   only be a dependence here if both reads are volatile, or if either is
   an explicit barrier.   

Referenced by sched_analyze_2().

void record_alias_subset ( )
Indicate that things in SUBSET can alias things in SUPERSET, but that
   not everything that aliases SUPERSET also aliases SUBSET.  For example,
   in C, a store to an `int' can alias a load of a structure containing an
   `int', and vice versa.  But it can't alias a load of a 'double' member
   of the same structure.  Here, the structure would be the SUPERSET and
   `int' the SUBSET.  This relationship is also described in the comment at
   the beginning of this file.

   This function should be called only once per SUPERSET/SUBSET pair.

   It is illegal for SUPERSET to be zero; everything is implicitly a
   subset of alias set zero.   

References alias_set_entry_d::alias_set, alias_set_entry_d::children, get_alias_set_entry(), alias_set_entry_d::has_zero_child, and insert_subset_children().

Referenced by record_component_aliases().

void record_component_aliases ( )
Record that component types of TYPE, if any, are part of that type for
   aliasing purposes.  For record types, we only record component types
   for fields that are not marked non-addressable.  For array types, we
   only record the component type if it is not marked non-aliased.   

References get_alias_set(), and record_alias_subset().

Referenced by get_alias_set().

static void record_set ( rtx  ,
const_rtx  ,
void *   
)
static

Referenced by init_alias_analysis().

static void record_set ( )
static
static int refs_newer_value_cb ( )
static
Callback for for_each_rtx, that returns 1 upon encountering a VALUE
   whose UID is greater than the int uid that D points to.   

Referenced by refs_newer_value_p().

static bool refs_newer_value_p ( )
static
Return TRUE if EXPR refers to a VALUE whose uid is greater than
   that of V.   

References for_each_rtx(), and refs_newer_value_cb().

Referenced by get_addr().

static int rtx_equal_for_memref_p ( const_rtx  ,
const_rtx   
)
static
static int rtx_equal_for_memref_p ( )
static
Return 1 if X and Y are identical-looking rtx's.
   Expect that X and Y has been already canonicalized.

   We use the data in reg_known_value above to see if two registers with
   different numbers are, in fact, equivalent.   

References canon_rtx(), rtx_equal_for_memref_p(), and rtx_equal_p().

static bool rtx_refs_may_alias_p ( )
static
Query the alias-oracle on whether the two memory rtx X and MEM may
   alias.  If TBAA_P is set also apply TBAA.  Returns true if the
   two rtxen may alias, false otherwise.   

References ao_ref_from_mem(), and refs_may_alias_p_1().

Referenced by may_alias_p(), true_dependence_1(), and write_dependence_p().

static bool set_dest_equal_p ( )
inlinestatic
Return TRUE if the destination of a set is rtx identical to
   ITEM.   

References rtx_equal_p().

Referenced by memory_must_be_modified_in_insn_p().

static void set_reg_known_equiv_p ( )
static
static void set_reg_known_value ( )
static
Set it.   

References reg_known_value, and vec_safe_length().

Referenced by init_alias_analysis().

int true_dependence ( )
True dependence: X is read after store in MEM takes place.   

References true_dependence_1().

Referenced by find_mem_conflicts(), load_kills_store(), memref_referenced_p(), mems_conflict_for_gcse_p(), safe_from_p(), and sched_analyze_2().

static int true_dependence_1 ( const_rtx  mem,
enum machine_mode  mem_mode,
rtx  mem_addr,
const_rtx  x,
rtx  x_addr,
bool  mem_canonicalized 
)
static
Helper for true_dependence and canon_true_dependence.
   Checks for true dependence: X is read after store in MEM takes place.

   If MEM_CANONICALIZED is FALSE, then X_ADDR and MEM_ADDR should be
   NULL_RTX, and the canonical addresses of MEM and X are both computed
   here.  If MEM_CANONICALIZED, then MEM must be already canonicalized.

   If X_ADDR is non-NULL, it is used in preference of XEXP (x, 0).

   Returns 1 if there is a true dependence, 0 otherwise.   

References base_alias_check(), canon_rtx(), find_base_term(), get_addr(), memrefs_conflict_p(), mems_in_disjoint_alias_sets_p(), nonoverlapping_component_refs_p(), nonoverlapping_memrefs_p(), reg_mentioned_p(), and rtx_refs_may_alias_p().

Referenced by canon_true_dependence(), and true_dependence().

static rtx unique_base_value ( )
static
Create a new, unique base with id ID.   

Referenced by init_alias_target(), and record_set().

static bool unique_base_value_p ( )
static
Return true if accesses based on any other base value cannot alias
   those based on X.   

Referenced by base_alias_check().

void vt_equate_reg_base_value ( )
Equate REG_BASE_VALUE (reg1) to REG_BASE_VALUE (reg2).
   Special API for var-tracking pass purposes.   

Referenced by vt_init_cfa_base().

static int write_dependence_p ( const_rtx  mem,
const_rtx  x,
enum machine_mode  x_mode,
rtx  x_addr,
bool  mem_canonicalized,
bool  x_canonicalized,
bool  writep 
)
static
Returns nonzero if a write to X might alias a previous read from
   (or, if WRITEP is true, a write to) MEM.
   If X_CANONCALIZED is true, then X_ADDR is the canonicalized address of X,
   and X_MODE the mode for that access.
   If MEM_CANONICALIZED is true, MEM is canonicalized.   

References base_alias_check(), canon_rtx(), find_base_term(), get_addr(), memrefs_conflict_p(), nonoverlapping_memrefs_p(), reg_mentioned_p(), and rtx_refs_may_alias_p().

Referenced by anti_dependence(), canon_anti_dependence(), and output_dependence().


Variable Documentation

vec<alias_set_entry, va_gc>* alias_sets
static
The splay-tree used to store the various alias set entries.   

Referenced by get_alias_set_entry(), and new_alias_set().

rtx arg_base_value
static
The single VOIDmode ADDRESS that represents all argument bases.
   It has id 0.   

Referenced by find_base_value(), and init_alias_target().

bool copying_arguments
static
True when scanning insns from the start of the rtl to the
   NOTE_INSN_FUNCTION_BEG note.   

Referenced by find_base_value(), and init_alias_analysis().

alias_set_type frame_set = -1
static
Likewise, but used for the fixed portions of the frame, e.g., register
   save areas.   

Referenced by get_frame_alias_set().

bool memory_modified
static
Set MEMORY_MODIFIED when X modifies DATA (that is assumed
   to be memory reference.   

Referenced by memory_modified_1(), and memory_modified_in_insn_p().

rtx* new_reg_base_value
static
vec<rtx, va_gc>* old_reg_base_value
static
We preserve the copy of old array around to avoid amount of garbage
   produced.  About 8% of garbage produced were attributed to this
   array.   

Referenced by init_alias_analysis().

vec<rtx, va_gc>* reg_base_value
static
reg_base_value[N] gives an address to which register N is related.
   If all sets after the first add or subtract to the current value
   or otherwise modify it so it does not point to a different top level
   object, reg_base_value[N] is equal to the address part of the source
   of the first set.

   A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF.  ADDRESS
   expressions represent three types of base:

     1. incoming arguments.  There is just one ADDRESS to represent all
        arguments, since we do not know at this level whether accesses
        based on different arguments can alias.  The ADDRESS has id 0.

     2. stack_pointer_rtx, frame_pointer_rtx, hard_frame_pointer_rtx
        (if distinct from frame_pointer_rtx) and arg_pointer_rtx.
        Each of these rtxes has a separate ADDRESS associated with it,
        each with a negative id.

        GCC is (and is required to be) precise in which register it
        chooses to access a particular region of stack.  We can therefore
        assume that accesses based on one of these rtxes do not alias
        accesses based on another of these rtxes.

     3. bases that are derived from malloc()ed memory (REG_NOALIAS).
        Each such piece of memory has a separate ADDRESS associated
        with it, each with an id greater than 0.

   Accesses based on one ADDRESS do not alias accesses based on other
   ADDRESSes.  Accesses based on ADDRESSes in groups (2) and (3) do not
   alias globals either; the ADDRESSes have Pmode to indicate this.
   The ADDRESS in group (1) _may_ alias globals; it has VOIDmode to
   indicate this.   

Referenced by end_alias_analysis().

sbitmap reg_known_equiv_p
static
Vector recording for each reg_known_value whether it is due to a
   REG_EQUIV note.  Future passes (viz., reload) may replace the
   pseudo with the equivalent expression and so we account for the
   dependences that would be introduced if that happens.

   The REG_EQUIV notes created in assign_parms may mention the arg
   pointer, and there are explicit insns in the RTL that modify the
   arg pointer.  Thus we must ensure that such insns don't get
   scheduled across each other because that would invalidate the
   REG_EQUIV notes.  One could argue that the REG_EQUIV notes are
   wrong, but solving the problem in the scheduler will likely give
   better code, so we do it here.   

Referenced by end_alias_analysis(), get_reg_known_equiv_p(), init_alias_analysis(), and set_reg_known_equiv_p().

vec<rtx, va_gc>* reg_known_value
static
Vector indexed by N giving the initial (unchanging) value known for
   pseudo-register N.  This vector is initialized in init_alias_analysis,
   and does not change until end_alias_analysis is called.   

Referenced by end_alias_analysis(), get_reg_known_equiv_p(), get_reg_known_value(), init_alias_analysis(), set_reg_known_equiv_p(), and set_reg_known_value().

sbitmap reg_seen
static
Called from init_alias_analysis indirectly through note_stores,
   or directly if DEST is a register with a REG_NOALIAS note attached.
   SET is null in the latter case.   
While scanning insns to find base values, reg_seen[N] is nonzero if
   register N has been set in this function.   

Referenced by init_alias_analysis(), and record_set().

int unique_id
static
Used to allocate unique ids to each REG_NOALIAS ADDRESS.   
alias_set_type varargs_set = -1
static
Allocate an alias set for use in storing and reading from the varargs
   spill area.   

Referenced by get_varargs_alias_set().