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"
35 #include "insn-flags.h"
37 /* The alias sets assigned to MEMs assist the back-end in determining
38 which MEMs can alias which other MEMs. In general, two MEMs in
39 different alias sets to not alias each other. There is one
40 exception, however. Consider something like:
42 struct S {int i; double d; };
44 a store to an `S' can alias something of either type `int' or type
45 `double'. (However, a store to an `int' cannot alias a `double'
46 and vice versa.) We indicate this via a tree structure that looks
54 (The arrows are directed and point downwards.) If, when comparing
55 two alias sets, we can hold one set fixed, and trace the other set
56 downwards, and at some point find the first set, the two MEMs can
57 alias one another. In this situation we say the alias set for
58 `struct S' is the `superset' and that those for `int' and `double'
61 Alias set zero is implicitly a superset of all other alias sets.
62 However, this is no actual entry for alias set zero. It is an
63 error to attempt to explicitly construct a subset of zero. */
65 typedef struct alias_set_entry
{
66 /* The alias set number, as stored in MEM_ALIAS_SET. */
69 /* The children of the alias set. These are not just the immediate
70 children, but, in fact, all children. So, if we have:
72 struct T { struct S s; float f; }
74 continuing our example above, the children here will be all of
75 `int', `double', `float', and `struct S'. */
79 static rtx canon_rtx
PROTO((rtx
));
80 static int rtx_equal_for_memref_p
PROTO((rtx
, rtx
));
81 static rtx find_symbolic_term
PROTO((rtx
));
82 static int memrefs_conflict_p
PROTO((int, rtx
, int, rtx
,
84 static void record_set
PROTO((rtx
, rtx
));
85 static rtx find_base_term
PROTO((rtx
));
86 static int base_alias_check
PROTO((rtx
, rtx
, enum machine_mode
,
88 static rtx find_base_value
PROTO((rtx
));
89 static int mems_in_disjoint_alias_sets_p
PROTO((rtx
, rtx
));
90 static int insert_subset_children
PROTO((splay_tree_node
,
92 static alias_set_entry get_alias_set_entry
PROTO((int));
93 static rtx fixed_scalar_and_varying_struct_p
PROTO((rtx
, rtx
, int (*)(rtx
)));
94 static int aliases_everything_p
PROTO((rtx
));
95 static int write_dependence_p
PROTO((rtx
, rtx
, int));
96 static int nonlocal_reference_p
PROTO((rtx
));
98 /* Set up all info needed to perform alias analysis on memory references. */
100 #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
102 /* Returns nonzero if MEM1 and MEM2 do not alias because they are in
103 different alias sets. We ignore alias sets in functions making use
104 of variable arguments because the va_arg macros on some systems are
106 #define DIFFERENT_ALIAS_SETS_P(MEM1, MEM2) \
107 mems_in_disjoint_alias_sets_p (MEM1, MEM2)
109 /* Cap the number of passes we make over the insns propagating alias
110 information through set chains.
112 10 is a completely arbitrary choice. */
113 #define MAX_ALIAS_LOOP_PASSES 10
115 /* reg_base_value[N] gives an address to which register N is related.
116 If all sets after the first add or subtract to the current value
117 or otherwise modify it so it does not point to a different top level
118 object, reg_base_value[N] is equal to the address part of the source
121 A base address can be an ADDRESS, SYMBOL_REF, or LABEL_REF. ADDRESS
122 expressions represent certain special values: function arguments and
123 the stack, frame, and argument pointers. The contents of an address
124 expression are not used (but they are descriptive for debugging);
125 only the address and mode matter. Pointer equality, not rtx_equal_p,
126 determines whether two ADDRESS expressions refer to the same base
127 address. The mode determines whether it is a function argument or
128 other special value. */
131 rtx
*new_reg_base_value
;
132 unsigned int reg_base_value_size
; /* size of reg_base_value array */
133 #define REG_BASE_VALUE(X) \
134 ((unsigned) REGNO (X) < reg_base_value_size ? reg_base_value[REGNO (X)] : 0)
136 /* Vector of known invariant relationships between registers. Set in
137 loop unrolling. Indexed by register number, if nonzero the value
138 is an expression describing this register in terms of another.
140 The length of this array is REG_BASE_VALUE_SIZE.
142 Because this array contains only pseudo registers it has no effect
144 static rtx
*alias_invariant
;
146 /* Vector indexed by N giving the initial (unchanging) value known
147 for pseudo-register N. */
148 rtx
*reg_known_value
;
150 /* Indicates number of valid entries in reg_known_value. */
151 static int reg_known_value_size
;
153 /* Vector recording for each reg_known_value whether it is due to a
154 REG_EQUIV note. Future passes (viz., reload) may replace the
155 pseudo with the equivalent expression and so we account for the
156 dependences that would be introduced if that happens. */
157 /* ??? This is a problem only on the Convex. The REG_EQUIV notes created in
158 assign_parms mention the arg pointer, and there are explicit insns in the
159 RTL that modify the arg pointer. Thus we must ensure that such insns don't
160 get scheduled across each other because that would invalidate the REG_EQUIV
161 notes. One could argue that the REG_EQUIV notes are wrong, but solving
162 the problem in the scheduler will likely give better code, so we do it
164 char *reg_known_equiv_p
;
166 /* True when scanning insns from the start of the rtl to the
167 NOTE_INSN_FUNCTION_BEG note. */
169 static int copying_arguments
;
171 /* The splay-tree used to store the various alias set entries. */
173 static splay_tree alias_sets
;
175 /* Returns a pointer to the alias set entry for ALIAS_SET, if there is
176 such an entry, or NULL otherwise. */
178 static alias_set_entry
179 get_alias_set_entry (alias_set
)
183 splay_tree_lookup (alias_sets
, (splay_tree_key
) alias_set
);
185 return sn
? ((alias_set_entry
) sn
->value
) : ((alias_set_entry
) 0);
188 /* Returns nonzero value if the alias sets for MEM1 and MEM2 are such
189 that the two MEMs cannot alias each other. */
192 mems_in_disjoint_alias_sets_p (mem1
, mem2
)
198 #ifdef ENABLE_CHECKING
199 /* Perform a basic sanity check. Namely, that there are no alias sets
200 if we're not using strict aliasing. This helps to catch bugs
201 whereby someone uses PUT_CODE, but doesn't clear MEM_ALIAS_SET, or
202 where a MEM is allocated in some way other than by the use of
203 gen_rtx_MEM, and the MEM_ALIAS_SET is not cleared. If we begin to
204 use alias sets to indicate that spilled registers cannot alias each
205 other, we might need to remove this check. */
206 if (!flag_strict_aliasing
&&
207 (MEM_ALIAS_SET (mem1
) || MEM_ALIAS_SET (mem2
)))
211 /* The code used in varargs macros are often not conforming ANSI C,
212 which can trick the compiler into making incorrect aliasing
213 assumptions in these functions. So, we don't use alias sets in
214 such a function. FIXME: This should be moved into the front-end;
215 it is a language-dependent notion, and there's no reason not to
216 still use these checks to handle globals. */
217 if (current_function_stdarg
|| current_function_varargs
)
220 if (!MEM_ALIAS_SET (mem1
) || !MEM_ALIAS_SET (mem2
))
221 /* We have no alias set information for one of the MEMs, so we
222 have to assume it can alias anything. */
225 if (MEM_ALIAS_SET (mem1
) == MEM_ALIAS_SET (mem2
))
226 /* The two alias sets are the same, so they may alias. */
229 /* Iterate through each of the children of the first alias set,
230 comparing it with the second alias set. */
231 ase
= get_alias_set_entry (MEM_ALIAS_SET (mem1
));
232 if (ase
&& splay_tree_lookup (ase
->children
,
233 (splay_tree_key
) MEM_ALIAS_SET (mem2
)))
236 /* Now do the same, but with the alias sets reversed. */
237 ase
= get_alias_set_entry (MEM_ALIAS_SET (mem2
));
238 if (ase
&& splay_tree_lookup (ase
->children
,
239 (splay_tree_key
) MEM_ALIAS_SET (mem1
)))
242 /* The two MEMs are in distinct alias sets, and neither one is the
243 child of the other. Therefore, they cannot alias. */
247 /* Insert the NODE into the splay tree given by DATA. Used by
248 record_alias_subset via splay_tree_foreach. */
251 insert_subset_children (node
, data
)
252 splay_tree_node node
;
255 splay_tree_insert ((splay_tree
) data
,
262 /* Indicate that things in SUBSET can alias things in SUPERSET, but
263 not vice versa. For example, in C, a store to an `int' can alias a
264 structure containing an `int', but not vice versa. Here, the
265 structure would be the SUPERSET and `int' the SUBSET. This
266 function should be called only once per SUPERSET/SUBSET pair. At
267 present any given alias set may only be a subset of one superset.
269 It is illegal for SUPERSET to be zero; everything is implicitly a
270 subset of alias set zero. */
273 record_alias_subset (superset
, subset
)
277 alias_set_entry superset_entry
;
278 alias_set_entry subset_entry
;
283 superset_entry
= get_alias_set_entry (superset
);
286 /* Create an entry for the SUPERSET, so that we have a place to
287 attach the SUBSET. */
289 (alias_set_entry
) xmalloc (sizeof (struct alias_set_entry
));
290 superset_entry
->alias_set
= superset
;
291 superset_entry
->children
292 = splay_tree_new (splay_tree_compare_ints
, 0, 0);
293 splay_tree_insert (alias_sets
,
294 (splay_tree_key
) superset
,
295 (splay_tree_value
) superset_entry
);
299 subset_entry
= get_alias_set_entry (subset
);
301 /* There is an entry for the subset. Enter all of its children
302 (if they are not already present) as children of the SUPERSET. */
303 splay_tree_foreach (subset_entry
->children
,
304 insert_subset_children
,
305 superset_entry
->children
);
307 /* Enter the SUBSET itself as a child of the SUPERSET. */
308 splay_tree_insert (superset_entry
->children
,
309 (splay_tree_key
) subset
,
313 /* Inside SRC, the source of a SET, find a base address. */
316 find_base_value (src
)
319 switch (GET_CODE (src
))
326 /* At the start of a function argument registers have known base
327 values which may be lost later. Returning an ADDRESS
328 expression here allows optimization based on argument values
329 even when the argument registers are used for other purposes. */
330 if (REGNO (src
) < FIRST_PSEUDO_REGISTER
&& copying_arguments
)
331 return new_reg_base_value
[REGNO (src
)];
333 /* If a pseudo has a known base value, return it. Do not do this
334 for hard regs since it can result in a circular dependency
335 chain for registers which have values at function entry.
337 The test above is not sufficient because the scheduler may move
338 a copy out of an arg reg past the NOTE_INSN_FUNCTION_BEGIN. */
339 if (REGNO (src
) >= FIRST_PSEUDO_REGISTER
340 && (unsigned) REGNO (src
) < reg_base_value_size
341 && reg_base_value
[REGNO (src
)])
342 return reg_base_value
[REGNO (src
)];
347 /* Check for an argument passed in memory. Only record in the
348 copying-arguments block; it is too hard to track changes
350 if (copying_arguments
351 && (XEXP (src
, 0) == arg_pointer_rtx
352 || (GET_CODE (XEXP (src
, 0)) == PLUS
353 && XEXP (XEXP (src
, 0), 0) == arg_pointer_rtx
)))
354 return gen_rtx_ADDRESS (VOIDmode
, src
);
359 if (GET_CODE (src
) != PLUS
&& GET_CODE (src
) != MINUS
)
366 rtx temp
, src_0
= XEXP (src
, 0), src_1
= XEXP (src
, 1);
368 /* If either operand is a REG, then see if we already have
369 a known value for it. */
370 if (GET_CODE (src_0
) == REG
)
372 temp
= find_base_value (src_0
);
377 if (GET_CODE (src_1
) == REG
)
379 temp
= find_base_value (src_1
);
384 /* Guess which operand is the base address.
386 If either operand is a symbol, then it is the base. If
387 either operand is a CONST_INT, then the other is the base. */
389 if (GET_CODE (src_1
) == CONST_INT
390 || GET_CODE (src_0
) == SYMBOL_REF
391 || GET_CODE (src_0
) == LABEL_REF
392 || GET_CODE (src_0
) == CONST
)
393 return find_base_value (src_0
);
395 if (GET_CODE (src_0
) == CONST_INT
396 || GET_CODE (src_1
) == SYMBOL_REF
397 || GET_CODE (src_1
) == LABEL_REF
398 || GET_CODE (src_1
) == CONST
)
399 return find_base_value (src_1
);
401 /* This might not be necessary anymore.
403 If either operand is a REG that is a known pointer, then it
405 if (GET_CODE (src_0
) == REG
&& REGNO_POINTER_FLAG (REGNO (src_0
)))
406 return find_base_value (src_0
);
408 if (GET_CODE (src_1
) == REG
&& REGNO_POINTER_FLAG (REGNO (src_1
)))
409 return find_base_value (src_1
);
415 /* The standard form is (lo_sum reg sym) so look only at the
417 return find_base_value (XEXP (src
, 1));
420 /* If the second operand is constant set the base
421 address to the first operand. */
422 if (GET_CODE (XEXP (src
, 1)) == CONST_INT
&& INTVAL (XEXP (src
, 1)) != 0)
423 return find_base_value (XEXP (src
, 0));
427 case SIGN_EXTEND
: /* used for NT/Alpha pointers */
429 return find_base_value (XEXP (src
, 0));
438 /* Called from init_alias_analysis indirectly through note_stores. */
440 /* while scanning insns to find base values, reg_seen[N] is nonzero if
441 register N has been set in this function. */
442 static char *reg_seen
;
444 /* Addresses which are known not to alias anything else are identified
445 by a unique integer. */
446 static int unique_id
;
449 record_set (dest
, set
)
455 if (GET_CODE (dest
) != REG
)
458 regno
= REGNO (dest
);
462 /* A CLOBBER wipes out any old value but does not prevent a previously
463 unset register from acquiring a base address (i.e. reg_seen is not
465 if (GET_CODE (set
) == CLOBBER
)
467 new_reg_base_value
[regno
] = 0;
476 new_reg_base_value
[regno
] = 0;
480 new_reg_base_value
[regno
] = gen_rtx_ADDRESS (Pmode
,
481 GEN_INT (unique_id
++));
485 /* This is not the first set. If the new value is not related to the
486 old value, forget the base value. Note that the following code is
488 extern int x, y; int *p = &x; p += (&y-&x);
489 ANSI C does not allow computing the difference of addresses
490 of distinct top level objects. */
491 if (new_reg_base_value
[regno
])
492 switch (GET_CODE (src
))
497 if (XEXP (src
, 0) != dest
&& XEXP (src
, 1) != dest
)
498 new_reg_base_value
[regno
] = 0;
501 if (XEXP (src
, 0) != dest
|| GET_CODE (XEXP (src
, 1)) != CONST_INT
)
502 new_reg_base_value
[regno
] = 0;
505 new_reg_base_value
[regno
] = 0;
508 /* If this is the first set of a register, record the value. */
509 else if ((regno
>= FIRST_PSEUDO_REGISTER
|| ! fixed_regs
[regno
])
510 && ! reg_seen
[regno
] && new_reg_base_value
[regno
] == 0)
511 new_reg_base_value
[regno
] = find_base_value (src
);
516 /* Called from loop optimization when a new pseudo-register is created. */
518 record_base_value (regno
, val
, invariant
)
523 if ((unsigned) regno
>= reg_base_value_size
)
526 /* If INVARIANT is true then this value also describes an invariant
527 relationship which can be used to deduce that two registers with
528 unknown values are different. */
529 if (invariant
&& alias_invariant
)
530 alias_invariant
[regno
] = val
;
532 if (GET_CODE (val
) == REG
)
534 if ((unsigned) REGNO (val
) < reg_base_value_size
)
536 reg_base_value
[regno
] = reg_base_value
[REGNO (val
)];
540 reg_base_value
[regno
] = find_base_value (val
);
547 /* Recursively look for equivalences. */
548 if (GET_CODE (x
) == REG
&& REGNO (x
) >= FIRST_PSEUDO_REGISTER
549 && REGNO (x
) < reg_known_value_size
)
550 return reg_known_value
[REGNO (x
)] == x
551 ? x
: canon_rtx (reg_known_value
[REGNO (x
)]);
552 else if (GET_CODE (x
) == PLUS
)
554 rtx x0
= canon_rtx (XEXP (x
, 0));
555 rtx x1
= canon_rtx (XEXP (x
, 1));
557 if (x0
!= XEXP (x
, 0) || x1
!= XEXP (x
, 1))
559 /* We can tolerate LO_SUMs being offset here; these
560 rtl are used for nothing other than comparisons. */
561 if (GET_CODE (x0
) == CONST_INT
)
562 return plus_constant_for_output (x1
, INTVAL (x0
));
563 else if (GET_CODE (x1
) == CONST_INT
)
564 return plus_constant_for_output (x0
, INTVAL (x1
));
565 return gen_rtx_PLUS (GET_MODE (x
), x0
, x1
);
568 /* This gives us much better alias analysis when called from
569 the loop optimizer. Note we want to leave the original
570 MEM alone, but need to return the canonicalized MEM with
571 all the flags with their original values. */
572 else if (GET_CODE (x
) == MEM
)
574 rtx addr
= canon_rtx (XEXP (x
, 0));
575 if (addr
!= XEXP (x
, 0))
577 rtx
new = gen_rtx_MEM (GET_MODE (x
), addr
);
578 RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x
);
579 MEM_COPY_ATTRIBUTES (new, x
);
580 MEM_ALIAS_SET (new) = MEM_ALIAS_SET (x
);
587 /* Return 1 if X and Y are identical-looking rtx's.
589 We use the data in reg_known_value above to see if two registers with
590 different numbers are, in fact, equivalent. */
593 rtx_equal_for_memref_p (x
, y
)
598 register enum rtx_code code
;
599 register const char *fmt
;
601 if (x
== 0 && y
== 0)
603 if (x
== 0 || y
== 0)
612 /* Rtx's of different codes cannot be equal. */
613 if (code
!= GET_CODE (y
))
616 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
617 (REG:SI x) and (REG:HI x) are NOT equivalent. */
619 if (GET_MODE (x
) != GET_MODE (y
))
622 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
625 return REGNO (x
) == REGNO (y
);
626 if (code
== LABEL_REF
)
627 return XEXP (x
, 0) == XEXP (y
, 0);
628 if (code
== SYMBOL_REF
)
629 return XSTR (x
, 0) == XSTR (y
, 0);
630 if (code
== CONST_INT
)
631 return INTVAL (x
) == INTVAL (y
);
632 /* There's no need to compare the contents of CONST_DOUBLEs because
634 if (code
== CONST_DOUBLE
)
636 if (code
== ADDRESSOF
)
637 return REGNO (XEXP (x
, 0)) == REGNO (XEXP (y
, 0)) && XINT (x
, 1) == XINT (y
, 1);
639 /* For commutative operations, the RTX match if the operand match in any
640 order. Also handle the simple binary and unary cases without a loop. */
641 if (code
== EQ
|| code
== NE
|| GET_RTX_CLASS (code
) == 'c')
642 return ((rtx_equal_for_memref_p (XEXP (x
, 0), XEXP (y
, 0))
643 && rtx_equal_for_memref_p (XEXP (x
, 1), XEXP (y
, 1)))
644 || (rtx_equal_for_memref_p (XEXP (x
, 0), XEXP (y
, 1))
645 && rtx_equal_for_memref_p (XEXP (x
, 1), XEXP (y
, 0))));
646 else if (GET_RTX_CLASS (code
) == '<' || GET_RTX_CLASS (code
) == '2')
647 return (rtx_equal_for_memref_p (XEXP (x
, 0), XEXP (y
, 0))
648 && rtx_equal_for_memref_p (XEXP (x
, 1), XEXP (y
, 1)));
649 else if (GET_RTX_CLASS (code
) == '1')
650 return rtx_equal_for_memref_p (XEXP (x
, 0), XEXP (y
, 0));
652 /* Compare the elements. If any pair of corresponding elements
653 fail to match, return 0 for the whole things.
655 Limit cases to types which actually appear in addresses. */
657 fmt
= GET_RTX_FORMAT (code
);
658 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
663 if (XINT (x
, i
) != XINT (y
, i
))
668 /* Two vectors must have the same length. */
669 if (XVECLEN (x
, i
) != XVECLEN (y
, i
))
672 /* And the corresponding elements must match. */
673 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
674 if (rtx_equal_for_memref_p (XVECEXP (x
, i
, j
), XVECEXP (y
, i
, j
)) == 0)
679 if (rtx_equal_for_memref_p (XEXP (x
, i
), XEXP (y
, i
)) == 0)
683 /* This can happen for an asm which clobbers memory. */
687 /* It is believed that rtx's at this level will never
688 contain anything but integers and other rtx's,
689 except for within LABEL_REFs and SYMBOL_REFs. */
697 /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
698 X and return it, or return 0 if none found. */
701 find_symbolic_term (x
)
705 register enum rtx_code code
;
706 register const char *fmt
;
709 if (code
== SYMBOL_REF
|| code
== LABEL_REF
)
711 if (GET_RTX_CLASS (code
) == 'o')
714 fmt
= GET_RTX_FORMAT (code
);
715 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
721 t
= find_symbolic_term (XEXP (x
, i
));
725 else if (fmt
[i
] == 'E')
735 switch (GET_CODE (x
))
738 return REG_BASE_VALUE (x
);
741 case SIGN_EXTEND
: /* Used for Alpha/NT pointers */
747 return find_base_term (XEXP (x
, 0));
751 if (GET_CODE (x
) != PLUS
&& GET_CODE (x
) != MINUS
)
758 rtx tmp1
= XEXP (x
, 0);
759 rtx tmp2
= XEXP (x
, 1);
761 /* This is a litle bit tricky since we have to determine which of
762 the two operands represents the real base address. Otherwise this
763 routine may return the index register instead of the base register.
765 That may cause us to believe no aliasing was possible, when in
766 fact aliasing is possible.
768 We use a few simple tests to guess the base register. Additional
769 tests can certainly be added. For example, if one of the operands
770 is a shift or multiply, then it must be the index register and the
771 other operand is the base register. */
773 /* If either operand is known to be a pointer, then use it
774 to determine the base term. */
775 if (REG_P (tmp1
) && REGNO_POINTER_FLAG (REGNO (tmp1
)))
776 return find_base_term (tmp1
);
778 if (REG_P (tmp2
) && REGNO_POINTER_FLAG (REGNO (tmp2
)))
779 return find_base_term (tmp2
);
781 /* Neither operand was known to be a pointer. Go ahead and find the
782 base term for both operands. */
783 tmp1
= find_base_term (tmp1
);
784 tmp2
= find_base_term (tmp2
);
786 /* If either base term is named object or a special address
787 (like an argument or stack reference), then use it for the
790 && (GET_CODE (tmp1
) == SYMBOL_REF
791 || GET_CODE (tmp1
) == LABEL_REF
792 || (GET_CODE (tmp1
) == ADDRESS
793 && GET_MODE (tmp1
) != VOIDmode
)))
797 && (GET_CODE (tmp2
) == SYMBOL_REF
798 || GET_CODE (tmp2
) == LABEL_REF
799 || (GET_CODE (tmp2
) == ADDRESS
800 && GET_MODE (tmp2
) != VOIDmode
)))
803 /* We could not determine which of the two operands was the
804 base register and which was the index. So we can determine
805 nothing from the base alias check. */
810 if (GET_CODE (XEXP (x
, 0)) == REG
&& GET_CODE (XEXP (x
, 1)) == CONST_INT
)
811 return REG_BASE_VALUE (XEXP (x
, 0));
823 /* Return 0 if the addresses X and Y are known to point to different
824 objects, 1 if they might be pointers to the same object. */
827 base_alias_check (x
, y
, x_mode
, y_mode
)
829 enum machine_mode x_mode
, y_mode
;
831 rtx x_base
= find_base_term (x
);
832 rtx y_base
= find_base_term (y
);
834 /* If the address itself has no known base see if a known equivalent
835 value has one. If either address still has no known base, nothing
836 is known about aliasing. */
840 if (! flag_expensive_optimizations
|| (x_c
= canon_rtx (x
)) == x
)
842 x_base
= find_base_term (x_c
);
850 if (! flag_expensive_optimizations
|| (y_c
= canon_rtx (y
)) == y
)
852 y_base
= find_base_term (y_c
);
857 /* If the base addresses are equal nothing is known about aliasing. */
858 if (rtx_equal_p (x_base
, y_base
))
861 /* The base addresses of the read and write are different expressions.
862 If they are both symbols and they are not accessed via AND, there is
863 no conflict. We can bring knowledge of object alignment into play
864 here. For example, on alpha, "char a, b;" can alias one another,
865 though "char a; long b;" cannot. */
866 if (GET_CODE (x_base
) != ADDRESS
&& GET_CODE (y_base
) != ADDRESS
)
868 if (GET_CODE (x
) == AND
&& GET_CODE (y
) == AND
)
870 if (GET_CODE (x
) == AND
871 && (GET_CODE (XEXP (x
, 1)) != CONST_INT
872 || GET_MODE_UNIT_SIZE (y_mode
) < -INTVAL (XEXP (x
, 1))))
874 if (GET_CODE (y
) == AND
875 && (GET_CODE (XEXP (y
, 1)) != CONST_INT
876 || GET_MODE_UNIT_SIZE (x_mode
) < -INTVAL (XEXP (y
, 1))))
878 /* Differing symbols never alias. */
882 /* If one address is a stack reference there can be no alias:
883 stack references using different base registers do not alias,
884 a stack reference can not alias a parameter, and a stack reference
885 can not alias a global. */
886 if ((GET_CODE (x_base
) == ADDRESS
&& GET_MODE (x_base
) == Pmode
)
887 || (GET_CODE (y_base
) == ADDRESS
&& GET_MODE (y_base
) == Pmode
))
890 if (! flag_argument_noalias
)
893 if (flag_argument_noalias
> 1)
896 /* Weak noalias assertion (arguments are distinct, but may match globals). */
897 return ! (GET_MODE (x_base
) == VOIDmode
&& GET_MODE (y_base
) == VOIDmode
);
900 /* Return the address of the (N_REFS + 1)th memory reference to ADDR
901 where SIZE is the size in bytes of the memory reference. If ADDR
902 is not modified by the memory reference then ADDR is returned. */
905 addr_side_effect_eval (addr
, size
, n_refs
)
912 switch (GET_CODE (addr
))
915 offset
= (n_refs
+ 1) * size
;
918 offset
= -(n_refs
+ 1) * size
;
921 offset
= n_refs
* size
;
924 offset
= -n_refs
* size
;
932 addr
= gen_rtx_PLUS (GET_MODE (addr
), XEXP (addr
, 0), GEN_INT (offset
));
934 addr
= XEXP (addr
, 0);
939 /* Return nonzero if X and Y (memory addresses) could reference the
940 same location in memory. C is an offset accumulator. When
941 C is nonzero, we are testing aliases between X and Y + C.
942 XSIZE is the size in bytes of the X reference,
943 similarly YSIZE is the size in bytes for Y.
945 If XSIZE or YSIZE is zero, we do not know the amount of memory being
946 referenced (the reference was BLKmode), so make the most pessimistic
949 If XSIZE or YSIZE is negative, we may access memory outside the object
950 being referenced as a side effect. This can happen when using AND to
951 align memory references, as is done on the Alpha.
953 Nice to notice that varying addresses cannot conflict with fp if no
954 local variables had their addresses taken, but that's too hard now. */
958 memrefs_conflict_p (xsize
, x
, ysize
, y
, c
)
963 if (GET_CODE (x
) == HIGH
)
965 else if (GET_CODE (x
) == LO_SUM
)
968 x
= canon_rtx (addr_side_effect_eval (x
, xsize
, 0));
969 if (GET_CODE (y
) == HIGH
)
971 else if (GET_CODE (y
) == LO_SUM
)
974 y
= canon_rtx (addr_side_effect_eval (y
, ysize
, 0));
976 if (rtx_equal_for_memref_p (x
, y
))
978 if (xsize
<= 0 || ysize
<= 0)
980 if (c
>= 0 && xsize
> c
)
982 if (c
< 0 && ysize
+c
> 0)
987 /* This code used to check for conflicts involving stack references and
988 globals but the base address alias code now handles these cases. */
990 if (GET_CODE (x
) == PLUS
)
992 /* The fact that X is canonicalized means that this
993 PLUS rtx is canonicalized. */
994 rtx x0
= XEXP (x
, 0);
995 rtx x1
= XEXP (x
, 1);
997 if (GET_CODE (y
) == PLUS
)
999 /* The fact that Y is canonicalized means that this
1000 PLUS rtx is canonicalized. */
1001 rtx y0
= XEXP (y
, 0);
1002 rtx y1
= XEXP (y
, 1);
1004 if (rtx_equal_for_memref_p (x1
, y1
))
1005 return memrefs_conflict_p (xsize
, x0
, ysize
, y0
, c
);
1006 if (rtx_equal_for_memref_p (x0
, y0
))
1007 return memrefs_conflict_p (xsize
, x1
, ysize
, y1
, c
);
1008 if (GET_CODE (x1
) == CONST_INT
)
1010 if (GET_CODE (y1
) == CONST_INT
)
1011 return memrefs_conflict_p (xsize
, x0
, ysize
, y0
,
1012 c
- INTVAL (x1
) + INTVAL (y1
));
1014 return memrefs_conflict_p (xsize
, x0
, ysize
, y
,
1017 else if (GET_CODE (y1
) == CONST_INT
)
1018 return memrefs_conflict_p (xsize
, x
, ysize
, y0
, c
+ INTVAL (y1
));
1022 else if (GET_CODE (x1
) == CONST_INT
)
1023 return memrefs_conflict_p (xsize
, x0
, ysize
, y
, c
- INTVAL (x1
));
1025 else if (GET_CODE (y
) == PLUS
)
1027 /* The fact that Y is canonicalized means that this
1028 PLUS rtx is canonicalized. */
1029 rtx y0
= XEXP (y
, 0);
1030 rtx y1
= XEXP (y
, 1);
1032 if (GET_CODE (y1
) == CONST_INT
)
1033 return memrefs_conflict_p (xsize
, x
, ysize
, y0
, c
+ INTVAL (y1
));
1038 if (GET_CODE (x
) == GET_CODE (y
))
1039 switch (GET_CODE (x
))
1043 /* Handle cases where we expect the second operands to be the
1044 same, and check only whether the first operand would conflict
1047 rtx x1
= canon_rtx (XEXP (x
, 1));
1048 rtx y1
= canon_rtx (XEXP (y
, 1));
1049 if (! rtx_equal_for_memref_p (x1
, y1
))
1051 x0
= canon_rtx (XEXP (x
, 0));
1052 y0
= canon_rtx (XEXP (y
, 0));
1053 if (rtx_equal_for_memref_p (x0
, y0
))
1054 return (xsize
== 0 || ysize
== 0
1055 || (c
>= 0 && xsize
> c
) || (c
< 0 && ysize
+c
> 0));
1057 /* Can't properly adjust our sizes. */
1058 if (GET_CODE (x1
) != CONST_INT
)
1060 xsize
/= INTVAL (x1
);
1061 ysize
/= INTVAL (x1
);
1063 return memrefs_conflict_p (xsize
, x0
, ysize
, y0
, c
);
1067 /* Are these registers known not to be equal? */
1068 if (alias_invariant
)
1070 unsigned int r_x
= REGNO (x
), r_y
= REGNO (y
);
1071 rtx i_x
, i_y
; /* invariant relationships of X and Y */
1073 i_x
= r_x
>= reg_base_value_size
? 0 : alias_invariant
[r_x
];
1074 i_y
= r_y
>= reg_base_value_size
? 0 : alias_invariant
[r_y
];
1076 if (i_x
== 0 && i_y
== 0)
1079 if (! memrefs_conflict_p (xsize
, i_x
? i_x
: x
,
1080 ysize
, i_y
? i_y
: y
, c
))
1089 /* Treat an access through an AND (e.g. a subword access on an Alpha)
1090 as an access with indeterminate size. Assume that references
1091 besides AND are aligned, so if the size of the other reference is
1092 at least as large as the alignment, assume no other overlap. */
1093 if (GET_CODE (x
) == AND
&& GET_CODE (XEXP (x
, 1)) == CONST_INT
)
1095 if (GET_CODE (y
) == AND
|| ysize
< -INTVAL (XEXP (x
, 1)))
1097 return memrefs_conflict_p (xsize
, XEXP (x
, 0), ysize
, y
, c
);
1099 if (GET_CODE (y
) == AND
&& GET_CODE (XEXP (y
, 1)) == CONST_INT
)
1101 /* ??? If we are indexing far enough into the array/structure, we
1102 may yet be able to determine that we can not overlap. But we
1103 also need to that we are far enough from the end not to overlap
1104 a following reference, so we do nothing with that for now. */
1105 if (GET_CODE (x
) == AND
|| xsize
< -INTVAL (XEXP (y
, 1)))
1107 return memrefs_conflict_p (xsize
, x
, ysize
, XEXP (y
, 0), c
);
1112 if (GET_CODE (x
) == CONST_INT
&& GET_CODE (y
) == CONST_INT
)
1114 c
+= (INTVAL (y
) - INTVAL (x
));
1115 return (xsize
<= 0 || ysize
<= 0
1116 || (c
>= 0 && xsize
> c
) || (c
< 0 && ysize
+c
> 0));
1119 if (GET_CODE (x
) == CONST
)
1121 if (GET_CODE (y
) == CONST
)
1122 return memrefs_conflict_p (xsize
, canon_rtx (XEXP (x
, 0)),
1123 ysize
, canon_rtx (XEXP (y
, 0)), c
);
1125 return memrefs_conflict_p (xsize
, canon_rtx (XEXP (x
, 0)),
1128 if (GET_CODE (y
) == CONST
)
1129 return memrefs_conflict_p (xsize
, x
, ysize
,
1130 canon_rtx (XEXP (y
, 0)), c
);
1133 return (xsize
< 0 || ysize
< 0
1134 || (rtx_equal_for_memref_p (x
, y
)
1135 && (xsize
== 0 || ysize
== 0
1136 || (c
>= 0 && xsize
> c
) || (c
< 0 && ysize
+c
> 0))));
1143 /* Functions to compute memory dependencies.
1145 Since we process the insns in execution order, we can build tables
1146 to keep track of what registers are fixed (and not aliased), what registers
1147 are varying in known ways, and what registers are varying in unknown
1150 If both memory references are volatile, then there must always be a
1151 dependence between the two references, since their order can not be
1152 changed. A volatile and non-volatile reference can be interchanged
1155 A MEM_IN_STRUCT reference at a non-QImode non-AND varying address can never
1156 conflict with a non-MEM_IN_STRUCT reference at a fixed address. We must
1157 allow QImode aliasing because the ANSI C standard allows character
1158 pointers to alias anything. We are assuming that characters are
1159 always QImode here. We also must allow AND addresses, because they may
1160 generate accesses outside the object being referenced. This is used to
1161 generate aligned addresses from unaligned addresses, for instance, the
1162 alpha storeqi_unaligned pattern. */
1164 /* Read dependence: X is read after read in MEM takes place. There can
1165 only be a dependence here if both reads are volatile. */
1168 read_dependence (mem
, x
)
1172 return MEM_VOLATILE_P (x
) && MEM_VOLATILE_P (mem
);
1175 /* Returns MEM1 if and only if MEM1 is a scalar at a fixed address and
1176 MEM2 is a reference to a structure at a varying address, or returns
1177 MEM2 if vice versa. Otherwise, returns NULL_RTX. If a non-NULL
1178 value is returned MEM1 and MEM2 can never alias. VARIES_P is used
1179 to decide whether or not an address may vary; it should return
1180 nozero whenever variation is possible. */
1183 fixed_scalar_and_varying_struct_p (mem1
, mem2
, varies_p
)
1186 int (*varies_p
) PROTO((rtx
));
1188 rtx mem1_addr
= XEXP (mem1
, 0);
1189 rtx mem2_addr
= XEXP (mem2
, 0);
1191 if (MEM_SCALAR_P (mem1
) && MEM_IN_STRUCT_P (mem2
)
1192 && !varies_p (mem1_addr
) && varies_p (mem2_addr
))
1193 /* MEM1 is a scalar at a fixed address; MEM2 is a struct at a
1197 if (MEM_IN_STRUCT_P (mem1
) && MEM_SCALAR_P (mem2
)
1198 && varies_p (mem1_addr
) && !varies_p (mem2_addr
))
1199 /* MEM2 is a scalar at a fixed address; MEM1 is a struct at a
1206 /* Returns nonzero if something about the mode or address format MEM1
1207 indicates that it might well alias *anything*. */
1210 aliases_everything_p (mem
)
1213 if (GET_MODE (mem
) == QImode
)
1214 /* ANSI C says that a `char*' can point to anything. */
1217 if (GET_CODE (XEXP (mem
, 0)) == AND
)
1218 /* If the address is an AND, its very hard to know at what it is
1219 actually pointing. */
1225 /* True dependence: X is read after store in MEM takes place. */
1228 true_dependence (mem
, mem_mode
, x
, varies
)
1230 enum machine_mode mem_mode
;
1232 int (*varies
) PROTO((rtx
));
1234 register rtx x_addr
, mem_addr
;
1236 if (MEM_VOLATILE_P (x
) && MEM_VOLATILE_P (mem
))
1239 if (DIFFERENT_ALIAS_SETS_P (x
, mem
))
1242 /* If X is an unchanging read, then it can't possibly conflict with any
1243 non-unchanging store. It may conflict with an unchanging write though,
1244 because there may be a single store to this address to initialize it.
1245 Just fall through to the code below to resolve the case where we have
1246 both an unchanging read and an unchanging write. This won't handle all
1247 cases optimally, but the possible performance loss should be
1249 if (RTX_UNCHANGING_P (x
) && ! RTX_UNCHANGING_P (mem
))
1252 if (mem_mode
== VOIDmode
)
1253 mem_mode
= GET_MODE (mem
);
1255 if (! base_alias_check (XEXP (x
, 0), XEXP (mem
, 0), GET_MODE (x
), mem_mode
))
1258 x_addr
= canon_rtx (XEXP (x
, 0));
1259 mem_addr
= canon_rtx (XEXP (mem
, 0));
1261 if (! memrefs_conflict_p (GET_MODE_SIZE (mem_mode
), mem_addr
,
1262 SIZE_FOR_MODE (x
), x_addr
, 0))
1265 if (aliases_everything_p (x
))
1268 /* We cannot use aliases_everyting_p to test MEM, since we must look
1269 at MEM_MODE, rather than GET_MODE (MEM). */
1270 if (mem_mode
== QImode
|| GET_CODE (mem_addr
) == AND
)
1273 /* In true_dependence we also allow BLKmode to alias anything. Why
1274 don't we do this in anti_dependence and output_dependence? */
1275 if (mem_mode
== BLKmode
|| GET_MODE (x
) == BLKmode
)
1278 return !fixed_scalar_and_varying_struct_p (mem
, x
, varies
);
1281 /* Returns non-zero if a write to X might alias a previous read from
1282 (or, if WRITEP is non-zero, a write to) MEM. */
1285 write_dependence_p (mem
, x
, writep
)
1290 rtx x_addr
, mem_addr
;
1293 if (MEM_VOLATILE_P (x
) && MEM_VOLATILE_P (mem
))
1296 /* If MEM is an unchanging read, then it can't possibly conflict with
1297 the store to X, because there is at most one store to MEM, and it must
1298 have occurred somewhere before MEM. */
1299 if (!writep
&& RTX_UNCHANGING_P (mem
))
1302 if (! base_alias_check (XEXP (x
, 0), XEXP (mem
, 0), GET_MODE (x
),
1307 mem
= canon_rtx (mem
);
1309 if (DIFFERENT_ALIAS_SETS_P (x
, mem
))
1312 x_addr
= XEXP (x
, 0);
1313 mem_addr
= XEXP (mem
, 0);
1315 if (!memrefs_conflict_p (SIZE_FOR_MODE (mem
), mem_addr
,
1316 SIZE_FOR_MODE (x
), x_addr
, 0))
1320 = fixed_scalar_and_varying_struct_p (mem
, x
, rtx_addr_varies_p
);
1322 return (!(fixed_scalar
== mem
&& !aliases_everything_p (x
))
1323 && !(fixed_scalar
== x
&& !aliases_everything_p (mem
)));
1326 /* Anti dependence: X is written after read in MEM takes place. */
1329 anti_dependence (mem
, x
)
1333 return write_dependence_p (mem
, x
, /*writep=*/0);
1336 /* Output dependence: X is written after store in MEM takes place. */
1339 output_dependence (mem
, x
)
1343 return write_dependence_p (mem
, x
, /*writep=*/1);
1346 /* Returns non-zero if X might refer to something which is not
1347 local to the function and is not constant. */
1350 nonlocal_reference_p (x
)
1354 register RTX_CODE code
;
1357 code
= GET_CODE (x
);
1359 if (GET_RTX_CLASS (code
) == 'i')
1361 /* Constant functions are constant. */
1362 if (code
== CALL_INSN
&& CONST_CALL_P (x
))
1365 code
= GET_CODE (x
);
1371 if (GET_CODE (SUBREG_REG (x
)) == REG
)
1373 /* Global registers are not local. */
1374 if (REGNO (SUBREG_REG (x
)) < FIRST_PSEUDO_REGISTER
1375 && global_regs
[REGNO (SUBREG_REG (x
)) + SUBREG_WORD (x
)])
1383 /* Global registers are not local. */
1384 if (regno
< FIRST_PSEUDO_REGISTER
&& global_regs
[regno
])
1398 /* Constants in the function's constants pool are constant. */
1399 if (CONSTANT_POOL_ADDRESS_P (x
))
1404 /* Recursion introduces no additional considerations. */
1405 if (GET_CODE (XEXP (x
, 0)) == MEM
1406 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == SYMBOL_REF
1407 && strcmp(XSTR (XEXP (XEXP (x
, 0), 0), 0),
1408 IDENTIFIER_POINTER (
1409 DECL_ASSEMBLER_NAME (current_function_decl
))) == 0)
1414 /* Be overly conservative and consider any volatile memory
1415 reference as not local. */
1416 if (MEM_VOLATILE_P (x
))
1418 base
= find_base_term (XEXP (x
, 0));
1421 /* Stack references are local. */
1422 if (GET_CODE (base
) == ADDRESS
&& GET_MODE (base
) == Pmode
)
1424 /* Constants in the function's constant pool are constant. */
1425 if (GET_CODE (base
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (base
))
1438 /* Recursively scan the operands of this expression. */
1441 register const char *fmt
= GET_RTX_FORMAT (code
);
1444 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1448 if (nonlocal_reference_p (XEXP (x
, i
)))
1454 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1455 if (nonlocal_reference_p (XVECEXP (x
, i
, j
)))
1464 /* Mark the function if it is constant. */
1467 mark_constant_function ()
1471 if (TREE_PUBLIC (current_function_decl
)
1472 || TREE_READONLY (current_function_decl
)
1473 || TREE_THIS_VOLATILE (current_function_decl
)
1474 || TYPE_MODE (TREE_TYPE (current_function_decl
)) == VOIDmode
)
1477 /* Determine if this is a constant function. */
1479 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
1480 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
1481 && nonlocal_reference_p (insn
))
1484 /* Mark the function. */
1486 TREE_READONLY (current_function_decl
) = 1;
1490 static HARD_REG_SET argument_registers
;
1497 #ifndef OUTGOING_REGNO
1498 #define OUTGOING_REGNO(N) N
1500 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1501 /* Check whether this register can hold an incoming pointer
1502 argument. FUNCTION_ARG_REGNO_P tests outgoing register
1503 numbers, so translate if necessary due to register windows. */
1504 if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i
))
1505 && HARD_REGNO_MODE_OK (i
, Pmode
))
1506 SET_HARD_REG_BIT (argument_registers
, i
);
1508 alias_sets
= splay_tree_new (splay_tree_compare_ints
, 0, 0);
1512 init_alias_analysis ()
1514 int maxreg
= max_reg_num ();
1517 register unsigned int ui
;
1520 reg_known_value_size
= maxreg
;
1523 = (rtx
*) oballoc ((maxreg
- FIRST_PSEUDO_REGISTER
) * sizeof (rtx
))
1524 - FIRST_PSEUDO_REGISTER
;
1526 oballoc (maxreg
- FIRST_PSEUDO_REGISTER
) - FIRST_PSEUDO_REGISTER
;
1527 bzero ((char *) (reg_known_value
+ FIRST_PSEUDO_REGISTER
),
1528 (maxreg
-FIRST_PSEUDO_REGISTER
) * sizeof (rtx
));
1529 bzero (reg_known_equiv_p
+ FIRST_PSEUDO_REGISTER
,
1530 (maxreg
- FIRST_PSEUDO_REGISTER
) * sizeof (char));
1532 /* Overallocate reg_base_value to allow some growth during loop
1533 optimization. Loop unrolling can create a large number of
1535 reg_base_value_size
= maxreg
* 2;
1536 reg_base_value
= (rtx
*)oballoc (reg_base_value_size
* sizeof (rtx
));
1537 new_reg_base_value
= (rtx
*)alloca (reg_base_value_size
* sizeof (rtx
));
1538 reg_seen
= (char *)alloca (reg_base_value_size
);
1539 bzero ((char *) reg_base_value
, reg_base_value_size
* sizeof (rtx
));
1540 if (! reload_completed
&& flag_unroll_loops
)
1542 alias_invariant
= (rtx
*)xrealloc (alias_invariant
,
1543 reg_base_value_size
* sizeof (rtx
));
1544 bzero ((char *)alias_invariant
, reg_base_value_size
* sizeof (rtx
));
1548 /* The basic idea is that each pass through this loop will use the
1549 "constant" information from the previous pass to propagate alias
1550 information through another level of assignments.
1552 This could get expensive if the assignment chains are long. Maybe
1553 we should throttle the number of iterations, possibly based on
1554 the optimization level or flag_expensive_optimizations.
1556 We could propagate more information in the first pass by making use
1557 of REG_N_SETS to determine immediately that the alias information
1558 for a pseudo is "constant".
1560 A program with an uninitialized variable can cause an infinite loop
1561 here. Instead of doing a full dataflow analysis to detect such problems
1562 we just cap the number of iterations for the loop.
1564 The state of the arrays for the set chain in question does not matter
1565 since the program has undefined behavior. */
1570 /* Assume nothing will change this iteration of the loop. */
1573 /* We want to assign the same IDs each iteration of this loop, so
1574 start counting from zero each iteration of the loop. */
1577 /* We're at the start of the funtion each iteration through the
1578 loop, so we're copying arguments. */
1579 copying_arguments
= 1;
1581 /* Wipe the potential alias information clean for this pass. */
1582 bzero ((char *) new_reg_base_value
, reg_base_value_size
* sizeof (rtx
));
1584 /* Wipe the reg_seen array clean. */
1585 bzero ((char *) reg_seen
, reg_base_value_size
);
1587 /* Mark all hard registers which may contain an address.
1588 The stack, frame and argument pointers may contain an address.
1589 An argument register which can hold a Pmode value may contain
1590 an address even if it is not in BASE_REGS.
1592 The address expression is VOIDmode for an argument and
1593 Pmode for other registers. */
1595 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1596 if (TEST_HARD_REG_BIT (argument_registers
, i
))
1597 new_reg_base_value
[i
] = gen_rtx_ADDRESS (VOIDmode
,
1598 gen_rtx_REG (Pmode
, i
));
1600 new_reg_base_value
[STACK_POINTER_REGNUM
]
1601 = gen_rtx_ADDRESS (Pmode
, stack_pointer_rtx
);
1602 new_reg_base_value
[ARG_POINTER_REGNUM
]
1603 = gen_rtx_ADDRESS (Pmode
, arg_pointer_rtx
);
1604 new_reg_base_value
[FRAME_POINTER_REGNUM
]
1605 = gen_rtx_ADDRESS (Pmode
, frame_pointer_rtx
);
1606 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1607 new_reg_base_value
[HARD_FRAME_POINTER_REGNUM
]
1608 = gen_rtx_ADDRESS (Pmode
, hard_frame_pointer_rtx
);
1610 if (struct_value_incoming_rtx
1611 && GET_CODE (struct_value_incoming_rtx
) == REG
)
1612 new_reg_base_value
[REGNO (struct_value_incoming_rtx
)]
1613 = gen_rtx_ADDRESS (Pmode
, struct_value_incoming_rtx
);
1615 if (static_chain_rtx
1616 && GET_CODE (static_chain_rtx
) == REG
)
1617 new_reg_base_value
[REGNO (static_chain_rtx
)]
1618 = gen_rtx_ADDRESS (Pmode
, static_chain_rtx
);
1620 /* Walk the insns adding values to the new_reg_base_value array. */
1621 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
1623 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
1624 if (prologue_epilogue_contains (insn
))
1627 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
1630 /* If this insn has a noalias note, process it, Otherwise,
1631 scan for sets. A simple set will have no side effects
1632 which could change the base value of any other register. */
1634 if (GET_CODE (PATTERN (insn
)) == SET
1635 && (find_reg_note (insn
, REG_NOALIAS
, NULL_RTX
)))
1636 record_set (SET_DEST (PATTERN (insn
)), NULL_RTX
);
1638 note_stores (PATTERN (insn
), record_set
);
1640 set
= single_set (insn
);
1643 && GET_CODE (SET_DEST (set
)) == REG
1644 && REGNO (SET_DEST (set
)) >= FIRST_PSEUDO_REGISTER
1645 && (((note
= find_reg_note (insn
, REG_EQUAL
, 0)) != 0
1646 && REG_N_SETS (REGNO (SET_DEST (set
))) == 1)
1647 || (note
= find_reg_note (insn
, REG_EQUIV
, NULL_RTX
)) != 0)
1648 && GET_CODE (XEXP (note
, 0)) != EXPR_LIST
1649 && ! reg_overlap_mentioned_p (SET_DEST (set
), XEXP (note
, 0)))
1651 int regno
= REGNO (SET_DEST (set
));
1652 reg_known_value
[regno
] = XEXP (note
, 0);
1653 reg_known_equiv_p
[regno
] = REG_NOTE_KIND (note
) == REG_EQUIV
;
1656 else if (GET_CODE (insn
) == NOTE
1657 && NOTE_LINE_NUMBER (insn
) == NOTE_INSN_FUNCTION_BEG
)
1658 copying_arguments
= 0;
1661 /* Now propagate values from new_reg_base_value to reg_base_value. */
1662 for (ui
= 0; ui
< reg_base_value_size
; ui
++)
1664 if (new_reg_base_value
[ui
]
1665 && new_reg_base_value
[ui
] != reg_base_value
[ui
]
1666 && ! rtx_equal_p (new_reg_base_value
[ui
], reg_base_value
[ui
]))
1668 reg_base_value
[ui
] = new_reg_base_value
[ui
];
1673 while (changed
&& ++pass
< MAX_ALIAS_LOOP_PASSES
);
1675 /* Fill in the remaining entries. */
1676 for (i
= FIRST_PSEUDO_REGISTER
; i
< maxreg
; i
++)
1677 if (reg_known_value
[i
] == 0)
1678 reg_known_value
[i
] = regno_reg_rtx
[i
];
1680 /* Simplify the reg_base_value array so that no register refers to
1681 another register, except to special registers indirectly through
1682 ADDRESS expressions.
1684 In theory this loop can take as long as O(registers^2), but unless
1685 there are very long dependency chains it will run in close to linear
1688 This loop may not be needed any longer now that the main loop does
1689 a better job at propagating alias information. */
1695 for (ui
= 0; ui
< reg_base_value_size
; ui
++)
1697 rtx base
= reg_base_value
[ui
];
1698 if (base
&& GET_CODE (base
) == REG
)
1700 unsigned int base_regno
= REGNO (base
);
1701 if (base_regno
== ui
) /* register set from itself */
1702 reg_base_value
[ui
] = 0;
1704 reg_base_value
[ui
] = reg_base_value
[base_regno
];
1709 while (changed
&& pass
< MAX_ALIAS_LOOP_PASSES
);
1711 new_reg_base_value
= 0;
1716 end_alias_analysis ()
1718 reg_known_value
= 0;
1720 reg_base_value_size
= 0;
1721 if (alias_invariant
)
1723 free ((char *)alias_invariant
);
1724 alias_invariant
= 0;