OSDN Git Service

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