OSDN Git Service

* alias.c (find_base_value): Improve handling of PLUS, MINUS, and
[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 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.  */
759
760 /* Read dependence: X is read after read in MEM takes place.  There can
761    only be a dependence here if both reads are volatile.  */
762
763 int
764 read_dependence (mem, x)
765      rtx mem;
766      rtx x;
767 {
768   return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
769 }
770
771 /* True dependence: X is read after store in MEM takes place.  */
772
773 int
774 true_dependence (mem, mem_mode, x, varies)
775      rtx mem;
776      enum machine_mode mem_mode;
777      rtx x;
778      int (*varies)();
779 {
780   rtx x_addr, mem_addr;
781
782   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
783     return 1;
784
785   x_addr = XEXP (x, 0);
786   mem_addr = XEXP (mem, 0);
787
788   if (flag_alias_check && ! base_alias_check (x_addr, mem_addr))
789     return 0;
790
791   /* If X is an unchanging read, then it can't possibly conflict with any
792      non-unchanging store.  It may conflict with an unchanging write though,
793      because there may be a single store to this address to initialize it.
794      Just fall through to the code below to resolve the case where we have
795      both an unchanging read and an unchanging write.  This won't handle all
796      cases optimally, but the possible performance loss should be
797      negligible.  */
798   if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
799     return 0;
800
801   x_addr = canon_rtx (x_addr);
802   mem_addr = canon_rtx (mem_addr);
803   if (mem_mode == VOIDmode)
804     mem_mode = GET_MODE (mem);
805
806   if (! memrefs_conflict_p (mem_mode, mem_addr, SIZE_FOR_MODE (x), x_addr, 0))
807     return 0;
808
809   /* If both references are struct references, or both are not, nothing
810      is known about aliasing.
811
812      If either reference is QImode or BLKmode, ANSI C permits aliasing.
813
814      If both addresses are constant, or both are not, nothing is known
815      about aliasing.  */
816   if (MEM_IN_STRUCT_P (x) == MEM_IN_STRUCT_P (mem)
817       || mem_mode == QImode || mem_mode == BLKmode
818       || GET_MODE (x) == QImode || GET_MODE (mem) == BLKmode
819       || varies (x_addr) == varies (mem_addr))
820     return 1;
821
822   /* One memory reference is to a constant address, one is not.
823      One is to a structure, the other is not.
824
825      If either memory reference is a variable structure the other is a
826      fixed scalar and there is no aliasing.  */
827   if ((MEM_IN_STRUCT_P (mem) && varies (mem_addr))
828       || (MEM_IN_STRUCT_P (x) && varies (x)))
829     return 0;
830
831   return 1;
832 }
833
834 /* Anti dependence: X is written after read in MEM takes place.  */
835
836 int
837 anti_dependence (mem, x)
838      rtx mem;
839      rtx x;
840 {
841   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
842     return 1;
843
844   if (flag_alias_check && ! base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
845     return 0;
846
847   /* If MEM is an unchanging read, then it can't possibly conflict with
848      the store to X, because there is at most one store to MEM, and it must
849      have occurred somewhere before MEM.  */
850   x = canon_rtx (x);
851   mem = canon_rtx (mem);
852   if (RTX_UNCHANGING_P (mem))
853     return 0;
854
855   return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
856                               SIZE_FOR_MODE (x), XEXP (x, 0), 0)
857           && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
858                 && GET_MODE (mem) != QImode
859                 && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
860           && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
861                 && GET_MODE (x) != QImode
862                 && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
863 }
864
865 /* Output dependence: X is written after store in MEM takes place.  */
866
867 int
868 output_dependence (mem, x)
869      register rtx mem;
870      register rtx x;
871 {
872   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
873     return 1;
874
875   if (flag_alias_check && !base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
876     return 0;
877
878   x = canon_rtx (x);
879   mem = canon_rtx (mem);
880   return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
881                               SIZE_FOR_MODE (x), XEXP (x, 0), 0)
882           && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
883                 && GET_MODE (mem) != QImode
884                 && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
885           && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
886                 && GET_MODE (x) != QImode
887                 && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
888 }
889
890 void
891 init_alias_analysis ()
892 {
893   int maxreg = max_reg_num ();
894   int changed;
895   register int i;
896   register rtx insn;
897   rtx note;
898   rtx set;
899
900   reg_known_value_size = maxreg;
901
902   reg_known_value
903     = (rtx *) oballoc ((maxreg - FIRST_PSEUDO_REGISTER) * sizeof (rtx))
904     - FIRST_PSEUDO_REGISTER;
905   reg_known_equiv_p =
906     oballoc (maxreg - FIRST_PSEUDO_REGISTER) - FIRST_PSEUDO_REGISTER;
907   bzero ((char *) (reg_known_value + FIRST_PSEUDO_REGISTER),
908          (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx));
909   bzero (reg_known_equiv_p + FIRST_PSEUDO_REGISTER,
910          (maxreg - FIRST_PSEUDO_REGISTER) * sizeof (char));
911
912   if (flag_alias_check)
913     {
914       /* Overallocate reg_base_value to allow some growth during loop
915          optimization.  Loop unrolling can create a large number of
916          registers.  */
917       reg_base_value_size = maxreg * 2;
918       reg_base_value = (rtx *)oballoc (reg_base_value_size * sizeof (rtx));
919       reg_seen = (char *)alloca (reg_base_value_size);
920       bzero (reg_base_value, reg_base_value_size * sizeof (rtx));
921       bzero (reg_seen, reg_base_value_size);
922
923       /* Mark all hard registers which may contain an address.
924          The stack, frame and argument pointers may contain an address.
925          An argument register which can hold a Pmode value may contain
926          an address even if it is not in BASE_REGS.
927
928          The address expression is VOIDmode for an argument and
929          Pmode for other registers.  */
930 #ifndef OUTGOING_REGNO
931 #define OUTGOING_REGNO(N) N
932 #endif
933       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
934         /* Check whether this register can hold an incoming pointer
935            argument.  FUNCTION_ARG_REGNO_P tests outgoing register
936            numbers, so translate if necessary due to register windows. */
937         if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i)) && HARD_REGNO_MODE_OK (i, Pmode))
938           reg_base_value[i] = gen_rtx (ADDRESS, VOIDmode,
939                                        gen_rtx (REG, Pmode, i));
940
941       reg_base_value[STACK_POINTER_REGNUM]
942         = gen_rtx (ADDRESS, Pmode, stack_pointer_rtx);
943       reg_base_value[ARG_POINTER_REGNUM]
944         = gen_rtx (ADDRESS, Pmode, arg_pointer_rtx);
945       reg_base_value[FRAME_POINTER_REGNUM]
946         = gen_rtx (ADDRESS, Pmode, frame_pointer_rtx);
947 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
948       reg_base_value[HARD_FRAME_POINTER_REGNUM]
949         = gen_rtx (ADDRESS, Pmode, hard_frame_pointer_rtx);
950 #endif
951     }
952
953   copying_arguments = 1;
954   /* Fill in the entries with known constant values.  */
955   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
956     {
957       if (flag_alias_check && GET_RTX_CLASS (GET_CODE (insn)) == 'i')
958         {
959           /* If this insn has a noalias note, process it,  Otherwise,
960              scan for sets.  A simple set will have no side effects
961              which could change the base value of any other register. */
962           rtx noalias_note;
963           if (GET_CODE (PATTERN (insn)) == SET
964               && (noalias_note = find_reg_note (insn, REG_NOALIAS, NULL_RTX)))
965             record_set (SET_DEST (PATTERN (insn)), 0);
966           else
967             note_stores (PATTERN (insn), record_set);
968         }
969       else if (GET_CODE (insn) == NOTE
970                && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
971         copying_arguments = 0;
972
973       if ((set = single_set (insn)) != 0
974           && GET_CODE (SET_DEST (set)) == REG
975           && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
976           && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
977                && REG_N_SETS (REGNO (SET_DEST (set))) == 1)
978               || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
979           && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
980         {
981           int regno = REGNO (SET_DEST (set));
982           reg_known_value[regno] = XEXP (note, 0);
983           reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
984         }
985     }
986
987   /* Fill in the remaining entries.  */
988   for (i = FIRST_PSEUDO_REGISTER; i < maxreg; i++)
989     if (reg_known_value[i] == 0)
990       reg_known_value[i] = regno_reg_rtx[i];
991
992   if (! flag_alias_check)
993     return;
994
995   /* Simplify the reg_base_value array so that no register refers to
996      another register, except to special registers indirectly through
997      ADDRESS expressions.
998
999      In theory this loop can take as long as O(registers^2), but unless
1000      there are very long dependency chains it will run in close to linear
1001      time.  */
1002   do
1003     {
1004       changed = 0;
1005       for (i = 0; i < reg_base_value_size; i++)
1006         {
1007           rtx base = reg_base_value[i];
1008           if (base && GET_CODE (base) == REG)
1009             {
1010               int base_regno = REGNO (base);
1011               if (base_regno == i)              /* register set from itself */
1012                 reg_base_value[i] = 0;
1013               else
1014                 reg_base_value[i] = reg_base_value[base_regno];
1015               changed = 1;
1016             }
1017         }
1018     }
1019   while (changed);
1020
1021   reg_seen = 0;
1022 }
1023
1024 void
1025 end_alias_analysis ()
1026 {
1027   reg_known_value = 0;
1028   reg_base_value = 0;
1029   reg_base_value_size = 0;
1030 }