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