]> gcc.gnu.org Git - gcc.git/blame - gcc/alias.c
sparc.c (function_arg_slotno): Use FLOAT_TYPE_P to detect FP fields in structures.
[gcc.git] / gcc / alias.c
CommitLineData
9ae8ffe7 1/* Alias analysis for GNU C
d9221e01 2 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
1afdf91c 3 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
10Software Foundation; either version 2, or (at your option) any later
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
1322177d
LB
19along with GCC; see the file COPYING. If not, write to the Free
20Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2102111-1307, USA. */
9ae8ffe7
JL
22
23#include "config.h"
670ee920 24#include "system.h"
4977bab6
ZW
25#include "coretypes.h"
26#include "tm.h"
9ae8ffe7 27#include "rtl.h"
7790df19 28#include "tree.h"
6baf1cc8 29#include "tm_p.h"
49ad7cfa 30#include "function.h"
9ae8ffe7
JL
31#include "expr.h"
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"
3932261a
MM
46
47/* The alias sets assigned to MEMs assist the back-end in determining
48 which MEMs can alias which other MEMs. In general, two MEMs in
ac3d9668
RK
49 different alias sets cannot alias each other, with one important
50 exception. Consider something like:
3932261a 51
01d28c3f 52 struct S { int i; double d; };
3932261a
MM
53
54 a store to an `S' can alias something of either type `int' or type
55 `double'. (However, a store to an `int' cannot alias a `double'
56 and vice versa.) We indicate this via a tree structure that looks
57 like:
58 struct S
59 / \
60 / \
61 |/_ _\|
62 int double
63
ac3d9668
RK
64 (The arrows are directed and point downwards.)
65 In this situation we say the alias set for `struct S' is the
66 `superset' and that those for `int' and `double' are `subsets'.
67
3bdf5ad1
RK
68 To see whether two alias sets can point to the same memory, we must
69 see if either alias set is a subset of the other. We need not trace
95bd1dd7 70 past immediate descendants, however, since we propagate all
3bdf5ad1 71 grandchildren up one level.
3932261a
MM
72
73 Alias set zero is implicitly a superset of all other alias sets.
74 However, this is no actual entry for alias set zero. It is an
75 error to attempt to explicitly construct a subset of zero. */
76
b604074c 77struct alias_set_entry GTY(())
d4b60170 78{
3932261a 79 /* The alias set number, as stored in MEM_ALIAS_SET. */
3bdf5ad1 80 HOST_WIDE_INT alias_set;
3932261a
MM
81
82 /* The children of the alias set. These are not just the immediate
95bd1dd7 83 children, but, in fact, all descendants. So, if we have:
3932261a 84
ca7fd9cd 85 struct T { struct S s; float f; }
3932261a
MM
86
87 continuing our example above, the children here will be all of
88 `int', `double', `float', and `struct S'. */
b604074c 89 splay_tree GTY((param1_is (int), param2_is (int))) children;
2bf105ab
RK
90
91 /* Nonzero if would have a child of zero: this effectively makes this
92 alias set the same as alias set zero. */
93 int has_zero_child;
b604074c
GK
94};
95typedef struct alias_set_entry *alias_set_entry;
9ae8ffe7 96
4682ae04
AJ
97static int rtx_equal_for_memref_p (rtx, rtx);
98static rtx find_symbolic_term (rtx);
4682ae04
AJ
99static int memrefs_conflict_p (int, rtx, int, rtx, HOST_WIDE_INT);
100static void record_set (rtx, rtx, void *);
101static int base_alias_check (rtx, rtx, enum machine_mode,
102 enum machine_mode);
103static rtx find_base_value (rtx);
104static int mems_in_disjoint_alias_sets_p (rtx, rtx);
105static int insert_subset_children (splay_tree_node, void*);
106static tree find_base_decl (tree);
107static alias_set_entry get_alias_set_entry (HOST_WIDE_INT);
108static rtx fixed_scalar_and_varying_struct_p (rtx, rtx, rtx, rtx,
109 int (*) (rtx, int));
110static int aliases_everything_p (rtx);
111static bool nonoverlapping_component_refs_p (tree, tree);
112static tree decl_for_component_ref (tree);
113static rtx adjust_offset_for_component_ref (tree, rtx);
114static int nonoverlapping_memrefs_p (rtx, rtx);
d2399d75 115static int write_dependence_p (rtx, rtx, int, int);
4682ae04
AJ
116
117static int nonlocal_mentioned_p_1 (rtx *, void *);
118static int nonlocal_mentioned_p (rtx);
119static int nonlocal_referenced_p_1 (rtx *, void *);
120static int nonlocal_referenced_p (rtx);
121static int nonlocal_set_p_1 (rtx *, void *);
122static int nonlocal_set_p (rtx);
123static void memory_modified_1 (rtx, rtx, void *);
9ae8ffe7
JL
124
125/* Set up all info needed to perform alias analysis on memory references. */
126
d4b60170 127/* Returns the size in bytes of the mode of X. */
9ae8ffe7
JL
128#define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
129
41472af8 130/* Returns nonzero if MEM1 and MEM2 do not alias because they are in
264fac34
MM
131 different alias sets. We ignore alias sets in functions making use
132 of variable arguments because the va_arg macros on some systems are
133 not legal ANSI C. */
134#define DIFFERENT_ALIAS_SETS_P(MEM1, MEM2) \
3932261a 135 mems_in_disjoint_alias_sets_p (MEM1, MEM2)
41472af8 136
ea64ef27 137/* Cap the number of passes we make over the insns propagating alias
ac3d9668 138 information through set chains. 10 is a completely arbitrary choice. */
ea64ef27 139#define MAX_ALIAS_LOOP_PASSES 10
ca7fd9cd 140
9ae8ffe7
JL
141/* reg_base_value[N] gives an address to which register N is related.
142 If all sets after the first add or subtract to the current value
143 or otherwise modify it so it does not point to a different top level
144 object, reg_base_value[N] is equal to the address part of the source
2a2c8203
JC
145 of the first set.
146
147 A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF. ADDRESS
148 expressions represent certain special values: function arguments and
ca7fd9cd 149 the stack, frame, and argument pointers.
b3b5ad95
JL
150
151 The contents of an ADDRESS is not normally used, the mode of the
152 ADDRESS determines whether the ADDRESS is a function argument or some
153 other special value. Pointer equality, not rtx_equal_p, determines whether
154 two ADDRESS expressions refer to the same base address.
155
156 The only use of the contents of an ADDRESS is for determining if the
157 current function performs nonlocal memory memory references for the
158 purposes of marking the function as a constant function. */
2a2c8203 159
e2500fed 160static GTY((length ("reg_base_value_size"))) rtx *reg_base_value;
ac606739 161static rtx *new_reg_base_value;
d4b60170
RK
162static unsigned int reg_base_value_size; /* size of reg_base_value array */
163
bf1660a6
JL
164/* Static hunks of RTL used by the aliasing code; these are initialized
165 once per function to avoid unnecessary RTL allocations. */
166static GTY (()) rtx static_reg_base_value[FIRST_PSEUDO_REGISTER];
167
9ae8ffe7 168#define REG_BASE_VALUE(X) \
fb6754f0
BS
169 (REGNO (X) < reg_base_value_size \
170 ? reg_base_value[REGNO (X)] : 0)
9ae8ffe7 171
de12be17
JC
172/* Vector of known invariant relationships between registers. Set in
173 loop unrolling. Indexed by register number, if nonzero the value
174 is an expression describing this register in terms of another.
175
176 The length of this array is REG_BASE_VALUE_SIZE.
177
178 Because this array contains only pseudo registers it has no effect
179 after reload. */
180static rtx *alias_invariant;
181
c13e8210
MM
182/* Vector indexed by N giving the initial (unchanging) value known for
183 pseudo-register N. This array is initialized in
184 init_alias_analysis, and does not change until end_alias_analysis
185 is called. */
9ae8ffe7
JL
186rtx *reg_known_value;
187
188/* Indicates number of valid entries in reg_known_value. */
770ae6cc 189static unsigned int reg_known_value_size;
9ae8ffe7
JL
190
191/* Vector recording for each reg_known_value whether it is due to a
192 REG_EQUIV note. Future passes (viz., reload) may replace the
193 pseudo with the equivalent expression and so we account for the
ac3d9668
RK
194 dependences that would be introduced if that happens.
195
196 The REG_EQUIV notes created in assign_parms may mention the arg
197 pointer, and there are explicit insns in the RTL that modify the
198 arg pointer. Thus we must ensure that such insns don't get
199 scheduled across each other because that would invalidate the
200 REG_EQUIV notes. One could argue that the REG_EQUIV notes are
201 wrong, but solving the problem in the scheduler will likely give
202 better code, so we do it here. */
9ae8ffe7
JL
203char *reg_known_equiv_p;
204
2a2c8203
JC
205/* True when scanning insns from the start of the rtl to the
206 NOTE_INSN_FUNCTION_BEG note. */
83bbd9b6 207static bool copying_arguments;
9ae8ffe7 208
3932261a 209/* The splay-tree used to store the various alias set entries. */
b604074c 210static GTY ((param_is (struct alias_set_entry))) varray_type alias_sets;
ac3d9668 211\f
3932261a
MM
212/* Returns a pointer to the alias set entry for ALIAS_SET, if there is
213 such an entry, or NULL otherwise. */
214
9ddb66ca 215static inline alias_set_entry
4682ae04 216get_alias_set_entry (HOST_WIDE_INT alias_set)
3932261a 217{
9ddb66ca 218 return (alias_set_entry)VARRAY_GENERIC_PTR (alias_sets, alias_set);
3932261a
MM
219}
220
ac3d9668
RK
221/* Returns nonzero if the alias sets for MEM1 and MEM2 are such that
222 the two MEMs cannot alias each other. */
3932261a 223
9ddb66ca 224static inline int
4682ae04 225mems_in_disjoint_alias_sets_p (rtx mem1, rtx mem2)
3932261a 226{
ca7fd9cd 227#ifdef ENABLE_CHECKING
3932261a
MM
228/* Perform a basic sanity check. Namely, that there are no alias sets
229 if we're not using strict aliasing. This helps to catch bugs
230 whereby someone uses PUT_CODE, but doesn't clear MEM_ALIAS_SET, or
231 where a MEM is allocated in some way other than by the use of
232 gen_rtx_MEM, and the MEM_ALIAS_SET is not cleared. If we begin to
233 use alias sets to indicate that spilled registers cannot alias each
234 other, we might need to remove this check. */
d4b60170
RK
235 if (! flag_strict_aliasing
236 && (MEM_ALIAS_SET (mem1) != 0 || MEM_ALIAS_SET (mem2) != 0))
3932261a
MM
237 abort ();
238#endif
239
1da68f56
RK
240 return ! alias_sets_conflict_p (MEM_ALIAS_SET (mem1), MEM_ALIAS_SET (mem2));
241}
3932261a 242
1da68f56
RK
243/* Insert the NODE into the splay tree given by DATA. Used by
244 record_alias_subset via splay_tree_foreach. */
245
246static int
4682ae04 247insert_subset_children (splay_tree_node node, void *data)
1da68f56
RK
248{
249 splay_tree_insert ((splay_tree) data, node->key, node->value);
250
251 return 0;
252}
253
254/* Return 1 if the two specified alias sets may conflict. */
255
256int
4682ae04 257alias_sets_conflict_p (HOST_WIDE_INT set1, HOST_WIDE_INT set2)
1da68f56
RK
258{
259 alias_set_entry ase;
260
261 /* If have no alias set information for one of the operands, we have
262 to assume it can alias anything. */
263 if (set1 == 0 || set2 == 0
264 /* If the two alias sets are the same, they may alias. */
265 || set1 == set2)
266 return 1;
3932261a 267
3bdf5ad1 268 /* See if the first alias set is a subset of the second. */
1da68f56 269 ase = get_alias_set_entry (set1);
2bf105ab
RK
270 if (ase != 0
271 && (ase->has_zero_child
272 || splay_tree_lookup (ase->children,
1da68f56
RK
273 (splay_tree_key) set2)))
274 return 1;
3932261a
MM
275
276 /* Now do the same, but with the alias sets reversed. */
1da68f56 277 ase = get_alias_set_entry (set2);
2bf105ab
RK
278 if (ase != 0
279 && (ase->has_zero_child
280 || splay_tree_lookup (ase->children,
1da68f56
RK
281 (splay_tree_key) set1)))
282 return 1;
3932261a 283
1da68f56 284 /* The two alias sets are distinct and neither one is the
3932261a 285 child of the other. Therefore, they cannot alias. */
1da68f56 286 return 0;
3932261a 287}
1da68f56
RK
288\f
289/* Return 1 if TYPE is a RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE and has
290 has any readonly fields. If any of the fields have types that
291 contain readonly fields, return true as well. */
3932261a 292
1da68f56 293int
4682ae04 294readonly_fields_p (tree type)
3932261a 295{
1da68f56
RK
296 tree field;
297
298 if (TREE_CODE (type) != RECORD_TYPE && TREE_CODE (type) != UNION_TYPE
299 && TREE_CODE (type) != QUAL_UNION_TYPE)
300 return 0;
301
302 for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field))
303 if (TREE_CODE (field) == FIELD_DECL
304 && (TREE_READONLY (field)
305 || readonly_fields_p (TREE_TYPE (field))))
306 return 1;
3932261a
MM
307
308 return 0;
309}
3bdf5ad1 310\f
1da68f56
RK
311/* Return 1 if any MEM object of type T1 will always conflict (using the
312 dependency routines in this file) with any MEM object of type T2.
313 This is used when allocating temporary storage. If T1 and/or T2 are
314 NULL_TREE, it means we know nothing about the storage. */
315
316int
4682ae04 317objects_must_conflict_p (tree t1, tree t2)
1da68f56 318{
82d610ec
RK
319 HOST_WIDE_INT set1, set2;
320
e8ea2809
RK
321 /* If neither has a type specified, we don't know if they'll conflict
322 because we may be using them to store objects of various types, for
323 example the argument and local variables areas of inlined functions. */
981a4c34 324 if (t1 == 0 && t2 == 0)
e8ea2809
RK
325 return 0;
326
66cce54d
RH
327 /* If one or the other has readonly fields or is readonly,
328 then they may not conflict. */
329 if ((t1 != 0 && readonly_fields_p (t1))
330 || (t2 != 0 && readonly_fields_p (t2))
a3b88570
MM
331 || (t1 != 0 && lang_hooks.honor_readonly && TYPE_READONLY (t1))
332 || (t2 != 0 && lang_hooks.honor_readonly && TYPE_READONLY (t2)))
66cce54d
RH
333 return 0;
334
1da68f56
RK
335 /* If they are the same type, they must conflict. */
336 if (t1 == t2
337 /* Likewise if both are volatile. */
338 || (t1 != 0 && TYPE_VOLATILE (t1) && t2 != 0 && TYPE_VOLATILE (t2)))
339 return 1;
340
82d610ec
RK
341 set1 = t1 ? get_alias_set (t1) : 0;
342 set2 = t2 ? get_alias_set (t2) : 0;
1da68f56 343
82d610ec
RK
344 /* Otherwise they conflict if they have no alias set or the same. We
345 can't simply use alias_sets_conflict_p here, because we must make
346 sure that every subtype of t1 will conflict with every subtype of
347 t2 for which a pair of subobjects of these respective subtypes
348 overlaps on the stack. */
349 return set1 == 0 || set2 == 0 || set1 == set2;
1da68f56
RK
350}
351\f
3bdf5ad1
RK
352/* T is an expression with pointer type. Find the DECL on which this
353 expression is based. (For example, in `a[i]' this would be `a'.)
354 If there is no such DECL, or a unique decl cannot be determined,
f5143c46 355 NULL_TREE is returned. */
3bdf5ad1
RK
356
357static tree
4682ae04 358find_base_decl (tree t)
3bdf5ad1
RK
359{
360 tree d0, d1, d2;
361
362 if (t == 0 || t == error_mark_node || ! POINTER_TYPE_P (TREE_TYPE (t)))
363 return 0;
364
365 /* If this is a declaration, return it. */
366 if (TREE_CODE_CLASS (TREE_CODE (t)) == 'd')
367 return t;
368
369 /* Handle general expressions. It would be nice to deal with
370 COMPONENT_REFs here. If we could tell that `a' and `b' were the
371 same, then `a->f' and `b->f' are also the same. */
372 switch (TREE_CODE_CLASS (TREE_CODE (t)))
373 {
374 case '1':
375 return find_base_decl (TREE_OPERAND (t, 0));
376
377 case '2':
378 /* Return 0 if found in neither or both are the same. */
379 d0 = find_base_decl (TREE_OPERAND (t, 0));
380 d1 = find_base_decl (TREE_OPERAND (t, 1));
381 if (d0 == d1)
382 return d0;
383 else if (d0 == 0)
384 return d1;
385 else if (d1 == 0)
386 return d0;
387 else
388 return 0;
389
390 case '3':
391 d0 = find_base_decl (TREE_OPERAND (t, 0));
392 d1 = find_base_decl (TREE_OPERAND (t, 1));
3bdf5ad1
RK
393 d2 = find_base_decl (TREE_OPERAND (t, 2));
394
395 /* Set any nonzero values from the last, then from the first. */
396 if (d1 == 0) d1 = d2;
397 if (d0 == 0) d0 = d1;
398 if (d1 == 0) d1 = d0;
399 if (d2 == 0) d2 = d1;
400
401 /* At this point all are nonzero or all are zero. If all three are the
402 same, return it. Otherwise, return zero. */
403 return (d0 == d1 && d1 == d2) ? d0 : 0;
404
405 default:
406 return 0;
407 }
408}
409
6e24b709
RK
410/* Return 1 if all the nested component references handled by
411 get_inner_reference in T are such that we can address the object in T. */
412
10b76d73 413int
4682ae04 414can_address_p (tree t)
6e24b709
RK
415{
416 /* If we're at the end, it is vacuously addressable. */
417 if (! handled_component_p (t))
418 return 1;
419
420 /* Bitfields are never addressable. */
421 else if (TREE_CODE (t) == BIT_FIELD_REF)
422 return 0;
423
8ac61af7
RK
424 /* Fields are addressable unless they are marked as nonaddressable or
425 the containing type has alias set 0. */
6e24b709
RK
426 else if (TREE_CODE (t) == COMPONENT_REF
427 && ! DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1))
8ac61af7 428 && get_alias_set (TREE_TYPE (TREE_OPERAND (t, 0))) != 0
6e24b709
RK
429 && can_address_p (TREE_OPERAND (t, 0)))
430 return 1;
431
8ac61af7 432 /* Likewise for arrays. */
b4e3fabb 433 else if ((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
6e24b709 434 && ! TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0)))
8ac61af7 435 && get_alias_set (TREE_TYPE (TREE_OPERAND (t, 0))) != 0
6e24b709
RK
436 && can_address_p (TREE_OPERAND (t, 0)))
437 return 1;
438
439 return 0;
440}
441
3bdf5ad1
RK
442/* Return the alias set for T, which may be either a type or an
443 expression. Call language-specific routine for help, if needed. */
444
445HOST_WIDE_INT
4682ae04 446get_alias_set (tree t)
3bdf5ad1
RK
447{
448 HOST_WIDE_INT set;
3bdf5ad1
RK
449
450 /* If we're not doing any alias analysis, just assume everything
451 aliases everything else. Also return 0 if this or its type is
452 an error. */
453 if (! flag_strict_aliasing || t == error_mark_node
454 || (! TYPE_P (t)
455 && (TREE_TYPE (t) == 0 || TREE_TYPE (t) == error_mark_node)))
456 return 0;
457
458 /* We can be passed either an expression or a type. This and the
f47e9b4e
RK
459 language-specific routine may make mutually-recursive calls to each other
460 to figure out what to do. At each juncture, we see if this is a tree
461 that the language may need to handle specially. First handle things that
738cc472 462 aren't types. */
f824e5c3 463 if (! TYPE_P (t))
3bdf5ad1 464 {
738cc472
RK
465 tree inner = t;
466 tree placeholder_ptr = 0;
467
8ac61af7
RK
468 /* Remove any nops, then give the language a chance to do
469 something with this tree before we look at it. */
470 STRIP_NOPS (t);
471 set = (*lang_hooks.get_alias_set) (t);
472 if (set != -1)
473 return set;
474
738cc472 475 /* First see if the actual object referenced is an INDIRECT_REF from a
8ac61af7 476 restrict-qualified pointer or a "void *". Replace
738cc472 477 PLACEHOLDER_EXPRs. */
8ac61af7 478 while (TREE_CODE (inner) == PLACEHOLDER_EXPR
738cc472
RK
479 || handled_component_p (inner))
480 {
481 if (TREE_CODE (inner) == PLACEHOLDER_EXPR)
482 inner = find_placeholder (inner, &placeholder_ptr);
483 else
484 inner = TREE_OPERAND (inner, 0);
8ac61af7
RK
485
486 STRIP_NOPS (inner);
738cc472
RK
487 }
488
489 /* Check for accesses through restrict-qualified pointers. */
490 if (TREE_CODE (inner) == INDIRECT_REF)
491 {
492 tree decl = find_base_decl (TREE_OPERAND (inner, 0));
493
494 if (decl && DECL_POINTER_ALIAS_SET_KNOWN_P (decl))
495 {
e5837c07 496 /* If we haven't computed the actual alias set, do it now. */
738cc472
RK
497 if (DECL_POINTER_ALIAS_SET (decl) == -2)
498 {
499 /* No two restricted pointers can point at the same thing.
500 However, a restricted pointer can point at the same thing
501 as an unrestricted pointer, if that unrestricted pointer
502 is based on the restricted pointer. So, we make the
503 alias set for the restricted pointer a subset of the
504 alias set for the type pointed to by the type of the
505 decl. */
506 HOST_WIDE_INT pointed_to_alias_set
507 = get_alias_set (TREE_TYPE (TREE_TYPE (decl)));
508
509 if (pointed_to_alias_set == 0)
510 /* It's not legal to make a subset of alias set zero. */
e7844ffb 511 DECL_POINTER_ALIAS_SET (decl) = 0;
738cc472
RK
512 else
513 {
514 DECL_POINTER_ALIAS_SET (decl) = new_alias_set ();
ca7fd9cd
KH
515 record_alias_subset (pointed_to_alias_set,
516 DECL_POINTER_ALIAS_SET (decl));
738cc472
RK
517 }
518 }
519
520 /* We use the alias set indicated in the declaration. */
521 return DECL_POINTER_ALIAS_SET (decl);
522 }
523
524 /* If we have an INDIRECT_REF via a void pointer, we don't
525 know anything about what that might alias. */
526 else if (TREE_CODE (TREE_TYPE (inner)) == VOID_TYPE)
527 return 0;
528 }
529
530 /* Otherwise, pick up the outermost object that we could have a pointer
531 to, processing conversion and PLACEHOLDER_EXPR as above. */
532 placeholder_ptr = 0;
8ac61af7 533 while (TREE_CODE (t) == PLACEHOLDER_EXPR
f47e9b4e
RK
534 || (handled_component_p (t) && ! can_address_p (t)))
535 {
f47e9b4e 536 if (TREE_CODE (t) == PLACEHOLDER_EXPR)
738cc472 537 t = find_placeholder (t, &placeholder_ptr);
f47e9b4e
RK
538 else
539 t = TREE_OPERAND (t, 0);
f824e5c3 540
8ac61af7
RK
541 STRIP_NOPS (t);
542 }
f824e5c3 543
738cc472
RK
544 /* If we've already determined the alias set for a decl, just return
545 it. This is necessary for C++ anonymous unions, whose component
546 variables don't look like union members (boo!). */
5755cd38
JM
547 if (TREE_CODE (t) == VAR_DECL
548 && DECL_RTL_SET_P (t) && GET_CODE (DECL_RTL (t)) == MEM)
549 return MEM_ALIAS_SET (DECL_RTL (t));
550
f824e5c3
RK
551 /* Now all we care about is the type. */
552 t = TREE_TYPE (t);
3bdf5ad1
RK
553 }
554
3bdf5ad1
RK
555 /* Variant qualifiers don't affect the alias set, so get the main
556 variant. If this is a type with a known alias set, return it. */
557 t = TYPE_MAIN_VARIANT (t);
738cc472 558 if (TYPE_ALIAS_SET_KNOWN_P (t))
3bdf5ad1
RK
559 return TYPE_ALIAS_SET (t);
560
561 /* See if the language has special handling for this type. */
8ac61af7
RK
562 set = (*lang_hooks.get_alias_set) (t);
563 if (set != -1)
738cc472 564 return set;
2bf105ab 565
3bdf5ad1
RK
566 /* There are no objects of FUNCTION_TYPE, so there's no point in
567 using up an alias set for them. (There are, of course, pointers
568 and references to functions, but that's different.) */
569 else if (TREE_CODE (t) == FUNCTION_TYPE)
570 set = 0;
74d86f4f
RH
571
572 /* Unless the language specifies otherwise, let vector types alias
573 their components. This avoids some nasty type punning issues in
574 normal usage. And indeed lets vectors be treated more like an
575 array slice. */
576 else if (TREE_CODE (t) == VECTOR_TYPE)
577 set = get_alias_set (TREE_TYPE (t));
578
3bdf5ad1
RK
579 else
580 /* Otherwise make a new alias set for this type. */
581 set = new_alias_set ();
582
583 TYPE_ALIAS_SET (t) = set;
2bf105ab
RK
584
585 /* If this is an aggregate type, we must record any component aliasing
586 information. */
1d79fd2c 587 if (AGGREGATE_TYPE_P (t) || TREE_CODE (t) == COMPLEX_TYPE)
2bf105ab
RK
588 record_component_aliases (t);
589
3bdf5ad1
RK
590 return set;
591}
592
593/* Return a brand-new alias set. */
594
f103e34d
GK
595static GTY(()) HOST_WIDE_INT last_alias_set;
596
3bdf5ad1 597HOST_WIDE_INT
4682ae04 598new_alias_set (void)
3bdf5ad1 599{
3bdf5ad1 600 if (flag_strict_aliasing)
9ddb66ca 601 {
3416f5c2
JH
602 if (!alias_sets)
603 VARRAY_GENERIC_PTR_INIT (alias_sets, 10, "alias sets");
604 else
605 VARRAY_GROW (alias_sets, last_alias_set + 2);
9ddb66ca
JH
606 return ++last_alias_set;
607 }
3bdf5ad1
RK
608 else
609 return 0;
610}
3932261a 611
01d28c3f
JM
612/* Indicate that things in SUBSET can alias things in SUPERSET, but that
613 not everything that aliases SUPERSET also aliases SUBSET. For example,
614 in C, a store to an `int' can alias a load of a structure containing an
615 `int', and vice versa. But it can't alias a load of a 'double' member
616 of the same structure. Here, the structure would be the SUPERSET and
617 `int' the SUBSET. This relationship is also described in the comment at
618 the beginning of this file.
619
620 This function should be called only once per SUPERSET/SUBSET pair.
3932261a
MM
621
622 It is illegal for SUPERSET to be zero; everything is implicitly a
623 subset of alias set zero. */
624
625void
4682ae04 626record_alias_subset (HOST_WIDE_INT superset, HOST_WIDE_INT subset)
3932261a
MM
627{
628 alias_set_entry superset_entry;
629 alias_set_entry subset_entry;
630
f47e9b4e
RK
631 /* It is possible in complex type situations for both sets to be the same,
632 in which case we can ignore this operation. */
633 if (superset == subset)
634 return;
635
3932261a
MM
636 if (superset == 0)
637 abort ();
638
639 superset_entry = get_alias_set_entry (superset);
ca7fd9cd 640 if (superset_entry == 0)
3932261a
MM
641 {
642 /* Create an entry for the SUPERSET, so that we have a place to
643 attach the SUBSET. */
b604074c 644 superset_entry = ggc_alloc (sizeof (struct alias_set_entry));
3932261a 645 superset_entry->alias_set = superset;
ca7fd9cd 646 superset_entry->children
b604074c 647 = splay_tree_new_ggc (splay_tree_compare_ints);
570eb5c8 648 superset_entry->has_zero_child = 0;
9ddb66ca 649 VARRAY_GENERIC_PTR (alias_sets, superset) = superset_entry;
3932261a
MM
650 }
651
2bf105ab
RK
652 if (subset == 0)
653 superset_entry->has_zero_child = 1;
654 else
655 {
656 subset_entry = get_alias_set_entry (subset);
657 /* If there is an entry for the subset, enter all of its children
658 (if they are not already present) as children of the SUPERSET. */
ca7fd9cd 659 if (subset_entry)
2bf105ab
RK
660 {
661 if (subset_entry->has_zero_child)
662 superset_entry->has_zero_child = 1;
d4b60170 663
2bf105ab
RK
664 splay_tree_foreach (subset_entry->children, insert_subset_children,
665 superset_entry->children);
666 }
3932261a 667
2bf105ab 668 /* Enter the SUBSET itself as a child of the SUPERSET. */
ca7fd9cd 669 splay_tree_insert (superset_entry->children,
2bf105ab
RK
670 (splay_tree_key) subset, 0);
671 }
3932261a
MM
672}
673
a0c33338
RK
674/* Record that component types of TYPE, if any, are part of that type for
675 aliasing purposes. For record types, we only record component types
676 for fields that are marked addressable. For array types, we always
677 record the component types, so the front end should not call this
678 function if the individual component aren't addressable. */
679
680void
4682ae04 681record_component_aliases (tree type)
a0c33338 682{
3bdf5ad1 683 HOST_WIDE_INT superset = get_alias_set (type);
a0c33338
RK
684 tree field;
685
686 if (superset == 0)
687 return;
688
689 switch (TREE_CODE (type))
690 {
691 case ARRAY_TYPE:
2bf105ab
RK
692 if (! TYPE_NONALIASED_COMPONENT (type))
693 record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
a0c33338
RK
694 break;
695
696 case RECORD_TYPE:
697 case UNION_TYPE:
698 case QUAL_UNION_TYPE:
6614fd40 699 /* Recursively record aliases for the base classes, if there are any. */
61eece67 700 if (TYPE_BINFO (type) != NULL && TYPE_BINFO_BASETYPES (type) != NULL)
ca7fd9cd
KH
701 {
702 int i;
703 for (i = 0; i < TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type)); i++)
704 {
705 tree binfo = TREE_VEC_ELT (TYPE_BINFO_BASETYPES (type), i);
706 record_alias_subset (superset,
61eece67 707 get_alias_set (BINFO_TYPE (binfo)));
ca7fd9cd
KH
708 }
709 }
a0c33338 710 for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field))
b16a49a1 711 if (TREE_CODE (field) == FIELD_DECL && ! DECL_NONADDRESSABLE_P (field))
2bf105ab 712 record_alias_subset (superset, get_alias_set (TREE_TYPE (field)));
a0c33338
RK
713 break;
714
1d79fd2c
JW
715 case COMPLEX_TYPE:
716 record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
717 break;
718
a0c33338
RK
719 default:
720 break;
721 }
722}
723
3bdf5ad1
RK
724/* Allocate an alias set for use in storing and reading from the varargs
725 spill area. */
726
f103e34d
GK
727static GTY(()) HOST_WIDE_INT varargs_set = -1;
728
3bdf5ad1 729HOST_WIDE_INT
4682ae04 730get_varargs_alias_set (void)
3bdf5ad1 731{
f103e34d
GK
732 if (varargs_set == -1)
733 varargs_set = new_alias_set ();
3bdf5ad1 734
f103e34d 735 return varargs_set;
3bdf5ad1
RK
736}
737
738/* Likewise, but used for the fixed portions of the frame, e.g., register
739 save areas. */
740
f103e34d
GK
741static GTY(()) HOST_WIDE_INT frame_set = -1;
742
3bdf5ad1 743HOST_WIDE_INT
4682ae04 744get_frame_alias_set (void)
3bdf5ad1 745{
f103e34d
GK
746 if (frame_set == -1)
747 frame_set = new_alias_set ();
3bdf5ad1 748
f103e34d 749 return frame_set;
3bdf5ad1
RK
750}
751
2a2c8203
JC
752/* Inside SRC, the source of a SET, find a base address. */
753
9ae8ffe7 754static rtx
4682ae04 755find_base_value (rtx src)
9ae8ffe7 756{
713f41f9 757 unsigned int regno;
0aacc8ed 758
9ae8ffe7
JL
759 switch (GET_CODE (src))
760 {
761 case SYMBOL_REF:
762 case LABEL_REF:
763 return src;
764
765 case REG:
fb6754f0 766 regno = REGNO (src);
d4b60170 767 /* At the start of a function, argument registers have known base
2a2c8203
JC
768 values which may be lost later. Returning an ADDRESS
769 expression here allows optimization based on argument values
770 even when the argument registers are used for other purposes. */
713f41f9
BS
771 if (regno < FIRST_PSEUDO_REGISTER && copying_arguments)
772 return new_reg_base_value[regno];
73774bc7 773
eaf407a5 774 /* If a pseudo has a known base value, return it. Do not do this
9b462c42
RH
775 for non-fixed hard regs since it can result in a circular
776 dependency chain for registers which have values at function entry.
eaf407a5
JL
777
778 The test above is not sufficient because the scheduler may move
779 a copy out of an arg reg past the NOTE_INSN_FUNCTION_BEGIN. */
9b462c42 780 if ((regno >= FIRST_PSEUDO_REGISTER || fixed_regs[regno])
83bbd9b6
RH
781 && regno < reg_base_value_size)
782 {
783 /* If we're inside init_alias_analysis, use new_reg_base_value
784 to reduce the number of relaxation iterations. */
1afdf91c
RH
785 if (new_reg_base_value && new_reg_base_value[regno]
786 && REG_N_SETS (regno) == 1)
83bbd9b6
RH
787 return new_reg_base_value[regno];
788
789 if (reg_base_value[regno])
790 return reg_base_value[regno];
791 }
73774bc7 792
e3f049a8 793 return 0;
9ae8ffe7
JL
794
795 case MEM:
796 /* Check for an argument passed in memory. Only record in the
797 copying-arguments block; it is too hard to track changes
798 otherwise. */
799 if (copying_arguments
800 && (XEXP (src, 0) == arg_pointer_rtx
801 || (GET_CODE (XEXP (src, 0)) == PLUS
802 && XEXP (XEXP (src, 0), 0) == arg_pointer_rtx)))
38a448ca 803 return gen_rtx_ADDRESS (VOIDmode, src);
9ae8ffe7
JL
804 return 0;
805
806 case CONST:
807 src = XEXP (src, 0);
808 if (GET_CODE (src) != PLUS && GET_CODE (src) != MINUS)
809 break;
d4b60170 810
ec5c56db 811 /* ... fall through ... */
2a2c8203 812
9ae8ffe7
JL
813 case PLUS:
814 case MINUS:
2a2c8203 815 {
ec907dd8
JL
816 rtx temp, src_0 = XEXP (src, 0), src_1 = XEXP (src, 1);
817
0134bf2d
DE
818 /* If either operand is a REG that is a known pointer, then it
819 is the base. */
820 if (REG_P (src_0) && REG_POINTER (src_0))
821 return find_base_value (src_0);
822 if (REG_P (src_1) && REG_POINTER (src_1))
823 return find_base_value (src_1);
824
ec907dd8
JL
825 /* If either operand is a REG, then see if we already have
826 a known value for it. */
0134bf2d 827 if (REG_P (src_0))
ec907dd8
JL
828 {
829 temp = find_base_value (src_0);
d4b60170 830 if (temp != 0)
ec907dd8
JL
831 src_0 = temp;
832 }
833
0134bf2d 834 if (REG_P (src_1))
ec907dd8
JL
835 {
836 temp = find_base_value (src_1);
d4b60170 837 if (temp!= 0)
ec907dd8
JL
838 src_1 = temp;
839 }
2a2c8203 840
0134bf2d
DE
841 /* If either base is named object or a special address
842 (like an argument or stack reference), then use it for the
843 base term. */
844 if (src_0 != 0
845 && (GET_CODE (src_0) == SYMBOL_REF
846 || GET_CODE (src_0) == LABEL_REF
847 || (GET_CODE (src_0) == ADDRESS
848 && GET_MODE (src_0) != VOIDmode)))
849 return src_0;
850
851 if (src_1 != 0
852 && (GET_CODE (src_1) == SYMBOL_REF
853 || GET_CODE (src_1) == LABEL_REF
854 || (GET_CODE (src_1) == ADDRESS
855 && GET_MODE (src_1) != VOIDmode)))
856 return src_1;
857
d4b60170 858 /* Guess which operand is the base address:
ec907dd8
JL
859 If either operand is a symbol, then it is the base. If
860 either operand is a CONST_INT, then the other is the base. */
d4b60170 861 if (GET_CODE (src_1) == CONST_INT || CONSTANT_P (src_0))
2a2c8203 862 return find_base_value (src_0);
d4b60170 863 else if (GET_CODE (src_0) == CONST_INT || CONSTANT_P (src_1))
ec907dd8
JL
864 return find_base_value (src_1);
865
9ae8ffe7 866 return 0;
2a2c8203
JC
867 }
868
869 case LO_SUM:
870 /* The standard form is (lo_sum reg sym) so look only at the
871 second operand. */
872 return find_base_value (XEXP (src, 1));
9ae8ffe7
JL
873
874 case AND:
875 /* If the second operand is constant set the base
ec5c56db 876 address to the first operand. */
2a2c8203
JC
877 if (GET_CODE (XEXP (src, 1)) == CONST_INT && INTVAL (XEXP (src, 1)) != 0)
878 return find_base_value (XEXP (src, 0));
9ae8ffe7
JL
879 return 0;
880
61f0131c
R
881 case TRUNCATE:
882 if (GET_MODE_SIZE (GET_MODE (src)) < GET_MODE_SIZE (Pmode))
883 break;
884 /* Fall through. */
9ae8ffe7 885 case HIGH:
d288e53d
DE
886 case PRE_INC:
887 case PRE_DEC:
888 case POST_INC:
889 case POST_DEC:
890 case PRE_MODIFY:
891 case POST_MODIFY:
2a2c8203 892 return find_base_value (XEXP (src, 0));
1d300e19 893
0aacc8ed
RK
894 case ZERO_EXTEND:
895 case SIGN_EXTEND: /* used for NT/Alpha pointers */
896 {
897 rtx temp = find_base_value (XEXP (src, 0));
898
5ae6cd0d 899 if (temp != 0 && CONSTANT_P (temp))
0aacc8ed 900 temp = convert_memory_address (Pmode, temp);
0aacc8ed
RK
901
902 return temp;
903 }
904
1d300e19
KG
905 default:
906 break;
9ae8ffe7
JL
907 }
908
909 return 0;
910}
911
912/* Called from init_alias_analysis indirectly through note_stores. */
913
d4b60170 914/* While scanning insns to find base values, reg_seen[N] is nonzero if
9ae8ffe7
JL
915 register N has been set in this function. */
916static char *reg_seen;
917
13309a5f
JC
918/* Addresses which are known not to alias anything else are identified
919 by a unique integer. */
ec907dd8
JL
920static int unique_id;
921
2a2c8203 922static void
4682ae04 923record_set (rtx dest, rtx set, void *data ATTRIBUTE_UNUSED)
9ae8ffe7 924{
b3694847 925 unsigned regno;
9ae8ffe7 926 rtx src;
c28b4e40 927 int n;
9ae8ffe7
JL
928
929 if (GET_CODE (dest) != REG)
930 return;
931
fb6754f0 932 regno = REGNO (dest);
9ae8ffe7 933
ac606739
GS
934 if (regno >= reg_base_value_size)
935 abort ();
936
c28b4e40
JW
937 /* If this spans multiple hard registers, then we must indicate that every
938 register has an unusable value. */
939 if (regno < FIRST_PSEUDO_REGISTER)
940 n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
941 else
942 n = 1;
943 if (n != 1)
944 {
945 while (--n >= 0)
946 {
947 reg_seen[regno + n] = 1;
948 new_reg_base_value[regno + n] = 0;
949 }
950 return;
951 }
952
9ae8ffe7
JL
953 if (set)
954 {
955 /* A CLOBBER wipes out any old value but does not prevent a previously
956 unset register from acquiring a base address (i.e. reg_seen is not
957 set). */
958 if (GET_CODE (set) == CLOBBER)
959 {
ec907dd8 960 new_reg_base_value[regno] = 0;
9ae8ffe7
JL
961 return;
962 }
963 src = SET_SRC (set);
964 }
965 else
966 {
9ae8ffe7
JL
967 if (reg_seen[regno])
968 {
ec907dd8 969 new_reg_base_value[regno] = 0;
9ae8ffe7
JL
970 return;
971 }
972 reg_seen[regno] = 1;
38a448ca
RH
973 new_reg_base_value[regno] = gen_rtx_ADDRESS (Pmode,
974 GEN_INT (unique_id++));
9ae8ffe7
JL
975 return;
976 }
977
978 /* This is not the first set. If the new value is not related to the
979 old value, forget the base value. Note that the following code is
980 not detected:
981 extern int x, y; int *p = &x; p += (&y-&x);
982 ANSI C does not allow computing the difference of addresses
983 of distinct top level objects. */
ec907dd8 984 if (new_reg_base_value[regno])
9ae8ffe7
JL
985 switch (GET_CODE (src))
986 {
2a2c8203 987 case LO_SUM:
9ae8ffe7
JL
988 case MINUS:
989 if (XEXP (src, 0) != dest && XEXP (src, 1) != dest)
ec907dd8 990 new_reg_base_value[regno] = 0;
9ae8ffe7 991 break;
61f0131c
R
992 case PLUS:
993 /* If the value we add in the PLUS is also a valid base value,
994 this might be the actual base value, and the original value
995 an index. */
996 {
997 rtx other = NULL_RTX;
998
999 if (XEXP (src, 0) == dest)
1000 other = XEXP (src, 1);
1001 else if (XEXP (src, 1) == dest)
1002 other = XEXP (src, 0);
1003
1004 if (! other || find_base_value (other))
1005 new_reg_base_value[regno] = 0;
1006 break;
1007 }
9ae8ffe7
JL
1008 case AND:
1009 if (XEXP (src, 0) != dest || GET_CODE (XEXP (src, 1)) != CONST_INT)
ec907dd8 1010 new_reg_base_value[regno] = 0;
9ae8ffe7 1011 break;
9ae8ffe7 1012 default:
ec907dd8 1013 new_reg_base_value[regno] = 0;
9ae8ffe7
JL
1014 break;
1015 }
1016 /* If this is the first set of a register, record the value. */
1017 else if ((regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno])
ec907dd8
JL
1018 && ! reg_seen[regno] && new_reg_base_value[regno] == 0)
1019 new_reg_base_value[regno] = find_base_value (src);
9ae8ffe7
JL
1020
1021 reg_seen[regno] = 1;
1022}
1023
ac3d9668
RK
1024/* Called from loop optimization when a new pseudo-register is
1025 created. It indicates that REGNO is being set to VAL. f INVARIANT
1026 is true then this value also describes an invariant relationship
1027 which can be used to deduce that two registers with unknown values
1028 are different. */
d4b60170 1029
9ae8ffe7 1030void
4682ae04 1031record_base_value (unsigned int regno, rtx val, int invariant)
9ae8ffe7 1032{
ac3d9668 1033 if (regno >= reg_base_value_size)
9ae8ffe7 1034 return;
de12be17 1035
de12be17
JC
1036 if (invariant && alias_invariant)
1037 alias_invariant[regno] = val;
1038
9ae8ffe7
JL
1039 if (GET_CODE (val) == REG)
1040 {
fb6754f0
BS
1041 if (REGNO (val) < reg_base_value_size)
1042 reg_base_value[regno] = reg_base_value[REGNO (val)];
d4b60170 1043
9ae8ffe7
JL
1044 return;
1045 }
d4b60170 1046
9ae8ffe7
JL
1047 reg_base_value[regno] = find_base_value (val);
1048}
1049
43fe47ca
JW
1050/* Clear alias info for a register. This is used if an RTL transformation
1051 changes the value of a register. This is used in flow by AUTO_INC_DEC
1052 optimizations. We don't need to clear reg_base_value, since flow only
1053 changes the offset. */
1054
1055void
4682ae04 1056clear_reg_alias_info (rtx reg)
43fe47ca 1057{
4e1a4144
JW
1058 unsigned int regno = REGNO (reg);
1059
1060 if (regno < reg_known_value_size && regno >= FIRST_PSEUDO_REGISTER)
1061 reg_known_value[regno] = reg;
43fe47ca
JW
1062}
1063
db048faf
MM
1064/* Returns a canonical version of X, from the point of view alias
1065 analysis. (For example, if X is a MEM whose address is a register,
1066 and the register has a known value (say a SYMBOL_REF), then a MEM
1067 whose address is the SYMBOL_REF is returned.) */
1068
1069rtx
4682ae04 1070canon_rtx (rtx x)
9ae8ffe7
JL
1071{
1072 /* Recursively look for equivalences. */
fb6754f0
BS
1073 if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER
1074 && REGNO (x) < reg_known_value_size)
1075 return reg_known_value[REGNO (x)] == x
1076 ? x : canon_rtx (reg_known_value[REGNO (x)]);
9ae8ffe7
JL
1077 else if (GET_CODE (x) == PLUS)
1078 {
1079 rtx x0 = canon_rtx (XEXP (x, 0));
1080 rtx x1 = canon_rtx (XEXP (x, 1));
1081
1082 if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
1083 {
9ae8ffe7 1084 if (GET_CODE (x0) == CONST_INT)
ed8908e7 1085 return plus_constant (x1, INTVAL (x0));
9ae8ffe7 1086 else if (GET_CODE (x1) == CONST_INT)
ed8908e7 1087 return plus_constant (x0, INTVAL (x1));
38a448ca 1088 return gen_rtx_PLUS (GET_MODE (x), x0, x1);
9ae8ffe7
JL
1089 }
1090 }
d4b60170 1091
9ae8ffe7
JL
1092 /* This gives us much better alias analysis when called from
1093 the loop optimizer. Note we want to leave the original
1094 MEM alone, but need to return the canonicalized MEM with
1095 all the flags with their original values. */
1096 else if (GET_CODE (x) == MEM)
f1ec5147 1097 x = replace_equiv_address_nv (x, canon_rtx (XEXP (x, 0)));
d4b60170 1098
9ae8ffe7
JL
1099 return x;
1100}
1101
1102/* Return 1 if X and Y are identical-looking rtx's.
45183e03 1103 Expect that X and Y has been already canonicalized.
9ae8ffe7
JL
1104
1105 We use the data in reg_known_value above to see if two registers with
1106 different numbers are, in fact, equivalent. */
1107
1108static int
4682ae04 1109rtx_equal_for_memref_p (rtx x, rtx y)
9ae8ffe7 1110{
b3694847
SS
1111 int i;
1112 int j;
1113 enum rtx_code code;
1114 const char *fmt;
9ae8ffe7
JL
1115
1116 if (x == 0 && y == 0)
1117 return 1;
1118 if (x == 0 || y == 0)
1119 return 0;
d4b60170 1120
9ae8ffe7
JL
1121 if (x == y)
1122 return 1;
1123
1124 code = GET_CODE (x);
1125 /* Rtx's of different codes cannot be equal. */
1126 if (code != GET_CODE (y))
1127 return 0;
1128
1129 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1130 (REG:SI x) and (REG:HI x) are NOT equivalent. */
1131
1132 if (GET_MODE (x) != GET_MODE (y))
1133 return 0;
1134
db048faf
MM
1135 /* Some RTL can be compared without a recursive examination. */
1136 switch (code)
1137 {
ab59db3c
BS
1138 case VALUE:
1139 return CSELIB_VAL_PTR (x) == CSELIB_VAL_PTR (y);
1140
db048faf
MM
1141 case REG:
1142 return REGNO (x) == REGNO (y);
1143
1144 case LABEL_REF:
1145 return XEXP (x, 0) == XEXP (y, 0);
ca7fd9cd 1146
db048faf
MM
1147 case SYMBOL_REF:
1148 return XSTR (x, 0) == XSTR (y, 0);
1149
1150 case CONST_INT:
1151 case CONST_DOUBLE:
1152 /* There's no need to compare the contents of CONST_DOUBLEs or
1153 CONST_INTs because pointer equality is a good enough
1154 comparison for these nodes. */
1155 return 0;
1156
1157 case ADDRESSOF:
831ecbd4 1158 return (XINT (x, 1) == XINT (y, 1)
45183e03 1159 && rtx_equal_for_memref_p (XEXP (x, 0),
4682ae04 1160 XEXP (y, 0)));
db048faf
MM
1161
1162 default:
1163 break;
1164 }
9ae8ffe7 1165
45183e03
JH
1166 /* canon_rtx knows how to handle plus. No need to canonicalize. */
1167 if (code == PLUS)
9ae8ffe7
JL
1168 return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
1169 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
1170 || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
1171 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
45183e03
JH
1172 /* For commutative operations, the RTX match if the operand match in any
1173 order. Also handle the simple binary and unary cases without a loop. */
1174 if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
1175 {
1176 rtx xop0 = canon_rtx (XEXP (x, 0));
1177 rtx yop0 = canon_rtx (XEXP (y, 0));
1178 rtx yop1 = canon_rtx (XEXP (y, 1));
1179
1180 return ((rtx_equal_for_memref_p (xop0, yop0)
1181 && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)), yop1))
1182 || (rtx_equal_for_memref_p (xop0, yop1)
1183 && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)), yop0)));
1184 }
9ae8ffe7 1185 else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
45183e03
JH
1186 {
1187 return (rtx_equal_for_memref_p (canon_rtx (XEXP (x, 0)),
4682ae04 1188 canon_rtx (XEXP (y, 0)))
45183e03
JH
1189 && rtx_equal_for_memref_p (canon_rtx (XEXP (x, 1)),
1190 canon_rtx (XEXP (y, 1))));
1191 }
9ae8ffe7 1192 else if (GET_RTX_CLASS (code) == '1')
45183e03 1193 return rtx_equal_for_memref_p (canon_rtx (XEXP (x, 0)),
4682ae04 1194 canon_rtx (XEXP (y, 0)));
9ae8ffe7
JL
1195
1196 /* Compare the elements. If any pair of corresponding elements
de12be17
JC
1197 fail to match, return 0 for the whole things.
1198
1199 Limit cases to types which actually appear in addresses. */
9ae8ffe7
JL
1200
1201 fmt = GET_RTX_FORMAT (code);
1202 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1203 {
1204 switch (fmt[i])
1205 {
9ae8ffe7
JL
1206 case 'i':
1207 if (XINT (x, i) != XINT (y, i))
1208 return 0;
1209 break;
1210
9ae8ffe7
JL
1211 case 'E':
1212 /* Two vectors must have the same length. */
1213 if (XVECLEN (x, i) != XVECLEN (y, i))
1214 return 0;
1215
1216 /* And the corresponding elements must match. */
1217 for (j = 0; j < XVECLEN (x, i); j++)
45183e03
JH
1218 if (rtx_equal_for_memref_p (canon_rtx (XVECEXP (x, i, j)),
1219 canon_rtx (XVECEXP (y, i, j))) == 0)
9ae8ffe7
JL
1220 return 0;
1221 break;
1222
1223 case 'e':
45183e03
JH
1224 if (rtx_equal_for_memref_p (canon_rtx (XEXP (x, i)),
1225 canon_rtx (XEXP (y, i))) == 0)
9ae8ffe7
JL
1226 return 0;
1227 break;
1228
3237ac18
AH
1229 /* This can happen for asm operands. */
1230 case 's':
1231 if (strcmp (XSTR (x, i), XSTR (y, i)))
1232 return 0;
1233 break;
1234
aee21ba9
JL
1235 /* This can happen for an asm which clobbers memory. */
1236 case '0':
1237 break;
1238
9ae8ffe7
JL
1239 /* It is believed that rtx's at this level will never
1240 contain anything but integers and other rtx's,
1241 except for within LABEL_REFs and SYMBOL_REFs. */
1242 default:
1243 abort ();
1244 }
1245 }
1246 return 1;
1247}
1248
1249/* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
1250 X and return it, or return 0 if none found. */
1251
1252static rtx
4682ae04 1253find_symbolic_term (rtx x)
9ae8ffe7 1254{
b3694847
SS
1255 int i;
1256 enum rtx_code code;
1257 const char *fmt;
9ae8ffe7
JL
1258
1259 code = GET_CODE (x);
1260 if (code == SYMBOL_REF || code == LABEL_REF)
1261 return x;
1262 if (GET_RTX_CLASS (code) == 'o')
1263 return 0;
1264
1265 fmt = GET_RTX_FORMAT (code);
1266 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1267 {
1268 rtx t;
1269
1270 if (fmt[i] == 'e')
1271 {
1272 t = find_symbolic_term (XEXP (x, i));
1273 if (t != 0)
1274 return t;
1275 }
1276 else if (fmt[i] == 'E')
1277 break;
1278 }
1279 return 0;
1280}
1281
94f24ddc 1282rtx
4682ae04 1283find_base_term (rtx x)
9ae8ffe7 1284{
eab5c70a
BS
1285 cselib_val *val;
1286 struct elt_loc_list *l;
1287
b949ea8b
JW
1288#if defined (FIND_BASE_TERM)
1289 /* Try machine-dependent ways to find the base term. */
1290 x = FIND_BASE_TERM (x);
1291#endif
1292
9ae8ffe7
JL
1293 switch (GET_CODE (x))
1294 {
1295 case REG:
1296 return REG_BASE_VALUE (x);
1297
d288e53d
DE
1298 case TRUNCATE:
1299 if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (Pmode))
ca7fd9cd 1300 return 0;
d288e53d 1301 /* Fall through. */
9ae8ffe7 1302 case HIGH:
6d849a2a
JL
1303 case PRE_INC:
1304 case PRE_DEC:
1305 case POST_INC:
1306 case POST_DEC:
d288e53d
DE
1307 case PRE_MODIFY:
1308 case POST_MODIFY:
6d849a2a
JL
1309 return find_base_term (XEXP (x, 0));
1310
1abade85
RK
1311 case ZERO_EXTEND:
1312 case SIGN_EXTEND: /* Used for Alpha/NT pointers */
1313 {
1314 rtx temp = find_base_term (XEXP (x, 0));
1315
5ae6cd0d 1316 if (temp != 0 && CONSTANT_P (temp))
1abade85 1317 temp = convert_memory_address (Pmode, temp);
1abade85
RK
1318
1319 return temp;
1320 }
1321
eab5c70a
BS
1322 case VALUE:
1323 val = CSELIB_VAL_PTR (x);
1324 for (l = val->locs; l; l = l->next)
1325 if ((x = find_base_term (l->loc)) != 0)
1326 return x;
1327 return 0;
1328
9ae8ffe7
JL
1329 case CONST:
1330 x = XEXP (x, 0);
1331 if (GET_CODE (x) != PLUS && GET_CODE (x) != MINUS)
1332 return 0;
938d968e 1333 /* Fall through. */
9ae8ffe7
JL
1334 case LO_SUM:
1335 case PLUS:
1336 case MINUS:
1337 {
3c567fae
JL
1338 rtx tmp1 = XEXP (x, 0);
1339 rtx tmp2 = XEXP (x, 1);
1340
f5143c46 1341 /* This is a little bit tricky since we have to determine which of
3c567fae
JL
1342 the two operands represents the real base address. Otherwise this
1343 routine may return the index register instead of the base register.
1344
1345 That may cause us to believe no aliasing was possible, when in
1346 fact aliasing is possible.
1347
1348 We use a few simple tests to guess the base register. Additional
1349 tests can certainly be added. For example, if one of the operands
1350 is a shift or multiply, then it must be the index register and the
1351 other operand is the base register. */
ca7fd9cd 1352
b949ea8b
JW
1353 if (tmp1 == pic_offset_table_rtx && CONSTANT_P (tmp2))
1354 return find_base_term (tmp2);
1355
3c567fae
JL
1356 /* If either operand is known to be a pointer, then use it
1357 to determine the base term. */
3502dc9c 1358 if (REG_P (tmp1) && REG_POINTER (tmp1))
3c567fae
JL
1359 return find_base_term (tmp1);
1360
3502dc9c 1361 if (REG_P (tmp2) && REG_POINTER (tmp2))
3c567fae
JL
1362 return find_base_term (tmp2);
1363
1364 /* Neither operand was known to be a pointer. Go ahead and find the
1365 base term for both operands. */
1366 tmp1 = find_base_term (tmp1);
1367 tmp2 = find_base_term (tmp2);
1368
1369 /* If either base term is named object or a special address
1370 (like an argument or stack reference), then use it for the
1371 base term. */
d4b60170 1372 if (tmp1 != 0
3c567fae
JL
1373 && (GET_CODE (tmp1) == SYMBOL_REF
1374 || GET_CODE (tmp1) == LABEL_REF
1375 || (GET_CODE (tmp1) == ADDRESS
1376 && GET_MODE (tmp1) != VOIDmode)))
1377 return tmp1;
1378
d4b60170 1379 if (tmp2 != 0
3c567fae
JL
1380 && (GET_CODE (tmp2) == SYMBOL_REF
1381 || GET_CODE (tmp2) == LABEL_REF
1382 || (GET_CODE (tmp2) == ADDRESS
1383 && GET_MODE (tmp2) != VOIDmode)))
1384 return tmp2;
1385
1386 /* We could not determine which of the two operands was the
1387 base register and which was the index. So we can determine
1388 nothing from the base alias check. */
1389 return 0;
9ae8ffe7
JL
1390 }
1391
1392 case AND:
d288e53d
DE
1393 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) != 0)
1394 return find_base_term (XEXP (x, 0));
9ae8ffe7
JL
1395 return 0;
1396
1397 case SYMBOL_REF:
1398 case LABEL_REF:
1399 return x;
1400
d982e46e 1401 case ADDRESSOF:
bb07060a 1402 return REG_BASE_VALUE (frame_pointer_rtx);
d982e46e 1403
9ae8ffe7
JL
1404 default:
1405 return 0;
1406 }
1407}
1408
1409/* Return 0 if the addresses X and Y are known to point to different
1410 objects, 1 if they might be pointers to the same object. */
1411
1412static int
4682ae04
AJ
1413base_alias_check (rtx x, rtx y, enum machine_mode x_mode,
1414 enum machine_mode y_mode)
9ae8ffe7
JL
1415{
1416 rtx x_base = find_base_term (x);
1417 rtx y_base = find_base_term (y);
1418
1c72c7f6
JC
1419 /* If the address itself has no known base see if a known equivalent
1420 value has one. If either address still has no known base, nothing
1421 is known about aliasing. */
1422 if (x_base == 0)
1423 {
1424 rtx x_c;
d4b60170 1425
1c72c7f6
JC
1426 if (! flag_expensive_optimizations || (x_c = canon_rtx (x)) == x)
1427 return 1;
d4b60170 1428
1c72c7f6
JC
1429 x_base = find_base_term (x_c);
1430 if (x_base == 0)
1431 return 1;
1432 }
9ae8ffe7 1433
1c72c7f6
JC
1434 if (y_base == 0)
1435 {
1436 rtx y_c;
1437 if (! flag_expensive_optimizations || (y_c = canon_rtx (y)) == y)
1438 return 1;
d4b60170 1439
1c72c7f6
JC
1440 y_base = find_base_term (y_c);
1441 if (y_base == 0)
1442 return 1;
1443 }
1444
1445 /* If the base addresses are equal nothing is known about aliasing. */
1446 if (rtx_equal_p (x_base, y_base))
9ae8ffe7
JL
1447 return 1;
1448
ca7fd9cd 1449 /* The base addresses of the read and write are different expressions.
56ee9281
RH
1450 If they are both symbols and they are not accessed via AND, there is
1451 no conflict. We can bring knowledge of object alignment into play
1452 here. For example, on alpha, "char a, b;" can alias one another,
1453 though "char a; long b;" cannot. */
9ae8ffe7 1454 if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
c02f035f 1455 {
56ee9281
RH
1456 if (GET_CODE (x) == AND && GET_CODE (y) == AND)
1457 return 1;
1458 if (GET_CODE (x) == AND
1459 && (GET_CODE (XEXP (x, 1)) != CONST_INT
8fa2140d 1460 || (int) GET_MODE_UNIT_SIZE (y_mode) < -INTVAL (XEXP (x, 1))))
56ee9281
RH
1461 return 1;
1462 if (GET_CODE (y) == AND
1463 && (GET_CODE (XEXP (y, 1)) != CONST_INT
8fa2140d 1464 || (int) GET_MODE_UNIT_SIZE (x_mode) < -INTVAL (XEXP (y, 1))))
56ee9281 1465 return 1;
b2972551
JL
1466 /* Differing symbols never alias. */
1467 return 0;
c02f035f 1468 }
9ae8ffe7
JL
1469
1470 /* If one address is a stack reference there can be no alias:
1471 stack references using different base registers do not alias,
1472 a stack reference can not alias a parameter, and a stack reference
1473 can not alias a global. */
1474 if ((GET_CODE (x_base) == ADDRESS && GET_MODE (x_base) == Pmode)
1475 || (GET_CODE (y_base) == ADDRESS && GET_MODE (y_base) == Pmode))
1476 return 0;
1477
1478 if (! flag_argument_noalias)
1479 return 1;
1480
1481 if (flag_argument_noalias > 1)
1482 return 0;
1483
ec5c56db 1484 /* Weak noalias assertion (arguments are distinct, but may match globals). */
9ae8ffe7
JL
1485 return ! (GET_MODE (x_base) == VOIDmode && GET_MODE (y_base) == VOIDmode);
1486}
1487
eab5c70a
BS
1488/* Convert the address X into something we can use. This is done by returning
1489 it unchanged unless it is a value; in the latter case we call cselib to get
1490 a more useful rtx. */
3bdf5ad1 1491
a13d4ebf 1492rtx
4682ae04 1493get_addr (rtx x)
eab5c70a
BS
1494{
1495 cselib_val *v;
1496 struct elt_loc_list *l;
1497
1498 if (GET_CODE (x) != VALUE)
1499 return x;
1500 v = CSELIB_VAL_PTR (x);
1501 for (l = v->locs; l; l = l->next)
1502 if (CONSTANT_P (l->loc))
1503 return l->loc;
1504 for (l = v->locs; l; l = l->next)
1505 if (GET_CODE (l->loc) != REG && GET_CODE (l->loc) != MEM)
1506 return l->loc;
1507 if (v->locs)
1508 return v->locs->loc;
1509 return x;
1510}
1511
39cec1ac
MH
1512/* Return the address of the (N_REFS + 1)th memory reference to ADDR
1513 where SIZE is the size in bytes of the memory reference. If ADDR
1514 is not modified by the memory reference then ADDR is returned. */
1515
1516rtx
4682ae04 1517addr_side_effect_eval (rtx addr, int size, int n_refs)
39cec1ac
MH
1518{
1519 int offset = 0;
ca7fd9cd 1520
39cec1ac
MH
1521 switch (GET_CODE (addr))
1522 {
1523 case PRE_INC:
1524 offset = (n_refs + 1) * size;
1525 break;
1526 case PRE_DEC:
1527 offset = -(n_refs + 1) * size;
1528 break;
1529 case POST_INC:
1530 offset = n_refs * size;
1531 break;
1532 case POST_DEC:
1533 offset = -n_refs * size;
1534 break;
1535
1536 default:
1537 return addr;
1538 }
ca7fd9cd 1539
39cec1ac 1540 if (offset)
45183e03
JH
1541 addr = gen_rtx_PLUS (GET_MODE (addr), XEXP (addr, 0),
1542 GEN_INT (offset));
39cec1ac
MH
1543 else
1544 addr = XEXP (addr, 0);
45183e03 1545 addr = canon_rtx (addr);
39cec1ac
MH
1546
1547 return addr;
1548}
1549
9ae8ffe7
JL
1550/* Return nonzero if X and Y (memory addresses) could reference the
1551 same location in memory. C is an offset accumulator. When
1552 C is nonzero, we are testing aliases between X and Y + C.
1553 XSIZE is the size in bytes of the X reference,
1554 similarly YSIZE is the size in bytes for Y.
45183e03 1555 Expect that canon_rtx has been already called for X and Y.
9ae8ffe7
JL
1556
1557 If XSIZE or YSIZE is zero, we do not know the amount of memory being
1558 referenced (the reference was BLKmode), so make the most pessimistic
1559 assumptions.
1560
c02f035f
RH
1561 If XSIZE or YSIZE is negative, we may access memory outside the object
1562 being referenced as a side effect. This can happen when using AND to
1563 align memory references, as is done on the Alpha.
1564
9ae8ffe7 1565 Nice to notice that varying addresses cannot conflict with fp if no
0211b6ab 1566 local variables had their addresses taken, but that's too hard now. */
9ae8ffe7 1567
9ae8ffe7 1568static int
4682ae04 1569memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
9ae8ffe7 1570{
eab5c70a
BS
1571 if (GET_CODE (x) == VALUE)
1572 x = get_addr (x);
1573 if (GET_CODE (y) == VALUE)
1574 y = get_addr (y);
9ae8ffe7
JL
1575 if (GET_CODE (x) == HIGH)
1576 x = XEXP (x, 0);
1577 else if (GET_CODE (x) == LO_SUM)
1578 x = XEXP (x, 1);
1579 else
45183e03 1580 x = addr_side_effect_eval (x, xsize, 0);
9ae8ffe7
JL
1581 if (GET_CODE (y) == HIGH)
1582 y = XEXP (y, 0);
1583 else if (GET_CODE (y) == LO_SUM)
1584 y = XEXP (y, 1);
1585 else
45183e03 1586 y = addr_side_effect_eval (y, ysize, 0);
9ae8ffe7
JL
1587
1588 if (rtx_equal_for_memref_p (x, y))
1589 {
c02f035f 1590 if (xsize <= 0 || ysize <= 0)
9ae8ffe7
JL
1591 return 1;
1592 if (c >= 0 && xsize > c)
1593 return 1;
1594 if (c < 0 && ysize+c > 0)
1595 return 1;
1596 return 0;
1597 }
1598
6e73e666
JC
1599 /* This code used to check for conflicts involving stack references and
1600 globals but the base address alias code now handles these cases. */
9ae8ffe7
JL
1601
1602 if (GET_CODE (x) == PLUS)
1603 {
1604 /* The fact that X is canonicalized means that this
1605 PLUS rtx is canonicalized. */
1606 rtx x0 = XEXP (x, 0);
1607 rtx x1 = XEXP (x, 1);
1608
1609 if (GET_CODE (y) == PLUS)
1610 {
1611 /* The fact that Y is canonicalized means that this
1612 PLUS rtx is canonicalized. */
1613 rtx y0 = XEXP (y, 0);
1614 rtx y1 = XEXP (y, 1);
1615
1616 if (rtx_equal_for_memref_p (x1, y1))
1617 return memrefs_conflict_p (xsize, x0, ysize, y0, c);
1618 if (rtx_equal_for_memref_p (x0, y0))
1619 return memrefs_conflict_p (xsize, x1, ysize, y1, c);
1620 if (GET_CODE (x1) == CONST_INT)
63be02db
JM
1621 {
1622 if (GET_CODE (y1) == CONST_INT)
1623 return memrefs_conflict_p (xsize, x0, ysize, y0,
1624 c - INTVAL (x1) + INTVAL (y1));
1625 else
1626 return memrefs_conflict_p (xsize, x0, ysize, y,
1627 c - INTVAL (x1));
1628 }
9ae8ffe7
JL
1629 else if (GET_CODE (y1) == CONST_INT)
1630 return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
1631
6e73e666 1632 return 1;
9ae8ffe7
JL
1633 }
1634 else if (GET_CODE (x1) == CONST_INT)
1635 return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
1636 }
1637 else if (GET_CODE (y) == PLUS)
1638 {
1639 /* The fact that Y is canonicalized means that this
1640 PLUS rtx is canonicalized. */
1641 rtx y0 = XEXP (y, 0);
1642 rtx y1 = XEXP (y, 1);
1643
1644 if (GET_CODE (y1) == CONST_INT)
1645 return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
1646 else
1647 return 1;
1648 }
1649
1650 if (GET_CODE (x) == GET_CODE (y))
1651 switch (GET_CODE (x))
1652 {
1653 case MULT:
1654 {
1655 /* Handle cases where we expect the second operands to be the
1656 same, and check only whether the first operand would conflict
1657 or not. */
1658 rtx x0, y0;
1659 rtx x1 = canon_rtx (XEXP (x, 1));
1660 rtx y1 = canon_rtx (XEXP (y, 1));
1661 if (! rtx_equal_for_memref_p (x1, y1))
1662 return 1;
1663 x0 = canon_rtx (XEXP (x, 0));
1664 y0 = canon_rtx (XEXP (y, 0));
1665 if (rtx_equal_for_memref_p (x0, y0))
1666 return (xsize == 0 || ysize == 0
1667 || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
1668
1669 /* Can't properly adjust our sizes. */
1670 if (GET_CODE (x1) != CONST_INT)
1671 return 1;
1672 xsize /= INTVAL (x1);
1673 ysize /= INTVAL (x1);
1674 c /= INTVAL (x1);
1675 return memrefs_conflict_p (xsize, x0, ysize, y0, c);
1676 }
1d300e19 1677
de12be17
JC
1678 case REG:
1679 /* Are these registers known not to be equal? */
1680 if (alias_invariant)
1681 {
e51712db 1682 unsigned int r_x = REGNO (x), r_y = REGNO (y);
de12be17
JC
1683 rtx i_x, i_y; /* invariant relationships of X and Y */
1684
1685 i_x = r_x >= reg_base_value_size ? 0 : alias_invariant[r_x];
1686 i_y = r_y >= reg_base_value_size ? 0 : alias_invariant[r_y];
1687
1688 if (i_x == 0 && i_y == 0)
1689 break;
1690
1691 if (! memrefs_conflict_p (xsize, i_x ? i_x : x,
1692 ysize, i_y ? i_y : y, c))
1693 return 0;
1694 }
1695 break;
1696
1d300e19
KG
1697 default:
1698 break;
9ae8ffe7
JL
1699 }
1700
1701 /* Treat an access through an AND (e.g. a subword access on an Alpha)
ca7fd9cd 1702 as an access with indeterminate size. Assume that references
56ee9281
RH
1703 besides AND are aligned, so if the size of the other reference is
1704 at least as large as the alignment, assume no other overlap. */
9ae8ffe7 1705 if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT)
56ee9281 1706 {
02e3377d 1707 if (GET_CODE (y) == AND || ysize < -INTVAL (XEXP (x, 1)))
56ee9281 1708 xsize = -1;
45183e03 1709 return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)), ysize, y, c);
56ee9281 1710 }
9ae8ffe7 1711 if (GET_CODE (y) == AND && GET_CODE (XEXP (y, 1)) == CONST_INT)
c02f035f 1712 {
56ee9281 1713 /* ??? If we are indexing far enough into the array/structure, we
ca7fd9cd 1714 may yet be able to determine that we can not overlap. But we
c02f035f 1715 also need to that we are far enough from the end not to overlap
56ee9281 1716 a following reference, so we do nothing with that for now. */
02e3377d 1717 if (GET_CODE (x) == AND || xsize < -INTVAL (XEXP (y, 1)))
56ee9281 1718 ysize = -1;
45183e03 1719 return memrefs_conflict_p (xsize, x, ysize, canon_rtx (XEXP (y, 0)), c);
c02f035f 1720 }
9ae8ffe7 1721
b24ea077
JW
1722 if (GET_CODE (x) == ADDRESSOF)
1723 {
1724 if (y == frame_pointer_rtx
1725 || GET_CODE (y) == ADDRESSOF)
1726 return xsize <= 0 || ysize <= 0;
1727 }
1728 if (GET_CODE (y) == ADDRESSOF)
1729 {
1730 if (x == frame_pointer_rtx)
1731 return xsize <= 0 || ysize <= 0;
1732 }
d982e46e 1733
9ae8ffe7
JL
1734 if (CONSTANT_P (x))
1735 {
1736 if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
1737 {
1738 c += (INTVAL (y) - INTVAL (x));
c02f035f 1739 return (xsize <= 0 || ysize <= 0
9ae8ffe7
JL
1740 || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
1741 }
1742
1743 if (GET_CODE (x) == CONST)
1744 {
1745 if (GET_CODE (y) == CONST)
1746 return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
1747 ysize, canon_rtx (XEXP (y, 0)), c);
1748 else
1749 return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
1750 ysize, y, c);
1751 }
1752 if (GET_CODE (y) == CONST)
1753 return memrefs_conflict_p (xsize, x, ysize,
1754 canon_rtx (XEXP (y, 0)), c);
1755
1756 if (CONSTANT_P (y))
b949ea8b 1757 return (xsize <= 0 || ysize <= 0
c02f035f 1758 || (rtx_equal_for_memref_p (x, y)
b949ea8b 1759 && ((c >= 0 && xsize > c) || (c < 0 && ysize+c > 0))));
9ae8ffe7
JL
1760
1761 return 1;
1762 }
1763 return 1;
1764}
1765
1766/* Functions to compute memory dependencies.
1767
1768 Since we process the insns in execution order, we can build tables
1769 to keep track of what registers are fixed (and not aliased), what registers
1770 are varying in known ways, and what registers are varying in unknown
1771 ways.
1772
1773 If both memory references are volatile, then there must always be a
1774 dependence between the two references, since their order can not be
1775 changed. A volatile and non-volatile reference can be interchanged
ca7fd9cd 1776 though.
9ae8ffe7 1777
dc1618bc
RK
1778 A MEM_IN_STRUCT reference at a non-AND varying address can never
1779 conflict with a non-MEM_IN_STRUCT reference at a fixed address. We
1780 also must allow AND addresses, because they may generate accesses
1781 outside the object being referenced. This is used to generate
1782 aligned addresses from unaligned addresses, for instance, the alpha
1783 storeqi_unaligned pattern. */
9ae8ffe7
JL
1784
1785/* Read dependence: X is read after read in MEM takes place. There can
1786 only be a dependence here if both reads are volatile. */
1787
1788int
4682ae04 1789read_dependence (rtx mem, rtx x)
9ae8ffe7
JL
1790{
1791 return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
1792}
1793
c6df88cb
MM
1794/* Returns MEM1 if and only if MEM1 is a scalar at a fixed address and
1795 MEM2 is a reference to a structure at a varying address, or returns
1796 MEM2 if vice versa. Otherwise, returns NULL_RTX. If a non-NULL
1797 value is returned MEM1 and MEM2 can never alias. VARIES_P is used
1798 to decide whether or not an address may vary; it should return
eab5c70a
BS
1799 nonzero whenever variation is possible.
1800 MEM1_ADDR and MEM2_ADDR are the addresses of MEM1 and MEM2. */
ca7fd9cd 1801
2c72b78f 1802static rtx
4682ae04
AJ
1803fixed_scalar_and_varying_struct_p (rtx mem1, rtx mem2, rtx mem1_addr,
1804 rtx mem2_addr,
1805 int (*varies_p) (rtx, int))
ca7fd9cd 1806{
3e0abe15
GK
1807 if (! flag_strict_aliasing)
1808 return NULL_RTX;
1809
ca7fd9cd 1810 if (MEM_SCALAR_P (mem1) && MEM_IN_STRUCT_P (mem2)
e38fe8e0 1811 && !varies_p (mem1_addr, 1) && varies_p (mem2_addr, 1))
c6df88cb
MM
1812 /* MEM1 is a scalar at a fixed address; MEM2 is a struct at a
1813 varying address. */
1814 return mem1;
1815
ca7fd9cd 1816 if (MEM_IN_STRUCT_P (mem1) && MEM_SCALAR_P (mem2)
e38fe8e0 1817 && varies_p (mem1_addr, 1) && !varies_p (mem2_addr, 1))
c6df88cb
MM
1818 /* MEM2 is a scalar at a fixed address; MEM1 is a struct at a
1819 varying address. */
1820 return mem2;
1821
1822 return NULL_RTX;
1823}
1824
1825/* Returns nonzero if something about the mode or address format MEM1
1826 indicates that it might well alias *anything*. */
1827
2c72b78f 1828static int
4682ae04 1829aliases_everything_p (rtx mem)
c6df88cb 1830{
c6df88cb
MM
1831 if (GET_CODE (XEXP (mem, 0)) == AND)
1832 /* If the address is an AND, its very hard to know at what it is
1833 actually pointing. */
1834 return 1;
ca7fd9cd 1835
c6df88cb
MM
1836 return 0;
1837}
1838
998d7deb
RH
1839/* Return true if we can determine that the fields referenced cannot
1840 overlap for any pair of objects. */
1841
1842static bool
4682ae04 1843nonoverlapping_component_refs_p (tree x, tree y)
998d7deb
RH
1844{
1845 tree fieldx, fieldy, typex, typey, orig_y;
1846
1847 do
1848 {
1849 /* The comparison has to be done at a common type, since we don't
d6a7951f 1850 know how the inheritance hierarchy works. */
998d7deb
RH
1851 orig_y = y;
1852 do
1853 {
1854 fieldx = TREE_OPERAND (x, 1);
1855 typex = DECL_FIELD_CONTEXT (fieldx);
1856
1857 y = orig_y;
1858 do
1859 {
1860 fieldy = TREE_OPERAND (y, 1);
1861 typey = DECL_FIELD_CONTEXT (fieldy);
1862
1863 if (typex == typey)
1864 goto found;
1865
1866 y = TREE_OPERAND (y, 0);
1867 }
1868 while (y && TREE_CODE (y) == COMPONENT_REF);
1869
1870 x = TREE_OPERAND (x, 0);
1871 }
1872 while (x && TREE_CODE (x) == COMPONENT_REF);
1873
1874 /* Never found a common type. */
1875 return false;
1876
1877 found:
1878 /* If we're left with accessing different fields of a structure,
1879 then no overlap. */
1880 if (TREE_CODE (typex) == RECORD_TYPE
1881 && fieldx != fieldy)
1882 return true;
1883
1884 /* The comparison on the current field failed. If we're accessing
1885 a very nested structure, look at the next outer level. */
1886 x = TREE_OPERAND (x, 0);
1887 y = TREE_OPERAND (y, 0);
1888 }
1889 while (x && y
1890 && TREE_CODE (x) == COMPONENT_REF
1891 && TREE_CODE (y) == COMPONENT_REF);
ca7fd9cd 1892
998d7deb
RH
1893 return false;
1894}
1895
1896/* Look at the bottom of the COMPONENT_REF list for a DECL, and return it. */
1897
1898static tree
4682ae04 1899decl_for_component_ref (tree x)
998d7deb
RH
1900{
1901 do
1902 {
1903 x = TREE_OPERAND (x, 0);
1904 }
1905 while (x && TREE_CODE (x) == COMPONENT_REF);
1906
1907 return x && DECL_P (x) ? x : NULL_TREE;
1908}
1909
1910/* Walk up the COMPONENT_REF list and adjust OFFSET to compensate for the
1911 offset of the field reference. */
1912
1913static rtx
4682ae04 1914adjust_offset_for_component_ref (tree x, rtx offset)
998d7deb
RH
1915{
1916 HOST_WIDE_INT ioffset;
1917
1918 if (! offset)
1919 return NULL_RTX;
1920
1921 ioffset = INTVAL (offset);
ca7fd9cd 1922 do
998d7deb
RH
1923 {
1924 tree field = TREE_OPERAND (x, 1);
1925
1926 if (! host_integerp (DECL_FIELD_OFFSET (field), 1))
1927 return NULL_RTX;
1928 ioffset += (tree_low_cst (DECL_FIELD_OFFSET (field), 1)
1929 + (tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
1930 / BITS_PER_UNIT));
1931
1932 x = TREE_OPERAND (x, 0);
1933 }
1934 while (x && TREE_CODE (x) == COMPONENT_REF);
1935
1936 return GEN_INT (ioffset);
1937}
1938
95bd1dd7 1939/* Return nonzero if we can determine the exprs corresponding to memrefs
a4311dfe
RK
1940 X and Y and they do not overlap. */
1941
1942static int
4682ae04 1943nonoverlapping_memrefs_p (rtx x, rtx y)
a4311dfe 1944{
998d7deb 1945 tree exprx = MEM_EXPR (x), expry = MEM_EXPR (y);
a4311dfe
RK
1946 rtx rtlx, rtly;
1947 rtx basex, basey;
998d7deb 1948 rtx moffsetx, moffsety;
a4311dfe
RK
1949 HOST_WIDE_INT offsetx = 0, offsety = 0, sizex, sizey, tem;
1950
998d7deb
RH
1951 /* Unless both have exprs, we can't tell anything. */
1952 if (exprx == 0 || expry == 0)
1953 return 0;
1954
1955 /* If both are field references, we may be able to determine something. */
1956 if (TREE_CODE (exprx) == COMPONENT_REF
1957 && TREE_CODE (expry) == COMPONENT_REF
1958 && nonoverlapping_component_refs_p (exprx, expry))
1959 return 1;
1960
1961 /* If the field reference test failed, look at the DECLs involved. */
1962 moffsetx = MEM_OFFSET (x);
1963 if (TREE_CODE (exprx) == COMPONENT_REF)
1964 {
1965 tree t = decl_for_component_ref (exprx);
1966 if (! t)
1967 return 0;
1968 moffsetx = adjust_offset_for_component_ref (exprx, moffsetx);
1969 exprx = t;
1970 }
c67a1cf6
RH
1971 else if (TREE_CODE (exprx) == INDIRECT_REF)
1972 {
1973 exprx = TREE_OPERAND (exprx, 0);
1974 if (flag_argument_noalias < 2
1975 || TREE_CODE (exprx) != PARM_DECL)
1976 return 0;
1977 }
1978
998d7deb
RH
1979 moffsety = MEM_OFFSET (y);
1980 if (TREE_CODE (expry) == COMPONENT_REF)
1981 {
1982 tree t = decl_for_component_ref (expry);
1983 if (! t)
1984 return 0;
1985 moffsety = adjust_offset_for_component_ref (expry, moffsety);
1986 expry = t;
1987 }
c67a1cf6
RH
1988 else if (TREE_CODE (expry) == INDIRECT_REF)
1989 {
1990 expry = TREE_OPERAND (expry, 0);
1991 if (flag_argument_noalias < 2
1992 || TREE_CODE (expry) != PARM_DECL)
1993 return 0;
1994 }
998d7deb
RH
1995
1996 if (! DECL_P (exprx) || ! DECL_P (expry))
a4311dfe
RK
1997 return 0;
1998
998d7deb
RH
1999 rtlx = DECL_RTL (exprx);
2000 rtly = DECL_RTL (expry);
a4311dfe 2001
1edcd60b
RK
2002 /* If either RTL is not a MEM, it must be a REG or CONCAT, meaning they
2003 can't overlap unless they are the same because we never reuse that part
2004 of the stack frame used for locals for spilled pseudos. */
2005 if ((GET_CODE (rtlx) != MEM || GET_CODE (rtly) != MEM)
2006 && ! rtx_equal_p (rtlx, rtly))
a4311dfe
RK
2007 return 1;
2008
2009 /* Get the base and offsets of both decls. If either is a register, we
2010 know both are and are the same, so use that as the base. The only
2011 we can avoid overlap is if we can deduce that they are nonoverlapping
2012 pieces of that decl, which is very rare. */
1edcd60b 2013 basex = GET_CODE (rtlx) == MEM ? XEXP (rtlx, 0) : rtlx;
a4311dfe
RK
2014 if (GET_CODE (basex) == PLUS && GET_CODE (XEXP (basex, 1)) == CONST_INT)
2015 offsetx = INTVAL (XEXP (basex, 1)), basex = XEXP (basex, 0);
2016
1edcd60b 2017 basey = GET_CODE (rtly) == MEM ? XEXP (rtly, 0) : rtly;
a4311dfe
RK
2018 if (GET_CODE (basey) == PLUS && GET_CODE (XEXP (basey, 1)) == CONST_INT)
2019 offsety = INTVAL (XEXP (basey, 1)), basey = XEXP (basey, 0);
2020
d746694a 2021 /* If the bases are different, we know they do not overlap if both
ca7fd9cd 2022 are constants or if one is a constant and the other a pointer into the
d746694a
RK
2023 stack frame. Otherwise a different base means we can't tell if they
2024 overlap or not. */
2025 if (! rtx_equal_p (basex, basey))
ca7fd9cd
KH
2026 return ((CONSTANT_P (basex) && CONSTANT_P (basey))
2027 || (CONSTANT_P (basex) && REG_P (basey)
2028 && REGNO_PTR_FRAME_P (REGNO (basey)))
2029 || (CONSTANT_P (basey) && REG_P (basex)
2030 && REGNO_PTR_FRAME_P (REGNO (basex))));
a4311dfe 2031
998d7deb 2032 sizex = (GET_CODE (rtlx) != MEM ? (int) GET_MODE_SIZE (GET_MODE (rtlx))
a4311dfe
RK
2033 : MEM_SIZE (rtlx) ? INTVAL (MEM_SIZE (rtlx))
2034 : -1);
998d7deb 2035 sizey = (GET_CODE (rtly) != MEM ? (int) GET_MODE_SIZE (GET_MODE (rtly))
a4311dfe
RK
2036 : MEM_SIZE (rtly) ? INTVAL (MEM_SIZE (rtly)) :
2037 -1);
2038
0af5bc3e
RK
2039 /* If we have an offset for either memref, it can update the values computed
2040 above. */
998d7deb
RH
2041 if (moffsetx)
2042 offsetx += INTVAL (moffsetx), sizex -= INTVAL (moffsetx);
2043 if (moffsety)
2044 offsety += INTVAL (moffsety), sizey -= INTVAL (moffsety);
a4311dfe 2045
0af5bc3e 2046 /* If a memref has both a size and an offset, we can use the smaller size.
efc981bb 2047 We can't do this if the offset isn't known because we must view this
0af5bc3e 2048 memref as being anywhere inside the DECL's MEM. */
998d7deb 2049 if (MEM_SIZE (x) && moffsetx)
a4311dfe 2050 sizex = INTVAL (MEM_SIZE (x));
998d7deb 2051 if (MEM_SIZE (y) && moffsety)
a4311dfe
RK
2052 sizey = INTVAL (MEM_SIZE (y));
2053
2054 /* Put the values of the memref with the lower offset in X's values. */
2055 if (offsetx > offsety)
2056 {
2057 tem = offsetx, offsetx = offsety, offsety = tem;
2058 tem = sizex, sizex = sizey, sizey = tem;
2059 }
2060
2061 /* If we don't know the size of the lower-offset value, we can't tell
2062 if they conflict. Otherwise, we do the test. */
a6f7c915 2063 return sizex >= 0 && offsety >= offsetx + sizex;
a4311dfe
RK
2064}
2065
9ae8ffe7
JL
2066/* True dependence: X is read after store in MEM takes place. */
2067
2068int
4682ae04
AJ
2069true_dependence (rtx mem, enum machine_mode mem_mode, rtx x,
2070 int (*varies) (rtx, int))
9ae8ffe7 2071{
b3694847 2072 rtx x_addr, mem_addr;
49982682 2073 rtx base;
9ae8ffe7
JL
2074
2075 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
2076 return 1;
2077
c4484b8f
RH
2078 /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
2079 This is used in epilogue deallocation functions. */
2080 if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
2081 return 1;
2082 if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
2083 return 1;
2084
41472af8
MM
2085 if (DIFFERENT_ALIAS_SETS_P (x, mem))
2086 return 0;
2087
b949ea8b
JW
2088 /* Unchanging memory can't conflict with non-unchanging memory.
2089 A non-unchanging read can conflict with a non-unchanging write.
2090 An unchanging read can conflict with an unchanging write since
2091 there may be a single store to this address to initialize it.
ec569656
RK
2092 Note that an unchanging store can conflict with a non-unchanging read
2093 since we have to make conservative assumptions when we have a
2094 record with readonly fields and we are copying the whole thing.
b949ea8b
JW
2095 Just fall through to the code below to resolve potential conflicts.
2096 This won't handle all cases optimally, but the possible performance
2097 loss should be negligible. */
ec569656 2098 if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
9ae8ffe7
JL
2099 return 0;
2100
a4311dfe
RK
2101 if (nonoverlapping_memrefs_p (mem, x))
2102 return 0;
2103
56ee9281
RH
2104 if (mem_mode == VOIDmode)
2105 mem_mode = GET_MODE (mem);
2106
eab5c70a
BS
2107 x_addr = get_addr (XEXP (x, 0));
2108 mem_addr = get_addr (XEXP (mem, 0));
2109
55efb413
JW
2110 base = find_base_term (x_addr);
2111 if (base && (GET_CODE (base) == LABEL_REF
2112 || (GET_CODE (base) == SYMBOL_REF
2113 && CONSTANT_POOL_ADDRESS_P (base))))
2114 return 0;
2115
eab5c70a 2116 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
1c72c7f6
JC
2117 return 0;
2118
eab5c70a
BS
2119 x_addr = canon_rtx (x_addr);
2120 mem_addr = canon_rtx (mem_addr);
6e73e666 2121
0211b6ab
JW
2122 if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
2123 SIZE_FOR_MODE (x), x_addr, 0))
2124 return 0;
2125
c6df88cb 2126 if (aliases_everything_p (x))
0211b6ab
JW
2127 return 1;
2128
f5143c46 2129 /* We cannot use aliases_everything_p to test MEM, since we must look
c6df88cb
MM
2130 at MEM_MODE, rather than GET_MODE (MEM). */
2131 if (mem_mode == QImode || GET_CODE (mem_addr) == AND)
a13d4ebf
AM
2132 return 1;
2133
2134 /* In true_dependence we also allow BLKmode to alias anything. Why
2135 don't we do this in anti_dependence and output_dependence? */
2136 if (mem_mode == BLKmode || GET_MODE (x) == BLKmode)
2137 return 1;
2138
2139 return ! fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr,
2140 varies);
2141}
2142
2143/* Canonical true dependence: X is read after store in MEM takes place.
ca7fd9cd
KH
2144 Variant of true_dependence which assumes MEM has already been
2145 canonicalized (hence we no longer do that here).
2146 The mem_addr argument has been added, since true_dependence computed
a13d4ebf
AM
2147 this value prior to canonicalizing. */
2148
2149int
4682ae04
AJ
2150canon_true_dependence (rtx mem, enum machine_mode mem_mode, rtx mem_addr,
2151 rtx x, int (*varies) (rtx, int))
a13d4ebf 2152{
b3694847 2153 rtx x_addr;
a13d4ebf
AM
2154
2155 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
2156 return 1;
2157
0fe854a7
RH
2158 /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
2159 This is used in epilogue deallocation functions. */
2160 if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
2161 return 1;
2162 if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
2163 return 1;
2164
a13d4ebf
AM
2165 if (DIFFERENT_ALIAS_SETS_P (x, mem))
2166 return 0;
2167
2168 /* If X is an unchanging read, then it can't possibly conflict with any
2169 non-unchanging store. It may conflict with an unchanging write though,
2170 because there may be a single store to this address to initialize it.
2171 Just fall through to the code below to resolve the case where we have
2172 both an unchanging read and an unchanging write. This won't handle all
2173 cases optimally, but the possible performance loss should be
2174 negligible. */
2175 if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
2176 return 0;
2177
a4311dfe
RK
2178 if (nonoverlapping_memrefs_p (x, mem))
2179 return 0;
2180
a13d4ebf
AM
2181 x_addr = get_addr (XEXP (x, 0));
2182
2183 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
2184 return 0;
2185
2186 x_addr = canon_rtx (x_addr);
2187 if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
2188 SIZE_FOR_MODE (x), x_addr, 0))
2189 return 0;
2190
2191 if (aliases_everything_p (x))
2192 return 1;
2193
f5143c46 2194 /* We cannot use aliases_everything_p to test MEM, since we must look
a13d4ebf
AM
2195 at MEM_MODE, rather than GET_MODE (MEM). */
2196 if (mem_mode == QImode || GET_CODE (mem_addr) == AND)
c6df88cb 2197 return 1;
0211b6ab 2198
c6df88cb
MM
2199 /* In true_dependence we also allow BLKmode to alias anything. Why
2200 don't we do this in anti_dependence and output_dependence? */
2201 if (mem_mode == BLKmode || GET_MODE (x) == BLKmode)
2202 return 1;
0211b6ab 2203
eab5c70a
BS
2204 return ! fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr,
2205 varies);
9ae8ffe7
JL
2206}
2207
da7d8304 2208/* Returns nonzero if a write to X might alias a previous read from
83a00410 2209 (or, if WRITEP is nonzero, a write to) MEM. If CONSTP is nonzero,
d2399d75 2210 honor the RTX_UNCHANGING_P flags on X and MEM. */
9ae8ffe7 2211
2c72b78f 2212static int
d2399d75 2213write_dependence_p (rtx mem, rtx x, int writep, int constp)
9ae8ffe7 2214{
6e73e666 2215 rtx x_addr, mem_addr;
c6df88cb 2216 rtx fixed_scalar;
49982682 2217 rtx base;
6e73e666 2218
9ae8ffe7
JL
2219 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
2220 return 1;
2221
c4484b8f
RH
2222 /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
2223 This is used in epilogue deallocation functions. */
2224 if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
2225 return 1;
2226 if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
2227 return 1;
2228
eab5c70a
BS
2229 if (DIFFERENT_ALIAS_SETS_P (x, mem))
2230 return 0;
2231
d2399d75
RS
2232 if (constp)
2233 {
2234 /* Unchanging memory can't conflict with non-unchanging memory. */
2235 if (RTX_UNCHANGING_P (x) != RTX_UNCHANGING_P (mem))
2236 return 0;
b949ea8b 2237
d2399d75
RS
2238 /* If MEM is an unchanging read, then it can't possibly conflict with
2239 the store to X, because there is at most one store to MEM, and it
2240 must have occurred somewhere before MEM. */
2241 if (! writep && RTX_UNCHANGING_P (mem))
2242 return 0;
2243 }
55efb413 2244
a4311dfe
RK
2245 if (nonoverlapping_memrefs_p (x, mem))
2246 return 0;
2247
55efb413
JW
2248 x_addr = get_addr (XEXP (x, 0));
2249 mem_addr = get_addr (XEXP (mem, 0));
2250
49982682
JW
2251 if (! writep)
2252 {
55efb413 2253 base = find_base_term (mem_addr);
49982682
JW
2254 if (base && (GET_CODE (base) == LABEL_REF
2255 || (GET_CODE (base) == SYMBOL_REF
2256 && CONSTANT_POOL_ADDRESS_P (base))))
2257 return 0;
2258 }
2259
eab5c70a
BS
2260 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x),
2261 GET_MODE (mem)))
41472af8
MM
2262 return 0;
2263
eab5c70a
BS
2264 x_addr = canon_rtx (x_addr);
2265 mem_addr = canon_rtx (mem_addr);
6e73e666 2266
c6df88cb
MM
2267 if (!memrefs_conflict_p (SIZE_FOR_MODE (mem), mem_addr,
2268 SIZE_FOR_MODE (x), x_addr, 0))
2269 return 0;
2270
ca7fd9cd 2271 fixed_scalar
eab5c70a
BS
2272 = fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr,
2273 rtx_addr_varies_p);
2274
c6df88cb
MM
2275 return (!(fixed_scalar == mem && !aliases_everything_p (x))
2276 && !(fixed_scalar == x && !aliases_everything_p (mem)));
2277}
2278
2279/* Anti dependence: X is written after read in MEM takes place. */
2280
2281int
4682ae04 2282anti_dependence (rtx mem, rtx x)
c6df88cb 2283{
d2399d75 2284 return write_dependence_p (mem, x, /*writep=*/0, /*constp*/1);
9ae8ffe7
JL
2285}
2286
2287/* Output dependence: X is written after store in MEM takes place. */
2288
2289int
4682ae04 2290output_dependence (rtx mem, rtx x)
9ae8ffe7 2291{
d2399d75
RS
2292 return write_dependence_p (mem, x, /*writep=*/1, /*constp*/1);
2293}
2294
2295/* Unchanging anti dependence: Like anti_dependence but ignores
2296 the UNCHANGING_RTX_P property on const variable references. */
2297
2298int
2299unchanging_anti_dependence (rtx mem, rtx x)
2300{
2301 return write_dependence_p (mem, x, /*writep=*/0, /*constp*/0);
9ae8ffe7 2302}
c14b9960
JW
2303\f
2304/* A subroutine of nonlocal_mentioned_p, returns 1 if *LOC mentions
2305 something which is not local to the function and is not constant. */
7790df19
JW
2306
2307static int
4682ae04 2308nonlocal_mentioned_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
7790df19 2309{
c14b9960 2310 rtx x = *loc;
7790df19 2311 rtx base;
7790df19
JW
2312 int regno;
2313
c14b9960
JW
2314 if (! x)
2315 return 0;
7790df19 2316
c14b9960 2317 switch (GET_CODE (x))
7790df19
JW
2318 {
2319 case SUBREG:
2320 if (GET_CODE (SUBREG_REG (x)) == REG)
2321 {
2322 /* Global registers are not local. */
2323 if (REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER
ddef6bc7 2324 && global_regs[subreg_regno (x)])
7790df19
JW
2325 return 1;
2326 return 0;
2327 }
2328 break;
2329
2330 case REG:
2331 regno = REGNO (x);
2332 /* Global registers are not local. */
2333 if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
2334 return 1;
2335 return 0;
2336
2337 case SCRATCH:
2338 case PC:
2339 case CC0:
2340 case CONST_INT:
2341 case CONST_DOUBLE:
69ef87e2 2342 case CONST_VECTOR:
7790df19
JW
2343 case CONST:
2344 case LABEL_REF:
2345 return 0;
2346
2347 case SYMBOL_REF:
2348 /* Constants in the function's constants pool are constant. */
2349 if (CONSTANT_POOL_ADDRESS_P (x))
2350 return 0;
2351 return 1;
2352
2353 case CALL:
bf6d9fd7 2354 /* Non-constant calls and recursion are not local. */
7790df19
JW
2355 return 1;
2356
2357 case MEM:
2358 /* Be overly conservative and consider any volatile memory
2359 reference as not local. */
2360 if (MEM_VOLATILE_P (x))
2361 return 1;
2362 base = find_base_term (XEXP (x, 0));
2363 if (base)
2364 {
b3b5ad95
JL
2365 /* A Pmode ADDRESS could be a reference via the structure value
2366 address or static chain. Such memory references are nonlocal.
2367
2368 Thus, we have to examine the contents of the ADDRESS to find
2369 out if this is a local reference or not. */
2370 if (GET_CODE (base) == ADDRESS
2371 && GET_MODE (base) == Pmode
2372 && (XEXP (base, 0) == stack_pointer_rtx
2373 || XEXP (base, 0) == arg_pointer_rtx
2374#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
2375 || XEXP (base, 0) == hard_frame_pointer_rtx
2376#endif
2377 || XEXP (base, 0) == frame_pointer_rtx))
7790df19
JW
2378 return 0;
2379 /* Constants in the function's constant pool are constant. */
2380 if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
2381 return 0;
2382 }
2383 return 1;
2384
bf6d9fd7 2385 case UNSPEC_VOLATILE:
7790df19 2386 case ASM_INPUT:
7790df19
JW
2387 return 1;
2388
bf6d9fd7
JW
2389 case ASM_OPERANDS:
2390 if (MEM_VOLATILE_P (x))
2391 return 1;
2392
5d3cc252 2393 /* Fall through. */
bf6d9fd7 2394
7790df19
JW
2395 default:
2396 break;
2397 }
2398
c14b9960
JW
2399 return 0;
2400}
2401
da7d8304 2402/* Returns nonzero if X might mention something which is not
c14b9960 2403 local to the function and is not constant. */
7790df19 2404
c14b9960 2405static int
4682ae04 2406nonlocal_mentioned_p (rtx x)
c14b9960 2407{
c14b9960
JW
2408 if (INSN_P (x))
2409 {
2410 if (GET_CODE (x) == CALL_INSN)
2411 {
2412 if (! CONST_OR_PURE_CALL_P (x))
2413 return 1;
2414 x = CALL_INSN_FUNCTION_USAGE (x);
2415 if (x == 0)
2416 return 0;
ca7fd9cd 2417 }
c14b9960 2418 else
ca7fd9cd 2419 x = PATTERN (x);
c14b9960
JW
2420 }
2421
2422 return for_each_rtx (&x, nonlocal_mentioned_p_1, NULL);
2423}
2424
2425/* A subroutine of nonlocal_referenced_p, returns 1 if *LOC references
2426 something which is not local to the function and is not constant. */
2427
2428static int
4682ae04 2429nonlocal_referenced_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
c14b9960
JW
2430{
2431 rtx x = *loc;
2432
2433 if (! x)
2434 return 0;
2435
2436 switch (GET_CODE (x))
2437 {
2438 case MEM:
2439 case REG:
2440 case SYMBOL_REF:
2441 case SUBREG:
2442 return nonlocal_mentioned_p (x);
2443
2444 case CALL:
2445 /* Non-constant calls and recursion are not local. */
2446 return 1;
2447
2448 case SET:
2449 if (nonlocal_mentioned_p (SET_SRC (x)))
2450 return 1;
2451
2452 if (GET_CODE (SET_DEST (x)) == MEM)
2453 return nonlocal_mentioned_p (XEXP (SET_DEST (x), 0));
2454
2455 /* If the destination is anything other than a CC0, PC,
2456 MEM, REG, or a SUBREG of a REG that occupies all of
2457 the REG, then X references nonlocal memory if it is
2458 mentioned in the destination. */
2459 if (GET_CODE (SET_DEST (x)) != CC0
2460 && GET_CODE (SET_DEST (x)) != PC
2461 && GET_CODE (SET_DEST (x)) != REG
2462 && ! (GET_CODE (SET_DEST (x)) == SUBREG
2463 && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG
2464 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
2465 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
2466 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
2467 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
2468 return nonlocal_mentioned_p (SET_DEST (x));
2469 return 0;
2470
2471 case CLOBBER:
2472 if (GET_CODE (XEXP (x, 0)) == MEM)
2473 return nonlocal_mentioned_p (XEXP (XEXP (x, 0), 0));
2474 return 0;
2475
2476 case USE:
2477 return nonlocal_mentioned_p (XEXP (x, 0));
2478
2479 case ASM_INPUT:
2480 case UNSPEC_VOLATILE:
2481 return 1;
2482
2483 case ASM_OPERANDS:
2484 if (MEM_VOLATILE_P (x))
2485 return 1;
2486
5d3cc252 2487 /* Fall through. */
c14b9960
JW
2488
2489 default:
2490 break;
2491 }
2492
2493 return 0;
2494}
2495
da7d8304 2496/* Returns nonzero if X might reference something which is not
c14b9960
JW
2497 local to the function and is not constant. */
2498
2499static int
4682ae04 2500nonlocal_referenced_p (rtx x)
c14b9960 2501{
c14b9960
JW
2502 if (INSN_P (x))
2503 {
2504 if (GET_CODE (x) == CALL_INSN)
2505 {
2506 if (! CONST_OR_PURE_CALL_P (x))
2507 return 1;
2508 x = CALL_INSN_FUNCTION_USAGE (x);
2509 if (x == 0)
2510 return 0;
ca7fd9cd 2511 }
c14b9960 2512 else
ca7fd9cd 2513 x = PATTERN (x);
c14b9960
JW
2514 }
2515
2516 return for_each_rtx (&x, nonlocal_referenced_p_1, NULL);
2517}
2518
2519/* A subroutine of nonlocal_set_p, returns 1 if *LOC sets
2520 something which is not local to the function and is not constant. */
2521
2522static int
4682ae04 2523nonlocal_set_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
c14b9960
JW
2524{
2525 rtx x = *loc;
2526
2527 if (! x)
2528 return 0;
2529
2530 switch (GET_CODE (x))
2531 {
2532 case CALL:
2533 /* Non-constant calls and recursion are not local. */
2534 return 1;
2535
2536 case PRE_INC:
2537 case PRE_DEC:
2538 case POST_INC:
2539 case POST_DEC:
2540 case PRE_MODIFY:
2541 case POST_MODIFY:
2542 return nonlocal_mentioned_p (XEXP (x, 0));
2543
2544 case SET:
2545 if (nonlocal_mentioned_p (SET_DEST (x)))
2546 return 1;
2547 return nonlocal_set_p (SET_SRC (x));
2548
2549 case CLOBBER:
2550 return nonlocal_mentioned_p (XEXP (x, 0));
2551
2552 case USE:
2553 return 0;
2554
2555 case ASM_INPUT:
2556 case UNSPEC_VOLATILE:
2557 return 1;
2558
2559 case ASM_OPERANDS:
2560 if (MEM_VOLATILE_P (x))
2561 return 1;
2562
5d3cc252 2563 /* Fall through. */
c14b9960
JW
2564
2565 default:
2566 break;
2567 }
7790df19
JW
2568
2569 return 0;
2570}
2571
da7d8304 2572/* Returns nonzero if X might set something which is not
c14b9960
JW
2573 local to the function and is not constant. */
2574
2575static int
4682ae04 2576nonlocal_set_p (rtx x)
c14b9960 2577{
c14b9960
JW
2578 if (INSN_P (x))
2579 {
2580 if (GET_CODE (x) == CALL_INSN)
2581 {
2582 if (! CONST_OR_PURE_CALL_P (x))
2583 return 1;
2584 x = CALL_INSN_FUNCTION_USAGE (x);
2585 if (x == 0)
2586 return 0;
ca7fd9cd 2587 }
c14b9960 2588 else
ca7fd9cd 2589 x = PATTERN (x);
c14b9960
JW
2590 }
2591
2592 return for_each_rtx (&x, nonlocal_set_p_1, NULL);
2593}
2594
c57ddcf1 2595/* Mark the function if it is pure or constant. */
7790df19
JW
2596
2597void
4682ae04 2598mark_constant_function (void)
7790df19
JW
2599{
2600 rtx insn;
c14b9960 2601 int nonlocal_memory_referenced;
7790df19 2602
ab780373 2603 if (TREE_READONLY (current_function_decl)
bf6d9fd7 2604 || DECL_IS_PURE (current_function_decl)
7790df19 2605 || TREE_THIS_VOLATILE (current_function_decl)
ab780373
RH
2606 || current_function_has_nonlocal_goto
2607 || !(*targetm.binds_local_p) (current_function_decl))
7790df19
JW
2608 return;
2609
e004f2f7 2610 /* A loop might not return which counts as a side effect. */
0ecf09f9 2611 if (mark_dfs_back_edges ())
e004f2f7
JW
2612 return;
2613
c14b9960 2614 nonlocal_memory_referenced = 0;
bf6d9fd7
JW
2615
2616 init_alias_analysis ();
2617
c14b9960 2618 /* Determine if this is a constant or pure function. */
7790df19
JW
2619
2620 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
c14b9960
JW
2621 {
2622 if (! INSN_P (insn))
2623 continue;
bf6d9fd7 2624
c14b9960
JW
2625 if (nonlocal_set_p (insn) || global_reg_mentioned_p (insn)
2626 || volatile_refs_p (PATTERN (insn)))
ca7fd9cd 2627 break;
7790df19 2628
c14b9960
JW
2629 if (! nonlocal_memory_referenced)
2630 nonlocal_memory_referenced = nonlocal_referenced_p (insn);
2631 }
ca7fd9cd 2632
c14b9960 2633 end_alias_analysis ();
ca7fd9cd 2634
7790df19 2635 /* Mark the function. */
ca7fd9cd 2636
c14b9960
JW
2637 if (insn)
2638 ;
2639 else if (nonlocal_memory_referenced)
c57ddcf1
RS
2640 {
2641 cgraph_rtl_info (current_function_decl)->pure_function = 1;
2642 DECL_IS_PURE (current_function_decl) = 1;
2643 }
c14b9960 2644 else
c57ddcf1
RS
2645 {
2646 cgraph_rtl_info (current_function_decl)->const_function = 1;
2647 TREE_READONLY (current_function_decl) = 1;
2648 }
7790df19 2649}
c14b9960 2650\f
6e73e666 2651
6e73e666 2652void
4682ae04 2653init_alias_once (void)
6e73e666 2654{
b3694847 2655 int i;
6e73e666
JC
2656
2657#ifndef OUTGOING_REGNO
2658#define OUTGOING_REGNO(N) N
2659#endif
2660 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2661 /* Check whether this register can hold an incoming pointer
2662 argument. FUNCTION_ARG_REGNO_P tests outgoing register
ec5c56db 2663 numbers, so translate if necessary due to register windows. */
6e73e666
JC
2664 if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i))
2665 && HARD_REGNO_MODE_OK (i, Pmode))
bf1660a6
JL
2666 static_reg_base_value[i]
2667 = gen_rtx_ADDRESS (VOIDmode, gen_rtx_REG (Pmode, i));
2668
bf1660a6
JL
2669 static_reg_base_value[STACK_POINTER_REGNUM]
2670 = gen_rtx_ADDRESS (Pmode, stack_pointer_rtx);
2671 static_reg_base_value[ARG_POINTER_REGNUM]
2672 = gen_rtx_ADDRESS (Pmode, arg_pointer_rtx);
2673 static_reg_base_value[FRAME_POINTER_REGNUM]
2674 = gen_rtx_ADDRESS (Pmode, frame_pointer_rtx);
2675#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
2676 static_reg_base_value[HARD_FRAME_POINTER_REGNUM]
2677 = gen_rtx_ADDRESS (Pmode, hard_frame_pointer_rtx);
2678#endif
2679}
2680
7b52eede
JH
2681/* Set MEMORY_MODIFIED when X modifies DATA (that is assumed
2682 to be memory reference. */
2683static bool memory_modified;
2684static void
4682ae04 2685memory_modified_1 (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
7b52eede
JH
2686{
2687 if (GET_CODE (x) == MEM)
2688 {
2689 if (anti_dependence (x, (rtx)data) || output_dependence (x, (rtx)data))
2690 memory_modified = true;
2691 }
2692}
2693
2694
2695/* Return true when INSN possibly modify memory contents of MEM
2696 (ie address can be modified). */
2697bool
4682ae04 2698memory_modified_in_insn_p (rtx mem, rtx insn)
7b52eede
JH
2699{
2700 if (!INSN_P (insn))
2701 return false;
2702 memory_modified = false;
2703 note_stores (PATTERN (insn), memory_modified_1, mem);
2704 return memory_modified;
2705}
2706
c13e8210
MM
2707/* Initialize the aliasing machinery. Initialize the REG_KNOWN_VALUE
2708 array. */
2709
9ae8ffe7 2710void
4682ae04 2711init_alias_analysis (void)
9ae8ffe7
JL
2712{
2713 int maxreg = max_reg_num ();
ea64ef27 2714 int changed, pass;
b3694847
SS
2715 int i;
2716 unsigned int ui;
2717 rtx insn;
9ae8ffe7 2718
0d446150
JH
2719 timevar_push (TV_ALIAS_ANALYSIS);
2720
9ae8ffe7
JL
2721 reg_known_value_size = maxreg;
2722
ca7fd9cd 2723 reg_known_value
e05e2395
MM
2724 = (rtx *) xcalloc ((maxreg - FIRST_PSEUDO_REGISTER), sizeof (rtx))
2725 - FIRST_PSEUDO_REGISTER;
ca7fd9cd 2726 reg_known_equiv_p
e05e2395 2727 = (char*) xcalloc ((maxreg - FIRST_PSEUDO_REGISTER), sizeof (char))
9ae8ffe7 2728 - FIRST_PSEUDO_REGISTER;
9ae8ffe7 2729
6e73e666
JC
2730 /* Overallocate reg_base_value to allow some growth during loop
2731 optimization. Loop unrolling can create a large number of
2732 registers. */
2733 reg_base_value_size = maxreg * 2;
703ad42b 2734 reg_base_value = ggc_alloc_cleared (reg_base_value_size * sizeof (rtx));
ac606739 2735
703ad42b
KG
2736 new_reg_base_value = xmalloc (reg_base_value_size * sizeof (rtx));
2737 reg_seen = xmalloc (reg_base_value_size);
b17d5d7c 2738 if (! reload_completed && flag_old_unroll_loops)
de12be17 2739 {
ac606739 2740 /* ??? Why are we realloc'ing if we're just going to zero it? */
703ad42b
KG
2741 alias_invariant = xrealloc (alias_invariant,
2742 reg_base_value_size * sizeof (rtx));
2743 memset (alias_invariant, 0, reg_base_value_size * sizeof (rtx));
de12be17 2744 }
ec907dd8
JL
2745
2746 /* The basic idea is that each pass through this loop will use the
2747 "constant" information from the previous pass to propagate alias
2748 information through another level of assignments.
2749
2750 This could get expensive if the assignment chains are long. Maybe
2751 we should throttle the number of iterations, possibly based on
6e73e666 2752 the optimization level or flag_expensive_optimizations.
ec907dd8
JL
2753
2754 We could propagate more information in the first pass by making use
2755 of REG_N_SETS to determine immediately that the alias information
ea64ef27
JL
2756 for a pseudo is "constant".
2757
2758 A program with an uninitialized variable can cause an infinite loop
2759 here. Instead of doing a full dataflow analysis to detect such problems
2760 we just cap the number of iterations for the loop.
2761
2762 The state of the arrays for the set chain in question does not matter
2763 since the program has undefined behavior. */
6e73e666 2764
ea64ef27 2765 pass = 0;
6e73e666 2766 do
ec907dd8
JL
2767 {
2768 /* Assume nothing will change this iteration of the loop. */
2769 changed = 0;
2770
ec907dd8
JL
2771 /* We want to assign the same IDs each iteration of this loop, so
2772 start counting from zero each iteration of the loop. */
2773 unique_id = 0;
2774
f5143c46 2775 /* We're at the start of the function each iteration through the
ec907dd8 2776 loop, so we're copying arguments. */
83bbd9b6 2777 copying_arguments = true;
9ae8ffe7 2778
6e73e666 2779 /* Wipe the potential alias information clean for this pass. */
703ad42b 2780 memset (new_reg_base_value, 0, reg_base_value_size * sizeof (rtx));
8072f69c 2781
6e73e666 2782 /* Wipe the reg_seen array clean. */
703ad42b 2783 memset (reg_seen, 0, reg_base_value_size);
9ae8ffe7 2784
6e73e666
JC
2785 /* Mark all hard registers which may contain an address.
2786 The stack, frame and argument pointers may contain an address.
2787 An argument register which can hold a Pmode value may contain
2788 an address even if it is not in BASE_REGS.
8072f69c 2789
6e73e666
JC
2790 The address expression is VOIDmode for an argument and
2791 Pmode for other registers. */
2792
7f243674
JL
2793 memcpy (new_reg_base_value, static_reg_base_value,
2794 FIRST_PSEUDO_REGISTER * sizeof (rtx));
6e73e666 2795
ec907dd8
JL
2796 /* Walk the insns adding values to the new_reg_base_value array. */
2797 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
9ae8ffe7 2798 {
2c3c49de 2799 if (INSN_P (insn))
ec907dd8 2800 {
6e73e666 2801 rtx note, set;
efc9bd41
RK
2802
2803#if defined (HAVE_prologue) || defined (HAVE_epilogue)
f5143c46 2804 /* The prologue/epilogue insns are not threaded onto the
657959ca
JL
2805 insn chain until after reload has completed. Thus,
2806 there is no sense wasting time checking if INSN is in
2807 the prologue/epilogue until after reload has completed. */
2808 if (reload_completed
2809 && prologue_epilogue_contains (insn))
efc9bd41
RK
2810 continue;
2811#endif
2812
ec907dd8
JL
2813 /* If this insn has a noalias note, process it, Otherwise,
2814 scan for sets. A simple set will have no side effects
ec5c56db 2815 which could change the base value of any other register. */
6e73e666 2816
ec907dd8 2817 if (GET_CODE (PATTERN (insn)) == SET
efc9bd41
RK
2818 && REG_NOTES (insn) != 0
2819 && find_reg_note (insn, REG_NOALIAS, NULL_RTX))
84832317 2820 record_set (SET_DEST (PATTERN (insn)), NULL_RTX, NULL);
ec907dd8 2821 else
84832317 2822 note_stores (PATTERN (insn), record_set, NULL);
6e73e666
JC
2823
2824 set = single_set (insn);
2825
2826 if (set != 0
2827 && GET_CODE (SET_DEST (set)) == REG
fb6754f0 2828 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
6e73e666 2829 {
fb6754f0 2830 unsigned int regno = REGNO (SET_DEST (set));
713f41f9
BS
2831 rtx src = SET_SRC (set);
2832
2833 if (REG_NOTES (insn) != 0
2834 && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
2835 && REG_N_SETS (regno) == 1)
2836 || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
2837 && GET_CODE (XEXP (note, 0)) != EXPR_LIST
bb2cf916 2838 && ! rtx_varies_p (XEXP (note, 0), 1)
713f41f9
BS
2839 && ! reg_overlap_mentioned_p (SET_DEST (set), XEXP (note, 0)))
2840 {
2841 reg_known_value[regno] = XEXP (note, 0);
2842 reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
2843 }
2844 else if (REG_N_SETS (regno) == 1
2845 && GET_CODE (src) == PLUS
2846 && GET_CODE (XEXP (src, 0)) == REG
fb6754f0
BS
2847 && REGNO (XEXP (src, 0)) >= FIRST_PSEUDO_REGISTER
2848 && (reg_known_value[REGNO (XEXP (src, 0))])
713f41f9
BS
2849 && GET_CODE (XEXP (src, 1)) == CONST_INT)
2850 {
2851 rtx op0 = XEXP (src, 0);
bb2cf916 2852 op0 = reg_known_value[REGNO (op0)];
713f41f9 2853 reg_known_value[regno]
ed8908e7 2854 = plus_constant (op0, INTVAL (XEXP (src, 1)));
713f41f9
BS
2855 reg_known_equiv_p[regno] = 0;
2856 }
2857 else if (REG_N_SETS (regno) == 1
2858 && ! rtx_varies_p (src, 1))
2859 {
2860 reg_known_value[regno] = src;
2861 reg_known_equiv_p[regno] = 0;
2862 }
6e73e666 2863 }
ec907dd8
JL
2864 }
2865 else if (GET_CODE (insn) == NOTE
2866 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
83bbd9b6 2867 copying_arguments = false;
6e73e666 2868 }
ec907dd8 2869
6e73e666 2870 /* Now propagate values from new_reg_base_value to reg_base_value. */
e51712db 2871 for (ui = 0; ui < reg_base_value_size; ui++)
6e73e666 2872 {
e51712db
KG
2873 if (new_reg_base_value[ui]
2874 && new_reg_base_value[ui] != reg_base_value[ui]
2875 && ! rtx_equal_p (new_reg_base_value[ui], reg_base_value[ui]))
ec907dd8 2876 {
e51712db 2877 reg_base_value[ui] = new_reg_base_value[ui];
6e73e666 2878 changed = 1;
ec907dd8 2879 }
9ae8ffe7 2880 }
9ae8ffe7 2881 }
6e73e666 2882 while (changed && ++pass < MAX_ALIAS_LOOP_PASSES);
9ae8ffe7
JL
2883
2884 /* Fill in the remaining entries. */
2885 for (i = FIRST_PSEUDO_REGISTER; i < maxreg; i++)
2886 if (reg_known_value[i] == 0)
2887 reg_known_value[i] = regno_reg_rtx[i];
2888
9ae8ffe7
JL
2889 /* Simplify the reg_base_value array so that no register refers to
2890 another register, except to special registers indirectly through
2891 ADDRESS expressions.
2892
2893 In theory this loop can take as long as O(registers^2), but unless
2894 there are very long dependency chains it will run in close to linear
ea64ef27
JL
2895 time.
2896
2897 This loop may not be needed any longer now that the main loop does
2898 a better job at propagating alias information. */
2899 pass = 0;
9ae8ffe7
JL
2900 do
2901 {
2902 changed = 0;
ea64ef27 2903 pass++;
e51712db 2904 for (ui = 0; ui < reg_base_value_size; ui++)
9ae8ffe7 2905 {
e51712db 2906 rtx base = reg_base_value[ui];
9ae8ffe7
JL
2907 if (base && GET_CODE (base) == REG)
2908 {
fb6754f0 2909 unsigned int base_regno = REGNO (base);
e51712db
KG
2910 if (base_regno == ui) /* register set from itself */
2911 reg_base_value[ui] = 0;
9ae8ffe7 2912 else
e51712db 2913 reg_base_value[ui] = reg_base_value[base_regno];
9ae8ffe7
JL
2914 changed = 1;
2915 }
2916 }
2917 }
ea64ef27 2918 while (changed && pass < MAX_ALIAS_LOOP_PASSES);
9ae8ffe7 2919
e05e2395
MM
2920 /* Clean up. */
2921 free (new_reg_base_value);
ec907dd8 2922 new_reg_base_value = 0;
e05e2395 2923 free (reg_seen);
9ae8ffe7 2924 reg_seen = 0;
0d446150 2925 timevar_pop (TV_ALIAS_ANALYSIS);
9ae8ffe7
JL
2926}
2927
2928void
4682ae04 2929end_alias_analysis (void)
9ae8ffe7 2930{
e05e2395 2931 free (reg_known_value + FIRST_PSEUDO_REGISTER);
9ae8ffe7 2932 reg_known_value = 0;
ac606739 2933 reg_known_value_size = 0;
e05e2395
MM
2934 free (reg_known_equiv_p + FIRST_PSEUDO_REGISTER);
2935 reg_known_equiv_p = 0;
e2500fed 2936 reg_base_value = 0;
9ae8ffe7 2937 reg_base_value_size = 0;
de12be17
JC
2938 if (alias_invariant)
2939 {
ac606739 2940 free (alias_invariant);
de12be17
JC
2941 alias_invariant = 0;
2942 }
9ae8ffe7 2943}
e2500fed
GK
2944
2945#include "gt-alias.h"
This page took 1.630782 seconds and 5 git commands to generate.