Branch data Line data Source code
1 : : /* Tree based alias analysis and alias oracle.
2 : : Copyright (C) 2008-2024 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 : 929474919 : ao_ref::max_size_known_p () const
107 : : {
108 : 932318779 : 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 : 2841238 : 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 : 2841238 : if (size1 == 0 || size2 == 0)
196 : : return false;
197 : 2841212 : if (pos1 >= pos2
198 : 2839702 : && (size2 == (unsigned HOST_WIDE_INT)-1
199 : 2839702 : || pos1 < (pos2 + (HOST_WIDE_INT) size2)))
200 : : return true;
201 : 1071566 : if (pos2 >= pos1
202 : 1510 : && (size1 == (unsigned HOST_WIDE_INT)-1
203 : 1510 : || pos2 < (pos1 + (HOST_WIDE_INT) size1)))
204 : 1504 : return true;
205 : :
206 : : return false;
207 : : }
208 : :
209 : :
210 : :
211 : : #endif /* TREE_SSA_ALIAS_H */
|