OSDN Git Service

Fix H.J. Lu's alpha-linux aliasing bug.
[pf3gnuchains/gcc-fork.git] / gcc / alias.c
1 /* Alias analysis for GNU C
2    Copyright (C) 1997 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 "rtl.h"
24 #include "expr.h"
25 #include "regs.h"
26 #include "hard-reg-set.h"
27 #include "flags.h"
28
29 static rtx canon_rtx                    PROTO((rtx));
30 static int rtx_equal_for_memref_p       PROTO((rtx, rtx));
31 static rtx find_symbolic_term           PROTO((rtx));
32 static int memrefs_conflict_p           PROTO((int, rtx, int, rtx,
33                                                HOST_WIDE_INT));
34
35 /* Set up all info needed to perform alias analysis on memory references.  */
36
37 #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
38
39 /* reg_base_value[N] gives an address to which register N is related.
40    If all sets after the first add or subtract to the current value
41    or otherwise modify it so it does not point to a different top level
42    object, reg_base_value[N] is equal to the address part of the source
43    of the first set.
44
45    A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF.  ADDRESS
46    expressions represent certain special values: function arguments and
47    the stack, frame, and argument pointers.  The contents of an address
48    expression are not used (but they are descriptive for debugging);
49    only the address and mode matter.  Pointer equality, not rtx_equal_p,
50    determines whether two ADDRESS expressions refer to the same base
51    address.  The mode determines whether it is a function argument or
52    other special value. */
53
54 rtx *reg_base_value;
55 unsigned int reg_base_value_size;       /* size of reg_base_value array */
56 #define REG_BASE_VALUE(X) \
57         (REGNO (X) < reg_base_value_size ? reg_base_value[REGNO (X)] : 0)
58
59 /* Vector indexed by N giving the initial (unchanging) value known
60    for pseudo-register N.  */
61 rtx *reg_known_value;
62
63 /* Indicates number of valid entries in reg_known_value.  */
64 static int reg_known_value_size;
65
66 /* Vector recording for each reg_known_value whether it is due to a
67    REG_EQUIV note.  Future passes (viz., reload) may replace the
68    pseudo with the equivalent expression and so we account for the
69    dependences that would be introduced if that happens. */
70 /* ??? This is a problem only on the Convex.  The REG_EQUIV notes created in
71    assign_parms mention the arg pointer, and there are explicit insns in the
72    RTL that modify the arg pointer.  Thus we must ensure that such insns don't
73    get scheduled across each other because that would invalidate the REG_EQUIV
74    notes.  One could argue that the REG_EQUIV notes are wrong, but solving
75    the problem in the scheduler will likely give better code, so we do it
76    here.  */
77 char *reg_known_equiv_p;
78
79 /* True when scanning insns from the start of the rtl to the
80    NOTE_INSN_FUNCTION_BEG note.  */
81
82 static int copying_arguments;
83
84 /* Inside SRC, the source of a SET, find a base address.  */
85
86 static rtx
87 find_base_value (src)
88      register rtx src;
89 {
90   switch (GET_CODE (src))
91     {
92     case SYMBOL_REF:
93     case LABEL_REF:
94       return src;
95
96     case REG:
97       /* At the start of a function argument registers have known base
98          values which may be lost later.  Returning an ADDRESS
99          expression here allows optimization based on argument values
100          even when the argument registers are used for other purposes.  */
101       if (REGNO (src) < FIRST_PSEUDO_REGISTER && copying_arguments)
102         return reg_base_value[REGNO (src)];
103       return src;
104
105     case MEM:
106       /* Check for an argument passed in memory.  Only record in the
107          copying-arguments block; it is too hard to track changes
108          otherwise.  */
109       if (copying_arguments
110           && (XEXP (src, 0) == arg_pointer_rtx
111               || (GET_CODE (XEXP (src, 0)) == PLUS
112                   && XEXP (XEXP (src, 0), 0) == arg_pointer_rtx)))
113         return gen_rtx (ADDRESS, VOIDmode, src);
114       return 0;
115
116     case CONST:
117       src = XEXP (src, 0);
118       if (GET_CODE (src) != PLUS && GET_CODE (src) != MINUS)
119         break;
120       /* fall through */
121
122     case PLUS:
123     case MINUS:
124       {
125         rtx src_0 = XEXP (src, 0), src_1 = XEXP (src, 1);
126
127         /* Guess which operand is the base address.
128
129            If the first operand is a symbol or the second operand is
130            an integer, the first operand is the base address.  Else if
131            either operand is a register marked as a pointer, it is the
132            base address.  */
133
134         if (GET_CODE (src_1) == CONST_INT
135             || GET_CODE (src_0) == SYMBOL_REF
136             || GET_CODE (src_0) == LABEL_REF
137             || GET_CODE (src_0) == CONST)
138           return find_base_value (src_0);
139
140         if (GET_CODE (src_0) == REG && REGNO_POINTER_FLAG (REGNO (src_0)))
141           return find_base_value (src_0);
142
143         if (GET_CODE (src_1) == REG && REGNO_POINTER_FLAG (REGNO (src_1)))
144           return find_base_value (src_1);
145
146         return 0;
147       }
148
149     case LO_SUM:
150       /* The standard form is (lo_sum reg sym) so look only at the
151          second operand.  */
152       return find_base_value (XEXP (src, 1));
153
154     case AND:
155       /* If the second operand is constant set the base
156          address to the first operand. */
157       if (GET_CODE (XEXP (src, 1)) == CONST_INT && INTVAL (XEXP (src, 1)) != 0)
158         return find_base_value (XEXP (src, 0));
159       return 0;
160
161     case HIGH:
162       return find_base_value (XEXP (src, 0));
163     }
164
165   return 0;
166 }
167
168 /* Called from init_alias_analysis indirectly through note_stores.  */
169
170 /* while scanning insns to find base values, reg_seen[N] is nonzero if
171    register N has been set in this function.  */
172 static char *reg_seen;
173
174 static void
175 record_set (dest, set)
176      rtx dest, set;
177 {
178   register int regno;
179   rtx src;
180
181   if (GET_CODE (dest) != REG)
182     return;
183
184   regno = REGNO (dest);
185
186   if (set)
187     {
188       /* A CLOBBER wipes out any old value but does not prevent a previously
189          unset register from acquiring a base address (i.e. reg_seen is not
190          set).  */
191       if (GET_CODE (set) == CLOBBER)
192         {
193           reg_base_value[regno] = 0;
194           return;
195         }
196       src = SET_SRC (set);
197     }
198   else
199     {
200       static int unique_id;
201       if (reg_seen[regno])
202         {
203           reg_base_value[regno] = 0;
204           return;
205         }
206       reg_seen[regno] = 1;
207       reg_base_value[regno] = gen_rtx (ADDRESS, Pmode,
208                                        GEN_INT (unique_id++));
209       return;
210     }
211
212   /* This is not the first set.  If the new value is not related to the
213      old value, forget the base value. Note that the following code is
214      not detected:
215      extern int x, y;  int *p = &x; p += (&y-&x);
216      ANSI C does not allow computing the difference of addresses
217      of distinct top level objects.  */
218   if (reg_base_value[regno])
219     switch (GET_CODE (src))
220       {
221       case LO_SUM:
222       case PLUS:
223       case MINUS:
224         if (XEXP (src, 0) != dest && XEXP (src, 1) != dest)
225           reg_base_value[regno] = 0;
226         break;
227       case AND:
228         if (XEXP (src, 0) != dest || GET_CODE (XEXP (src, 1)) != CONST_INT)
229           reg_base_value[regno] = 0;
230         break;
231       default:
232         reg_base_value[regno] = 0;
233         break;
234       }
235   /* If this is the first set of a register, record the value.  */
236   else if ((regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno])
237            && ! reg_seen[regno] && reg_base_value[regno] == 0)
238     reg_base_value[regno] = find_base_value (src);
239
240   reg_seen[regno] = 1;
241 }
242
243 /* Called from loop optimization when a new pseudo-register is created.  */
244 void
245 record_base_value (regno, val)
246      int regno;
247      rtx val;
248 {
249   if (!flag_alias_check || regno >= reg_base_value_size)
250     return;
251   if (GET_CODE (val) == REG)
252     {
253       if (REGNO (val) < reg_base_value_size)
254         reg_base_value[regno] = reg_base_value[REGNO (val)];
255       return;
256     }
257   reg_base_value[regno] = find_base_value (val);
258 }
259
260 static rtx
261 canon_rtx (x)
262      rtx x;
263 {
264   /* Recursively look for equivalences.  */
265   if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER
266       && REGNO (x) < reg_known_value_size)
267     return reg_known_value[REGNO (x)] == x
268       ? x : canon_rtx (reg_known_value[REGNO (x)]);
269   else if (GET_CODE (x) == PLUS)
270     {
271       rtx x0 = canon_rtx (XEXP (x, 0));
272       rtx x1 = canon_rtx (XEXP (x, 1));
273
274       if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
275         {
276           /* We can tolerate LO_SUMs being offset here; these
277              rtl are used for nothing other than comparisons.  */
278           if (GET_CODE (x0) == CONST_INT)
279             return plus_constant_for_output (x1, INTVAL (x0));
280           else if (GET_CODE (x1) == CONST_INT)
281             return plus_constant_for_output (x0, INTVAL (x1));
282           return gen_rtx (PLUS, GET_MODE (x), x0, x1);
283         }
284     }
285   /* This gives us much better alias analysis when called from
286      the loop optimizer.   Note we want to leave the original
287      MEM alone, but need to return the canonicalized MEM with
288      all the flags with their original values.  */
289   else if (GET_CODE (x) == MEM)
290     {
291       rtx addr = canon_rtx (XEXP (x, 0));
292       if (addr != XEXP (x, 0))
293         {
294           rtx new = gen_rtx (MEM, GET_MODE (x), addr);
295           MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
296           RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
297           MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
298           x = new;
299         }
300     }
301   return x;
302 }
303
304 /* Return 1 if X and Y are identical-looking rtx's.
305
306    We use the data in reg_known_value above to see if two registers with
307    different numbers are, in fact, equivalent.  */
308
309 static int
310 rtx_equal_for_memref_p (x, y)
311      rtx x, y;
312 {
313   register int i;
314   register int j;
315   register enum rtx_code code;
316   register char *fmt;
317
318   if (x == 0 && y == 0)
319     return 1;
320   if (x == 0 || y == 0)
321     return 0;
322   x = canon_rtx (x);
323   y = canon_rtx (y);
324
325   if (x == y)
326     return 1;
327
328   code = GET_CODE (x);
329   /* Rtx's of different codes cannot be equal.  */
330   if (code != GET_CODE (y))
331     return 0;
332
333   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
334      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
335
336   if (GET_MODE (x) != GET_MODE (y))
337     return 0;
338
339   /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively.  */
340
341   if (code == REG)
342     return REGNO (x) == REGNO (y);
343   if (code == LABEL_REF)
344     return XEXP (x, 0) == XEXP (y, 0);
345   if (code == SYMBOL_REF)
346     return XSTR (x, 0) == XSTR (y, 0);
347
348   /* For commutative operations, the RTX match if the operand match in any
349      order.  Also handle the simple binary and unary cases without a loop.  */
350   if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
351     return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
352              && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
353             || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
354                 && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
355   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
356     return (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
357             && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)));
358   else if (GET_RTX_CLASS (code) == '1')
359     return rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0));
360
361   /* Compare the elements.  If any pair of corresponding elements
362      fail to match, return 0 for the whole things.  */
363
364   fmt = GET_RTX_FORMAT (code);
365   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
366     {
367       switch (fmt[i])
368         {
369         case 'w':
370           if (XWINT (x, i) != XWINT (y, i))
371             return 0;
372           break;
373
374         case 'n':
375         case 'i':
376           if (XINT (x, i) != XINT (y, i))
377             return 0;
378           break;
379
380         case 'V':
381         case 'E':
382           /* Two vectors must have the same length.  */
383           if (XVECLEN (x, i) != XVECLEN (y, i))
384             return 0;
385
386           /* And the corresponding elements must match.  */
387           for (j = 0; j < XVECLEN (x, i); j++)
388             if (rtx_equal_for_memref_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
389               return 0;
390           break;
391
392         case 'e':
393           if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0)
394             return 0;
395           break;
396
397         case 'S':
398         case 's':
399           if (strcmp (XSTR (x, i), XSTR (y, i)))
400             return 0;
401           break;
402
403         case 'u':
404           /* These are just backpointers, so they don't matter.  */
405           break;
406
407         case '0':
408           break;
409
410           /* It is believed that rtx's at this level will never
411              contain anything but integers and other rtx's,
412              except for within LABEL_REFs and SYMBOL_REFs.  */
413         default:
414           abort ();
415         }
416     }
417   return 1;
418 }
419
420 /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
421    X and return it, or return 0 if none found.  */
422
423 static rtx
424 find_symbolic_term (x)
425      rtx x;
426 {
427   register int i;
428   register enum rtx_code code;
429   register char *fmt;
430
431   code = GET_CODE (x);
432   if (code == SYMBOL_REF || code == LABEL_REF)
433     return x;
434   if (GET_RTX_CLASS (code) == 'o')
435     return 0;
436
437   fmt = GET_RTX_FORMAT (code);
438   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
439     {
440       rtx t;
441
442       if (fmt[i] == 'e')
443         {
444           t = find_symbolic_term (XEXP (x, i));
445           if (t != 0)
446             return t;
447         }
448       else if (fmt[i] == 'E')
449         break;
450     }
451   return 0;
452 }
453
454 static rtx
455 find_base_term (x)
456      register rtx x;
457 {
458   switch (GET_CODE (x))
459     {
460     case REG:
461       return REG_BASE_VALUE (x);
462
463     case HIGH:
464       return find_base_term (XEXP (x, 0));
465
466     case CONST:
467       x = XEXP (x, 0);
468       if (GET_CODE (x) != PLUS && GET_CODE (x) != MINUS)
469         return 0;
470       /* fall through */
471     case LO_SUM:
472     case PLUS:
473     case MINUS:
474       {
475         rtx tmp = find_base_term (XEXP (x, 0));
476         if (tmp)
477           return tmp;
478         return find_base_term (XEXP (x, 1));
479       }
480
481     case AND:
482       if (GET_CODE (XEXP (x, 0)) == REG && GET_CODE (XEXP (x, 1)) == CONST_INT)
483         return REG_BASE_VALUE (XEXP (x, 0));
484       return 0;
485
486     case SYMBOL_REF:
487     case LABEL_REF:
488       return x;
489
490     default:
491       return 0;
492     }
493 }
494
495 /* Return 0 if the addresses X and Y are known to point to different
496    objects, 1 if they might be pointers to the same object.  */
497
498 static int
499 base_alias_check (x, y)
500      rtx x, y;
501 {
502   rtx x_base = find_base_term (x);
503   rtx y_base = find_base_term (y);
504
505   /* If either base address is unknown or the base addresses are equal,
506      nothing is known about aliasing.  */
507
508   if (x_base == 0 || y_base == 0 || rtx_equal_p (x_base, y_base))
509     return 1;
510
511   /* The base addresses of the read and write are different
512      expressions.  If they are both symbols there is no
513      conflict.  */
514   if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
515     return 0;
516
517   /* If one address is a stack reference there can be no alias:
518      stack references using different base registers do not alias,
519      a stack reference can not alias a parameter, and a stack reference
520      can not alias a global.  */
521   if ((GET_CODE (x_base) == ADDRESS && GET_MODE (x_base) == Pmode)
522       || (GET_CODE (y_base) == ADDRESS && GET_MODE (y_base) == Pmode))
523     return 0;
524
525   if (! flag_argument_noalias)
526     return 1;
527
528   if (flag_argument_noalias > 1)
529     return 0;
530
531   /* Weak noalias assertion (arguments are distinct, but may match globals). */
532   return ! (GET_MODE (x_base) == VOIDmode && GET_MODE (y_base) == VOIDmode);
533 }
534
535 /* Return nonzero if X and Y (memory addresses) could reference the
536    same location in memory.  C is an offset accumulator.  When
537    C is nonzero, we are testing aliases between X and Y + C.
538    XSIZE is the size in bytes of the X reference,
539    similarly YSIZE is the size in bytes for Y.
540
541    If XSIZE or YSIZE is zero, we do not know the amount of memory being
542    referenced (the reference was BLKmode), so make the most pessimistic
543    assumptions.
544
545    We recognize the following cases of non-conflicting memory:
546
547         (1) addresses involving the frame pointer cannot conflict
548             with addresses involving static variables.
549         (2) static variables with different addresses cannot conflict.
550
551    Nice to notice that varying addresses cannot conflict with fp if no
552    local variables had their addresses taken, but that's too hard now.  */
553
554
555 static int
556 memrefs_conflict_p (xsize, x, ysize, y, c)
557      register rtx x, y;
558      int xsize, ysize;
559      HOST_WIDE_INT c;
560 {
561   if (GET_CODE (x) == HIGH)
562     x = XEXP (x, 0);
563   else if (GET_CODE (x) == LO_SUM)
564     x = XEXP (x, 1);
565   else
566     x = canon_rtx (x);
567   if (GET_CODE (y) == HIGH)
568     y = XEXP (y, 0);
569   else if (GET_CODE (y) == LO_SUM)
570     y = XEXP (y, 1);
571   else
572     y = canon_rtx (y);
573
574   if (rtx_equal_for_memref_p (x, y))
575     {
576       if (xsize == 0 || ysize == 0)
577         return 1;
578       if (c >= 0 && xsize > c)
579         return 1;
580       if (c < 0 && ysize+c > 0)
581         return 1;
582       return 0;
583     }
584
585   if (y == frame_pointer_rtx || y == hard_frame_pointer_rtx
586       || y == stack_pointer_rtx)
587     {
588       rtx t = y;
589       int tsize = ysize;
590       y = x; ysize = xsize;
591       x = t; xsize = tsize;
592     }
593
594   if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
595       || x == stack_pointer_rtx)
596     {
597       rtx y1;
598
599       if (CONSTANT_P (y))
600         return 0;
601
602       if (GET_CODE (y) == PLUS
603           && canon_rtx (XEXP (y, 0)) == x
604           && (y1 = canon_rtx (XEXP (y, 1)))
605           && GET_CODE (y1) == CONST_INT)
606         {
607           c += INTVAL (y1);
608           return (xsize == 0 || ysize == 0
609                   || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
610         }
611
612       if (GET_CODE (y) == PLUS
613           && (y1 = canon_rtx (XEXP (y, 0)))
614           && CONSTANT_P (y1))
615         return 0;
616
617       return 1;
618     }
619
620   if (GET_CODE (x) == PLUS)
621     {
622       /* The fact that X is canonicalized means that this
623          PLUS rtx is canonicalized.  */
624       rtx x0 = XEXP (x, 0);
625       rtx x1 = XEXP (x, 1);
626
627       if (GET_CODE (y) == PLUS)
628         {
629           /* The fact that Y is canonicalized means that this
630              PLUS rtx is canonicalized.  */
631           rtx y0 = XEXP (y, 0);
632           rtx y1 = XEXP (y, 1);
633
634           if (rtx_equal_for_memref_p (x1, y1))
635             return memrefs_conflict_p (xsize, x0, ysize, y0, c);
636           if (rtx_equal_for_memref_p (x0, y0))
637             return memrefs_conflict_p (xsize, x1, ysize, y1, c);
638           if (GET_CODE (x1) == CONST_INT)
639             if (GET_CODE (y1) == CONST_INT)
640               return memrefs_conflict_p (xsize, x0, ysize, y0,
641                                          c - INTVAL (x1) + INTVAL (y1));
642             else
643               return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
644           else if (GET_CODE (y1) == CONST_INT)
645             return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
646
647           /* Handle case where we cannot understand iteration operators,
648              but we notice that the base addresses are distinct objects.  */
649           /* ??? Is this still necessary? */
650           x = find_symbolic_term (x);
651           if (x == 0)
652             return 1;
653           y = find_symbolic_term (y);
654           if (y == 0)
655             return 1;
656           return rtx_equal_for_memref_p (x, y);
657         }
658       else if (GET_CODE (x1) == CONST_INT)
659         return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
660     }
661   else if (GET_CODE (y) == PLUS)
662     {
663       /* The fact that Y is canonicalized means that this
664          PLUS rtx is canonicalized.  */
665       rtx y0 = XEXP (y, 0);
666       rtx y1 = XEXP (y, 1);
667
668       if (GET_CODE (y1) == CONST_INT)
669         return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
670       else
671         return 1;
672     }
673
674   if (GET_CODE (x) == GET_CODE (y))
675     switch (GET_CODE (x))
676       {
677       case MULT:
678         {
679           /* Handle cases where we expect the second operands to be the
680              same, and check only whether the first operand would conflict
681              or not.  */
682           rtx x0, y0;
683           rtx x1 = canon_rtx (XEXP (x, 1));
684           rtx y1 = canon_rtx (XEXP (y, 1));
685           if (! rtx_equal_for_memref_p (x1, y1))
686             return 1;
687           x0 = canon_rtx (XEXP (x, 0));
688           y0 = canon_rtx (XEXP (y, 0));
689           if (rtx_equal_for_memref_p (x0, y0))
690             return (xsize == 0 || ysize == 0
691                     || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
692
693           /* Can't properly adjust our sizes.  */
694           if (GET_CODE (x1) != CONST_INT)
695             return 1;
696           xsize /= INTVAL (x1);
697           ysize /= INTVAL (x1);
698           c /= INTVAL (x1);
699           return memrefs_conflict_p (xsize, x0, ysize, y0, c);
700         }
701       }
702
703   /* Treat an access through an AND (e.g. a subword access on an Alpha)
704      as an access with indeterminate size.  */
705   if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT)
706     return memrefs_conflict_p (0, XEXP (x, 0), ysize, y, c);
707   if (GET_CODE (y) == AND && GET_CODE (XEXP (y, 1)) == CONST_INT)
708     return memrefs_conflict_p (xsize, x, 0, XEXP (y, 0), c);
709
710   if (CONSTANT_P (x))
711     {
712       if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
713         {
714           c += (INTVAL (y) - INTVAL (x));
715           return (xsize == 0 || ysize == 0
716                   || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
717         }
718
719       if (GET_CODE (x) == CONST)
720         {
721           if (GET_CODE (y) == CONST)
722             return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
723                                        ysize, canon_rtx (XEXP (y, 0)), c);
724           else
725             return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
726                                        ysize, y, c);
727         }
728       if (GET_CODE (y) == CONST)
729         return memrefs_conflict_p (xsize, x, ysize,
730                                    canon_rtx (XEXP (y, 0)), c);
731
732       if (CONSTANT_P (y))
733         return (rtx_equal_for_memref_p (x, y)
734                 && (xsize == 0 || ysize == 0
735                     || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)));
736
737       return 1;
738     }
739   return 1;
740 }
741
742 /* Functions to compute memory dependencies.
743
744    Since we process the insns in execution order, we can build tables
745    to keep track of what registers are fixed (and not aliased), what registers
746    are varying in known ways, and what registers are varying in unknown
747    ways.
748
749    If both memory references are volatile, then there must always be a
750    dependence between the two references, since their order can not be
751    changed.  A volatile and non-volatile reference can be interchanged
752    though. 
753
754    A MEM_IN_STRUCT reference at a non-QImode non-AND varying address can never
755    conflict with a non-MEM_IN_STRUCT reference at a fixed address.   We must
756    allow QImode aliasing because the ANSI C standard allows character
757    pointers to alias anything.  We are assuming that characters are
758    always QImode here.  We also must allow AND addresses, because they may
759    generate accesses outside the object being referenced.  This is used to
760    generate aligned addresses from unaligned addresses, for instance, the
761    alpha storeqi_unaligned pattern.  */
762
763 /* Read dependence: X is read after read in MEM takes place.  There can
764    only be a dependence here if both reads are volatile.  */
765
766 int
767 read_dependence (mem, x)
768      rtx mem;
769      rtx x;
770 {
771   return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
772 }
773
774 /* True dependence: X is read after store in MEM takes place.  */
775
776 int
777 true_dependence (mem, mem_mode, x, varies)
778      rtx mem;
779      enum machine_mode mem_mode;
780      rtx x;
781      int (*varies)();
782 {
783   rtx x_addr, mem_addr;
784
785   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
786     return 1;
787
788   x_addr = XEXP (x, 0);
789   mem_addr = XEXP (mem, 0);
790
791   if (flag_alias_check && ! base_alias_check (x_addr, mem_addr))
792     return 0;
793
794   /* If X is an unchanging read, then it can't possibly conflict with any
795      non-unchanging store.  It may conflict with an unchanging write though,
796      because there may be a single store to this address to initialize it.
797      Just fall through to the code below to resolve the case where we have
798      both an unchanging read and an unchanging write.  This won't handle all
799      cases optimally, but the possible performance loss should be
800      negligible.  */
801   if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
802     return 0;
803
804   x_addr = canon_rtx (x_addr);
805   mem_addr = canon_rtx (mem_addr);
806   if (mem_mode == VOIDmode)
807     mem_mode = GET_MODE (mem);
808
809   if (! memrefs_conflict_p (mem_mode, mem_addr, SIZE_FOR_MODE (x), x_addr, 0))
810     return 0;
811
812   /* If both references are struct references, or both are not, nothing
813      is known about aliasing.
814
815      If either reference is QImode or BLKmode, ANSI C permits aliasing.
816
817      If both addresses are constant, or both are not, nothing is known
818      about aliasing.  */
819   if (MEM_IN_STRUCT_P (x) == MEM_IN_STRUCT_P (mem)
820       || mem_mode == QImode || mem_mode == BLKmode
821       || GET_MODE (x) == QImode || GET_MODE (x) == BLKmode
822       || GET_CODE (x_addr) == AND || GET_CODE (mem_addr) == AND
823       || varies (x_addr) == varies (mem_addr))
824     return 1;
825
826   /* One memory reference is to a constant address, one is not.
827      One is to a structure, the other is not.
828
829      If either memory reference is a variable structure the other is a
830      fixed scalar and there is no aliasing.  */
831   if ((MEM_IN_STRUCT_P (mem) && varies (mem_addr))
832       || (MEM_IN_STRUCT_P (x) && varies (x_addr)))
833     return 0;
834
835   return 1;
836 }
837
838 /* Anti dependence: X is written after read in MEM takes place.  */
839
840 int
841 anti_dependence (mem, x)
842      rtx mem;
843      rtx x;
844 {
845   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
846     return 1;
847
848   if (flag_alias_check && ! base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
849     return 0;
850
851   /* If MEM is an unchanging read, then it can't possibly conflict with
852      the store to X, because there is at most one store to MEM, and it must
853      have occurred somewhere before MEM.  */
854   x = canon_rtx (x);
855   mem = canon_rtx (mem);
856   if (RTX_UNCHANGING_P (mem))
857     return 0;
858
859   return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
860                               SIZE_FOR_MODE (x), XEXP (x, 0), 0)
861           && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
862                 && GET_MODE (mem) != QImode
863                 && GET_CODE (XEXP (mem, 0)) != AND
864                 && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
865           && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
866                 && GET_MODE (x) != QImode
867                 && GET_CODE (XEXP (x, 0)) != AND
868                 && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
869 }
870
871 /* Output dependence: X is written after store in MEM takes place.  */
872
873 int
874 output_dependence (mem, x)
875      register rtx mem;
876      register rtx x;
877 {
878   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
879     return 1;
880
881   if (flag_alias_check && !base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
882     return 0;
883
884   x = canon_rtx (x);
885   mem = canon_rtx (mem);
886   return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
887                               SIZE_FOR_MODE (x), XEXP (x, 0), 0)
888           && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
889                 && GET_MODE (mem) != QImode
890                 && GET_CODE (XEXP (mem, 0)) != AND
891                 && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
892           && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
893                 && GET_MODE (x) != QImode
894                 && GET_CODE (XEXP (x, 0)) != AND
895                 && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
896 }
897
898 void
899 init_alias_analysis ()
900 {
901   int maxreg = max_reg_num ();
902   int changed;
903   register int i;
904   register rtx insn;
905   rtx note;
906   rtx set;
907
908   reg_known_value_size = maxreg;
909
910   reg_known_value
911     = (rtx *) oballoc ((maxreg - FIRST_PSEUDO_REGISTER) * sizeof (rtx))
912     - FIRST_PSEUDO_REGISTER;
913   reg_known_equiv_p =
914     oballoc (maxreg - FIRST_PSEUDO_REGISTER) - FIRST_PSEUDO_REGISTER;
915   bzero ((char *) (reg_known_value + FIRST_PSEUDO_REGISTER),
916          (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx));
917   bzero (reg_known_equiv_p + FIRST_PSEUDO_REGISTER,
918          (maxreg - FIRST_PSEUDO_REGISTER) * sizeof (char));
919
920   if (flag_alias_check)
921     {
922       /* Overallocate reg_base_value to allow some growth during loop
923          optimization.  Loop unrolling can create a large number of
924          registers.  */
925       reg_base_value_size = maxreg * 2;
926       reg_base_value = (rtx *)oballoc (reg_base_value_size * sizeof (rtx));
927       reg_seen = (char *)alloca (reg_base_value_size);
928       bzero (reg_base_value, reg_base_value_size * sizeof (rtx));
929       bzero (reg_seen, reg_base_value_size);
930
931       /* Mark all hard registers which may contain an address.
932          The stack, frame and argument pointers may contain an address.
933          An argument register which can hold a Pmode value may contain
934          an address even if it is not in BASE_REGS.
935
936          The address expression is VOIDmode for an argument and
937          Pmode for other registers.  */
938 #ifndef OUTGOING_REGNO
939 #define OUTGOING_REGNO(N) N
940 #endif
941       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
942         /* Check whether this register can hold an incoming pointer
943            argument.  FUNCTION_ARG_REGNO_P tests outgoing register
944            numbers, so translate if necessary due to register windows. */
945         if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i)) && HARD_REGNO_MODE_OK (i, Pmode))
946           reg_base_value[i] = gen_rtx (ADDRESS, VOIDmode,
947                                        gen_rtx (REG, Pmode, i));
948
949       reg_base_value[STACK_POINTER_REGNUM]
950         = gen_rtx (ADDRESS, Pmode, stack_pointer_rtx);
951       reg_base_value[ARG_POINTER_REGNUM]
952         = gen_rtx (ADDRESS, Pmode, arg_pointer_rtx);
953       reg_base_value[FRAME_POINTER_REGNUM]
954         = gen_rtx (ADDRESS, Pmode, frame_pointer_rtx);
955 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
956       reg_base_value[HARD_FRAME_POINTER_REGNUM]
957         = gen_rtx (ADDRESS, Pmode, hard_frame_pointer_rtx);
958 #endif
959     }
960
961   copying_arguments = 1;
962   /* Fill in the entries with known constant values.  */
963   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
964     {
965       if (flag_alias_check && GET_RTX_CLASS (GET_CODE (insn)) == 'i')
966         {
967           /* If this insn has a noalias note, process it,  Otherwise,
968              scan for sets.  A simple set will have no side effects
969              which could change the base value of any other register. */
970           rtx noalias_note;
971           if (GET_CODE (PATTERN (insn)) == SET
972               && (noalias_note = find_reg_note (insn, REG_NOALIAS, NULL_RTX)))
973             record_set (SET_DEST (PATTERN (insn)), 0);
974           else
975             note_stores (PATTERN (insn), record_set);
976         }
977       else if (GET_CODE (insn) == NOTE
978                && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
979         copying_arguments = 0;
980
981       if ((set = single_set (insn)) != 0
982           && GET_CODE (SET_DEST (set)) == REG
983           && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
984           && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
985                && REG_N_SETS (REGNO (SET_DEST (set))) == 1)
986               || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
987           && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
988         {
989           int regno = REGNO (SET_DEST (set));
990           reg_known_value[regno] = XEXP (note, 0);
991           reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
992         }
993     }
994
995   /* Fill in the remaining entries.  */
996   for (i = FIRST_PSEUDO_REGISTER; i < maxreg; i++)
997     if (reg_known_value[i] == 0)
998       reg_known_value[i] = regno_reg_rtx[i];
999
1000   if (! flag_alias_check)
1001     return;
1002
1003   /* Simplify the reg_base_value array so that no register refers to
1004      another register, except to special registers indirectly through
1005      ADDRESS expressions.
1006
1007      In theory this loop can take as long as O(registers^2), but unless
1008      there are very long dependency chains it will run in close to linear
1009      time.  */
1010   do
1011     {
1012       changed = 0;
1013       for (i = 0; i < reg_base_value_size; i++)
1014         {
1015           rtx base = reg_base_value[i];
1016           if (base && GET_CODE (base) == REG)
1017             {
1018               int base_regno = REGNO (base);
1019               if (base_regno == i)              /* register set from itself */
1020                 reg_base_value[i] = 0;
1021               else
1022                 reg_base_value[i] = reg_base_value[base_regno];
1023               changed = 1;
1024             }
1025         }
1026     }
1027   while (changed);
1028
1029   reg_seen = 0;
1030 }
1031
1032 void
1033 end_alias_analysis ()
1034 {
1035   reg_known_value = 0;
1036   reg_base_value = 0;
1037   reg_base_value_size = 0;
1038 }