]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/alias.c
2009-11-01 Tobias Burnus <burnus@net-b.de>
[thirdparty/gcc.git] / gcc / alias.c
CommitLineData
ea0cb7ae 1/* Alias analysis for GNU C
d4473c84 2 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
cfaf579d 3 2007, 2008, 2009 Free Software Foundation, Inc.
ea0cb7ae 4 Contributed by John Carr (jfc@mit.edu).
5
f12b58b3 6This file is part of GCC.
ea0cb7ae 7
f12b58b3 8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
8c4c00c1 10Software Foundation; either version 3, or (at your option) any later
f12b58b3 11version.
ea0cb7ae 12
f12b58b3 13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
ea0cb7ae 17
18You should have received a copy of the GNU General Public License
8c4c00c1 19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
ea0cb7ae 21
22#include "config.h"
405711de 23#include "system.h"
805e22b2 24#include "coretypes.h"
25#include "tm.h"
ea0cb7ae 26#include "rtl.h"
142131ed 27#include "tree.h"
7953c610 28#include "tm_p.h"
0a893c29 29#include "function.h"
4c74e6d9 30#include "alias.h"
31#include "emit-rtl.h"
ea0cb7ae 32#include "regs.h"
33#include "hard-reg-set.h"
080f162d 34#include "basic-block.h"
ea0cb7ae 35#include "flags.h"
a068b2a9 36#include "output.h"
ce1fd7fc 37#include "toplev.h"
1617c276 38#include "cselib.h"
a5b1863e 39#include "splay-tree.h"
c2e94b25 40#include "ggc.h"
b0278d39 41#include "langhooks.h"
376c21d1 42#include "timevar.h"
4f8e9d5c 43#include "target.h"
28992b23 44#include "cgraph.h"
56bbdce4 45#include "varray.h"
77fce4cd 46#include "tree-pass.h"
f7d118a9 47#include "ipa-type-escape.h"
3072d30e 48#include "df.h"
3a443843 49#include "tree-ssa-alias.h"
50#include "pointer-set.h"
51#include "tree-flow.h"
f7d118a9 52
53/* The aliasing API provided here solves related but different problems:
54
a0c938f0 55 Say there exists (in c)
f7d118a9 56
57 struct X {
58 struct Y y1;
59 struct Z z2;
60 } x1, *px1, *px2;
61
62 struct Y y2, *py;
63 struct Z z2, *pz;
64
65
66 py = &px1.y1;
67 px2 = &x1;
68
69 Consider the four questions:
70
71 Can a store to x1 interfere with px2->y1?
72 Can a store to x1 interfere with px2->z2?
73 (*px2).z2
74 Can a store to x1 change the value pointed to by with py?
75 Can a store to x1 change the value pointed to by with pz?
76
77 The answer to these questions can be yes, yes, yes, and maybe.
78
79 The first two questions can be answered with a simple examination
80 of the type system. If structure X contains a field of type Y then
81 a store thru a pointer to an X can overwrite any field that is
82 contained (recursively) in an X (unless we know that px1 != px2).
83
84 The last two of the questions can be solved in the same way as the
85 first two questions but this is too conservative. The observation
86 is that in some cases analysis we can know if which (if any) fields
87 are addressed and if those addresses are used in bad ways. This
88 analysis may be language specific. In C, arbitrary operations may
89 be applied to pointers. However, there is some indication that
90 this may be too conservative for some C++ types.
91
92 The pass ipa-type-escape does this analysis for the types whose
a0c938f0 93 instances do not escape across the compilation boundary.
f7d118a9 94
95 Historically in GCC, these two problems were combined and a single
96 data structure was used to represent the solution to these
97 problems. We now have two similar but different data structures,
98 The data structure to solve the last two question is similar to the
99 first, but does not contain have the fields in it whose address are
100 never taken. For types that do escape the compilation unit, the
101 data structures will have identical information.
102*/
a5b1863e 103
104/* The alias sets assigned to MEMs assist the back-end in determining
105 which MEMs can alias which other MEMs. In general, two MEMs in
5badbbc0 106 different alias sets cannot alias each other, with one important
107 exception. Consider something like:
a5b1863e 108
8e2ef041 109 struct S { int i; double d; };
a5b1863e 110
111 a store to an `S' can alias something of either type `int' or type
112 `double'. (However, a store to an `int' cannot alias a `double'
113 and vice versa.) We indicate this via a tree structure that looks
114 like:
a0c938f0 115 struct S
116 / \
a5b1863e 117 / \
a0c938f0 118 |/_ _\|
119 int double
a5b1863e 120
5badbbc0 121 (The arrows are directed and point downwards.)
122 In this situation we say the alias set for `struct S' is the
123 `superset' and that those for `int' and `double' are `subsets'.
124
f7c44134 125 To see whether two alias sets can point to the same memory, we must
126 see if either alias set is a subset of the other. We need not trace
d716ce75 127 past immediate descendants, however, since we propagate all
f7c44134 128 grandchildren up one level.
a5b1863e 129
130 Alias set zero is implicitly a superset of all other alias sets.
131 However, this is no actual entry for alias set zero. It is an
132 error to attempt to explicitly construct a subset of zero. */
133
26dbec0a 134struct GTY(()) alias_set_entry_d {
a5b1863e 135 /* The alias set number, as stored in MEM_ALIAS_SET. */
32c2fdea 136 alias_set_type alias_set;
a5b1863e 137
1e020227 138 /* Nonzero if would have a child of zero: this effectively makes this
139 alias set the same as alias set zero. */
140 int has_zero_child;
141
a5b1863e 142 /* The children of the alias set. These are not just the immediate
d716ce75 143 children, but, in fact, all descendants. So, if we have:
a5b1863e 144
9342ee68 145 struct T { struct S s; float f; }
a5b1863e 146
147 continuing our example above, the children here will be all of
148 `int', `double', `float', and `struct S'. */
318dcdd8 149 splay_tree GTY((param1_is (int), param2_is (int))) children;
318dcdd8 150};
26dbec0a 151typedef struct alias_set_entry_d *alias_set_entry;
ea0cb7ae 152
7ecb5bb2 153static int rtx_equal_for_memref_p (const_rtx, const_rtx);
aecda0d6 154static int memrefs_conflict_p (int, rtx, int, rtx, HOST_WIDE_INT);
81a410b1 155static void record_set (rtx, const_rtx, void *);
aecda0d6 156static int base_alias_check (rtx, rtx, enum machine_mode,
157 enum machine_mode);
158static rtx find_base_value (rtx);
52d07779 159static int mems_in_disjoint_alias_sets_p (const_rtx, const_rtx);
aecda0d6 160static int insert_subset_children (splay_tree_node, void*);
32c2fdea 161static alias_set_entry get_alias_set_entry (alias_set_type);
52d07779 162static const_rtx fixed_scalar_and_varying_struct_p (const_rtx, const_rtx, rtx, rtx,
163 bool (*) (const_rtx, bool));
164static int aliases_everything_p (const_rtx);
165static bool nonoverlapping_component_refs_p (const_tree, const_tree);
aecda0d6 166static tree decl_for_component_ref (tree);
167static rtx adjust_offset_for_component_ref (tree, rtx);
52d07779 168static int write_dependence_p (const_rtx, const_rtx, int);
aecda0d6 169
a80f1c6c 170static void memory_modified_1 (rtx, const_rtx, void *);
ea0cb7ae 171
172/* Set up all info needed to perform alias analysis on memory references. */
173
083a2b5e 174/* Returns the size in bytes of the mode of X. */
ea0cb7ae 175#define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
176
b5ba9f3a 177/* Returns nonzero if MEM1 and MEM2 do not alias because they are in
a068b2a9 178 different alias sets. We ignore alias sets in functions making use
179 of variable arguments because the va_arg macros on some systems are
180 not legal ANSI C. */
181#define DIFFERENT_ALIAS_SETS_P(MEM1, MEM2) \
a5b1863e 182 mems_in_disjoint_alias_sets_p (MEM1, MEM2)
b5ba9f3a 183
37b864db 184/* Cap the number of passes we make over the insns propagating alias
5badbbc0 185 information through set chains. 10 is a completely arbitrary choice. */
37b864db 186#define MAX_ALIAS_LOOP_PASSES 10
9342ee68 187
ea0cb7ae 188/* reg_base_value[N] gives an address to which register N is related.
189 If all sets after the first add or subtract to the current value
190 or otherwise modify it so it does not point to a different top level
191 object, reg_base_value[N] is equal to the address part of the source
e7c893ba 192 of the first set.
193
194 A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF. ADDRESS
195 expressions represent certain special values: function arguments and
9342ee68 196 the stack, frame, and argument pointers.
3a935f06 197
198 The contents of an ADDRESS is not normally used, the mode of the
199 ADDRESS determines whether the ADDRESS is a function argument or some
200 other special value. Pointer equality, not rtx_equal_p, determines whether
201 two ADDRESS expressions refer to the same base address.
202
203 The only use of the contents of an ADDRESS is for determining if the
204 current function performs nonlocal memory memory references for the
205 purposes of marking the function as a constant function. */
e7c893ba 206
980f3285 207static GTY(()) VEC(rtx,gc) *reg_base_value;
c2e94b25 208static rtx *new_reg_base_value;
e5b19a8c 209
210/* We preserve the copy of old array around to avoid amount of garbage
211 produced. About 8% of garbage produced were attributed to this
212 array. */
980f3285 213static GTY((deletable)) VEC(rtx,gc) *old_reg_base_value;
083a2b5e 214
0c7f5242 215/* Static hunks of RTL used by the aliasing code; these are initialized
216 once per function to avoid unnecessary RTL allocations. */
217static GTY (()) rtx static_reg_base_value[FIRST_PSEUDO_REGISTER];
218
980f3285 219#define REG_BASE_VALUE(X) \
220 (REGNO (X) < VEC_length (rtx, reg_base_value) \
221 ? VEC_index (rtx, reg_base_value, REGNO (X)) : 0)
ea0cb7ae 222
73f5c1e3 223/* Vector indexed by N giving the initial (unchanging) value known for
12cb06ad 224 pseudo-register N. This array is initialized in init_alias_analysis,
225 and does not change until end_alias_analysis is called. */
226static GTY((length("reg_known_value_size"))) rtx *reg_known_value;
ea0cb7ae 227
228/* Indicates number of valid entries in reg_known_value. */
12cb06ad 229static GTY(()) unsigned int reg_known_value_size;
ea0cb7ae 230
231/* Vector recording for each reg_known_value whether it is due to a
232 REG_EQUIV note. Future passes (viz., reload) may replace the
233 pseudo with the equivalent expression and so we account for the
5badbbc0 234 dependences that would be introduced if that happens.
235
236 The REG_EQUIV notes created in assign_parms may mention the arg
237 pointer, and there are explicit insns in the RTL that modify the
238 arg pointer. Thus we must ensure that such insns don't get
239 scheduled across each other because that would invalidate the
240 REG_EQUIV notes. One could argue that the REG_EQUIV notes are
241 wrong, but solving the problem in the scheduler will likely give
242 better code, so we do it here. */
12cb06ad 243static bool *reg_known_equiv_p;
ea0cb7ae 244
e7c893ba 245/* True when scanning insns from the start of the rtl to the
246 NOTE_INSN_FUNCTION_BEG note. */
e5be0cc6 247static bool copying_arguments;
ea0cb7ae 248
8b435339 249DEF_VEC_P(alias_set_entry);
250DEF_VEC_ALLOC_P(alias_set_entry,gc);
251
a5b1863e 252/* The splay-tree used to store the various alias set entries. */
8b435339 253static GTY (()) VEC(alias_set_entry,gc) *alias_sets;
5badbbc0 254\f
3a443843 255/* Build a decomposed reference object for querying the alias-oracle
256 from the MEM rtx and store it in *REF.
257 Returns false if MEM is not suitable for the alias-oracle. */
258
259static bool
260ao_ref_from_mem (ao_ref *ref, const_rtx mem)
261{
262 tree expr = MEM_EXPR (mem);
263 tree base;
264
265 if (!expr)
266 return false;
267
3804203d 268 /* If MEM_OFFSET or MEM_SIZE are NULL punt. */
269 if (!MEM_OFFSET (mem)
270 || !MEM_SIZE (mem))
271 return false;
272
3a443843 273 ao_ref_init (ref, expr);
274
275 /* Get the base of the reference and see if we have to reject or
276 adjust it. */
277 base = ao_ref_base (ref);
278 if (base == NULL_TREE)
279 return false;
280
281 /* If this is a pointer dereference of a non-SSA_NAME punt.
282 ??? We could replace it with a pointer to anything. */
283 if (INDIRECT_REF_P (base)
284 && TREE_CODE (TREE_OPERAND (base, 0)) != SSA_NAME)
285 return false;
286
0f2b32ac 287 /* The tree oracle doesn't like to have these. */
288 if (TREE_CODE (base) == FUNCTION_DECL
289 || TREE_CODE (base) == LABEL_DECL)
290 return false;
291
3a443843 292 /* If this is a reference based on a partitioned decl replace the
293 base with an INDIRECT_REF of the pointer representative we
294 created during stack slot partitioning. */
295 if (TREE_CODE (base) == VAR_DECL
296 && ! TREE_STATIC (base)
297 && cfun->gimple_df->decls_to_pointers != NULL)
298 {
299 void *namep;
300 namep = pointer_map_contains (cfun->gimple_df->decls_to_pointers, base);
301 if (namep)
302 {
303 ref->base_alias_set = get_alias_set (base);
304 ref->base = build1 (INDIRECT_REF, TREE_TYPE (base), *(tree *)namep);
305 }
306 }
307
308 ref->ref_alias_set = MEM_ALIAS_SET (mem);
309
3804203d 310 /* If the base decl is a parameter we can have negative MEM_OFFSET in
311 case of promoted subregs on bigendian targets. Trust the MEM_EXPR
312 here. */
313 if (INTVAL (MEM_OFFSET (mem)) < 0
314 && ((INTVAL (MEM_SIZE (mem)) + INTVAL (MEM_OFFSET (mem)))
315 * BITS_PER_UNIT) == ref->size)
316 return true;
317
318 ref->offset += INTVAL (MEM_OFFSET (mem)) * BITS_PER_UNIT;
319 ref->size = INTVAL (MEM_SIZE (mem)) * BITS_PER_UNIT;
320
321 /* The MEM may extend into adjacent fields, so adjust max_size if
322 necessary. */
323 if (ref->max_size != -1
324 && ref->size > ref->max_size)
325 ref->max_size = ref->size;
326
327 /* If MEM_OFFSET and MEM_SIZE get us outside of the base object of
328 the MEM_EXPR punt. This happens for STRICT_ALIGNMENT targets a lot. */
329 if (MEM_EXPR (mem) != get_spill_slot_decl (false)
330 && (ref->offset < 0
331 || (DECL_P (ref->base)
332 && (!host_integerp (DECL_SIZE (ref->base), 1)
333 || (TREE_INT_CST_LOW (DECL_SIZE ((ref->base)))
334 < (unsigned HOST_WIDE_INT)(ref->offset + ref->size))))))
335 return false;
3a443843 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
344static bool
345rtx_refs_may_alias_p (const_rtx x, const_rtx mem, bool tbaa_p)
346{
347 ao_ref ref1, ref2;
348
349 if (!ao_ref_from_mem (&ref1, x)
350 || !ao_ref_from_mem (&ref2, mem))
351 return true;
352
353 return refs_may_alias_p_1 (&ref1, &ref2, tbaa_p);
354}
355
a5b1863e 356/* Returns a pointer to the alias set entry for ALIAS_SET, if there is
357 such an entry, or NULL otherwise. */
358
56bbdce4 359static inline alias_set_entry
32c2fdea 360get_alias_set_entry (alias_set_type alias_set)
a5b1863e 361{
8b435339 362 return VEC_index (alias_set_entry, alias_sets, alias_set);
a5b1863e 363}
364
5badbbc0 365/* Returns nonzero if the alias sets for MEM1 and MEM2 are such that
366 the two MEMs cannot alias each other. */
a5b1863e 367
56bbdce4 368static inline int
52d07779 369mems_in_disjoint_alias_sets_p (const_rtx mem1, const_rtx mem2)
a5b1863e 370{
a5b1863e 371/* Perform a basic sanity check. Namely, that there are no alias sets
372 if we're not using strict aliasing. This helps to catch bugs
373 whereby someone uses PUT_CODE, but doesn't clear MEM_ALIAS_SET, or
374 where a MEM is allocated in some way other than by the use of
375 gen_rtx_MEM, and the MEM_ALIAS_SET is not cleared. If we begin to
376 use alias sets to indicate that spilled registers cannot alias each
377 other, we might need to remove this check. */
64db345d 378 gcc_assert (flag_strict_aliasing
379 || (!MEM_ALIAS_SET (mem1) && !MEM_ALIAS_SET (mem2)));
a5b1863e 380
387bc205 381 return ! alias_sets_conflict_p (MEM_ALIAS_SET (mem1), MEM_ALIAS_SET (mem2));
382}
a5b1863e 383
387bc205 384/* Insert the NODE into the splay tree given by DATA. Used by
385 record_alias_subset via splay_tree_foreach. */
386
387static int
aecda0d6 388insert_subset_children (splay_tree_node node, void *data)
387bc205 389{
390 splay_tree_insert ((splay_tree) data, node->key, node->value);
391
392 return 0;
393}
394
7d1f52b2 395/* Return true if the first alias set is a subset of the second. */
396
397bool
32c2fdea 398alias_set_subset_of (alias_set_type set1, alias_set_type set2)
7d1f52b2 399{
400 alias_set_entry ase;
401
402 /* Everything is a subset of the "aliases everything" set. */
403 if (set2 == 0)
404 return true;
405
406 /* Otherwise, check if set1 is a subset of set2. */
407 ase = get_alias_set_entry (set2);
408 if (ase != 0
6c711ccf 409 && ((ase->has_zero_child && set1 == 0)
410 || splay_tree_lookup (ase->children,
411 (splay_tree_key) set1)))
7d1f52b2 412 return true;
413 return false;
414}
415
387bc205 416/* Return 1 if the two specified alias sets may conflict. */
417
418int
32c2fdea 419alias_sets_conflict_p (alias_set_type set1, alias_set_type set2)
387bc205 420{
421 alias_set_entry ase;
422
879f881c 423 /* The easy case. */
424 if (alias_sets_must_conflict_p (set1, set2))
387bc205 425 return 1;
a5b1863e 426
f7c44134 427 /* See if the first alias set is a subset of the second. */
387bc205 428 ase = get_alias_set_entry (set1);
851dfbff 429 if (ase != 0
430 && (ase->has_zero_child
431 || splay_tree_lookup (ase->children,
387bc205 432 (splay_tree_key) set2)))
433 return 1;
a5b1863e 434
435 /* Now do the same, but with the alias sets reversed. */
387bc205 436 ase = get_alias_set_entry (set2);
851dfbff 437 if (ase != 0
438 && (ase->has_zero_child
439 || splay_tree_lookup (ase->children,
387bc205 440 (splay_tree_key) set1)))
441 return 1;
a5b1863e 442
387bc205 443 /* The two alias sets are distinct and neither one is the
879f881c 444 child of the other. Therefore, they cannot conflict. */
387bc205 445 return 0;
a5b1863e 446}
c1628b55 447
6e93a4c8 448static int
449walk_mems_2 (rtx *x, rtx mem)
450{
451 if (MEM_P (*x))
452 {
453 if (alias_sets_conflict_p (MEM_ALIAS_SET(*x), MEM_ALIAS_SET(mem)))
454 return 1;
455
456 return -1;
457 }
458 return 0;
459}
460
461static int
462walk_mems_1 (rtx *x, rtx *pat)
463{
464 if (MEM_P (*x))
465 {
466 /* Visit all MEMs in *PAT and check indepedence. */
467 if (for_each_rtx (pat, (rtx_function) walk_mems_2, *x))
468 /* Indicate that dependence was determined and stop traversal. */
469 return 1;
470
471 return -1;
472 }
473 return 0;
474}
475
476/* Return 1 if two specified instructions have mem expr with conflict alias sets*/
477bool
478insn_alias_sets_conflict_p (rtx insn1, rtx insn2)
479{
480 /* For each pair of MEMs in INSN1 and INSN2 check their independence. */
481 return for_each_rtx (&PATTERN (insn1), (rtx_function) walk_mems_1,
482 &PATTERN (insn2));
483}
484
879f881c 485/* Return 1 if the two specified alias sets will always conflict. */
c1628b55 486
487int
32c2fdea 488alias_sets_must_conflict_p (alias_set_type set1, alias_set_type set2)
c1628b55 489{
490 if (set1 == 0 || set2 == 0 || set1 == set2)
491 return 1;
492
493 return 0;
494}
495
387bc205 496/* Return 1 if any MEM object of type T1 will always conflict (using the
497 dependency routines in this file) with any MEM object of type T2.
498 This is used when allocating temporary storage. If T1 and/or T2 are
499 NULL_TREE, it means we know nothing about the storage. */
500
501int
aecda0d6 502objects_must_conflict_p (tree t1, tree t2)
387bc205 503{
32c2fdea 504 alias_set_type set1, set2;
2bedf233 505
218eb8d0 506 /* If neither has a type specified, we don't know if they'll conflict
507 because we may be using them to store objects of various types, for
508 example the argument and local variables areas of inlined functions. */
8f2ba9c9 509 if (t1 == 0 && t2 == 0)
218eb8d0 510 return 0;
511
387bc205 512 /* If they are the same type, they must conflict. */
513 if (t1 == t2
514 /* Likewise if both are volatile. */
515 || (t1 != 0 && TYPE_VOLATILE (t1) && t2 != 0 && TYPE_VOLATILE (t2)))
516 return 1;
517
2bedf233 518 set1 = t1 ? get_alias_set (t1) : 0;
519 set2 = t2 ? get_alias_set (t2) : 0;
387bc205 520
879f881c 521 /* We can't use alias_sets_conflict_p because we must make sure
522 that every subtype of t1 will conflict with every subtype of
2bedf233 523 t2 for which a pair of subobjects of these respective subtypes
524 overlaps on the stack. */
879f881c 525 return alias_sets_must_conflict_p (set1, set2);
387bc205 526}
527\f
2b02580f 528/* Return true if all nested component references handled by
529 get_inner_reference in T are such that we should use the alias set
530 provided by the object at the heart of T.
531
532 This is true for non-addressable components (which don't have their
533 own alias set), as well as components of objects in alias set zero.
534 This later point is a special case wherein we wish to override the
535 alias set used by the component, but we don't have per-FIELD_DECL
536 assignable alias sets. */
537
538bool
1f1872fd 539component_uses_parent_alias_set (const_tree t)
bd32979f 540{
1f9b622b 541 while (1)
542 {
2b02580f 543 /* If we're at the end, it vacuously uses its own alias set. */
1f9b622b 544 if (!handled_component_p (t))
2b02580f 545 return false;
1f9b622b 546
547 switch (TREE_CODE (t))
548 {
549 case COMPONENT_REF:
550 if (DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1)))
2b02580f 551 return true;
1f9b622b 552 break;
553
554 case ARRAY_REF:
555 case ARRAY_RANGE_REF:
556 if (TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0))))
2b02580f 557 return true;
1f9b622b 558 break;
559
560 case REALPART_EXPR:
561 case IMAGPART_EXPR:
562 break;
563
564 default:
565 /* Bitfields and casts are never addressable. */
2b02580f 566 return true;
1f9b622b 567 }
568
569 t = TREE_OPERAND (t, 0);
2b02580f 570 if (get_alias_set (TREE_TYPE (t)) == 0)
571 return true;
1f9b622b 572 }
bd32979f 573}
574
dd277d48 575/* Return the alias set for the memory pointed to by T, which may be
576 either a type or an expression. Return -1 if there is nothing
577 special about dereferencing T. */
578
579static alias_set_type
580get_deref_alias_set_1 (tree t)
581{
582 /* If we're not doing any alias analysis, just assume everything
583 aliases everything else. */
584 if (!flag_strict_aliasing)
585 return 0;
586
8115f0af 587 /* All we care about is the type. */
dd277d48 588 if (! TYPE_P (t))
8115f0af 589 t = TREE_TYPE (t);
dd277d48 590
591 /* If we have an INDIRECT_REF via a void pointer, we don't
592 know anything about what that might alias. Likewise if the
593 pointer is marked that way. */
594 if (TREE_CODE (TREE_TYPE (t)) == VOID_TYPE
595 || TYPE_REF_CAN_ALIAS_ALL (t))
596 return 0;
597
598 return -1;
599}
600
601/* Return the alias set for the memory pointed to by T, which may be
602 either a type or an expression. */
603
604alias_set_type
605get_deref_alias_set (tree t)
606{
607 alias_set_type set = get_deref_alias_set_1 (t);
608
609 /* Fall back to the alias-set of the pointed-to type. */
610 if (set == -1)
611 {
612 if (! TYPE_P (t))
613 t = TREE_TYPE (t);
614 set = get_alias_set (TREE_TYPE (t));
615 }
616
617 return set;
618}
619
f7c44134 620/* Return the alias set for T, which may be either a type or an
621 expression. Call language-specific routine for help, if needed. */
622
32c2fdea 623alias_set_type
aecda0d6 624get_alias_set (tree t)
f7c44134 625{
32c2fdea 626 alias_set_type set;
f7c44134 627
628 /* If we're not doing any alias analysis, just assume everything
629 aliases everything else. Also return 0 if this or its type is
630 an error. */
631 if (! flag_strict_aliasing || t == error_mark_node
632 || (! TYPE_P (t)
633 && (TREE_TYPE (t) == 0 || TREE_TYPE (t) == error_mark_node)))
634 return 0;
635
636 /* We can be passed either an expression or a type. This and the
c3a9c149 637 language-specific routine may make mutually-recursive calls to each other
638 to figure out what to do. At each juncture, we see if this is a tree
639 that the language may need to handle specially. First handle things that
96216d37 640 aren't types. */
1607663f 641 if (! TYPE_P (t))
f7c44134 642 {
96216d37 643 tree inner = t;
96216d37 644
2a631e19 645 /* Remove any nops, then give the language a chance to do
646 something with this tree before we look at it. */
647 STRIP_NOPS (t);
dc24ddbd 648 set = lang_hooks.get_alias_set (t);
2a631e19 649 if (set != -1)
650 return set;
651
96216d37 652 /* First see if the actual object referenced is an INDIRECT_REF from a
55f9d7dc 653 restrict-qualified pointer or a "void *". */
654 while (handled_component_p (inner))
96216d37 655 {
55f9d7dc 656 inner = TREE_OPERAND (inner, 0);
2a631e19 657 STRIP_NOPS (inner);
96216d37 658 }
659
2a448a75 660 if (INDIRECT_REF_P (inner))
96216d37 661 {
dd277d48 662 set = get_deref_alias_set_1 (TREE_OPERAND (inner, 0));
663 if (set != -1)
664 return set;
96216d37 665 }
666
667 /* Otherwise, pick up the outermost object that we could have a pointer
55f9d7dc 668 to, processing conversions as above. */
2b02580f 669 while (component_uses_parent_alias_set (t))
c3a9c149 670 {
55f9d7dc 671 t = TREE_OPERAND (t, 0);
2a631e19 672 STRIP_NOPS (t);
673 }
1607663f 674
96216d37 675 /* If we've already determined the alias set for a decl, just return
676 it. This is necessary for C++ anonymous unions, whose component
677 variables don't look like union members (boo!). */
afce1f57 678 if (TREE_CODE (t) == VAR_DECL
e16ceb8e 679 && DECL_RTL_SET_P (t) && MEM_P (DECL_RTL (t)))
afce1f57 680 return MEM_ALIAS_SET (DECL_RTL (t));
681
1607663f 682 /* Now all we care about is the type. */
683 t = TREE_TYPE (t);
f7c44134 684 }
685
f7c44134 686 /* Variant qualifiers don't affect the alias set, so get the main
dfe8e806 687 variant. */
f7c44134 688 t = TYPE_MAIN_VARIANT (t);
dfe8e806 689
690 /* Always use the canonical type as well. If this is a type that
691 requires structural comparisons to identify compatible types
692 use alias set zero. */
693 if (TYPE_STRUCTURAL_EQUALITY_P (t))
e58c17e7 694 {
695 /* Allow the language to specify another alias set for this
696 type. */
697 set = lang_hooks.get_alias_set (t);
698 if (set != -1)
699 return set;
700 return 0;
701 }
dfe8e806 702 t = TYPE_CANONICAL (t);
703 /* Canonical types shouldn't form a tree nor should the canonical
704 type require structural equality checks. */
705 gcc_assert (!TYPE_STRUCTURAL_EQUALITY_P (t) && TYPE_CANONICAL (t) == t);
706
707 /* If this is a type with a known alias set, return it. */
96216d37 708 if (TYPE_ALIAS_SET_KNOWN_P (t))
f7c44134 709 return TYPE_ALIAS_SET (t);
710
b35a8f48 711 /* We don't want to set TYPE_ALIAS_SET for incomplete types. */
712 if (!COMPLETE_TYPE_P (t))
713 {
714 /* For arrays with unknown size the conservative answer is the
715 alias set of the element type. */
716 if (TREE_CODE (t) == ARRAY_TYPE)
717 return get_alias_set (TREE_TYPE (t));
718
719 /* But return zero as a conservative answer for incomplete types. */
720 return 0;
721 }
722
f7c44134 723 /* See if the language has special handling for this type. */
dc24ddbd 724 set = lang_hooks.get_alias_set (t);
2a631e19 725 if (set != -1)
96216d37 726 return set;
851dfbff 727
f7c44134 728 /* There are no objects of FUNCTION_TYPE, so there's no point in
729 using up an alias set for them. (There are, of course, pointers
730 and references to functions, but that's different.) */
73bb980c 731 else if (TREE_CODE (t) == FUNCTION_TYPE
732 || TREE_CODE (t) == METHOD_TYPE)
f7c44134 733 set = 0;
9fcc3e54 734
735 /* Unless the language specifies otherwise, let vector types alias
736 their components. This avoids some nasty type punning issues in
737 normal usage. And indeed lets vectors be treated more like an
738 array slice. */
739 else if (TREE_CODE (t) == VECTOR_TYPE)
740 set = get_alias_set (TREE_TYPE (t));
741
62d823d0 742 /* Unless the language specifies otherwise, treat array types the
743 same as their components. This avoids the asymmetry we get
744 through recording the components. Consider accessing a
745 character(kind=1) through a reference to a character(kind=1)[1:1].
746 Or consider if we want to assign integer(kind=4)[0:D.1387] and
747 integer(kind=4)[4] the same alias set or not.
748 Just be pragmatic here and make sure the array and its element
749 type get the same alias set assigned. */
750 else if (TREE_CODE (t) == ARRAY_TYPE
751 && !TYPE_NONALIASED_COMPONENT (t))
752 set = get_alias_set (TREE_TYPE (t));
753
f7c44134 754 else
755 /* Otherwise make a new alias set for this type. */
756 set = new_alias_set ();
757
758 TYPE_ALIAS_SET (t) = set;
851dfbff 759
760 /* If this is an aggregate type, we must record any component aliasing
761 information. */
680210f2 762 if (AGGREGATE_TYPE_P (t) || TREE_CODE (t) == COMPLEX_TYPE)
851dfbff 763 record_component_aliases (t);
764
f7c44134 765 return set;
766}
767
768/* Return a brand-new alias set. */
769
32c2fdea 770alias_set_type
aecda0d6 771new_alias_set (void)
f7c44134 772{
f7c44134 773 if (flag_strict_aliasing)
56bbdce4 774 {
8b435339 775 if (alias_sets == 0)
776 VEC_safe_push (alias_set_entry, gc, alias_sets, 0);
777 VEC_safe_push (alias_set_entry, gc, alias_sets, 0);
778 return VEC_length (alias_set_entry, alias_sets) - 1;
56bbdce4 779 }
f7c44134 780 else
781 return 0;
782}
a5b1863e 783
8e2ef041 784/* Indicate that things in SUBSET can alias things in SUPERSET, but that
785 not everything that aliases SUPERSET also aliases SUBSET. For example,
786 in C, a store to an `int' can alias a load of a structure containing an
787 `int', and vice versa. But it can't alias a load of a 'double' member
788 of the same structure. Here, the structure would be the SUPERSET and
789 `int' the SUBSET. This relationship is also described in the comment at
790 the beginning of this file.
791
792 This function should be called only once per SUPERSET/SUBSET pair.
a5b1863e 793
794 It is illegal for SUPERSET to be zero; everything is implicitly a
795 subset of alias set zero. */
796
892fdb03 797void
32c2fdea 798record_alias_subset (alias_set_type superset, alias_set_type subset)
a5b1863e 799{
800 alias_set_entry superset_entry;
801 alias_set_entry subset_entry;
802
c3a9c149 803 /* It is possible in complex type situations for both sets to be the same,
804 in which case we can ignore this operation. */
805 if (superset == subset)
806 return;
807
64db345d 808 gcc_assert (superset);
a5b1863e 809
810 superset_entry = get_alias_set_entry (superset);
9342ee68 811 if (superset_entry == 0)
a5b1863e 812 {
813 /* Create an entry for the SUPERSET, so that we have a place to
814 attach the SUBSET. */
26dbec0a 815 superset_entry = GGC_NEW (struct alias_set_entry_d);
a5b1863e 816 superset_entry->alias_set = superset;
9342ee68 817 superset_entry->children
318dcdd8 818 = splay_tree_new_ggc (splay_tree_compare_ints);
f2e5de80 819 superset_entry->has_zero_child = 0;
8b435339 820 VEC_replace (alias_set_entry, alias_sets, superset, superset_entry);
a5b1863e 821 }
822
851dfbff 823 if (subset == 0)
824 superset_entry->has_zero_child = 1;
825 else
826 {
827 subset_entry = get_alias_set_entry (subset);
828 /* If there is an entry for the subset, enter all of its children
829 (if they are not already present) as children of the SUPERSET. */
9342ee68 830 if (subset_entry)
851dfbff 831 {
832 if (subset_entry->has_zero_child)
833 superset_entry->has_zero_child = 1;
083a2b5e 834
851dfbff 835 splay_tree_foreach (subset_entry->children, insert_subset_children,
836 superset_entry->children);
837 }
a5b1863e 838
851dfbff 839 /* Enter the SUBSET itself as a child of the SUPERSET. */
9342ee68 840 splay_tree_insert (superset_entry->children,
851dfbff 841 (splay_tree_key) subset, 0);
842 }
a5b1863e 843}
844
9501a338 845/* Record that component types of TYPE, if any, are part of that type for
846 aliasing purposes. For record types, we only record component types
c67bf066 847 for fields that are not marked non-addressable. For array types, we
848 only record the component type if it is not marked non-aliased. */
9501a338 849
850void
aecda0d6 851record_component_aliases (tree type)
9501a338 852{
32c2fdea 853 alias_set_type superset = get_alias_set (type);
9501a338 854 tree field;
855
856 if (superset == 0)
857 return;
858
859 switch (TREE_CODE (type))
860 {
9501a338 861 case RECORD_TYPE:
862 case UNION_TYPE:
863 case QUAL_UNION_TYPE:
8b332087 864 /* Recursively record aliases for the base classes, if there are any. */
f6cc6a08 865 if (TYPE_BINFO (type))
9342ee68 866 {
867 int i;
f6cc6a08 868 tree binfo, base_binfo;
a0c938f0 869
f6cc6a08 870 for (binfo = TYPE_BINFO (type), i = 0;
871 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
872 record_alias_subset (superset,
873 get_alias_set (BINFO_TYPE (base_binfo)));
9342ee68 874 }
9501a338 875 for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field))
c67bf066 876 if (TREE_CODE (field) == FIELD_DECL && !DECL_NONADDRESSABLE_P (field))
851dfbff 877 record_alias_subset (superset, get_alias_set (TREE_TYPE (field)));
9501a338 878 break;
879
680210f2 880 case COMPLEX_TYPE:
881 record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
882 break;
883
62d823d0 884 /* VECTOR_TYPE and ARRAY_TYPE share the alias set with their
885 element type. */
886
9501a338 887 default:
888 break;
889 }
890}
891
f7c44134 892/* Allocate an alias set for use in storing and reading from the varargs
893 spill area. */
894
32c2fdea 895static GTY(()) alias_set_type varargs_set = -1;
4ec9406e 896
32c2fdea 897alias_set_type
aecda0d6 898get_varargs_alias_set (void)
f7c44134 899{
fcdd3ab3 900#if 1
901 /* We now lower VA_ARG_EXPR, and there's currently no way to attach the
902 varargs alias set to an INDIRECT_REF (FIXME!), so we can't
903 consistently use the varargs alias set for loads from the varargs
904 area. So don't use it anywhere. */
905 return 0;
906#else
4ec9406e 907 if (varargs_set == -1)
908 varargs_set = new_alias_set ();
f7c44134 909
4ec9406e 910 return varargs_set;
fcdd3ab3 911#endif
f7c44134 912}
913
914/* Likewise, but used for the fixed portions of the frame, e.g., register
915 save areas. */
916
32c2fdea 917static GTY(()) alias_set_type frame_set = -1;
4ec9406e 918
32c2fdea 919alias_set_type
aecda0d6 920get_frame_alias_set (void)
f7c44134 921{
4ec9406e 922 if (frame_set == -1)
923 frame_set = new_alias_set ();
f7c44134 924
4ec9406e 925 return frame_set;
f7c44134 926}
927
e7c893ba 928/* Inside SRC, the source of a SET, find a base address. */
929
ea0cb7ae 930static rtx
aecda0d6 931find_base_value (rtx src)
ea0cb7ae 932{
970c0c06 933 unsigned int regno;
d01410d3 934
2e984a7a 935#if defined (FIND_BASE_TERM)
936 /* Try machine-dependent ways to find the base term. */
937 src = FIND_BASE_TERM (src);
938#endif
939
ea0cb7ae 940 switch (GET_CODE (src))
941 {
942 case SYMBOL_REF:
943 case LABEL_REF:
944 return src;
945
946 case REG:
9db10305 947 regno = REGNO (src);
083a2b5e 948 /* At the start of a function, argument registers have known base
e7c893ba 949 values which may be lost later. Returning an ADDRESS
950 expression here allows optimization based on argument values
951 even when the argument registers are used for other purposes. */
970c0c06 952 if (regno < FIRST_PSEUDO_REGISTER && copying_arguments)
953 return new_reg_base_value[regno];
1a538f67 954
ebd13eec 955 /* If a pseudo has a known base value, return it. Do not do this
9464d436 956 for non-fixed hard regs since it can result in a circular
957 dependency chain for registers which have values at function entry.
ebd13eec 958
959 The test above is not sufficient because the scheduler may move
960 a copy out of an arg reg past the NOTE_INSN_FUNCTION_BEGIN. */
9464d436 961 if ((regno >= FIRST_PSEUDO_REGISTER || fixed_regs[regno])
980f3285 962 && regno < VEC_length (rtx, reg_base_value))
e5be0cc6 963 {
964 /* If we're inside init_alias_analysis, use new_reg_base_value
965 to reduce the number of relaxation iterations. */
a303ed8c 966 if (new_reg_base_value && new_reg_base_value[regno]
3072d30e 967 && DF_REG_DEF_COUNT (regno) == 1)
e5be0cc6 968 return new_reg_base_value[regno];
969
980f3285 970 if (VEC_index (rtx, reg_base_value, regno))
971 return VEC_index (rtx, reg_base_value, regno);
e5be0cc6 972 }
1a538f67 973
1c5cb56c 974 return 0;
ea0cb7ae 975
976 case MEM:
977 /* Check for an argument passed in memory. Only record in the
978 copying-arguments block; it is too hard to track changes
979 otherwise. */
980 if (copying_arguments
981 && (XEXP (src, 0) == arg_pointer_rtx
982 || (GET_CODE (XEXP (src, 0)) == PLUS
983 && XEXP (XEXP (src, 0), 0) == arg_pointer_rtx)))
941522d6 984 return gen_rtx_ADDRESS (VOIDmode, src);
ea0cb7ae 985 return 0;
986
987 case CONST:
988 src = XEXP (src, 0);
989 if (GET_CODE (src) != PLUS && GET_CODE (src) != MINUS)
990 break;
083a2b5e 991
2c0e001b 992 /* ... fall through ... */
e7c893ba 993
ea0cb7ae 994 case PLUS:
995 case MINUS:
e7c893ba 996 {
06c5c535 997 rtx temp, src_0 = XEXP (src, 0), src_1 = XEXP (src, 1);
998
560de2f8 999 /* If either operand is a REG that is a known pointer, then it
1000 is the base. */
1001 if (REG_P (src_0) && REG_POINTER (src_0))
1002 return find_base_value (src_0);
1003 if (REG_P (src_1) && REG_POINTER (src_1))
1004 return find_base_value (src_1);
1005
06c5c535 1006 /* If either operand is a REG, then see if we already have
1007 a known value for it. */
560de2f8 1008 if (REG_P (src_0))
06c5c535 1009 {
1010 temp = find_base_value (src_0);
083a2b5e 1011 if (temp != 0)
06c5c535 1012 src_0 = temp;
1013 }
1014
560de2f8 1015 if (REG_P (src_1))
06c5c535 1016 {
1017 temp = find_base_value (src_1);
083a2b5e 1018 if (temp!= 0)
06c5c535 1019 src_1 = temp;
1020 }
e7c893ba 1021
560de2f8 1022 /* If either base is named object or a special address
1023 (like an argument or stack reference), then use it for the
1024 base term. */
1025 if (src_0 != 0
1026 && (GET_CODE (src_0) == SYMBOL_REF
1027 || GET_CODE (src_0) == LABEL_REF
1028 || (GET_CODE (src_0) == ADDRESS
1029 && GET_MODE (src_0) != VOIDmode)))
1030 return src_0;
1031
1032 if (src_1 != 0
1033 && (GET_CODE (src_1) == SYMBOL_REF
1034 || GET_CODE (src_1) == LABEL_REF
1035 || (GET_CODE (src_1) == ADDRESS
1036 && GET_MODE (src_1) != VOIDmode)))
1037 return src_1;
1038
083a2b5e 1039 /* Guess which operand is the base address:
06c5c535 1040 If either operand is a symbol, then it is the base. If
1041 either operand is a CONST_INT, then the other is the base. */
971ba038 1042 if (CONST_INT_P (src_1) || CONSTANT_P (src_0))
e7c893ba 1043 return find_base_value (src_0);
971ba038 1044 else if (CONST_INT_P (src_0) || CONSTANT_P (src_1))
06c5c535 1045 return find_base_value (src_1);
1046
ea0cb7ae 1047 return 0;
e7c893ba 1048 }
1049
1050 case LO_SUM:
1051 /* The standard form is (lo_sum reg sym) so look only at the
1052 second operand. */
1053 return find_base_value (XEXP (src, 1));
ea0cb7ae 1054
1055 case AND:
1056 /* If the second operand is constant set the base
2c0e001b 1057 address to the first operand. */
971ba038 1058 if (CONST_INT_P (XEXP (src, 1)) && INTVAL (XEXP (src, 1)) != 0)
e7c893ba 1059 return find_base_value (XEXP (src, 0));
ea0cb7ae 1060 return 0;
1061
43d45282 1062 case TRUNCATE:
98155838 1063 /* As we do not know which address space the pointer is refering to, we can
1064 handle this only if the target does not support different pointer or
1065 address modes depending on the address space. */
1066 if (!target_default_pointer_address_modes_p ())
1067 break;
43d45282 1068 if (GET_MODE_SIZE (GET_MODE (src)) < GET_MODE_SIZE (Pmode))
1069 break;
1070 /* Fall through. */
ea0cb7ae 1071 case HIGH:
2be64ef0 1072 case PRE_INC:
1073 case PRE_DEC:
1074 case POST_INC:
1075 case POST_DEC:
1076 case PRE_MODIFY:
1077 case POST_MODIFY:
e7c893ba 1078 return find_base_value (XEXP (src, 0));
99c14947 1079
d01410d3 1080 case ZERO_EXTEND:
1081 case SIGN_EXTEND: /* used for NT/Alpha pointers */
98155838 1082 /* As we do not know which address space the pointer is refering to, we can
1083 handle this only if the target does not support different pointer or
1084 address modes depending on the address space. */
1085 if (!target_default_pointer_address_modes_p ())
1086 break;
1087
d01410d3 1088 {
1089 rtx temp = find_base_value (XEXP (src, 0));
1090
85d654dd 1091 if (temp != 0 && CONSTANT_P (temp))
d01410d3 1092 temp = convert_memory_address (Pmode, temp);
d01410d3 1093
1094 return temp;
1095 }
1096
99c14947 1097 default:
1098 break;
ea0cb7ae 1099 }
1100
1101 return 0;
1102}
1103
1104/* Called from init_alias_analysis indirectly through note_stores. */
1105
083a2b5e 1106/* While scanning insns to find base values, reg_seen[N] is nonzero if
ea0cb7ae 1107 register N has been set in this function. */
1108static char *reg_seen;
1109
10882800 1110/* Addresses which are known not to alias anything else are identified
1111 by a unique integer. */
06c5c535 1112static int unique_id;
1113
e7c893ba 1114static void
81a410b1 1115record_set (rtx dest, const_rtx set, void *data ATTRIBUTE_UNUSED)
ea0cb7ae 1116{
19cb6b50 1117 unsigned regno;
ea0cb7ae 1118 rtx src;
3721f260 1119 int n;
ea0cb7ae 1120
8ad4c111 1121 if (!REG_P (dest))
ea0cb7ae 1122 return;
1123
9db10305 1124 regno = REGNO (dest);
ea0cb7ae 1125
980f3285 1126 gcc_assert (regno < VEC_length (rtx, reg_base_value));
c2e94b25 1127
3721f260 1128 /* If this spans multiple hard registers, then we must indicate that every
1129 register has an unusable value. */
1130 if (regno < FIRST_PSEUDO_REGISTER)
67d6c12b 1131 n = hard_regno_nregs[regno][GET_MODE (dest)];
3721f260 1132 else
1133 n = 1;
1134 if (n != 1)
1135 {
1136 while (--n >= 0)
1137 {
1138 reg_seen[regno + n] = 1;
1139 new_reg_base_value[regno + n] = 0;
1140 }
1141 return;
1142 }
1143
ea0cb7ae 1144 if (set)
1145 {
1146 /* A CLOBBER wipes out any old value but does not prevent a previously
1147 unset register from acquiring a base address (i.e. reg_seen is not
1148 set). */
1149 if (GET_CODE (set) == CLOBBER)
1150 {
06c5c535 1151 new_reg_base_value[regno] = 0;
ea0cb7ae 1152 return;
1153 }
1154 src = SET_SRC (set);
1155 }
1156 else
1157 {
ea0cb7ae 1158 if (reg_seen[regno])
1159 {
06c5c535 1160 new_reg_base_value[regno] = 0;
ea0cb7ae 1161 return;
1162 }
1163 reg_seen[regno] = 1;
941522d6 1164 new_reg_base_value[regno] = gen_rtx_ADDRESS (Pmode,
1165 GEN_INT (unique_id++));
ea0cb7ae 1166 return;
1167 }
1168
ad6b1fe1 1169 /* If this is not the first set of REGNO, see whether the new value
1170 is related to the old one. There are two cases of interest:
1171
1172 (1) The register might be assigned an entirely new value
1173 that has the same base term as the original set.
1174
1175 (2) The set might be a simple self-modification that
1176 cannot change REGNO's base value.
1177
1178 If neither case holds, reject the original base value as invalid.
1179 Note that the following situation is not detected:
1180
a0c938f0 1181 extern int x, y; int *p = &x; p += (&y-&x);
ad6b1fe1 1182
ea0cb7ae 1183 ANSI C does not allow computing the difference of addresses
1184 of distinct top level objects. */
ad6b1fe1 1185 if (new_reg_base_value[regno] != 0
1186 && find_base_value (src) != new_reg_base_value[regno])
ea0cb7ae 1187 switch (GET_CODE (src))
1188 {
e7c893ba 1189 case LO_SUM:
ea0cb7ae 1190 case MINUS:
1191 if (XEXP (src, 0) != dest && XEXP (src, 1) != dest)
06c5c535 1192 new_reg_base_value[regno] = 0;
ea0cb7ae 1193 break;
43d45282 1194 case PLUS:
1195 /* If the value we add in the PLUS is also a valid base value,
1196 this might be the actual base value, and the original value
1197 an index. */
1198 {
1199 rtx other = NULL_RTX;
1200
1201 if (XEXP (src, 0) == dest)
1202 other = XEXP (src, 1);
1203 else if (XEXP (src, 1) == dest)
1204 other = XEXP (src, 0);
1205
1206 if (! other || find_base_value (other))
1207 new_reg_base_value[regno] = 0;
1208 break;
1209 }
ea0cb7ae 1210 case AND:
971ba038 1211 if (XEXP (src, 0) != dest || !CONST_INT_P (XEXP (src, 1)))
06c5c535 1212 new_reg_base_value[regno] = 0;
ea0cb7ae 1213 break;
ea0cb7ae 1214 default:
06c5c535 1215 new_reg_base_value[regno] = 0;
ea0cb7ae 1216 break;
1217 }
1218 /* If this is the first set of a register, record the value. */
1219 else if ((regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno])
06c5c535 1220 && ! reg_seen[regno] && new_reg_base_value[regno] == 0)
1221 new_reg_base_value[regno] = find_base_value (src);
ea0cb7ae 1222
1223 reg_seen[regno] = 1;
1224}
1225
12cb06ad 1226/* If a value is known for REGNO, return it. */
1227
a0c938f0 1228rtx
12cb06ad 1229get_reg_known_value (unsigned int regno)
1230{
1231 if (regno >= FIRST_PSEUDO_REGISTER)
1232 {
1233 regno -= FIRST_PSEUDO_REGISTER;
1234 if (regno < reg_known_value_size)
1235 return reg_known_value[regno];
1236 }
1237 return NULL;
9f5e1a5a 1238}
1239
12cb06ad 1240/* Set it. */
1241
1242static void
1243set_reg_known_value (unsigned int regno, rtx val)
1244{
1245 if (regno >= FIRST_PSEUDO_REGISTER)
1246 {
1247 regno -= FIRST_PSEUDO_REGISTER;
1248 if (regno < reg_known_value_size)
1249 reg_known_value[regno] = val;
1250 }
1251}
1252
1253/* Similarly for reg_known_equiv_p. */
1254
1255bool
1256get_reg_known_equiv_p (unsigned int regno)
1257{
1258 if (regno >= FIRST_PSEUDO_REGISTER)
1259 {
1260 regno -= FIRST_PSEUDO_REGISTER;
1261 if (regno < reg_known_value_size)
1262 return reg_known_equiv_p[regno];
1263 }
1264 return false;
1265}
1266
1267static void
1268set_reg_known_equiv_p (unsigned int regno, bool val)
1269{
1270 if (regno >= FIRST_PSEUDO_REGISTER)
1271 {
1272 regno -= FIRST_PSEUDO_REGISTER;
1273 if (regno < reg_known_value_size)
1274 reg_known_equiv_p[regno] = val;
1275 }
1276}
1277
1278
7cfb9bcf 1279/* Returns a canonical version of X, from the point of view alias
1280 analysis. (For example, if X is a MEM whose address is a register,
1281 and the register has a known value (say a SYMBOL_REF), then a MEM
1282 whose address is the SYMBOL_REF is returned.) */
1283
1284rtx
aecda0d6 1285canon_rtx (rtx x)
ea0cb7ae 1286{
1287 /* Recursively look for equivalences. */
8ad4c111 1288 if (REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER)
12cb06ad 1289 {
1290 rtx t = get_reg_known_value (REGNO (x));
1291 if (t == x)
1292 return x;
1293 if (t)
1294 return canon_rtx (t);
1295 }
1296
1297 if (GET_CODE (x) == PLUS)
ea0cb7ae 1298 {
1299 rtx x0 = canon_rtx (XEXP (x, 0));
1300 rtx x1 = canon_rtx (XEXP (x, 1));
1301
1302 if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
1303 {
971ba038 1304 if (CONST_INT_P (x0))
b244d4c7 1305 return plus_constant (x1, INTVAL (x0));
971ba038 1306 else if (CONST_INT_P (x1))
b244d4c7 1307 return plus_constant (x0, INTVAL (x1));
941522d6 1308 return gen_rtx_PLUS (GET_MODE (x), x0, x1);
ea0cb7ae 1309 }
1310 }
083a2b5e 1311
ea0cb7ae 1312 /* This gives us much better alias analysis when called from
1313 the loop optimizer. Note we want to leave the original
1314 MEM alone, but need to return the canonicalized MEM with
1315 all the flags with their original values. */
e16ceb8e 1316 else if (MEM_P (x))
e4e86ec5 1317 x = replace_equiv_address_nv (x, canon_rtx (XEXP (x, 0)));
083a2b5e 1318
ea0cb7ae 1319 return x;
1320}
1321
1322/* Return 1 if X and Y are identical-looking rtx's.
6285298a 1323 Expect that X and Y has been already canonicalized.
ea0cb7ae 1324
1325 We use the data in reg_known_value above to see if two registers with
1326 different numbers are, in fact, equivalent. */
1327
1328static int
7ecb5bb2 1329rtx_equal_for_memref_p (const_rtx x, const_rtx y)
ea0cb7ae 1330{
19cb6b50 1331 int i;
1332 int j;
1333 enum rtx_code code;
1334 const char *fmt;
ea0cb7ae 1335
1336 if (x == 0 && y == 0)
1337 return 1;
1338 if (x == 0 || y == 0)
1339 return 0;
083a2b5e 1340
ea0cb7ae 1341 if (x == y)
1342 return 1;
1343
1344 code = GET_CODE (x);
1345 /* Rtx's of different codes cannot be equal. */
1346 if (code != GET_CODE (y))
1347 return 0;
1348
1349 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1350 (REG:SI x) and (REG:HI x) are NOT equivalent. */
1351
1352 if (GET_MODE (x) != GET_MODE (y))
1353 return 0;
1354
7cfb9bcf 1355 /* Some RTL can be compared without a recursive examination. */
1356 switch (code)
1357 {
1358 case REG:
1359 return REGNO (x) == REGNO (y);
1360
1361 case LABEL_REF:
1362 return XEXP (x, 0) == XEXP (y, 0);
9342ee68 1363
7cfb9bcf 1364 case SYMBOL_REF:
1365 return XSTR (x, 0) == XSTR (y, 0);
1366
a2e238f7 1367 case VALUE:
7cfb9bcf 1368 case CONST_INT:
1369 case CONST_DOUBLE:
e397ad8e 1370 case CONST_FIXED:
7cfb9bcf 1371 /* There's no need to compare the contents of CONST_DOUBLEs or
1372 CONST_INTs because pointer equality is a good enough
1373 comparison for these nodes. */
1374 return 0;
1375
7cfb9bcf 1376 default:
1377 break;
1378 }
ea0cb7ae 1379
6285298a 1380 /* canon_rtx knows how to handle plus. No need to canonicalize. */
1381 if (code == PLUS)
ea0cb7ae 1382 return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
1383 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
1384 || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
1385 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
6285298a 1386 /* For commutative operations, the RTX match if the operand match in any
1387 order. Also handle the simple binary and unary cases without a loop. */
6720e96c 1388 if (COMMUTATIVE_P (x))
6285298a 1389 {
1390 rtx xop0 = canon_rtx (XEXP (x, 0));
1391 rtx yop0 = canon_rtx (XEXP (y, 0));
1392 rtx yop1 = canon_rtx (XEXP (y, 1));
1393
1394 return ((rtx_equal_for_memref_p (xop0, yop0)
1395 && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)), yop1))
1396 || (rtx_equal_for_memref_p (xop0, yop1)
1397 && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)), yop0)));
1398 }
6720e96c 1399 else if (NON_COMMUTATIVE_P (x))
6285298a 1400 {
1401 return (rtx_equal_for_memref_p (canon_rtx (XEXP (x, 0)),
aecda0d6 1402 canon_rtx (XEXP (y, 0)))
6285298a 1403 && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)),
1404 canon_rtx (XEXP (y, 1))));
1405 }
6720e96c 1406 else if (UNARY_P (x))
6285298a 1407 return rtx_equal_for_memref_p (canon_rtx (XEXP (x, 0)),
aecda0d6 1408 canon_rtx (XEXP (y, 0)));
ea0cb7ae 1409
1410 /* Compare the elements. If any pair of corresponding elements
1a6c3add 1411 fail to match, return 0 for the whole things.
1412
1413 Limit cases to types which actually appear in addresses. */
ea0cb7ae 1414
1415 fmt = GET_RTX_FORMAT (code);
1416 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1417 {
1418 switch (fmt[i])
1419 {
ea0cb7ae 1420 case 'i':
1421 if (XINT (x, i) != XINT (y, i))
1422 return 0;
1423 break;
1424
ea0cb7ae 1425 case 'E':
1426 /* Two vectors must have the same length. */
1427 if (XVECLEN (x, i) != XVECLEN (y, i))
1428 return 0;
1429
1430 /* And the corresponding elements must match. */
1431 for (j = 0; j < XVECLEN (x, i); j++)
6285298a 1432 if (rtx_equal_for_memref_p (canon_rtx (XVECEXP (x, i, j)),
1433 canon_rtx (XVECEXP (y, i, j))) == 0)
ea0cb7ae 1434 return 0;
1435 break;
1436
1437 case 'e':
6285298a 1438 if (rtx_equal_for_memref_p (canon_rtx (XEXP (x, i)),
1439 canon_rtx (XEXP (y, i))) == 0)
ea0cb7ae 1440 return 0;
1441 break;
1442
83ec925c 1443 /* This can happen for asm operands. */
1444 case 's':
1445 if (strcmp (XSTR (x, i), XSTR (y, i)))
1446 return 0;
1447 break;
1448
23c04f6b 1449 /* This can happen for an asm which clobbers memory. */
1450 case '0':
1451 break;
1452
ea0cb7ae 1453 /* It is believed that rtx's at this level will never
1454 contain anything but integers and other rtx's,
1455 except for within LABEL_REFs and SYMBOL_REFs. */
1456 default:
64db345d 1457 gcc_unreachable ();
ea0cb7ae 1458 }
1459 }
1460 return 1;
1461}
1462
5a37abfd 1463rtx
aecda0d6 1464find_base_term (rtx x)
ea0cb7ae 1465{
1617c276 1466 cselib_val *val;
1467 struct elt_loc_list *l;
1468
15750b1e 1469#if defined (FIND_BASE_TERM)
1470 /* Try machine-dependent ways to find the base term. */
1471 x = FIND_BASE_TERM (x);
1472#endif
1473
ea0cb7ae 1474 switch (GET_CODE (x))
1475 {
1476 case REG:
1477 return REG_BASE_VALUE (x);
1478
2be64ef0 1479 case TRUNCATE:
98155838 1480 /* As we do not know which address space the pointer is refering to, we can
1481 handle this only if the target does not support different pointer or
1482 address modes depending on the address space. */
1483 if (!target_default_pointer_address_modes_p ())
1484 return 0;
2be64ef0 1485 if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (Pmode))
9342ee68 1486 return 0;
2be64ef0 1487 /* Fall through. */
ea0cb7ae 1488 case HIGH:
22dfec7d 1489 case PRE_INC:
1490 case PRE_DEC:
1491 case POST_INC:
1492 case POST_DEC:
2be64ef0 1493 case PRE_MODIFY:
1494 case POST_MODIFY:
22dfec7d 1495 return find_base_term (XEXP (x, 0));
1496
5104ef69 1497 case ZERO_EXTEND:
1498 case SIGN_EXTEND: /* Used for Alpha/NT pointers */
98155838 1499 /* As we do not know which address space the pointer is refering 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 if (!target_default_pointer_address_modes_p ())
1503 return 0;
1504
5104ef69 1505 {
1506 rtx temp = find_base_term (XEXP (x, 0));
1507
85d654dd 1508 if (temp != 0 && CONSTANT_P (temp))
5104ef69 1509 temp = convert_memory_address (Pmode, temp);
5104ef69 1510
1511 return temp;
1512 }
1513
1617c276 1514 case VALUE:
1515 val = CSELIB_VAL_PTR (x);
a2e238f7 1516 if (!val)
1517 return 0;
1617c276 1518 for (l = val->locs; l; l = l->next)
1519 if ((x = find_base_term (l->loc)) != 0)
1520 return x;
1521 return 0;
1522
a7cf5bbf 1523 case LO_SUM:
1524 /* The standard form is (lo_sum reg sym) so look only at the
1525 second operand. */
1526 return find_base_term (XEXP (x, 1));
1527
ea0cb7ae 1528 case CONST:
1529 x = XEXP (x, 0);
1530 if (GET_CODE (x) != PLUS && GET_CODE (x) != MINUS)
1531 return 0;
b4b174c3 1532 /* Fall through. */
ea0cb7ae 1533 case PLUS:
1534 case MINUS:
1535 {
1b5bbc4c 1536 rtx tmp1 = XEXP (x, 0);
1537 rtx tmp2 = XEXP (x, 1);
1538
35a3065a 1539 /* This is a little bit tricky since we have to determine which of
1b5bbc4c 1540 the two operands represents the real base address. Otherwise this
1541 routine may return the index register instead of the base register.
1542
1543 That may cause us to believe no aliasing was possible, when in
1544 fact aliasing is possible.
1545
1546 We use a few simple tests to guess the base register. Additional
1547 tests can certainly be added. For example, if one of the operands
1548 is a shift or multiply, then it must be the index register and the
1549 other operand is the base register. */
9342ee68 1550
15750b1e 1551 if (tmp1 == pic_offset_table_rtx && CONSTANT_P (tmp2))
1552 return find_base_term (tmp2);
1553
1b5bbc4c 1554 /* If either operand is known to be a pointer, then use it
1555 to determine the base term. */
e61a0a7f 1556 if (REG_P (tmp1) && REG_POINTER (tmp1))
02b0d167 1557 {
1558 rtx base = find_base_term (tmp1);
1559 if (base)
1560 return base;
1561 }
1b5bbc4c 1562
e61a0a7f 1563 if (REG_P (tmp2) && REG_POINTER (tmp2))
02b0d167 1564 {
1565 rtx base = find_base_term (tmp2);
1566 if (base)
1567 return base;
1568 }
1b5bbc4c 1569
1570 /* Neither operand was known to be a pointer. Go ahead and find the
1571 base term for both operands. */
1572 tmp1 = find_base_term (tmp1);
1573 tmp2 = find_base_term (tmp2);
1574
1575 /* If either base term is named object or a special address
1576 (like an argument or stack reference), then use it for the
1577 base term. */
083a2b5e 1578 if (tmp1 != 0
1b5bbc4c 1579 && (GET_CODE (tmp1) == SYMBOL_REF
1580 || GET_CODE (tmp1) == LABEL_REF
1581 || (GET_CODE (tmp1) == ADDRESS
1582 && GET_MODE (tmp1) != VOIDmode)))
1583 return tmp1;
1584
083a2b5e 1585 if (tmp2 != 0
1b5bbc4c 1586 && (GET_CODE (tmp2) == SYMBOL_REF
1587 || GET_CODE (tmp2) == LABEL_REF
1588 || (GET_CODE (tmp2) == ADDRESS
1589 && GET_MODE (tmp2) != VOIDmode)))
1590 return tmp2;
1591
1592 /* We could not determine which of the two operands was the
1593 base register and which was the index. So we can determine
1594 nothing from the base alias check. */
1595 return 0;
ea0cb7ae 1596 }
1597
1598 case AND:
971ba038 1599 if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) != 0)
2be64ef0 1600 return find_base_term (XEXP (x, 0));
ea0cb7ae 1601 return 0;
1602
1603 case SYMBOL_REF:
1604 case LABEL_REF:
1605 return x;
1606
1607 default:
1608 return 0;
1609 }
1610}
1611
1612/* Return 0 if the addresses X and Y are known to point to different
1613 objects, 1 if they might be pointers to the same object. */
1614
1615static int
aecda0d6 1616base_alias_check (rtx x, rtx y, enum machine_mode x_mode,
1617 enum machine_mode y_mode)
ea0cb7ae 1618{
1619 rtx x_base = find_base_term (x);
1620 rtx y_base = find_base_term (y);
1621
3ad3a0ed 1622 /* If the address itself has no known base see if a known equivalent
1623 value has one. If either address still has no known base, nothing
1624 is known about aliasing. */
1625 if (x_base == 0)
1626 {
1627 rtx x_c;
083a2b5e 1628
3ad3a0ed 1629 if (! flag_expensive_optimizations || (x_c = canon_rtx (x)) == x)
1630 return 1;
083a2b5e 1631
3ad3a0ed 1632 x_base = find_base_term (x_c);
1633 if (x_base == 0)
1634 return 1;
1635 }
ea0cb7ae 1636
3ad3a0ed 1637 if (y_base == 0)
1638 {
1639 rtx y_c;
1640 if (! flag_expensive_optimizations || (y_c = canon_rtx (y)) == y)
1641 return 1;
083a2b5e 1642
3ad3a0ed 1643 y_base = find_base_term (y_c);
1644 if (y_base == 0)
1645 return 1;
1646 }
1647
1648 /* If the base addresses are equal nothing is known about aliasing. */
1649 if (rtx_equal_p (x_base, y_base))
ea0cb7ae 1650 return 1;
1651
f92492f7 1652 /* The base addresses are different expressions. If they are not accessed
1653 via AND, there is no conflict. We can bring knowledge of object
1654 alignment into play here. For example, on alpha, "char a, b;" can
1655 alias one another, though "char a; long b;" cannot. AND addesses may
1656 implicitly alias surrounding objects; i.e. unaligned access in DImode
1657 via AND address can alias all surrounding object types except those
1658 with aligment 8 or higher. */
1659 if (GET_CODE (x) == AND && GET_CODE (y) == AND)
1660 return 1;
1661 if (GET_CODE (x) == AND
971ba038 1662 && (!CONST_INT_P (XEXP (x, 1))
f92492f7 1663 || (int) GET_MODE_UNIT_SIZE (y_mode) < -INTVAL (XEXP (x, 1))))
1664 return 1;
1665 if (GET_CODE (y) == AND
971ba038 1666 && (!CONST_INT_P (XEXP (y, 1))
f92492f7 1667 || (int) GET_MODE_UNIT_SIZE (x_mode) < -INTVAL (XEXP (y, 1))))
1668 return 1;
1669
1670 /* Differing symbols not accessed via AND never alias. */
ea0cb7ae 1671 if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
f92492f7 1672 return 0;
ea0cb7ae 1673
1674 /* If one address is a stack reference there can be no alias:
1675 stack references using different base registers do not alias,
1676 a stack reference can not alias a parameter, and a stack reference
1677 can not alias a global. */
1678 if ((GET_CODE (x_base) == ADDRESS && GET_MODE (x_base) == Pmode)
1679 || (GET_CODE (y_base) == ADDRESS && GET_MODE (y_base) == Pmode))
1680 return 0;
1681
1682 if (! flag_argument_noalias)
1683 return 1;
1684
1685 if (flag_argument_noalias > 1)
1686 return 0;
1687
2c0e001b 1688 /* Weak noalias assertion (arguments are distinct, but may match globals). */
ea0cb7ae 1689 return ! (GET_MODE (x_base) == VOIDmode && GET_MODE (y_base) == VOIDmode);
1690}
1691
1617c276 1692/* Convert the address X into something we can use. This is done by returning
1693 it unchanged unless it is a value; in the latter case we call cselib to get
1694 a more useful rtx. */
f7c44134 1695
8e802be9 1696rtx
aecda0d6 1697get_addr (rtx x)
1617c276 1698{
1699 cselib_val *v;
1700 struct elt_loc_list *l;
1701
1702 if (GET_CODE (x) != VALUE)
1703 return x;
1704 v = CSELIB_VAL_PTR (x);
a2e238f7 1705 if (v)
1706 {
1707 for (l = v->locs; l; l = l->next)
1708 if (CONSTANT_P (l->loc))
1709 return l->loc;
1710 for (l = v->locs; l; l = l->next)
e16ceb8e 1711 if (!REG_P (l->loc) && !MEM_P (l->loc))
a2e238f7 1712 return l->loc;
1713 if (v->locs)
1714 return v->locs->loc;
1715 }
1617c276 1716 return x;
1717}
1718
b9f92976 1719/* Return the address of the (N_REFS + 1)th memory reference to ADDR
1720 where SIZE is the size in bytes of the memory reference. If ADDR
1721 is not modified by the memory reference then ADDR is returned. */
1722
0aa9ffd4 1723static rtx
aecda0d6 1724addr_side_effect_eval (rtx addr, int size, int n_refs)
b9f92976 1725{
1726 int offset = 0;
9342ee68 1727
b9f92976 1728 switch (GET_CODE (addr))
1729 {
1730 case PRE_INC:
1731 offset = (n_refs + 1) * size;
1732 break;
1733 case PRE_DEC:
1734 offset = -(n_refs + 1) * size;
1735 break;
1736 case POST_INC:
1737 offset = n_refs * size;
1738 break;
1739 case POST_DEC:
1740 offset = -n_refs * size;
1741 break;
1742
1743 default:
1744 return addr;
1745 }
9342ee68 1746
b9f92976 1747 if (offset)
6285298a 1748 addr = gen_rtx_PLUS (GET_MODE (addr), XEXP (addr, 0),
a0c938f0 1749 GEN_INT (offset));
b9f92976 1750 else
1751 addr = XEXP (addr, 0);
6285298a 1752 addr = canon_rtx (addr);
b9f92976 1753
1754 return addr;
1755}
1756
ea0cb7ae 1757/* Return nonzero if X and Y (memory addresses) could reference the
1758 same location in memory. C is an offset accumulator. When
1759 C is nonzero, we are testing aliases between X and Y + C.
1760 XSIZE is the size in bytes of the X reference,
1761 similarly YSIZE is the size in bytes for Y.
6285298a 1762 Expect that canon_rtx has been already called for X and Y.
ea0cb7ae 1763
1764 If XSIZE or YSIZE is zero, we do not know the amount of memory being
1765 referenced (the reference was BLKmode), so make the most pessimistic
1766 assumptions.
1767
1e38bf49 1768 If XSIZE or YSIZE is negative, we may access memory outside the object
1769 being referenced as a side effect. This can happen when using AND to
1770 align memory references, as is done on the Alpha.
1771
ea0cb7ae 1772 Nice to notice that varying addresses cannot conflict with fp if no
4958fe6e 1773 local variables had their addresses taken, but that's too hard now. */
ea0cb7ae 1774
ea0cb7ae 1775static int
aecda0d6 1776memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
ea0cb7ae 1777{
1617c276 1778 if (GET_CODE (x) == VALUE)
1779 x = get_addr (x);
1780 if (GET_CODE (y) == VALUE)
1781 y = get_addr (y);
ea0cb7ae 1782 if (GET_CODE (x) == HIGH)
1783 x = XEXP (x, 0);
1784 else if (GET_CODE (x) == LO_SUM)
1785 x = XEXP (x, 1);
1786 else
6285298a 1787 x = addr_side_effect_eval (x, xsize, 0);
ea0cb7ae 1788 if (GET_CODE (y) == HIGH)
1789 y = XEXP (y, 0);
1790 else if (GET_CODE (y) == LO_SUM)
1791 y = XEXP (y, 1);
1792 else
6285298a 1793 y = addr_side_effect_eval (y, ysize, 0);
ea0cb7ae 1794
1795 if (rtx_equal_for_memref_p (x, y))
1796 {
1e38bf49 1797 if (xsize <= 0 || ysize <= 0)
ea0cb7ae 1798 return 1;
1799 if (c >= 0 && xsize > c)
1800 return 1;
1801 if (c < 0 && ysize+c > 0)
1802 return 1;
1803 return 0;
1804 }
1805
35d3eedd 1806 /* This code used to check for conflicts involving stack references and
1807 globals but the base address alias code now handles these cases. */
ea0cb7ae 1808
1809 if (GET_CODE (x) == PLUS)
1810 {
1811 /* The fact that X is canonicalized means that this
1812 PLUS rtx is canonicalized. */
1813 rtx x0 = XEXP (x, 0);
1814 rtx x1 = XEXP (x, 1);
1815
1816 if (GET_CODE (y) == PLUS)
1817 {
1818 /* The fact that Y is canonicalized means that this
1819 PLUS rtx is canonicalized. */
1820 rtx y0 = XEXP (y, 0);
1821 rtx y1 = XEXP (y, 1);
1822
1823 if (rtx_equal_for_memref_p (x1, y1))
1824 return memrefs_conflict_p (xsize, x0, ysize, y0, c);
1825 if (rtx_equal_for_memref_p (x0, y0))
1826 return memrefs_conflict_p (xsize, x1, ysize, y1, c);
971ba038 1827 if (CONST_INT_P (x1))
5f59c49b 1828 {
971ba038 1829 if (CONST_INT_P (y1))
5f59c49b 1830 return memrefs_conflict_p (xsize, x0, ysize, y0,
1831 c - INTVAL (x1) + INTVAL (y1));
1832 else
1833 return memrefs_conflict_p (xsize, x0, ysize, y,
1834 c - INTVAL (x1));
1835 }
971ba038 1836 else if (CONST_INT_P (y1))
ea0cb7ae 1837 return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
1838
35d3eedd 1839 return 1;
ea0cb7ae 1840 }
971ba038 1841 else if (CONST_INT_P (x1))
ea0cb7ae 1842 return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
1843 }
1844 else if (GET_CODE (y) == PLUS)
1845 {
1846 /* The fact that Y is canonicalized means that this
1847 PLUS rtx is canonicalized. */
1848 rtx y0 = XEXP (y, 0);
1849 rtx y1 = XEXP (y, 1);
1850
971ba038 1851 if (CONST_INT_P (y1))
ea0cb7ae 1852 return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
1853 else
1854 return 1;
1855 }
1856
1857 if (GET_CODE (x) == GET_CODE (y))
1858 switch (GET_CODE (x))
1859 {
1860 case MULT:
1861 {
1862 /* Handle cases where we expect the second operands to be the
1863 same, and check only whether the first operand would conflict
1864 or not. */
1865 rtx x0, y0;
1866 rtx x1 = canon_rtx (XEXP (x, 1));
1867 rtx y1 = canon_rtx (XEXP (y, 1));
1868 if (! rtx_equal_for_memref_p (x1, y1))
1869 return 1;
1870 x0 = canon_rtx (XEXP (x, 0));
1871 y0 = canon_rtx (XEXP (y, 0));
1872 if (rtx_equal_for_memref_p (x0, y0))
1873 return (xsize == 0 || ysize == 0
1874 || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
1875
1876 /* Can't properly adjust our sizes. */
971ba038 1877 if (!CONST_INT_P (x1))
ea0cb7ae 1878 return 1;
1879 xsize /= INTVAL (x1);
1880 ysize /= INTVAL (x1);
1881 c /= INTVAL (x1);
1882 return memrefs_conflict_p (xsize, x0, ysize, y0, c);
1883 }
99c14947 1884
1885 default:
1886 break;
ea0cb7ae 1887 }
1888
1889 /* Treat an access through an AND (e.g. a subword access on an Alpha)
9342ee68 1890 as an access with indeterminate size. Assume that references
9fb1c31b 1891 besides AND are aligned, so if the size of the other reference is
1892 at least as large as the alignment, assume no other overlap. */
971ba038 1893 if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1)))
9fb1c31b 1894 {
bcdb334e 1895 if (GET_CODE (y) == AND || ysize < -INTVAL (XEXP (x, 1)))
9fb1c31b 1896 xsize = -1;
6285298a 1897 return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)), ysize, y, c);
9fb1c31b 1898 }
971ba038 1899 if (GET_CODE (y) == AND && CONST_INT_P (XEXP (y, 1)))
1e38bf49 1900 {
9fb1c31b 1901 /* ??? If we are indexing far enough into the array/structure, we
9342ee68 1902 may yet be able to determine that we can not overlap. But we
1e38bf49 1903 also need to that we are far enough from the end not to overlap
9fb1c31b 1904 a following reference, so we do nothing with that for now. */
bcdb334e 1905 if (GET_CODE (x) == AND || xsize < -INTVAL (XEXP (y, 1)))
9fb1c31b 1906 ysize = -1;
6285298a 1907 return memrefs_conflict_p (xsize, x, ysize, canon_rtx (XEXP (y, 0)), c);
1e38bf49 1908 }
ea0cb7ae 1909
1910 if (CONSTANT_P (x))
1911 {
971ba038 1912 if (CONST_INT_P (x) && CONST_INT_P (y))
ea0cb7ae 1913 {
1914 c += (INTVAL (y) - INTVAL (x));
1e38bf49 1915 return (xsize <= 0 || ysize <= 0
ea0cb7ae 1916 || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
1917 }
1918
1919 if (GET_CODE (x) == CONST)
1920 {
1921 if (GET_CODE (y) == CONST)
1922 return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
1923 ysize, canon_rtx (XEXP (y, 0)), c);
1924 else
1925 return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
1926 ysize, y, c);
1927 }
1928 if (GET_CODE (y) == CONST)
1929 return memrefs_conflict_p (xsize, x, ysize,
1930 canon_rtx (XEXP (y, 0)), c);
1931
1932 if (CONSTANT_P (y))
15750b1e 1933 return (xsize <= 0 || ysize <= 0
1e38bf49 1934 || (rtx_equal_for_memref_p (x, y)
15750b1e 1935 && ((c >= 0 && xsize > c) || (c < 0 && ysize+c > 0))));
ea0cb7ae 1936
1937 return 1;
1938 }
1939 return 1;
1940}
1941
1942/* Functions to compute memory dependencies.
1943
1944 Since we process the insns in execution order, we can build tables
1945 to keep track of what registers are fixed (and not aliased), what registers
1946 are varying in known ways, and what registers are varying in unknown
1947 ways.
1948
1949 If both memory references are volatile, then there must always be a
1950 dependence between the two references, since their order can not be
1951 changed. A volatile and non-volatile reference can be interchanged
9342ee68 1952 though.
ea0cb7ae 1953
71d9e995 1954 A MEM_IN_STRUCT reference at a non-AND varying address can never
1955 conflict with a non-MEM_IN_STRUCT reference at a fixed address. We
1956 also must allow AND addresses, because they may generate accesses
1957 outside the object being referenced. This is used to generate
1958 aligned addresses from unaligned addresses, for instance, the alpha
1959 storeqi_unaligned pattern. */
ea0cb7ae 1960
1961/* Read dependence: X is read after read in MEM takes place. There can
1962 only be a dependence here if both reads are volatile. */
1963
1964int
52d07779 1965read_dependence (const_rtx mem, const_rtx x)
ea0cb7ae 1966{
1967 return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
1968}
1969
6a0934dd 1970/* Returns MEM1 if and only if MEM1 is a scalar at a fixed address and
1971 MEM2 is a reference to a structure at a varying address, or returns
1972 MEM2 if vice versa. Otherwise, returns NULL_RTX. If a non-NULL
1973 value is returned MEM1 and MEM2 can never alias. VARIES_P is used
1974 to decide whether or not an address may vary; it should return
1617c276 1975 nonzero whenever variation is possible.
1976 MEM1_ADDR and MEM2_ADDR are the addresses of MEM1 and MEM2. */
9342ee68 1977
52d07779 1978static const_rtx
1979fixed_scalar_and_varying_struct_p (const_rtx mem1, const_rtx mem2, rtx mem1_addr,
aecda0d6 1980 rtx mem2_addr,
52d07779 1981 bool (*varies_p) (const_rtx, bool))
9342ee68 1982{
c7f6877a 1983 if (! flag_strict_aliasing)
1984 return NULL_RTX;
1985
91605b2e 1986 if (MEM_ALIAS_SET (mem2)
1987 && MEM_SCALAR_P (mem1) && MEM_IN_STRUCT_P (mem2)
ea087693 1988 && !varies_p (mem1_addr, 1) && varies_p (mem2_addr, 1))
6a0934dd 1989 /* MEM1 is a scalar at a fixed address; MEM2 is a struct at a
1990 varying address. */
1991 return mem1;
1992
91605b2e 1993 if (MEM_ALIAS_SET (mem1)
1994 && MEM_IN_STRUCT_P (mem1) && MEM_SCALAR_P (mem2)
ea087693 1995 && varies_p (mem1_addr, 1) && !varies_p (mem2_addr, 1))
6a0934dd 1996 /* MEM2 is a scalar at a fixed address; MEM1 is a struct at a
1997 varying address. */
1998 return mem2;
1999
2000 return NULL_RTX;
2001}
2002
2003/* Returns nonzero if something about the mode or address format MEM1
2004 indicates that it might well alias *anything*. */
2005
fe69e4fe 2006static int
52d07779 2007aliases_everything_p (const_rtx mem)
6a0934dd 2008{
6a0934dd 2009 if (GET_CODE (XEXP (mem, 0)) == AND)
0975351b 2010 /* If the address is an AND, it's very hard to know at what it is
6a0934dd 2011 actually pointing. */
2012 return 1;
9342ee68 2013
6a0934dd 2014 return 0;
2015}
2016
b10dbbca 2017/* Return true if we can determine that the fields referenced cannot
2018 overlap for any pair of objects. */
2019
2020static bool
52d07779 2021nonoverlapping_component_refs_p (const_tree x, const_tree y)
b10dbbca 2022{
52d07779 2023 const_tree fieldx, fieldy, typex, typey, orig_y;
b10dbbca 2024
b95fdaae 2025 if (!flag_strict_aliasing)
2026 return false;
2027
b10dbbca 2028 do
2029 {
2030 /* The comparison has to be done at a common type, since we don't
cb0ccc1e 2031 know how the inheritance hierarchy works. */
b10dbbca 2032 orig_y = y;
2033 do
2034 {
2035 fieldx = TREE_OPERAND (x, 1);
a769a0a7 2036 typex = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldx));
b10dbbca 2037
2038 y = orig_y;
2039 do
2040 {
2041 fieldy = TREE_OPERAND (y, 1);
a769a0a7 2042 typey = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldy));
b10dbbca 2043
2044 if (typex == typey)
2045 goto found;
2046
2047 y = TREE_OPERAND (y, 0);
2048 }
2049 while (y && TREE_CODE (y) == COMPONENT_REF);
2050
2051 x = TREE_OPERAND (x, 0);
2052 }
2053 while (x && TREE_CODE (x) == COMPONENT_REF);
b10dbbca 2054 /* Never found a common type. */
a769a0a7 2055 return false;
b10dbbca 2056
2057 found:
2058 /* If we're left with accessing different fields of a structure,
2059 then no overlap. */
2060 if (TREE_CODE (typex) == RECORD_TYPE
2061 && fieldx != fieldy)
2062 return true;
2063
2064 /* The comparison on the current field failed. If we're accessing
2065 a very nested structure, look at the next outer level. */
2066 x = TREE_OPERAND (x, 0);
2067 y = TREE_OPERAND (y, 0);
2068 }
2069 while (x && y
2070 && TREE_CODE (x) == COMPONENT_REF
2071 && TREE_CODE (y) == COMPONENT_REF);
9342ee68 2072
b10dbbca 2073 return false;
2074}
2075
2076/* Look at the bottom of the COMPONENT_REF list for a DECL, and return it. */
2077
2078static tree
aecda0d6 2079decl_for_component_ref (tree x)
b10dbbca 2080{
2081 do
2082 {
2083 x = TREE_OPERAND (x, 0);
2084 }
2085 while (x && TREE_CODE (x) == COMPONENT_REF);
2086
2087 return x && DECL_P (x) ? x : NULL_TREE;
2088}
2089
2090/* Walk up the COMPONENT_REF list and adjust OFFSET to compensate for the
2091 offset of the field reference. */
2092
2093static rtx
aecda0d6 2094adjust_offset_for_component_ref (tree x, rtx offset)
b10dbbca 2095{
2096 HOST_WIDE_INT ioffset;
2097
2098 if (! offset)
2099 return NULL_RTX;
2100
2101 ioffset = INTVAL (offset);
9342ee68 2102 do
b10dbbca 2103 {
6374121b 2104 tree offset = component_ref_field_offset (x);
b10dbbca 2105 tree field = TREE_OPERAND (x, 1);
2106
6374121b 2107 if (! host_integerp (offset, 1))
b10dbbca 2108 return NULL_RTX;
6374121b 2109 ioffset += (tree_low_cst (offset, 1)
b10dbbca 2110 + (tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
2111 / BITS_PER_UNIT));
2112
2113 x = TREE_OPERAND (x, 0);
2114 }
2115 while (x && TREE_CODE (x) == COMPONENT_REF);
2116
2117 return GEN_INT (ioffset);
2118}
2119
d716ce75 2120/* Return nonzero if we can determine the exprs corresponding to memrefs
ddb3d16f 2121 X and Y and they do not overlap. */
2122
5fe61d21 2123int
52d07779 2124nonoverlapping_memrefs_p (const_rtx x, const_rtx y)
ddb3d16f 2125{
b10dbbca 2126 tree exprx = MEM_EXPR (x), expry = MEM_EXPR (y);
ddb3d16f 2127 rtx rtlx, rtly;
2128 rtx basex, basey;
b10dbbca 2129 rtx moffsetx, moffsety;
ddb3d16f 2130 HOST_WIDE_INT offsetx = 0, offsety = 0, sizex, sizey, tem;
2131
b10dbbca 2132 /* Unless both have exprs, we can't tell anything. */
2133 if (exprx == 0 || expry == 0)
2134 return 0;
a0c938f0 2135
b10dbbca 2136 /* If both are field references, we may be able to determine something. */
2137 if (TREE_CODE (exprx) == COMPONENT_REF
2138 && TREE_CODE (expry) == COMPONENT_REF
2139 && nonoverlapping_component_refs_p (exprx, expry))
2140 return 1;
2141
a0c938f0 2142
b10dbbca 2143 /* If the field reference test failed, look at the DECLs involved. */
2144 moffsetx = MEM_OFFSET (x);
2145 if (TREE_CODE (exprx) == COMPONENT_REF)
2146 {
f7d118a9 2147 if (TREE_CODE (expry) == VAR_DECL
2148 && POINTER_TYPE_P (TREE_TYPE (expry)))
2149 {
2150 tree field = TREE_OPERAND (exprx, 1);
2151 tree fieldcontext = DECL_FIELD_CONTEXT (field);
2152 if (ipa_type_escape_field_does_not_clobber_p (fieldcontext,
2153 TREE_TYPE (field)))
a0c938f0 2154 return 1;
f7d118a9 2155 }
2156 {
2157 tree t = decl_for_component_ref (exprx);
2158 if (! t)
2159 return 0;
2160 moffsetx = adjust_offset_for_component_ref (exprx, moffsetx);
2161 exprx = t;
2162 }
b10dbbca 2163 }
2a448a75 2164 else if (INDIRECT_REF_P (exprx))
2d8fe5d0 2165 {
2166 exprx = TREE_OPERAND (exprx, 0);
2167 if (flag_argument_noalias < 2
2168 || TREE_CODE (exprx) != PARM_DECL)
2169 return 0;
2170 }
2171
b10dbbca 2172 moffsety = MEM_OFFSET (y);
2173 if (TREE_CODE (expry) == COMPONENT_REF)
2174 {
f7d118a9 2175 if (TREE_CODE (exprx) == VAR_DECL
2176 && POINTER_TYPE_P (TREE_TYPE (exprx)))
2177 {
2178 tree field = TREE_OPERAND (expry, 1);
2179 tree fieldcontext = DECL_FIELD_CONTEXT (field);
2180 if (ipa_type_escape_field_does_not_clobber_p (fieldcontext,
2181 TREE_TYPE (field)))
a0c938f0 2182 return 1;
f7d118a9 2183 }
2184 {
2185 tree t = decl_for_component_ref (expry);
2186 if (! t)
2187 return 0;
2188 moffsety = adjust_offset_for_component_ref (expry, moffsety);
2189 expry = t;
2190 }
b10dbbca 2191 }
2a448a75 2192 else if (INDIRECT_REF_P (expry))
2d8fe5d0 2193 {
2194 expry = TREE_OPERAND (expry, 0);
2195 if (flag_argument_noalias < 2
2196 || TREE_CODE (expry) != PARM_DECL)
2197 return 0;
2198 }
b10dbbca 2199
2200 if (! DECL_P (exprx) || ! DECL_P (expry))
ddb3d16f 2201 return 0;
2202
119147d1 2203 /* With invalid code we can end up storing into the constant pool.
2204 Bail out to avoid ICEing when creating RTL for this.
2205 See gfortran.dg/lto/20091028-2_0.f90. */
2206 if (TREE_CODE (exprx) == CONST_DECL
2207 || TREE_CODE (expry) == CONST_DECL)
2208 return 1;
2209
b10dbbca 2210 rtlx = DECL_RTL (exprx);
2211 rtly = DECL_RTL (expry);
ddb3d16f 2212
10e949c1 2213 /* If either RTL is not a MEM, it must be a REG or CONCAT, meaning they
2214 can't overlap unless they are the same because we never reuse that part
2215 of the stack frame used for locals for spilled pseudos. */
e16ceb8e 2216 if ((!MEM_P (rtlx) || !MEM_P (rtly))
10e949c1 2217 && ! rtx_equal_p (rtlx, rtly))
ddb3d16f 2218 return 1;
2219
bd1a81f7 2220 /* If we have MEMs refering to different address spaces (which can
2221 potentially overlap), we cannot easily tell from the addresses
2222 whether the references overlap. */
2223 if (MEM_P (rtlx) && MEM_P (rtly)
2224 && MEM_ADDR_SPACE (rtlx) != MEM_ADDR_SPACE (rtly))
2225 return 0;
2226
ddb3d16f 2227 /* Get the base and offsets of both decls. If either is a register, we
2228 know both are and are the same, so use that as the base. The only
2229 we can avoid overlap is if we can deduce that they are nonoverlapping
2230 pieces of that decl, which is very rare. */
e16ceb8e 2231 basex = MEM_P (rtlx) ? XEXP (rtlx, 0) : rtlx;
971ba038 2232 if (GET_CODE (basex) == PLUS && CONST_INT_P (XEXP (basex, 1)))
ddb3d16f 2233 offsetx = INTVAL (XEXP (basex, 1)), basex = XEXP (basex, 0);
2234
e16ceb8e 2235 basey = MEM_P (rtly) ? XEXP (rtly, 0) : rtly;
971ba038 2236 if (GET_CODE (basey) == PLUS && CONST_INT_P (XEXP (basey, 1)))
ddb3d16f 2237 offsety = INTVAL (XEXP (basey, 1)), basey = XEXP (basey, 0);
2238
c9c48480 2239 /* If the bases are different, we know they do not overlap if both
9342ee68 2240 are constants or if one is a constant and the other a pointer into the
c9c48480 2241 stack frame. Otherwise a different base means we can't tell if they
2242 overlap or not. */
2243 if (! rtx_equal_p (basex, basey))
9342ee68 2244 return ((CONSTANT_P (basex) && CONSTANT_P (basey))
2245 || (CONSTANT_P (basex) && REG_P (basey)
2246 && REGNO_PTR_FRAME_P (REGNO (basey)))
2247 || (CONSTANT_P (basey) && REG_P (basex)
2248 && REGNO_PTR_FRAME_P (REGNO (basex))));
ddb3d16f 2249
e16ceb8e 2250 sizex = (!MEM_P (rtlx) ? (int) GET_MODE_SIZE (GET_MODE (rtlx))
ddb3d16f 2251 : MEM_SIZE (rtlx) ? INTVAL (MEM_SIZE (rtlx))
2252 : -1);
e16ceb8e 2253 sizey = (!MEM_P (rtly) ? (int) GET_MODE_SIZE (GET_MODE (rtly))
ddb3d16f 2254 : MEM_SIZE (rtly) ? INTVAL (MEM_SIZE (rtly)) :
2255 -1);
2256
dc2dfdb6 2257 /* If we have an offset for either memref, it can update the values computed
2258 above. */
b10dbbca 2259 if (moffsetx)
2260 offsetx += INTVAL (moffsetx), sizex -= INTVAL (moffsetx);
2261 if (moffsety)
2262 offsety += INTVAL (moffsety), sizey -= INTVAL (moffsety);
ddb3d16f 2263
dc2dfdb6 2264 /* If a memref has both a size and an offset, we can use the smaller size.
203c9fee 2265 We can't do this if the offset isn't known because we must view this
dc2dfdb6 2266 memref as being anywhere inside the DECL's MEM. */
b10dbbca 2267 if (MEM_SIZE (x) && moffsetx)
ddb3d16f 2268 sizex = INTVAL (MEM_SIZE (x));
b10dbbca 2269 if (MEM_SIZE (y) && moffsety)
ddb3d16f 2270 sizey = INTVAL (MEM_SIZE (y));
2271
2272 /* Put the values of the memref with the lower offset in X's values. */
2273 if (offsetx > offsety)
2274 {
2275 tem = offsetx, offsetx = offsety, offsety = tem;
2276 tem = sizex, sizex = sizey, sizey = tem;
2277 }
2278
2279 /* If we don't know the size of the lower-offset value, we can't tell
2280 if they conflict. Otherwise, we do the test. */
906923ba 2281 return sizex >= 0 && offsety >= offsetx + sizex;
ddb3d16f 2282}
2283
ea0cb7ae 2284/* True dependence: X is read after store in MEM takes place. */
2285
2286int
52d07779 2287true_dependence (const_rtx mem, enum machine_mode mem_mode, const_rtx x,
2288 bool (*varies) (const_rtx, bool))
ea0cb7ae 2289{
19cb6b50 2290 rtx x_addr, mem_addr;
9ee7cac5 2291 rtx base;
ea0cb7ae 2292
2293 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
2294 return 1;
2295
a57f4c4d 2296 /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
67837170 2297 This is used in epilogue deallocation functions, and in cselib. */
a57f4c4d 2298 if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
2299 return 1;
2300 if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
2301 return 1;
c94cfd1c 2302 if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
2303 || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
2304 return 1;
a57f4c4d 2305
b5ba9f3a 2306 if (DIFFERENT_ALIAS_SETS_P (x, mem))
2307 return 0;
2308
b04fab2a 2309 /* Read-only memory is by definition never modified, and therefore can't
2310 conflict with anything. We don't expect to find read-only set on MEM,
a53ff4c1 2311 but stupid user tricks can produce them, so don't die. */
b04fab2a 2312 if (MEM_READONLY_P (x))
ea0cb7ae 2313 return 0;
2314
ddb3d16f 2315 if (nonoverlapping_memrefs_p (mem, x))
2316 return 0;
2317
bd1a81f7 2318 /* If we have MEMs refering to different address spaces (which can
2319 potentially overlap), we cannot easily tell from the addresses
2320 whether the references overlap. */
2321 if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
2322 return 1;
2323
9fb1c31b 2324 if (mem_mode == VOIDmode)
2325 mem_mode = GET_MODE (mem);
2326
1617c276 2327 x_addr = get_addr (XEXP (x, 0));
2328 mem_addr = get_addr (XEXP (mem, 0));
2329
002fe3cb 2330 base = find_base_term (x_addr);
2331 if (base && (GET_CODE (base) == LABEL_REF
2332 || (GET_CODE (base) == SYMBOL_REF
2333 && CONSTANT_POOL_ADDRESS_P (base))))
2334 return 0;
2335
1617c276 2336 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
3ad3a0ed 2337 return 0;
2338
1617c276 2339 x_addr = canon_rtx (x_addr);
2340 mem_addr = canon_rtx (mem_addr);
35d3eedd 2341
4958fe6e 2342 if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
2343 SIZE_FOR_MODE (x), x_addr, 0))
2344 return 0;
2345
6a0934dd 2346 if (aliases_everything_p (x))
4958fe6e 2347 return 1;
2348
35a3065a 2349 /* We cannot use aliases_everything_p to test MEM, since we must look
6a0934dd 2350 at MEM_MODE, rather than GET_MODE (MEM). */
2351 if (mem_mode == QImode || GET_CODE (mem_addr) == AND)
8e802be9 2352 return 1;
2353
2354 /* In true_dependence we also allow BLKmode to alias anything. Why
2355 don't we do this in anti_dependence and output_dependence? */
2356 if (mem_mode == BLKmode || GET_MODE (x) == BLKmode)
2357 return 1;
2358
3a443843 2359 if (fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr, varies))
2360 return 0;
2361
2362 return rtx_refs_may_alias_p (x, mem, true);
8e802be9 2363}
2364
2365/* Canonical true dependence: X is read after store in MEM takes place.
9342ee68 2366 Variant of true_dependence which assumes MEM has already been
2367 canonicalized (hence we no longer do that here).
2368 The mem_addr argument has been added, since true_dependence computed
82d2c88b 2369 this value prior to canonicalizing.
2370 If x_addr is non-NULL, it is used in preference of XEXP (x, 0). */
8e802be9 2371
2372int
52d07779 2373canon_true_dependence (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr,
82d2c88b 2374 const_rtx x, rtx x_addr, bool (*varies) (const_rtx, bool))
8e802be9 2375{
8e802be9 2376 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
2377 return 1;
2378
d7b592b0 2379 /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
2380 This is used in epilogue deallocation functions. */
2381 if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
2382 return 1;
2383 if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
2384 return 1;
c94cfd1c 2385 if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
2386 || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
2387 return 1;
d7b592b0 2388
8e802be9 2389 if (DIFFERENT_ALIAS_SETS_P (x, mem))
2390 return 0;
2391
b04fab2a 2392 /* Read-only memory is by definition never modified, and therefore can't
2393 conflict with anything. We don't expect to find read-only set on MEM,
a53ff4c1 2394 but stupid user tricks can produce them, so don't die. */
b04fab2a 2395 if (MEM_READONLY_P (x))
8e802be9 2396 return 0;
2397
ddb3d16f 2398 if (nonoverlapping_memrefs_p (x, mem))
2399 return 0;
2400
bd1a81f7 2401 /* If we have MEMs refering to different address spaces (which can
2402 potentially overlap), we cannot easily tell from the addresses
2403 whether the references overlap. */
2404 if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
2405 return 1;
2406
82d2c88b 2407 if (! x_addr)
2408 x_addr = get_addr (XEXP (x, 0));
8e802be9 2409
2410 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
2411 return 0;
2412
2413 x_addr = canon_rtx (x_addr);
2414 if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
2415 SIZE_FOR_MODE (x), x_addr, 0))
2416 return 0;
2417
2418 if (aliases_everything_p (x))
2419 return 1;
2420
35a3065a 2421 /* We cannot use aliases_everything_p to test MEM, since we must look
8e802be9 2422 at MEM_MODE, rather than GET_MODE (MEM). */
2423 if (mem_mode == QImode || GET_CODE (mem_addr) == AND)
6a0934dd 2424 return 1;
4958fe6e 2425
6a0934dd 2426 /* In true_dependence we also allow BLKmode to alias anything. Why
2427 don't we do this in anti_dependence and output_dependence? */
2428 if (mem_mode == BLKmode || GET_MODE (x) == BLKmode)
2429 return 1;
4958fe6e 2430
3a443843 2431 if (fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr, varies))
2432 return 0;
2433
2434 return rtx_refs_may_alias_p (x, mem, true);
ea0cb7ae 2435}
2436
d10cfa8d 2437/* Returns nonzero if a write to X might alias a previous read from
b04fab2a 2438 (or, if WRITEP is nonzero, a write to) MEM. */
ea0cb7ae 2439
fe69e4fe 2440static int
52d07779 2441write_dependence_p (const_rtx mem, const_rtx x, int writep)
ea0cb7ae 2442{
35d3eedd 2443 rtx x_addr, mem_addr;
52d07779 2444 const_rtx fixed_scalar;
9ee7cac5 2445 rtx base;
35d3eedd 2446
ea0cb7ae 2447 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
2448 return 1;
2449
a57f4c4d 2450 /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
2451 This is used in epilogue deallocation functions. */
2452 if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
2453 return 1;
2454 if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
2455 return 1;
c94cfd1c 2456 if (MEM_ALIAS_SET (x) == ALIAS_SET_MEMORY_BARRIER
2457 || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
2458 return 1;
a57f4c4d 2459
b04fab2a 2460 /* A read from read-only memory can't conflict with read-write memory. */
2461 if (!writep && MEM_READONLY_P (mem))
2462 return 0;
002fe3cb 2463
ddb3d16f 2464 if (nonoverlapping_memrefs_p (x, mem))
2465 return 0;
2466
bd1a81f7 2467 /* If we have MEMs refering to different address spaces (which can
2468 potentially overlap), we cannot easily tell from the addresses
2469 whether the references overlap. */
2470 if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
2471 return 1;
2472
002fe3cb 2473 x_addr = get_addr (XEXP (x, 0));
2474 mem_addr = get_addr (XEXP (mem, 0));
2475
9ee7cac5 2476 if (! writep)
2477 {
002fe3cb 2478 base = find_base_term (mem_addr);
9ee7cac5 2479 if (base && (GET_CODE (base) == LABEL_REF
2480 || (GET_CODE (base) == SYMBOL_REF
2481 && CONSTANT_POOL_ADDRESS_P (base))))
2482 return 0;
2483 }
2484
1617c276 2485 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x),
2486 GET_MODE (mem)))
b5ba9f3a 2487 return 0;
2488
1617c276 2489 x_addr = canon_rtx (x_addr);
2490 mem_addr = canon_rtx (mem_addr);
35d3eedd 2491
6a0934dd 2492 if (!memrefs_conflict_p (SIZE_FOR_MODE (mem), mem_addr,
2493 SIZE_FOR_MODE (x), x_addr, 0))
2494 return 0;
2495
9342ee68 2496 fixed_scalar
1617c276 2497 = fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr,
2498 rtx_addr_varies_p);
2499
3a443843 2500 if ((fixed_scalar == mem && !aliases_everything_p (x))
2501 || (fixed_scalar == x && !aliases_everything_p (mem)))
2502 return 0;
2503
2504 return rtx_refs_may_alias_p (x, mem, false);
6a0934dd 2505}
2506
2507/* Anti dependence: X is written after read in MEM takes place. */
2508
2509int
52d07779 2510anti_dependence (const_rtx mem, const_rtx x)
6a0934dd 2511{
b04fab2a 2512 return write_dependence_p (mem, x, /*writep=*/0);
ea0cb7ae 2513}
2514
2515/* Output dependence: X is written after store in MEM takes place. */
2516
2517int
52d07779 2518output_dependence (const_rtx mem, const_rtx x)
ea0cb7ae 2519{
b04fab2a 2520 return write_dependence_p (mem, x, /*writep=*/1);
ea0cb7ae 2521}
c352cbc7 2522\f
35d3eedd 2523
35d3eedd 2524void
6d8b68a3 2525init_alias_target (void)
35d3eedd 2526{
19cb6b50 2527 int i;
35d3eedd 2528
6d8b68a3 2529 memset (static_reg_base_value, 0, sizeof static_reg_base_value);
2530
35d3eedd 2531 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2532 /* Check whether this register can hold an incoming pointer
2533 argument. FUNCTION_ARG_REGNO_P tests outgoing register
2c0e001b 2534 numbers, so translate if necessary due to register windows. */
35d3eedd 2535 if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i))
2536 && HARD_REGNO_MODE_OK (i, Pmode))
0c7f5242 2537 static_reg_base_value[i]
2538 = gen_rtx_ADDRESS (VOIDmode, gen_rtx_REG (Pmode, i));
2539
0c7f5242 2540 static_reg_base_value[STACK_POINTER_REGNUM]
2541 = gen_rtx_ADDRESS (Pmode, stack_pointer_rtx);
2542 static_reg_base_value[ARG_POINTER_REGNUM]
2543 = gen_rtx_ADDRESS (Pmode, arg_pointer_rtx);
2544 static_reg_base_value[FRAME_POINTER_REGNUM]
2545 = gen_rtx_ADDRESS (Pmode, frame_pointer_rtx);
2546#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
2547 static_reg_base_value[HARD_FRAME_POINTER_REGNUM]
2548 = gen_rtx_ADDRESS (Pmode, hard_frame_pointer_rtx);
2549#endif
2550}
2551
c7bf7428 2552/* Set MEMORY_MODIFIED when X modifies DATA (that is assumed
2553 to be memory reference. */
2554static bool memory_modified;
2555static void
a80f1c6c 2556memory_modified_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
c7bf7428 2557{
e16ceb8e 2558 if (MEM_P (x))
c7bf7428 2559 {
5493cb9a 2560 if (anti_dependence (x, (const_rtx)data) || output_dependence (x, (const_rtx)data))
c7bf7428 2561 memory_modified = true;
2562 }
2563}
2564
2565
2566/* Return true when INSN possibly modify memory contents of MEM
0c6d8c36 2567 (i.e. address can be modified). */
c7bf7428 2568bool
5493cb9a 2569memory_modified_in_insn_p (const_rtx mem, const_rtx insn)
c7bf7428 2570{
2571 if (!INSN_P (insn))
2572 return false;
2573 memory_modified = false;
a80f1c6c 2574 note_stores (PATTERN (insn), memory_modified_1, CONST_CAST_RTX(mem));
c7bf7428 2575 return memory_modified;
2576}
2577
73f5c1e3 2578/* Initialize the aliasing machinery. Initialize the REG_KNOWN_VALUE
2579 array. */
2580
ea0cb7ae 2581void
aecda0d6 2582init_alias_analysis (void)
ea0cb7ae 2583{
e5b19a8c 2584 unsigned int maxreg = max_reg_num ();
37b864db 2585 int changed, pass;
19cb6b50 2586 int i;
2587 unsigned int ui;
2588 rtx insn;
ea0cb7ae 2589
376c21d1 2590 timevar_push (TV_ALIAS_ANALYSIS);
2591
12cb06ad 2592 reg_known_value_size = maxreg - FIRST_PSEUDO_REGISTER;
364c0c59 2593 reg_known_value = GGC_CNEWVEC (rtx, reg_known_value_size);
2594 reg_known_equiv_p = XCNEWVEC (bool, reg_known_value_size);
ea0cb7ae 2595
980f3285 2596 /* If we have memory allocated from the previous run, use it. */
e5b19a8c 2597 if (old_reg_base_value)
980f3285 2598 reg_base_value = old_reg_base_value;
2599
2600 if (reg_base_value)
2601 VEC_truncate (rtx, reg_base_value, 0);
2602
e85c2c2d 2603 VEC_safe_grow_cleared (rtx, gc, reg_base_value, maxreg);
c2e94b25 2604
4c36ffe6 2605 new_reg_base_value = XNEWVEC (rtx, maxreg);
2606 reg_seen = XNEWVEC (char, maxreg);
06c5c535 2607
2608 /* The basic idea is that each pass through this loop will use the
2609 "constant" information from the previous pass to propagate alias
2610 information through another level of assignments.
2611
2612 This could get expensive if the assignment chains are long. Maybe
2613 we should throttle the number of iterations, possibly based on
35d3eedd 2614 the optimization level or flag_expensive_optimizations.
06c5c535 2615
2616 We could propagate more information in the first pass by making use
3072d30e 2617 of DF_REG_DEF_COUNT to determine immediately that the alias information
37b864db 2618 for a pseudo is "constant".
2619
2620 A program with an uninitialized variable can cause an infinite loop
2621 here. Instead of doing a full dataflow analysis to detect such problems
2622 we just cap the number of iterations for the loop.
2623
2624 The state of the arrays for the set chain in question does not matter
2625 since the program has undefined behavior. */
35d3eedd 2626
37b864db 2627 pass = 0;
35d3eedd 2628 do
06c5c535 2629 {
2630 /* Assume nothing will change this iteration of the loop. */
2631 changed = 0;
2632
06c5c535 2633 /* We want to assign the same IDs each iteration of this loop, so
2634 start counting from zero each iteration of the loop. */
2635 unique_id = 0;
2636
35a3065a 2637 /* We're at the start of the function each iteration through the
06c5c535 2638 loop, so we're copying arguments. */
e5be0cc6 2639 copying_arguments = true;
ea0cb7ae 2640
35d3eedd 2641 /* Wipe the potential alias information clean for this pass. */
e5b19a8c 2642 memset (new_reg_base_value, 0, maxreg * sizeof (rtx));
f0ad0992 2643
35d3eedd 2644 /* Wipe the reg_seen array clean. */
e5b19a8c 2645 memset (reg_seen, 0, maxreg);
ea0cb7ae 2646
35d3eedd 2647 /* Mark all hard registers which may contain an address.
2648 The stack, frame and argument pointers may contain an address.
2649 An argument register which can hold a Pmode value may contain
2650 an address even if it is not in BASE_REGS.
f0ad0992 2651
35d3eedd 2652 The address expression is VOIDmode for an argument and
2653 Pmode for other registers. */
2654
e26fd9bc 2655 memcpy (new_reg_base_value, static_reg_base_value,
2656 FIRST_PSEUDO_REGISTER * sizeof (rtx));
35d3eedd 2657
06c5c535 2658 /* Walk the insns adding values to the new_reg_base_value array. */
2659 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
ea0cb7ae 2660 {
9204e736 2661 if (INSN_P (insn))
06c5c535 2662 {
35d3eedd 2663 rtx note, set;
d6cb6164 2664
2665#if defined (HAVE_prologue) || defined (HAVE_epilogue)
35a3065a 2666 /* The prologue/epilogue insns are not threaded onto the
fd037eda 2667 insn chain until after reload has completed. Thus,
2668 there is no sense wasting time checking if INSN is in
2669 the prologue/epilogue until after reload has completed. */
2670 if (reload_completed
2671 && prologue_epilogue_contains (insn))
d6cb6164 2672 continue;
2673#endif
2674
06c5c535 2675 /* If this insn has a noalias note, process it, Otherwise,
a0c938f0 2676 scan for sets. A simple set will have no side effects
2677 which could change the base value of any other register. */
35d3eedd 2678
06c5c535 2679 if (GET_CODE (PATTERN (insn)) == SET
d6cb6164 2680 && REG_NOTES (insn) != 0
2681 && find_reg_note (insn, REG_NOALIAS, NULL_RTX))
ec8895d7 2682 record_set (SET_DEST (PATTERN (insn)), NULL_RTX, NULL);
06c5c535 2683 else
ec8895d7 2684 note_stores (PATTERN (insn), record_set, NULL);
35d3eedd 2685
2686 set = single_set (insn);
2687
2688 if (set != 0
8ad4c111 2689 && REG_P (SET_DEST (set))
9db10305 2690 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
35d3eedd 2691 {
9db10305 2692 unsigned int regno = REGNO (SET_DEST (set));
970c0c06 2693 rtx src = SET_SRC (set);
12cb06ad 2694 rtx t;
970c0c06 2695
750a330e 2696 note = find_reg_equal_equiv_note (insn);
2697 if (note && REG_NOTE_KIND (note) == REG_EQUAL
3072d30e 2698 && DF_REG_DEF_COUNT (regno) != 1)
750a330e 2699 note = NULL_RTX;
2700
2701 if (note != NULL_RTX
970c0c06 2702 && GET_CODE (XEXP (note, 0)) != EXPR_LIST
97fb4325 2703 && ! rtx_varies_p (XEXP (note, 0), 1)
12cb06ad 2704 && ! reg_overlap_mentioned_p (SET_DEST (set),
2705 XEXP (note, 0)))
970c0c06 2706 {
12cb06ad 2707 set_reg_known_value (regno, XEXP (note, 0));
2708 set_reg_known_equiv_p (regno,
2709 REG_NOTE_KIND (note) == REG_EQUIV);
970c0c06 2710 }
3072d30e 2711 else if (DF_REG_DEF_COUNT (regno) == 1
970c0c06 2712 && GET_CODE (src) == PLUS
8ad4c111 2713 && REG_P (XEXP (src, 0))
12cb06ad 2714 && (t = get_reg_known_value (REGNO (XEXP (src, 0))))
971ba038 2715 && CONST_INT_P (XEXP (src, 1)))
970c0c06 2716 {
12cb06ad 2717 t = plus_constant (t, INTVAL (XEXP (src, 1)));
2718 set_reg_known_value (regno, t);
2719 set_reg_known_equiv_p (regno, 0);
970c0c06 2720 }
3072d30e 2721 else if (DF_REG_DEF_COUNT (regno) == 1
970c0c06 2722 && ! rtx_varies_p (src, 1))
2723 {
12cb06ad 2724 set_reg_known_value (regno, src);
2725 set_reg_known_equiv_p (regno, 0);
970c0c06 2726 }
35d3eedd 2727 }
06c5c535 2728 }
6d7dc5b9 2729 else if (NOTE_P (insn)
ad4583d9 2730 && NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG)
e5be0cc6 2731 copying_arguments = false;
35d3eedd 2732 }
06c5c535 2733
35d3eedd 2734 /* Now propagate values from new_reg_base_value to reg_base_value. */
d4473c84 2735 gcc_assert (maxreg == (unsigned int) max_reg_num ());
a0c938f0 2736
e5b19a8c 2737 for (ui = 0; ui < maxreg; ui++)
35d3eedd 2738 {
274c11d8 2739 if (new_reg_base_value[ui]
980f3285 2740 && new_reg_base_value[ui] != VEC_index (rtx, reg_base_value, ui)
e5b19a8c 2741 && ! rtx_equal_p (new_reg_base_value[ui],
980f3285 2742 VEC_index (rtx, reg_base_value, ui)))
06c5c535 2743 {
980f3285 2744 VEC_replace (rtx, reg_base_value, ui, new_reg_base_value[ui]);
35d3eedd 2745 changed = 1;
06c5c535 2746 }
ea0cb7ae 2747 }
ea0cb7ae 2748 }
35d3eedd 2749 while (changed && ++pass < MAX_ALIAS_LOOP_PASSES);
ea0cb7ae 2750
2751 /* Fill in the remaining entries. */
12cb06ad 2752 for (i = 0; i < (int)reg_known_value_size; i++)
ea0cb7ae 2753 if (reg_known_value[i] == 0)
12cb06ad 2754 reg_known_value[i] = regno_reg_rtx[i + FIRST_PSEUDO_REGISTER];
ea0cb7ae 2755
7098ef4a 2756 /* Clean up. */
2757 free (new_reg_base_value);
06c5c535 2758 new_reg_base_value = 0;
7098ef4a 2759 free (reg_seen);
ea0cb7ae 2760 reg_seen = 0;
376c21d1 2761 timevar_pop (TV_ALIAS_ANALYSIS);
ea0cb7ae 2762}
2763
2764void
aecda0d6 2765end_alias_analysis (void)
ea0cb7ae 2766{
e5b19a8c 2767 old_reg_base_value = reg_base_value;
12cb06ad 2768 ggc_free (reg_known_value);
ea0cb7ae 2769 reg_known_value = 0;
c2e94b25 2770 reg_known_value_size = 0;
12cb06ad 2771 free (reg_known_equiv_p);
7098ef4a 2772 reg_known_equiv_p = 0;
ea0cb7ae 2773}
1f3233d1 2774
2775#include "gt-alias.h"