(root)/
gcc-13.2.0/
gcc/
tree-ssa-alias.h
       1  /* Tree based alias analysis and alias oracle.
       2     Copyright (C) 2008-2023 Free Software Foundation, Inc.
       3     Contributed by Richard Guenther  <rguenther@suse.de>
       4  
       5     This file is part of GCC.
       6  
       7     GCC is free software; you can redistribute it and/or modify
       8     under the terms of the GNU General Public License as published by
       9     the Free Software Foundation; either version 3 of the License, or
      10     (at your option) any later version.
      11  
      12     GCC is distributed in the hope that it will be useful,
      13     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15     GNU General Public License for more details.
      16  
      17     You should have received a copy of the GNU General Public License
      18     along with GCC; see the file COPYING3.  If not see
      19     <http://www.gnu.org/licenses/>.  */
      20  
      21  #ifndef TREE_SSA_ALIAS_H
      22  #define TREE_SSA_ALIAS_H
      23  
      24  /* The points-to solution.
      25  
      26     The points-to solution is a union of pt_vars and the abstract
      27     sets specified by the flags.  */
      28  struct GTY(()) pt_solution
      29  {
      30    /* Nonzero if points-to analysis couldn't determine where this pointer
      31       is pointing to.  */
      32    unsigned int anything : 1;
      33  
      34    /* Nonzero if the points-to set includes any global memory.  Note that
      35       even if this is zero pt_vars can still include global variables.  */
      36    unsigned int nonlocal : 1;
      37  
      38    /* Nonzero if the points-to set includes the local escaped solution by
      39       reference.  */
      40    unsigned int escaped : 1;
      41  
      42    /* Nonzero if the points-to set includes the IPA escaped solution by
      43       reference.  */
      44    unsigned int ipa_escaped : 1;
      45  
      46    /* Nonzero if the points-to set includes 'nothing', the points-to set
      47       includes memory at address NULL.  */
      48    unsigned int null : 1;
      49  
      50    /* Nonzero if the vars bitmap includes a variable included in 'nonlocal'.  */
      51    unsigned int vars_contains_nonlocal : 1;
      52    /* Nonzero if the vars bitmap includes a variable included in 'escaped'.  */
      53    unsigned int vars_contains_escaped : 1;
      54    /* Nonzero if the vars bitmap includes a anonymous heap variable that
      55       escaped the function and thus became global.  */
      56    unsigned int vars_contains_escaped_heap : 1;
      57    /* Nonzero if the vars bitmap includes a anonymous variable used to
      58       represent storage pointed to by a restrict qualified pointer.  */
      59    unsigned int vars_contains_restrict : 1;
      60    /* Nonzero if the vars bitmap includes an interposable variable.  */
      61    unsigned int vars_contains_interposable : 1;
      62  
      63    /* Set of variables that this pointer may point to.  */
      64    bitmap vars;
      65  };
      66  
      67  
      68  /* Simplified and cached information about a memory reference tree.
      69     Used by the alias-oracle internally and externally in alternate
      70     interfaces.  */
      71  class ao_ref
      72  {
      73  public:
      74    /* The original full memory reference tree or NULL_TREE if that is
      75       not available.  */
      76    tree ref;
      77  
      78    /* The following fields are the decomposed reference as returned
      79       by get_ref_base_and_extent.  */
      80    /* The base object of the memory reference or NULL_TREE if all of
      81       the following fields are not yet computed.  */
      82    tree base;
      83    /* The offset relative to the base.  */
      84    poly_int64 offset;
      85    /* The size of the access.  */
      86    poly_int64 size;
      87    /* The maximum possible extent of the access or -1 if unconstrained.  */
      88    poly_int64 max_size;
      89  
      90    /* The alias set of the access or -1 if not yet computed.  */
      91    alias_set_type ref_alias_set;
      92  
      93    /* The alias set of the base object or -1 if not yet computed.  */
      94    alias_set_type base_alias_set;
      95  
      96    /* Whether the memory is considered a volatile access.  */
      97    bool volatile_p;
      98  
      99    bool max_size_known_p () const;
     100  };
     101  
     102  /* Return true if the maximum size is known, rather than the special -1
     103     marker.  */
     104  
     105  inline bool
     106  ao_ref::max_size_known_p () const
     107  {
     108    return known_size_p (max_size);
     109  }
     110  
     111  /* In tree-ssa-alias.cc  */
     112  extern void ao_ref_init (ao_ref *, tree);
     113  extern void ao_ref_init_from_ptr_and_size (ao_ref *, tree, tree);
     114  extern void ao_ref_init_from_ptr_and_range (ao_ref *, tree, bool,
     115  					    poly_int64, poly_int64,
     116  					    poly_int64);
     117  extern tree ao_ref_base (ao_ref *);
     118  extern alias_set_type ao_ref_alias_set (ao_ref *);
     119  extern alias_set_type ao_ref_base_alias_set (ao_ref *);
     120  extern tree ao_ref_alias_ptr_type (ao_ref *);
     121  extern tree ao_ref_base_alias_ptr_type (ao_ref *);
     122  extern bool ao_ref_alignment (ao_ref *, unsigned int *,
     123  			      unsigned HOST_WIDE_INT *);
     124  extern bool ptr_deref_may_alias_global_p (tree, bool);
     125  extern bool ptr_derefs_may_alias_p (tree, tree);
     126  extern bool ptrs_compare_unequal (tree, tree);
     127  extern bool ref_may_alias_global_p (tree, bool);
     128  extern bool ref_may_alias_global_p (ao_ref *, bool);
     129  extern bool refs_may_alias_p (tree, tree, bool = true);
     130  extern bool refs_may_alias_p_1 (ao_ref *, ao_ref *, bool);
     131  extern bool refs_anti_dependent_p (tree, tree);
     132  extern bool refs_output_dependent_p (tree, tree);
     133  extern bool ref_maybe_used_by_stmt_p (gimple *, tree, bool = true);
     134  extern bool ref_maybe_used_by_stmt_p (gimple *, ao_ref *, bool = true);
     135  extern bool stmt_may_clobber_global_p (gimple *, bool);
     136  extern bool stmt_may_clobber_ref_p (gimple *, tree, bool = true);
     137  extern bool stmt_may_clobber_ref_p_1 (gimple *, ao_ref *, bool = true);
     138  extern bool call_may_clobber_ref_p (gcall *, tree, bool = true);
     139  extern bool call_may_clobber_ref_p_1 (gcall *, ao_ref *, bool = true);
     140  extern bool stmt_kills_ref_p (gimple *, tree);
     141  extern bool stmt_kills_ref_p (gimple *, ao_ref *);
     142  enum translate_flags
     143    { TR_TRANSLATE, TR_VALUEIZE_AND_DISAMBIGUATE, TR_DISAMBIGUATE };
     144  extern tree get_continuation_for_phi (gimple *, ao_ref *, bool,
     145  				      unsigned int &, bitmap *, bool,
     146  				      void *(*)(ao_ref *, tree, void *,
     147  						translate_flags *),
     148  				      void *, translate_flags
     149  				        = TR_VALUEIZE_AND_DISAMBIGUATE);
     150  extern void *walk_non_aliased_vuses (ao_ref *, tree, bool,
     151  				     void *(*)(ao_ref *, tree, void *),
     152  				     void *(*)(ao_ref *, tree, void *,
     153  					       translate_flags *),
     154  				     tree (*)(tree), unsigned &, void *);
     155  extern int walk_aliased_vdefs (ao_ref *, tree,
     156  			       bool (*)(ao_ref *, tree, void *),
     157  			       void *, bitmap *,
     158  			       bool *function_entry_reached = NULL,
     159  			       unsigned int limit = 0);
     160  extern void dump_alias_info (FILE *);
     161  extern void debug_alias_info (void);
     162  extern void dump_points_to_solution (FILE *, struct pt_solution *);
     163  extern void debug (pt_solution &ref);
     164  extern void debug (pt_solution *ptr);
     165  extern void dump_points_to_info_for (FILE *, tree);
     166  extern void debug_points_to_info_for (tree);
     167  extern void dump_alias_stats (FILE *);
     168  
     169  
     170  /* In tree-ssa-structalias.cc  */
     171  extern unsigned int compute_may_aliases (void);
     172  extern bool pt_solution_empty_p (const pt_solution *);
     173  extern bool pt_solution_singleton_or_null_p (struct pt_solution *, unsigned *);
     174  extern bool pt_solution_includes_global (struct pt_solution *, bool);
     175  extern bool pt_solution_includes (struct pt_solution *, const_tree);
     176  extern bool pt_solutions_intersect (struct pt_solution *, struct pt_solution *);
     177  extern void pt_solution_reset (struct pt_solution *);
     178  extern void pt_solution_set (struct pt_solution *, bitmap, bool);
     179  extern void pt_solution_set_var (struct pt_solution *, tree);
     180  
     181  extern void dump_pta_stats (FILE *);
     182  
     183  extern GTY(()) struct pt_solution ipa_escaped_pt;
     184  
     185  /* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
     186     overlap.  SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
     187     range is open-ended.  Otherwise return false.  */
     188  
     189  inline bool
     190  ranges_overlap_p (HOST_WIDE_INT pos1,
     191  		  unsigned HOST_WIDE_INT size1,
     192  		  HOST_WIDE_INT pos2,
     193  		  unsigned HOST_WIDE_INT size2)
     194  {
     195    if (size1 == 0 || size2 == 0)
     196      return false;
     197    if (pos1 >= pos2
     198        && (size2 == (unsigned HOST_WIDE_INT)-1
     199  	  || pos1 < (pos2 + (HOST_WIDE_INT) size2)))
     200      return true;
     201    if (pos2 >= pos1
     202        && (size1 == (unsigned HOST_WIDE_INT)-1
     203  	  || pos2 < (pos1 + (HOST_WIDE_INT) size1)))
     204      return true;
     205  
     206    return false;
     207  }
     208  
     209  
     210  
     211  #endif /* TREE_SSA_ALIAS_H  */