Branch data Line data Source code
1 : : /* Alias analysis for GNU C
2 : : Copyright (C) 1997-2024 Free Software Foundation, Inc.
3 : : Contributed by John Carr (jfc@mit.edu).
4 : :
5 : : This file is part of GCC.
6 : :
7 : : GCC is free software; you can redistribute it and/or modify it under
8 : : the terms of the GNU General Public License as published by the Free
9 : : Software Foundation; either version 3, or (at your option) any later
10 : : version.
11 : :
12 : : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 : : WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 : : 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 : : #include "config.h"
22 : : #include "system.h"
23 : : #include "coretypes.h"
24 : : #include "backend.h"
25 : : #include "target.h"
26 : : #include "rtl.h"
27 : : #include "tree.h"
28 : : #include "gimple.h"
29 : : #include "df.h"
30 : : #include "memmodel.h"
31 : : #include "tm_p.h"
32 : : #include "gimple-ssa.h"
33 : : #include "emit-rtl.h"
34 : : #include "alias.h"
35 : : #include "fold-const.h"
36 : : #include "varasm.h"
37 : : #include "cselib.h"
38 : : #include "langhooks.h"
39 : : #include "cfganal.h"
40 : : #include "rtl-iter.h"
41 : : #include "cgraph.h"
42 : : #include "ipa-utils.h"
43 : :
44 : : /* The aliasing API provided here solves related but different problems:
45 : :
46 : : Say there exists (in c)
47 : :
48 : : struct X {
49 : : struct Y y1;
50 : : struct Z z2;
51 : : } x1, *px1, *px2;
52 : :
53 : : struct Y y2, *py;
54 : : struct Z z2, *pz;
55 : :
56 : :
57 : : py = &x1.y1;
58 : : px2 = &x1;
59 : :
60 : : Consider the four questions:
61 : :
62 : : Can a store to x1 interfere with px2->y1?
63 : : Can a store to x1 interfere with px2->z2?
64 : : Can a store to x1 change the value pointed to by with py?
65 : : Can a store to x1 change the value pointed to by with pz?
66 : :
67 : : The answer to these questions can be yes, yes, yes, and maybe.
68 : :
69 : : The first two questions can be answered with a simple examination
70 : : of the type system. If structure X contains a field of type Y then
71 : : a store through a pointer to an X can overwrite any field that is
72 : : contained (recursively) in an X (unless we know that px1 != px2).
73 : :
74 : : The last two questions can be solved in the same way as the first
75 : : two questions but this is too conservative. The observation is
76 : : that in some cases we can know which (if any) fields are addressed
77 : : and if those addresses are used in bad ways. This analysis may be
78 : : language specific. In C, arbitrary operations may be applied to
79 : : pointers. However, there is some indication that this may be too
80 : : conservative for some C++ types.
81 : :
82 : : The pass ipa-type-escape does this analysis for the types whose
83 : : instances do not escape across the compilation boundary.
84 : :
85 : : Historically in GCC, these two problems were combined and a single
86 : : data structure that was used to represent the solution to these
87 : : problems. We now have two similar but different data structures,
88 : : The data structure to solve the last two questions is similar to
89 : : the first, but does not contain the fields whose address are never
90 : : taken. For types that do escape the compilation unit, the data
91 : : structures will have identical information.
92 : : */
93 : :
94 : : /* The alias sets assigned to MEMs assist the back-end in determining
95 : : which MEMs can alias which other MEMs. In general, two MEMs in
96 : : different alias sets cannot alias each other, with one important
97 : : exception. Consider something like:
98 : :
99 : : struct S { int i; double d; };
100 : :
101 : : a store to an `S' can alias something of either type `int' or type
102 : : `double'. (However, a store to an `int' cannot alias a `double'
103 : : and vice versa.) We indicate this via a tree structure that looks
104 : : like:
105 : : struct S
106 : : / \
107 : : / \
108 : : |/_ _\|
109 : : int double
110 : :
111 : : (The arrows are directed and point downwards.)
112 : : In this situation we say the alias set for `struct S' is the
113 : : `superset' and that those for `int' and `double' are `subsets'.
114 : :
115 : : To see whether two alias sets can point to the same memory, we must
116 : : see if either alias set is a subset of the other. We need not trace
117 : : past immediate descendants, however, since we propagate all
118 : : grandchildren up one level.
119 : :
120 : : Alias set zero is implicitly a superset of all other alias sets.
121 : : However, this is no actual entry for alias set zero. It is an
122 : : error to attempt to explicitly construct a subset of zero. */
123 : :
124 : : struct alias_set_hash : int_hash <int, INT_MIN, INT_MIN + 1> {};
125 : :
126 : : struct GTY(()) alias_set_entry {
127 : : /* The alias set number, as stored in MEM_ALIAS_SET. */
128 : : alias_set_type alias_set;
129 : :
130 : : /* Nonzero if would have a child of zero: this effectively makes this
131 : : alias set the same as alias set zero. */
132 : : bool has_zero_child;
133 : : /* Nonzero if alias set corresponds to pointer type itself (i.e. not to
134 : : aggregate contaiing pointer.
135 : : This is used for a special case where we need an universal pointer type
136 : : compatible with all other pointer types. */
137 : : bool is_pointer;
138 : : /* Nonzero if is_pointer or if one of childs have has_pointer set. */
139 : : bool has_pointer;
140 : :
141 : : /* The children of the alias set. These are not just the immediate
142 : : children, but, in fact, all descendants. So, if we have:
143 : :
144 : : struct T { struct S s; float f; }
145 : :
146 : : continuing our example above, the children here will be all of
147 : : `int', `double', `float', and `struct S'. */
148 : : hash_map<alias_set_hash, int> *children;
149 : : };
150 : :
151 : : static int compare_base_symbol_refs (const_rtx, const_rtx,
152 : : HOST_WIDE_INT * = NULL);
153 : :
154 : : /* Query statistics for the different low-level disambiguators.
155 : : A high-level query may trigger multiple of them. */
156 : :
157 : : static struct {
158 : : unsigned long long num_alias_zero;
159 : : unsigned long long num_same_alias_set;
160 : : unsigned long long num_same_objects;
161 : : unsigned long long num_volatile;
162 : : unsigned long long num_dag;
163 : : unsigned long long num_universal;
164 : : unsigned long long num_disambiguated;
165 : : } alias_stats;
166 : :
167 : :
168 : : /* Set up all info needed to perform alias analysis on memory references. */
169 : :
170 : : /* Returns the size in bytes of the mode of X. */
171 : : #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
172 : :
173 : : /* Cap the number of passes we make over the insns propagating alias
174 : : information through set chains.
175 : : ??? 10 is a completely arbitrary choice. This should be based on the
176 : : maximum loop depth in the CFG, but we do not have this information
177 : : available (even if current_loops _is_ available). */
178 : : #define MAX_ALIAS_LOOP_PASSES 10
179 : :
180 : : /* reg_base_value[N] gives an address to which register N is related.
181 : : If all sets after the first add or subtract to the current value
182 : : or otherwise modify it so it does not point to a different top level
183 : : object, reg_base_value[N] is equal to the address part of the source
184 : : of the first set.
185 : :
186 : : A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF. ADDRESS
187 : : expressions represent three types of base:
188 : :
189 : : 1. incoming arguments. There is just one ADDRESS to represent all
190 : : arguments, since we do not know at this level whether accesses
191 : : based on different arguments can alias. The ADDRESS has id 0.
192 : :
193 : : 2. stack_pointer_rtx, frame_pointer_rtx, hard_frame_pointer_rtx
194 : : (if distinct from frame_pointer_rtx) and arg_pointer_rtx.
195 : : Each of these rtxes has a separate ADDRESS associated with it,
196 : : each with a negative id.
197 : :
198 : : GCC is (and is required to be) precise in which register it
199 : : chooses to access a particular region of stack. We can therefore
200 : : assume that accesses based on one of these rtxes do not alias
201 : : accesses based on another of these rtxes.
202 : :
203 : : 3. bases that are derived from malloc()ed memory (REG_NOALIAS).
204 : : Each such piece of memory has a separate ADDRESS associated
205 : : with it, each with an id greater than 0.
206 : :
207 : : Accesses based on one ADDRESS do not alias accesses based on other
208 : : ADDRESSes. Accesses based on ADDRESSes in groups (2) and (3) do not
209 : : alias globals either; the ADDRESSes have Pmode to indicate this.
210 : : The ADDRESS in group (1) _may_ alias globals; it has VOIDmode to
211 : : indicate this. */
212 : :
213 : : static GTY(()) vec<rtx, va_gc> *reg_base_value;
214 : : static rtx *new_reg_base_value;
215 : :
216 : : /* The single VOIDmode ADDRESS that represents all argument bases.
217 : : It has id 0. */
218 : : static GTY(()) rtx arg_base_value;
219 : :
220 : : /* Used to allocate unique ids to each REG_NOALIAS ADDRESS. */
221 : : static int unique_id;
222 : :
223 : : /* We preserve the copy of old array around to avoid amount of garbage
224 : : produced. About 8% of garbage produced were attributed to this
225 : : array. */
226 : : static GTY((deletable)) vec<rtx, va_gc> *old_reg_base_value;
227 : :
228 : : /* Values of XINT (address, 0) of Pmode ADDRESS rtxes for special
229 : : registers. */
230 : : #define UNIQUE_BASE_VALUE_SP -1
231 : : #define UNIQUE_BASE_VALUE_ARGP -2
232 : : #define UNIQUE_BASE_VALUE_FP -3
233 : : #define UNIQUE_BASE_VALUE_HFP -4
234 : :
235 : : #define static_reg_base_value \
236 : : (this_target_rtl->x_static_reg_base_value)
237 : :
238 : : #define REG_BASE_VALUE(X) \
239 : : (REGNO (X) < vec_safe_length (reg_base_value) \
240 : : ? (*reg_base_value)[REGNO (X)] : 0)
241 : :
242 : : /* Vector indexed by N giving the initial (unchanging) value known for
243 : : pseudo-register N. This vector is initialized in init_alias_analysis,
244 : : and does not change until end_alias_analysis is called. */
245 : : static GTY(()) vec<rtx, va_gc> *reg_known_value;
246 : :
247 : : /* Vector recording for each reg_known_value whether it is due to a
248 : : REG_EQUIV note. Future passes (viz., reload) may replace the
249 : : pseudo with the equivalent expression and so we account for the
250 : : dependences that would be introduced if that happens.
251 : :
252 : : The REG_EQUIV notes created in assign_parms may mention the arg
253 : : pointer, and there are explicit insns in the RTL that modify the
254 : : arg pointer. Thus we must ensure that such insns don't get
255 : : scheduled across each other because that would invalidate the
256 : : REG_EQUIV notes. One could argue that the REG_EQUIV notes are
257 : : wrong, but solving the problem in the scheduler will likely give
258 : : better code, so we do it here. */
259 : : static sbitmap reg_known_equiv_p;
260 : :
261 : : /* True when scanning insns from the start of the rtl to the
262 : : NOTE_INSN_FUNCTION_BEG note. */
263 : : static bool copying_arguments;
264 : :
265 : :
266 : : /* The splay-tree used to store the various alias set entries. */
267 : : static GTY (()) vec<alias_set_entry *, va_gc> *alias_sets;
268 : :
269 : : /* Build a decomposed reference object for querying the alias-oracle
270 : : from the MEM rtx and store it in *REF.
271 : : Returns false if MEM is not suitable for the alias-oracle. */
272 : :
273 : : static bool
274 : 409888004 : ao_ref_from_mem (ao_ref *ref, const_rtx mem)
275 : : {
276 : 409888004 : tree expr = MEM_EXPR (mem);
277 : 409888004 : tree base;
278 : :
279 : 409888004 : if (!expr)
280 : : return false;
281 : :
282 : 381045404 : ao_ref_init (ref, expr);
283 : :
284 : : /* Get the base of the reference and see if we have to reject or
285 : : adjust it. */
286 : 381045404 : base = ao_ref_base (ref);
287 : 381045404 : if (base == NULL_TREE)
288 : : return false;
289 : :
290 : : /* The tree oracle doesn't like bases that are neither decls
291 : : nor indirect references of SSA names. */
292 : 407008682 : if (!(DECL_P (base)
293 : 205335146 : || (TREE_CODE (base) == MEM_REF
294 : 179487420 : && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
295 : : || (TREE_CODE (base) == TARGET_MEM_REF
296 : 25817646 : && TREE_CODE (TMR_BASE (base)) == SSA_NAME)))
297 : : return false;
298 : :
299 : 380899339 : ref->ref_alias_set = MEM_ALIAS_SET (mem);
300 : :
301 : : /* If MEM_OFFSET or MEM_SIZE are unknown what we got from MEM_EXPR
302 : : is conservative, so trust it. */
303 : 380899339 : if (!MEM_OFFSET_KNOWN_P (mem)
304 : 380899339 : || !MEM_SIZE_KNOWN_P (mem))
305 : : return true;
306 : :
307 : : /* If MEM_OFFSET/MEM_SIZE get us outside of ref->offset/ref->max_size
308 : : drop ref->ref. */
309 : 374589418 : if (maybe_lt (MEM_OFFSET (mem), 0)
310 : 374589418 : || (ref->max_size_known_p ()
311 : 336390473 : && maybe_gt ((MEM_OFFSET (mem) + MEM_SIZE (mem)) * BITS_PER_UNIT,
312 : : ref->max_size)))
313 : 36333373 : ref->ref = NULL_TREE;
314 : :
315 : : /* Refine size and offset we got from analyzing MEM_EXPR by using
316 : : MEM_SIZE and MEM_OFFSET. */
317 : :
318 : 374589418 : ref->offset += MEM_OFFSET (mem) * BITS_PER_UNIT;
319 : 374589418 : ref->size = MEM_SIZE (mem) * BITS_PER_UNIT;
320 : :
321 : : /* The MEM may extend into adjacent fields, so adjust max_size if
322 : : necessary. */
323 : 374589418 : if (ref->max_size_known_p ())
324 : 336390518 : ref->max_size = upper_bound (ref->max_size, ref->size);
325 : :
326 : : /* If MEM_OFFSET and MEM_SIZE might get us outside of the base object of
327 : : the MEM_EXPR punt. This happens for STRICT_ALIGNMENT targets a lot. */
328 : 374589418 : if (MEM_EXPR (mem) != get_spill_slot_decl (false)
329 : 374589418 : && (maybe_lt (ref->offset, 0)
330 : 338328189 : || (DECL_P (ref->base)
331 : 134084070 : && (DECL_SIZE (ref->base) == NULL_TREE
332 : 133970416 : || !poly_int_tree_p (DECL_SIZE (ref->base))
333 : 133970366 : || maybe_lt (wi::to_poly_offset (DECL_SIZE (ref->base)),
334 : 508434570 : ref->offset + ref->size)))))
335 : 125214 : return false;
336 : :
337 : : return true;
338 : : }
339 : :
340 : : /* Query the alias-oracle on whether the two memory rtx X and MEM may
341 : : alias. If TBAA_P is set also apply TBAA. Returns true if the
342 : : two rtxen may alias, false otherwise. */
343 : :
344 : : static bool
345 : 211813680 : rtx_refs_may_alias_p (const_rtx x, const_rtx mem, bool tbaa_p)
346 : : {
347 : 211813680 : ao_ref ref1, ref2;
348 : :
349 : 211813680 : if (!ao_ref_from_mem (&ref1, x)
350 : 211813680 : || !ao_ref_from_mem (&ref2, mem))
351 : 29113879 : return true;
352 : :
353 : 182699801 : return refs_may_alias_p_1 (&ref1, &ref2,
354 : : tbaa_p
355 : 134515094 : && MEM_ALIAS_SET (x) != 0
356 : 447497775 : && MEM_ALIAS_SET (mem) != 0);
357 : : }
358 : :
359 : : /* Return true if the ref EARLIER behaves the same as LATER with respect
360 : : to TBAA for every memory reference that might follow LATER. */
361 : :
362 : : bool
363 : 176994 : refs_same_for_tbaa_p (tree earlier, tree later)
364 : : {
365 : 176994 : ao_ref earlier_ref, later_ref;
366 : 176994 : ao_ref_init (&earlier_ref, earlier);
367 : 176994 : ao_ref_init (&later_ref, later);
368 : 176994 : alias_set_type earlier_set = ao_ref_alias_set (&earlier_ref);
369 : 176994 : alias_set_type later_set = ao_ref_alias_set (&later_ref);
370 : 214544 : if (!(earlier_set == later_set
371 : 37550 : || alias_set_subset_of (later_set, earlier_set)))
372 : : return false;
373 : 176654 : alias_set_type later_base_set = ao_ref_base_alias_set (&later_ref);
374 : 176654 : alias_set_type earlier_base_set = ao_ref_base_alias_set (&earlier_ref);
375 : 176654 : return (earlier_base_set == later_base_set
376 : 176654 : || alias_set_subset_of (later_base_set, earlier_base_set));
377 : : }
378 : :
379 : : /* Similar to refs_same_for_tbaa_p() but for use on MEM rtxs. */
380 : : bool
381 : 107678 : mems_same_for_tbaa_p (rtx earlier, rtx later)
382 : : {
383 : 107678 : gcc_assert (MEM_P (earlier));
384 : 107678 : gcc_assert (MEM_P (later));
385 : :
386 : 107679 : return ((MEM_ALIAS_SET (earlier) == MEM_ALIAS_SET (later)
387 : 36628 : || alias_set_subset_of (MEM_ALIAS_SET (later),
388 : 36628 : MEM_ALIAS_SET (earlier)))
389 : 213760 : && (!MEM_EXPR (earlier)
390 : 105388 : || refs_same_for_tbaa_p (MEM_EXPR (earlier), MEM_EXPR (later))));
391 : : }
392 : :
393 : : /* Returns a pointer to the alias set entry for ALIAS_SET, if there is
394 : : such an entry, or NULL otherwise. */
395 : :
396 : : static inline alias_set_entry *
397 : 225886140 : get_alias_set_entry (alias_set_type alias_set)
398 : : {
399 : 451772280 : return (*alias_sets)[alias_set];
400 : : }
401 : :
402 : : /* Returns true if the alias sets for MEM1 and MEM2 are such that
403 : : the two MEMs cannot alias each other. */
404 : :
405 : : static inline bool
406 : 217050697 : mems_in_disjoint_alias_sets_p (const_rtx mem1, const_rtx mem2)
407 : : {
408 : 217050697 : return (flag_strict_aliasing
409 : 347078452 : && ! alias_sets_conflict_p (MEM_ALIAS_SET (mem1),
410 : 130027755 : MEM_ALIAS_SET (mem2)));
411 : : }
412 : :
413 : : /* Return true if the first alias set is a subset of the second. */
414 : :
415 : : bool
416 : 291156 : alias_set_subset_of (alias_set_type set1, alias_set_type set2)
417 : : {
418 : 291156 : alias_set_entry *ase2;
419 : :
420 : : /* Disable TBAA oracle with !flag_strict_aliasing. */
421 : 291156 : if (!flag_strict_aliasing)
422 : : return true;
423 : :
424 : : /* Everything is a subset of the "aliases everything" set. */
425 : 203024 : if (set2 == 0)
426 : : return true;
427 : :
428 : : /* Check if set1 is a subset of set2. */
429 : 180685 : ase2 = get_alias_set_entry (set2);
430 : 180685 : if (ase2 != 0
431 : 180685 : && (ase2->has_zero_child
432 : 143936 : || (ase2->children && ase2->children->get (set1))))
433 : 145110 : return true;
434 : :
435 : : /* As a special case we consider alias set of "void *" to be both subset
436 : : and superset of every alias set of a pointer. This extra symmetry does
437 : : not matter for alias_sets_conflict_p but it makes aliasing_component_refs_p
438 : : to return true on the following testcase:
439 : :
440 : : void *ptr;
441 : : char **ptr2=(char **)&ptr;
442 : : *ptr2 = ...
443 : :
444 : : Additionally if a set contains universal pointer, we consider every pointer
445 : : to be a subset of it, but we do not represent this explicitely - doing so
446 : : would require us to update transitive closure each time we introduce new
447 : : pointer type. This makes aliasing_component_refs_p to return true
448 : : on the following testcase:
449 : :
450 : : struct a {void *ptr;}
451 : : char **ptr = (char **)&a.ptr;
452 : : ptr = ...
453 : :
454 : : This makes void * truly universal pointer type. See pointer handling in
455 : : get_alias_set for more details. */
456 : 35575 : if (ase2 && ase2->has_pointer)
457 : : {
458 : 25251 : alias_set_entry *ase1 = get_alias_set_entry (set1);
459 : :
460 : 25251 : if (ase1 && ase1->is_pointer)
461 : : {
462 : 10191 : alias_set_type voidptr_set = TYPE_ALIAS_SET (ptr_type_node);
463 : : /* If one is ptr_type_node and other is pointer, then we consider
464 : : them subset of each other. */
465 : 10191 : if (set1 == voidptr_set || set2 == voidptr_set)
466 : 9897 : return true;
467 : : /* If SET2 contains universal pointer's alias set, then we consdier
468 : : every (non-universal) pointer. */
469 : 9644 : if (ase2->children && set1 != voidptr_set
470 : 9644 : && ase2->children->get (voidptr_set))
471 : : return true;
472 : : }
473 : : }
474 : : return false;
475 : : }
476 : :
477 : : /* Return true if the two specified alias sets may conflict. */
478 : :
479 : : bool
480 : 252179029 : alias_sets_conflict_p (alias_set_type set1, alias_set_type set2)
481 : : {
482 : 252179029 : alias_set_entry *ase1;
483 : 252179029 : alias_set_entry *ase2;
484 : :
485 : : /* The easy case. */
486 : 252179029 : if (alias_sets_must_conflict_p (set1, set2))
487 : : return true;
488 : :
489 : : /* See if the first alias set is a subset of the second. */
490 : 112845195 : ase1 = get_alias_set_entry (set1);
491 : 112845195 : if (ase1 != 0
492 : 112845195 : && ase1->children && ase1->children->get (set2))
493 : : {
494 : 4915101 : ++alias_stats.num_dag;
495 : 4915101 : return true;
496 : : }
497 : :
498 : : /* Now do the same, but with the alias sets reversed. */
499 : 107930094 : ase2 = get_alias_set_entry (set2);
500 : 107930094 : if (ase2 != 0
501 : 107930094 : && ase2->children && ase2->children->get (set1))
502 : : {
503 : 6349113 : ++alias_stats.num_dag;
504 : 6349113 : return true;
505 : : }
506 : :
507 : : /* We want void * to be compatible with any other pointer without
508 : : really dropping it to alias set 0. Doing so would make it
509 : : compatible with all non-pointer types too.
510 : :
511 : : This is not strictly necessary by the C/C++ language
512 : : standards, but avoids common type punning mistakes. In
513 : : addition to that, we need the existence of such universal
514 : : pointer to implement Fortran's C_PTR type (which is defined as
515 : : type compatible with all C pointers). */
516 : 101580981 : if (ase1 && ase2 && ase1->has_pointer && ase2->has_pointer)
517 : : {
518 : 14440128 : alias_set_type voidptr_set = TYPE_ALIAS_SET (ptr_type_node);
519 : :
520 : : /* If one of the sets corresponds to universal pointer,
521 : : we consider it to conflict with anything that is
522 : : or contains pointer. */
523 : 14440128 : if (set1 == voidptr_set || set2 == voidptr_set)
524 : : {
525 : 3403764 : ++alias_stats.num_universal;
526 : 4011411 : return true;
527 : : }
528 : : /* If one of sets is (non-universal) pointer and the other
529 : : contains universal pointer, we also get conflict. */
530 : 11036364 : if (ase1->is_pointer && set2 != voidptr_set
531 : 11036364 : && ase2->children && ase2->children->get (voidptr_set))
532 : : {
533 : 482359 : ++alias_stats.num_universal;
534 : 482359 : return true;
535 : : }
536 : 10554005 : if (ase2->is_pointer && set1 != voidptr_set
537 : 10554005 : && ase1->children && ase1->children->get (voidptr_set))
538 : : {
539 : 125288 : ++alias_stats.num_universal;
540 : 125288 : return true;
541 : : }
542 : : }
543 : :
544 : 97569570 : ++alias_stats.num_disambiguated;
545 : :
546 : : /* The two alias sets are distinct and neither one is the
547 : : child of the other. Therefore, they cannot conflict. */
548 : 97569570 : return false;
549 : : }
550 : :
551 : : /* Return true if the two specified alias sets will always conflict. */
552 : :
553 : : bool
554 : 252194725 : alias_sets_must_conflict_p (alias_set_type set1, alias_set_type set2)
555 : : {
556 : : /* Disable TBAA oracle with !flag_strict_aliasing. */
557 : 252194725 : if (!flag_strict_aliasing)
558 : : return true;
559 : 247391791 : if (set1 == 0 || set2 == 0)
560 : : {
561 : 82048514 : ++alias_stats.num_alias_zero;
562 : 82048514 : return true;
563 : : }
564 : 165343277 : if (set1 == set2)
565 : : {
566 : 52497126 : ++alias_stats.num_same_alias_set;
567 : 52497126 : return true;
568 : : }
569 : :
570 : : return false;
571 : : }
572 : :
573 : : /* Return true if any MEM object of type T1 will always conflict (using the
574 : : dependency routines in this file) with any MEM object of type T2.
575 : : This is used when allocating temporary storage. If T1 and/or T2 are
576 : : NULL_TREE, it means we know nothing about the storage. */
577 : :
578 : : bool
579 : 226693 : objects_must_conflict_p (tree t1, tree t2)
580 : : {
581 : 226693 : alias_set_type set1, set2;
582 : :
583 : : /* If neither has a type specified, we don't know if they'll conflict
584 : : because we may be using them to store objects of various types, for
585 : : example the argument and local variables areas of inlined functions. */
586 : 226693 : if (t1 == 0 && t2 == 0)
587 : : return false;
588 : :
589 : : /* If they are the same type, they must conflict. */
590 : 59693 : if (t1 == t2)
591 : : {
592 : 44030 : ++alias_stats.num_same_objects;
593 : 44030 : return true;
594 : : }
595 : : /* Likewise if both are volatile. */
596 : 15663 : if (t1 != 0 && TYPE_VOLATILE (t1) && t2 != 0 && TYPE_VOLATILE (t2))
597 : : {
598 : 0 : ++alias_stats.num_volatile;
599 : 0 : return true;
600 : : }
601 : :
602 : 15663 : set1 = t1 ? get_alias_set (t1) : 0;
603 : 15663 : set2 = t2 ? get_alias_set (t2) : 0;
604 : :
605 : : /* We can't use alias_sets_conflict_p because we must make sure
606 : : that every subtype of t1 will conflict with every subtype of
607 : : t2 for which a pair of subobjects of these respective subtypes
608 : : overlaps on the stack. */
609 : 15663 : return alias_sets_must_conflict_p (set1, set2);
610 : : }
611 : :
612 : : /* Return true if T is an end of the access path which can be used
613 : : by type based alias oracle. */
614 : :
615 : : bool
616 : 450625650 : ends_tbaa_access_path_p (const_tree t)
617 : : {
618 : 450625650 : switch (TREE_CODE (t))
619 : : {
620 : 336527411 : case COMPONENT_REF:
621 : 336527411 : if (DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1)))
622 : : return true;
623 : : /* Permit type-punning when accessing a union, provided the access
624 : : is directly through the union. For example, this code does not
625 : : permit taking the address of a union member and then storing
626 : : through it. Even the type-punning allowed here is a GCC
627 : : extension, albeit a common and useful one; the C standard says
628 : : that such accesses have implementation-defined behavior. */
629 : 333386207 : else if (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == UNION_TYPE)
630 : : return true;
631 : : break;
632 : :
633 : 109448930 : case ARRAY_REF:
634 : 109448930 : case ARRAY_RANGE_REF:
635 : 109448930 : if (TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0))))
636 : : return true;
637 : : break;
638 : :
639 : : case REALPART_EXPR:
640 : : case IMAGPART_EXPR:
641 : : break;
642 : :
643 : : case BIT_FIELD_REF:
644 : : case VIEW_CONVERT_EXPR:
645 : : /* Bitfields and casts are never addressable. */
646 : : return true;
647 : 0 : break;
648 : :
649 : 0 : default:
650 : 0 : gcc_unreachable ();
651 : : }
652 : : return false;
653 : : }
654 : :
655 : : /* Return the outermost parent of component present in the chain of
656 : : component references handled by get_inner_reference in T with the
657 : : following property:
658 : : - the component is non-addressable
659 : : or NULL_TREE if no such parent exists. In the former cases, the alias
660 : : set of this parent is the alias set that must be used for T itself. */
661 : :
662 : : tree
663 : 1047883972 : component_uses_parent_alias_set_from (const_tree t)
664 : : {
665 : 1047883972 : const_tree found = NULL_TREE;
666 : :
667 : 1468512326 : while (handled_component_p (t))
668 : : {
669 : 420628354 : if (ends_tbaa_access_path_p (t))
670 : 12022194 : found = t;
671 : :
672 : 420628354 : t = TREE_OPERAND (t, 0);
673 : : }
674 : :
675 : 1047883972 : if (found)
676 : 11777195 : return TREE_OPERAND (found, 0);
677 : :
678 : : return NULL_TREE;
679 : : }
680 : :
681 : :
682 : : /* Return whether the pointer-type T effective for aliasing may
683 : : access everything and thus the reference has to be assigned
684 : : alias-set zero. */
685 : :
686 : : static bool
687 : 808936416 : ref_all_alias_ptr_type_p (const_tree t)
688 : : {
689 : 808936416 : return (VOID_TYPE_P (TREE_TYPE (t))
690 : 808936416 : || TYPE_REF_CAN_ALIAS_ALL (t));
691 : : }
692 : :
693 : : /* Return the alias set for the memory pointed to by T, which may be
694 : : either a type or an expression. Return -1 if there is nothing
695 : : special about dereferencing T. */
696 : :
697 : : static alias_set_type
698 : 86083482 : get_deref_alias_set_1 (tree t)
699 : : {
700 : : /* All we care about is the type. */
701 : 86083482 : if (! TYPE_P (t))
702 : 20 : t = TREE_TYPE (t);
703 : :
704 : : /* If we have an INDIRECT_REF via a void pointer, we don't
705 : : know anything about what that might alias. Likewise if the
706 : : pointer is marked that way. */
707 : 86083482 : if (ref_all_alias_ptr_type_p (t))
708 : 16980742 : return 0;
709 : :
710 : : return -1;
711 : : }
712 : :
713 : : /* Return the alias set for the memory pointed to by T, which may be
714 : : either a type or an expression. */
715 : :
716 : : alias_set_type
717 : 127836423 : get_deref_alias_set (tree t)
718 : : {
719 : : /* If we're not doing any alias analysis, just assume everything
720 : : aliases everything else. */
721 : 127836423 : if (!flag_strict_aliasing)
722 : : return 0;
723 : :
724 : 86083482 : alias_set_type set = get_deref_alias_set_1 (t);
725 : :
726 : : /* Fall back to the alias-set of the pointed-to type. */
727 : 86083482 : if (set == -1)
728 : : {
729 : 69102740 : if (! TYPE_P (t))
730 : 20 : t = TREE_TYPE (t);
731 : 69102740 : set = get_alias_set (TREE_TYPE (t));
732 : : }
733 : :
734 : : return set;
735 : : }
736 : :
737 : : /* Return the pointer-type relevant for TBAA purposes from the
738 : : memory reference tree *T or NULL_TREE in which case *T is
739 : : adjusted to point to the outermost component reference that
740 : : can be used for assigning an alias set. */
741 : :
742 : : tree
743 : 1148827299 : reference_alias_ptr_type_1 (tree *t)
744 : : {
745 : 1148827299 : tree inner;
746 : :
747 : : /* Get the base object of the reference. */
748 : 1148827299 : inner = *t;
749 : 1558136010 : while (handled_component_p (inner))
750 : : {
751 : : /* If there is a VIEW_CONVERT_EXPR in the chain we cannot use
752 : : the type of any component references that wrap it to
753 : : determine the alias-set. */
754 : 409308711 : if (TREE_CODE (inner) == VIEW_CONVERT_EXPR)
755 : 1900605 : *t = TREE_OPERAND (inner, 0);
756 : 409308711 : inner = TREE_OPERAND (inner, 0);
757 : : }
758 : :
759 : : /* Handle pointer dereferences here, they can override the
760 : : alias-set. */
761 : 1148827299 : if (INDIRECT_REF_P (inner)
762 : 1148827299 : && ref_all_alias_ptr_type_p (TREE_TYPE (TREE_OPERAND (inner, 0))))
763 : 0 : return TREE_TYPE (TREE_OPERAND (inner, 0));
764 : 1148827299 : else if (TREE_CODE (inner) == TARGET_MEM_REF)
765 : 42107561 : return TREE_TYPE (TMR_OFFSET (inner));
766 : 1106719738 : else if (TREE_CODE (inner) == MEM_REF
767 : 1106719738 : && ref_all_alias_ptr_type_p (TREE_TYPE (TREE_OPERAND (inner, 1))))
768 : 18611224 : return TREE_TYPE (TREE_OPERAND (inner, 1));
769 : :
770 : : /* If the innermost reference is a MEM_REF that has a
771 : : conversion embedded treat it like a VIEW_CONVERT_EXPR above,
772 : : using the memory access type for determining the alias-set. */
773 : 1088108514 : if (TREE_CODE (inner) == MEM_REF
774 : 1088108514 : && (TYPE_MAIN_VARIANT (TREE_TYPE (inner))
775 : 699364921 : != TYPE_MAIN_VARIANT
776 : : (TREE_TYPE (TREE_TYPE (TREE_OPERAND (inner, 1))))))
777 : : {
778 : 67690312 : tree alias_ptrtype = TREE_TYPE (TREE_OPERAND (inner, 1));
779 : : /* Unless we have the (aggregate) effective type of the access
780 : : somewhere on the access path. If we have for example
781 : : (&a->elts[i])->l.len exposed by abstraction we'd see
782 : : MEM <A> [(B *)a].elts[i].l.len and we can use the alias set
783 : : of 'len' when typeof (MEM <A> [(B *)a].elts[i]) == B for
784 : : example. See PR111715. */
785 : 67690312 : tree inner = *t;
786 : 67690312 : while (handled_component_p (inner)
787 : 68663261 : && (TYPE_MAIN_VARIANT (TREE_TYPE (inner))
788 : 1676016 : != TYPE_MAIN_VARIANT (TREE_TYPE (alias_ptrtype))))
789 : 972949 : inner = TREE_OPERAND (inner, 0);
790 : 67690312 : if (TREE_CODE (inner) == MEM_REF)
791 : : return alias_ptrtype;
792 : : }
793 : :
794 : : /* Otherwise, pick up the outermost object that we could have
795 : : a pointer to. */
796 : 1021121269 : tree tem = component_uses_parent_alias_set_from (*t);
797 : 1021121269 : if (tem)
798 : 10744266 : *t = tem;
799 : :
800 : : return NULL_TREE;
801 : : }
802 : :
803 : : /* Return the pointer-type relevant for TBAA purposes from the
804 : : gimple memory reference tree T. This is the type to be used for
805 : : the offset operand of MEM_REF or TARGET_MEM_REF replacements of T
806 : : and guarantees that get_alias_set will return the same alias
807 : : set for T and the replacement. */
808 : :
809 : : tree
810 : 7837283 : reference_alias_ptr_type (tree t)
811 : : {
812 : : /* If the frontend assigns this alias-set zero, preserve that. */
813 : 7837283 : if (lang_hooks.get_alias_set (t) == 0)
814 : 0 : return ptr_type_node;
815 : :
816 : 7837283 : tree ptype = reference_alias_ptr_type_1 (&t);
817 : : /* If there is a given pointer type for aliasing purposes, return it. */
818 : 7837283 : if (ptype != NULL_TREE)
819 : : return ptype;
820 : :
821 : : /* Otherwise build one from the outermost component reference we
822 : : may use. */
823 : 7442118 : if (TREE_CODE (t) == MEM_REF
824 : 7442118 : || TREE_CODE (t) == TARGET_MEM_REF)
825 : 837946 : return TREE_TYPE (TREE_OPERAND (t, 1));
826 : : else
827 : 6604172 : return build_pointer_type (TYPE_MAIN_VARIANT (TREE_TYPE (t)));
828 : : }
829 : :
830 : : /* Return whether the pointer-types T1 and T2 used to determine
831 : : two alias sets of two references will yield the same answer
832 : : from get_deref_alias_set. */
833 : :
834 : : bool
835 : 13082636 : alias_ptr_types_compatible_p (tree t1, tree t2)
836 : : {
837 : 13082636 : if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
838 : : return true;
839 : :
840 : 2156297 : if (ref_all_alias_ptr_type_p (t1)
841 : 2156297 : || ref_all_alias_ptr_type_p (t2))
842 : : return false;
843 : :
844 : : /* This function originally abstracts from simply comparing
845 : : get_deref_alias_set so that we are sure this still computes
846 : : the same result after LTO type merging is applied.
847 : : When in LTO type merging is done we can actually do this compare.
848 : : */
849 : 2133734 : if (in_lto_p)
850 : 3788 : return get_deref_alias_set (t1) == get_deref_alias_set (t2);
851 : : else
852 : 2129946 : return (TYPE_MAIN_VARIANT (TREE_TYPE (t1))
853 : 2129946 : == TYPE_MAIN_VARIANT (TREE_TYPE (t2)));
854 : : }
855 : :
856 : : /* Create emptry alias set entry. */
857 : :
858 : : alias_set_entry *
859 : 1150410 : init_alias_set_entry (alias_set_type set)
860 : : {
861 : 1150410 : alias_set_entry *ase = ggc_alloc<alias_set_entry> ();
862 : 1150410 : ase->alias_set = set;
863 : 1150410 : ase->children = NULL;
864 : 1150410 : ase->has_zero_child = false;
865 : 1150410 : ase->is_pointer = false;
866 : 1150410 : ase->has_pointer = false;
867 : 1150410 : gcc_checking_assert (!get_alias_set_entry (set));
868 : 1150410 : (*alias_sets)[set] = ase;
869 : 1150410 : return ase;
870 : : }
871 : :
872 : : /* Return the alias set for T, which may be either a type or an
873 : : expression. Call language-specific routine for help, if needed. */
874 : :
875 : : alias_set_type
876 : 1279803171 : get_alias_set (tree t)
877 : : {
878 : 1279803171 : alias_set_type set;
879 : :
880 : : /* We cannot give up with -fno-strict-aliasing because we need to build
881 : : proper type representations for possible functions which are built with
882 : : -fstrict-aliasing. */
883 : :
884 : : /* return 0 if this or its type is an error. */
885 : 1279803171 : if (t == error_mark_node
886 : 1279803171 : || (! TYPE_P (t)
887 : 1140671136 : && (TREE_TYPE (t) == 0 || TREE_TYPE (t) == error_mark_node)))
888 : : return 0;
889 : :
890 : : /* We can be passed either an expression or a type. This and the
891 : : language-specific routine may make mutually-recursive calls to each other
892 : : to figure out what to do. At each juncture, we see if this is a tree
893 : : that the language may need to handle specially. First handle things that
894 : : aren't types. */
895 : 1279803171 : if (! TYPE_P (t))
896 : : {
897 : : /* Give the language a chance to do something with this tree
898 : : before we look at it. */
899 : 1140671136 : STRIP_NOPS (t);
900 : 1140671136 : set = lang_hooks.get_alias_set (t);
901 : 1140671136 : if (set != -1)
902 : : return set;
903 : :
904 : : /* Get the alias pointer-type to use or the outermost object
905 : : that we could have a pointer to. */
906 : 1140671136 : tree ptype = reference_alias_ptr_type_1 (&t);
907 : 1140671136 : if (ptype != NULL)
908 : 127308279 : return get_deref_alias_set (ptype);
909 : :
910 : : /* If we've already determined the alias set for a decl, just return
911 : : it. This is necessary for C++ anonymous unions, whose component
912 : : variables don't look like union members (boo!). */
913 : 1013362857 : if (VAR_P (t)
914 : 1013362857 : && DECL_RTL_SET_P (t) && MEM_P (DECL_RTL (t)))
915 : 170404946 : return MEM_ALIAS_SET (DECL_RTL (t));
916 : :
917 : : /* Now all we care about is the type. */
918 : 928160384 : t = TREE_TYPE (t);
919 : : }
920 : :
921 : : /* Variant qualifiers don't affect the alias set, so get the main
922 : : variant. */
923 : 1067292419 : t = TYPE_MAIN_VARIANT (t);
924 : :
925 : 1067292419 : if (AGGREGATE_TYPE_P (t)
926 : 1067292419 : && TYPE_TYPELESS_STORAGE (t))
927 : : return 0;
928 : :
929 : : /* Always use the canonical type as well. If this is a type that
930 : : requires structural comparisons to identify compatible types
931 : : use alias set zero. */
932 : 1002442668 : if (TYPE_STRUCTURAL_EQUALITY_P (t))
933 : : {
934 : : /* Allow the language to specify another alias set for this
935 : : type. */
936 : 282402696 : set = lang_hooks.get_alias_set (t);
937 : 282402696 : if (set != -1)
938 : : return set;
939 : : /* Handle structure type equality for pointer types, arrays and vectors.
940 : : This is easy to do, because the code below ignores canonical types on
941 : : these anyway. This is important for LTO, where TYPE_CANONICAL for
942 : : pointers cannot be meaningfully computed by the frontend. */
943 : 281990195 : if (canonical_type_used_p (t))
944 : : {
945 : : /* In LTO we set canonical types for all types where it makes
946 : : sense to do so. Double check we did not miss some type. */
947 : 197747034 : gcc_checking_assert (!in_lto_p || !type_with_alias_set_p (t));
948 : : return 0;
949 : : }
950 : : }
951 : : else
952 : : {
953 : 720039972 : t = TYPE_CANONICAL (t);
954 : 720039972 : gcc_checking_assert (!TYPE_STRUCTURAL_EQUALITY_P (t));
955 : : }
956 : :
957 : : /* If this is a type with a known alias set, return it. */
958 : 804283133 : gcc_checking_assert (t == TYPE_MAIN_VARIANT (t));
959 : 804283133 : if (TYPE_ALIAS_SET_KNOWN_P (t))
960 : 717248830 : return TYPE_ALIAS_SET (t);
961 : :
962 : : /* We don't want to set TYPE_ALIAS_SET for incomplete types. */
963 : 87034303 : if (!COMPLETE_TYPE_P (t))
964 : : {
965 : : /* For arrays with unknown size the conservative answer is the
966 : : alias set of the element type. */
967 : 9709337 : if (TREE_CODE (t) == ARRAY_TYPE)
968 : 9681826 : return get_alias_set (TREE_TYPE (t));
969 : :
970 : : /* But return zero as a conservative answer for incomplete types. */
971 : : return 0;
972 : : }
973 : :
974 : : /* See if the language has special handling for this type. */
975 : 77324966 : set = lang_hooks.get_alias_set (t);
976 : 77324966 : if (set != -1)
977 : : return set;
978 : :
979 : : /* There are no objects of FUNCTION_TYPE, so there's no point in
980 : : using up an alias set for them. (There are, of course, pointers
981 : : and references to functions, but that's different.) */
982 : 2404554 : else if (TREE_CODE (t) == FUNCTION_TYPE || TREE_CODE (t) == METHOD_TYPE)
983 : : set = 0;
984 : :
985 : : /* Unless the language specifies otherwise, let vector types alias
986 : : their components. This avoids some nasty type punning issues in
987 : : normal usage. And indeed lets vectors be treated more like an
988 : : array slice. */
989 : 2401092 : else if (TREE_CODE (t) == VECTOR_TYPE)
990 : 85604 : set = get_alias_set (TREE_TYPE (t));
991 : :
992 : : /* Unless the language specifies otherwise, treat array types the
993 : : same as their components. This avoids the asymmetry we get
994 : : through recording the components. Consider accessing a
995 : : character(kind=1) through a reference to a character(kind=1)[1:1].
996 : : Or consider if we want to assign integer(kind=4)[0:D.1387] and
997 : : integer(kind=4)[4] the same alias set or not.
998 : : Just be pragmatic here and make sure the array and its element
999 : : type get the same alias set assigned. */
1000 : 2315488 : else if (TREE_CODE (t) == ARRAY_TYPE
1001 : 2315488 : && (!TYPE_NONALIASED_COMPONENT (t)
1002 : 0 : || TYPE_STRUCTURAL_EQUALITY_P (t)))
1003 : 393520 : set = get_alias_set (TREE_TYPE (t));
1004 : :
1005 : : /* From the former common C and C++ langhook implementation:
1006 : :
1007 : : Unfortunately, there is no canonical form of a pointer type.
1008 : : In particular, if we have `typedef int I', then `int *', and
1009 : : `I *' are different types. So, we have to pick a canonical
1010 : : representative. We do this below.
1011 : :
1012 : : Technically, this approach is actually more conservative that
1013 : : it needs to be. In particular, `const int *' and `int *'
1014 : : should be in different alias sets, according to the C and C++
1015 : : standard, since their types are not the same, and so,
1016 : : technically, an `int **' and `const int **' cannot point at
1017 : : the same thing.
1018 : :
1019 : : But, the standard is wrong. In particular, this code is
1020 : : legal C++:
1021 : :
1022 : : int *ip;
1023 : : int **ipp = &ip;
1024 : : const int* const* cipp = ipp;
1025 : : And, it doesn't make sense for that to be legal unless you
1026 : : can dereference IPP and CIPP. So, we ignore cv-qualifiers on
1027 : : the pointed-to types. This issue has been reported to the
1028 : : C++ committee.
1029 : :
1030 : : For this reason go to canonical type of the unqalified pointer type.
1031 : : Until GCC 6 this code set all pointers sets to have alias set of
1032 : : ptr_type_node but that is a bad idea, because it prevents disabiguations
1033 : : in between pointers. For Firefox this accounts about 20% of all
1034 : : disambiguations in the program. */
1035 : 1921968 : else if (POINTER_TYPE_P (t) && t != ptr_type_node)
1036 : : {
1037 : 652792 : tree p;
1038 : 652792 : auto_vec <bool, 8> reference;
1039 : :
1040 : : /* Unnest all pointers and references.
1041 : : We also want to make pointer to array/vector equivalent to pointer to
1042 : : its element (see the reasoning above). Skip all those types, too. */
1043 : 652792 : for (p = t; POINTER_TYPE_P (p)
1044 : 710909 : || (TREE_CODE (p) == ARRAY_TYPE
1045 : 56940 : && (!TYPE_NONALIASED_COMPONENT (p)
1046 : 0 : || !COMPLETE_TYPE_P (p)
1047 : 0 : || TYPE_STRUCTURAL_EQUALITY_P (p)))
1048 : 2089968 : || TREE_CODE (p) == VECTOR_TYPE;
1049 : 783207 : p = TREE_TYPE (p))
1050 : : {
1051 : : /* Ada supports recursive pointers. Instead of doing recursion
1052 : : check, just give up once the preallocated space of 8 elements
1053 : : is up. In this case just punt to void * alias set. */
1054 : 783274 : if (reference.length () == 8)
1055 : : {
1056 : 67 : p = ptr_type_node;
1057 : 67 : break;
1058 : : }
1059 : 783207 : if (TREE_CODE (p) == REFERENCE_TYPE)
1060 : : /* In LTO we want languages that use references to be compatible
1061 : : with languages that use pointers. */
1062 : 46553 : reference.safe_push (true && !in_lto_p);
1063 : 783207 : if (TREE_CODE (p) == POINTER_TYPE)
1064 : 678509 : reference.safe_push (false);
1065 : : }
1066 : 652792 : p = TYPE_MAIN_VARIANT (p);
1067 : :
1068 : : /* In LTO for C++ programs we can turn incomplete types to complete
1069 : : using ODR name lookup. */
1070 : 652792 : if (in_lto_p && TYPE_STRUCTURAL_EQUALITY_P (p) && odr_type_p (p))
1071 : : {
1072 : 268 : p = prevailing_odr_type (p);
1073 : 268 : gcc_checking_assert (TYPE_MAIN_VARIANT (p) == p);
1074 : : }
1075 : :
1076 : : /* Make void * compatible with char * and also void **.
1077 : : Programs are commonly violating TBAA by this.
1078 : :
1079 : : We also make void * to conflict with every pointer
1080 : : (see record_component_aliases) and thus it is safe it to use it for
1081 : : pointers to types with TYPE_STRUCTURAL_EQUALITY_P. */
1082 : 652792 : if (TREE_CODE (p) == VOID_TYPE || TYPE_STRUCTURAL_EQUALITY_P (p))
1083 : 120294 : set = get_alias_set (ptr_type_node);
1084 : : else
1085 : : {
1086 : : /* Rebuild pointer type starting from canonical types using
1087 : : unqualified pointers and references only. This way all such
1088 : : pointers will have the same alias set and will conflict with
1089 : : each other.
1090 : :
1091 : : Most of time we already have pointers or references of a given type.
1092 : : If not we build new one just to be sure that if someone later
1093 : : (probably only middle-end can, as we should assign all alias
1094 : : classes only after finishing translation unit) builds the pointer
1095 : : type, the canonical type will match. */
1096 : 532498 : p = TYPE_CANONICAL (p);
1097 : 1116621 : while (!reference.is_empty ())
1098 : : {
1099 : 584123 : if (reference.pop ())
1100 : 44903 : p = build_reference_type (p);
1101 : : else
1102 : 539220 : p = build_pointer_type (p);
1103 : 584123 : gcc_checking_assert (p == TYPE_MAIN_VARIANT (p));
1104 : : /* build_pointer_type should always return the canonical type.
1105 : : For LTO TYPE_CANOINCAL may be NULL, because we do not compute
1106 : : them. Be sure that frontends do not glob canonical types of
1107 : : pointers in unexpected way and that p == TYPE_CANONICAL (p)
1108 : : in all other cases. */
1109 : 584123 : gcc_checking_assert (!TYPE_CANONICAL (p)
1110 : : || p == TYPE_CANONICAL (p));
1111 : : }
1112 : :
1113 : : /* Assign the alias set to both p and t.
1114 : : We cannot call get_alias_set (p) here as that would trigger
1115 : : infinite recursion when p == t. In other cases it would just
1116 : : trigger unnecesary legwork of rebuilding the pointer again. */
1117 : 532498 : gcc_checking_assert (p == TYPE_MAIN_VARIANT (p));
1118 : 532498 : if (TYPE_ALIAS_SET_KNOWN_P (p))
1119 : 65671 : set = TYPE_ALIAS_SET (p);
1120 : : else
1121 : : {
1122 : 466827 : set = new_alias_set ();
1123 : 466827 : TYPE_ALIAS_SET (p) = set;
1124 : : }
1125 : : }
1126 : 652792 : }
1127 : : /* Alias set of ptr_type_node is special and serve as universal pointer which
1128 : : is TBAA compatible with every other pointer type. Be sure we have the
1129 : : alias set built even for LTO which otherwise keeps all TYPE_CANONICAL
1130 : : of pointer types NULL. */
1131 : 1269176 : else if (t == ptr_type_node)
1132 : 61405 : set = new_alias_set ();
1133 : :
1134 : : /* Otherwise make a new alias set for this type. */
1135 : : else
1136 : : {
1137 : : /* Each canonical type gets its own alias set, so canonical types
1138 : : shouldn't form a tree. It doesn't really matter for types
1139 : : we handle specially above, so only check it where it possibly
1140 : : would result in a bogus alias set. */
1141 : 1207771 : gcc_checking_assert (TYPE_CANONICAL (t) == t);
1142 : :
1143 : 1207771 : set = new_alias_set ();
1144 : : }
1145 : :
1146 : 2404554 : TYPE_ALIAS_SET (t) = set;
1147 : :
1148 : : /* If this is an aggregate type or a complex type, we must record any
1149 : : component aliasing information. */
1150 : 2404554 : if (AGGREGATE_TYPE_P (t) || TREE_CODE (t) == COMPLEX_TYPE)
1151 : 1094326 : record_component_aliases (t);
1152 : :
1153 : : /* We treat pointer types specially in alias_set_subset_of. */
1154 : 2404554 : if (POINTER_TYPE_P (t) && set)
1155 : : {
1156 : 714197 : alias_set_entry *ase = get_alias_set_entry (set);
1157 : 714197 : if (!ase)
1158 : 528232 : ase = init_alias_set_entry (set);
1159 : 714197 : ase->is_pointer = true;
1160 : 714197 : ase->has_pointer = true;
1161 : : }
1162 : :
1163 : : return set;
1164 : : }
1165 : :
1166 : : /* Return a brand-new alias set. */
1167 : :
1168 : : alias_set_type
1169 : 1779829 : new_alias_set (void)
1170 : : {
1171 : 1779829 : if (alias_sets == 0)
1172 : 203093 : vec_safe_push (alias_sets, (alias_set_entry *) NULL);
1173 : 1779829 : vec_safe_push (alias_sets, (alias_set_entry *) NULL);
1174 : 1779829 : return alias_sets->length () - 1;
1175 : : }
1176 : :
1177 : : /* Indicate that things in SUBSET can alias things in SUPERSET, but that
1178 : : not everything that aliases SUPERSET also aliases SUBSET. For example,
1179 : : in C, a store to an `int' can alias a load of a structure containing an
1180 : : `int', and vice versa. But it can't alias a load of a 'double' member
1181 : : of the same structure. Here, the structure would be the SUPERSET and
1182 : : `int' the SUBSET. This relationship is also described in the comment at
1183 : : the beginning of this file.
1184 : :
1185 : : This function should be called only once per SUPERSET/SUBSET pair.
1186 : :
1187 : : It is illegal for SUPERSET to be zero; everything is implicitly a
1188 : : subset of alias set zero. */
1189 : :
1190 : : void
1191 : 1921623 : record_alias_subset (alias_set_type superset, alias_set_type subset)
1192 : : {
1193 : 1921623 : alias_set_entry *superset_entry;
1194 : 1921623 : alias_set_entry *subset_entry;
1195 : :
1196 : : /* It is possible in complex type situations for both sets to be the same,
1197 : : in which case we can ignore this operation. */
1198 : 1921623 : if (superset == subset)
1199 : : return;
1200 : :
1201 : 1921623 : gcc_assert (superset);
1202 : :
1203 : 1921623 : superset_entry = get_alias_set_entry (superset);
1204 : 1921623 : if (superset_entry == 0)
1205 : : {
1206 : : /* Create an entry for the SUPERSET, so that we have a place to
1207 : : attach the SUBSET. */
1208 : 622178 : superset_entry = init_alias_set_entry (superset);
1209 : : }
1210 : :
1211 : 1921623 : if (subset == 0)
1212 : 91940 : superset_entry->has_zero_child = 1;
1213 : : else
1214 : : {
1215 : 1829683 : if (!superset_entry->children)
1216 : 608670 : superset_entry->children
1217 : 608670 : = hash_map<alias_set_hash, int>::create_ggc (64);
1218 : :
1219 : : /* Enter the SUBSET itself as a child of the SUPERSET. If it was
1220 : : already there we're done. */
1221 : 1829683 : if (superset_entry->children->put (subset, 0))
1222 : : return;
1223 : :
1224 : 1118685 : subset_entry = get_alias_set_entry (subset);
1225 : : /* If there is an entry for the subset, enter all of its children
1226 : : (if they are not already present) as children of the SUPERSET. */
1227 : 1118685 : if (subset_entry)
1228 : : {
1229 : 688735 : if (subset_entry->has_zero_child)
1230 : 15615 : superset_entry->has_zero_child = true;
1231 : 688735 : if (subset_entry->has_pointer)
1232 : 542977 : superset_entry->has_pointer = true;
1233 : :
1234 : 688735 : if (subset_entry->children)
1235 : : {
1236 : 308120 : hash_map<alias_set_hash, int>::iterator iter
1237 : 308120 : = subset_entry->children->begin ();
1238 : 603102922 : for (; iter != subset_entry->children->end (); ++iter)
1239 : 301089281 : superset_entry->children->put ((*iter).first, (*iter).second);
1240 : : }
1241 : : }
1242 : : }
1243 : : }
1244 : :
1245 : : /* Record that component types of TYPE, if any, are part of SUPERSET for
1246 : : aliasing purposes. For record types, we only record component types
1247 : : for fields that are not marked non-addressable. For array types, we
1248 : : only record the component type if it is not marked non-aliased. */
1249 : :
1250 : : void
1251 : 1186195 : record_component_aliases (tree type, alias_set_type superset)
1252 : : {
1253 : 1186195 : tree field;
1254 : :
1255 : 1186195 : if (superset == 0)
1256 : : return;
1257 : :
1258 : 1124721 : switch (TREE_CODE (type))
1259 : : {
1260 : 696135 : case RECORD_TYPE:
1261 : 696135 : case UNION_TYPE:
1262 : 696135 : case QUAL_UNION_TYPE:
1263 : 696135 : {
1264 : : /* LTO non-ODR type merging does not make any difference between
1265 : : component pointer types. We may have
1266 : :
1267 : : struct foo {int *a;};
1268 : :
1269 : : as TYPE_CANONICAL of
1270 : :
1271 : : struct bar {float *a;};
1272 : :
1273 : : Because accesses to int * and float * do not alias, we would get
1274 : : false negative when accessing the same memory location by
1275 : : float ** and bar *. We thus record the canonical type as:
1276 : :
1277 : : struct {void *a;};
1278 : :
1279 : : void * is special cased and works as a universal pointer type.
1280 : : Accesses to it conflicts with accesses to any other pointer
1281 : : type. */
1282 : 696135 : bool void_pointers = in_lto_p
1283 : 696135 : && (!odr_type_p (type)
1284 : 5572 : || !odr_based_tbaa_p (type));
1285 : 12286395 : for (field = TYPE_FIELDS (type); field != 0; field = DECL_CHAIN (field))
1286 : 11590260 : if (TREE_CODE (field) == FIELD_DECL && !DECL_NONADDRESSABLE_P (field))
1287 : : {
1288 : 1916551 : tree t = TREE_TYPE (field);
1289 : 1916551 : if (void_pointers)
1290 : : {
1291 : : /* VECTOR_TYPE and ARRAY_TYPE share the alias set with their
1292 : : element type and that type has to be normalized to void *,
1293 : : too, in the case it is a pointer. */
1294 : 26987 : while (!canonical_type_used_p (t) && !POINTER_TYPE_P (t))
1295 : : {
1296 : 2157 : gcc_checking_assert (TYPE_STRUCTURAL_EQUALITY_P (t));
1297 : 2157 : t = TREE_TYPE (t);
1298 : : }
1299 : 22673 : if (POINTER_TYPE_P (t))
1300 : 6388 : t = ptr_type_node;
1301 : 16285 : else if (flag_checking)
1302 : 16285 : gcc_checking_assert (get_alias_set (t)
1303 : : == get_alias_set (TREE_TYPE (field)));
1304 : : }
1305 : :
1306 : 1916551 : alias_set_type set = get_alias_set (t);
1307 : 1916551 : record_alias_subset (superset, set);
1308 : : /* If the field has alias-set zero make sure to still record
1309 : : any componets of it. This makes sure that for
1310 : : struct A {
1311 : : struct B {
1312 : : int i;
1313 : : char c[4];
1314 : : } b;
1315 : : };
1316 : : in C++ even though 'B' has alias-set zero because
1317 : : TYPE_TYPELESS_STORAGE is set, 'A' has the alias-set of
1318 : : 'int' as subset. */
1319 : 1916551 : if (set == 0)
1320 : 91869 : record_component_aliases (t, superset);
1321 : : }
1322 : : }
1323 : : break;
1324 : :
1325 : 5072 : case COMPLEX_TYPE:
1326 : 5072 : record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
1327 : 5072 : break;
1328 : :
1329 : : /* VECTOR_TYPE and ARRAY_TYPE share the alias set with their
1330 : : element type. */
1331 : :
1332 : : default:
1333 : : break;
1334 : : }
1335 : : }
1336 : :
1337 : : /* Record that component types of TYPE, if any, are part of that type for
1338 : : aliasing purposes. For record types, we only record component types
1339 : : for fields that are not marked non-addressable. For array types, we
1340 : : only record the component type if it is not marked non-aliased. */
1341 : :
1342 : : void
1343 : 1094326 : record_component_aliases (tree type)
1344 : : {
1345 : 1094326 : alias_set_type superset = get_alias_set (type);
1346 : 1094326 : record_component_aliases (type, superset);
1347 : 1094326 : }
1348 : :
1349 : :
1350 : : /* Allocate an alias set for use in storing and reading from the varargs
1351 : : spill area. */
1352 : :
1353 : : static GTY(()) alias_set_type varargs_set = -1;
1354 : :
1355 : : alias_set_type
1356 : 20786 : get_varargs_alias_set (void)
1357 : : {
1358 : : #if 1
1359 : : /* We now lower VA_ARG_EXPR, and there's currently no way to attach the
1360 : : varargs alias set to an INDIRECT_REF (FIXME!), so we can't
1361 : : consistently use the varargs alias set for loads from the varargs
1362 : : area. So don't use it anywhere. */
1363 : 20786 : return 0;
1364 : : #else
1365 : : if (varargs_set == -1)
1366 : : varargs_set = new_alias_set ();
1367 : :
1368 : : return varargs_set;
1369 : : #endif
1370 : : }
1371 : :
1372 : : /* Likewise, but used for the fixed portions of the frame, e.g., register
1373 : : save areas. */
1374 : :
1375 : : static GTY(()) alias_set_type frame_set = -1;
1376 : :
1377 : : alias_set_type
1378 : 615970 : get_frame_alias_set (void)
1379 : : {
1380 : 615970 : if (frame_set == -1)
1381 : 12648 : frame_set = new_alias_set ();
1382 : :
1383 : 615970 : return frame_set;
1384 : : }
1385 : :
1386 : : /* Create a new, unique base with id ID. */
1387 : :
1388 : : static rtx
1389 : 1790035 : unique_base_value (HOST_WIDE_INT id)
1390 : : {
1391 : 1790035 : return gen_rtx_ADDRESS (Pmode, id);
1392 : : }
1393 : :
1394 : : /* Return true if accesses based on any other base value cannot alias
1395 : : those based on X. */
1396 : :
1397 : : static bool
1398 : 151318751 : unique_base_value_p (rtx x)
1399 : : {
1400 : 122278662 : return GET_CODE (x) == ADDRESS && GET_MODE (x) == Pmode;
1401 : : }
1402 : :
1403 : : /* Inside SRC, the source of a SET, find a base address. */
1404 : :
1405 : : static rtx
1406 : 405230683 : find_base_value (rtx src)
1407 : : {
1408 : 484850984 : unsigned int regno;
1409 : 484850984 : scalar_int_mode int_mode;
1410 : :
1411 : : #if defined (FIND_BASE_TERM)
1412 : : /* Try machine-dependent ways to find the base term. */
1413 : 484850984 : src = FIND_BASE_TERM (src);
1414 : : #endif
1415 : :
1416 : 484850984 : switch (GET_CODE (src))
1417 : : {
1418 : : case SYMBOL_REF:
1419 : : case LABEL_REF:
1420 : : return src;
1421 : :
1422 : 158920964 : case REG:
1423 : 158920964 : regno = REGNO (src);
1424 : : /* At the start of a function, argument registers have known base
1425 : : values which may be lost later. Returning an ADDRESS
1426 : : expression here allows optimization based on argument values
1427 : : even when the argument registers are used for other purposes. */
1428 : 158920964 : if (regno < FIRST_PSEUDO_REGISTER && copying_arguments)
1429 : 17962915 : return new_reg_base_value[regno];
1430 : :
1431 : : /* If a pseudo has a known base value, return it. Do not do this
1432 : : for non-fixed hard regs since it can result in a circular
1433 : : dependency chain for registers which have values at function entry.
1434 : :
1435 : : The test above is not sufficient because the scheduler may move
1436 : : a copy out of an arg reg past the NOTE_INSN_FUNCTION_BEGIN. */
1437 : 84357768 : if ((regno >= FIRST_PSEUDO_REGISTER || fixed_regs[regno])
1438 : 113932875 : && regno < vec_safe_length (reg_base_value))
1439 : : {
1440 : : /* If we're inside init_alias_analysis, use new_reg_base_value
1441 : : to reduce the number of relaxation iterations. */
1442 : 113932875 : if (new_reg_base_value && new_reg_base_value[regno]
1443 : 76576685 : && DF_REG_DEF_COUNT (regno) == 1)
1444 : : return new_reg_base_value[regno];
1445 : :
1446 : 80946625 : if ((*reg_base_value)[regno])
1447 : : return (*reg_base_value)[regno];
1448 : : }
1449 : :
1450 : : return 0;
1451 : :
1452 : 95270477 : case MEM:
1453 : : /* Check for an argument passed in memory. Only record in the
1454 : : copying-arguments block; it is too hard to track changes
1455 : : otherwise. */
1456 : 95270477 : if (copying_arguments
1457 : 3915806 : && (XEXP (src, 0) == arg_pointer_rtx
1458 : 2783372 : || (GET_CODE (XEXP (src, 0)) == PLUS
1459 : 2770121 : && XEXP (XEXP (src, 0), 0) == arg_pointer_rtx)))
1460 : 2756542 : return arg_base_value;
1461 : : return 0;
1462 : :
1463 : 942123 : case CONST:
1464 : 942123 : src = XEXP (src, 0);
1465 : 942123 : if (GET_CODE (src) != PLUS && GET_CODE (src) != MINUS)
1466 : : break;
1467 : :
1468 : : /* fall through */
1469 : :
1470 : 98399928 : case PLUS:
1471 : 98399928 : case MINUS:
1472 : 98399928 : {
1473 : 98399928 : rtx src_0 = XEXP (src, 0), src_1 = XEXP (src, 1);
1474 : :
1475 : : /* If either operand is a CONST_INT, then the other is the base. */
1476 : 98399928 : if (CONST_INT_P (src_1))
1477 : : return find_base_value (src_0);
1478 : 20584445 : else if (CONST_INT_P (src_0))
1479 : : return find_base_value (src_1);
1480 : :
1481 : : return 0;
1482 : : }
1483 : :
1484 : 0 : case LO_SUM:
1485 : : /* The standard form is (lo_sum reg sym) so look only at the
1486 : : second operand. */
1487 : 0 : return find_base_value (XEXP (src, 1));
1488 : :
1489 : 5523625 : case AND:
1490 : : /* Look through aligning ANDs. And AND with zero or one with
1491 : : the LSB set isn't one (see for example PR92462). */
1492 : 5523625 : if (CONST_INT_P (XEXP (src, 1))
1493 : 3826945 : && INTVAL (XEXP (src, 1)) != 0
1494 : 3795554 : && (INTVAL (XEXP (src, 1)) & 1) == 0)
1495 : 1704450 : return find_base_value (XEXP (src, 0));
1496 : : return 0;
1497 : :
1498 : 11885 : case TRUNCATE:
1499 : : /* As we do not know which address space the pointer is referring to, we can
1500 : : handle this only if the target does not support different pointer or
1501 : : address modes depending on the address space. */
1502 : 11885 : if (!target_default_pointer_address_modes_p ())
1503 : : break;
1504 : 11885 : if (!is_a <scalar_int_mode> (GET_MODE (src), &int_mode)
1505 : 0 : || GET_MODE_PRECISION (int_mode) < GET_MODE_PRECISION (Pmode))
1506 : : break;
1507 : : /* Fall through. */
1508 : 0 : case HIGH:
1509 : 0 : case PRE_INC:
1510 : 0 : case PRE_DEC:
1511 : 0 : case POST_INC:
1512 : 0 : case POST_DEC:
1513 : 0 : case PRE_MODIFY:
1514 : 0 : case POST_MODIFY:
1515 : 0 : return find_base_value (XEXP (src, 0));
1516 : :
1517 : 9589567 : case ZERO_EXTEND:
1518 : 9589567 : case SIGN_EXTEND: /* used for NT/Alpha pointers */
1519 : : /* As we do not know which address space the pointer is referring to, we can
1520 : : handle this only if the target does not support different pointer or
1521 : : address modes depending on the address space. */
1522 : 9589567 : if (!target_default_pointer_address_modes_p ())
1523 : : break;
1524 : :
1525 : 9589567 : {
1526 : 9589567 : rtx temp = find_base_value (XEXP (src, 0));
1527 : :
1528 : 9589567 : if (temp != 0 && CONSTANT_P (temp))
1529 : 104 : temp = convert_memory_address (Pmode, temp);
1530 : :
1531 : : return temp;
1532 : : }
1533 : :
1534 : : default:
1535 : : break;
1536 : : }
1537 : :
1538 : : return 0;
1539 : : }
1540 : :
1541 : : /* Called from init_alias_analysis indirectly through note_stores,
1542 : : or directly if DEST is a register with a REG_NOALIAS note attached.
1543 : : SET is null in the latter case. */
1544 : :
1545 : : /* While scanning insns to find base values, reg_seen[N] is nonzero if
1546 : : register N has been set in this function. */
1547 : : static sbitmap reg_seen;
1548 : :
1549 : : static void
1550 : 1271788799 : record_set (rtx dest, const_rtx set, void *data ATTRIBUTE_UNUSED)
1551 : : {
1552 : 1271788799 : unsigned regno;
1553 : 1271788799 : rtx src;
1554 : 1271788799 : int n;
1555 : :
1556 : 1271788799 : if (!REG_P (dest))
1557 : : return;
1558 : :
1559 : 970143059 : regno = REGNO (dest);
1560 : :
1561 : 970143059 : gcc_checking_assert (regno < reg_base_value->length ());
1562 : :
1563 : 970143059 : n = REG_NREGS (dest);
1564 : 970143059 : if (n != 1)
1565 : : {
1566 : 14735838 : while (--n >= 0)
1567 : : {
1568 : 9824300 : bitmap_set_bit (reg_seen, regno + n);
1569 : 9824300 : new_reg_base_value[regno + n] = 0;
1570 : : }
1571 : : return;
1572 : : }
1573 : :
1574 : 965231521 : if (set)
1575 : : {
1576 : : /* A CLOBBER wipes out any old value but does not prevent a previously
1577 : : unset register from acquiring a base address (i.e. reg_seen is not
1578 : : set). */
1579 : 963878676 : if (GET_CODE (set) == CLOBBER)
1580 : : {
1581 : 166946668 : new_reg_base_value[regno] = 0;
1582 : 166946668 : return;
1583 : : }
1584 : :
1585 : 796932008 : src = SET_SRC (set);
1586 : : }
1587 : : else
1588 : : {
1589 : : /* There's a REG_NOALIAS note against DEST. */
1590 : 1352845 : if (bitmap_bit_p (reg_seen, regno))
1591 : : {
1592 : 402562 : new_reg_base_value[regno] = 0;
1593 : 402562 : return;
1594 : : }
1595 : 950283 : bitmap_set_bit (reg_seen, regno);
1596 : 950283 : new_reg_base_value[regno] = unique_base_value (unique_id++);
1597 : 950283 : return;
1598 : : }
1599 : :
1600 : : /* If this is not the first set of REGNO, see whether the new value
1601 : : is related to the old one. There are two cases of interest:
1602 : :
1603 : : (1) The register might be assigned an entirely new value
1604 : : that has the same base term as the original set.
1605 : :
1606 : : (2) The set might be a simple self-modification that
1607 : : cannot change REGNO's base value.
1608 : :
1609 : : If neither case holds, reject the original base value as invalid.
1610 : : Note that the following situation is not detected:
1611 : :
1612 : : extern int x, y; int *p = &x; p += (&y-&x);
1613 : :
1614 : : ANSI C does not allow computing the difference of addresses
1615 : : of distinct top level objects. */
1616 : 796932008 : if (new_reg_base_value[regno] != 0
1617 : 796932008 : && find_base_value (src) != new_reg_base_value[regno])
1618 : 72159534 : switch (GET_CODE (src))
1619 : : {
1620 : 434343 : case LO_SUM:
1621 : 434343 : case MINUS:
1622 : 434343 : if (XEXP (src, 0) != dest && XEXP (src, 1) != dest)
1623 : 75811 : new_reg_base_value[regno] = 0;
1624 : : break;
1625 : 22059653 : case PLUS:
1626 : : /* If the value we add in the PLUS is also a valid base value,
1627 : : this might be the actual base value, and the original value
1628 : : an index. */
1629 : 22059653 : {
1630 : 22059653 : rtx other = NULL_RTX;
1631 : :
1632 : 22059653 : if (XEXP (src, 0) == dest)
1633 : 19207179 : other = XEXP (src, 1);
1634 : 2852474 : else if (XEXP (src, 1) == dest)
1635 : : other = XEXP (src, 0);
1636 : :
1637 : 19495536 : if (! other || find_base_value (other))
1638 : 2569061 : new_reg_base_value[regno] = 0;
1639 : : break;
1640 : : }
1641 : 70412 : case AND:
1642 : 70412 : if (XEXP (src, 0) != dest || !CONST_INT_P (XEXP (src, 1)))
1643 : 53045 : new_reg_base_value[regno] = 0;
1644 : : break;
1645 : 49595126 : default:
1646 : 49595126 : new_reg_base_value[regno] = 0;
1647 : 49595126 : break;
1648 : : }
1649 : : /* If this is the first set of a register, record the value. */
1650 : 425103800 : else if ((regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno])
1651 : 1028894940 : && ! bitmap_bit_p (reg_seen, regno) && new_reg_base_value[regno] == 0)
1652 : 271601852 : new_reg_base_value[regno] = find_base_value (src);
1653 : :
1654 : 796932008 : bitmap_set_bit (reg_seen, regno);
1655 : : }
1656 : :
1657 : : /* Return REG_BASE_VALUE for REGNO. Selective scheduler uses this to avoid
1658 : : using hard registers with non-null REG_BASE_VALUE for renaming. */
1659 : : rtx
1660 : 1532 : get_reg_base_value (unsigned int regno)
1661 : : {
1662 : 1532 : return (*reg_base_value)[regno];
1663 : : }
1664 : :
1665 : : /* If a value is known for REGNO, return it. */
1666 : :
1667 : : rtx
1668 : 240558663 : get_reg_known_value (unsigned int regno)
1669 : : {
1670 : 240558663 : if (regno >= FIRST_PSEUDO_REGISTER)
1671 : : {
1672 : 226135450 : regno -= FIRST_PSEUDO_REGISTER;
1673 : 437274400 : if (regno < vec_safe_length (reg_known_value))
1674 : 211138950 : return (*reg_known_value)[regno];
1675 : : }
1676 : : return NULL;
1677 : : }
1678 : :
1679 : : /* Set it. */
1680 : :
1681 : : static void
1682 : 479582249 : set_reg_known_value (unsigned int regno, rtx val)
1683 : : {
1684 : 479582249 : if (regno >= FIRST_PSEUDO_REGISTER)
1685 : : {
1686 : 479582249 : regno -= FIRST_PSEUDO_REGISTER;
1687 : 959164498 : if (regno < vec_safe_length (reg_known_value))
1688 : 479582249 : (*reg_known_value)[regno] = val;
1689 : : }
1690 : 479582249 : }
1691 : :
1692 : : /* Similarly for reg_known_equiv_p. */
1693 : :
1694 : : bool
1695 : 43936 : get_reg_known_equiv_p (unsigned int regno)
1696 : : {
1697 : 43936 : if (regno >= FIRST_PSEUDO_REGISTER)
1698 : : {
1699 : 43936 : regno -= FIRST_PSEUDO_REGISTER;
1700 : 87872 : if (regno < vec_safe_length (reg_known_value))
1701 : 43166 : return bitmap_bit_p (reg_known_equiv_p, regno);
1702 : : }
1703 : : return false;
1704 : : }
1705 : :
1706 : : static void
1707 : 38100954 : set_reg_known_equiv_p (unsigned int regno, bool val)
1708 : : {
1709 : 38100954 : if (regno >= FIRST_PSEUDO_REGISTER)
1710 : : {
1711 : 38100954 : regno -= FIRST_PSEUDO_REGISTER;
1712 : 76201908 : if (regno < vec_safe_length (reg_known_value))
1713 : : {
1714 : 38100954 : if (val)
1715 : 0 : bitmap_set_bit (reg_known_equiv_p, regno);
1716 : : else
1717 : 38100954 : bitmap_clear_bit (reg_known_equiv_p, regno);
1718 : : }
1719 : : }
1720 : 38100954 : }
1721 : :
1722 : :
1723 : : /* Returns a canonical version of X, from the point of view alias
1724 : : analysis. (For example, if X is a MEM whose address is a register,
1725 : : and the register has a known value (say a SYMBOL_REF), then a MEM
1726 : : whose address is the SYMBOL_REF is returned.) */
1727 : :
1728 : : rtx
1729 : 5037544644 : canon_rtx (rtx x)
1730 : : {
1731 : : /* Recursively look for equivalences. */
1732 : 5040910245 : if (REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER)
1733 : : {
1734 : 201106046 : rtx t = get_reg_known_value (REGNO (x));
1735 : 201106046 : if (t == x)
1736 : : return x;
1737 : 18362101 : if (t)
1738 : : return canon_rtx (t);
1739 : : }
1740 : :
1741 : 4854800699 : if (GET_CODE (x) == PLUS)
1742 : : {
1743 : 1403724620 : rtx x0 = canon_rtx (XEXP (x, 0));
1744 : 1403724620 : rtx x1 = canon_rtx (XEXP (x, 1));
1745 : :
1746 : 1403724620 : if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
1747 : 2267611 : return simplify_gen_binary (PLUS, GET_MODE (x), x0, x1);
1748 : : }
1749 : :
1750 : : /* This gives us much better alias analysis when called from
1751 : : the loop optimizer. Note we want to leave the original
1752 : : MEM alone, but need to return the canonicalized MEM with
1753 : : all the flags with their original values. */
1754 : 3451076079 : else if (MEM_P (x))
1755 : 297893825 : x = replace_equiv_address_nv (x, canon_rtx (XEXP (x, 0)));
1756 : :
1757 : : return x;
1758 : : }
1759 : :
1760 : : /* Return true if X and Y are identical-looking rtx's.
1761 : : Expect that X and Y has been already canonicalized.
1762 : :
1763 : : We use the data in reg_known_value above to see if two registers with
1764 : : different numbers are, in fact, equivalent. */
1765 : :
1766 : : static bool
1767 : 8474521345 : rtx_equal_for_memref_p (const_rtx x, const_rtx y)
1768 : : {
1769 : 8474537698 : int i;
1770 : 8474537698 : int j;
1771 : 8474537698 : enum rtx_code code;
1772 : 8474537698 : const char *fmt;
1773 : :
1774 : 8474537698 : if (x == 0 && y == 0)
1775 : : return true;
1776 : 8474537698 : if (x == 0 || y == 0)
1777 : : return false;
1778 : :
1779 : 8474537698 : if (x == y)
1780 : : return true;
1781 : :
1782 : 6818755882 : code = GET_CODE (x);
1783 : : /* Rtx's of different codes cannot be equal. */
1784 : 6818755882 : if (code != GET_CODE (y))
1785 : : return false;
1786 : :
1787 : : /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1788 : : (REG:SI x) and (REG:HI x) are NOT equivalent. */
1789 : :
1790 : 4650041655 : if (GET_MODE (x) != GET_MODE (y))
1791 : : return false;
1792 : :
1793 : : /* Some RTL can be compared without a recursive examination. */
1794 : 4650041504 : switch (code)
1795 : : {
1796 : 215001615 : case REG:
1797 : 215001615 : return REGNO (x) == REGNO (y);
1798 : :
1799 : 0 : case LABEL_REF:
1800 : 0 : return label_ref_label (x) == label_ref_label (y);
1801 : :
1802 : 3717486 : case SYMBOL_REF:
1803 : 3717486 : {
1804 : 3717486 : HOST_WIDE_INT distance = 0;
1805 : 3717486 : return (compare_base_symbol_refs (x, y, &distance) == 1
1806 : 3717486 : && distance == 0);
1807 : : }
1808 : :
1809 : 1965173 : case ENTRY_VALUE:
1810 : : /* This is magic, don't go through canonicalization et al. */
1811 : 1965173 : return rtx_equal_p (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y));
1812 : :
1813 : : case VALUE:
1814 : : CASE_CONST_UNIQUE:
1815 : : /* Pointer equality guarantees equality for these nodes. */
1816 : : return false;
1817 : :
1818 : 1333916144 : default:
1819 : 1333916144 : break;
1820 : : }
1821 : :
1822 : : /* canon_rtx knows how to handle plus. No need to canonicalize. */
1823 : 1333916144 : if (code == PLUS)
1824 : 1317024319 : return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
1825 : 634208941 : && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
1826 : 1943926883 : || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
1827 : 136625 : && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
1828 : : /* For commutative operations, the RTX match if the operand match in any
1829 : : order. Also handle the simple binary and unary cases without a loop. */
1830 : 16891825 : if (COMMUTATIVE_P (x))
1831 : : {
1832 : 3601930 : rtx xop0 = canon_rtx (XEXP (x, 0));
1833 : 3601930 : rtx yop0 = canon_rtx (XEXP (y, 0));
1834 : 3601930 : rtx yop1 = canon_rtx (XEXP (y, 1));
1835 : :
1836 : 3601930 : return ((rtx_equal_for_memref_p (xop0, yop0)
1837 : 1260684 : && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)), yop1))
1838 : 3711886 : || (rtx_equal_for_memref_p (xop0, yop1)
1839 : 18 : && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)), yop0)));
1840 : : }
1841 : 13289895 : else if (NON_COMMUTATIVE_P (x))
1842 : : {
1843 : 143046 : return (rtx_equal_for_memref_p (canon_rtx (XEXP (x, 0)),
1844 : 143046 : canon_rtx (XEXP (y, 0)))
1845 : 196548 : && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)),
1846 : 53502 : canon_rtx (XEXP (y, 1))));
1847 : : }
1848 : 13146849 : else if (UNARY_P (x))
1849 : 16353 : return rtx_equal_for_memref_p (canon_rtx (XEXP (x, 0)),
1850 : 32706 : canon_rtx (XEXP (y, 0)));
1851 : :
1852 : : /* Compare the elements. If any pair of corresponding elements
1853 : : fail to match, return false for the whole things.
1854 : :
1855 : : Limit cases to types which actually appear in addresses. */
1856 : :
1857 : 13130496 : fmt = GET_RTX_FORMAT (code);
1858 : 20315121 : for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1859 : : {
1860 : 19778720 : switch (fmt[i])
1861 : : {
1862 : 3386928 : case 'i':
1863 : 3386928 : if (XINT (x, i) != XINT (y, i))
1864 : : return false;
1865 : : break;
1866 : :
1867 : 66 : case 'p':
1868 : 66 : if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y)))
1869 : : return false;
1870 : : break;
1871 : :
1872 : 3386736 : case 'E':
1873 : : /* Two vectors must have the same length. */
1874 : 3386736 : if (XVECLEN (x, i) != XVECLEN (y, i))
1875 : : return false;
1876 : :
1877 : : /* And the corresponding elements must match. */
1878 : 3633163 : for (j = 0; j < XVECLEN (x, i); j++)
1879 : 3387777 : if (rtx_equal_for_memref_p (canon_rtx (XVECEXP (x, i, j)),
1880 : 3387777 : canon_rtx (XVECEXP (y, i, j))) == 0)
1881 : : return false;
1882 : : break;
1883 : :
1884 : 9833852 : case 'e':
1885 : 9833852 : if (rtx_equal_for_memref_p (canon_rtx (XEXP (x, i)),
1886 : 9833852 : canon_rtx (XEXP (y, i))) == 0)
1887 : : return false;
1888 : : break;
1889 : :
1890 : : /* This can happen for asm operands. */
1891 : 0 : case 's':
1892 : 0 : if (strcmp (XSTR (x, i), XSTR (y, i)))
1893 : : return false;
1894 : : break;
1895 : :
1896 : : /* This can happen for an asm which clobbers memory. */
1897 : : case '0':
1898 : : break;
1899 : :
1900 : : /* It is believed that rtx's at this level will never
1901 : : contain anything but integers and other rtx's,
1902 : : except for within LABEL_REFs and SYMBOL_REFs. */
1903 : 0 : default:
1904 : 0 : gcc_unreachable ();
1905 : : }
1906 : : }
1907 : : return true;
1908 : : }
1909 : :
1910 : : static rtx
1911 : 3106392753 : find_base_term (rtx x, vec<std::pair<cselib_val *,
1912 : : struct elt_loc_list *> > &visited_vals)
1913 : : {
1914 : 5920766137 : cselib_val *val;
1915 : 5920766137 : struct elt_loc_list *l, *f;
1916 : 5920766137 : rtx ret;
1917 : 5920766137 : scalar_int_mode int_mode;
1918 : :
1919 : : #if defined (FIND_BASE_TERM)
1920 : : /* Try machine-dependent ways to find the base term. */
1921 : 5920766137 : x = FIND_BASE_TERM (x);
1922 : : #endif
1923 : :
1924 : 5920766137 : switch (GET_CODE (x))
1925 : : {
1926 : 2057978756 : case REG:
1927 : 2057978756 : return REG_BASE_VALUE (x);
1928 : :
1929 : 0 : case TRUNCATE:
1930 : : /* As we do not know which address space the pointer is referring to, we can
1931 : : handle this only if the target does not support different pointer or
1932 : : address modes depending on the address space. */
1933 : 0 : if (!target_default_pointer_address_modes_p ())
1934 : : return 0;
1935 : 93653139 : if (!is_a <scalar_int_mode> (GET_MODE (x), &int_mode)
1936 : 0 : || GET_MODE_PRECISION (int_mode) < GET_MODE_PRECISION (Pmode))
1937 : : return 0;
1938 : : /* Fall through. */
1939 : 43108753 : case HIGH:
1940 : 43108753 : case PRE_INC:
1941 : 43108753 : case PRE_DEC:
1942 : 43108753 : case POST_INC:
1943 : 43108753 : case POST_DEC:
1944 : 43108753 : case PRE_MODIFY:
1945 : 43108753 : case POST_MODIFY:
1946 : 43108753 : return find_base_term (XEXP (x, 0), visited_vals);
1947 : :
1948 : 397 : case ZERO_EXTEND:
1949 : 397 : case SIGN_EXTEND: /* Used for Alpha/NT pointers */
1950 : : /* As we do not know which address space the pointer is referring to, we can
1951 : : handle this only if the target does not support different pointer or
1952 : : address modes depending on the address space. */
1953 : 397 : if (!target_default_pointer_address_modes_p ())
1954 : : return 0;
1955 : :
1956 : 397 : {
1957 : 397 : rtx temp = find_base_term (XEXP (x, 0), visited_vals);
1958 : :
1959 : 397 : if (temp != 0 && CONSTANT_P (temp))
1960 : 0 : temp = convert_memory_address (Pmode, temp);
1961 : :
1962 : : return temp;
1963 : : }
1964 : :
1965 : 830203477 : case VALUE:
1966 : 830203477 : val = CSELIB_VAL_PTR (x);
1967 : 830203477 : ret = NULL_RTX;
1968 : :
1969 : 830203477 : if (!val)
1970 : : return ret;
1971 : :
1972 : 830203477 : if (cselib_sp_based_value_p (val))
1973 : 19313714 : return static_reg_base_value[STACK_POINTER_REGNUM];
1974 : :
1975 : 1621779526 : if (visited_vals.length () > (unsigned) param_max_find_base_term_values)
1976 : : return ret;
1977 : :
1978 : 808887834 : f = val->locs;
1979 : : /* Reset val->locs to avoid infinite recursion. */
1980 : 808887834 : if (f)
1981 : 643765796 : visited_vals.safe_push (std::make_pair (val, f));
1982 : 808887834 : val->locs = NULL;
1983 : :
1984 : 1451880618 : for (l = f; l; l = l->next)
1985 : 809224848 : if (GET_CODE (l->loc) == VALUE
1986 : 111730449 : && CSELIB_VAL_PTR (l->loc)->locs
1987 : 111722344 : && !CSELIB_VAL_PTR (l->loc)->locs->next
1988 : 111718071 : && CSELIB_VAL_PTR (l->loc)->locs->loc == x)
1989 : 111718071 : continue;
1990 : 697506777 : else if ((ret = find_base_term (l->loc, visited_vals)) != 0)
1991 : : break;
1992 : :
1993 : : return ret;
1994 : :
1995 : 0 : case LO_SUM:
1996 : : /* The standard form is (lo_sum reg sym) so look only at the
1997 : : second operand. */
1998 : 0 : return find_base_term (XEXP (x, 1), visited_vals);
1999 : :
2000 : 30407114 : case CONST:
2001 : 30407114 : x = XEXP (x, 0);
2002 : 30407114 : if (GET_CODE (x) != PLUS && GET_CODE (x) != MINUS)
2003 : : return 0;
2004 : : /* Fall through. */
2005 : 2753263519 : case PLUS:
2006 : 2753263519 : case MINUS:
2007 : 2753263519 : {
2008 : 2753263519 : rtx tmp1 = XEXP (x, 0);
2009 : 2753263519 : rtx tmp2 = XEXP (x, 1);
2010 : :
2011 : : /* This is a little bit tricky since we have to determine which of
2012 : : the two operands represents the real base address. Otherwise this
2013 : : routine may return the index register instead of the base register.
2014 : :
2015 : : That may cause us to believe no aliasing was possible, when in
2016 : : fact aliasing is possible.
2017 : :
2018 : : We use a few simple tests to guess the base register. Additional
2019 : : tests can certainly be added. For example, if one of the operands
2020 : : is a shift or multiply, then it must be the index register and the
2021 : : other operand is the base register. */
2022 : :
2023 : 2753263519 : if (tmp1 == pic_offset_table_rtx && CONSTANT_P (tmp2))
2024 : : return find_base_term (tmp2, visited_vals);
2025 : :
2026 : 2753263515 : if (CONST_INT_P (tmp1))
2027 : 0 : std::swap (tmp1, tmp2);
2028 : :
2029 : : /* We can only handle binary operators when one of the operands
2030 : : never leads to a base value. */
2031 : 2753263515 : if (CONST_INT_P (tmp2))
2032 : : return find_base_term (tmp1, visited_vals);
2033 : :
2034 : : /* We could not determine which of the two operands was the
2035 : : base register and which was the index. So we can determine
2036 : : nothing from the base alias check. */
2037 : : return 0;
2038 : : }
2039 : :
2040 : 70499905 : case AND:
2041 : : /* Look through aligning ANDs. And AND with zero or one with
2042 : : the LSB set isn't one (see for example PR92462). */
2043 : 70499905 : if (CONST_INT_P (XEXP (x, 1))
2044 : 70499856 : && INTVAL (XEXP (x, 1)) != 0
2045 : 70499856 : && (INTVAL (XEXP (x, 1)) & 1) == 0)
2046 : 70499852 : return find_base_term (XEXP (x, 0), visited_vals);
2047 : : return 0;
2048 : :
2049 : : case SYMBOL_REF:
2050 : : case LABEL_REF:
2051 : : return x;
2052 : :
2053 : : default:
2054 : : return 0;
2055 : : }
2056 : : }
2057 : :
2058 : : /* Wrapper around the worker above which removes locs from visited VALUEs
2059 : : to avoid visiting them multiple times. We unwind that changes here. */
2060 : :
2061 : : static rtx
2062 : 2408885579 : find_base_term (rtx x)
2063 : : {
2064 : 2408885579 : auto_vec<std::pair<cselib_val *, struct elt_loc_list *>, 32> visited_vals;
2065 : 2408885579 : rtx res = find_base_term (x, visited_vals);
2066 : 6105302750 : for (unsigned i = 0; i < visited_vals.length (); ++i)
2067 : 643765796 : visited_vals[i].first->locs = visited_vals[i].second;
2068 : 2408885579 : return res;
2069 : 2408885579 : }
2070 : :
2071 : : /* Return true if accesses to address X may alias accesses based
2072 : : on the stack pointer. */
2073 : :
2074 : : bool
2075 : 13665583 : may_be_sp_based_p (rtx x)
2076 : : {
2077 : 13665583 : rtx base = find_base_term (x);
2078 : 13665583 : return !base || base == static_reg_base_value[STACK_POINTER_REGNUM];
2079 : : }
2080 : :
2081 : : /* BASE1 and BASE2 are decls. Return 1 if they refer to same object, 0
2082 : : if they refer to different objects and -1 if we cannot decide. */
2083 : :
2084 : : int
2085 : 1339965503 : compare_base_decls (tree base1, tree base2)
2086 : : {
2087 : 1339965503 : int ret;
2088 : 1339965503 : gcc_checking_assert (DECL_P (base1) && DECL_P (base2));
2089 : 1339965503 : if (base1 == base2)
2090 : : return 1;
2091 : :
2092 : : /* If we have two register decls with register specification we
2093 : : cannot decide unless their assembler names are the same. */
2094 : 1165760717 : if (VAR_P (base1)
2095 : 1118483067 : && VAR_P (base2)
2096 : 1113991095 : && DECL_HARD_REGISTER (base1)
2097 : 13209 : && DECL_HARD_REGISTER (base2)
2098 : 12742 : && DECL_ASSEMBLER_NAME_SET_P (base1)
2099 : 1165773459 : && DECL_ASSEMBLER_NAME_SET_P (base2))
2100 : : {
2101 : 12742 : if (DECL_ASSEMBLER_NAME_RAW (base1) == DECL_ASSEMBLER_NAME_RAW (base2))
2102 : : return 1;
2103 : 12730 : return -1;
2104 : : }
2105 : :
2106 : : /* Declarations of non-automatic variables may have aliases. All other
2107 : : decls are unique. */
2108 : 1165747975 : if (!decl_in_symtab_p (base1)
2109 : 1165747975 : || !decl_in_symtab_p (base2))
2110 : : return 0;
2111 : :
2112 : : /* Don't cause symbols to be inserted by the act of checking. */
2113 : 83069162 : symtab_node *node1 = symtab_node::get (base1);
2114 : 83069162 : if (!node1)
2115 : : return 0;
2116 : 83053849 : symtab_node *node2 = symtab_node::get (base2);
2117 : 83053849 : if (!node2)
2118 : : return 0;
2119 : :
2120 : 83035113 : ret = node1->equal_address_to (node2, true);
2121 : 83035113 : return ret;
2122 : : }
2123 : :
2124 : : /* Compare SYMBOL_REFs X_BASE and Y_BASE.
2125 : :
2126 : : - Return 1 if Y_BASE - X_BASE is constant, adding that constant
2127 : : to *DISTANCE if DISTANCE is nonnull.
2128 : :
2129 : : - Return 0 if no accesses based on X_BASE can alias Y_BASE.
2130 : :
2131 : : - Return -1 if one of the two results applies, but we can't tell
2132 : : which at compile time. Update DISTANCE in the same way as
2133 : : for a return value of 1, for the case in which that holds. */
2134 : :
2135 : : static int
2136 : 22325704 : compare_base_symbol_refs (const_rtx x_base, const_rtx y_base,
2137 : : HOST_WIDE_INT *distance)
2138 : : {
2139 : 22325704 : tree x_decl = SYMBOL_REF_DECL (x_base);
2140 : 22325704 : tree y_decl = SYMBOL_REF_DECL (y_base);
2141 : 22325704 : bool binds_def = true;
2142 : 22325704 : bool swap = false;
2143 : :
2144 : 22325704 : if (XSTR (x_base, 0) == XSTR (y_base, 0))
2145 : : return 1;
2146 : 21971170 : if (x_decl && y_decl)
2147 : 21971170 : return compare_base_decls (x_decl, y_decl);
2148 : 0 : if (x_decl || y_decl)
2149 : : {
2150 : : if (!x_decl)
2151 : : {
2152 : : swap = true;
2153 : : std::swap (x_decl, y_decl);
2154 : : std::swap (x_base, y_base);
2155 : : }
2156 : : /* We handle specially only section anchors. Other symbols are
2157 : : either equal (via aliasing) or refer to different objects. */
2158 : 0 : if (!SYMBOL_REF_HAS_BLOCK_INFO_P (y_base))
2159 : : return -1;
2160 : : /* Anchors contains static VAR_DECLs and CONST_DECLs. We are safe
2161 : : to ignore CONST_DECLs because they are readonly. */
2162 : 0 : if (!VAR_P (x_decl)
2163 : 0 : || (!TREE_STATIC (x_decl) && !TREE_PUBLIC (x_decl)))
2164 : : return 0;
2165 : :
2166 : 0 : symtab_node *x_node = symtab_node::get_create (x_decl)
2167 : 0 : ->ultimate_alias_target ();
2168 : : /* External variable cannot be in section anchor. */
2169 : 0 : if (!x_node->definition)
2170 : : return 0;
2171 : 0 : x_base = XEXP (DECL_RTL (x_node->decl), 0);
2172 : : /* If not in anchor, we can disambiguate. */
2173 : 0 : if (!SYMBOL_REF_HAS_BLOCK_INFO_P (x_base))
2174 : : return 0;
2175 : :
2176 : : /* We have an alias of anchored variable. If it can be interposed;
2177 : : we must assume it may or may not alias its anchor. */
2178 : 0 : binds_def = decl_binds_to_current_def_p (x_decl);
2179 : : }
2180 : : /* If we have variable in section anchor, we can compare by offset. */
2181 : 0 : if (SYMBOL_REF_HAS_BLOCK_INFO_P (x_base)
2182 : 0 : && SYMBOL_REF_HAS_BLOCK_INFO_P (y_base))
2183 : : {
2184 : 0 : if (SYMBOL_REF_BLOCK (x_base) != SYMBOL_REF_BLOCK (y_base))
2185 : : return 0;
2186 : 0 : if (distance)
2187 : 0 : *distance += (swap ? -1 : 1) * (SYMBOL_REF_BLOCK_OFFSET (y_base)
2188 : 0 : - SYMBOL_REF_BLOCK_OFFSET (x_base));
2189 : 0 : return binds_def ? 1 : -1;
2190 : : }
2191 : : /* Either the symbols are equal (via aliasing) or they refer to
2192 : : different objects. */
2193 : : return -1;
2194 : : }
2195 : :
2196 : : /* Return false if the addresses X and Y are known to point to different
2197 : : objects, true if they might be pointers to the same object. */
2198 : :
2199 : : static bool
2200 : 1197516428 : base_alias_check (rtx x, rtx x_base, rtx y, rtx y_base,
2201 : : machine_mode x_mode, machine_mode y_mode)
2202 : : {
2203 : : /* If the address itself has no known base see if a known equivalent
2204 : : value has one. If either address still has no known base, nothing
2205 : : is known about aliasing. */
2206 : 1197516428 : if (x_base == 0)
2207 : : {
2208 : 143552185 : rtx x_c;
2209 : :
2210 : 143552185 : if (! flag_expensive_optimizations || (x_c = canon_rtx (x)) == x)
2211 : 143397323 : return true;
2212 : :
2213 : 154862 : x_base = find_base_term (x_c);
2214 : 154862 : if (x_base == 0)
2215 : : return true;
2216 : : }
2217 : :
2218 : 1053966238 : if (y_base == 0)
2219 : : {
2220 : 160627384 : rtx y_c;
2221 : 160627384 : if (! flag_expensive_optimizations || (y_c = canon_rtx (y)) == y)
2222 : 160596756 : return true;
2223 : :
2224 : 30628 : y_base = find_base_term (y_c);
2225 : 30628 : if (y_base == 0)
2226 : : return true;
2227 : : }
2228 : :
2229 : : /* If the base addresses are equal nothing is known about aliasing. */
2230 : 893341390 : if (rtx_equal_p (x_base, y_base))
2231 : : return true;
2232 : :
2233 : : /* The base addresses are different expressions. If they are not accessed
2234 : : via AND, there is no conflict. We can bring knowledge of object
2235 : : alignment into play here. For example, on alpha, "char a, b;" can
2236 : : alias one another, though "char a; long b;" cannot. AND addresses may
2237 : : implicitly alias surrounding objects; i.e. unaligned access in DImode
2238 : : via AND address can alias all surrounding object types except those
2239 : : with aligment 8 or higher. */
2240 : 130575072 : if (GET_CODE (x) == AND && GET_CODE (y) == AND)
2241 : : return true;
2242 : 130575072 : if (GET_CODE (x) == AND
2243 : 130575072 : && (!CONST_INT_P (XEXP (x, 1))
2244 : 2940 : || (int) GET_MODE_UNIT_SIZE (y_mode) < -INTVAL (XEXP (x, 1))))
2245 : : return true;
2246 : 130572302 : if (GET_CODE (y) == AND
2247 : 130572302 : && (!CONST_INT_P (XEXP (y, 1))
2248 : 2511 : || (int) GET_MODE_UNIT_SIZE (x_mode) < -INTVAL (XEXP (y, 1))))
2249 : : return true;
2250 : :
2251 : : /* Differing symbols not accessed via AND never alias. */
2252 : 130569900 : if (GET_CODE (x_base) == SYMBOL_REF && GET_CODE (y_base) == SYMBOL_REF)
2253 : 18115559 : return compare_base_symbol_refs (x_base, y_base) != 0;
2254 : :
2255 : 112454341 : if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
2256 : : return false;
2257 : :
2258 : 122602789 : if (unique_base_value_p (x_base) || unique_base_value_p (y_base))
2259 : : return false;
2260 : :
2261 : : return true;
2262 : : }
2263 : :
2264 : : /* Return TRUE if EXPR refers to a VALUE whose uid is greater than
2265 : : (or equal to) that of V. */
2266 : :
2267 : : static bool
2268 : 237566909 : refs_newer_value_p (const_rtx expr, rtx v)
2269 : : {
2270 : 237566909 : int minuid = CSELIB_VAL_PTR (v)->uid;
2271 : 237566909 : subrtx_iterator::array_type array;
2272 : 668700254 : FOR_EACH_SUBRTX (iter, array, expr, NONCONST)
2273 : 572176206 : if (GET_CODE (*iter) == VALUE && CSELIB_VAL_PTR (*iter)->uid >= minuid)
2274 : 141042861 : return true;
2275 : 96524048 : return false;
2276 : 237566909 : }
2277 : :
2278 : : /* Convert the address X into something we can use. This is done by returning
2279 : : it unchanged unless it is a VALUE or VALUE +/- constant; for VALUE
2280 : : we call cselib to get a more useful rtx. */
2281 : :
2282 : : rtx
2283 : 3728992909 : get_addr (rtx x)
2284 : : {
2285 : 3728992909 : cselib_val *v;
2286 : 3728992909 : struct elt_loc_list *l;
2287 : :
2288 : 3728992909 : if (GET_CODE (x) != VALUE)
2289 : : {
2290 : 2355182568 : if ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS)
2291 : 1997939310 : && GET_CODE (XEXP (x, 0)) == VALUE
2292 : 114156309 : && CONST_SCALAR_INT_P (XEXP (x, 1)))
2293 : : {
2294 : 107977849 : rtx op0 = get_addr (XEXP (x, 0));
2295 : 107977849 : if (op0 != XEXP (x, 0))
2296 : : {
2297 : 29447014 : poly_int64 c;
2298 : 29447014 : if (GET_CODE (x) == PLUS
2299 : 29447014 : && poly_int_rtx_p (XEXP (x, 1), &c))
2300 : 29447014 : return plus_constant (GET_MODE (x), op0, c);
2301 : 0 : return simplify_gen_binary (GET_CODE (x), GET_MODE (x),
2302 : 0 : op0, XEXP (x, 1));
2303 : : }
2304 : : }
2305 : 2325735554 : return x;
2306 : : }
2307 : 1373810341 : v = CSELIB_VAL_PTR (x);
2308 : 1373810341 : if (v)
2309 : : {
2310 : 1373810341 : bool have_equivs = cselib_have_permanent_equivalences ();
2311 : 1373810341 : if (have_equivs)
2312 : 327267362 : v = canonical_cselib_val (v);
2313 : 2675514822 : for (l = v->locs; l; l = l->next)
2314 : 1326274524 : if (CONSTANT_P (l->loc))
2315 : 24570043 : return l->loc;
2316 : 1608301914 : for (l = v->locs; l; l = l->next)
2317 : 1229828173 : if (!REG_P (l->loc) && !MEM_P (l->loc)
2318 : : /* Avoid infinite recursion when potentially dealing with
2319 : : var-tracking artificial equivalences, by skipping the
2320 : : equivalences themselves, and not choosing expressions
2321 : : that refer to newer VALUEs. */
2322 : 2525644944 : && (!have_equivs
2323 : 277420594 : || (GET_CODE (l->loc) != VALUE
2324 : 166251437 : && !refs_newer_value_p (l->loc, x))))
2325 : 1042431745 : return l->loc;
2326 : 306808553 : if (have_equivs)
2327 : : {
2328 : 366653249 : for (l = v->locs; l; l = l->next)
2329 : 147088675 : if (REG_P (l->loc)
2330 : 147088675 : || (GET_CODE (l->loc) != VALUE
2331 : 71315472 : && !refs_newer_value_p (l->loc, x)))
2332 : 6233119 : return l->loc;
2333 : : /* Return the canonical value. */
2334 : 219564574 : return v->val_rtx;
2335 : : }
2336 : 81010860 : if (v->locs)
2337 : 44184760 : return v->locs->loc;
2338 : : }
2339 : : return x;
2340 : : }
2341 : :
2342 : : /* Return the address of the (N_REFS + 1)th memory reference to ADDR
2343 : : where SIZE is the size in bytes of the memory reference. If ADDR
2344 : : is not modified by the memory reference then ADDR is returned. */
2345 : :
2346 : : static rtx
2347 : 5154419204 : addr_side_effect_eval (rtx addr, poly_int64 size, int n_refs)
2348 : : {
2349 : 5154419204 : poly_int64 offset = 0;
2350 : :
2351 : 5154419204 : switch (GET_CODE (addr))
2352 : : {
2353 : 0 : case PRE_INC:
2354 : 0 : offset = (n_refs + 1) * size;
2355 : 0 : break;
2356 : 22038054 : case PRE_DEC:
2357 : 22038054 : offset = -(n_refs + 1) * size;
2358 : 22038054 : break;
2359 : : case POST_INC:
2360 : 617234 : offset = n_refs * size;
2361 : 617234 : break;
2362 : 0 : case POST_DEC:
2363 : 0 : offset = -n_refs * size;
2364 : 0 : break;
2365 : :
2366 : : default:
2367 : : return addr;
2368 : : }
2369 : :
2370 : 22655288 : addr = plus_constant (GET_MODE (addr), XEXP (addr, 0), offset);
2371 : 22655288 : addr = canon_rtx (addr);
2372 : :
2373 : 22655288 : return addr;
2374 : : }
2375 : :
2376 : : /* Return TRUE if an object X sized at XSIZE bytes and another object
2377 : : Y sized at YSIZE bytes, starting C bytes after X, may overlap. If
2378 : : any of the sizes is zero, assume an overlap, otherwise use the
2379 : : absolute value of the sizes as the actual sizes. */
2380 : :
2381 : : static inline bool
2382 : 788284894 : offset_overlap_p (poly_int64 c, poly_int64 xsize, poly_int64 ysize)
2383 : : {
2384 : 787992617 : if (known_eq (xsize, 0) || known_eq (ysize, 0))
2385 : : return true;
2386 : :
2387 : 787885695 : if (maybe_ge (c, 0))
2388 : 473491360 : return maybe_gt (maybe_lt (xsize, 0) ? -xsize : xsize, c);
2389 : : else
2390 : 314394335 : return maybe_gt (maybe_lt (ysize, 0) ? -ysize : ysize, -c);
2391 : : }
2392 : :
2393 : : /* Return one if X and Y (memory addresses) reference the
2394 : : same location in memory or if the references overlap.
2395 : : Return zero if they do not overlap, else return
2396 : : minus one in which case they still might reference the same location.
2397 : :
2398 : : C is an offset accumulator. When
2399 : : C is nonzero, we are testing aliases between X and Y + C.
2400 : : XSIZE is the size in bytes of the X reference,
2401 : : similarly YSIZE is the size in bytes for Y.
2402 : : Expect that canon_rtx has been already called for X and Y.
2403 : :
2404 : : If XSIZE or YSIZE is zero, we do not know the amount of memory being
2405 : : referenced (the reference was BLKmode), so make the most pessimistic
2406 : : assumptions.
2407 : :
2408 : : If XSIZE or YSIZE is negative, we may access memory outside the object
2409 : : being referenced as a side effect. This can happen when using AND to
2410 : : align memory references, as is done on the Alpha.
2411 : :
2412 : : Nice to notice that varying addresses cannot conflict with fp if no
2413 : : local variables had their addresses taken, but that's too hard now.
2414 : :
2415 : : ??? Contrary to the tree alias oracle this does not return
2416 : : one for X + non-constant and Y + non-constant when X and Y are equal.
2417 : : If that is fixed the TBAA hack for union type-punning can be removed. */
2418 : :
2419 : : static int
2420 : 1770684491 : memrefs_conflict_p (poly_int64 xsize, rtx x, poly_int64 ysize, rtx y,
2421 : : poly_int64 c)
2422 : : {
2423 : 2577209602 : if (GET_CODE (x) == VALUE)
2424 : : {
2425 : 723978000 : if (REG_P (y))
2426 : : {
2427 : 267027527 : struct elt_loc_list *l = NULL;
2428 : 267027527 : if (CSELIB_VAL_PTR (x))
2429 : 267027527 : for (l = canonical_cselib_val (CSELIB_VAL_PTR (x))->locs;
2430 : 500046932 : l; l = l->next)
2431 : 358413290 : if (REG_P (l->loc) && rtx_equal_for_memref_p (l->loc, y))
2432 : : break;
2433 : 267027527 : if (l)
2434 : : x = y;
2435 : : else
2436 : 141633642 : x = get_addr (x);
2437 : : }
2438 : : /* Don't call get_addr if y is the same VALUE. */
2439 : 456950473 : else if (x != y)
2440 : 456883130 : x = get_addr (x);
2441 : : }
2442 : 2577209602 : if (GET_CODE (y) == VALUE)
2443 : : {
2444 : 424737448 : if (REG_P (x))
2445 : : {
2446 : 12953819 : struct elt_loc_list *l = NULL;
2447 : 12953819 : if (CSELIB_VAL_PTR (y))
2448 : 12953819 : for (l = canonical_cselib_val (CSELIB_VAL_PTR (y))->locs;
2449 : 14814499 : l; l = l->next)
2450 : 1874269 : if (REG_P (l->loc) && rtx_equal_for_memref_p (l->loc, x))
2451 : : break;
2452 : 12953819 : if (l)
2453 : : y = x;
2454 : : else
2455 : 12940230 : y = get_addr (y);
2456 : : }
2457 : : /* Don't call get_addr if x is the same VALUE. */
2458 : 411783629 : else if (y != x)
2459 : 411716286 : y = get_addr (y);
2460 : : }
2461 : 2577209602 : if (GET_CODE (x) == HIGH)
2462 : 0 : x = XEXP (x, 0);
2463 : 2577209602 : else if (GET_CODE (x) == LO_SUM)
2464 : 0 : x = XEXP (x, 1);
2465 : : else
2466 : 2577209602 : x = addr_side_effect_eval (x, maybe_lt (xsize, 0) ? -xsize : xsize, 0);
2467 : 2577209602 : if (GET_CODE (y) == HIGH)
2468 : 0 : y = XEXP (y, 0);
2469 : 2577209602 : else if (GET_CODE (y) == LO_SUM)
2470 : 0 : y = XEXP (y, 1);
2471 : : else
2472 : 2577209602 : y = addr_side_effect_eval (y, maybe_lt (ysize, 0) ? -ysize : ysize, 0);
2473 : :
2474 : 2577209602 : if (GET_CODE (x) == SYMBOL_REF && GET_CODE (y) == SYMBOL_REF)
2475 : : {
2476 : 492659 : HOST_WIDE_INT distance = 0;
2477 : 492659 : int cmp = compare_base_symbol_refs (x, y, &distance);
2478 : :
2479 : : /* If both decls are the same, decide by offsets. */
2480 : 492659 : if (cmp == 1)
2481 : 708853 : return offset_overlap_p (c + distance, xsize, ysize);
2482 : : /* Assume a potential overlap for symbolic addresses that went
2483 : : through alignment adjustments (i.e., that have negative
2484 : : sizes), because we can't know how far they are from each
2485 : : other. */
2486 : 138124 : if (maybe_lt (xsize, 0) || maybe_lt (ysize, 0))
2487 : : return -1;
2488 : : /* If decls are different or we know by offsets that there is no overlap,
2489 : : we win. */
2490 : 630783 : if (!cmp || !offset_overlap_p (c + distance, xsize, ysize))
2491 : 138124 : return 0;
2492 : : /* Decls may or may not be different and offsets overlap....*/
2493 : : return -1;
2494 : : }
2495 : 2576716943 : else if (rtx_equal_for_memref_p (x, y))
2496 : : {
2497 : 273228550 : return offset_overlap_p (c, xsize, ysize);
2498 : : }
2499 : :
2500 : : /* This code used to check for conflicts involving stack references and
2501 : : globals but the base address alias code now handles these cases. */
2502 : :
2503 : 2440080386 : if (GET_CODE (x) == PLUS)
2504 : : {
2505 : : /* The fact that X is canonicalized means that this
2506 : : PLUS rtx is canonicalized. */
2507 : 1459219073 : rtx x0 = XEXP (x, 0);
2508 : 1459219073 : rtx x1 = XEXP (x, 1);
2509 : :
2510 : : /* However, VALUEs might end up in different positions even in
2511 : : canonical PLUSes. Comparing their addresses is enough. */
2512 : 1459219073 : if (x0 == y)
2513 : 21515492 : return memrefs_conflict_p (xsize, x1, ysize, const0_rtx, c);
2514 : 1437703581 : else if (x1 == y)
2515 : 275068 : return memrefs_conflict_p (xsize, x0, ysize, const0_rtx, c);
2516 : :
2517 : 1437428513 : poly_int64 cx1, cy1;
2518 : 1437428513 : if (GET_CODE (y) == PLUS)
2519 : : {
2520 : : /* The fact that Y is canonicalized means that this
2521 : : PLUS rtx is canonicalized. */
2522 : 1304743551 : rtx y0 = XEXP (y, 0);
2523 : 1304743551 : rtx y1 = XEXP (y, 1);
2524 : :
2525 : 1304743551 : if (x0 == y1)
2526 : : return memrefs_conflict_p (xsize, x1, ysize, y0, c);
2527 : 1304701361 : if (x1 == y0)
2528 : : return memrefs_conflict_p (xsize, x0, ysize, y1, c);
2529 : :
2530 : 1304650654 : if (rtx_equal_for_memref_p (x1, y1))
2531 : : return memrefs_conflict_p (xsize, x0, ysize, y0, c);
2532 : 1168059361 : if (rtx_equal_for_memref_p (x0, y0))
2533 : : return memrefs_conflict_p (xsize, x1, ysize, y1, c);
2534 : 544424499 : if (poly_int_rtx_p (x1, &cx1))
2535 : : {
2536 : 1049670421 : if (poly_int_rtx_p (y1, &cy1))
2537 : 521139404 : return memrefs_conflict_p (xsize, x0, ysize, y0,
2538 : 521139404 : c - cx1 + cy1);
2539 : : else
2540 : 7391613 : return memrefs_conflict_p (xsize, x0, ysize, y, c - cx1);
2541 : : }
2542 : 15893482 : else if (poly_int_rtx_p (y1, &cy1))
2543 : 13115450 : return memrefs_conflict_p (xsize, x, ysize, y0, c + cy1);
2544 : :
2545 : : return -1;
2546 : : }
2547 : 132684962 : else if (poly_int_rtx_p (x1, &cx1))
2548 : 106261003 : return memrefs_conflict_p (xsize, x0, ysize, y, c - cx1);
2549 : : }
2550 : 980861313 : else if (GET_CODE (y) == PLUS)
2551 : : {
2552 : : /* The fact that Y is canonicalized means that this
2553 : : PLUS rtx is canonicalized. */
2554 : 77779529 : rtx y0 = XEXP (y, 0);
2555 : 77779529 : rtx y1 = XEXP (y, 1);
2556 : :
2557 : 77779529 : if (x == y0)
2558 : 7654076 : return memrefs_conflict_p (xsize, const0_rtx, ysize, y1, c);
2559 : 70125453 : if (x == y1)
2560 : 666210 : return memrefs_conflict_p (xsize, const0_rtx, ysize, y0, c);
2561 : :
2562 : 69459243 : poly_int64 cy1;
2563 : 69459243 : if (poly_int_rtx_p (y1, &cy1))
2564 : 54942279 : return memrefs_conflict_p (xsize, x, ysize, y0, c + cy1);
2565 : : else
2566 : : return -1;
2567 : : }
2568 : :
2569 : 929505743 : if (GET_CODE (x) == GET_CODE (y))
2570 : 753219199 : switch (GET_CODE (x))
2571 : : {
2572 : 260884 : case MULT:
2573 : 260884 : {
2574 : : /* Handle cases where we expect the second operands to be the
2575 : : same, and check only whether the first operand would conflict
2576 : : or not. */
2577 : 260884 : rtx x0, y0;
2578 : 260884 : rtx x1 = canon_rtx (XEXP (x, 1));
2579 : 260884 : rtx y1 = canon_rtx (XEXP (y, 1));
2580 : 260884 : if (! rtx_equal_for_memref_p (x1, y1))
2581 : : return -1;
2582 : 245494 : x0 = canon_rtx (XEXP (x, 0));
2583 : 245494 : y0 = canon_rtx (XEXP (y, 0));
2584 : 245494 : if (rtx_equal_for_memref_p (x0, y0))
2585 : 0 : return offset_overlap_p (c, xsize, ysize);
2586 : :
2587 : : /* Can't properly adjust our sizes. */
2588 : 245494 : poly_int64 c1;
2589 : 279803703 : if (!poly_int_rtx_p (x1, &c1)
2590 : 244878 : || !can_div_trunc_p (xsize, c1, &xsize)
2591 : 244878 : || !can_div_trunc_p (ysize, c1, &ysize)
2592 : 244878 : || !can_div_trunc_p (c, c1, &c))
2593 : : return -1;
2594 : 244878 : return memrefs_conflict_p (xsize, x0, ysize, y0, c);
2595 : : }
2596 : :
2597 : : default:
2598 : : break;
2599 : : }
2600 : :
2601 : : /* Deal with alignment ANDs by adjusting offset and size so as to
2602 : : cover the maximum range, without taking any previously known
2603 : : alignment into account. Make a size negative after such an
2604 : : adjustments, so that, if we end up with e.g. two SYMBOL_REFs, we
2605 : : assume a potential overlap, because they may end up in contiguous
2606 : : memory locations and the stricter-alignment access may span over
2607 : : part of both. */
2608 : 929244859 : if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1)))
2609 : : {
2610 : 4349904 : HOST_WIDE_INT sc = INTVAL (XEXP (x, 1));
2611 : 4349904 : unsigned HOST_WIDE_INT uc = sc;
2612 : 4349904 : if (sc < 0 && pow2_or_zerop (-uc))
2613 : : {
2614 : 4349480 : if (maybe_gt (xsize, 0))
2615 : 4348590 : xsize = -xsize;
2616 : 4349480 : if (maybe_ne (xsize, 0))
2617 : 4348634 : xsize += sc + 1;
2618 : 4349480 : c -= sc + 1;
2619 : 4349480 : return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
2620 : 4349480 : ysize, y, c);
2621 : : }
2622 : : }
2623 : 924895379 : if (GET_CODE (y) == AND && CONST_INT_P (XEXP (y, 1)))
2624 : : {
2625 : 7076222 : HOST_WIDE_INT sc = INTVAL (XEXP (y, 1));
2626 : 7076222 : unsigned HOST_WIDE_INT uc = sc;
2627 : 7076222 : if (sc < 0 && pow2_or_zerop (-uc))
2628 : : {
2629 : 7073100 : if (maybe_gt (ysize, 0))
2630 : 7072950 : ysize = -ysize;
2631 : 7073100 : if (maybe_ne (ysize, 0))
2632 : 7073063 : ysize += sc + 1;
2633 : 7073100 : c += sc + 1;
2634 : 7073100 : return memrefs_conflict_p (xsize, x,
2635 : 7073100 : ysize, canon_rtx (XEXP (y, 0)), c);
2636 : : }
2637 : : }
2638 : :
2639 : 917822279 : if (CONSTANT_P (x))
2640 : : {
2641 : 663930613 : poly_int64 cx, cy;
2642 : 663930613 : if (poly_int_rtx_p (x, &cx) && poly_int_rtx_p (y, &cy))
2643 : : {
2644 : 651137436 : c += cy - cx;
2645 : 1302027159 : return offset_overlap_p (c, xsize, ysize);
2646 : : }
2647 : :
2648 : 12793177 : if (GET_CODE (x) == CONST)
2649 : : {
2650 : 3738212 : if (GET_CODE (y) == CONST)
2651 : 2851022 : return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
2652 : 2851022 : ysize, canon_rtx (XEXP (y, 0)), c);
2653 : : else
2654 : 887190 : return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
2655 : 887190 : ysize, y, c);
2656 : : }
2657 : 9054965 : if (GET_CODE (y) == CONST)
2658 : 689543 : return memrefs_conflict_p (xsize, x, ysize,
2659 : 689543 : canon_rtx (XEXP (y, 0)), c);
2660 : :
2661 : : /* Assume a potential overlap for symbolic addresses that went
2662 : : through alignment adjustments (i.e., that have negative
2663 : : sizes), because we can't know how far they are from each
2664 : : other. */
2665 : 8365422 : if (CONSTANT_P (y))
2666 : 9265 : return (maybe_lt (xsize, 0)
2667 : 9265 : || maybe_lt (ysize, 0)
2668 : 18530 : || offset_overlap_p (c, xsize, ysize));
2669 : :
2670 : : return -1;
2671 : : }
2672 : :
2673 : : return -1;
2674 : : }
2675 : :
2676 : : /* Functions to compute memory dependencies.
2677 : :
2678 : : Since we process the insns in execution order, we can build tables
2679 : : to keep track of what registers are fixed (and not aliased), what registers
2680 : : are varying in known ways, and what registers are varying in unknown
2681 : : ways.
2682 : :
2683 : : If both memory references are volatile, then there must always be a
2684 : : dependence between the two references, since their order cannot be
2685 : : changed. A volatile and non-volatile reference can be interchanged
2686 : : though.
2687 : :
2688 : : We also must allow AND addresses, because they may generate accesses
2689 : : outside the object being referenced. This is used to generate aligned
2690 : : addresses from unaligned addresses, for instance, the alpha
2691 : : storeqi_unaligned pattern. */
2692 : :
2693 : : /* Read dependence: X is read after read in MEM takes place. There can
2694 : : only be a dependence here if both reads are volatile, or if either is
2695 : : an explicit barrier. */
2696 : :
2697 : : bool
2698 : 28879689 : read_dependence (const_rtx mem, const_rtx x)
2699 : : {
2700 : 28879689 : if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
2701 : : return true;
2702 : 28430194 : if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
2703 : 56852221 : || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
2704 : 12343 : return true;
2705 : : return false;
2706 : : }
2707 : :
2708 : : /* Look at the bottom of the COMPONENT_REF list for a DECL, and return it. */
2709 : :
2710 : : static tree
2711 : 63979320 : decl_for_component_ref (tree x)
2712 : : {
2713 : 87086898 : do
2714 : : {
2715 : 87086898 : x = TREE_OPERAND (x, 0);
2716 : : }
2717 : 87086898 : while (x && TREE_CODE (x) == COMPONENT_REF);
2718 : :
2719 : 63979320 : return x && DECL_P (x) ? x : NULL_TREE;
2720 : : }
2721 : :
2722 : : /* Walk up the COMPONENT_REF list in X and adjust *OFFSET to compensate
2723 : : for the offset of the field reference. *KNOWN_P says whether the
2724 : : offset is known. */
2725 : :
2726 : : static void
2727 : 11719494 : adjust_offset_for_component_ref (tree x, bool *known_p,
2728 : : poly_int64 *offset)
2729 : : {
2730 : 11719494 : if (!*known_p)
2731 : : return;
2732 : 15417807 : do
2733 : : {
2734 : 15417807 : tree xoffset = component_ref_field_offset (x);
2735 : 15417807 : tree field = TREE_OPERAND (x, 1);
2736 : 15417807 : if (!poly_int_tree_p (xoffset))
2737 : : {
2738 : 0 : *known_p = false;
2739 : 0 : return;
2740 : : }
2741 : :
2742 : 15417807 : poly_offset_int woffset
2743 : 15417807 : = (wi::to_poly_offset (xoffset)
2744 : 15417807 : + (wi::to_offset (DECL_FIELD_BIT_OFFSET (field))
2745 : 30835614 : >> LOG2_BITS_PER_UNIT)
2746 : 15417807 : + *offset);
2747 : 15417807 : if (!woffset.to_shwi (offset))
2748 : : {
2749 : 0 : *known_p = false;
2750 : 0 : return;
2751 : : }
2752 : :
2753 : 15417807 : x = TREE_OPERAND (x, 0);
2754 : : }
2755 : 15417807 : while (x && TREE_CODE (x) == COMPONENT_REF);
2756 : : }
2757 : :
2758 : : /* Return true if we can determine the exprs corresponding to memrefs
2759 : : X and Y and they do not overlap.
2760 : : If LOOP_VARIANT is set, skip offset-based disambiguation */
2761 : :
2762 : : bool
2763 : 222994309 : nonoverlapping_memrefs_p (const_rtx x, const_rtx y, bool loop_invariant)
2764 : : {
2765 : 231565805 : tree exprx = MEM_EXPR (x), expry = MEM_EXPR (y);
2766 : 222994309 : rtx rtlx, rtly;
2767 : 222994309 : rtx basex, basey;
2768 : 222994309 : bool moffsetx_known_p, moffsety_known_p;
2769 : 222994309 : poly_int64 moffsetx = 0, moffsety = 0;
2770 : 222994309 : poly_int64 offsetx = 0, offsety = 0, sizex, sizey;
2771 : :
2772 : : /* Unless both have exprs, we can't tell anything. */
2773 : 222994309 : if (exprx == 0 || expry == 0)
2774 : : return false;
2775 : :
2776 : : /* For spill-slot accesses make sure we have valid offsets. */
2777 : 194104641 : if ((exprx == get_spill_slot_decl (false)
2778 : 14213299 : && ! MEM_OFFSET_KNOWN_P (x))
2779 : 208317940 : || (expry == get_spill_slot_decl (false)
2780 : 24464075 : && ! MEM_OFFSET_KNOWN_P (y)))
2781 : 0 : return false;
2782 : :
2783 : : /* If the field reference test failed, look at the DECLs involved. */
2784 : 194104641 : moffsetx_known_p = MEM_OFFSET_KNOWN_P (x);
2785 : 194104641 : if (moffsetx_known_p)
2786 : 193746721 : moffsetx = MEM_OFFSET (x);
2787 : 194104641 : if (TREE_CODE (exprx) == COMPONENT_REF)
2788 : : {
2789 : 37494028 : tree t = decl_for_component_ref (exprx);
2790 : 37494028 : if (! t)
2791 : : return false;
2792 : 4825656 : adjust_offset_for_component_ref (exprx, &moffsetx_known_p, &moffsetx);
2793 : 4825656 : exprx = t;
2794 : : }
2795 : :
2796 : 161436269 : moffsety_known_p = MEM_OFFSET_KNOWN_P (y);
2797 : 161436269 : if (moffsety_known_p)
2798 : 160270166 : moffsety = MEM_OFFSET (y);
2799 : 161436269 : if (TREE_CODE (expry) == COMPONENT_REF)
2800 : : {
2801 : 26485292 : tree t = decl_for_component_ref (expry);
2802 : 26485292 : if (! t)
2803 : : return false;
2804 : 6893838 : adjust_offset_for_component_ref (expry, &moffsety_known_p, &moffsety);
2805 : 6893838 : expry = t;
2806 : : }
2807 : :
2808 : 141844815 : if (! DECL_P (exprx) || ! DECL_P (expry))
2809 : : return false;
2810 : :
2811 : : /* If we refer to different gimple registers, or one gimple register
2812 : : and one non-gimple-register, we know they can't overlap. First,
2813 : : gimple registers don't have their addresses taken. Now, there
2814 : : could be more than one stack slot for (different versions of) the
2815 : : same gimple register, but we can presumably tell they don't
2816 : : overlap based on offsets from stack base addresses elsewhere.
2817 : : It's important that we don't proceed to DECL_RTL, because gimple
2818 : : registers may not pass DECL_RTL_SET_P, and make_decl_rtl won't be
2819 : : able to do anything about them since no SSA information will have
2820 : : remained to guide it. */
2821 : 12767062 : if (is_gimple_reg (exprx) || is_gimple_reg (expry))
2822 : 3586018 : return exprx != expry
2823 : 3586018 : || (moffsetx_known_p && moffsety_known_p
2824 : 294202 : && MEM_SIZE_KNOWN_P (x) && MEM_SIZE_KNOWN_P (y)
2825 : 294202 : && !offset_overlap_p (moffsety - moffsetx,
2826 : 147101 : MEM_SIZE (x), MEM_SIZE (y)));
2827 : :
2828 : : /* With invalid code we can end up storing into the constant pool.
2829 : : Bail out to avoid ICEing when creating RTL for this.
2830 : : See gfortran.dg/lto/20091028-2_0.f90. */
2831 : 9181044 : if (TREE_CODE (exprx) == CONST_DECL
2832 : 9181044 : || TREE_CODE (expry) == CONST_DECL)
2833 : : return true;
2834 : :
2835 : : /* If one decl is known to be a function or label in a function and
2836 : : the other is some kind of data, they can't overlap. */
2837 : 9181044 : if ((TREE_CODE (exprx) == FUNCTION_DECL
2838 : 9181044 : || TREE_CODE (exprx) == LABEL_DECL)
2839 : : != (TREE_CODE (expry) == FUNCTION_DECL
2840 : 9181044 : || TREE_CODE (expry) == LABEL_DECL))
2841 : : return true;
2842 : :
2843 : : /* If either of the decls doesn't have DECL_RTL set (e.g. marked as
2844 : : living in multiple places), we can't tell anything. Exception
2845 : : are FUNCTION_DECLs for which we can create DECL_RTL on demand. */
2846 : 9008849 : if ((!DECL_RTL_SET_P (exprx) && TREE_CODE (exprx) != FUNCTION_DECL)
2847 : 18017698 : || (!DECL_RTL_SET_P (expry) && TREE_CODE (expry) != FUNCTION_DECL))
2848 : : return false;
2849 : :
2850 : 9008849 : rtlx = DECL_RTL (exprx);
2851 : 9008849 : rtly = DECL_RTL (expry);
2852 : :
2853 : : /* If either RTL is not a MEM, it must be a REG or CONCAT, meaning they
2854 : : can't overlap unless they are the same because we never reuse that part
2855 : : of the stack frame used for locals for spilled pseudos. */
2856 : 9008254 : if ((!MEM_P (rtlx) || !MEM_P (rtly))
2857 : 9033999 : && ! rtx_equal_p (rtlx, rtly))
2858 : : return true;
2859 : :
2860 : : /* If we have MEMs referring to different address spaces (which can
2861 : : potentially overlap), we cannot easily tell from the addresses
2862 : : whether the references overlap. */
2863 : 8983104 : if (MEM_P (rtlx) && MEM_P (rtly)
2864 : 17966298 : && MEM_ADDR_SPACE (rtlx) != MEM_ADDR_SPACE (rtly))
2865 : : return false;
2866 : :
2867 : : /* Get the base and offsets of both decls. If either is a register, we
2868 : : know both are and are the same, so use that as the base. The only
2869 : : we can avoid overlap is if we can deduce that they are nonoverlapping
2870 : : pieces of that decl, which is very rare. */
2871 : 8983194 : basex = MEM_P (rtlx) ? XEXP (rtlx, 0) : rtlx;
2872 : 8983194 : basex = strip_offset_and_add (basex, &offsetx);
2873 : :
2874 : 8983194 : basey = MEM_P (rtly) ? XEXP (rtly, 0) : rtly;
2875 : 8983194 : basey = strip_offset_and_add (basey, &offsety);
2876 : :
2877 : : /* If the bases are different, we know they do not overlap if both
2878 : : are constants or if one is a constant and the other a pointer into the
2879 : : stack frame. Otherwise a different base means we can't tell if they
2880 : : overlap or not. */
2881 : 8983194 : if (compare_base_decls (exprx, expry) == 0)
2882 : 7038760 : return ((CONSTANT_P (basex) && CONSTANT_P (basey))
2883 : 1860650 : || (CONSTANT_P (basex) && REG_P (basey)
2884 : 273502 : && REGNO_PTR_FRAME_P (REGNO (basey)))
2885 : 10215284 : || (CONSTANT_P (basey) && REG_P (basex)
2886 : 110430 : && REGNO_PTR_FRAME_P (REGNO (basex))));
2887 : :
2888 : : /* Offset based disambiguation not appropriate for loop invariant */
2889 : 357286 : if (loop_invariant)
2890 : : return false;
2891 : :
2892 : : /* Offset based disambiguation is OK even if we do not know that the
2893 : : declarations are necessarily different
2894 : : (i.e. compare_base_decls (exprx, expry) == -1) */
2895 : :
2896 : 357376 : sizex = (!MEM_P (rtlx) ? poly_int64 (GET_MODE_SIZE (GET_MODE (rtlx)))
2897 : 357196 : : MEM_SIZE_KNOWN_P (rtlx) ? MEM_SIZE (rtlx)
2898 : : : -1);
2899 : 357376 : sizey = (!MEM_P (rtly) ? poly_int64 (GET_MODE_SIZE (GET_MODE (rtly)))
2900 : 357196 : : MEM_SIZE_KNOWN_P (rtly) ? MEM_SIZE (rtly)
2901 : : : -1);
2902 : :
2903 : : /* If we have an offset for either memref, it can update the values computed
2904 : : above. */
2905 : 357286 : if (moffsetx_known_p)
2906 : 357280 : offsetx += moffsetx, sizex -= moffsetx;
2907 : 357286 : if (moffsety_known_p)
2908 : 357270 : offsety += moffsety, sizey -= moffsety;
2909 : :
2910 : : /* If a memref has both a size and an offset, we can use the smaller size.
2911 : : We can't do this if the offset isn't known because we must view this
2912 : : memref as being anywhere inside the DECL's MEM. */
2913 : 357286 : if (MEM_SIZE_KNOWN_P (x) && moffsetx_known_p)
2914 : 357280 : sizex = MEM_SIZE (x);
2915 : 357286 : if (MEM_SIZE_KNOWN_P (y) && moffsety_known_p)
2916 : 357270 : sizey = MEM_SIZE (y);
2917 : :
2918 : 357286 : return !ranges_maybe_overlap_p (offsetx, sizex, offsety, sizey);
2919 : : }
2920 : :
2921 : : /* Helper for true_dependence and canon_true_dependence.
2922 : : Checks for true dependence: X is read after store in MEM takes place.
2923 : :
2924 : : If MEM_CANONICALIZED is FALSE, then X_ADDR and MEM_ADDR should be
2925 : : NULL_RTX, and the canonical addresses of MEM and X are both computed
2926 : : here. If MEM_CANONICALIZED, then MEM must be already canonicalized.
2927 : :
2928 : : If X_ADDR is non-NULL, it is used in preference of XEXP (x, 0).
2929 : :
2930 : : Returns true if there is a true dependence, false otherwise. */
2931 : :
2932 : : static bool
2933 : 807671649 : true_dependence_1 (const_rtx mem, machine_mode mem_mode, rtx mem_addr,
2934 : : const_rtx x, rtx x_addr, bool mem_canonicalized)
2935 : : {
2936 : 807671649 : rtx true_mem_addr;
2937 : 807671649 : rtx base;
2938 : 807671649 : int ret;
2939 : :
2940 : 807671649 : gcc_checking_assert (mem_canonicalized ? (mem_addr != NULL_RTX)
2941 : : : (mem_addr == NULL_RTX && x_addr == NULL_RTX));
2942 : :
2943 : 807671649 : if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
2944 : : return true;
2945 : :
2946 : : /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
2947 : : This is used in epilogue deallocation functions, and in cselib. */
2948 : 807024652 : if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
2949 : : return true;
2950 : 807002279 : if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
2951 : : return true;
2952 : 803026499 : if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
2953 : 1606030096 : || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
2954 : : return true;
2955 : :
2956 : 801552350 : if (! x_addr)
2957 : 47382047 : x_addr = XEXP (x, 0);
2958 : 801552350 : x_addr = get_addr (x_addr);
2959 : :
2960 : 801552350 : if (! mem_addr)
2961 : : {
2962 : 38766615 : mem_addr = XEXP (mem, 0);
2963 : 38766615 : if (mem_mode == VOIDmode)
2964 : 19708779 : mem_mode = GET_MODE (mem);
2965 : : }
2966 : 801552350 : true_mem_addr = get_addr (mem_addr);
2967 : :
2968 : : /* Read-only memory is by definition never modified, and therefore can't
2969 : : conflict with anything. However, don't assume anything when AND
2970 : : addresses are involved and leave to the code below to determine
2971 : : dependence. We don't expect to find read-only set on MEM, but
2972 : : stupid user tricks can produce them, so don't die. */
2973 : 801552350 : if (MEM_READONLY_P (x)
2974 : 3960819 : && GET_CODE (x_addr) != AND
2975 : 805513169 : && GET_CODE (true_mem_addr) != AND)
2976 : : return false;
2977 : :
2978 : : /* If we have MEMs referring to different address spaces (which can
2979 : : potentially overlap), we cannot easily tell from the addresses
2980 : : whether the references overlap. */
2981 : 831944157 : if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
2982 : : return true;
2983 : :
2984 : 797519140 : base = find_base_term (x_addr);
2985 : 797519140 : if (base && (GET_CODE (base) == LABEL_REF
2986 : 692701411 : || (GET_CODE (base) == SYMBOL_REF
2987 : 57592445 : && CONSTANT_POOL_ADDRESS_P (base))))
2988 : : return false;
2989 : :
2990 : 797518248 : rtx mem_base = find_base_term (true_mem_addr);
2991 : 797518248 : if (! base_alias_check (x_addr, base, true_mem_addr, mem_base,
2992 : 797518248 : GET_MODE (x), mem_mode))
2993 : : return false;
2994 : :
2995 : 721947743 : x_addr = canon_rtx (x_addr);
2996 : 721947743 : if (!mem_canonicalized)
2997 : 27554784 : mem_addr = canon_rtx (true_mem_addr);
2998 : :
2999 : 1443895486 : if ((ret = memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
3000 : 1443895486 : SIZE_FOR_MODE (x), x_addr, 0)) != -1)
3001 : 504897046 : return !!ret;
3002 : :
3003 : 217050697 : if (mems_in_disjoint_alias_sets_p (x, mem))
3004 : : return false;
3005 : :
3006 : 160486181 : if (nonoverlapping_memrefs_p (mem, x, false))
3007 : : return false;
3008 : :
3009 : 152450026 : return rtx_refs_may_alias_p (x, mem, true);
3010 : : }
3011 : :
3012 : : /* True dependence: X is read after store in MEM takes place. */
3013 : :
3014 : : bool
3015 : 41632840 : true_dependence (const_rtx mem, machine_mode mem_mode, const_rtx x)
3016 : : {
3017 : 41632840 : return true_dependence_1 (mem, mem_mode, NULL_RTX,
3018 : 41632840 : x, NULL_RTX, /*mem_canonicalized=*/false);
3019 : : }
3020 : :
3021 : : /* Canonical true dependence: X is read after store in MEM takes place.
3022 : : Variant of true_dependence which assumes MEM has already been
3023 : : canonicalized (hence we no longer do that here).
3024 : : The mem_addr argument has been added, since true_dependence_1 computed
3025 : : this value prior to canonicalizing. */
3026 : :
3027 : : bool
3028 : 766038809 : canon_true_dependence (const_rtx mem, machine_mode mem_mode, rtx mem_addr,
3029 : : const_rtx x, rtx x_addr)
3030 : : {
3031 : 766038809 : return true_dependence_1 (mem, mem_mode, mem_addr,
3032 : 766038809 : x, x_addr, /*mem_canonicalized=*/true);
3033 : : }
3034 : :
3035 : : /* Returns true if a write to X might alias a previous read from
3036 : : (or, if WRITEP is true, a write to) MEM.
3037 : : If X_CANONCALIZED is true, then X_ADDR is the canonicalized address of X,
3038 : : and X_MODE the mode for that access.
3039 : : If MEM_CANONICALIZED is true, MEM is canonicalized. */
3040 : :
3041 : : static bool
3042 : 436796056 : write_dependence_p (const_rtx mem,
3043 : : const_rtx x, machine_mode x_mode, rtx x_addr,
3044 : : bool mem_canonicalized, bool x_canonicalized, bool writep)
3045 : : {
3046 : 436796056 : rtx mem_addr;
3047 : 436796056 : rtx true_mem_addr, true_x_addr;
3048 : 436796056 : rtx base;
3049 : 436796056 : int ret;
3050 : :
3051 : 436796056 : gcc_checking_assert (x_canonicalized
3052 : : ? (x_addr != NULL_RTX
3053 : : && (x_mode != VOIDmode || GET_MODE (x) == VOIDmode))
3054 : : : (x_addr == NULL_RTX && x_mode == VOIDmode));
3055 : :
3056 : 436796056 : if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
3057 : : return true;
3058 : :
3059 : : /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
3060 : : This is used in epilogue deallocation functions. */
3061 : 436262178 : if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
3062 : : return true;
3063 : 411831782 : if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
3064 : : return true;
3065 : 410845664 : if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
3066 : 821495532 : || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
3067 : : return true;
3068 : :
3069 : 410633901 : if (!x_addr)
3070 : 47704286 : x_addr = XEXP (x, 0);
3071 : 410633901 : true_x_addr = get_addr (x_addr);
3072 : :
3073 : 410633901 : mem_addr = XEXP (mem, 0);
3074 : 410633901 : true_mem_addr = get_addr (mem_addr);
3075 : :
3076 : : /* A read from read-only memory can't conflict with read-write memory.
3077 : : Don't assume anything when AND addresses are involved and leave to
3078 : : the code below to determine dependence. */
3079 : 410633901 : if (!writep
3080 : 380113413 : && MEM_READONLY_P (mem)
3081 : 10602057 : && GET_CODE (true_x_addr) != AND
3082 : 421235958 : && GET_CODE (true_mem_addr) != AND)
3083 : : return false;
3084 : :
3085 : : /* If we have MEMs referring to different address spaces (which can
3086 : : potentially overlap), we cannot easily tell from the addresses
3087 : : whether the references overlap. */
3088 : 412751050 : if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
3089 : : return true;
3090 : :
3091 : 399998938 : base = find_base_term (true_mem_addr);
3092 : 399998938 : if (! writep
3093 : 399998938 : && base
3094 : 399998938 : && (GET_CODE (base) == LABEL_REF
3095 : 315812737 : || (GET_CODE (base) == SYMBOL_REF
3096 : 27948938 : && CONSTANT_POOL_ADDRESS_P (base))))
3097 : : return false;
3098 : :
3099 : 399998180 : rtx x_base = find_base_term (true_x_addr);
3100 : 399998180 : if (! base_alias_check (true_x_addr, x_base, true_mem_addr, base,
3101 : 399998180 : GET_MODE (x), GET_MODE (mem)))
3102 : : return false;
3103 : :
3104 : 345886999 : if (!x_canonicalized)
3105 : : {
3106 : 42541478 : x_addr = canon_rtx (true_x_addr);
3107 : 42541478 : x_mode = GET_MODE (x);
3108 : : }
3109 : 345886999 : if (!mem_canonicalized)
3110 : 204463847 : mem_addr = canon_rtx (true_mem_addr);
3111 : :
3112 : 691773998 : if ((ret = memrefs_conflict_p (SIZE_FOR_MODE (mem), mem_addr,
3113 : 691773998 : GET_MODE_SIZE (x_mode), x_addr, 0)) != -1)
3114 : 283378871 : return !!ret;
3115 : :
3116 : 62508128 : if (nonoverlapping_memrefs_p (x, mem, false))
3117 : : return false;
3118 : :
3119 : 59363654 : return rtx_refs_may_alias_p (x, mem, false);
3120 : : }
3121 : :
3122 : : /* Anti dependence: X is written after read in MEM takes place. */
3123 : :
3124 : : bool
3125 : 21137184 : anti_dependence (const_rtx mem, const_rtx x)
3126 : : {
3127 : 21137184 : return write_dependence_p (mem, x, VOIDmode, NULL_RTX,
3128 : : /*mem_canonicalized=*/false,
3129 : 21137184 : /*x_canonicalized*/false, /*writep=*/false);
3130 : : }
3131 : :
3132 : : /* Likewise, but we already have a canonicalized MEM, and X_ADDR for X.
3133 : : Also, consider X in X_MODE (which might be from an enclosing
3134 : : STRICT_LOW_PART / ZERO_EXTRACT).
3135 : : If MEM_CANONICALIZED is true, MEM is canonicalized. */
3136 : :
3137 : : bool
3138 : 382847616 : canon_anti_dependence (const_rtx mem, bool mem_canonicalized,
3139 : : const_rtx x, machine_mode x_mode, rtx x_addr)
3140 : : {
3141 : 382847616 : return write_dependence_p (mem, x, x_mode, x_addr,
3142 : : mem_canonicalized, /*x_canonicalized=*/true,
3143 : 382847616 : /*writep=*/false);
3144 : : }
3145 : :
3146 : : /* Output dependence: X is written after store in MEM takes place. */
3147 : :
3148 : : bool
3149 : 29625609 : output_dependence (const_rtx mem, const_rtx x)
3150 : : {
3151 : 29625609 : return write_dependence_p (mem, x, VOIDmode, NULL_RTX,
3152 : : /*mem_canonicalized=*/false,
3153 : 29625609 : /*x_canonicalized*/false, /*writep=*/true);
3154 : : }
3155 : :
3156 : : /* Likewise, but we already have a canonicalized MEM, and X_ADDR for X.
3157 : : Also, consider X in X_MODE (which might be from an enclosing
3158 : : STRICT_LOW_PART / ZERO_EXTRACT).
3159 : : If MEM_CANONICALIZED is true, MEM is canonicalized. */
3160 : :
3161 : : bool
3162 : 3185647 : canon_output_dependence (const_rtx mem, bool mem_canonicalized,
3163 : : const_rtx x, machine_mode x_mode, rtx x_addr)
3164 : : {
3165 : 3185647 : return write_dependence_p (mem, x, x_mode, x_addr,
3166 : : mem_canonicalized, /*x_canonicalized=*/true,
3167 : 3185647 : /*writep=*/true);
3168 : : }
3169 : :
3170 : :
3171 : :
3172 : : /* Check whether X may be aliased with MEM. Don't do offset-based
3173 : : memory disambiguation & TBAA. */
3174 : : bool
3175 : 0 : may_alias_p (const_rtx mem, const_rtx x)
3176 : : {
3177 : 0 : rtx x_addr, mem_addr;
3178 : :
3179 : 0 : if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
3180 : : return true;
3181 : :
3182 : : /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
3183 : : This is used in epilogue deallocation functions. */
3184 : 0 : if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
3185 : : return true;
3186 : 0 : if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
3187 : : return true;
3188 : 0 : if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
3189 : 0 : || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
3190 : : return true;
3191 : :
3192 : 0 : x_addr = XEXP (x, 0);
3193 : 0 : x_addr = get_addr (x_addr);
3194 : :
3195 : 0 : mem_addr = XEXP (mem, 0);
3196 : 0 : mem_addr = get_addr (mem_addr);
3197 : :
3198 : : /* Read-only memory is by definition never modified, and therefore can't
3199 : : conflict with anything. However, don't assume anything when AND
3200 : : addresses are involved and leave to the code below to determine
3201 : : dependence. We don't expect to find read-only set on MEM, but
3202 : : stupid user tricks can produce them, so don't die. */
3203 : 0 : if (MEM_READONLY_P (x)
3204 : 0 : && GET_CODE (x_addr) != AND
3205 : 0 : && GET_CODE (mem_addr) != AND)
3206 : : return false;
3207 : :
3208 : : /* If we have MEMs referring to different address spaces (which can
3209 : : potentially overlap), we cannot easily tell from the addresses
3210 : : whether the references overlap. */
3211 : 0 : if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
3212 : : return true;
3213 : :
3214 : 0 : rtx x_base = find_base_term (x_addr);
3215 : 0 : rtx mem_base = find_base_term (mem_addr);
3216 : 0 : if (! base_alias_check (x_addr, x_base, mem_addr, mem_base,
3217 : 0 : GET_MODE (x), GET_MODE (mem_addr)))
3218 : : return false;
3219 : :
3220 : 0 : if (nonoverlapping_memrefs_p (mem, x, true))
3221 : : return false;
3222 : :
3223 : : /* TBAA not valid for loop_invarint */
3224 : 0 : return rtx_refs_may_alias_p (x, mem, false);
3225 : : }
3226 : :
3227 : : void
3228 : 209938 : init_alias_target (void)
3229 : : {
3230 : 209938 : int i;
3231 : :
3232 : 209938 : if (!arg_base_value)
3233 : 206833 : arg_base_value = gen_rtx_ADDRESS (VOIDmode, 0);
3234 : :
3235 : 209938 : memset (static_reg_base_value, 0, sizeof static_reg_base_value);
3236 : :
3237 : 19524234 : for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3238 : : /* Check whether this register can hold an incoming pointer
3239 : : argument. FUNCTION_ARG_REGNO_P tests outgoing register
3240 : : numbers, so translate if necessary due to register windows. */
3241 : 19314296 : if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i))
3242 : 19314296 : && targetm.hard_regno_mode_ok (i, Pmode))
3243 : 3111343 : static_reg_base_value[i] = arg_base_value;
3244 : :
3245 : : /* RTL code is required to be consistent about whether it uses the
3246 : : stack pointer, the frame pointer or the argument pointer to
3247 : : access a given area of the frame. We can therefore use the
3248 : : base address to distinguish between the different areas. */
3249 : 209938 : static_reg_base_value[STACK_POINTER_REGNUM]
3250 : 209938 : = unique_base_value (UNIQUE_BASE_VALUE_SP);
3251 : 209938 : static_reg_base_value[ARG_POINTER_REGNUM]
3252 : 209938 : = unique_base_value (UNIQUE_BASE_VALUE_ARGP);
3253 : 209938 : static_reg_base_value[FRAME_POINTER_REGNUM]
3254 : 209938 : = unique_base_value (UNIQUE_BASE_VALUE_FP);
3255 : :
3256 : : /* The above rules extend post-reload, with eliminations applying
3257 : : consistently to each of the three pointers. Cope with cases in
3258 : : which the frame pointer is eliminated to the hard frame pointer
3259 : : rather than the stack pointer. */
3260 : 209938 : if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
3261 : 209938 : static_reg_base_value[HARD_FRAME_POINTER_REGNUM]
3262 : 209938 : = unique_base_value (UNIQUE_BASE_VALUE_HFP);
3263 : 209938 : }
3264 : :
3265 : : /* Set MEMORY_MODIFIED when X modifies DATA (that is assumed
3266 : : to be memory reference. */
3267 : : static bool memory_modified;
3268 : : static void
3269 : 30119199 : memory_modified_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
3270 : : {
3271 : 30119199 : if (MEM_P (x))
3272 : : {
3273 : 2193952 : if (anti_dependence (x, (const_rtx)data) || output_dependence (x, (const_rtx)data))
3274 : 439424 : memory_modified = true;
3275 : : }
3276 : 30119199 : }
3277 : :
3278 : :
3279 : : /* Return true when INSN possibly modify memory contents of MEM
3280 : : (i.e. address can be modified). */
3281 : : bool
3282 : 38812668 : memory_modified_in_insn_p (const_rtx mem, const_rtx insn)
3283 : : {
3284 : 38812668 : if (!INSN_P (insn))
3285 : : return false;
3286 : : /* Conservatively assume all non-readonly MEMs might be modified in
3287 : : calls. */
3288 : 36505644 : if (CALL_P (insn))
3289 : : return true;
3290 : 36205856 : memory_modified = false;
3291 : 36205856 : note_stores (as_a<const rtx_insn *> (insn), memory_modified_1,
3292 : : CONST_CAST_RTX(mem));
3293 : 36205856 : return memory_modified;
3294 : : }
3295 : :
3296 : : /* Initialize the aliasing machinery. Initialize the REG_KNOWN_VALUE
3297 : : array. */
3298 : :
3299 : : void
3300 : 8947473 : init_alias_analysis (void)
3301 : : {
3302 : 8947473 : const bool frame_pointer_eliminated
3303 : 8947473 : = reload_completed
3304 : 3881213 : && !frame_pointer_needed
3305 : 12605706 : && targetm.can_eliminate (FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM);
3306 : 8947473 : unsigned int maxreg = max_reg_num ();
3307 : 8947473 : bool changed;
3308 : 8947473 : int pass, i;
3309 : 8947473 : unsigned int ui;
3310 : 8947473 : rtx_insn *insn;
3311 : 8947473 : rtx val;
3312 : 8947473 : int rpo_cnt;
3313 : 8947473 : int *rpo;
3314 : :
3315 : 8947473 : timevar_push (TV_ALIAS_ANALYSIS);
3316 : :
3317 : 8947473 : vec_safe_grow_cleared (reg_known_value, maxreg - FIRST_PSEUDO_REGISTER,
3318 : : true);
3319 : 8947473 : reg_known_equiv_p = sbitmap_alloc (maxreg - FIRST_PSEUDO_REGISTER);
3320 : 8947473 : bitmap_clear (reg_known_equiv_p);
3321 : :
3322 : : /* If we have memory allocated from the previous run, use it. */
3323 : 8947473 : if (old_reg_base_value)
3324 : 8702799 : reg_base_value = old_reg_base_value;
3325 : :
3326 : 8947473 : if (reg_base_value)
3327 : 8740825 : reg_base_value->truncate (0);
3328 : :
3329 : 8947473 : vec_safe_grow_cleared (reg_base_value, maxreg, true);
3330 : :
3331 : 8947473 : new_reg_base_value = XNEWVEC (rtx, maxreg);
3332 : 8947473 : reg_seen = sbitmap_alloc (maxreg);
3333 : :
3334 : : /* The basic idea is that each pass through this loop will use the
3335 : : "constant" information from the previous pass to propagate alias
3336 : : information through another level of assignments.
3337 : :
3338 : : The propagation is done on the CFG in reverse post-order, to propagate
3339 : : things forward as far as possible in each iteration.
3340 : :
3341 : : This could get expensive if the assignment chains are long. Maybe
3342 : : we should throttle the number of iterations, possibly based on
3343 : : the optimization level or flag_expensive_optimizations.
3344 : :
3345 : : We could propagate more information in the first pass by making use
3346 : : of DF_REG_DEF_COUNT to determine immediately that the alias information
3347 : : for a pseudo is "constant".
3348 : :
3349 : : A program with an uninitialized variable can cause an infinite loop
3350 : : here. Instead of doing a full dataflow analysis to detect such problems
3351 : : we just cap the number of iterations for the loop.
3352 : :
3353 : : The state of the arrays for the set chain in question does not matter
3354 : : since the program has undefined behavior. */
3355 : :
3356 : 8947473 : rpo = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
3357 : 8947473 : rpo_cnt = pre_and_rev_post_order_compute (NULL, rpo, false);
3358 : :
3359 : 8947473 : pass = 0;
3360 : 18150373 : do
3361 : : {
3362 : : /* Assume nothing will change this iteration of the loop. */
3363 : 18150373 : changed = false;
3364 : :
3365 : : /* We want to assign the same IDs each iteration of this loop, so
3366 : : start counting from one each iteration of the loop. */
3367 : 18150373 : unique_id = 1;
3368 : :
3369 : : /* We're at the start of the function each iteration through the
3370 : : loop, so we're copying arguments. */
3371 : 18150373 : copying_arguments = true;
3372 : :
3373 : : /* Wipe the potential alias information clean for this pass. */
3374 : 18150373 : memset (new_reg_base_value, 0, maxreg * sizeof (rtx));
3375 : :
3376 : : /* Wipe the reg_seen array clean. */
3377 : 18150373 : bitmap_clear (reg_seen);
3378 : :
3379 : : /* Initialize the alias information for this pass. */
3380 : 1706135062 : for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3381 : 1669834316 : if (static_reg_base_value[i]
3382 : : /* Don't treat the hard frame pointer as special if we
3383 : : eliminated the frame pointer to the stack pointer. */
3384 : 330880379 : && !(i == HARD_FRAME_POINTER_REGNUM && frame_pointer_eliminated))
3385 : : {
3386 : 323531096 : new_reg_base_value[i] = static_reg_base_value[i];
3387 : 323531096 : bitmap_set_bit (reg_seen, i);
3388 : : }
3389 : :
3390 : : /* Walk the insns adding values to the new_reg_base_value array. */
3391 : 223538774 : for (i = 0; i < rpo_cnt; i++)
3392 : : {
3393 : 205388401 : basic_block bb = BASIC_BLOCK_FOR_FN (cfun, rpo[i]);
3394 : 2527525006 : FOR_BB_INSNS (bb, insn)
3395 : : {
3396 : 2322136605 : if (NONDEBUG_INSN_P (insn))
3397 : : {
3398 : 1164481621 : rtx note, set;
3399 : :
3400 : : /* Treat the hard frame pointer as special unless we
3401 : : eliminated the frame pointer to the stack pointer. */
3402 : 1164841638 : if (!frame_pointer_eliminated
3403 : 1164481621 : && modified_in_p (hard_frame_pointer_rtx, insn))
3404 : 360017 : continue;
3405 : :
3406 : : /* If this insn has a noalias note, process it, Otherwise,
3407 : : scan for sets. A simple set will have no side effects
3408 : : which could change the base value of any other register. */
3409 : 1164121604 : if (GET_CODE (PATTERN (insn)) == SET
3410 : 928599007 : && REG_NOTES (insn) != 0
3411 : 1652599758 : && find_reg_note (insn, REG_NOALIAS, NULL_RTX))
3412 : 1361974 : record_set (SET_DEST (PATTERN (insn)), NULL_RTX, NULL);
3413 : : else
3414 : 1162759630 : note_stores (insn, record_set, NULL);
3415 : :
3416 : 1164121604 : set = single_set (insn);
3417 : :
3418 : 1164121604 : if (set != 0
3419 : 1084297107 : && REG_P (SET_DEST (set))
3420 : 1948946313 : && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
3421 : : {
3422 : 295447361 : unsigned int regno = REGNO (SET_DEST (set));
3423 : 295447361 : rtx src = SET_SRC (set);
3424 : 295447361 : rtx t;
3425 : :
3426 : 295447361 : note = find_reg_equal_equiv_note (insn);
3427 : 295447361 : if (note && REG_NOTE_KIND (note) == REG_EQUAL
3428 : 16668200 : && DF_REG_DEF_COUNT (regno) != 1)
3429 : : note = NULL_RTX;
3430 : :
3431 : : poly_int64 offset;
3432 : : if (note != NULL_RTX
3433 : 16547677 : && GET_CODE (XEXP (note, 0)) != EXPR_LIST
3434 : 16547677 : && ! rtx_varies_p (XEXP (note, 0), 1)
3435 : 7260786 : && ! reg_overlap_mentioned_p (SET_DEST (set),
3436 : 7260786 : XEXP (note, 0)))
3437 : : {
3438 : 7260786 : set_reg_known_value (regno, XEXP (note, 0));
3439 : 7260786 : set_reg_known_equiv_p (regno,
3440 : 7260786 : REG_NOTE_KIND (note) == REG_EQUIV);
3441 : : }
3442 : 288186575 : else if (DF_REG_DEF_COUNT (regno) == 1
3443 : 222097024 : && GET_CODE (src) == PLUS
3444 : 40248748 : && REG_P (XEXP (src, 0))
3445 : 39452611 : && (t = get_reg_known_value (REGNO (XEXP (src, 0))))
3446 : 289312540 : && poly_int_rtx_p (XEXP (src, 1), &offset))
3447 : : {
3448 : 760858 : t = plus_constant (GET_MODE (src), t, offset);
3449 : 760858 : set_reg_known_value (regno, t);
3450 : 760858 : set_reg_known_equiv_p (regno, false);
3451 : : }
3452 : 287425717 : else if (DF_REG_DEF_COUNT (regno) == 1
3453 : 287425717 : && ! rtx_varies_p (src, 1))
3454 : : {
3455 : 30079310 : set_reg_known_value (regno, src);
3456 : 30079310 : set_reg_known_equiv_p (regno, false);
3457 : : }
3458 : : }
3459 : : }
3460 : 1157654984 : else if (NOTE_P (insn)
3461 : 279335039 : && NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG)
3462 : 18139567 : copying_arguments = false;
3463 : : }
3464 : : }
3465 : :
3466 : : /* Now propagate values from new_reg_base_value to reg_base_value. */
3467 : 18150373 : gcc_assert (maxreg == (unsigned int) max_reg_num ());
3468 : :
3469 : 2647866649 : for (ui = 0; ui < maxreg; ui++)
3470 : : {
3471 : 2629716276 : if (new_reg_base_value[ui]
3472 : 318104407 : && new_reg_base_value[ui] != (*reg_base_value)[ui]
3473 : 2786134792 : && ! rtx_equal_p (new_reg_base_value[ui], (*reg_base_value)[ui]))
3474 : : {
3475 : 155752548 : (*reg_base_value)[ui] = new_reg_base_value[ui];
3476 : 155752548 : changed = true;
3477 : : }
3478 : : }
3479 : : }
3480 : 18150451 : while (changed && ++pass < MAX_ALIAS_LOOP_PASSES);
3481 : 8947473 : XDELETEVEC (rpo);
3482 : :
3483 : : /* Fill in the remaining entries. */
3484 : 467836235 : FOR_EACH_VEC_ELT (*reg_known_value, i, val)
3485 : : {
3486 : 458888762 : int regno = i + FIRST_PSEUDO_REGISTER;
3487 : 458888762 : if (! val)
3488 : 441481295 : set_reg_known_value (regno, regno_reg_rtx[regno]);
3489 : : }
3490 : :
3491 : : /* Clean up. */
3492 : 8947473 : free (new_reg_base_value);
3493 : 8947473 : new_reg_base_value = 0;
3494 : 8947473 : sbitmap_free (reg_seen);
3495 : 8947473 : reg_seen = 0;
3496 : 8947473 : timevar_pop (TV_ALIAS_ANALYSIS);
3497 : 8947473 : }
3498 : :
3499 : : /* Equate REG_BASE_VALUE (reg1) to REG_BASE_VALUE (reg2).
3500 : : Special API for var-tracking pass purposes. */
3501 : :
3502 : : void
3503 : 477786 : vt_equate_reg_base_value (const_rtx reg1, const_rtx reg2)
3504 : : {
3505 : 477786 : (*reg_base_value)[REGNO (reg1)] = REG_BASE_VALUE (reg2);
3506 : 477786 : }
3507 : :
3508 : : void
3509 : 8947473 : end_alias_analysis (void)
3510 : : {
3511 : 8947473 : old_reg_base_value = reg_base_value;
3512 : 8947473 : vec_free (reg_known_value);
3513 : 8947473 : sbitmap_free (reg_known_equiv_p);
3514 : 8947473 : }
3515 : :
3516 : : void
3517 : 0 : dump_alias_stats_in_alias_c (FILE *s)
3518 : : {
3519 : 0 : fprintf (s, " TBAA oracle: %llu disambiguations %llu queries\n"
3520 : : " %llu are in alias set 0\n"
3521 : : " %llu queries asked about the same object\n"
3522 : : " %llu queries asked about the same alias set\n"
3523 : : " %llu access volatile\n"
3524 : : " %llu are dependent in the DAG\n"
3525 : : " %llu are aritificially in conflict with void *\n",
3526 : : alias_stats.num_disambiguated,
3527 : 0 : alias_stats.num_alias_zero + alias_stats.num_same_alias_set
3528 : 0 : + alias_stats.num_same_objects + alias_stats.num_volatile
3529 : 0 : + alias_stats.num_dag + alias_stats.num_disambiguated
3530 : : + alias_stats.num_universal,
3531 : : alias_stats.num_alias_zero, alias_stats.num_same_alias_set,
3532 : : alias_stats.num_same_objects, alias_stats.num_volatile,
3533 : : alias_stats.num_dag, alias_stats.num_universal);
3534 : 0 : }
3535 : : #include "gt-alias.h"
|