1 /* Alias analysis for GNU C
2 Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
3 Contributed by John Carr (jfc@mit.edu).
5 This file is part of GNU CC.
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)
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.
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. */
30 #include "hard-reg-set.h"
34 #include "splay-tree.h"
36 /* The alias sets assigned to MEMs assist the back-end in determining
37 which MEMs can alias which other MEMs. In general, two MEMs in
38 different alias sets to not alias each other. There is one
39 exception, however. Consider something like:
41 struct S {int i; double d; };
43 a store to an `S' can alias something of either type `int' or type
44 `double'. (However, a store to an `int' cannot alias a `double'
45 and vice versa.) We indicate this via a tree structure that looks
53 (The arrows are directed and point downwards.) If, when comparing
54 two alias sets, we can hold one set fixed, and trace the other set
55 downwards, and at some point find the first set, the two MEMs can
56 alias one another. In this situation we say the alias set for
57 `struct S' is the `superset' and that those for `int' and `double'
60 Alias set zero is implicitly a superset of all other alias sets.
61 However, this is no actual entry for alias set zero. It is an
62 error to attempt to explicitly construct a subset of zero. */
64 typedef struct alias_set_entry
{
65 /* The alias set number, as stored in MEM_ALIAS_SET. */
68 /* The children of the alias set. These are not just the immediate
69 children, but, in fact, all children. So, if we have:
71 struct T { struct S s; float f; }
73 continuing our example above, the children here will be all of
74 `int', `double', `float', and `struct S'. */
78 static rtx canon_rtx
PROTO((rtx
));
79 static int rtx_equal_for_memref_p
PROTO((rtx
, rtx
));
80 static rtx find_symbolic_term
PROTO((rtx
));
81 static int memrefs_conflict_p
PROTO((int, rtx
, int, rtx
,
83 static void record_set
PROTO((rtx
, rtx
));
84 static rtx find_base_term
PROTO((rtx
));
85 static int base_alias_check
PROTO((rtx
, rtx
, enum machine_mode
,
87 static rtx find_base_value
PROTO((rtx
));
88 static int mems_in_disjoint_alias_sets_p
PROTO((rtx
, rtx
));
89 static int insert_subset_children
PROTO((splay_tree_node
,
91 static alias_set_entry get_alias_set_entry
PROTO((int));
92 static rtx fixed_scalar_and_varying_struct_p
PROTO((rtx
, rtx
, int (*)(rtx
)));
93 static int aliases_everything_p
PROTO((rtx
));
94 static int write_dependence_p
PROTO((rtx
, rtx
, int));
96 /* Set up all info needed to perform alias analysis on memory references. */
98 #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
100 /* Returns nonzero if MEM1 and MEM2 do not alias because they are in
101 different alias sets. We ignore alias sets in functions making use
102 of variable arguments because the va_arg macros on some systems are
104 #define DIFFERENT_ALIAS_SETS_P(MEM1, MEM2) \
105 mems_in_disjoint_alias_sets_p (MEM1, MEM2)
107 /* Cap the number of passes we make over the insns propagating alias
108 information through set chains.
110 10 is a completely arbitrary choice. */
111 #define MAX_ALIAS_LOOP_PASSES 10
113 /* reg_base_value[N] gives an address to which register N is related.
114 If all sets after the first add or subtract to the current value
115 or otherwise modify it so it does not point to a different top level
116 object, reg_base_value[N] is equal to the address part of the source
119 A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF. ADDRESS
120 expressions represent certain special values: function arguments and
121 the stack, frame, and argument pointers. The contents of an address
122 expression are not used (but they are descriptive for debugging);
123 only the address and mode matter. Pointer equality, not rtx_equal_p,
124 determines whether two ADDRESS expressions refer to the same base
125 address. The mode determines whether it is a function argument or
126 other special value. */
129 rtx
*new_reg_base_value
;
130 unsigned int reg_base_value_size
; /* size of reg_base_value array */
131 #define REG_BASE_VALUE(X) \
132 ((unsigned) REGNO (X) < reg_base_value_size ? reg_base_value[REGNO (X)] : 0)
134 /* Vector of known invariant relationships between registers. Set in
135 loop unrolling. Indexed by register number, if nonzero the value
136 is an expression describing this register in terms of another.
138 The length of this array is REG_BASE_VALUE_SIZE.
140 Because this array contains only pseudo registers it has no effect
142 static rtx
*alias_invariant
;
144 /* Vector indexed by N giving the initial (unchanging) value known
145 for pseudo-register N. */
146 rtx
*reg_known_value
;
148 /* Indicates number of valid entries in reg_known_value. */
149 static int reg_known_value_size
;
151 /* Vector recording for each reg_known_value whether it is due to a
152 REG_EQUIV note. Future passes (viz., reload) may replace the
153 pseudo with the equivalent expression and so we account for the
154 dependences that would be introduced if that happens. */
155 /* ??? This is a problem only on the Convex. The REG_EQUIV notes created in
156 assign_parms mention the arg pointer, and there are explicit insns in the
157 RTL that modify the arg pointer. Thus we must ensure that such insns don't
158 get scheduled across each other because that would invalidate the REG_EQUIV
159 notes. One could argue that the REG_EQUIV notes are wrong, but solving
160 the problem in the scheduler will likely give better code, so we do it
162 char *reg_known_equiv_p
;
164 /* True when scanning insns from the start of the rtl to the
165 NOTE_INSN_FUNCTION_BEG note. */
167 static int copying_arguments
;
169 /* The splay-tree used to store the various alias set entries. */
171 static splay_tree alias_sets
;
173 /* Returns a pointer to the alias set entry for ALIAS_SET, if there is
174 such an entry, or NULL otherwise. */
176 static alias_set_entry
177 get_alias_set_entry (alias_set
)
181 splay_tree_lookup (alias_sets
, (splay_tree_key
) alias_set
);
183 return sn
? ((alias_set_entry
) sn
->value
) : ((alias_set_entry
) 0);
186 /* Returns nonzero value if the alias sets for MEM1 and MEM2 are such
187 that the two MEMs cannot alias each other. */
190 mems_in_disjoint_alias_sets_p (mem1
, mem2
)
196 #ifdef ENABLE_CHECKING
197 /* Perform a basic sanity check. Namely, that there are no alias sets
198 if we're not using strict aliasing. This helps to catch bugs
199 whereby someone uses PUT_CODE, but doesn't clear MEM_ALIAS_SET, or
200 where a MEM is allocated in some way other than by the use of
201 gen_rtx_MEM, and the MEM_ALIAS_SET is not cleared. If we begin to
202 use alias sets to indicate that spilled registers cannot alias each
203 other, we might need to remove this check. */
204 if (!flag_strict_aliasing
&&
205 (MEM_ALIAS_SET (mem1
) || MEM_ALIAS_SET (mem2
)))
209 /* The code used in varargs macros are often not conforming ANSI C,
210 which can trick the compiler into making incorrect aliasing
211 assumptions in these functions. So, we don't use alias sets in
212 such a function. FIXME: This should be moved into the front-end;
213 it is a language-dependent notion, and there's no reason not to
214 still use these checks to handle globals. */
215 if (current_function_stdarg
|| current_function_varargs
)
218 if (!MEM_ALIAS_SET (mem1
) || !MEM_ALIAS_SET (mem2
))
219 /* We have no alias set information for one of the MEMs, so we
220 have to assume it can alias anything. */
223 if (MEM_ALIAS_SET (mem1
) == MEM_ALIAS_SET (mem2
))
224 /* The two alias sets are the same, so they may alias. */
227 /* Iterate through each of the children of the first alias set,
228 comparing it with the second alias set. */
229 ase
= get_alias_set_entry (MEM_ALIAS_SET (mem1
));
230 if (ase
&& splay_tree_lookup (ase
->children
,
231 (splay_tree_key
) MEM_ALIAS_SET (mem2
)))
234 /* Now do the same, but with the alias sets reversed. */
235 ase
= get_alias_set_entry (MEM_ALIAS_SET (mem2
));
236 if (ase
&& splay_tree_lookup (ase
->children
,
237 (splay_tree_key
) MEM_ALIAS_SET (mem1
)))
240 /* The two MEMs are in distinct alias sets, and neither one is the
241 child of the other. Therefore, they cannot alias. */
245 /* Insert the NODE into the splay tree given by DATA. Used by
246 record_alias_subset via splay_tree_foreach. */
249 insert_subset_children (node
, data
)
250 splay_tree_node node
;
253 splay_tree_insert ((splay_tree
) data
,
260 /* Indicate that things in SUBSET can alias things in SUPERSET, but
261 not vice versa. For example, in C, a store to an `int' can alias a
262 structure containing an `int', but not vice versa. Here, the
263 structure would be the SUPERSET and `int' the SUBSET. This
264 function should be called only once per SUPERSET/SUBSET pair. At
265 present any given alias set may only be a subset of one superset.
267 It is illegal for SUPERSET to be zero; everything is implicitly a
268 subset of alias set zero. */
271 record_alias_subset (superset
, subset
)
275 alias_set_entry superset_entry
;
276 alias_set_entry subset_entry
;
281 superset_entry
= get_alias_set_entry (superset
);
284 /* Create an entry for the SUPERSET, so that we have a place to
285 attach the SUBSET. */
287 (alias_set_entry
) xmalloc (sizeof (struct alias_set_entry
));
288 superset_entry
->alias_set
= superset
;
289 superset_entry
->children
290 = splay_tree_new (splay_tree_compare_ints
, 0, 0);
291 splay_tree_insert (alias_sets
,
292 (splay_tree_key
) superset
,
293 (splay_tree_value
) superset_entry
);
297 subset_entry
= get_alias_set_entry (subset
);
299 /* There is an entry for the subset. Enter all of its children
300 (if they are not already present) as children of the SUPERSET. */
301 splay_tree_foreach (subset_entry
->children
,
302 insert_subset_children
,
303 superset_entry
->children
);
305 /* Enter the SUBSET itself as a child of the SUPERSET. */
306 splay_tree_insert (superset_entry
->children
,
307 (splay_tree_key
) subset
,
311 /* Inside SRC, the source of a SET, find a base address. */
314 find_base_value (src
)
317 switch (GET_CODE (src
))
324 /* At the start of a function argument registers have known base
325 values which may be lost later. Returning an ADDRESS
326 expression here allows optimization based on argument values
327 even when the argument registers are used for other purposes. */
328 if (REGNO (src
) < FIRST_PSEUDO_REGISTER
&& copying_arguments
)
329 return new_reg_base_value
[REGNO (src
)];
331 /* If a pseudo has a known base value, return it. Do not do this
332 for hard regs since it can result in a circular dependency
333 chain for registers which have values at function entry.
335 The test above is not sufficient because the scheduler may move
336 a copy out of an arg reg past the NOTE_INSN_FUNCTION_BEGIN. */
337 if (REGNO (src
) >= FIRST_PSEUDO_REGISTER
338 && (unsigned) REGNO (src
) < reg_base_value_size
339 && reg_base_value
[REGNO (src
)])
340 return reg_base_value
[REGNO (src
)];
345 /* Check for an argument passed in memory. Only record in the
346 copying-arguments block; it is too hard to track changes
348 if (copying_arguments
349 && (XEXP (src
, 0) == arg_pointer_rtx
350 || (GET_CODE (XEXP (src
, 0)) == PLUS
351 && XEXP (XEXP (src
, 0), 0) == arg_pointer_rtx
)))
352 return gen_rtx_ADDRESS (VOIDmode
, src
);
357 if (GET_CODE (src
) != PLUS
&& GET_CODE (src
) != MINUS
)
364 rtx temp
, src_0
= XEXP (src
, 0), src_1
= XEXP (src
, 1);
366 /* If either operand is a REG, then see if we already have
367 a known value for it. */
368 if (GET_CODE (src_0
) == REG
)
370 temp
= find_base_value (src_0
);
375 if (GET_CODE (src_1
) == REG
)
377 temp
= find_base_value (src_1
);
382 /* Guess which operand is the base address.
384 If either operand is a symbol, then it is the base. If
385 either operand is a CONST_INT, then the other is the base. */
387 if (GET_CODE (src_1
) == CONST_INT
388 || GET_CODE (src_0
) == SYMBOL_REF
389 || GET_CODE (src_0
) == LABEL_REF
390 || GET_CODE (src_0
) == CONST
)
391 return find_base_value (src_0
);
393 if (GET_CODE (src_0
) == CONST_INT
394 || GET_CODE (src_1
) == SYMBOL_REF
395 || GET_CODE (src_1
) == LABEL_REF
396 || GET_CODE (src_1
) == CONST
)
397 return find_base_value (src_1
);
399 /* This might not be necessary anymore.
401 If either operand is a REG that is a known pointer, then it
403 if (GET_CODE (src_0
) == REG
&& REGNO_POINTER_FLAG (REGNO (src_0
)))
404 return find_base_value (src_0
);
406 if (GET_CODE (src_1
) == REG
&& REGNO_POINTER_FLAG (REGNO (src_1
)))
407 return find_base_value (src_1
);
413 /* The standard form is (lo_sum reg sym) so look only at the
415 return find_base_value (XEXP (src
, 1));
418 /* If the second operand is constant set the base
419 address to the first operand. */
420 if (GET_CODE (XEXP (src
, 1)) == CONST_INT
&& INTVAL (XEXP (src
, 1)) != 0)
421 return find_base_value (XEXP (src
, 0));
425 case SIGN_EXTEND
: /* used for NT/Alpha pointers */
427 return find_base_value (XEXP (src
, 0));
436 /* Called from init_alias_analysis indirectly through note_stores. */
438 /* while scanning insns to find base values, reg_seen[N] is nonzero if
439 register N has been set in this function. */
440 static char *reg_seen
;
442 /* Addresses which are known not to alias anything else are identified
443 by a unique integer. */
444 static int unique_id
;
447 record_set (dest
, set
)
453 if (GET_CODE (dest
) != REG
)
456 regno
= REGNO (dest
);
460 /* A CLOBBER wipes out any old value but does not prevent a previously
461 unset register from acquiring a base address (i.e. reg_seen is not
463 if (GET_CODE (set
) == CLOBBER
)
465 new_reg_base_value
[regno
] = 0;
474 new_reg_base_value
[regno
] = 0;
478 new_reg_base_value
[regno
] = gen_rtx_ADDRESS (Pmode
,
479 GEN_INT (unique_id
++));
483 /* This is not the first set. If the new value is not related to the
484 old value, forget the base value. Note that the following code is
486 extern int x, y; int *p = &x; p += (&y-&x);
487 ANSI C does not allow computing the difference of addresses
488 of distinct top level objects. */
489 if (new_reg_base_value
[regno
])
490 switch (GET_CODE (src
))
495 if (XEXP (src
, 0) != dest
&& XEXP (src
, 1) != dest
)
496 new_reg_base_value
[regno
] = 0;
499 if (XEXP (src
, 0) != dest
|| GET_CODE (XEXP (src
, 1)) != CONST_INT
)
500 new_reg_base_value
[regno
] = 0;
503 new_reg_base_value
[regno
] = 0;
506 /* If this is the first set of a register, record the value. */
507 else if ((regno
>= FIRST_PSEUDO_REGISTER
|| ! fixed_regs
[regno
])
508 && ! reg_seen
[regno
] && new_reg_base_value
[regno
] == 0)
509 new_reg_base_value
[regno
] = find_base_value (src
);
514 /* Called from loop optimization when a new pseudo-register is created. */
516 record_base_value (regno
, val
, invariant
)
521 if ((unsigned) regno
>= reg_base_value_size
)
524 /* If INVARIANT is true then this value also describes an invariant
525 relationship which can be used to deduce that two registers with
526 unknown values are different. */
527 if (invariant
&& alias_invariant
)
528 alias_invariant
[regno
] = val
;
530 if (GET_CODE (val
) == REG
)
532 if ((unsigned) REGNO (val
) < reg_base_value_size
)
534 reg_base_value
[regno
] = reg_base_value
[REGNO (val
)];
538 reg_base_value
[regno
] = find_base_value (val
);
545 /* Recursively look for equivalences. */
546 if (GET_CODE (x
) == REG
&& REGNO (x
) >= FIRST_PSEUDO_REGISTER
547 && REGNO (x
) < reg_known_value_size
)
548 return reg_known_value
[REGNO (x
)] == x
549 ? x
: canon_rtx (reg_known_value
[REGNO (x
)]);
550 else if (GET_CODE (x
) == PLUS
)
552 rtx x0
= canon_rtx (XEXP (x
, 0));
553 rtx x1
= canon_rtx (XEXP (x
, 1));
555 if (x0
!= XEXP (x
, 0) || x1
!= XEXP (x
, 1))
557 /* We can tolerate LO_SUMs being offset here; these
558 rtl are used for nothing other than comparisons. */
559 if (GET_CODE (x0
) == CONST_INT
)
560 return plus_constant_for_output (x1
, INTVAL (x0
));
561 else if (GET_CODE (x1
) == CONST_INT
)
562 return plus_constant_for_output (x0
, INTVAL (x1
));
563 return gen_rtx_PLUS (GET_MODE (x
), x0
, x1
);
566 /* This gives us much better alias analysis when called from
567 the loop optimizer. Note we want to leave the original
568 MEM alone, but need to return the canonicalized MEM with
569 all the flags with their original values. */
570 else if (GET_CODE (x
) == MEM
)
572 rtx addr
= canon_rtx (XEXP (x
, 0));
573 if (addr
!= XEXP (x
, 0))
575 rtx
new = gen_rtx_MEM (GET_MODE (x
), addr
);
576 RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x
);
577 MEM_COPY_ATTRIBUTES (new, x
);
578 MEM_ALIAS_SET (new) = MEM_ALIAS_SET (x
);
585 /* Return 1 if X and Y are identical-looking rtx's.
587 We use the data in reg_known_value above to see if two registers with
588 different numbers are, in fact, equivalent. */
591 rtx_equal_for_memref_p (x
, y
)
596 register enum rtx_code code
;
597 register const char *fmt
;
599 if (x
== 0 && y
== 0)
601 if (x
== 0 || y
== 0)
610 /* Rtx's of different codes cannot be equal. */
611 if (code
!= GET_CODE (y
))
614 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
615 (REG:SI x) and (REG:HI x) are NOT equivalent. */
617 if (GET_MODE (x
) != GET_MODE (y
))
620 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
623 return REGNO (x
) == REGNO (y
);
624 if (code
== LABEL_REF
)
625 return XEXP (x
, 0) == XEXP (y
, 0);
626 if (code
== SYMBOL_REF
)
627 return XSTR (x
, 0) == XSTR (y
, 0);
628 if (code
== CONST_INT
)
629 return INTVAL (x
) == INTVAL (y
);
630 /* There's no need to compare the contents of CONST_DOUBLEs because
632 if (code
== CONST_DOUBLE
)
634 if (code
== ADDRESSOF
)
635 return REGNO (XEXP (x
, 0)) == REGNO (XEXP (y
, 0)) && XINT (x
, 1) == XINT (y
, 1);
637 /* For commutative operations, the RTX match if the operand match in any
638 order. Also handle the simple binary and unary cases without a loop. */
639 if (code
== EQ
|| code
== NE
|| GET_RTX_CLASS (code
) == 'c')
640 return ((rtx_equal_for_memref_p (XEXP (x
, 0), XEXP (y
, 0))
641 && rtx_equal_for_memref_p (XEXP (x
, 1), XEXP (y
, 1)))
642 || (rtx_equal_for_memref_p (XEXP (x
, 0), XEXP (y
, 1))
643 && rtx_equal_for_memref_p (XEXP (x
, 1), XEXP (y
, 0))));
644 else if (GET_RTX_CLASS (code
) == '<' || GET_RTX_CLASS (code
) == '2')
645 return (rtx_equal_for_memref_p (XEXP (x
, 0), XEXP (y
, 0))
646 && rtx_equal_for_memref_p (XEXP (x
, 1), XEXP (y
, 1)));
647 else if (GET_RTX_CLASS (code
) == '1')
648 return rtx_equal_for_memref_p (XEXP (x
, 0), XEXP (y
, 0));
650 /* Compare the elements. If any pair of corresponding elements
651 fail to match, return 0 for the whole things.
653 Limit cases to types which actually appear in addresses. */
655 fmt
= GET_RTX_FORMAT (code
);
656 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
661 if (XINT (x
, i
) != XINT (y
, i
))
666 /* Two vectors must have the same length. */
667 if (XVECLEN (x
, i
) != XVECLEN (y
, i
))
670 /* And the corresponding elements must match. */
671 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
672 if (rtx_equal_for_memref_p (XVECEXP (x
, i
, j
), XVECEXP (y
, i
, j
)) == 0)
677 if (rtx_equal_for_memref_p (XEXP (x
, i
), XEXP (y
, i
)) == 0)
681 /* This can happen for an asm which clobbers memory. */
685 /* It is believed that rtx's at this level will never
686 contain anything but integers and other rtx's,
687 except for within LABEL_REFs and SYMBOL_REFs. */
695 /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
696 X and return it, or return 0 if none found. */
699 find_symbolic_term (x
)
703 register enum rtx_code code
;
704 register const char *fmt
;
707 if (code
== SYMBOL_REF
|| code
== LABEL_REF
)
709 if (GET_RTX_CLASS (code
) == 'o')
712 fmt
= GET_RTX_FORMAT (code
);
713 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
719 t
= find_symbolic_term (XEXP (x
, i
));
723 else if (fmt
[i
] == 'E')
733 switch (GET_CODE (x
))
736 return REG_BASE_VALUE (x
);
739 case SIGN_EXTEND
: /* Used for Alpha/NT pointers */
745 return find_base_term (XEXP (x
, 0));
749 if (GET_CODE (x
) != PLUS
&& GET_CODE (x
) != MINUS
)
756 rtx tmp1
= XEXP (x
, 0);
757 rtx tmp2
= XEXP (x
, 1);
759 /* This is a litle bit tricky since we have to determine which of
760 the two operands represents the real base address. Otherwise this
761 routine may return the index register instead of the base register.
763 That may cause us to believe no aliasing was possible, when in
764 fact aliasing is possible.
766 We use a few simple tests to guess the base register. Additional
767 tests can certainly be added. For example, if one of the operands
768 is a shift or multiply, then it must be the index register and the
769 other operand is the base register. */
771 /* If either operand is known to be a pointer, then use it
772 to determine the base term. */
773 if (REG_P (tmp1
) && REGNO_POINTER_FLAG (REGNO (tmp1
)))
774 return find_base_term (tmp1
);
776 if (REG_P (tmp2
) && REGNO_POINTER_FLAG (REGNO (tmp2
)))
777 return find_base_term (tmp2
);
779 /* Neither operand was known to be a pointer. Go ahead and find the
780 base term for both operands. */
781 tmp1
= find_base_term (tmp1
);
782 tmp2
= find_base_term (tmp2
);
784 /* If either base term is named object or a special address
785 (like an argument or stack reference), then use it for the
788 && (GET_CODE (tmp1
) == SYMBOL_REF
789 || GET_CODE (tmp1
) == LABEL_REF
790 || (GET_CODE (tmp1
) == ADDRESS
791 && GET_MODE (tmp1
) != VOIDmode
)))
795 && (GET_CODE (tmp2
) == SYMBOL_REF
796 || GET_CODE (tmp2
) == LABEL_REF
797 || (GET_CODE (tmp2
) == ADDRESS
798 && GET_MODE (tmp2
) != VOIDmode
)))
801 /* We could not determine which of the two operands was the
802 base register and which was the index. So we can determine
803 nothing from the base alias check. */
808 if (GET_CODE (XEXP (x
, 0)) == REG
&& GET_CODE (XEXP (x
, 1)) == CONST_INT
)
809 return REG_BASE_VALUE (XEXP (x
, 0));
821 /* Return 0 if the addresses X and Y are known to point to different
822 objects, 1 if they might be pointers to the same object. */
825 base_alias_check (x
, y
, x_mode
, y_mode
)
827 enum machine_mode x_mode
, y_mode
;
829 rtx x_base
= find_base_term (x
);
830 rtx y_base
= find_base_term (y
);
832 /* If the address itself has no known base see if a known equivalent
833 value has one. If either address still has no known base, nothing
834 is known about aliasing. */
838 if (! flag_expensive_optimizations
|| (x_c
= canon_rtx (x
)) == x
)
840 x_base
= find_base_term (x_c
);
848 if (! flag_expensive_optimizations
|| (y_c
= canon_rtx (y
)) == y
)
850 y_base
= find_base_term (y_c
);
855 /* If the base addresses are equal nothing is known about aliasing. */
856 if (rtx_equal_p (x_base
, y_base
))
859 /* The base addresses of the read and write are different expressions.
860 If they are both symbols and they are not accessed via AND, there is
861 no conflict. We can bring knowledge of object alignment into play
862 here. For example, on alpha, "char a, b;" can alias one another,
863 though "char a; long b;" cannot. */
864 if (GET_CODE (x_base
) != ADDRESS
&& GET_CODE (y_base
) != ADDRESS
)
866 if (GET_CODE (x
) == AND
&& GET_CODE (y
) == AND
)
868 if (GET_CODE (x
) == AND
869 && (GET_CODE (XEXP (x
, 1)) != CONST_INT
870 || GET_MODE_UNIT_SIZE (y_mode
) < -INTVAL (XEXP (x
, 1))))
872 if (GET_CODE (y
) == AND
873 && (GET_CODE (XEXP (y
, 1)) != CONST_INT
874 || GET_MODE_UNIT_SIZE (x_mode
) < -INTVAL (XEXP (y
, 1))))
876 /* Differing symbols never alias. */
880 /* If one address is a stack reference there can be no alias:
881 stack references using different base registers do not alias,
882 a stack reference can not alias a parameter, and a stack reference
883 can not alias a global. */
884 if ((GET_CODE (x_base
) == ADDRESS
&& GET_MODE (x_base
) == Pmode
)
885 || (GET_CODE (y_base
) == ADDRESS
&& GET_MODE (y_base
) == Pmode
))
888 if (! flag_argument_noalias
)
891 if (flag_argument_noalias
> 1)
894 /* Weak noalias assertion (arguments are distinct, but may match globals). */
895 return ! (GET_MODE (x_base
) == VOIDmode
&& GET_MODE (y_base
) == VOIDmode
);
898 /* Return the address of the (N_REFS + 1)th memory reference to ADDR
899 where SIZE is the size in bytes of the memory reference. If ADDR
900 is not modified by the memory reference then ADDR is returned. */
903 addr_side_effect_eval (addr
, size
, n_refs
)
910 switch (GET_CODE (addr
))
913 offset
= (n_refs
+ 1) * size
;
916 offset
= -(n_refs
+ 1) * size
;
919 offset
= n_refs
* size
;
922 offset
= -n_refs
* size
;
930 addr
= gen_rtx_PLUS (GET_MODE (addr
), XEXP (addr
, 0), GEN_INT (offset
));
932 addr
= XEXP (addr
, 0);
937 /* Return nonzero if X and Y (memory addresses) could reference the
938 same location in memory. C is an offset accumulator. When
939 C is nonzero, we are testing aliases between X and Y + C.
940 XSIZE is the size in bytes of the X reference,
941 similarly YSIZE is the size in bytes for Y.
943 If XSIZE or YSIZE is zero, we do not know the amount of memory being
944 referenced (the reference was BLKmode), so make the most pessimistic
947 If XSIZE or YSIZE is negative, we may access memory outside the object
948 being referenced as a side effect. This can happen when using AND to
949 align memory references, as is done on the Alpha.
951 Nice to notice that varying addresses cannot conflict with fp if no
952 local variables had their addresses taken, but that's too hard now. */
956 memrefs_conflict_p (xsize
, x
, ysize
, y
, c
)
961 if (GET_CODE (x
) == HIGH
)
963 else if (GET_CODE (x
) == LO_SUM
)
966 x
= canon_rtx (addr_side_effect_eval (x
, xsize
, 0));
967 if (GET_CODE (y
) == HIGH
)
969 else if (GET_CODE (y
) == LO_SUM
)
972 y
= canon_rtx (addr_side_effect_eval (y
, ysize
, 0));
974 if (rtx_equal_for_memref_p (x
, y
))
976 if (xsize
<= 0 || ysize
<= 0)
978 if (c
>= 0 && xsize
> c
)
980 if (c
< 0 && ysize
+c
> 0)
985 /* This code used to check for conflicts involving stack references and
986 globals but the base address alias code now handles these cases. */
988 if (GET_CODE (x
) == PLUS
)
990 /* The fact that X is canonicalized means that this
991 PLUS rtx is canonicalized. */
992 rtx x0
= XEXP (x
, 0);
993 rtx x1
= XEXP (x
, 1);
995 if (GET_CODE (y
) == PLUS
)
997 /* The fact that Y is canonicalized means that this
998 PLUS rtx is canonicalized. */
999 rtx y0
= XEXP (y
, 0);
1000 rtx y1
= XEXP (y
, 1);
1002 if (rtx_equal_for_memref_p (x1
, y1
))
1003 return memrefs_conflict_p (xsize
, x0
, ysize
, y0
, c
);
1004 if (rtx_equal_for_memref_p (x0
, y0
))
1005 return memrefs_conflict_p (xsize
, x1
, ysize
, y1
, c
);
1006 if (GET_CODE (x1
) == CONST_INT
)
1008 if (GET_CODE (y1
) == CONST_INT
)
1009 return memrefs_conflict_p (xsize
, x0
, ysize
, y0
,
1010 c
- INTVAL (x1
) + INTVAL (y1
));
1012 return memrefs_conflict_p (xsize
, x0
, ysize
, y
,
1015 else if (GET_CODE (y1
) == CONST_INT
)
1016 return memrefs_conflict_p (xsize
, x
, ysize
, y0
, c
+ INTVAL (y1
));
1020 else if (GET_CODE (x1
) == CONST_INT
)
1021 return memrefs_conflict_p (xsize
, x0
, ysize
, y
, c
- INTVAL (x1
));
1023 else if (GET_CODE (y
) == PLUS
)
1025 /* The fact that Y is canonicalized means that this
1026 PLUS rtx is canonicalized. */
1027 rtx y0
= XEXP (y
, 0);
1028 rtx y1
= XEXP (y
, 1);
1030 if (GET_CODE (y1
) == CONST_INT
)
1031 return memrefs_conflict_p (xsize
, x
, ysize
, y0
, c
+ INTVAL (y1
));
1036 if (GET_CODE (x
) == GET_CODE (y
))
1037 switch (GET_CODE (x
))
1041 /* Handle cases where we expect the second operands to be the
1042 same, and check only whether the first operand would conflict
1045 rtx x1
= canon_rtx (XEXP (x
, 1));
1046 rtx y1
= canon_rtx (XEXP (y
, 1));
1047 if (! rtx_equal_for_memref_p (x1
, y1
))
1049 x0
= canon_rtx (XEXP (x
, 0));
1050 y0
= canon_rtx (XEXP (y
, 0));
1051 if (rtx_equal_for_memref_p (x0
, y0
))
1052 return (xsize
== 0 || ysize
== 0
1053 || (c
>= 0 && xsize
> c
) || (c
< 0 && ysize
+c
> 0));
1055 /* Can't properly adjust our sizes. */
1056 if (GET_CODE (x1
) != CONST_INT
)
1058 xsize
/= INTVAL (x1
);
1059 ysize
/= INTVAL (x1
);
1061 return memrefs_conflict_p (xsize
, x0
, ysize
, y0
, c
);
1065 /* Are these registers known not to be equal? */
1066 if (alias_invariant
)
1068 unsigned int r_x
= REGNO (x
), r_y
= REGNO (y
);
1069 rtx i_x
, i_y
; /* invariant relationships of X and Y */
1071 i_x
= r_x
>= reg_base_value_size
? 0 : alias_invariant
[r_x
];
1072 i_y
= r_y
>= reg_base_value_size
? 0 : alias_invariant
[r_y
];
1074 if (i_x
== 0 && i_y
== 0)
1077 if (! memrefs_conflict_p (xsize
, i_x
? i_x
: x
,
1078 ysize
, i_y
? i_y
: y
, c
))
1087 /* Treat an access through an AND (e.g. a subword access on an Alpha)
1088 as an access with indeterminate size. Assume that references
1089 besides AND are aligned, so if the size of the other reference is
1090 at least as large as the alignment, assume no other overlap. */
1091 if (GET_CODE (x
) == AND
&& GET_CODE (XEXP (x
, 1)) == CONST_INT
)
1093 if (GET_CODE (y
) == AND
|| ysize
< -INTVAL (XEXP (x
, 1)))
1095 return memrefs_conflict_p (xsize
, XEXP (x
, 0), ysize
, y
, c
);
1097 if (GET_CODE (y
) == AND
&& GET_CODE (XEXP (y
, 1)) == CONST_INT
)
1099 /* ??? If we are indexing far enough into the array/structure, we
1100 may yet be able to determine that we can not overlap. But we
1101 also need to that we are far enough from the end not to overlap
1102 a following reference, so we do nothing with that for now. */
1103 if (GET_CODE (x
) == AND
|| xsize
< -INTVAL (XEXP (y
, 1)))
1105 return memrefs_conflict_p (xsize
, x
, ysize
, XEXP (y
, 0), c
);
1110 if (GET_CODE (x
) == CONST_INT
&& GET_CODE (y
) == CONST_INT
)
1112 c
+= (INTVAL (y
) - INTVAL (x
));
1113 return (xsize
<= 0 || ysize
<= 0
1114 || (c
>= 0 && xsize
> c
) || (c
< 0 && ysize
+c
> 0));
1117 if (GET_CODE (x
) == CONST
)
1119 if (GET_CODE (y
) == CONST
)
1120 return memrefs_conflict_p (xsize
, canon_rtx (XEXP (x
, 0)),
1121 ysize
, canon_rtx (XEXP (y
, 0)), c
);
1123 return memrefs_conflict_p (xsize
, canon_rtx (XEXP (x
, 0)),
1126 if (GET_CODE (y
) == CONST
)
1127 return memrefs_conflict_p (xsize
, x
, ysize
,
1128 canon_rtx (XEXP (y
, 0)), c
);
1131 return (xsize
< 0 || ysize
< 0
1132 || (rtx_equal_for_memref_p (x
, y
)
1133 && (xsize
== 0 || ysize
== 0
1134 || (c
>= 0 && xsize
> c
) || (c
< 0 && ysize
+c
> 0))));
1141 /* Functions to compute memory dependencies.
1143 Since we process the insns in execution order, we can build tables
1144 to keep track of what registers are fixed (and not aliased), what registers
1145 are varying in known ways, and what registers are varying in unknown
1148 If both memory references are volatile, then there must always be a
1149 dependence between the two references, since their order can not be
1150 changed. A volatile and non-volatile reference can be interchanged
1153 A MEM_IN_STRUCT reference at a non-QImode non-AND varying address can never
1154 conflict with a non-MEM_IN_STRUCT reference at a fixed address. We must
1155 allow QImode aliasing because the ANSI C standard allows character
1156 pointers to alias anything. We are assuming that characters are
1157 always QImode here. We also must allow AND addresses, because they may
1158 generate accesses outside the object being referenced. This is used to
1159 generate aligned addresses from unaligned addresses, for instance, the
1160 alpha storeqi_unaligned pattern. */
1162 /* Read dependence: X is read after read in MEM takes place. There can
1163 only be a dependence here if both reads are volatile. */
1166 read_dependence (mem
, x
)
1170 return MEM_VOLATILE_P (x
) && MEM_VOLATILE_P (mem
);
1173 /* Returns MEM1 if and only if MEM1 is a scalar at a fixed address and
1174 MEM2 is a reference to a structure at a varying address, or returns
1175 MEM2 if vice versa. Otherwise, returns NULL_RTX. If a non-NULL
1176 value is returned MEM1 and MEM2 can never alias. VARIES_P is used
1177 to decide whether or not an address may vary; it should return
1178 nozero whenever variation is possible. */
1181 fixed_scalar_and_varying_struct_p (mem1
, mem2
, varies_p
)
1184 int (*varies_p
) PROTO((rtx
));
1186 rtx mem1_addr
= XEXP (mem1
, 0);
1187 rtx mem2_addr
= XEXP (mem2
, 0);
1189 if (MEM_SCALAR_P (mem1
) && MEM_IN_STRUCT_P (mem2
)
1190 && !varies_p (mem1_addr
) && varies_p (mem2_addr
))
1191 /* MEM1 is a scalar at a fixed address; MEM2 is a struct at a
1195 if (MEM_IN_STRUCT_P (mem1
) && MEM_SCALAR_P (mem2
)
1196 && varies_p (mem1_addr
) && !varies_p (mem2_addr
))
1197 /* MEM2 is a scalar at a fixed address; MEM1 is a struct at a
1204 /* Returns nonzero if something about the mode or address format MEM1
1205 indicates that it might well alias *anything*. */
1208 aliases_everything_p (mem
)
1211 if (GET_MODE (mem
) == QImode
)
1212 /* ANSI C says that a `char*' can point to anything. */
1215 if (GET_CODE (XEXP (mem
, 0)) == AND
)
1216 /* If the address is an AND, its very hard to know at what it is
1217 actually pointing. */
1223 /* True dependence: X is read after store in MEM takes place. */
1226 true_dependence (mem
, mem_mode
, x
, varies
)
1228 enum machine_mode mem_mode
;
1230 int (*varies
) PROTO((rtx
));
1232 register rtx x_addr
, mem_addr
;
1234 if (MEM_VOLATILE_P (x
) && MEM_VOLATILE_P (mem
))
1237 if (DIFFERENT_ALIAS_SETS_P (x
, mem
))
1240 /* If X is an unchanging read, then it can't possibly conflict with any
1241 non-unchanging store. It may conflict with an unchanging write though,
1242 because there may be a single store to this address to initialize it.
1243 Just fall through to the code below to resolve the case where we have
1244 both an unchanging read and an unchanging write. This won't handle all
1245 cases optimally, but the possible performance loss should be
1247 if (RTX_UNCHANGING_P (x
) && ! RTX_UNCHANGING_P (mem
))
1250 if (mem_mode
== VOIDmode
)
1251 mem_mode
= GET_MODE (mem
);
1253 if (! base_alias_check (XEXP (x
, 0), XEXP (mem
, 0), GET_MODE (x
), mem_mode
))
1256 x_addr
= canon_rtx (XEXP (x
, 0));
1257 mem_addr
= canon_rtx (XEXP (mem
, 0));
1259 if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode
), mem_addr
,
1260 SIZE_FOR_MODE (x
), x_addr
, 0))
1263 if (aliases_everything_p (x
))
1266 /* We cannot use aliases_everyting_p to test MEM, since we must look
1267 at MEM_MODE, rather than GET_MODE (MEM). */
1268 if (mem_mode
== QImode
|| GET_CODE (mem_addr
) == AND
)
1271 /* In true_dependence we also allow BLKmode to alias anything. Why
1272 don't we do this in anti_dependence and output_dependence? */
1273 if (mem_mode
== BLKmode
|| GET_MODE (x
) == BLKmode
)
1276 return !fixed_scalar_and_varying_struct_p (mem
, x
, varies
);
1279 /* Returns non-zero if a write to X might alias a previous read from
1280 (or, if WRITEP is non-zero, a write to) MEM. */
1283 write_dependence_p (mem
, x
, writep
)
1288 rtx x_addr
, mem_addr
;
1291 if (MEM_VOLATILE_P (x
) && MEM_VOLATILE_P (mem
))
1294 /* If MEM is an unchanging read, then it can't possibly conflict with
1295 the store to X, because there is at most one store to MEM, and it must
1296 have occurred somewhere before MEM. */
1297 if (!writep
&& RTX_UNCHANGING_P (mem
))
1300 if (! base_alias_check (XEXP (x
, 0), XEXP (mem
, 0), GET_MODE (x
),
1305 mem
= canon_rtx (mem
);
1307 if (DIFFERENT_ALIAS_SETS_P (x
, mem
))
1310 x_addr
= XEXP (x
, 0);
1311 mem_addr
= XEXP (mem
, 0);
1313 if (!memrefs_conflict_p (SIZE_FOR_MODE (mem
), mem_addr
,
1314 SIZE_FOR_MODE (x
), x_addr
, 0))
1318 = fixed_scalar_and_varying_struct_p (mem
, x
, rtx_addr_varies_p
);
1320 return (!(fixed_scalar
== mem
&& !aliases_everything_p (x
))
1321 && !(fixed_scalar
== x
&& !aliases_everything_p (mem
)));
1324 /* Anti dependence: X is written after read in MEM takes place. */
1327 anti_dependence (mem
, x
)
1331 return write_dependence_p (mem
, x
, /*writep=*/0);
1334 /* Output dependence: X is written after store in MEM takes place. */
1337 output_dependence (mem
, x
)
1341 return write_dependence_p (mem
, x
, /*writep=*/1);
1344 /* Returns non-zero if X might refer to something which is not
1345 local to the function and is not constant. */
1348 nonlocal_reference_p (x
)
1352 register RTX_CODE code
;
1355 code
= GET_CODE (x
);
1357 if (GET_RTX_CLASS (code
) == 'i')
1359 /* Constant functions are constant. */
1360 if (code
== CALL_INSN
&& CONST_CALL_P (x
))
1363 code
= GET_CODE (x
);
1369 if (GET_CODE (SUBREG_REG (x
)) == REG
)
1371 /* Global registers are not local. */
1372 if (REGNO (SUBREG_REG (x
)) < FIRST_PSEUDO_REGISTER
1373 && global_regs
[REGNO (SUBREG_REG (x
)) + SUBREG_WORD (x
)])
1381 /* Global registers are not local. */
1382 if (regno
< FIRST_PSEUDO_REGISTER
&& global_regs
[regno
])
1396 /* Constants in the function's constants pool are constant. */
1397 if (CONSTANT_POOL_ADDRESS_P (x
))
1402 /* Recursion introduces no additional considerations. */
1403 if (GET_CODE (XEXP (x
, 0)) == MEM
1404 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == SYMBOL_REF
1405 && strcmp(XSTR (XEXP (XEXP (x
, 0), 0), 0),
1406 IDENTIFIER_POINTER (
1407 DECL_ASSEMBLER_NAME (current_function_decl
))) == 0)
1412 /* Be overly conservative and consider any volatile memory
1413 reference as not local. */
1414 if (MEM_VOLATILE_P (x
))
1416 base
= find_base_term (XEXP (x
, 0));
1419 /* Stack references are local. */
1420 if (GET_CODE (base
) == ADDRESS
&& GET_MODE (base
) == Pmode
)
1422 /* Constants in the function's constant pool are constant. */
1423 if (GET_CODE (base
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (base
))
1436 /* Recursively scan the operands of this expression. */
1439 register const char *fmt
= GET_RTX_FORMAT (code
);
1442 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1446 if (nonlocal_reference_p (XEXP (x
, i
)))
1452 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1453 if (nonlocal_reference_p (XVECEXP (x
, i
, j
)))
1462 /* Mark the function if it is constant. */
1465 mark_constant_function ()
1469 if (TREE_PUBLIC (current_function_decl
)
1470 || TREE_READONLY (current_function_decl
)
1471 || TREE_THIS_VOLATILE (current_function_decl
)
1472 || TYPE_MODE (TREE_TYPE (current_function_decl
)) == VOIDmode
)
1475 /* Determine if this is a constant function. */
1477 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
1478 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
1479 && nonlocal_reference_p (insn
))
1482 /* Mark the function. */
1484 TREE_READONLY (current_function_decl
) = 1;
1488 static HARD_REG_SET argument_registers
;
1495 #ifndef OUTGOING_REGNO
1496 #define OUTGOING_REGNO(N) N
1498 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1499 /* Check whether this register can hold an incoming pointer
1500 argument. FUNCTION_ARG_REGNO_P tests outgoing register
1501 numbers, so translate if necessary due to register windows. */
1502 if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i
))
1503 && HARD_REGNO_MODE_OK (i
, Pmode
))
1504 SET_HARD_REG_BIT (argument_registers
, i
);
1506 alias_sets
= splay_tree_new (splay_tree_compare_ints
, 0, 0);
1510 init_alias_analysis ()
1512 int maxreg
= max_reg_num ();
1515 register unsigned int ui
;
1518 reg_known_value_size
= maxreg
;
1521 = (rtx
*) oballoc ((maxreg
- FIRST_PSEUDO_REGISTER
) * sizeof (rtx
))
1522 - FIRST_PSEUDO_REGISTER
;
1524 oballoc (maxreg
- FIRST_PSEUDO_REGISTER
) - FIRST_PSEUDO_REGISTER
;
1525 bzero ((char *) (reg_known_value
+ FIRST_PSEUDO_REGISTER
),
1526 (maxreg
-FIRST_PSEUDO_REGISTER
) * sizeof (rtx
));
1527 bzero (reg_known_equiv_p
+ FIRST_PSEUDO_REGISTER
,
1528 (maxreg
- FIRST_PSEUDO_REGISTER
) * sizeof (char));
1530 /* Overallocate reg_base_value to allow some growth during loop
1531 optimization. Loop unrolling can create a large number of
1533 reg_base_value_size
= maxreg
* 2;
1534 reg_base_value
= (rtx
*)oballoc (reg_base_value_size
* sizeof (rtx
));
1535 new_reg_base_value
= (rtx
*)alloca (reg_base_value_size
* sizeof (rtx
));
1536 reg_seen
= (char *)alloca (reg_base_value_size
);
1537 bzero ((char *) reg_base_value
, reg_base_value_size
* sizeof (rtx
));
1538 if (! reload_completed
&& flag_unroll_loops
)
1540 alias_invariant
= (rtx
*)xrealloc (alias_invariant
,
1541 reg_base_value_size
* sizeof (rtx
));
1542 bzero ((char *)alias_invariant
, reg_base_value_size
* sizeof (rtx
));
1546 /* The basic idea is that each pass through this loop will use the
1547 "constant" information from the previous pass to propagate alias
1548 information through another level of assignments.
1550 This could get expensive if the assignment chains are long. Maybe
1551 we should throttle the number of iterations, possibly based on
1552 the optimization level or flag_expensive_optimizations.
1554 We could propagate more information in the first pass by making use
1555 of REG_N_SETS to determine immediately that the alias information
1556 for a pseudo is "constant".
1558 A program with an uninitialized variable can cause an infinite loop
1559 here. Instead of doing a full dataflow analysis to detect such problems
1560 we just cap the number of iterations for the loop.
1562 The state of the arrays for the set chain in question does not matter
1563 since the program has undefined behavior. */
1568 /* Assume nothing will change this iteration of the loop. */
1571 /* We want to assign the same IDs each iteration of this loop, so
1572 start counting from zero each iteration of the loop. */
1575 /* We're at the start of the funtion each iteration through the
1576 loop, so we're copying arguments. */
1577 copying_arguments
= 1;
1579 /* Wipe the potential alias information clean for this pass. */
1580 bzero ((char *) new_reg_base_value
, reg_base_value_size
* sizeof (rtx
));
1582 /* Wipe the reg_seen array clean. */
1583 bzero ((char *) reg_seen
, reg_base_value_size
);
1585 /* Mark all hard registers which may contain an address.
1586 The stack, frame and argument pointers may contain an address.
1587 An argument register which can hold a Pmode value may contain
1588 an address even if it is not in BASE_REGS.
1590 The address expression is VOIDmode for an argument and
1591 Pmode for other registers. */
1593 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1594 if (TEST_HARD_REG_BIT (argument_registers
, i
))
1595 new_reg_base_value
[i
] = gen_rtx_ADDRESS (VOIDmode
,
1596 gen_rtx_REG (Pmode
, i
));
1598 new_reg_base_value
[STACK_POINTER_REGNUM
]
1599 = gen_rtx_ADDRESS (Pmode
, stack_pointer_rtx
);
1600 new_reg_base_value
[ARG_POINTER_REGNUM
]
1601 = gen_rtx_ADDRESS (Pmode
, arg_pointer_rtx
);
1602 new_reg_base_value
[FRAME_POINTER_REGNUM
]
1603 = gen_rtx_ADDRESS (Pmode
, frame_pointer_rtx
);
1604 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1605 new_reg_base_value
[HARD_FRAME_POINTER_REGNUM
]
1606 = gen_rtx_ADDRESS (Pmode
, hard_frame_pointer_rtx
);
1608 if (struct_value_incoming_rtx
1609 && GET_CODE (struct_value_incoming_rtx
) == REG
)
1610 new_reg_base_value
[REGNO (struct_value_incoming_rtx
)]
1611 = gen_rtx_ADDRESS (Pmode
, struct_value_incoming_rtx
);
1613 if (static_chain_rtx
1614 && GET_CODE (static_chain_rtx
) == REG
)
1615 new_reg_base_value
[REGNO (static_chain_rtx
)]
1616 = gen_rtx_ADDRESS (Pmode
, static_chain_rtx
);
1618 /* Walk the insns adding values to the new_reg_base_value array. */
1619 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
1621 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
1622 if (prologue_epilogue_contains (insn
))
1625 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
1628 /* If this insn has a noalias note, process it, Otherwise,
1629 scan for sets. A simple set will have no side effects
1630 which could change the base value of any other register. */
1632 if (GET_CODE (PATTERN (insn
)) == SET
1633 && (find_reg_note (insn
, REG_NOALIAS
, NULL_RTX
)))
1634 record_set (SET_DEST (PATTERN (insn
)), NULL_RTX
);
1636 note_stores (PATTERN (insn
), record_set
);
1638 set
= single_set (insn
);
1641 && GET_CODE (SET_DEST (set
)) == REG
1642 && REGNO (SET_DEST (set
)) >= FIRST_PSEUDO_REGISTER
1643 && (((note
= find_reg_note (insn
, REG_EQUAL
, 0)) != 0
1644 && REG_N_SETS (REGNO (SET_DEST (set
))) == 1)
1645 || (note
= find_reg_note (insn
, REG_EQUIV
, NULL_RTX
)) != 0)
1646 && GET_CODE (XEXP (note
, 0)) != EXPR_LIST
1647 && ! reg_overlap_mentioned_p (SET_DEST (set
), XEXP (note
, 0)))
1649 int regno
= REGNO (SET_DEST (set
));
1650 reg_known_value
[regno
] = XEXP (note
, 0);
1651 reg_known_equiv_p
[regno
] = REG_NOTE_KIND (note
) == REG_EQUIV
;
1654 else if (GET_CODE (insn
) == NOTE
1655 && NOTE_LINE_NUMBER (insn
) == NOTE_INSN_FUNCTION_BEG
)
1656 copying_arguments
= 0;
1659 /* Now propagate values from new_reg_base_value to reg_base_value. */
1660 for (ui
= 0; ui
< reg_base_value_size
; ui
++)
1662 if (new_reg_base_value
[ui
]
1663 && new_reg_base_value
[ui
] != reg_base_value
[ui
]
1664 && ! rtx_equal_p (new_reg_base_value
[ui
], reg_base_value
[ui
]))
1666 reg_base_value
[ui
] = new_reg_base_value
[ui
];
1671 while (changed
&& ++pass
< MAX_ALIAS_LOOP_PASSES
);
1673 /* Fill in the remaining entries. */
1674 for (i
= FIRST_PSEUDO_REGISTER
; i
< maxreg
; i
++)
1675 if (reg_known_value
[i
] == 0)
1676 reg_known_value
[i
] = regno_reg_rtx
[i
];
1678 /* Simplify the reg_base_value array so that no register refers to
1679 another register, except to special registers indirectly through
1680 ADDRESS expressions.
1682 In theory this loop can take as long as O(registers^2), but unless
1683 there are very long dependency chains it will run in close to linear
1686 This loop may not be needed any longer now that the main loop does
1687 a better job at propagating alias information. */
1693 for (ui
= 0; ui
< reg_base_value_size
; ui
++)
1695 rtx base
= reg_base_value
[ui
];
1696 if (base
&& GET_CODE (base
) == REG
)
1698 unsigned int base_regno
= REGNO (base
);
1699 if (base_regno
== ui
) /* register set from itself */
1700 reg_base_value
[ui
] = 0;
1702 reg_base_value
[ui
] = reg_base_value
[base_regno
];
1707 while (changed
&& pass
< MAX_ALIAS_LOOP_PASSES
);
1709 new_reg_base_value
= 0;
1714 end_alias_analysis ()
1716 reg_known_value
= 0;
1718 reg_base_value_size
= 0;
1719 if (alias_invariant
)
1721 free ((char *)alias_invariant
);
1722 alias_invariant
= 0;