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