OSDN Git Service

Fix mips64vr4100-elf build failure.
[pf3gnuchains/gcc-fork.git] / gcc / alias.c
1 /* Alias analysis for GNU C
2    Copyright (C) 1997, 1998 Free Software Foundation, Inc.
3    Contributed by John Carr (jfc@mit.edu).
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "rtl.h"
25 #include "expr.h"
26 #include "regs.h"
27 #include "hard-reg-set.h"
28 #include "flags.h"
29
30 static rtx canon_rtx                    PROTO((rtx));
31 static int rtx_equal_for_memref_p       PROTO((rtx, rtx));
32 static rtx find_symbolic_term           PROTO((rtx));
33 static int memrefs_conflict_p           PROTO((int, rtx, int, rtx,
34                                                HOST_WIDE_INT));
35 static void record_set                  PROTO((rtx, rtx));
36 static rtx find_base_term               PROTO((rtx));
37 static int base_alias_check             PROTO((rtx, rtx));
38
39 /* Set up all info needed to perform alias analysis on memory references.  */
40
41 #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
42
43 /* Cap the number of passes we make over the insns propagating alias
44    information through set chains.
45
46    10 is a completely arbitrary choice.  */
47 #define MAX_ALIAS_LOOP_PASSES 10
48    
49 /* reg_base_value[N] gives an address to which register N is related.
50    If all sets after the first add or subtract to the current value
51    or otherwise modify it so it does not point to a different top level
52    object, reg_base_value[N] is equal to the address part of the source
53    of the first set.
54
55    A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF.  ADDRESS
56    expressions represent certain special values: function arguments and
57    the stack, frame, and argument pointers.  The contents of an address
58    expression are not used (but they are descriptive for debugging);
59    only the address and mode matter.  Pointer equality, not rtx_equal_p,
60    determines whether two ADDRESS expressions refer to the same base
61    address.  The mode determines whether it is a function argument or
62    other special value. */
63
64 rtx *reg_base_value;
65 rtx *new_reg_base_value;
66 unsigned int reg_base_value_size;       /* size of reg_base_value array */
67 #define REG_BASE_VALUE(X) \
68         (REGNO (X) < reg_base_value_size ? reg_base_value[REGNO (X)] : 0)
69
70 /* Vector of known invariant relationships between registers.  Set in
71    loop unrolling.  Indexed by register number, if nonzero the value
72    is an expression describing this register in terms of another.
73
74    The length of this array is REG_BASE_VALUE_SIZE.
75
76    Because this array contains only pseudo registers it has no effect
77    after reload.  */
78 static rtx *alias_invariant;
79
80 /* Vector indexed by N giving the initial (unchanging) value known
81    for pseudo-register N.  */
82 rtx *reg_known_value;
83
84 /* Indicates number of valid entries in reg_known_value.  */
85 static int reg_known_value_size;
86
87 /* Vector recording for each reg_known_value whether it is due to a
88    REG_EQUIV note.  Future passes (viz., reload) may replace the
89    pseudo with the equivalent expression and so we account for the
90    dependences that would be introduced if that happens. */
91 /* ??? This is a problem only on the Convex.  The REG_EQUIV notes created in
92    assign_parms mention the arg pointer, and there are explicit insns in the
93    RTL that modify the arg pointer.  Thus we must ensure that such insns don't
94    get scheduled across each other because that would invalidate the REG_EQUIV
95    notes.  One could argue that the REG_EQUIV notes are wrong, but solving
96    the problem in the scheduler will likely give better code, so we do it
97    here.  */
98 char *reg_known_equiv_p;
99
100 /* True when scanning insns from the start of the rtl to the
101    NOTE_INSN_FUNCTION_BEG note.  */
102
103 static int copying_arguments;
104
105 /* Inside SRC, the source of a SET, find a base address.  */
106
107 static rtx
108 find_base_value (src)
109      register rtx src;
110 {
111   switch (GET_CODE (src))
112     {
113     case SYMBOL_REF:
114     case LABEL_REF:
115       return src;
116
117     case REG:
118       /* At the start of a function argument registers have known base
119          values which may be lost later.  Returning an ADDRESS
120          expression here allows optimization based on argument values
121          even when the argument registers are used for other purposes.  */
122       if (REGNO (src) < FIRST_PSEUDO_REGISTER && copying_arguments)
123         return new_reg_base_value[REGNO (src)];
124
125       /* If a pseudo has a known base value, return it.  Do not do this
126          for hard regs since it can result in a circular dependency
127          chain for registers which have values at function entry.
128
129          The test above is not sufficient because the scheduler may move
130          a copy out of an arg reg past the NOTE_INSN_FUNCTION_BEGIN.  */
131       if (REGNO (src) >= FIRST_PSEUDO_REGISTER
132           && REGNO (src) < reg_base_value_size
133           && reg_base_value[REGNO (src)])
134         return reg_base_value[REGNO (src)];
135
136       return src;
137
138     case MEM:
139       /* Check for an argument passed in memory.  Only record in the
140          copying-arguments block; it is too hard to track changes
141          otherwise.  */
142       if (copying_arguments
143           && (XEXP (src, 0) == arg_pointer_rtx
144               || (GET_CODE (XEXP (src, 0)) == PLUS
145                   && XEXP (XEXP (src, 0), 0) == arg_pointer_rtx)))
146         return gen_rtx_ADDRESS (VOIDmode, src);
147       return 0;
148
149     case CONST:
150       src = XEXP (src, 0);
151       if (GET_CODE (src) != PLUS && GET_CODE (src) != MINUS)
152         break;
153       /* fall through */
154
155     case PLUS:
156     case MINUS:
157       {
158         rtx temp, src_0 = XEXP (src, 0), src_1 = XEXP (src, 1);
159
160         /* If either operand is a REG, then see if we already have
161            a known value for it.  */
162         if (GET_CODE (src_0) == REG)
163           {
164             temp = find_base_value (src_0);
165             if (temp)
166               src_0 = temp;
167           }
168
169         if (GET_CODE (src_1) == REG)
170           {
171             temp = find_base_value (src_1);
172             if (temp)
173               src_1 = temp;
174           }
175
176         /* Guess which operand is the base address.
177
178            If either operand is a symbol, then it is the base.  If
179            either operand is a CONST_INT, then the other is the base.  */
180
181         if (GET_CODE (src_1) == CONST_INT
182             || GET_CODE (src_0) == SYMBOL_REF
183             || GET_CODE (src_0) == LABEL_REF
184             || GET_CODE (src_0) == CONST)
185           return find_base_value (src_0);
186
187         if (GET_CODE (src_0) == CONST_INT
188             || GET_CODE (src_1) == SYMBOL_REF
189             || GET_CODE (src_1) == LABEL_REF
190             || GET_CODE (src_1) == CONST)
191           return find_base_value (src_1);
192
193         /* This might not be necessary anymore. 
194
195            If either operand is a REG that is a known pointer, then it
196            is the base.  */
197         if (GET_CODE (src_0) == REG && REGNO_POINTER_FLAG (REGNO (src_0)))
198           return find_base_value (src_0);
199
200         if (GET_CODE (src_1) == REG && REGNO_POINTER_FLAG (REGNO (src_1)))
201           return find_base_value (src_1);
202
203         return 0;
204       }
205
206     case LO_SUM:
207       /* The standard form is (lo_sum reg sym) so look only at the
208          second operand.  */
209       return find_base_value (XEXP (src, 1));
210
211     case AND:
212       /* If the second operand is constant set the base
213          address to the first operand. */
214       if (GET_CODE (XEXP (src, 1)) == CONST_INT && INTVAL (XEXP (src, 1)) != 0)
215         return find_base_value (XEXP (src, 0));
216       return 0;
217
218     case ZERO_EXTEND:
219     case SIGN_EXTEND:   /* used for NT/Alpha pointers */
220     case HIGH:
221       return find_base_value (XEXP (src, 0));
222
223     default:
224       break;
225     }
226
227   return 0;
228 }
229
230 /* Called from init_alias_analysis indirectly through note_stores.  */
231
232 /* while scanning insns to find base values, reg_seen[N] is nonzero if
233    register N has been set in this function.  */
234 static char *reg_seen;
235
236 /* Addresses which are known not to alias anything else are identified
237    by a unique integer.  */
238 static int unique_id;
239
240 static void
241 record_set (dest, set)
242      rtx dest, set;
243 {
244   register int regno;
245   rtx src;
246
247   if (GET_CODE (dest) != REG)
248     return;
249
250   regno = REGNO (dest);
251
252   if (set)
253     {
254       /* A CLOBBER wipes out any old value but does not prevent a previously
255          unset register from acquiring a base address (i.e. reg_seen is not
256          set).  */
257       if (GET_CODE (set) == CLOBBER)
258         {
259           new_reg_base_value[regno] = 0;
260           return;
261         }
262       src = SET_SRC (set);
263     }
264   else
265     {
266       if (reg_seen[regno])
267         {
268           new_reg_base_value[regno] = 0;
269           return;
270         }
271       reg_seen[regno] = 1;
272       new_reg_base_value[regno] = gen_rtx_ADDRESS (Pmode,
273                                                    GEN_INT (unique_id++));
274       return;
275     }
276
277   /* This is not the first set.  If the new value is not related to the
278      old value, forget the base value. Note that the following code is
279      not detected:
280      extern int x, y;  int *p = &x; p += (&y-&x);
281      ANSI C does not allow computing the difference of addresses
282      of distinct top level objects.  */
283   if (new_reg_base_value[regno])
284     switch (GET_CODE (src))
285       {
286       case LO_SUM:
287       case PLUS:
288       case MINUS:
289         if (XEXP (src, 0) != dest && XEXP (src, 1) != dest)
290           new_reg_base_value[regno] = 0;
291         break;
292       case AND:
293         if (XEXP (src, 0) != dest || GET_CODE (XEXP (src, 1)) != CONST_INT)
294           new_reg_base_value[regno] = 0;
295         break;
296       default:
297         new_reg_base_value[regno] = 0;
298         break;
299       }
300   /* If this is the first set of a register, record the value.  */
301   else if ((regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno])
302            && ! reg_seen[regno] && new_reg_base_value[regno] == 0)
303     new_reg_base_value[regno] = find_base_value (src);
304
305   reg_seen[regno] = 1;
306 }
307
308 /* Called from loop optimization when a new pseudo-register is created.  */
309 void
310 record_base_value (regno, val, invariant)
311      int regno;
312      rtx val;
313      int invariant;
314 {
315   if (regno >= reg_base_value_size)
316     return;
317
318   /* If INVARIANT is true then this value also describes an invariant
319      relationship which can be used to deduce that two registers with
320      unknown values are different.  */
321   if (invariant && alias_invariant)
322     alias_invariant[regno] = val;
323
324   if (GET_CODE (val) == REG)
325     {
326       if (REGNO (val) < reg_base_value_size)
327         {
328           reg_base_value[regno] = reg_base_value[REGNO (val)];
329         }
330       return;
331     }
332   reg_base_value[regno] = find_base_value (val);
333 }
334
335 static rtx
336 canon_rtx (x)
337      rtx x;
338 {
339   /* Recursively look for equivalences.  */
340   if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER
341       && REGNO (x) < reg_known_value_size)
342     return reg_known_value[REGNO (x)] == x
343       ? x : canon_rtx (reg_known_value[REGNO (x)]);
344   else if (GET_CODE (x) == PLUS)
345     {
346       rtx x0 = canon_rtx (XEXP (x, 0));
347       rtx x1 = canon_rtx (XEXP (x, 1));
348
349       if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
350         {
351           /* We can tolerate LO_SUMs being offset here; these
352              rtl are used for nothing other than comparisons.  */
353           if (GET_CODE (x0) == CONST_INT)
354             return plus_constant_for_output (x1, INTVAL (x0));
355           else if (GET_CODE (x1) == CONST_INT)
356             return plus_constant_for_output (x0, INTVAL (x1));
357           return gen_rtx_PLUS (GET_MODE (x), x0, x1);
358         }
359     }
360   /* This gives us much better alias analysis when called from
361      the loop optimizer.   Note we want to leave the original
362      MEM alone, but need to return the canonicalized MEM with
363      all the flags with their original values.  */
364   else if (GET_CODE (x) == MEM)
365     {
366       rtx addr = canon_rtx (XEXP (x, 0));
367       if (addr != XEXP (x, 0))
368         {
369           rtx new = gen_rtx_MEM (GET_MODE (x), addr);
370           MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
371           RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
372           MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
373           x = new;
374         }
375     }
376   return x;
377 }
378
379 /* Return 1 if X and Y are identical-looking rtx's.
380
381    We use the data in reg_known_value above to see if two registers with
382    different numbers are, in fact, equivalent.  */
383
384 static int
385 rtx_equal_for_memref_p (x, y)
386      rtx x, y;
387 {
388   register int i;
389   register int j;
390   register enum rtx_code code;
391   register char *fmt;
392
393   if (x == 0 && y == 0)
394     return 1;
395   if (x == 0 || y == 0)
396     return 0;
397   x = canon_rtx (x);
398   y = canon_rtx (y);
399
400   if (x == y)
401     return 1;
402
403   code = GET_CODE (x);
404   /* Rtx's of different codes cannot be equal.  */
405   if (code != GET_CODE (y))
406     return 0;
407
408   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
409      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
410
411   if (GET_MODE (x) != GET_MODE (y))
412     return 0;
413
414   /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively.  */
415
416   if (code == REG)
417     return REGNO (x) == REGNO (y);
418   if (code == LABEL_REF)
419     return XEXP (x, 0) == XEXP (y, 0);
420   if (code == SYMBOL_REF)
421     return XSTR (x, 0) == XSTR (y, 0);
422   if (code == CONST_INT)
423     return INTVAL (x) == INTVAL (y);
424   if (code == ADDRESSOF)
425     return REGNO (XEXP (x, 0)) == REGNO (XEXP (y, 0)) && XINT (x, 1) == XINT (y, 1);
426
427   /* For commutative operations, the RTX match if the operand match in any
428      order.  Also handle the simple binary and unary cases without a loop.  */
429   if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
430     return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
431              && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
432             || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
433                 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
434   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
435     return (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
436             && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)));
437   else if (GET_RTX_CLASS (code) == '1')
438     return rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0));
439
440   /* Compare the elements.  If any pair of corresponding elements
441      fail to match, return 0 for the whole things.
442
443      Limit cases to types which actually appear in addresses.  */
444
445   fmt = GET_RTX_FORMAT (code);
446   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
447     {
448       switch (fmt[i])
449         {
450         case 'i':
451           if (XINT (x, i) != XINT (y, i))
452             return 0;
453           break;
454
455         case 'E':
456           /* Two vectors must have the same length.  */
457           if (XVECLEN (x, i) != XVECLEN (y, i))
458             return 0;
459
460           /* And the corresponding elements must match.  */
461           for (j = 0; j < XVECLEN (x, i); j++)
462             if (rtx_equal_for_memref_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
463               return 0;
464           break;
465
466         case 'e':
467           if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0)
468             return 0;
469           break;
470
471         /* This can happen for an asm which clobbers memory.  */
472         case '0':
473           break;
474
475           /* It is believed that rtx's at this level will never
476              contain anything but integers and other rtx's,
477              except for within LABEL_REFs and SYMBOL_REFs.  */
478         default:
479           abort ();
480         }
481     }
482   return 1;
483 }
484
485 /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
486    X and return it, or return 0 if none found.  */
487
488 static rtx
489 find_symbolic_term (x)
490      rtx x;
491 {
492   register int i;
493   register enum rtx_code code;
494   register char *fmt;
495
496   code = GET_CODE (x);
497   if (code == SYMBOL_REF || code == LABEL_REF)
498     return x;
499   if (GET_RTX_CLASS (code) == 'o')
500     return 0;
501
502   fmt = GET_RTX_FORMAT (code);
503   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
504     {
505       rtx t;
506
507       if (fmt[i] == 'e')
508         {
509           t = find_symbolic_term (XEXP (x, i));
510           if (t != 0)
511             return t;
512         }
513       else if (fmt[i] == 'E')
514         break;
515     }
516   return 0;
517 }
518
519 static rtx
520 find_base_term (x)
521      register rtx x;
522 {
523   switch (GET_CODE (x))
524     {
525     case REG:
526       return REG_BASE_VALUE (x);
527
528     case ZERO_EXTEND:
529     case SIGN_EXTEND:   /* Used for Alpha/NT pointers */
530     case HIGH:
531     case PRE_INC:
532     case PRE_DEC:
533     case POST_INC:
534     case POST_DEC:
535       return find_base_term (XEXP (x, 0));
536
537     case CONST:
538       x = XEXP (x, 0);
539       if (GET_CODE (x) != PLUS && GET_CODE (x) != MINUS)
540         return 0;
541       /* fall through */
542     case LO_SUM:
543     case PLUS:
544     case MINUS:
545       {
546         rtx tmp = find_base_term (XEXP (x, 0));
547         if (tmp)
548           return tmp;
549         return find_base_term (XEXP (x, 1));
550       }
551
552     case AND:
553       if (GET_CODE (XEXP (x, 0)) == REG && GET_CODE (XEXP (x, 1)) == CONST_INT)
554         return REG_BASE_VALUE (XEXP (x, 0));
555       return 0;
556
557     case SYMBOL_REF:
558     case LABEL_REF:
559       return x;
560
561     default:
562       return 0;
563     }
564 }
565
566 /* Return 0 if the addresses X and Y are known to point to different
567    objects, 1 if they might be pointers to the same object.  */
568
569 static int
570 base_alias_check (x, y)
571      rtx x, y;
572 {
573   rtx x_base = find_base_term (x);
574   rtx y_base = find_base_term (y);
575
576   /* If the address itself has no known base see if a known equivalent
577      value has one.  If either address still has no known base, nothing
578      is known about aliasing.  */
579   if (x_base == 0)
580     {
581       rtx x_c;
582       if (! flag_expensive_optimizations || (x_c = canon_rtx (x)) == x)
583         return 1;
584       x_base = find_base_term (x_c);
585       if (x_base == 0)
586         return 1;
587     }
588
589   if (y_base == 0)
590     {
591       rtx y_c;
592       if (! flag_expensive_optimizations || (y_c = canon_rtx (y)) == y)
593         return 1;
594       y_base = find_base_term (y_c);
595       if (y_base == 0)
596         return 1;
597     }
598
599   /* If the base addresses are equal nothing is known about aliasing.  */
600   if (rtx_equal_p (x_base, y_base))
601     return 1;
602
603   /* The base addresses of the read and write are different
604      expressions.  If they are both symbols and they are not accessed
605      via AND, there is no conflict.  */
606   /* XXX: We can bring knowledge of object alignment and offset into 
607      play here.  For example, on alpha, "char a, b;" can alias one
608      another, though "char a; long b;" cannot.  Similarly, offsets
609      into strutures may be brought into play.  Given "char a, b[40];",
610      a and b[1] may overlap, but a and b[20] do not.  */
611   if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
612     {
613       return GET_CODE (x) == AND || GET_CODE (y) == AND;
614     }
615
616   /* If one address is a stack reference there can be no alias:
617      stack references using different base registers do not alias,
618      a stack reference can not alias a parameter, and a stack reference
619      can not alias a global.  */
620   if ((GET_CODE (x_base) == ADDRESS && GET_MODE (x_base) == Pmode)
621       || (GET_CODE (y_base) == ADDRESS && GET_MODE (y_base) == Pmode))
622     return 0;
623
624   if (! flag_argument_noalias)
625     return 1;
626
627   if (flag_argument_noalias > 1)
628     return 0;
629
630   /* Weak noalias assertion (arguments are distinct, but may match globals). */
631   return ! (GET_MODE (x_base) == VOIDmode && GET_MODE (y_base) == VOIDmode);
632 }
633
634 /* Return nonzero if X and Y (memory addresses) could reference the
635    same location in memory.  C is an offset accumulator.  When
636    C is nonzero, we are testing aliases between X and Y + C.
637    XSIZE is the size in bytes of the X reference,
638    similarly YSIZE is the size in bytes for Y.
639
640    If XSIZE or YSIZE is zero, we do not know the amount of memory being
641    referenced (the reference was BLKmode), so make the most pessimistic
642    assumptions.
643
644    If XSIZE or YSIZE is negative, we may access memory outside the object
645    being referenced as a side effect.  This can happen when using AND to
646    align memory references, as is done on the Alpha.
647
648    Nice to notice that varying addresses cannot conflict with fp if no
649    local variables had their addresses taken, but that's too hard now.  */
650
651
652 static int
653 memrefs_conflict_p (xsize, x, ysize, y, c)
654      register rtx x, y;
655      int xsize, ysize;
656      HOST_WIDE_INT c;
657 {
658   if (GET_CODE (x) == HIGH)
659     x = XEXP (x, 0);
660   else if (GET_CODE (x) == LO_SUM)
661     x = XEXP (x, 1);
662   else
663     x = canon_rtx (x);
664   if (GET_CODE (y) == HIGH)
665     y = XEXP (y, 0);
666   else if (GET_CODE (y) == LO_SUM)
667     y = XEXP (y, 1);
668   else
669     y = canon_rtx (y);
670
671   if (rtx_equal_for_memref_p (x, y))
672     {
673       if (xsize <= 0 || ysize <= 0)
674         return 1;
675       if (c >= 0 && xsize > c)
676         return 1;
677       if (c < 0 && ysize+c > 0)
678         return 1;
679       return 0;
680     }
681
682   /* This code used to check for conflicts involving stack references and
683      globals but the base address alias code now handles these cases.  */
684
685   if (GET_CODE (x) == PLUS)
686     {
687       /* The fact that X is canonicalized means that this
688          PLUS rtx is canonicalized.  */
689       rtx x0 = XEXP (x, 0);
690       rtx x1 = XEXP (x, 1);
691
692       if (GET_CODE (y) == PLUS)
693         {
694           /* The fact that Y is canonicalized means that this
695              PLUS rtx is canonicalized.  */
696           rtx y0 = XEXP (y, 0);
697           rtx y1 = XEXP (y, 1);
698
699           if (rtx_equal_for_memref_p (x1, y1))
700             return memrefs_conflict_p (xsize, x0, ysize, y0, c);
701           if (rtx_equal_for_memref_p (x0, y0))
702             return memrefs_conflict_p (xsize, x1, ysize, y1, c);
703           if (GET_CODE (x1) == CONST_INT)
704             if (GET_CODE (y1) == CONST_INT)
705               return memrefs_conflict_p (xsize, x0, ysize, y0,
706                                          c - INTVAL (x1) + INTVAL (y1));
707             else
708               return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
709           else if (GET_CODE (y1) == CONST_INT)
710             return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
711
712           return 1;
713         }
714       else if (GET_CODE (x1) == CONST_INT)
715         return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
716     }
717   else if (GET_CODE (y) == PLUS)
718     {
719       /* The fact that Y is canonicalized means that this
720          PLUS rtx is canonicalized.  */
721       rtx y0 = XEXP (y, 0);
722       rtx y1 = XEXP (y, 1);
723
724       if (GET_CODE (y1) == CONST_INT)
725         return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
726       else
727         return 1;
728     }
729
730   if (GET_CODE (x) == GET_CODE (y))
731     switch (GET_CODE (x))
732       {
733       case MULT:
734         {
735           /* Handle cases where we expect the second operands to be the
736              same, and check only whether the first operand would conflict
737              or not.  */
738           rtx x0, y0;
739           rtx x1 = canon_rtx (XEXP (x, 1));
740           rtx y1 = canon_rtx (XEXP (y, 1));
741           if (! rtx_equal_for_memref_p (x1, y1))
742             return 1;
743           x0 = canon_rtx (XEXP (x, 0));
744           y0 = canon_rtx (XEXP (y, 0));
745           if (rtx_equal_for_memref_p (x0, y0))
746             return (xsize == 0 || ysize == 0
747                     || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
748
749           /* Can't properly adjust our sizes.  */
750           if (GET_CODE (x1) != CONST_INT)
751             return 1;
752           xsize /= INTVAL (x1);
753           ysize /= INTVAL (x1);
754           c /= INTVAL (x1);
755           return memrefs_conflict_p (xsize, x0, ysize, y0, c);
756         }
757
758       case REG:
759         /* Are these registers known not to be equal?  */
760         if (alias_invariant)
761           {
762             int r_x = REGNO (x), r_y = REGNO (y);
763             rtx i_x, i_y;       /* invariant relationships of X and Y */
764
765             i_x = r_x >= reg_base_value_size ? 0 : alias_invariant[r_x];
766             i_y = r_y >= reg_base_value_size ? 0 : alias_invariant[r_y];
767
768             if (i_x == 0 && i_y == 0)
769               break;
770
771             if (! memrefs_conflict_p (xsize, i_x ? i_x : x,
772                                       ysize, i_y ? i_y : y, c))
773               return 0;
774           }
775         break;
776
777       default:
778         break;
779       }
780
781   /* Treat an access through an AND (e.g. a subword access on an Alpha)
782      as an access with indeterminate size.
783      ??? Could instead convert an n byte reference at (and x y) to an
784      n-y byte reference at (plus x y). */
785   if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT)
786     return memrefs_conflict_p (-1, XEXP (x, 0), ysize, y, c);
787   if (GET_CODE (y) == AND && GET_CODE (XEXP (y, 1)) == CONST_INT)
788     {
789       /* XXX: If we are indexing far enough into the array/structure, we
790          may yet be able to determine that we can not overlap.  But we 
791          also need to that we are far enough from the end not to overlap
792          a following reference, so we do nothing for now.  */
793       return memrefs_conflict_p (xsize, x, -1, XEXP (y, 0), c);
794     }
795
796   if (CONSTANT_P (x))
797     {
798       if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
799         {
800           c += (INTVAL (y) - INTVAL (x));
801           return (xsize <= 0 || ysize <= 0
802                   || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
803         }
804
805       if (GET_CODE (x) == CONST)
806         {
807           if (GET_CODE (y) == CONST)
808             return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
809                                        ysize, canon_rtx (XEXP (y, 0)), c);
810           else
811             return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
812                                        ysize, y, c);
813         }
814       if (GET_CODE (y) == CONST)
815         return memrefs_conflict_p (xsize, x, ysize,
816                                    canon_rtx (XEXP (y, 0)), c);
817
818       if (CONSTANT_P (y))
819         return (xsize < 0 || ysize < 0
820                 || (rtx_equal_for_memref_p (x, y)
821                     && (xsize == 0 || ysize == 0
822                         || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0))));
823
824       return 1;
825     }
826   return 1;
827 }
828
829 /* Functions to compute memory dependencies.
830
831    Since we process the insns in execution order, we can build tables
832    to keep track of what registers are fixed (and not aliased), what registers
833    are varying in known ways, and what registers are varying in unknown
834    ways.
835
836    If both memory references are volatile, then there must always be a
837    dependence between the two references, since their order can not be
838    changed.  A volatile and non-volatile reference can be interchanged
839    though. 
840
841    A MEM_IN_STRUCT reference at a non-QImode non-AND varying address can never
842    conflict with a non-MEM_IN_STRUCT reference at a fixed address.   We must
843    allow QImode aliasing because the ANSI C standard allows character
844    pointers to alias anything.  We are assuming that characters are
845    always QImode here.  We also must allow AND addresses, because they may
846    generate accesses outside the object being referenced.  This is used to
847    generate aligned addresses from unaligned addresses, for instance, the
848    alpha storeqi_unaligned pattern.  */
849
850 /* Read dependence: X is read after read in MEM takes place.  There can
851    only be a dependence here if both reads are volatile.  */
852
853 int
854 read_dependence (mem, x)
855      rtx mem;
856      rtx x;
857 {
858   return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
859 }
860
861 /* True dependence: X is read after store in MEM takes place.  */
862
863 int
864 true_dependence (mem, mem_mode, x, varies)
865      rtx mem;
866      enum machine_mode mem_mode;
867      rtx x;
868      int (*varies)();
869 {
870   register rtx x_addr, mem_addr;
871
872   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
873     return 1;
874
875   /* If X is an unchanging read, then it can't possibly conflict with any
876      non-unchanging store.  It may conflict with an unchanging write though,
877      because there may be a single store to this address to initialize it.
878      Just fall through to the code below to resolve the case where we have
879      both an unchanging read and an unchanging write.  This won't handle all
880      cases optimally, but the possible performance loss should be
881      negligible.  */
882   if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
883     return 0;
884
885   if (! base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
886     return 0;
887
888   x_addr = canon_rtx (XEXP (x, 0));
889   mem_addr = canon_rtx (XEXP (mem, 0));
890
891   if (mem_mode == VOIDmode)
892     mem_mode = GET_MODE (mem);
893
894   if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
895                             SIZE_FOR_MODE (x), x_addr, 0))
896     return 0;
897
898   /* If both references are struct references, or both are not, nothing
899      is known about aliasing.
900
901      If either reference is QImode or BLKmode, ANSI C permits aliasing.
902
903      If both addresses are constant, or both are not, nothing is known
904      about aliasing.  */
905   if (MEM_IN_STRUCT_P (x) == MEM_IN_STRUCT_P (mem)
906       || mem_mode == QImode || mem_mode == BLKmode
907       || GET_MODE (x) == QImode || GET_MODE (x) == BLKmode
908       || GET_CODE (x_addr) == AND || GET_CODE (mem_addr) == AND
909       || varies (x_addr) == varies (mem_addr))
910     return 1;
911
912   /* One memory reference is to a constant address, one is not.
913      One is to a structure, the other is not.
914
915      If either memory reference is a variable structure the other is a
916      fixed scalar and there is no aliasing.  */
917   if ((MEM_IN_STRUCT_P (mem) && varies (mem_addr))
918       || (MEM_IN_STRUCT_P (x) && varies (x_addr)))
919     return 0;
920
921   return 1;
922 }
923
924 /* Anti dependence: X is written after read in MEM takes place.  */
925
926 int
927 anti_dependence (mem, x)
928      rtx mem;
929      rtx x;
930 {
931   rtx x_addr, mem_addr;
932
933   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
934     return 1;
935
936   /* If MEM is an unchanging read, then it can't possibly conflict with
937      the store to X, because there is at most one store to MEM, and it must
938      have occurred somewhere before MEM.  */
939   if (RTX_UNCHANGING_P (mem))
940     return 0;
941
942   if (! base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
943     return 0;
944
945   x = canon_rtx (x);
946   mem = canon_rtx (mem);
947
948   x_addr = XEXP (x, 0);
949   mem_addr = XEXP (mem, 0);
950
951   return (memrefs_conflict_p (SIZE_FOR_MODE (mem), mem_addr,
952                               SIZE_FOR_MODE (x), x_addr, 0)
953           && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
954                 && GET_MODE (mem) != QImode
955                 && GET_CODE (mem_addr) != AND
956                 && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
957           && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
958                 && GET_MODE (x) != QImode
959                 && GET_CODE (x_addr) != AND
960                 && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
961 }
962
963 /* Output dependence: X is written after store in MEM takes place.  */
964
965 int
966 output_dependence (mem, x)
967      register rtx mem;
968      register rtx x;
969 {
970   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
971     return 1;
972
973   if (! base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
974     return 0;
975
976   x = canon_rtx (x);
977   mem = canon_rtx (mem);
978
979   return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
980                               SIZE_FOR_MODE (x), XEXP (x, 0), 0)
981           && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
982                 && GET_MODE (mem) != QImode
983                 && GET_CODE (XEXP (mem, 0)) != AND
984                 && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
985           && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
986                 && GET_MODE (x) != QImode
987                 && GET_CODE (XEXP (x, 0)) != AND
988                 && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
989 }
990
991
992 static HARD_REG_SET argument_registers;
993
994 void
995 init_alias_once ()
996 {
997   register int i;
998
999 #ifndef OUTGOING_REGNO
1000 #define OUTGOING_REGNO(N) N
1001 #endif
1002   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1003     /* Check whether this register can hold an incoming pointer
1004        argument.  FUNCTION_ARG_REGNO_P tests outgoing register
1005        numbers, so translate if necessary due to register windows. */
1006     if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i))
1007         && HARD_REGNO_MODE_OK (i, Pmode))
1008       SET_HARD_REG_BIT (argument_registers, i);
1009 }
1010
1011 void
1012 init_alias_analysis ()
1013 {
1014   int maxreg = max_reg_num ();
1015   int changed, pass;
1016   register int i;
1017   register rtx insn;
1018
1019   reg_known_value_size = maxreg;
1020
1021   reg_known_value
1022     = (rtx *) oballoc ((maxreg - FIRST_PSEUDO_REGISTER) * sizeof (rtx))
1023     - FIRST_PSEUDO_REGISTER;
1024   reg_known_equiv_p =
1025     oballoc (maxreg - FIRST_PSEUDO_REGISTER) - FIRST_PSEUDO_REGISTER;
1026   bzero ((char *) (reg_known_value + FIRST_PSEUDO_REGISTER),
1027          (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx));
1028   bzero (reg_known_equiv_p + FIRST_PSEUDO_REGISTER,
1029          (maxreg - FIRST_PSEUDO_REGISTER) * sizeof (char));
1030
1031   /* Overallocate reg_base_value to allow some growth during loop
1032      optimization.  Loop unrolling can create a large number of
1033      registers.  */
1034   reg_base_value_size = maxreg * 2;
1035   reg_base_value = (rtx *)oballoc (reg_base_value_size * sizeof (rtx));
1036   new_reg_base_value = (rtx *)alloca (reg_base_value_size * sizeof (rtx));
1037   reg_seen = (char *)alloca (reg_base_value_size);
1038   bzero ((char *) reg_base_value, reg_base_value_size * sizeof (rtx));
1039   if (! reload_completed && flag_unroll_loops)
1040     {
1041       alias_invariant = (rtx *)xrealloc (alias_invariant,
1042                                          reg_base_value_size * sizeof (rtx));
1043       bzero ((char *)alias_invariant, reg_base_value_size * sizeof (rtx));
1044     }
1045     
1046
1047   /* The basic idea is that each pass through this loop will use the
1048      "constant" information from the previous pass to propagate alias
1049      information through another level of assignments.
1050
1051      This could get expensive if the assignment chains are long.  Maybe
1052      we should throttle the number of iterations, possibly based on
1053      the optimization level or flag_expensive_optimizations.
1054
1055      We could propagate more information in the first pass by making use
1056      of REG_N_SETS to determine immediately that the alias information
1057      for a pseudo is "constant".
1058
1059      A program with an uninitialized variable can cause an infinite loop
1060      here.  Instead of doing a full dataflow analysis to detect such problems
1061      we just cap the number of iterations for the loop.
1062
1063      The state of the arrays for the set chain in question does not matter
1064      since the program has undefined behavior.  */
1065
1066   pass = 0;
1067   do
1068     {
1069       /* Assume nothing will change this iteration of the loop.  */
1070       changed = 0;
1071
1072       /* We want to assign the same IDs each iteration of this loop, so
1073          start counting from zero each iteration of the loop.  */
1074       unique_id = 0;
1075
1076       /* We're at the start of the funtion each iteration through the
1077          loop, so we're copying arguments.  */
1078       copying_arguments = 1;
1079
1080       /* Wipe the potential alias information clean for this pass.  */
1081       bzero ((char *) new_reg_base_value, reg_base_value_size * sizeof (rtx));
1082
1083       /* Wipe the reg_seen array clean.  */
1084       bzero ((char *) reg_seen, reg_base_value_size);
1085
1086       /* Mark all hard registers which may contain an address.
1087          The stack, frame and argument pointers may contain an address.
1088          An argument register which can hold a Pmode value may contain
1089          an address even if it is not in BASE_REGS.
1090
1091          The address expression is VOIDmode for an argument and
1092          Pmode for other registers.  */
1093
1094       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1095         if (TEST_HARD_REG_BIT (argument_registers, i))
1096           new_reg_base_value[i] = gen_rtx_ADDRESS (VOIDmode,
1097                                                    gen_rtx_REG (Pmode, i));
1098
1099       new_reg_base_value[STACK_POINTER_REGNUM]
1100         = gen_rtx_ADDRESS (Pmode, stack_pointer_rtx);
1101       new_reg_base_value[ARG_POINTER_REGNUM]
1102         = gen_rtx_ADDRESS (Pmode, arg_pointer_rtx);
1103       new_reg_base_value[FRAME_POINTER_REGNUM]
1104         = gen_rtx_ADDRESS (Pmode, frame_pointer_rtx);
1105 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1106       new_reg_base_value[HARD_FRAME_POINTER_REGNUM]
1107         = gen_rtx_ADDRESS (Pmode, hard_frame_pointer_rtx);
1108 #endif
1109       if (struct_value_incoming_rtx
1110           && GET_CODE (struct_value_incoming_rtx) == REG)
1111         new_reg_base_value[REGNO (struct_value_incoming_rtx)]
1112           = gen_rtx_ADDRESS (Pmode, struct_value_incoming_rtx);
1113
1114       if (static_chain_rtx
1115           && GET_CODE (static_chain_rtx) == REG)
1116         new_reg_base_value[REGNO (static_chain_rtx)]
1117           = gen_rtx_ADDRESS (Pmode, static_chain_rtx);
1118
1119       /* Walk the insns adding values to the new_reg_base_value array.  */
1120       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1121         {
1122           if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
1123             {
1124               rtx note, set;
1125               /* If this insn has a noalias note, process it,  Otherwise,
1126                  scan for sets.  A simple set will have no side effects
1127                  which could change the base value of any other register. */
1128
1129               if (GET_CODE (PATTERN (insn)) == SET
1130                   && (find_reg_note (insn, REG_NOALIAS, NULL_RTX)))
1131                 record_set (SET_DEST (PATTERN (insn)), NULL_RTX);
1132               else
1133                 note_stores (PATTERN (insn), record_set);
1134
1135               set = single_set (insn);
1136
1137               if (set != 0
1138                   && GET_CODE (SET_DEST (set)) == REG
1139                   && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
1140                   && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
1141                        && REG_N_SETS (REGNO (SET_DEST (set))) == 1)
1142                       || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
1143                   && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
1144                 {
1145                   int regno = REGNO (SET_DEST (set));
1146                   reg_known_value[regno] = XEXP (note, 0);
1147                   reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
1148                 }
1149             }
1150           else if (GET_CODE (insn) == NOTE
1151                    && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
1152             copying_arguments = 0;
1153         }
1154
1155       /* Now propagate values from new_reg_base_value to reg_base_value.  */
1156       for (i = 0; i < reg_base_value_size; i++)
1157         {
1158           if (new_reg_base_value[i]
1159               && new_reg_base_value[i] != reg_base_value[i]
1160               && ! rtx_equal_p (new_reg_base_value[i], reg_base_value[i]))
1161             {
1162               reg_base_value[i] = new_reg_base_value[i];
1163               changed = 1;
1164             }
1165         }
1166     }
1167   while (changed && ++pass < MAX_ALIAS_LOOP_PASSES);
1168
1169   /* Fill in the remaining entries.  */
1170   for (i = FIRST_PSEUDO_REGISTER; i < maxreg; i++)
1171     if (reg_known_value[i] == 0)
1172       reg_known_value[i] = regno_reg_rtx[i];
1173
1174   /* Simplify the reg_base_value array so that no register refers to
1175      another register, except to special registers indirectly through
1176      ADDRESS expressions.
1177
1178      In theory this loop can take as long as O(registers^2), but unless
1179      there are very long dependency chains it will run in close to linear
1180      time.
1181
1182      This loop may not be needed any longer now that the main loop does
1183      a better job at propagating alias information.  */
1184   pass = 0;
1185   do
1186     {
1187       changed = 0;
1188       pass++;
1189       for (i = 0; i < reg_base_value_size; i++)
1190         {
1191           rtx base = reg_base_value[i];
1192           if (base && GET_CODE (base) == REG)
1193             {
1194               int base_regno = REGNO (base);
1195               if (base_regno == i)              /* register set from itself */
1196                 reg_base_value[i] = 0;
1197               else
1198                 reg_base_value[i] = reg_base_value[base_regno];
1199               changed = 1;
1200             }
1201         }
1202     }
1203   while (changed && pass < MAX_ALIAS_LOOP_PASSES);
1204
1205   new_reg_base_value = 0;
1206   reg_seen = 0;
1207 }
1208
1209 void
1210 end_alias_analysis ()
1211 {
1212   reg_known_value = 0;
1213   reg_base_value = 0;
1214   reg_base_value_size = 0;
1215   if (alias_invariant)
1216     {
1217       free ((char *)alias_invariant);
1218       alias_invariant = 0;
1219     }
1220 }