]> gcc.gnu.org Git - gcc.git/blame - gcc/alias.c
extend.texi, [...]: Improve formatting.
[gcc.git] / gcc / alias.c
CommitLineData
9ae8ffe7 1/* Alias analysis for GNU C
6e24b709 2 Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
9ae8ffe7
JL
3 Contributed by John Carr (jfc@mit.edu).
4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
21
22#include "config.h"
670ee920 23#include "system.h"
9ae8ffe7 24#include "rtl.h"
7790df19 25#include "tree.h"
6baf1cc8 26#include "tm_p.h"
49ad7cfa 27#include "function.h"
9ae8ffe7
JL
28#include "expr.h"
29#include "regs.h"
30#include "hard-reg-set.h"
e004f2f7 31#include "basic-block.h"
9ae8ffe7 32#include "flags.h"
264fac34 33#include "output.h"
2e107e9e 34#include "toplev.h"
eab5c70a 35#include "cselib.h"
3932261a 36#include "splay-tree.h"
ac606739 37#include "ggc.h"
3932261a
MM
38
39/* The alias sets assigned to MEMs assist the back-end in determining
40 which MEMs can alias which other MEMs. In general, two MEMs in
ac3d9668
RK
41 different alias sets cannot alias each other, with one important
42 exception. Consider something like:
3932261a
MM
43
44 struct S {int i; double d; };
45
46 a store to an `S' can alias something of either type `int' or type
47 `double'. (However, a store to an `int' cannot alias a `double'
48 and vice versa.) We indicate this via a tree structure that looks
49 like:
50 struct S
51 / \
52 / \
53 |/_ _\|
54 int double
55
ac3d9668
RK
56 (The arrows are directed and point downwards.)
57 In this situation we say the alias set for `struct S' is the
58 `superset' and that those for `int' and `double' are `subsets'.
59
3bdf5ad1
RK
60 To see whether two alias sets can point to the same memory, we must
61 see if either alias set is a subset of the other. We need not trace
62 past immediate decendents, however, since we propagate all
63 grandchildren up one level.
3932261a
MM
64
65 Alias set zero is implicitly a superset of all other alias sets.
66 However, this is no actual entry for alias set zero. It is an
67 error to attempt to explicitly construct a subset of zero. */
68
d4b60170
RK
69typedef struct alias_set_entry
70{
3932261a 71 /* The alias set number, as stored in MEM_ALIAS_SET. */
3bdf5ad1 72 HOST_WIDE_INT alias_set;
3932261a
MM
73
74 /* The children of the alias set. These are not just the immediate
ac3d9668 75 children, but, in fact, all decendents. So, if we have:
3932261a
MM
76
77 struct T { struct S s; float f; }
78
79 continuing our example above, the children here will be all of
80 `int', `double', `float', and `struct S'. */
81 splay_tree children;
2bf105ab
RK
82
83 /* Nonzero if would have a child of zero: this effectively makes this
84 alias set the same as alias set zero. */
85 int has_zero_child;
d4b60170 86} *alias_set_entry;
9ae8ffe7 87
3d994c6b
KG
88static int rtx_equal_for_memref_p PARAMS ((rtx, rtx));
89static rtx find_symbolic_term PARAMS ((rtx));
a13d4ebf 90rtx get_addr PARAMS ((rtx));
3d994c6b
KG
91static int memrefs_conflict_p PARAMS ((int, rtx, int, rtx,
92 HOST_WIDE_INT));
93static void record_set PARAMS ((rtx, rtx, void *));
94static rtx find_base_term PARAMS ((rtx));
95static int base_alias_check PARAMS ((rtx, rtx, enum machine_mode,
96 enum machine_mode));
6e24b709
RK
97static int handled_component_p PARAMS ((tree));
98static int can_address_p PARAMS ((tree));
3d994c6b
KG
99static rtx find_base_value PARAMS ((rtx));
100static int mems_in_disjoint_alias_sets_p PARAMS ((rtx, rtx));
101static int insert_subset_children PARAMS ((splay_tree_node, void*));
3bdf5ad1
RK
102static tree find_base_decl PARAMS ((tree));
103static alias_set_entry get_alias_set_entry PARAMS ((HOST_WIDE_INT));
eab5c70a 104static rtx fixed_scalar_and_varying_struct_p PARAMS ((rtx, rtx, rtx, rtx,
e38fe8e0 105 int (*) (rtx, int)));
3d994c6b
KG
106static int aliases_everything_p PARAMS ((rtx));
107static int write_dependence_p PARAMS ((rtx, rtx, int));
bf6d9fd7 108static int nonlocal_mentioned_p PARAMS ((rtx));
9ae8ffe7 109
e004f2f7
JW
110static int loop_p PARAMS ((void));
111
9ae8ffe7
JL
112/* Set up all info needed to perform alias analysis on memory references. */
113
d4b60170 114/* Returns the size in bytes of the mode of X. */
9ae8ffe7
JL
115#define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
116
41472af8 117/* Returns nonzero if MEM1 and MEM2 do not alias because they are in
264fac34
MM
118 different alias sets. We ignore alias sets in functions making use
119 of variable arguments because the va_arg macros on some systems are
120 not legal ANSI C. */
121#define DIFFERENT_ALIAS_SETS_P(MEM1, MEM2) \
3932261a 122 mems_in_disjoint_alias_sets_p (MEM1, MEM2)
41472af8 123
ea64ef27 124/* Cap the number of passes we make over the insns propagating alias
ac3d9668 125 information through set chains. 10 is a completely arbitrary choice. */
ea64ef27
JL
126#define MAX_ALIAS_LOOP_PASSES 10
127
9ae8ffe7
JL
128/* reg_base_value[N] gives an address to which register N is related.
129 If all sets after the first add or subtract to the current value
130 or otherwise modify it so it does not point to a different top level
131 object, reg_base_value[N] is equal to the address part of the source
2a2c8203
JC
132 of the first set.
133
134 A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF. ADDRESS
135 expressions represent certain special values: function arguments and
b3b5ad95
JL
136 the stack, frame, and argument pointers.
137
138 The contents of an ADDRESS is not normally used, the mode of the
139 ADDRESS determines whether the ADDRESS is a function argument or some
140 other special value. Pointer equality, not rtx_equal_p, determines whether
141 two ADDRESS expressions refer to the same base address.
142
143 The only use of the contents of an ADDRESS is for determining if the
144 current function performs nonlocal memory memory references for the
145 purposes of marking the function as a constant function. */
2a2c8203 146
ac606739
GS
147static rtx *reg_base_value;
148static rtx *new_reg_base_value;
d4b60170
RK
149static unsigned int reg_base_value_size; /* size of reg_base_value array */
150
9ae8ffe7 151#define REG_BASE_VALUE(X) \
fb6754f0
BS
152 (REGNO (X) < reg_base_value_size \
153 ? reg_base_value[REGNO (X)] : 0)
9ae8ffe7 154
de12be17
JC
155/* Vector of known invariant relationships between registers. Set in
156 loop unrolling. Indexed by register number, if nonzero the value
157 is an expression describing this register in terms of another.
158
159 The length of this array is REG_BASE_VALUE_SIZE.
160
161 Because this array contains only pseudo registers it has no effect
162 after reload. */
163static rtx *alias_invariant;
164
c13e8210
MM
165/* Vector indexed by N giving the initial (unchanging) value known for
166 pseudo-register N. This array is initialized in
167 init_alias_analysis, and does not change until end_alias_analysis
168 is called. */
9ae8ffe7
JL
169rtx *reg_known_value;
170
171/* Indicates number of valid entries in reg_known_value. */
770ae6cc 172static unsigned int reg_known_value_size;
9ae8ffe7
JL
173
174/* Vector recording for each reg_known_value whether it is due to a
175 REG_EQUIV note. Future passes (viz., reload) may replace the
176 pseudo with the equivalent expression and so we account for the
ac3d9668
RK
177 dependences that would be introduced if that happens.
178
179 The REG_EQUIV notes created in assign_parms may mention the arg
180 pointer, and there are explicit insns in the RTL that modify the
181 arg pointer. Thus we must ensure that such insns don't get
182 scheduled across each other because that would invalidate the
183 REG_EQUIV notes. One could argue that the REG_EQUIV notes are
184 wrong, but solving the problem in the scheduler will likely give
185 better code, so we do it here. */
9ae8ffe7
JL
186char *reg_known_equiv_p;
187
2a2c8203
JC
188/* True when scanning insns from the start of the rtl to the
189 NOTE_INSN_FUNCTION_BEG note. */
9ae8ffe7
JL
190static int copying_arguments;
191
3932261a 192/* The splay-tree used to store the various alias set entries. */
3932261a 193static splay_tree alias_sets;
ac3d9668 194\f
3932261a
MM
195/* Returns a pointer to the alias set entry for ALIAS_SET, if there is
196 such an entry, or NULL otherwise. */
197
198static alias_set_entry
199get_alias_set_entry (alias_set)
3bdf5ad1 200 HOST_WIDE_INT alias_set;
3932261a 201{
d4b60170
RK
202 splay_tree_node sn
203 = splay_tree_lookup (alias_sets, (splay_tree_key) alias_set);
3932261a 204
d4b60170 205 return sn != 0 ? ((alias_set_entry) sn->value) : 0;
3932261a
MM
206}
207
ac3d9668
RK
208/* Returns nonzero if the alias sets for MEM1 and MEM2 are such that
209 the two MEMs cannot alias each other. */
3932261a
MM
210
211static int
212mems_in_disjoint_alias_sets_p (mem1, mem2)
213 rtx mem1;
214 rtx mem2;
215{
3932261a
MM
216#ifdef ENABLE_CHECKING
217/* Perform a basic sanity check. Namely, that there are no alias sets
218 if we're not using strict aliasing. This helps to catch bugs
219 whereby someone uses PUT_CODE, but doesn't clear MEM_ALIAS_SET, or
220 where a MEM is allocated in some way other than by the use of
221 gen_rtx_MEM, and the MEM_ALIAS_SET is not cleared. If we begin to
222 use alias sets to indicate that spilled registers cannot alias each
223 other, we might need to remove this check. */
d4b60170
RK
224 if (! flag_strict_aliasing
225 && (MEM_ALIAS_SET (mem1) != 0 || MEM_ALIAS_SET (mem2) != 0))
3932261a
MM
226 abort ();
227#endif
228
1da68f56
RK
229 return ! alias_sets_conflict_p (MEM_ALIAS_SET (mem1), MEM_ALIAS_SET (mem2));
230}
3932261a 231
1da68f56
RK
232/* Insert the NODE into the splay tree given by DATA. Used by
233 record_alias_subset via splay_tree_foreach. */
234
235static int
236insert_subset_children (node, data)
237 splay_tree_node node;
238 void *data;
239{
240 splay_tree_insert ((splay_tree) data, node->key, node->value);
241
242 return 0;
243}
244
245/* Return 1 if the two specified alias sets may conflict. */
246
247int
248alias_sets_conflict_p (set1, set2)
249 HOST_WIDE_INT set1, set2;
250{
251 alias_set_entry ase;
252
253 /* If have no alias set information for one of the operands, we have
254 to assume it can alias anything. */
255 if (set1 == 0 || set2 == 0
256 /* If the two alias sets are the same, they may alias. */
257 || set1 == set2)
258 return 1;
3932261a 259
3bdf5ad1 260 /* See if the first alias set is a subset of the second. */
1da68f56 261 ase = get_alias_set_entry (set1);
2bf105ab
RK
262 if (ase != 0
263 && (ase->has_zero_child
264 || splay_tree_lookup (ase->children,
1da68f56
RK
265 (splay_tree_key) set2)))
266 return 1;
3932261a
MM
267
268 /* Now do the same, but with the alias sets reversed. */
1da68f56 269 ase = get_alias_set_entry (set2);
2bf105ab
RK
270 if (ase != 0
271 && (ase->has_zero_child
272 || splay_tree_lookup (ase->children,
1da68f56
RK
273 (splay_tree_key) set1)))
274 return 1;
3932261a 275
1da68f56 276 /* The two alias sets are distinct and neither one is the
3932261a 277 child of the other. Therefore, they cannot alias. */
1da68f56 278 return 0;
3932261a 279}
1da68f56
RK
280\f
281/* Return 1 if TYPE is a RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE and has
282 has any readonly fields. If any of the fields have types that
283 contain readonly fields, return true as well. */
3932261a 284
1da68f56
RK
285int
286readonly_fields_p (type)
287 tree type;
3932261a 288{
1da68f56
RK
289 tree field;
290
291 if (TREE_CODE (type) != RECORD_TYPE && TREE_CODE (type) != UNION_TYPE
292 && TREE_CODE (type) != QUAL_UNION_TYPE)
293 return 0;
294
295 for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field))
296 if (TREE_CODE (field) == FIELD_DECL
297 && (TREE_READONLY (field)
298 || readonly_fields_p (TREE_TYPE (field))))
299 return 1;
3932261a
MM
300
301 return 0;
302}
3bdf5ad1 303\f
1da68f56
RK
304/* Return 1 if any MEM object of type T1 will always conflict (using the
305 dependency routines in this file) with any MEM object of type T2.
306 This is used when allocating temporary storage. If T1 and/or T2 are
307 NULL_TREE, it means we know nothing about the storage. */
308
309int
310objects_must_conflict_p (t1, t2)
311 tree t1, t2;
312{
e8ea2809
RK
313 /* If neither has a type specified, we don't know if they'll conflict
314 because we may be using them to store objects of various types, for
315 example the argument and local variables areas of inlined functions. */
981a4c34 316 if (t1 == 0 && t2 == 0)
e8ea2809
RK
317 return 0;
318
66cce54d
RH
319 /* If one or the other has readonly fields or is readonly,
320 then they may not conflict. */
321 if ((t1 != 0 && readonly_fields_p (t1))
322 || (t2 != 0 && readonly_fields_p (t2))
323 || (t1 != 0 && TYPE_READONLY (t1))
324 || (t2 != 0 && TYPE_READONLY (t2)))
325 return 0;
326
1da68f56
RK
327 /* If they are the same type, they must conflict. */
328 if (t1 == t2
329 /* Likewise if both are volatile. */
330 || (t1 != 0 && TYPE_VOLATILE (t1) && t2 != 0 && TYPE_VOLATILE (t2)))
331 return 1;
332
66cce54d
RH
333 /* If one is aggregate and the other is scalar then they may not
334 conflict. */
335 if ((t1 != 0 && AGGREGATE_TYPE_P (t1))
336 != (t2 != 0 && AGGREGATE_TYPE_P (t2)))
1da68f56
RK
337 return 0;
338
339 /* Otherwise they conflict only if the alias sets conflict. */
340 return alias_sets_conflict_p (t1 ? get_alias_set (t1) : 0,
341 t2 ? get_alias_set (t2) : 0);
342}
343\f
3bdf5ad1
RK
344/* T is an expression with pointer type. Find the DECL on which this
345 expression is based. (For example, in `a[i]' this would be `a'.)
346 If there is no such DECL, or a unique decl cannot be determined,
347 NULL_TREE is retured. */
348
349static tree
350find_base_decl (t)
351 tree t;
352{
353 tree d0, d1, d2;
354
355 if (t == 0 || t == error_mark_node || ! POINTER_TYPE_P (TREE_TYPE (t)))
356 return 0;
357
358 /* If this is a declaration, return it. */
359 if (TREE_CODE_CLASS (TREE_CODE (t)) == 'd')
360 return t;
361
362 /* Handle general expressions. It would be nice to deal with
363 COMPONENT_REFs here. If we could tell that `a' and `b' were the
364 same, then `a->f' and `b->f' are also the same. */
365 switch (TREE_CODE_CLASS (TREE_CODE (t)))
366 {
367 case '1':
368 return find_base_decl (TREE_OPERAND (t, 0));
369
370 case '2':
371 /* Return 0 if found in neither or both are the same. */
372 d0 = find_base_decl (TREE_OPERAND (t, 0));
373 d1 = find_base_decl (TREE_OPERAND (t, 1));
374 if (d0 == d1)
375 return d0;
376 else if (d0 == 0)
377 return d1;
378 else if (d1 == 0)
379 return d0;
380 else
381 return 0;
382
383 case '3':
384 d0 = find_base_decl (TREE_OPERAND (t, 0));
385 d1 = find_base_decl (TREE_OPERAND (t, 1));
386 d0 = find_base_decl (TREE_OPERAND (t, 0));
387 d2 = find_base_decl (TREE_OPERAND (t, 2));
388
389 /* Set any nonzero values from the last, then from the first. */
390 if (d1 == 0) d1 = d2;
391 if (d0 == 0) d0 = d1;
392 if (d1 == 0) d1 = d0;
393 if (d2 == 0) d2 = d1;
394
395 /* At this point all are nonzero or all are zero. If all three are the
396 same, return it. Otherwise, return zero. */
397 return (d0 == d1 && d1 == d2) ? d0 : 0;
398
399 default:
400 return 0;
401 }
402}
403
6e24b709
RK
404/* Return 1 if T is an expression that get_inner_reference handles. */
405
406static int
407handled_component_p (t)
408 tree t;
409{
410 switch (TREE_CODE (t))
411 {
412 case BIT_FIELD_REF:
413 case COMPONENT_REF:
414 case ARRAY_REF:
b4e3fabb 415 case ARRAY_RANGE_REF:
6e24b709
RK
416 case NON_LVALUE_EXPR:
417 return 1;
418
419 case NOP_EXPR:
420 case CONVERT_EXPR:
421 return (TYPE_MODE (TREE_TYPE (t))
422 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 0))));
423
424 default:
425 return 0;
426 }
427}
428
429/* Return 1 if all the nested component references handled by
430 get_inner_reference in T are such that we can address the object in T. */
431
432static int
433can_address_p (t)
434 tree t;
435{
436 /* If we're at the end, it is vacuously addressable. */
437 if (! handled_component_p (t))
438 return 1;
439
440 /* Bitfields are never addressable. */
441 else if (TREE_CODE (t) == BIT_FIELD_REF)
442 return 0;
443
444 else if (TREE_CODE (t) == COMPONENT_REF
445 && ! DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1))
446 && can_address_p (TREE_OPERAND (t, 0)))
447 return 1;
448
b4e3fabb 449 else if ((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
6e24b709
RK
450 && ! TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0)))
451 && can_address_p (TREE_OPERAND (t, 0)))
452 return 1;
453
454 return 0;
455}
456
3bdf5ad1
RK
457/* Return the alias set for T, which may be either a type or an
458 expression. Call language-specific routine for help, if needed. */
459
460HOST_WIDE_INT
461get_alias_set (t)
462 tree t;
463{
f824e5c3 464 tree orig_t;
3bdf5ad1 465 HOST_WIDE_INT set;
3bdf5ad1
RK
466
467 /* If we're not doing any alias analysis, just assume everything
468 aliases everything else. Also return 0 if this or its type is
469 an error. */
470 if (! flag_strict_aliasing || t == error_mark_node
471 || (! TYPE_P (t)
472 && (TREE_TYPE (t) == 0 || TREE_TYPE (t) == error_mark_node)))
473 return 0;
474
475 /* We can be passed either an expression or a type. This and the
476 language-specific routine may make mutually-recursive calls to
477 each other to figure out what to do. At each juncture, we see if
478 this is a tree that the language may need to handle specially.
f824e5c3
RK
479 First handle things that aren't types and start by removing nops
480 since we care only about the actual object. */
481 if (! TYPE_P (t))
3bdf5ad1 482 {
f824e5c3
RK
483 while (TREE_CODE (t) == NOP_EXPR || TREE_CODE (t) == CONVERT_EXPR
484 || TREE_CODE (t) == NON_LVALUE_EXPR)
485 t = TREE_OPERAND (t, 0);
486
487 /* Now give the language a chance to do something but record what we
488 gave it this time. */
489 orig_t = t;
2e761e49 490 if ((set = lang_get_alias_set (t)) != -1)
f824e5c3
RK
491 return set;
492
80661759
RK
493 /* Now loop the same way as get_inner_reference and get the alias
494 set to use. Pick up the outermost object that we could have
495 a pointer to. */
6e24b709
RK
496 while (handled_component_p (t) && ! can_address_p (t))
497 t = TREE_OPERAND (t, 0);
498
f824e5c3
RK
499 if (TREE_CODE (t) == INDIRECT_REF)
500 {
501 /* Check for accesses through restrict-qualified pointers. */
502 tree decl = find_base_decl (TREE_OPERAND (t, 0));
503
504 if (decl && DECL_POINTER_ALIAS_SET_KNOWN_P (decl))
505 /* We use the alias set indicated in the declaration. */
506 return DECL_POINTER_ALIAS_SET (decl);
507
508 /* If we have an INDIRECT_REF via a void pointer, we don't
509 know anything about what that might alias. */
510 if (TREE_CODE (TREE_TYPE (t)) == VOID_TYPE)
511 return 0;
512 }
513
514 /* Give the language another chance to do something special. */
2e761e49
RH
515 if (orig_t != t
516 && (set = lang_get_alias_set (t)) != -1)
f824e5c3
RK
517 return set;
518
519 /* Now all we care about is the type. */
520 t = TREE_TYPE (t);
3bdf5ad1
RK
521 }
522
3bdf5ad1
RK
523 /* Variant qualifiers don't affect the alias set, so get the main
524 variant. If this is a type with a known alias set, return it. */
525 t = TYPE_MAIN_VARIANT (t);
526 if (TYPE_P (t) && TYPE_ALIAS_SET_KNOWN_P (t))
527 return TYPE_ALIAS_SET (t);
528
529 /* See if the language has special handling for this type. */
2e761e49 530 if ((set = lang_get_alias_set (t)) != -1)
2bf105ab
RK
531 {
532 /* If the alias set is now known, we are done. */
533 if (TYPE_ALIAS_SET_KNOWN_P (t))
534 return TYPE_ALIAS_SET (t);
535 }
536
3bdf5ad1
RK
537 /* There are no objects of FUNCTION_TYPE, so there's no point in
538 using up an alias set for them. (There are, of course, pointers
539 and references to functions, but that's different.) */
540 else if (TREE_CODE (t) == FUNCTION_TYPE)
541 set = 0;
542 else
543 /* Otherwise make a new alias set for this type. */
544 set = new_alias_set ();
545
546 TYPE_ALIAS_SET (t) = set;
2bf105ab
RK
547
548 /* If this is an aggregate type, we must record any component aliasing
549 information. */
1d79fd2c 550 if (AGGREGATE_TYPE_P (t) || TREE_CODE (t) == COMPLEX_TYPE)
2bf105ab
RK
551 record_component_aliases (t);
552
3bdf5ad1
RK
553 return set;
554}
555
556/* Return a brand-new alias set. */
557
558HOST_WIDE_INT
559new_alias_set ()
560{
561 static HOST_WIDE_INT last_alias_set;
562
563 if (flag_strict_aliasing)
564 return ++last_alias_set;
565 else
566 return 0;
567}
3932261a
MM
568
569/* Indicate that things in SUBSET can alias things in SUPERSET, but
570 not vice versa. For example, in C, a store to an `int' can alias a
571 structure containing an `int', but not vice versa. Here, the
572 structure would be the SUPERSET and `int' the SUBSET. This
a0c33338 573 function should be called only once per SUPERSET/SUBSET pair.
3932261a
MM
574
575 It is illegal for SUPERSET to be zero; everything is implicitly a
576 subset of alias set zero. */
577
578void
579record_alias_subset (superset, subset)
3bdf5ad1
RK
580 HOST_WIDE_INT superset;
581 HOST_WIDE_INT subset;
3932261a
MM
582{
583 alias_set_entry superset_entry;
584 alias_set_entry subset_entry;
585
586 if (superset == 0)
587 abort ();
588
589 superset_entry = get_alias_set_entry (superset);
d4b60170 590 if (superset_entry == 0)
3932261a
MM
591 {
592 /* Create an entry for the SUPERSET, so that we have a place to
593 attach the SUBSET. */
d4b60170
RK
594 superset_entry
595 = (alias_set_entry) xmalloc (sizeof (struct alias_set_entry));
3932261a
MM
596 superset_entry->alias_set = superset;
597 superset_entry->children
30f72379 598 = splay_tree_new (splay_tree_compare_ints, 0, 0);
570eb5c8 599 superset_entry->has_zero_child = 0;
d4b60170 600 splay_tree_insert (alias_sets, (splay_tree_key) superset,
3932261a 601 (splay_tree_value) superset_entry);
3932261a
MM
602 }
603
2bf105ab
RK
604 if (subset == 0)
605 superset_entry->has_zero_child = 1;
606 else
607 {
608 subset_entry = get_alias_set_entry (subset);
609 /* If there is an entry for the subset, enter all of its children
610 (if they are not already present) as children of the SUPERSET. */
611 if (subset_entry)
612 {
613 if (subset_entry->has_zero_child)
614 superset_entry->has_zero_child = 1;
d4b60170 615
2bf105ab
RK
616 splay_tree_foreach (subset_entry->children, insert_subset_children,
617 superset_entry->children);
618 }
3932261a 619
2bf105ab
RK
620 /* Enter the SUBSET itself as a child of the SUPERSET. */
621 splay_tree_insert (superset_entry->children,
622 (splay_tree_key) subset, 0);
623 }
3932261a
MM
624}
625
a0c33338
RK
626/* Record that component types of TYPE, if any, are part of that type for
627 aliasing purposes. For record types, we only record component types
628 for fields that are marked addressable. For array types, we always
629 record the component types, so the front end should not call this
630 function if the individual component aren't addressable. */
631
632void
633record_component_aliases (type)
634 tree type;
635{
3bdf5ad1 636 HOST_WIDE_INT superset = get_alias_set (type);
a0c33338
RK
637 tree field;
638
639 if (superset == 0)
640 return;
641
642 switch (TREE_CODE (type))
643 {
644 case ARRAY_TYPE:
2bf105ab
RK
645 if (! TYPE_NONALIASED_COMPONENT (type))
646 record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
a0c33338
RK
647 break;
648
649 case RECORD_TYPE:
650 case UNION_TYPE:
651 case QUAL_UNION_TYPE:
652 for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field))
b16a49a1 653 if (TREE_CODE (field) == FIELD_DECL && ! DECL_NONADDRESSABLE_P (field))
2bf105ab 654 record_alias_subset (superset, get_alias_set (TREE_TYPE (field)));
a0c33338
RK
655 break;
656
1d79fd2c
JW
657 case COMPLEX_TYPE:
658 record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
659 break;
660
a0c33338
RK
661 default:
662 break;
663 }
664}
665
3bdf5ad1
RK
666/* Allocate an alias set for use in storing and reading from the varargs
667 spill area. */
668
669HOST_WIDE_INT
670get_varargs_alias_set ()
671{
672 static HOST_WIDE_INT set = -1;
673
674 if (set == -1)
675 set = new_alias_set ();
676
677 return set;
678}
679
680/* Likewise, but used for the fixed portions of the frame, e.g., register
681 save areas. */
682
683HOST_WIDE_INT
684get_frame_alias_set ()
685{
686 static HOST_WIDE_INT set = -1;
687
688 if (set == -1)
689 set = new_alias_set ();
690
691 return set;
692}
693
2a2c8203
JC
694/* Inside SRC, the source of a SET, find a base address. */
695
9ae8ffe7
JL
696static rtx
697find_base_value (src)
698 register rtx src;
699{
713f41f9 700 unsigned int regno;
9ae8ffe7
JL
701 switch (GET_CODE (src))
702 {
703 case SYMBOL_REF:
704 case LABEL_REF:
705 return src;
706
707 case REG:
fb6754f0 708 regno = REGNO (src);
d4b60170 709 /* At the start of a function, argument registers have known base
2a2c8203
JC
710 values which may be lost later. Returning an ADDRESS
711 expression here allows optimization based on argument values
712 even when the argument registers are used for other purposes. */
713f41f9
BS
713 if (regno < FIRST_PSEUDO_REGISTER && copying_arguments)
714 return new_reg_base_value[regno];
73774bc7 715
eaf407a5
JL
716 /* If a pseudo has a known base value, return it. Do not do this
717 for hard regs since it can result in a circular dependency
718 chain for registers which have values at function entry.
719
720 The test above is not sufficient because the scheduler may move
721 a copy out of an arg reg past the NOTE_INSN_FUNCTION_BEGIN. */
713f41f9
BS
722 if (regno >= FIRST_PSEUDO_REGISTER
723 && regno < reg_base_value_size
724 && reg_base_value[regno])
725 return reg_base_value[regno];
73774bc7 726
9ae8ffe7
JL
727 return src;
728
729 case MEM:
730 /* Check for an argument passed in memory. Only record in the
731 copying-arguments block; it is too hard to track changes
732 otherwise. */
733 if (copying_arguments
734 && (XEXP (src, 0) == arg_pointer_rtx
735 || (GET_CODE (XEXP (src, 0)) == PLUS
736 && XEXP (XEXP (src, 0), 0) == arg_pointer_rtx)))
38a448ca 737 return gen_rtx_ADDRESS (VOIDmode, src);
9ae8ffe7
JL
738 return 0;
739
740 case CONST:
741 src = XEXP (src, 0);
742 if (GET_CODE (src) != PLUS && GET_CODE (src) != MINUS)
743 break;
d4b60170
RK
744
745 /* ... fall through ... */
2a2c8203 746
9ae8ffe7
JL
747 case PLUS:
748 case MINUS:
2a2c8203 749 {
ec907dd8
JL
750 rtx temp, src_0 = XEXP (src, 0), src_1 = XEXP (src, 1);
751
752 /* If either operand is a REG, then see if we already have
753 a known value for it. */
754 if (GET_CODE (src_0) == REG)
755 {
756 temp = find_base_value (src_0);
d4b60170 757 if (temp != 0)
ec907dd8
JL
758 src_0 = temp;
759 }
760
761 if (GET_CODE (src_1) == REG)
762 {
763 temp = find_base_value (src_1);
d4b60170 764 if (temp!= 0)
ec907dd8
JL
765 src_1 = temp;
766 }
2a2c8203 767
d4b60170 768 /* Guess which operand is the base address:
ec907dd8
JL
769 If either operand is a symbol, then it is the base. If
770 either operand is a CONST_INT, then the other is the base. */
d4b60170 771 if (GET_CODE (src_1) == CONST_INT || CONSTANT_P (src_0))
2a2c8203 772 return find_base_value (src_0);
d4b60170 773 else if (GET_CODE (src_0) == CONST_INT || CONSTANT_P (src_1))
ec907dd8
JL
774 return find_base_value (src_1);
775
d4b60170 776 /* This might not be necessary anymore:
ec907dd8
JL
777 If either operand is a REG that is a known pointer, then it
778 is the base. */
3502dc9c 779 else if (GET_CODE (src_0) == REG && REG_POINTER (src_0))
2a2c8203 780 return find_base_value (src_0);
3502dc9c 781 else if (GET_CODE (src_1) == REG && REG_POINTER (src_1))
2a2c8203
JC
782 return find_base_value (src_1);
783
9ae8ffe7 784 return 0;
2a2c8203
JC
785 }
786
787 case LO_SUM:
788 /* The standard form is (lo_sum reg sym) so look only at the
789 second operand. */
790 return find_base_value (XEXP (src, 1));
9ae8ffe7
JL
791
792 case AND:
793 /* If the second operand is constant set the base
794 address to the first operand. */
2a2c8203
JC
795 if (GET_CODE (XEXP (src, 1)) == CONST_INT && INTVAL (XEXP (src, 1)) != 0)
796 return find_base_value (XEXP (src, 0));
9ae8ffe7
JL
797 return 0;
798
61f0131c
R
799 case TRUNCATE:
800 if (GET_MODE_SIZE (GET_MODE (src)) < GET_MODE_SIZE (Pmode))
801 break;
802 /* Fall through. */
de12be17
JC
803 case ZERO_EXTEND:
804 case SIGN_EXTEND: /* used for NT/Alpha pointers */
9ae8ffe7 805 case HIGH:
2a2c8203 806 return find_base_value (XEXP (src, 0));
1d300e19
KG
807
808 default:
809 break;
9ae8ffe7
JL
810 }
811
812 return 0;
813}
814
815/* Called from init_alias_analysis indirectly through note_stores. */
816
d4b60170 817/* While scanning insns to find base values, reg_seen[N] is nonzero if
9ae8ffe7
JL
818 register N has been set in this function. */
819static char *reg_seen;
820
13309a5f
JC
821/* Addresses which are known not to alias anything else are identified
822 by a unique integer. */
ec907dd8
JL
823static int unique_id;
824
2a2c8203 825static void
84832317 826record_set (dest, set, data)
9ae8ffe7 827 rtx dest, set;
84832317 828 void *data ATTRIBUTE_UNUSED;
9ae8ffe7 829{
ac606739 830 register unsigned regno;
9ae8ffe7
JL
831 rtx src;
832
833 if (GET_CODE (dest) != REG)
834 return;
835
fb6754f0 836 regno = REGNO (dest);
9ae8ffe7 837
ac606739
GS
838 if (regno >= reg_base_value_size)
839 abort ();
840
9ae8ffe7
JL
841 if (set)
842 {
843 /* A CLOBBER wipes out any old value but does not prevent a previously
844 unset register from acquiring a base address (i.e. reg_seen is not
845 set). */
846 if (GET_CODE (set) == CLOBBER)
847 {
ec907dd8 848 new_reg_base_value[regno] = 0;
9ae8ffe7
JL
849 return;
850 }
851 src = SET_SRC (set);
852 }
853 else
854 {
9ae8ffe7
JL
855 if (reg_seen[regno])
856 {
ec907dd8 857 new_reg_base_value[regno] = 0;
9ae8ffe7
JL
858 return;
859 }
860 reg_seen[regno] = 1;
38a448ca
RH
861 new_reg_base_value[regno] = gen_rtx_ADDRESS (Pmode,
862 GEN_INT (unique_id++));
9ae8ffe7
JL
863 return;
864 }
865
866 /* This is not the first set. If the new value is not related to the
867 old value, forget the base value. Note that the following code is
868 not detected:
869 extern int x, y; int *p = &x; p += (&y-&x);
870 ANSI C does not allow computing the difference of addresses
871 of distinct top level objects. */
ec907dd8 872 if (new_reg_base_value[regno])
9ae8ffe7
JL
873 switch (GET_CODE (src))
874 {
2a2c8203 875 case LO_SUM:
9ae8ffe7
JL
876 case MINUS:
877 if (XEXP (src, 0) != dest && XEXP (src, 1) != dest)
ec907dd8 878 new_reg_base_value[regno] = 0;
9ae8ffe7 879 break;
61f0131c
R
880 case PLUS:
881 /* If the value we add in the PLUS is also a valid base value,
882 this might be the actual base value, and the original value
883 an index. */
884 {
885 rtx other = NULL_RTX;
886
887 if (XEXP (src, 0) == dest)
888 other = XEXP (src, 1);
889 else if (XEXP (src, 1) == dest)
890 other = XEXP (src, 0);
891
892 if (! other || find_base_value (other))
893 new_reg_base_value[regno] = 0;
894 break;
895 }
9ae8ffe7
JL
896 case AND:
897 if (XEXP (src, 0) != dest || GET_CODE (XEXP (src, 1)) != CONST_INT)
ec907dd8 898 new_reg_base_value[regno] = 0;
9ae8ffe7 899 break;
9ae8ffe7 900 default:
ec907dd8 901 new_reg_base_value[regno] = 0;
9ae8ffe7
JL
902 break;
903 }
904 /* If this is the first set of a register, record the value. */
905 else if ((regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno])
ec907dd8
JL
906 && ! reg_seen[regno] && new_reg_base_value[regno] == 0)
907 new_reg_base_value[regno] = find_base_value (src);
9ae8ffe7
JL
908
909 reg_seen[regno] = 1;
910}
911
ac3d9668
RK
912/* Called from loop optimization when a new pseudo-register is
913 created. It indicates that REGNO is being set to VAL. f INVARIANT
914 is true then this value also describes an invariant relationship
915 which can be used to deduce that two registers with unknown values
916 are different. */
d4b60170 917
9ae8ffe7 918void
de12be17 919record_base_value (regno, val, invariant)
ac3d9668 920 unsigned int regno;
9ae8ffe7 921 rtx val;
de12be17 922 int invariant;
9ae8ffe7 923{
ac3d9668 924 if (regno >= reg_base_value_size)
9ae8ffe7 925 return;
de12be17 926
de12be17
JC
927 if (invariant && alias_invariant)
928 alias_invariant[regno] = val;
929
9ae8ffe7
JL
930 if (GET_CODE (val) == REG)
931 {
fb6754f0
BS
932 if (REGNO (val) < reg_base_value_size)
933 reg_base_value[regno] = reg_base_value[REGNO (val)];
d4b60170 934
9ae8ffe7
JL
935 return;
936 }
d4b60170 937
9ae8ffe7
JL
938 reg_base_value[regno] = find_base_value (val);
939}
940
db048faf
MM
941/* Returns a canonical version of X, from the point of view alias
942 analysis. (For example, if X is a MEM whose address is a register,
943 and the register has a known value (say a SYMBOL_REF), then a MEM
944 whose address is the SYMBOL_REF is returned.) */
945
946rtx
9ae8ffe7
JL
947canon_rtx (x)
948 rtx x;
949{
950 /* Recursively look for equivalences. */
fb6754f0
BS
951 if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER
952 && REGNO (x) < reg_known_value_size)
953 return reg_known_value[REGNO (x)] == x
954 ? x : canon_rtx (reg_known_value[REGNO (x)]);
9ae8ffe7
JL
955 else if (GET_CODE (x) == PLUS)
956 {
957 rtx x0 = canon_rtx (XEXP (x, 0));
958 rtx x1 = canon_rtx (XEXP (x, 1));
959
960 if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
961 {
962 /* We can tolerate LO_SUMs being offset here; these
963 rtl are used for nothing other than comparisons. */
964 if (GET_CODE (x0) == CONST_INT)
965 return plus_constant_for_output (x1, INTVAL (x0));
966 else if (GET_CODE (x1) == CONST_INT)
967 return plus_constant_for_output (x0, INTVAL (x1));
38a448ca 968 return gen_rtx_PLUS (GET_MODE (x), x0, x1);
9ae8ffe7
JL
969 }
970 }
d4b60170 971
9ae8ffe7
JL
972 /* This gives us much better alias analysis when called from
973 the loop optimizer. Note we want to leave the original
974 MEM alone, but need to return the canonicalized MEM with
975 all the flags with their original values. */
976 else if (GET_CODE (x) == MEM)
977 {
978 rtx addr = canon_rtx (XEXP (x, 0));
d4b60170 979
9ae8ffe7
JL
980 if (addr != XEXP (x, 0))
981 {
38a448ca 982 rtx new = gen_rtx_MEM (GET_MODE (x), addr);
d4b60170 983
c6df88cb 984 MEM_COPY_ATTRIBUTES (new, x);
9ae8ffe7
JL
985 x = new;
986 }
987 }
988 return x;
989}
990
991/* Return 1 if X and Y are identical-looking rtx's.
992
993 We use the data in reg_known_value above to see if two registers with
994 different numbers are, in fact, equivalent. */
995
996static int
997rtx_equal_for_memref_p (x, y)
998 rtx x, y;
999{
1000 register int i;
1001 register int j;
1002 register enum rtx_code code;
6f7d635c 1003 register const char *fmt;
9ae8ffe7
JL
1004
1005 if (x == 0 && y == 0)
1006 return 1;
1007 if (x == 0 || y == 0)
1008 return 0;
d4b60170 1009
9ae8ffe7
JL
1010 x = canon_rtx (x);
1011 y = canon_rtx (y);
1012
1013 if (x == y)
1014 return 1;
1015
1016 code = GET_CODE (x);
1017 /* Rtx's of different codes cannot be equal. */
1018 if (code != GET_CODE (y))
1019 return 0;
1020
1021 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1022 (REG:SI x) and (REG:HI x) are NOT equivalent. */
1023
1024 if (GET_MODE (x) != GET_MODE (y))
1025 return 0;
1026
db048faf
MM
1027 /* Some RTL can be compared without a recursive examination. */
1028 switch (code)
1029 {
1030 case REG:
1031 return REGNO (x) == REGNO (y);
1032
1033 case LABEL_REF:
1034 return XEXP (x, 0) == XEXP (y, 0);
1035
1036 case SYMBOL_REF:
1037 return XSTR (x, 0) == XSTR (y, 0);
1038
1039 case CONST_INT:
1040 case CONST_DOUBLE:
1041 /* There's no need to compare the contents of CONST_DOUBLEs or
1042 CONST_INTs because pointer equality is a good enough
1043 comparison for these nodes. */
1044 return 0;
1045
1046 case ADDRESSOF:
831ecbd4
RK
1047 return (XINT (x, 1) == XINT (y, 1)
1048 && rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0)));
db048faf
MM
1049
1050 default:
1051 break;
1052 }
9ae8ffe7
JL
1053
1054 /* For commutative operations, the RTX match if the operand match in any
1055 order. Also handle the simple binary and unary cases without a loop. */
1056 if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
1057 return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
1058 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
1059 || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
1060 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
1061 else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
1062 return (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
1063 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)));
1064 else if (GET_RTX_CLASS (code) == '1')
1065 return rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0));
1066
1067 /* Compare the elements. If any pair of corresponding elements
de12be17
JC
1068 fail to match, return 0 for the whole things.
1069
1070 Limit cases to types which actually appear in addresses. */
9ae8ffe7
JL
1071
1072 fmt = GET_RTX_FORMAT (code);
1073 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1074 {
1075 switch (fmt[i])
1076 {
9ae8ffe7
JL
1077 case 'i':
1078 if (XINT (x, i) != XINT (y, i))
1079 return 0;
1080 break;
1081
9ae8ffe7
JL
1082 case 'E':
1083 /* Two vectors must have the same length. */
1084 if (XVECLEN (x, i) != XVECLEN (y, i))
1085 return 0;
1086
1087 /* And the corresponding elements must match. */
1088 for (j = 0; j < XVECLEN (x, i); j++)
d4b60170
RK
1089 if (rtx_equal_for_memref_p (XVECEXP (x, i, j),
1090 XVECEXP (y, i, j)) == 0)
9ae8ffe7
JL
1091 return 0;
1092 break;
1093
1094 case 'e':
1095 if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0)
1096 return 0;
1097 break;
1098
aee21ba9
JL
1099 /* This can happen for an asm which clobbers memory. */
1100 case '0':
1101 break;
1102
9ae8ffe7
JL
1103 /* It is believed that rtx's at this level will never
1104 contain anything but integers and other rtx's,
1105 except for within LABEL_REFs and SYMBOL_REFs. */
1106 default:
1107 abort ();
1108 }
1109 }
1110 return 1;
1111}
1112
1113/* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
1114 X and return it, or return 0 if none found. */
1115
1116static rtx
1117find_symbolic_term (x)
1118 rtx x;
1119{
1120 register int i;
1121 register enum rtx_code code;
6f7d635c 1122 register const char *fmt;
9ae8ffe7
JL
1123
1124 code = GET_CODE (x);
1125 if (code == SYMBOL_REF || code == LABEL_REF)
1126 return x;
1127 if (GET_RTX_CLASS (code) == 'o')
1128 return 0;
1129
1130 fmt = GET_RTX_FORMAT (code);
1131 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1132 {
1133 rtx t;
1134
1135 if (fmt[i] == 'e')
1136 {
1137 t = find_symbolic_term (XEXP (x, i));
1138 if (t != 0)
1139 return t;
1140 }
1141 else if (fmt[i] == 'E')
1142 break;
1143 }
1144 return 0;
1145}
1146
1147static rtx
1148find_base_term (x)
1149 register rtx x;
1150{
eab5c70a
BS
1151 cselib_val *val;
1152 struct elt_loc_list *l;
1153
b949ea8b
JW
1154#if defined (FIND_BASE_TERM)
1155 /* Try machine-dependent ways to find the base term. */
1156 x = FIND_BASE_TERM (x);
1157#endif
1158
9ae8ffe7
JL
1159 switch (GET_CODE (x))
1160 {
1161 case REG:
1162 return REG_BASE_VALUE (x);
1163
de12be17
JC
1164 case ZERO_EXTEND:
1165 case SIGN_EXTEND: /* Used for Alpha/NT pointers */
9ae8ffe7 1166 case HIGH:
6d849a2a
JL
1167 case PRE_INC:
1168 case PRE_DEC:
1169 case POST_INC:
1170 case POST_DEC:
1171 return find_base_term (XEXP (x, 0));
1172
eab5c70a
BS
1173 case VALUE:
1174 val = CSELIB_VAL_PTR (x);
1175 for (l = val->locs; l; l = l->next)
1176 if ((x = find_base_term (l->loc)) != 0)
1177 return x;
1178 return 0;
1179
9ae8ffe7
JL
1180 case CONST:
1181 x = XEXP (x, 0);
1182 if (GET_CODE (x) != PLUS && GET_CODE (x) != MINUS)
1183 return 0;
1184 /* fall through */
1185 case LO_SUM:
1186 case PLUS:
1187 case MINUS:
1188 {
3c567fae
JL
1189 rtx tmp1 = XEXP (x, 0);
1190 rtx tmp2 = XEXP (x, 1);
1191
1192 /* This is a litle bit tricky since we have to determine which of
1193 the two operands represents the real base address. Otherwise this
1194 routine may return the index register instead of the base register.
1195
1196 That may cause us to believe no aliasing was possible, when in
1197 fact aliasing is possible.
1198
1199 We use a few simple tests to guess the base register. Additional
1200 tests can certainly be added. For example, if one of the operands
1201 is a shift or multiply, then it must be the index register and the
1202 other operand is the base register. */
1203
b949ea8b
JW
1204 if (tmp1 == pic_offset_table_rtx && CONSTANT_P (tmp2))
1205 return find_base_term (tmp2);
1206
3c567fae
JL
1207 /* If either operand is known to be a pointer, then use it
1208 to determine the base term. */
3502dc9c 1209 if (REG_P (tmp1) && REG_POINTER (tmp1))
3c567fae
JL
1210 return find_base_term (tmp1);
1211
3502dc9c 1212 if (REG_P (tmp2) && REG_POINTER (tmp2))
3c567fae
JL
1213 return find_base_term (tmp2);
1214
1215 /* Neither operand was known to be a pointer. Go ahead and find the
1216 base term for both operands. */
1217 tmp1 = find_base_term (tmp1);
1218 tmp2 = find_base_term (tmp2);
1219
1220 /* If either base term is named object or a special address
1221 (like an argument or stack reference), then use it for the
1222 base term. */
d4b60170 1223 if (tmp1 != 0
3c567fae
JL
1224 && (GET_CODE (tmp1) == SYMBOL_REF
1225 || GET_CODE (tmp1) == LABEL_REF
1226 || (GET_CODE (tmp1) == ADDRESS
1227 && GET_MODE (tmp1) != VOIDmode)))
1228 return tmp1;
1229
d4b60170 1230 if (tmp2 != 0
3c567fae
JL
1231 && (GET_CODE (tmp2) == SYMBOL_REF
1232 || GET_CODE (tmp2) == LABEL_REF
1233 || (GET_CODE (tmp2) == ADDRESS
1234 && GET_MODE (tmp2) != VOIDmode)))
1235 return tmp2;
1236
1237 /* We could not determine which of the two operands was the
1238 base register and which was the index. So we can determine
1239 nothing from the base alias check. */
1240 return 0;
9ae8ffe7
JL
1241 }
1242
1243 case AND:
1244 if (GET_CODE (XEXP (x, 0)) == REG && GET_CODE (XEXP (x, 1)) == CONST_INT)
1245 return REG_BASE_VALUE (XEXP (x, 0));
1246 return 0;
1247
1248 case SYMBOL_REF:
1249 case LABEL_REF:
1250 return x;
1251
d982e46e 1252 case ADDRESSOF:
bb07060a 1253 return REG_BASE_VALUE (frame_pointer_rtx);
d982e46e 1254
9ae8ffe7
JL
1255 default:
1256 return 0;
1257 }
1258}
1259
1260/* Return 0 if the addresses X and Y are known to point to different
1261 objects, 1 if they might be pointers to the same object. */
1262
1263static int
56ee9281 1264base_alias_check (x, y, x_mode, y_mode)
9ae8ffe7 1265 rtx x, y;
56ee9281 1266 enum machine_mode x_mode, y_mode;
9ae8ffe7
JL
1267{
1268 rtx x_base = find_base_term (x);
1269 rtx y_base = find_base_term (y);
1270
1c72c7f6
JC
1271 /* If the address itself has no known base see if a known equivalent
1272 value has one. If either address still has no known base, nothing
1273 is known about aliasing. */
1274 if (x_base == 0)
1275 {
1276 rtx x_c;
d4b60170 1277
1c72c7f6
JC
1278 if (! flag_expensive_optimizations || (x_c = canon_rtx (x)) == x)
1279 return 1;
d4b60170 1280
1c72c7f6
JC
1281 x_base = find_base_term (x_c);
1282 if (x_base == 0)
1283 return 1;
1284 }
9ae8ffe7 1285
1c72c7f6
JC
1286 if (y_base == 0)
1287 {
1288 rtx y_c;
1289 if (! flag_expensive_optimizations || (y_c = canon_rtx (y)) == y)
1290 return 1;
d4b60170 1291
1c72c7f6
JC
1292 y_base = find_base_term (y_c);
1293 if (y_base == 0)
1294 return 1;
1295 }
1296
1297 /* If the base addresses are equal nothing is known about aliasing. */
1298 if (rtx_equal_p (x_base, y_base))
9ae8ffe7
JL
1299 return 1;
1300
56ee9281
RH
1301 /* The base addresses of the read and write are different expressions.
1302 If they are both symbols and they are not accessed via AND, there is
1303 no conflict. We can bring knowledge of object alignment into play
1304 here. For example, on alpha, "char a, b;" can alias one another,
1305 though "char a; long b;" cannot. */
9ae8ffe7 1306 if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
c02f035f 1307 {
56ee9281
RH
1308 if (GET_CODE (x) == AND && GET_CODE (y) == AND)
1309 return 1;
1310 if (GET_CODE (x) == AND
1311 && (GET_CODE (XEXP (x, 1)) != CONST_INT
1312 || GET_MODE_UNIT_SIZE (y_mode) < -INTVAL (XEXP (x, 1))))
1313 return 1;
1314 if (GET_CODE (y) == AND
1315 && (GET_CODE (XEXP (y, 1)) != CONST_INT
1316 || GET_MODE_UNIT_SIZE (x_mode) < -INTVAL (XEXP (y, 1))))
1317 return 1;
b2972551
JL
1318 /* Differing symbols never alias. */
1319 return 0;
c02f035f 1320 }
9ae8ffe7
JL
1321
1322 /* If one address is a stack reference there can be no alias:
1323 stack references using different base registers do not alias,
1324 a stack reference can not alias a parameter, and a stack reference
1325 can not alias a global. */
1326 if ((GET_CODE (x_base) == ADDRESS && GET_MODE (x_base) == Pmode)
1327 || (GET_CODE (y_base) == ADDRESS && GET_MODE (y_base) == Pmode))
1328 return 0;
1329
1330 if (! flag_argument_noalias)
1331 return 1;
1332
1333 if (flag_argument_noalias > 1)
1334 return 0;
1335
1336 /* Weak noalias assertion (arguments are distinct, but may match globals). */
1337 return ! (GET_MODE (x_base) == VOIDmode && GET_MODE (y_base) == VOIDmode);
1338}
1339
eab5c70a
BS
1340/* Convert the address X into something we can use. This is done by returning
1341 it unchanged unless it is a value; in the latter case we call cselib to get
1342 a more useful rtx. */
3bdf5ad1 1343
a13d4ebf 1344rtx
eab5c70a
BS
1345get_addr (x)
1346 rtx x;
1347{
1348 cselib_val *v;
1349 struct elt_loc_list *l;
1350
1351 if (GET_CODE (x) != VALUE)
1352 return x;
1353 v = CSELIB_VAL_PTR (x);
1354 for (l = v->locs; l; l = l->next)
1355 if (CONSTANT_P (l->loc))
1356 return l->loc;
1357 for (l = v->locs; l; l = l->next)
1358 if (GET_CODE (l->loc) != REG && GET_CODE (l->loc) != MEM)
1359 return l->loc;
1360 if (v->locs)
1361 return v->locs->loc;
1362 return x;
1363}
1364
39cec1ac
MH
1365/* Return the address of the (N_REFS + 1)th memory reference to ADDR
1366 where SIZE is the size in bytes of the memory reference. If ADDR
1367 is not modified by the memory reference then ADDR is returned. */
1368
1369rtx
1370addr_side_effect_eval (addr, size, n_refs)
1371 rtx addr;
1372 int size;
1373 int n_refs;
1374{
1375 int offset = 0;
1376
1377 switch (GET_CODE (addr))
1378 {
1379 case PRE_INC:
1380 offset = (n_refs + 1) * size;
1381 break;
1382 case PRE_DEC:
1383 offset = -(n_refs + 1) * size;
1384 break;
1385 case POST_INC:
1386 offset = n_refs * size;
1387 break;
1388 case POST_DEC:
1389 offset = -n_refs * size;
1390 break;
1391
1392 default:
1393 return addr;
1394 }
1395
1396 if (offset)
1397 addr = gen_rtx_PLUS (GET_MODE (addr), XEXP (addr, 0), GEN_INT (offset));
1398 else
1399 addr = XEXP (addr, 0);
1400
1401 return addr;
1402}
1403
9ae8ffe7
JL
1404/* Return nonzero if X and Y (memory addresses) could reference the
1405 same location in memory. C is an offset accumulator. When
1406 C is nonzero, we are testing aliases between X and Y + C.
1407 XSIZE is the size in bytes of the X reference,
1408 similarly YSIZE is the size in bytes for Y.
1409
1410 If XSIZE or YSIZE is zero, we do not know the amount of memory being
1411 referenced (the reference was BLKmode), so make the most pessimistic
1412 assumptions.
1413
c02f035f
RH
1414 If XSIZE or YSIZE is negative, we may access memory outside the object
1415 being referenced as a side effect. This can happen when using AND to
1416 align memory references, as is done on the Alpha.
1417
9ae8ffe7 1418 Nice to notice that varying addresses cannot conflict with fp if no
0211b6ab 1419 local variables had their addresses taken, but that's too hard now. */
9ae8ffe7 1420
9ae8ffe7
JL
1421static int
1422memrefs_conflict_p (xsize, x, ysize, y, c)
1423 register rtx x, y;
1424 int xsize, ysize;
1425 HOST_WIDE_INT c;
1426{
eab5c70a
BS
1427 if (GET_CODE (x) == VALUE)
1428 x = get_addr (x);
1429 if (GET_CODE (y) == VALUE)
1430 y = get_addr (y);
9ae8ffe7
JL
1431 if (GET_CODE (x) == HIGH)
1432 x = XEXP (x, 0);
1433 else if (GET_CODE (x) == LO_SUM)
1434 x = XEXP (x, 1);
1435 else
39cec1ac 1436 x = canon_rtx (addr_side_effect_eval (x, xsize, 0));
9ae8ffe7
JL
1437 if (GET_CODE (y) == HIGH)
1438 y = XEXP (y, 0);
1439 else if (GET_CODE (y) == LO_SUM)
1440 y = XEXP (y, 1);
1441 else
39cec1ac 1442 y = canon_rtx (addr_side_effect_eval (y, ysize, 0));
9ae8ffe7
JL
1443
1444 if (rtx_equal_for_memref_p (x, y))
1445 {
c02f035f 1446 if (xsize <= 0 || ysize <= 0)
9ae8ffe7
JL
1447 return 1;
1448 if (c >= 0 && xsize > c)
1449 return 1;
1450 if (c < 0 && ysize+c > 0)
1451 return 1;
1452 return 0;
1453 }
1454
6e73e666
JC
1455 /* This code used to check for conflicts involving stack references and
1456 globals but the base address alias code now handles these cases. */
9ae8ffe7
JL
1457
1458 if (GET_CODE (x) == PLUS)
1459 {
1460 /* The fact that X is canonicalized means that this
1461 PLUS rtx is canonicalized. */
1462 rtx x0 = XEXP (x, 0);
1463 rtx x1 = XEXP (x, 1);
1464
1465 if (GET_CODE (y) == PLUS)
1466 {
1467 /* The fact that Y is canonicalized means that this
1468 PLUS rtx is canonicalized. */
1469 rtx y0 = XEXP (y, 0);
1470 rtx y1 = XEXP (y, 1);
1471
1472 if (rtx_equal_for_memref_p (x1, y1))
1473 return memrefs_conflict_p (xsize, x0, ysize, y0, c);
1474 if (rtx_equal_for_memref_p (x0, y0))
1475 return memrefs_conflict_p (xsize, x1, ysize, y1, c);
1476 if (GET_CODE (x1) == CONST_INT)
63be02db
JM
1477 {
1478 if (GET_CODE (y1) == CONST_INT)
1479 return memrefs_conflict_p (xsize, x0, ysize, y0,
1480 c - INTVAL (x1) + INTVAL (y1));
1481 else
1482 return memrefs_conflict_p (xsize, x0, ysize, y,
1483 c - INTVAL (x1));
1484 }
9ae8ffe7
JL
1485 else if (GET_CODE (y1) == CONST_INT)
1486 return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
1487
6e73e666 1488 return 1;
9ae8ffe7
JL
1489 }
1490 else if (GET_CODE (x1) == CONST_INT)
1491 return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
1492 }
1493 else if (GET_CODE (y) == PLUS)
1494 {
1495 /* The fact that Y is canonicalized means that this
1496 PLUS rtx is canonicalized. */
1497 rtx y0 = XEXP (y, 0);
1498 rtx y1 = XEXP (y, 1);
1499
1500 if (GET_CODE (y1) == CONST_INT)
1501 return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
1502 else
1503 return 1;
1504 }
1505
1506 if (GET_CODE (x) == GET_CODE (y))
1507 switch (GET_CODE (x))
1508 {
1509 case MULT:
1510 {
1511 /* Handle cases where we expect the second operands to be the
1512 same, and check only whether the first operand would conflict
1513 or not. */
1514 rtx x0, y0;
1515 rtx x1 = canon_rtx (XEXP (x, 1));
1516 rtx y1 = canon_rtx (XEXP (y, 1));
1517 if (! rtx_equal_for_memref_p (x1, y1))
1518 return 1;
1519 x0 = canon_rtx (XEXP (x, 0));
1520 y0 = canon_rtx (XEXP (y, 0));
1521 if (rtx_equal_for_memref_p (x0, y0))
1522 return (xsize == 0 || ysize == 0
1523 || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
1524
1525 /* Can't properly adjust our sizes. */
1526 if (GET_CODE (x1) != CONST_INT)
1527 return 1;
1528 xsize /= INTVAL (x1);
1529 ysize /= INTVAL (x1);
1530 c /= INTVAL (x1);
1531 return memrefs_conflict_p (xsize, x0, ysize, y0, c);
1532 }
1d300e19 1533
de12be17
JC
1534 case REG:
1535 /* Are these registers known not to be equal? */
1536 if (alias_invariant)
1537 {
e51712db 1538 unsigned int r_x = REGNO (x), r_y = REGNO (y);
de12be17
JC
1539 rtx i_x, i_y; /* invariant relationships of X and Y */
1540
1541 i_x = r_x >= reg_base_value_size ? 0 : alias_invariant[r_x];
1542 i_y = r_y >= reg_base_value_size ? 0 : alias_invariant[r_y];
1543
1544 if (i_x == 0 && i_y == 0)
1545 break;
1546
1547 if (! memrefs_conflict_p (xsize, i_x ? i_x : x,
1548 ysize, i_y ? i_y : y, c))
1549 return 0;
1550 }
1551 break;
1552
1d300e19
KG
1553 default:
1554 break;
9ae8ffe7
JL
1555 }
1556
1557 /* Treat an access through an AND (e.g. a subword access on an Alpha)
56ee9281
RH
1558 as an access with indeterminate size. Assume that references
1559 besides AND are aligned, so if the size of the other reference is
1560 at least as large as the alignment, assume no other overlap. */
9ae8ffe7 1561 if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT)
56ee9281 1562 {
02e3377d 1563 if (GET_CODE (y) == AND || ysize < -INTVAL (XEXP (x, 1)))
56ee9281
RH
1564 xsize = -1;
1565 return memrefs_conflict_p (xsize, XEXP (x, 0), ysize, y, c);
1566 }
9ae8ffe7 1567 if (GET_CODE (y) == AND && GET_CODE (XEXP (y, 1)) == CONST_INT)
c02f035f 1568 {
56ee9281 1569 /* ??? If we are indexing far enough into the array/structure, we
c02f035f
RH
1570 may yet be able to determine that we can not overlap. But we
1571 also need to that we are far enough from the end not to overlap
56ee9281 1572 a following reference, so we do nothing with that for now. */
02e3377d 1573 if (GET_CODE (x) == AND || xsize < -INTVAL (XEXP (y, 1)))
56ee9281
RH
1574 ysize = -1;
1575 return memrefs_conflict_p (xsize, x, ysize, XEXP (y, 0), c);
c02f035f 1576 }
9ae8ffe7 1577
b24ea077
JW
1578 if (GET_CODE (x) == ADDRESSOF)
1579 {
1580 if (y == frame_pointer_rtx
1581 || GET_CODE (y) == ADDRESSOF)
1582 return xsize <= 0 || ysize <= 0;
1583 }
1584 if (GET_CODE (y) == ADDRESSOF)
1585 {
1586 if (x == frame_pointer_rtx)
1587 return xsize <= 0 || ysize <= 0;
1588 }
d982e46e 1589
9ae8ffe7
JL
1590 if (CONSTANT_P (x))
1591 {
1592 if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
1593 {
1594 c += (INTVAL (y) - INTVAL (x));
c02f035f 1595 return (xsize <= 0 || ysize <= 0
9ae8ffe7
JL
1596 || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
1597 }
1598
1599 if (GET_CODE (x) == CONST)
1600 {
1601 if (GET_CODE (y) == CONST)
1602 return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
1603 ysize, canon_rtx (XEXP (y, 0)), c);
1604 else
1605 return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
1606 ysize, y, c);
1607 }
1608 if (GET_CODE (y) == CONST)
1609 return memrefs_conflict_p (xsize, x, ysize,
1610 canon_rtx (XEXP (y, 0)), c);
1611
1612 if (CONSTANT_P (y))
b949ea8b 1613 return (xsize <= 0 || ysize <= 0
c02f035f 1614 || (rtx_equal_for_memref_p (x, y)
b949ea8b 1615 && ((c >= 0 && xsize > c) || (c < 0 && ysize+c > 0))));
9ae8ffe7
JL
1616
1617 return 1;
1618 }
1619 return 1;
1620}
1621
1622/* Functions to compute memory dependencies.
1623
1624 Since we process the insns in execution order, we can build tables
1625 to keep track of what registers are fixed (and not aliased), what registers
1626 are varying in known ways, and what registers are varying in unknown
1627 ways.
1628
1629 If both memory references are volatile, then there must always be a
1630 dependence between the two references, since their order can not be
1631 changed. A volatile and non-volatile reference can be interchanged
1632 though.
1633
dc1618bc
RK
1634 A MEM_IN_STRUCT reference at a non-AND varying address can never
1635 conflict with a non-MEM_IN_STRUCT reference at a fixed address. We
1636 also must allow AND addresses, because they may generate accesses
1637 outside the object being referenced. This is used to generate
1638 aligned addresses from unaligned addresses, for instance, the alpha
1639 storeqi_unaligned pattern. */
9ae8ffe7
JL
1640
1641/* Read dependence: X is read after read in MEM takes place. There can
1642 only be a dependence here if both reads are volatile. */
1643
1644int
1645read_dependence (mem, x)
1646 rtx mem;
1647 rtx x;
1648{
1649 return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
1650}
1651
c6df88cb
MM
1652/* Returns MEM1 if and only if MEM1 is a scalar at a fixed address and
1653 MEM2 is a reference to a structure at a varying address, or returns
1654 MEM2 if vice versa. Otherwise, returns NULL_RTX. If a non-NULL
1655 value is returned MEM1 and MEM2 can never alias. VARIES_P is used
1656 to decide whether or not an address may vary; it should return
eab5c70a
BS
1657 nonzero whenever variation is possible.
1658 MEM1_ADDR and MEM2_ADDR are the addresses of MEM1 and MEM2. */
1659
2c72b78f 1660static rtx
eab5c70a
BS
1661fixed_scalar_and_varying_struct_p (mem1, mem2, mem1_addr, mem2_addr, varies_p)
1662 rtx mem1, mem2;
1663 rtx mem1_addr, mem2_addr;
e38fe8e0 1664 int (*varies_p) PARAMS ((rtx, int));
eab5c70a 1665{
3e0abe15
GK
1666 if (! flag_strict_aliasing)
1667 return NULL_RTX;
1668
c6df88cb 1669 if (MEM_SCALAR_P (mem1) && MEM_IN_STRUCT_P (mem2)
e38fe8e0 1670 && !varies_p (mem1_addr, 1) && varies_p (mem2_addr, 1))
c6df88cb
MM
1671 /* MEM1 is a scalar at a fixed address; MEM2 is a struct at a
1672 varying address. */
1673 return mem1;
1674
1675 if (MEM_IN_STRUCT_P (mem1) && MEM_SCALAR_P (mem2)
e38fe8e0 1676 && varies_p (mem1_addr, 1) && !varies_p (mem2_addr, 1))
c6df88cb
MM
1677 /* MEM2 is a scalar at a fixed address; MEM1 is a struct at a
1678 varying address. */
1679 return mem2;
1680
1681 return NULL_RTX;
1682}
1683
1684/* Returns nonzero if something about the mode or address format MEM1
1685 indicates that it might well alias *anything*. */
1686
2c72b78f 1687static int
c6df88cb
MM
1688aliases_everything_p (mem)
1689 rtx mem;
1690{
c6df88cb
MM
1691 if (GET_CODE (XEXP (mem, 0)) == AND)
1692 /* If the address is an AND, its very hard to know at what it is
1693 actually pointing. */
1694 return 1;
1695
1696 return 0;
1697}
1698
9ae8ffe7
JL
1699/* True dependence: X is read after store in MEM takes place. */
1700
1701int
1702true_dependence (mem, mem_mode, x, varies)
1703 rtx mem;
1704 enum machine_mode mem_mode;
1705 rtx x;
e38fe8e0 1706 int (*varies) PARAMS ((rtx, int));
9ae8ffe7 1707{
6e73e666 1708 register rtx x_addr, mem_addr;
49982682 1709 rtx base;
9ae8ffe7
JL
1710
1711 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
1712 return 1;
1713
41472af8
MM
1714 if (DIFFERENT_ALIAS_SETS_P (x, mem))
1715 return 0;
1716
b949ea8b
JW
1717 /* Unchanging memory can't conflict with non-unchanging memory.
1718 A non-unchanging read can conflict with a non-unchanging write.
1719 An unchanging read can conflict with an unchanging write since
1720 there may be a single store to this address to initialize it.
ec569656
RK
1721 Note that an unchanging store can conflict with a non-unchanging read
1722 since we have to make conservative assumptions when we have a
1723 record with readonly fields and we are copying the whole thing.
b949ea8b
JW
1724 Just fall through to the code below to resolve potential conflicts.
1725 This won't handle all cases optimally, but the possible performance
1726 loss should be negligible. */
ec569656 1727 if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
9ae8ffe7
JL
1728 return 0;
1729
56ee9281
RH
1730 if (mem_mode == VOIDmode)
1731 mem_mode = GET_MODE (mem);
1732
eab5c70a
BS
1733 x_addr = get_addr (XEXP (x, 0));
1734 mem_addr = get_addr (XEXP (mem, 0));
1735
55efb413
JW
1736 base = find_base_term (x_addr);
1737 if (base && (GET_CODE (base) == LABEL_REF
1738 || (GET_CODE (base) == SYMBOL_REF
1739 && CONSTANT_POOL_ADDRESS_P (base))))
1740 return 0;
1741
eab5c70a 1742 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
1c72c7f6
JC
1743 return 0;
1744
eab5c70a
BS
1745 x_addr = canon_rtx (x_addr);
1746 mem_addr = canon_rtx (mem_addr);
6e73e666 1747
0211b6ab
JW
1748 if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
1749 SIZE_FOR_MODE (x), x_addr, 0))
1750 return 0;
1751
c6df88cb 1752 if (aliases_everything_p (x))
0211b6ab
JW
1753 return 1;
1754
c6df88cb
MM
1755 /* We cannot use aliases_everyting_p to test MEM, since we must look
1756 at MEM_MODE, rather than GET_MODE (MEM). */
1757 if (mem_mode == QImode || GET_CODE (mem_addr) == AND)
a13d4ebf
AM
1758 return 1;
1759
1760 /* In true_dependence we also allow BLKmode to alias anything. Why
1761 don't we do this in anti_dependence and output_dependence? */
1762 if (mem_mode == BLKmode || GET_MODE (x) == BLKmode)
1763 return 1;
1764
1765 return ! fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr,
1766 varies);
1767}
1768
1769/* Canonical true dependence: X is read after store in MEM takes place.
1770 Variant of true_dependece which assumes MEM has already been
1771 canonicalized (hence we no longer do that here).
1772 The mem_addr argument has been added, since true_dependence computed
1773 this value prior to canonicalizing. */
1774
1775int
1776canon_true_dependence (mem, mem_mode, mem_addr, x, varies)
1777 rtx mem, mem_addr, x;
1778 enum machine_mode mem_mode;
1779 int (*varies) PARAMS ((rtx, int));
1780{
1781 register rtx x_addr;
1782
1783 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
1784 return 1;
1785
1786 if (DIFFERENT_ALIAS_SETS_P (x, mem))
1787 return 0;
1788
1789 /* If X is an unchanging read, then it can't possibly conflict with any
1790 non-unchanging store. It may conflict with an unchanging write though,
1791 because there may be a single store to this address to initialize it.
1792 Just fall through to the code below to resolve the case where we have
1793 both an unchanging read and an unchanging write. This won't handle all
1794 cases optimally, but the possible performance loss should be
1795 negligible. */
1796 if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
1797 return 0;
1798
1799 x_addr = get_addr (XEXP (x, 0));
1800
1801 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
1802 return 0;
1803
1804 x_addr = canon_rtx (x_addr);
1805 if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
1806 SIZE_FOR_MODE (x), x_addr, 0))
1807 return 0;
1808
1809 if (aliases_everything_p (x))
1810 return 1;
1811
1812 /* We cannot use aliases_everyting_p to test MEM, since we must look
1813 at MEM_MODE, rather than GET_MODE (MEM). */
1814 if (mem_mode == QImode || GET_CODE (mem_addr) == AND)
c6df88cb 1815 return 1;
0211b6ab 1816
c6df88cb
MM
1817 /* In true_dependence we also allow BLKmode to alias anything. Why
1818 don't we do this in anti_dependence and output_dependence? */
1819 if (mem_mode == BLKmode || GET_MODE (x) == BLKmode)
1820 return 1;
0211b6ab 1821
eab5c70a
BS
1822 return ! fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr,
1823 varies);
9ae8ffe7
JL
1824}
1825
c6df88cb
MM
1826/* Returns non-zero if a write to X might alias a previous read from
1827 (or, if WRITEP is non-zero, a write to) MEM. */
9ae8ffe7 1828
2c72b78f 1829static int
c6df88cb 1830write_dependence_p (mem, x, writep)
9ae8ffe7
JL
1831 rtx mem;
1832 rtx x;
c6df88cb 1833 int writep;
9ae8ffe7 1834{
6e73e666 1835 rtx x_addr, mem_addr;
c6df88cb 1836 rtx fixed_scalar;
49982682 1837 rtx base;
6e73e666 1838
9ae8ffe7
JL
1839 if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
1840 return 1;
1841
eab5c70a
BS
1842 if (DIFFERENT_ALIAS_SETS_P (x, mem))
1843 return 0;
1844
b949ea8b
JW
1845 /* Unchanging memory can't conflict with non-unchanging memory. */
1846 if (RTX_UNCHANGING_P (x) != RTX_UNCHANGING_P (mem))
1847 return 0;
1848
9ae8ffe7
JL
1849 /* If MEM is an unchanging read, then it can't possibly conflict with
1850 the store to X, because there is at most one store to MEM, and it must
1851 have occurred somewhere before MEM. */
55efb413
JW
1852 if (! writep && RTX_UNCHANGING_P (mem))
1853 return 0;
1854
1855 x_addr = get_addr (XEXP (x, 0));
1856 mem_addr = get_addr (XEXP (mem, 0));
1857
49982682
JW
1858 if (! writep)
1859 {
55efb413 1860 base = find_base_term (mem_addr);
49982682
JW
1861 if (base && (GET_CODE (base) == LABEL_REF
1862 || (GET_CODE (base) == SYMBOL_REF
1863 && CONSTANT_POOL_ADDRESS_P (base))))
1864 return 0;
1865 }
1866
eab5c70a
BS
1867 if (! base_alias_check (x_addr, mem_addr, GET_MODE (x),
1868 GET_MODE (mem)))
41472af8
MM
1869 return 0;
1870
eab5c70a
BS
1871 x_addr = canon_rtx (x_addr);
1872 mem_addr = canon_rtx (mem_addr);
6e73e666 1873
c6df88cb
MM
1874 if (!memrefs_conflict_p (SIZE_FOR_MODE (mem), mem_addr,
1875 SIZE_FOR_MODE (x), x_addr, 0))
1876 return 0;
1877
1878 fixed_scalar
eab5c70a
BS
1879 = fixed_scalar_and_varying_struct_p (mem, x, mem_addr, x_addr,
1880 rtx_addr_varies_p);
1881
c6df88cb
MM
1882 return (!(fixed_scalar == mem && !aliases_everything_p (x))
1883 && !(fixed_scalar == x && !aliases_everything_p (mem)));
1884}
1885
1886/* Anti dependence: X is written after read in MEM takes place. */
1887
1888int
1889anti_dependence (mem, x)
1890 rtx mem;
1891 rtx x;
1892{
1893 return write_dependence_p (mem, x, /*writep=*/0);
9ae8ffe7
JL
1894}
1895
1896/* Output dependence: X is written after store in MEM takes place. */
1897
1898int
1899output_dependence (mem, x)
1900 register rtx mem;
1901 register rtx x;
1902{
c6df88cb 1903 return write_dependence_p (mem, x, /*writep=*/1);
9ae8ffe7
JL
1904}
1905
bf6d9fd7 1906/* Returns non-zero if X mentions something which is not
7790df19
JW
1907 local to the function and is not constant. */
1908
1909static int
bf6d9fd7 1910nonlocal_mentioned_p (x)
7790df19
JW
1911 rtx x;
1912{
1913 rtx base;
1914 register RTX_CODE code;
1915 int regno;
1916
1917 code = GET_CODE (x);
1918
1919 if (GET_RTX_CLASS (code) == 'i')
1920 {
2a8f6b90
JH
1921 /* Constant functions can be constant if they don't use
1922 scratch memory used to mark function w/o side effects. */
7790df19 1923 if (code == CALL_INSN && CONST_CALL_P (x))
2a8f6b90
JH
1924 {
1925 x = CALL_INSN_FUNCTION_USAGE (x);
f8cd4126
RK
1926 if (x == 0)
1927 return 0;
2a8f6b90
JH
1928 }
1929 else
1930 x = PATTERN (x);
7790df19
JW
1931 code = GET_CODE (x);
1932 }
1933
1934 switch (code)
1935 {
1936 case SUBREG:
1937 if (GET_CODE (SUBREG_REG (x)) == REG)
1938 {
1939 /* Global registers are not local. */
1940 if (REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER
ddef6bc7 1941 && global_regs[subreg_regno (x)])
7790df19
JW
1942 return 1;
1943 return 0;
1944 }
1945 break;
1946
1947 case REG:
1948 regno = REGNO (x);
1949 /* Global registers are not local. */
1950 if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
1951 return 1;
1952 return 0;
1953
1954 case SCRATCH:
1955 case PC:
1956 case CC0:
1957 case CONST_INT:
1958 case CONST_DOUBLE:
1959 case CONST:
1960 case LABEL_REF:
1961 return 0;
1962
1963 case SYMBOL_REF:
1964 /* Constants in the function's constants pool are constant. */
1965 if (CONSTANT_POOL_ADDRESS_P (x))
1966 return 0;
1967 return 1;
1968
1969 case CALL:
bf6d9fd7 1970 /* Non-constant calls and recursion are not local. */
7790df19
JW
1971 return 1;
1972
1973 case MEM:
1974 /* Be overly conservative and consider any volatile memory
1975 reference as not local. */
1976 if (MEM_VOLATILE_P (x))
1977 return 1;
1978 base = find_base_term (XEXP (x, 0));
1979 if (base)
1980 {
b3b5ad95
JL
1981 /* A Pmode ADDRESS could be a reference via the structure value
1982 address or static chain. Such memory references are nonlocal.
1983
1984 Thus, we have to examine the contents of the ADDRESS to find
1985 out if this is a local reference or not. */
1986 if (GET_CODE (base) == ADDRESS
1987 && GET_MODE (base) == Pmode
1988 && (XEXP (base, 0) == stack_pointer_rtx
1989 || XEXP (base, 0) == arg_pointer_rtx
1990#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1991 || XEXP (base, 0) == hard_frame_pointer_rtx
1992#endif
1993 || XEXP (base, 0) == frame_pointer_rtx))
7790df19
JW
1994 return 0;
1995 /* Constants in the function's constant pool are constant. */
1996 if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
1997 return 0;
1998 }
1999 return 1;
2000
bf6d9fd7 2001 case UNSPEC_VOLATILE:
7790df19 2002 case ASM_INPUT:
7790df19
JW
2003 return 1;
2004
bf6d9fd7
JW
2005 case ASM_OPERANDS:
2006 if (MEM_VOLATILE_P (x))
2007 return 1;
2008
2009 /* FALLTHROUGH */
2010
7790df19
JW
2011 default:
2012 break;
2013 }
2014
2015 /* Recursively scan the operands of this expression. */
2016
2017 {
499b1098 2018 register const char *fmt = GET_RTX_FORMAT (code);
7790df19
JW
2019 register int i;
2020
2021 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2022 {
2a8f6b90 2023 if (fmt[i] == 'e' && XEXP (x, i))
7790df19 2024 {
bf6d9fd7 2025 if (nonlocal_mentioned_p (XEXP (x, i)))
7790df19
JW
2026 return 1;
2027 }
d4757e6a 2028 else if (fmt[i] == 'E')
7790df19
JW
2029 {
2030 register int j;
2031 for (j = 0; j < XVECLEN (x, i); j++)
bf6d9fd7 2032 if (nonlocal_mentioned_p (XVECEXP (x, i, j)))
7790df19
JW
2033 return 1;
2034 }
2035 }
2036 }
2037
2038 return 0;
2039}
2040
e004f2f7
JW
2041/* Return non-zero if a loop (natural or otherwise) is present.
2042 Inspired by Depth_First_Search_PP described in:
2043
2044 Advanced Compiler Design and Implementation
2045 Steven Muchnick
2046 Morgan Kaufmann, 1997
2047
2048 and heavily borrowed from flow_depth_first_order_compute. */
2049
2050static int
2051loop_p ()
2052{
2053 edge *stack;
2054 int *pre;
2055 int *post;
2056 int sp;
2057 int prenum = 1;
2058 int postnum = 1;
2059 sbitmap visited;
2060
2061 /* Allocate the preorder and postorder number arrays. */
2062 pre = (int *) xcalloc (n_basic_blocks, sizeof (int));
2063 post = (int *) xcalloc (n_basic_blocks, sizeof (int));
2064
2065 /* Allocate stack for back-tracking up CFG. */
2066 stack = (edge *) xmalloc ((n_basic_blocks + 1) * sizeof (edge));
2067 sp = 0;
2068
2069 /* Allocate bitmap to track nodes that have been visited. */
2070 visited = sbitmap_alloc (n_basic_blocks);
2071
2072 /* None of the nodes in the CFG have been visited yet. */
2073 sbitmap_zero (visited);
2074
2075 /* Push the first edge on to the stack. */
2076 stack[sp++] = ENTRY_BLOCK_PTR->succ;
2077
2078 while (sp)
2079 {
2080 edge e;
2081 basic_block src;
2082 basic_block dest;
2083
2084 /* Look at the edge on the top of the stack. */
2085 e = stack[sp - 1];
2086 src = e->src;
2087 dest = e->dest;
2088
2089 /* Check if the edge destination has been visited yet. */
2090 if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
2091 {
2092 /* Mark that we have visited the destination. */
2093 SET_BIT (visited, dest->index);
2094
2095 pre[dest->index] = prenum++;
2096
2097 if (dest->succ)
2098 {
2099 /* Since the DEST node has been visited for the first
2100 time, check its successors. */
2101 stack[sp++] = dest->succ;
2102 }
2103 else
2104 post[dest->index] = postnum++;
2105 }
2106 else
2107 {
2108 if (dest != EXIT_BLOCK_PTR
2109 && pre[src->index] >= pre[dest->index]
2110 && post[dest->index] == 0)
2111 break;
2112
2113 if (! e->succ_next && src != ENTRY_BLOCK_PTR)
2114 post[src->index] = postnum++;
2115
2116 if (e->succ_next)
2117 stack[sp - 1] = e->succ_next;
2118 else
2119 sp--;
2120 }
2121 }
2122
2123 free (pre);
2124 free (post);
2125 free (stack);
2126 sbitmap_free (visited);
2127
2128 return sp;
2129}
2130
7790df19
JW
2131/* Mark the function if it is constant. */
2132
2133void
2134mark_constant_function ()
2135{
2136 rtx insn;
bf6d9fd7 2137 int nonlocal_mentioned;
7790df19
JW
2138
2139 if (TREE_PUBLIC (current_function_decl)
2140 || TREE_READONLY (current_function_decl)
bf6d9fd7 2141 || DECL_IS_PURE (current_function_decl)
7790df19
JW
2142 || TREE_THIS_VOLATILE (current_function_decl)
2143 || TYPE_MODE (TREE_TYPE (current_function_decl)) == VOIDmode)
2144 return;
2145
e004f2f7
JW
2146 /* A loop might not return which counts as a side effect. */
2147 if (loop_p ())
2148 return;
2149
bf6d9fd7
JW
2150 nonlocal_mentioned = 0;
2151
2152 init_alias_analysis ();
2153
7790df19
JW
2154 /* Determine if this is a constant function. */
2155
2156 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
bf6d9fd7
JW
2157 if (INSN_P (insn) && nonlocal_mentioned_p (insn))
2158 {
2159 nonlocal_mentioned = 1;
2160 break;
2161 }
2162
2163 end_alias_analysis ();
7790df19
JW
2164
2165 /* Mark the function. */
2166
bf6d9fd7
JW
2167 if (! nonlocal_mentioned)
2168 TREE_READONLY (current_function_decl) = 1;
7790df19
JW
2169}
2170
6e73e666
JC
2171
2172static HARD_REG_SET argument_registers;
2173
2174void
2175init_alias_once ()
2176{
2177 register int i;
2178
2179#ifndef OUTGOING_REGNO
2180#define OUTGOING_REGNO(N) N
2181#endif
2182 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2183 /* Check whether this register can hold an incoming pointer
2184 argument. FUNCTION_ARG_REGNO_P tests outgoing register
2185 numbers, so translate if necessary due to register windows. */
2186 if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i))
2187 && HARD_REGNO_MODE_OK (i, Pmode))
2188 SET_HARD_REG_BIT (argument_registers, i);
3932261a 2189
30f72379 2190 alias_sets = splay_tree_new (splay_tree_compare_ints, 0, 0);
6e73e666
JC
2191}
2192
c13e8210
MM
2193/* Initialize the aliasing machinery. Initialize the REG_KNOWN_VALUE
2194 array. */
2195
9ae8ffe7
JL
2196void
2197init_alias_analysis ()
2198{
2199 int maxreg = max_reg_num ();
ea64ef27 2200 int changed, pass;
9ae8ffe7 2201 register int i;
e51712db 2202 register unsigned int ui;
9ae8ffe7 2203 register rtx insn;
9ae8ffe7
JL
2204
2205 reg_known_value_size = maxreg;
2206
e05e2395
MM
2207 reg_known_value
2208 = (rtx *) xcalloc ((maxreg - FIRST_PSEUDO_REGISTER), sizeof (rtx))
2209 - FIRST_PSEUDO_REGISTER;
2210 reg_known_equiv_p
2211 = (char*) xcalloc ((maxreg - FIRST_PSEUDO_REGISTER), sizeof (char))
9ae8ffe7 2212 - FIRST_PSEUDO_REGISTER;
9ae8ffe7 2213
6e73e666
JC
2214 /* Overallocate reg_base_value to allow some growth during loop
2215 optimization. Loop unrolling can create a large number of
2216 registers. */
2217 reg_base_value_size = maxreg * 2;
ac606739 2218 reg_base_value = (rtx *) xcalloc (reg_base_value_size, sizeof (rtx));
1f8f4a0b 2219 ggc_add_rtx_root (reg_base_value, reg_base_value_size);
ac606739 2220
e05e2395
MM
2221 new_reg_base_value = (rtx *) xmalloc (reg_base_value_size * sizeof (rtx));
2222 reg_seen = (char *) xmalloc (reg_base_value_size);
de12be17
JC
2223 if (! reload_completed && flag_unroll_loops)
2224 {
ac606739 2225 /* ??? Why are we realloc'ing if we're just going to zero it? */
de12be17
JC
2226 alias_invariant = (rtx *)xrealloc (alias_invariant,
2227 reg_base_value_size * sizeof (rtx));
961192e1 2228 memset ((char *)alias_invariant, 0, reg_base_value_size * sizeof (rtx));
de12be17 2229 }
ec907dd8
JL
2230
2231 /* The basic idea is that each pass through this loop will use the
2232 "constant" information from the previous pass to propagate alias
2233 information through another level of assignments.
2234
2235 This could get expensive if the assignment chains are long. Maybe
2236 we should throttle the number of iterations, possibly based on
6e73e666 2237 the optimization level or flag_expensive_optimizations.
ec907dd8
JL
2238
2239 We could propagate more information in the first pass by making use
2240 of REG_N_SETS to determine immediately that the alias information
ea64ef27
JL
2241 for a pseudo is "constant".
2242
2243 A program with an uninitialized variable can cause an infinite loop
2244 here. Instead of doing a full dataflow analysis to detect such problems
2245 we just cap the number of iterations for the loop.
2246
2247 The state of the arrays for the set chain in question does not matter
2248 since the program has undefined behavior. */
6e73e666 2249
ea64ef27 2250 pass = 0;
6e73e666 2251 do
ec907dd8
JL
2252 {
2253 /* Assume nothing will change this iteration of the loop. */
2254 changed = 0;
2255
ec907dd8
JL
2256 /* We want to assign the same IDs each iteration of this loop, so
2257 start counting from zero each iteration of the loop. */
2258 unique_id = 0;
2259
2260 /* We're at the start of the funtion each iteration through the
2261 loop, so we're copying arguments. */
2262 copying_arguments = 1;
9ae8ffe7 2263
6e73e666 2264 /* Wipe the potential alias information clean for this pass. */
961192e1 2265 memset ((char *) new_reg_base_value, 0, reg_base_value_size * sizeof (rtx));
8072f69c 2266
6e73e666 2267 /* Wipe the reg_seen array clean. */
961192e1 2268 memset ((char *) reg_seen, 0, reg_base_value_size);
9ae8ffe7 2269
6e73e666
JC
2270 /* Mark all hard registers which may contain an address.
2271 The stack, frame and argument pointers may contain an address.
2272 An argument register which can hold a Pmode value may contain
2273 an address even if it is not in BASE_REGS.
8072f69c 2274
6e73e666
JC
2275 The address expression is VOIDmode for an argument and
2276 Pmode for other registers. */
2277
2278 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2279 if (TEST_HARD_REG_BIT (argument_registers, i))
38a448ca
RH
2280 new_reg_base_value[i] = gen_rtx_ADDRESS (VOIDmode,
2281 gen_rtx_REG (Pmode, i));
6e73e666
JC
2282
2283 new_reg_base_value[STACK_POINTER_REGNUM]
38a448ca 2284 = gen_rtx_ADDRESS (Pmode, stack_pointer_rtx);
6e73e666 2285 new_reg_base_value[ARG_POINTER_REGNUM]
38a448ca 2286 = gen_rtx_ADDRESS (Pmode, arg_pointer_rtx);
6e73e666 2287 new_reg_base_value[FRAME_POINTER_REGNUM]
38a448ca 2288 = gen_rtx_ADDRESS (Pmode, frame_pointer_rtx);
2a2c8203 2289#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
6e73e666 2290 new_reg_base_value[HARD_FRAME_POINTER_REGNUM]
38a448ca 2291 = gen_rtx_ADDRESS (Pmode, hard_frame_pointer_rtx);
2a2c8203 2292#endif
ec907dd8
JL
2293
2294 /* Walk the insns adding values to the new_reg_base_value array. */
2295 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
9ae8ffe7 2296 {
2c3c49de 2297 if (INSN_P (insn))
ec907dd8 2298 {
6e73e666 2299 rtx note, set;
efc9bd41
RK
2300
2301#if defined (HAVE_prologue) || defined (HAVE_epilogue)
657959ca
JL
2302 /* The prologue/epilouge insns are not threaded onto the
2303 insn chain until after reload has completed. Thus,
2304 there is no sense wasting time checking if INSN is in
2305 the prologue/epilogue until after reload has completed. */
2306 if (reload_completed
2307 && prologue_epilogue_contains (insn))
efc9bd41
RK
2308 continue;
2309#endif
2310
ec907dd8
JL
2311 /* If this insn has a noalias note, process it, Otherwise,
2312 scan for sets. A simple set will have no side effects
2313 which could change the base value of any other register. */
6e73e666 2314
ec907dd8 2315 if (GET_CODE (PATTERN (insn)) == SET
efc9bd41
RK
2316 && REG_NOTES (insn) != 0
2317 && find_reg_note (insn, REG_NOALIAS, NULL_RTX))
84832317 2318 record_set (SET_DEST (PATTERN (insn)), NULL_RTX, NULL);
ec907dd8 2319 else
84832317 2320 note_stores (PATTERN (insn), record_set, NULL);
6e73e666
JC
2321
2322 set = single_set (insn);
2323
2324 if (set != 0
2325 && GET_CODE (SET_DEST (set)) == REG
fb6754f0 2326 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
6e73e666 2327 {
fb6754f0 2328 unsigned int regno = REGNO (SET_DEST (set));
713f41f9
BS
2329 rtx src = SET_SRC (set);
2330
2331 if (REG_NOTES (insn) != 0
2332 && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
2333 && REG_N_SETS (regno) == 1)
2334 || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
2335 && GET_CODE (XEXP (note, 0)) != EXPR_LIST
bb2cf916 2336 && ! rtx_varies_p (XEXP (note, 0), 1)
713f41f9
BS
2337 && ! reg_overlap_mentioned_p (SET_DEST (set), XEXP (note, 0)))
2338 {
2339 reg_known_value[regno] = XEXP (note, 0);
2340 reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
2341 }
2342 else if (REG_N_SETS (regno) == 1
2343 && GET_CODE (src) == PLUS
2344 && GET_CODE (XEXP (src, 0)) == REG
fb6754f0
BS
2345 && REGNO (XEXP (src, 0)) >= FIRST_PSEUDO_REGISTER
2346 && (reg_known_value[REGNO (XEXP (src, 0))])
713f41f9
BS
2347 && GET_CODE (XEXP (src, 1)) == CONST_INT)
2348 {
2349 rtx op0 = XEXP (src, 0);
bb2cf916 2350 op0 = reg_known_value[REGNO (op0)];
713f41f9
BS
2351 reg_known_value[regno]
2352 = plus_constant_for_output (op0,
2353 INTVAL (XEXP (src, 1)));
2354 reg_known_equiv_p[regno] = 0;
2355 }
2356 else if (REG_N_SETS (regno) == 1
2357 && ! rtx_varies_p (src, 1))
2358 {
2359 reg_known_value[regno] = src;
2360 reg_known_equiv_p[regno] = 0;
2361 }
6e73e666 2362 }
ec907dd8
JL
2363 }
2364 else if (GET_CODE (insn) == NOTE
2365 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
2366 copying_arguments = 0;
6e73e666 2367 }
ec907dd8 2368
6e73e666 2369 /* Now propagate values from new_reg_base_value to reg_base_value. */
e51712db 2370 for (ui = 0; ui < reg_base_value_size; ui++)
6e73e666 2371 {
e51712db
KG
2372 if (new_reg_base_value[ui]
2373 && new_reg_base_value[ui] != reg_base_value[ui]
2374 && ! rtx_equal_p (new_reg_base_value[ui], reg_base_value[ui]))
ec907dd8 2375 {
e51712db 2376 reg_base_value[ui] = new_reg_base_value[ui];
6e73e666 2377 changed = 1;
ec907dd8 2378 }
9ae8ffe7 2379 }
9ae8ffe7 2380 }
6e73e666 2381 while (changed && ++pass < MAX_ALIAS_LOOP_PASSES);
9ae8ffe7
JL
2382
2383 /* Fill in the remaining entries. */
2384 for (i = FIRST_PSEUDO_REGISTER; i < maxreg; i++)
2385 if (reg_known_value[i] == 0)
2386 reg_known_value[i] = regno_reg_rtx[i];
2387
9ae8ffe7
JL
2388 /* Simplify the reg_base_value array so that no register refers to
2389 another register, except to special registers indirectly through
2390 ADDRESS expressions.
2391
2392 In theory this loop can take as long as O(registers^2), but unless
2393 there are very long dependency chains it will run in close to linear
ea64ef27
JL
2394 time.
2395
2396 This loop may not be needed any longer now that the main loop does
2397 a better job at propagating alias information. */
2398 pass = 0;
9ae8ffe7
JL
2399 do
2400 {
2401 changed = 0;
ea64ef27 2402 pass++;
e51712db 2403 for (ui = 0; ui < reg_base_value_size; ui++)
9ae8ffe7 2404 {
e51712db 2405 rtx base = reg_base_value[ui];
9ae8ffe7
JL
2406 if (base && GET_CODE (base) == REG)
2407 {
fb6754f0 2408 unsigned int base_regno = REGNO (base);
e51712db
KG
2409 if (base_regno == ui) /* register set from itself */
2410 reg_base_value[ui] = 0;
9ae8ffe7 2411 else
e51712db 2412 reg_base_value[ui] = reg_base_value[base_regno];
9ae8ffe7
JL
2413 changed = 1;
2414 }
2415 }
2416 }
ea64ef27 2417 while (changed && pass < MAX_ALIAS_LOOP_PASSES);
9ae8ffe7 2418
e05e2395
MM
2419 /* Clean up. */
2420 free (new_reg_base_value);
ec907dd8 2421 new_reg_base_value = 0;
e05e2395 2422 free (reg_seen);
9ae8ffe7
JL
2423 reg_seen = 0;
2424}
2425
2426void
2427end_alias_analysis ()
2428{
e05e2395 2429 free (reg_known_value + FIRST_PSEUDO_REGISTER);
9ae8ffe7 2430 reg_known_value = 0;
ac606739 2431 reg_known_value_size = 0;
e05e2395
MM
2432 free (reg_known_equiv_p + FIRST_PSEUDO_REGISTER);
2433 reg_known_equiv_p = 0;
ac606739
GS
2434 if (reg_base_value)
2435 {
1f8f4a0b 2436 ggc_del_root (reg_base_value);
ac606739
GS
2437 free (reg_base_value);
2438 reg_base_value = 0;
2439 }
9ae8ffe7 2440 reg_base_value_size = 0;
de12be17
JC
2441 if (alias_invariant)
2442 {
ac606739 2443 free (alias_invariant);
de12be17
JC
2444 alias_invariant = 0;
2445 }
9ae8ffe7 2446}
This page took 0.798668 seconds and 5 git commands to generate.