110d565efSmrg /* Tree based alias analysis and alias oracle.
2*ec02198aSmrg    Copyright (C) 2008-2020 Free Software Foundation, Inc.
310d565efSmrg    Contributed by Richard Guenther  <rguenther@suse.de>
410d565efSmrg 
510d565efSmrg    This file is part of GCC.
610d565efSmrg 
710d565efSmrg    GCC is free software; you can redistribute it and/or modify
810d565efSmrg    under the terms of the GNU General Public License as published by
910d565efSmrg    the Free Software Foundation; either version 3 of the License, or
1010d565efSmrg    (at your option) any later version.
1110d565efSmrg 
1210d565efSmrg    GCC is distributed in the hope that it will be useful,
1310d565efSmrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
1410d565efSmrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1510d565efSmrg    GNU General Public License for more details.
1610d565efSmrg 
1710d565efSmrg    You should have received a copy of the GNU General Public License
1810d565efSmrg    along with GCC; see the file COPYING3.  If not see
1910d565efSmrg    <http://www.gnu.org/licenses/>.  */
2010d565efSmrg 
2110d565efSmrg #ifndef TREE_SSA_ALIAS_H
2210d565efSmrg #define TREE_SSA_ALIAS_H
2310d565efSmrg 
2410d565efSmrg /* The points-to solution.
2510d565efSmrg 
2610d565efSmrg    The points-to solution is a union of pt_vars and the abstract
2710d565efSmrg    sets specified by the flags.  */
2810d565efSmrg struct GTY(()) pt_solution
2910d565efSmrg {
3010d565efSmrg   /* Nonzero if points-to analysis couldn't determine where this pointer
3110d565efSmrg      is pointing to.  */
3210d565efSmrg   unsigned int anything : 1;
3310d565efSmrg 
3410d565efSmrg   /* Nonzero if the points-to set includes any global memory.  Note that
3510d565efSmrg      even if this is zero pt_vars can still include global variables.  */
3610d565efSmrg   unsigned int nonlocal : 1;
3710d565efSmrg 
3810d565efSmrg   /* Nonzero if the points-to set includes the local escaped solution by
3910d565efSmrg      reference.  */
4010d565efSmrg   unsigned int escaped : 1;
4110d565efSmrg 
4210d565efSmrg   /* Nonzero if the points-to set includes the IPA escaped solution by
4310d565efSmrg      reference.  */
4410d565efSmrg   unsigned int ipa_escaped : 1;
4510d565efSmrg 
4610d565efSmrg   /* Nonzero if the points-to set includes 'nothing', the points-to set
4710d565efSmrg      includes memory at address NULL.  */
4810d565efSmrg   unsigned int null : 1;
4910d565efSmrg 
5010d565efSmrg   /* Nonzero if the vars bitmap includes a variable included in 'nonlocal'.  */
5110d565efSmrg   unsigned int vars_contains_nonlocal : 1;
5210d565efSmrg   /* Nonzero if the vars bitmap includes a variable included in 'escaped'.  */
5310d565efSmrg   unsigned int vars_contains_escaped : 1;
5410d565efSmrg   /* Nonzero if the vars bitmap includes a anonymous heap variable that
5510d565efSmrg      escaped the function and thus became global.  */
5610d565efSmrg   unsigned int vars_contains_escaped_heap : 1;
5710d565efSmrg   /* Nonzero if the vars bitmap includes a anonymous variable used to
5810d565efSmrg      represent storage pointed to by a restrict qualified pointer.  */
5910d565efSmrg   unsigned int vars_contains_restrict : 1;
6010d565efSmrg   /* Nonzero if the vars bitmap includes an interposable variable.  */
6110d565efSmrg   unsigned int vars_contains_interposable : 1;
6210d565efSmrg 
6310d565efSmrg   /* Set of variables that this pointer may point to.  */
6410d565efSmrg   bitmap vars;
6510d565efSmrg };
6610d565efSmrg 
6710d565efSmrg 
6810d565efSmrg /* Simplified and cached information about a memory reference tree.
6910d565efSmrg    Used by the alias-oracle internally and externally in alternate
7010d565efSmrg    interfaces.  */
71*ec02198aSmrg class ao_ref
7210d565efSmrg {
73*ec02198aSmrg public:
7410d565efSmrg   /* The original full memory reference tree or NULL_TREE if that is
7510d565efSmrg      not available.  */
7610d565efSmrg   tree ref;
7710d565efSmrg 
7810d565efSmrg   /* The following fields are the decomposed reference as returned
7910d565efSmrg      by get_ref_base_and_extent.  */
8010d565efSmrg   /* The base object of the memory reference or NULL_TREE if all of
8110d565efSmrg      the following fields are not yet computed.  */
8210d565efSmrg   tree base;
8310d565efSmrg   /* The offset relative to the base.  */
84c7a68eb7Smrg   poly_int64 offset;
8510d565efSmrg   /* The size of the access.  */
86c7a68eb7Smrg   poly_int64 size;
8710d565efSmrg   /* The maximum possible extent of the access or -1 if unconstrained.  */
88c7a68eb7Smrg   poly_int64 max_size;
8910d565efSmrg 
9010d565efSmrg   /* The alias set of the access or -1 if not yet computed.  */
9110d565efSmrg   alias_set_type ref_alias_set;
9210d565efSmrg 
9310d565efSmrg   /* The alias set of the base object or -1 if not yet computed.  */
9410d565efSmrg   alias_set_type base_alias_set;
9510d565efSmrg 
9610d565efSmrg   /* Whether the memory is considered a volatile access.  */
9710d565efSmrg   bool volatile_p;
98c7a68eb7Smrg 
99c7a68eb7Smrg   bool max_size_known_p () const;
10010d565efSmrg };
10110d565efSmrg 
102c7a68eb7Smrg /* Return true if the maximum size is known, rather than the special -1
103c7a68eb7Smrg    marker.  */
104c7a68eb7Smrg 
105c7a68eb7Smrg inline bool
max_size_known_p()106c7a68eb7Smrg ao_ref::max_size_known_p () const
107c7a68eb7Smrg {
108c7a68eb7Smrg   return known_size_p (max_size);
109c7a68eb7Smrg }
11010d565efSmrg 
11110d565efSmrg /* In tree-ssa-alias.c  */
11210d565efSmrg extern void ao_ref_init (ao_ref *, tree);
11310d565efSmrg extern void ao_ref_init_from_ptr_and_size (ao_ref *, tree, tree);
11410d565efSmrg extern tree ao_ref_base (ao_ref *);
11510d565efSmrg extern alias_set_type ao_ref_alias_set (ao_ref *);
11610d565efSmrg extern alias_set_type ao_ref_base_alias_set (ao_ref *);
11710d565efSmrg extern bool ptr_deref_may_alias_global_p (tree);
11810d565efSmrg extern bool ptr_derefs_may_alias_p (tree, tree);
11910d565efSmrg extern bool ptrs_compare_unequal (tree, tree);
12010d565efSmrg extern bool ref_may_alias_global_p (tree);
12110d565efSmrg extern bool ref_may_alias_global_p (ao_ref *);
1220fc04c29Smrg extern bool refs_may_alias_p (tree, tree, bool = true);
12310d565efSmrg extern bool refs_may_alias_p_1 (ao_ref *, ao_ref *, bool);
12410d565efSmrg extern bool refs_anti_dependent_p (tree, tree);
12510d565efSmrg extern bool refs_output_dependent_p (tree, tree);
1260fc04c29Smrg extern bool ref_maybe_used_by_stmt_p (gimple *, tree, bool = true);
1270fc04c29Smrg extern bool ref_maybe_used_by_stmt_p (gimple *, ao_ref *, bool = true);
12810d565efSmrg extern bool stmt_may_clobber_global_p (gimple *);
1290fc04c29Smrg extern bool stmt_may_clobber_ref_p (gimple *, tree, bool = true);
1300fc04c29Smrg extern bool stmt_may_clobber_ref_p_1 (gimple *, ao_ref *, bool = true);
13110d565efSmrg extern bool call_may_clobber_ref_p (gcall *, tree);
13210d565efSmrg extern bool call_may_clobber_ref_p_1 (gcall *, ao_ref *);
13310d565efSmrg extern bool stmt_kills_ref_p (gimple *, tree);
13410d565efSmrg extern bool stmt_kills_ref_p (gimple *, ao_ref *);
135*ec02198aSmrg enum translate_flags
136*ec02198aSmrg   { TR_TRANSLATE, TR_VALUEIZE_AND_DISAMBIGUATE, TR_DISAMBIGUATE };
1370fc04c29Smrg extern tree get_continuation_for_phi (gimple *, ao_ref *, bool,
1380fc04c29Smrg 				      unsigned int &, bitmap *, bool,
139*ec02198aSmrg 				      void *(*)(ao_ref *, tree, void *,
140*ec02198aSmrg 						translate_flags *),
141*ec02198aSmrg 				      void *, translate_flags
142*ec02198aSmrg 				        = TR_VALUEIZE_AND_DISAMBIGUATE);
1430fc04c29Smrg extern void *walk_non_aliased_vuses (ao_ref *, tree, bool,
1440fc04c29Smrg 				     void *(*)(ao_ref *, tree, void *),
145*ec02198aSmrg 				     void *(*)(ao_ref *, tree, void *,
146*ec02198aSmrg 					       translate_flags *),
1470fc04c29Smrg 				     tree (*)(tree), unsigned &, void *);
14810d565efSmrg extern int walk_aliased_vdefs (ao_ref *, tree,
14910d565efSmrg 			       bool (*)(ao_ref *, tree, void *),
15010d565efSmrg 			       void *, bitmap *,
15110d565efSmrg 			       bool *function_entry_reached = NULL,
15210d565efSmrg 			       unsigned int limit = 0);
15310d565efSmrg extern void dump_alias_info (FILE *);
15410d565efSmrg extern void debug_alias_info (void);
15510d565efSmrg extern void dump_points_to_solution (FILE *, struct pt_solution *);
15610d565efSmrg extern void debug (pt_solution &ref);
15710d565efSmrg extern void debug (pt_solution *ptr);
15810d565efSmrg extern void dump_points_to_info_for (FILE *, tree);
15910d565efSmrg extern void debug_points_to_info_for (tree);
16010d565efSmrg extern void dump_alias_stats (FILE *);
16110d565efSmrg 
16210d565efSmrg 
16310d565efSmrg /* In tree-ssa-structalias.c  */
16410d565efSmrg extern unsigned int compute_may_aliases (void);
165*ec02198aSmrg extern bool pt_solution_empty_p (const pt_solution *);
16610d565efSmrg extern bool pt_solution_singleton_or_null_p (struct pt_solution *, unsigned *);
16710d565efSmrg extern bool pt_solution_includes_global (struct pt_solution *);
16810d565efSmrg extern bool pt_solution_includes (struct pt_solution *, const_tree);
16910d565efSmrg extern bool pt_solutions_intersect (struct pt_solution *, struct pt_solution *);
17010d565efSmrg extern void pt_solution_reset (struct pt_solution *);
17110d565efSmrg extern void pt_solution_set (struct pt_solution *, bitmap, bool);
17210d565efSmrg extern void pt_solution_set_var (struct pt_solution *, tree);
17310d565efSmrg 
17410d565efSmrg extern void dump_pta_stats (FILE *);
17510d565efSmrg 
17610d565efSmrg extern GTY(()) struct pt_solution ipa_escaped_pt;
17710d565efSmrg 
17810d565efSmrg /* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
17910d565efSmrg    overlap.  SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
18010d565efSmrg    range is open-ended.  Otherwise return false.  */
18110d565efSmrg 
18210d565efSmrg static inline bool
ranges_overlap_p(HOST_WIDE_INT pos1,unsigned HOST_WIDE_INT size1,HOST_WIDE_INT pos2,unsigned HOST_WIDE_INT size2)18310d565efSmrg ranges_overlap_p (HOST_WIDE_INT pos1,
18410d565efSmrg 		  unsigned HOST_WIDE_INT size1,
18510d565efSmrg 		  HOST_WIDE_INT pos2,
18610d565efSmrg 		  unsigned HOST_WIDE_INT size2)
18710d565efSmrg {
188c7a68eb7Smrg   if (size1 == 0 || size2 == 0)
189c7a68eb7Smrg     return false;
19010d565efSmrg   if (pos1 >= pos2
19110d565efSmrg       && (size2 == (unsigned HOST_WIDE_INT)-1
19210d565efSmrg 	  || pos1 < (pos2 + (HOST_WIDE_INT) size2)))
19310d565efSmrg     return true;
19410d565efSmrg   if (pos2 >= pos1
19510d565efSmrg       && (size1 == (unsigned HOST_WIDE_INT)-1
19610d565efSmrg 	  || pos2 < (pos1 + (HOST_WIDE_INT) size1)))
19710d565efSmrg     return true;
19810d565efSmrg 
19910d565efSmrg   return false;
20010d565efSmrg }
20110d565efSmrg 
20210d565efSmrg 
20310d565efSmrg 
20410d565efSmrg #endif /* TREE_SSA_ALIAS_H  */
205