1 /* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 88, 92-97, 1998 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
26 static int rtx_addr_can_trap_p PROTO((rtx));
27 static void reg_set_p_1 PROTO((rtx, rtx));
28 static void reg_set_last_1 PROTO((rtx, rtx));
31 /* Forward declarations */
32 static int jmp_uses_reg_or_mem PROTO((rtx));
34 /* Bit flags that specify the machine subtype we are compiling for.
35 Bits are tested using macros TARGET_... defined in the tm.h file
36 and set by `-m...' switches. Must be defined in rtlanal.c. */
40 /* Return 1 if the value of X is unstable
41 (would be different at a different point in the program).
42 The frame pointer, arg pointer, etc. are considered stable
43 (within one function) and so is anything marked `unchanging'. */
49 register RTX_CODE code = GET_CODE (x);
54 return ! RTX_UNCHANGING_P (x);
59 if (code == CONST || code == CONST_INT)
63 return ! (REGNO (x) == FRAME_POINTER_REGNUM
64 || REGNO (x) == HARD_FRAME_POINTER_REGNUM
65 || REGNO (x) == ARG_POINTER_REGNUM
66 || RTX_UNCHANGING_P (x));
68 fmt = GET_RTX_FORMAT (code);
69 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
71 if (rtx_unstable_p (XEXP (x, i)))
76 /* Return 1 if X has a value that can vary even between two
77 executions of the program. 0 means X can be compared reliably
78 against certain constants or near-constants.
79 The frame pointer and the arg pointer are considered constant. */
85 register RTX_CODE code = GET_CODE (x);
103 /* Note that we have to test for the actual rtx used for the frame
104 and arg pointers and not just the register number in case we have
105 eliminated the frame and/or arg pointer and are using it
107 return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
108 || x == arg_pointer_rtx || x == pic_offset_table_rtx);
111 /* The operand 0 of a LO_SUM is considered constant
112 (in fact is it related specifically to operand 1). */
113 return rtx_varies_p (XEXP (x, 1));
119 fmt = GET_RTX_FORMAT (code);
120 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
122 if (rtx_varies_p (XEXP (x, i)))
127 /* Return 0 if the use of X as an address in a MEM can cause a trap. */
130 rtx_addr_can_trap_p (x)
133 register enum rtx_code code = GET_CODE (x);
139 /* SYMBOL_REF is problematic due to the possible presence of
140 a #pragma weak, but to say that loads from symbols can trap is
141 *very* costly. It's not at all clear what's best here. For
142 now, we ignore the impact of #pragma weak. */
146 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
147 return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
148 || x == stack_pointer_rtx || x == arg_pointer_rtx);
151 return rtx_addr_can_trap_p (XEXP (x, 0));
154 /* An address is assumed not to trap if it is an address that can't
155 trap plus a constant integer. */
156 return (rtx_addr_can_trap_p (XEXP (x, 0))
157 || GET_CODE (XEXP (x, 1)) != CONST_INT);
160 return rtx_addr_can_trap_p (XEXP (x, 1));
166 /* If it isn't one of the case above, it can cause a trap. */
170 /* Return 1 if X refers to a memory location whose address
171 cannot be compared reliably with constant addresses,
172 or if X refers to a BLKmode memory object. */
175 rtx_addr_varies_p (x)
178 register enum rtx_code code;
187 return GET_MODE (x) == BLKmode || rtx_varies_p (XEXP (x, 0));
189 fmt = GET_RTX_FORMAT (code);
190 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
193 if (rtx_addr_varies_p (XEXP (x, i)))
196 else if (fmt[i] == 'E')
199 for (j = 0; j < XVECLEN (x, i); j++)
200 if (rtx_addr_varies_p (XVECEXP (x, i, j)))
206 /* Return the value of the integer term in X, if one is apparent;
208 Only obvious integer terms are detected.
209 This is used in cse.c with the `related_value' field.*/
215 if (GET_CODE (x) == CONST)
218 if (GET_CODE (x) == MINUS
219 && GET_CODE (XEXP (x, 1)) == CONST_INT)
220 return - INTVAL (XEXP (x, 1));
221 if (GET_CODE (x) == PLUS
222 && GET_CODE (XEXP (x, 1)) == CONST_INT)
223 return INTVAL (XEXP (x, 1));
227 /* If X is a constant, return the value sans apparent integer term;
229 Only obvious integer terms are detected. */
232 get_related_value (x)
235 if (GET_CODE (x) != CONST)
238 if (GET_CODE (x) == PLUS
239 && GET_CODE (XEXP (x, 1)) == CONST_INT)
241 else if (GET_CODE (x) == MINUS
242 && GET_CODE (XEXP (x, 1)) == CONST_INT)
247 /* Nonzero if register REG appears somewhere within IN.
248 Also works if REG is not a register; in this case it checks
249 for a subexpression of IN that is Lisp "equal" to REG. */
252 reg_mentioned_p (reg, in)
253 register rtx reg, in;
257 register enum rtx_code code;
265 if (GET_CODE (in) == LABEL_REF)
266 return reg == XEXP (in, 0);
268 code = GET_CODE (in);
272 /* Compare registers by number. */
274 return GET_CODE (reg) == REG && REGNO (in) == REGNO (reg);
276 /* These codes have no constituent expressions
284 return GET_CODE (reg) == CONST_INT && INTVAL (in) == INTVAL (reg);
287 /* These are kept unique for a given value. */
294 if (GET_CODE (reg) == code && rtx_equal_p (reg, in))
297 fmt = GET_RTX_FORMAT (code);
299 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
304 for (j = XVECLEN (in, i) - 1; j >= 0; j--)
305 if (reg_mentioned_p (reg, XVECEXP (in, i, j)))
308 else if (fmt[i] == 'e'
309 && reg_mentioned_p (reg, XEXP (in, i)))
315 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
316 no CODE_LABEL insn. */
319 no_labels_between_p (beg, end)
323 for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
324 if (GET_CODE (p) == CODE_LABEL)
329 /* Nonzero if register REG is used in an insn between
330 FROM_INSN and TO_INSN (exclusive of those two). */
333 reg_used_between_p (reg, from_insn, to_insn)
334 rtx reg, from_insn, to_insn;
338 if (from_insn == to_insn)
341 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
342 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
343 && (reg_overlap_mentioned_p (reg, PATTERN (insn))
344 || (GET_CODE (insn) == CALL_INSN
345 && (find_reg_fusage (insn, USE, reg)
346 || find_reg_fusage (insn, CLOBBER, reg)))))
351 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
352 is entirely replaced by a new value and the only use is as a SET_DEST,
353 we do not consider it a reference. */
356 reg_referenced_p (x, body)
362 switch (GET_CODE (body))
365 if (reg_overlap_mentioned_p (x, SET_SRC (body)))
368 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
369 of a REG that occupies all of the REG, the insn references X if
370 it is mentioned in the destination. */
371 if (GET_CODE (SET_DEST (body)) != CC0
372 && GET_CODE (SET_DEST (body)) != PC
373 && GET_CODE (SET_DEST (body)) != REG
374 && ! (GET_CODE (SET_DEST (body)) == SUBREG
375 && GET_CODE (SUBREG_REG (SET_DEST (body))) == REG
376 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body))))
377 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
378 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body)))
379 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
380 && reg_overlap_mentioned_p (x, SET_DEST (body)))
385 for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
386 if (reg_overlap_mentioned_p (x, ASM_OPERANDS_INPUT (body, i)))
392 return reg_overlap_mentioned_p (x, body);
395 return reg_overlap_mentioned_p (x, TRAP_CONDITION (body));
398 case UNSPEC_VOLATILE:
400 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
401 if (reg_referenced_p (x, XVECEXP (body, 0, i)))
410 /* Nonzero if register REG is referenced in an insn between
411 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
415 reg_referenced_between_p (reg, from_insn, to_insn)
416 rtx reg, from_insn, to_insn;
420 if (from_insn == to_insn)
423 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
424 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
425 && (reg_referenced_p (reg, PATTERN (insn))
426 || (GET_CODE (insn) == CALL_INSN
427 && find_reg_fusage (insn, USE, reg))))
432 /* Nonzero if register REG is set or clobbered in an insn between
433 FROM_INSN and TO_INSN (exclusive of those two). */
436 reg_set_between_p (reg, from_insn, to_insn)
437 rtx reg, from_insn, to_insn;
441 if (from_insn == to_insn)
444 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
445 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
446 && reg_set_p (reg, insn))
451 /* Internals of reg_set_between_p. */
453 static rtx reg_set_reg;
454 static int reg_set_flag;
459 rtx pat ATTRIBUTE_UNUSED;
461 /* We don't want to return 1 if X is a MEM that contains a register
462 within REG_SET_REG. */
464 if ((GET_CODE (x) != MEM)
465 && reg_overlap_mentioned_p (reg_set_reg, x))
470 reg_set_p (reg, insn)
475 /* We can be passed an insn or part of one. If we are passed an insn,
476 check if a side-effect of the insn clobbers REG. */
477 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
479 if (FIND_REG_INC_NOTE (insn, reg)
480 || (GET_CODE (insn) == CALL_INSN
481 /* We'd like to test call_used_regs here, but rtlanal.c can't
482 reference that variable due to its use in genattrtab. So
483 we'll just be more conservative.
485 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
486 information holds all clobbered registers. */
487 && ((GET_CODE (reg) == REG
488 && REGNO (reg) < FIRST_PSEUDO_REGISTER)
489 || GET_CODE (reg) == MEM
490 || find_reg_fusage (insn, CLOBBER, reg))))
493 body = PATTERN (insn);
498 note_stores (body, reg_set_p_1);
502 /* Similar to reg_set_between_p, but check all registers in X. Return 0
503 only if none of them are modified between START and END. Return 1 if
504 X contains a MEM; this routine does not perform any memory aliasing. */
507 modified_between_p (x, start, end)
511 enum rtx_code code = GET_CODE (x);
529 /* If the memory is not constant, assume it is modified. If it is
530 constant, we still have to check the address. */
531 if (! RTX_UNCHANGING_P (x))
536 return reg_set_between_p (x, start, end);
542 fmt = GET_RTX_FORMAT (code);
543 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
545 if (fmt[i] == 'e' && modified_between_p (XEXP (x, i), start, end))
549 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
550 if (modified_between_p (XVECEXP (x, i, j), start, end))
557 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
558 of them are modified in INSN. Return 1 if X contains a MEM; this routine
559 does not perform any memory aliasing. */
562 modified_in_p (x, insn)
566 enum rtx_code code = GET_CODE (x);
584 /* If the memory is not constant, assume it is modified. If it is
585 constant, we still have to check the address. */
586 if (! RTX_UNCHANGING_P (x))
591 return reg_set_p (x, insn);
597 fmt = GET_RTX_FORMAT (code);
598 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
600 if (fmt[i] == 'e' && modified_in_p (XEXP (x, i), insn))
604 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
605 if (modified_in_p (XVECEXP (x, i, j), insn))
612 /* Given an INSN, return a SET expression if this insn has only a single SET.
613 It may also have CLOBBERs, USEs, or SET whose output
614 will not be used, which we ignore. */
623 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
626 if (GET_CODE (PATTERN (insn)) == SET)
627 return PATTERN (insn);
629 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
631 for (i = 0, set = 0; i < XVECLEN (PATTERN (insn), 0); i++)
632 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET
633 && (! find_reg_note (insn, REG_UNUSED,
634 SET_DEST (XVECEXP (PATTERN (insn), 0, i)))
635 || side_effects_p (XVECEXP (PATTERN (insn), 0, i))))
640 set = XVECEXP (PATTERN (insn), 0, i);
648 /* Return the last thing that X was assigned from before *PINSN. Verify that
649 the object is not modified up to VALID_TO. If it was, if we hit
650 a partial assignment to X, or hit a CODE_LABEL first, return X. If we
651 found an assignment, update *PINSN to point to it. */
654 find_last_value (x, pinsn, valid_to)
661 for (p = PREV_INSN (*pinsn); p && GET_CODE (p) != CODE_LABEL;
663 if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
665 rtx set = single_set (p);
666 rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
668 if (set && rtx_equal_p (x, SET_DEST (set)))
670 rtx src = SET_SRC (set);
672 if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
673 src = XEXP (note, 0);
675 if (! modified_between_p (src, PREV_INSN (p), valid_to)
676 /* Reject hard registers because we don't usually want
677 to use them; we'd rather use a pseudo. */
678 && ! (GET_CODE (src) == REG
679 && REGNO (src) < FIRST_PSEUDO_REGISTER))
686 /* If set in non-simple way, we don't have a value. */
687 if (reg_set_p (x, p))
694 /* Return nonzero if register in range [REGNO, ENDREGNO)
695 appears either explicitly or implicitly in X
696 other than being stored into.
698 References contained within the substructure at LOC do not count.
699 LOC may be zero, meaning don't ignore anything. */
702 refers_to_regno_p (regno, endregno, x, loc)
708 register RTX_CODE code;
712 /* The contents of a REG_NONNEG note is always zero, so we must come here
713 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
724 /* If we modifying the stack, frame, or argument pointer, it will
725 clobber a virtual register. In fact, we could be more precise,
726 but it isn't worth it. */
727 if ((i == STACK_POINTER_REGNUM
728 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
729 || i == ARG_POINTER_REGNUM
731 || i == FRAME_POINTER_REGNUM)
732 && regno >= FIRST_VIRTUAL_REGISTER && regno <= LAST_VIRTUAL_REGISTER)
736 && regno < i + (i < FIRST_PSEUDO_REGISTER
737 ? HARD_REGNO_NREGS (i, GET_MODE (x))
741 /* If this is a SUBREG of a hard reg, we can see exactly which
742 registers are being modified. Otherwise, handle normally. */
743 if (GET_CODE (SUBREG_REG (x)) == REG
744 && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
746 int inner_regno = REGNO (SUBREG_REG (x)) + SUBREG_WORD (x);
748 = inner_regno + (inner_regno < FIRST_PSEUDO_REGISTER
749 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
751 return endregno > inner_regno && regno < inner_endregno;
757 if (&SET_DEST (x) != loc
758 /* Note setting a SUBREG counts as referring to the REG it is in for
759 a pseudo but not for hard registers since we can
760 treat each word individually. */
761 && ((GET_CODE (SET_DEST (x)) == SUBREG
762 && loc != &SUBREG_REG (SET_DEST (x))
763 && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG
764 && REGNO (SUBREG_REG (SET_DEST (x))) >= FIRST_PSEUDO_REGISTER
765 && refers_to_regno_p (regno, endregno,
766 SUBREG_REG (SET_DEST (x)), loc))
767 || (GET_CODE (SET_DEST (x)) != REG
768 && refers_to_regno_p (regno, endregno, SET_DEST (x), loc))))
771 if (code == CLOBBER || loc == &SET_SRC (x))
780 /* X does not match, so try its subexpressions. */
782 fmt = GET_RTX_FORMAT (code);
783 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
785 if (fmt[i] == 'e' && loc != &XEXP (x, i))
793 if (refers_to_regno_p (regno, endregno, XEXP (x, i), loc))
796 else if (fmt[i] == 'E')
799 for (j = XVECLEN (x, i) - 1; j >=0; j--)
800 if (loc != &XVECEXP (x, i, j)
801 && refers_to_regno_p (regno, endregno, XVECEXP (x, i, j), loc))
808 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
809 we check if any register number in X conflicts with the relevant register
810 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
811 contains a MEM (we don't bother checking for memory addresses that can't
812 conflict because we expect this to be a rare case. */
815 reg_overlap_mentioned_p (x, in)
820 /* Overly conservative. */
821 if (GET_CODE (x) == STRICT_LOW_PART)
824 /* If either argument is a constant, then modifying X can not affect IN. */
825 if (CONSTANT_P (x) || CONSTANT_P (in))
827 else if (GET_CODE (x) == SUBREG)
829 regno = REGNO (SUBREG_REG (x));
830 if (regno < FIRST_PSEUDO_REGISTER)
831 regno += SUBREG_WORD (x);
833 else if (GET_CODE (x) == REG)
835 else if (GET_CODE (x) == MEM)
840 if (GET_CODE (in) == MEM)
843 fmt = GET_RTX_FORMAT (GET_CODE (in));
845 for (i = GET_RTX_LENGTH (GET_CODE (in)) - 1; i >= 0; i--)
846 if (fmt[i] == 'e' && reg_overlap_mentioned_p (x, XEXP (in, i)))
851 else if (GET_CODE (x) == SCRATCH || GET_CODE (x) == PC
852 || GET_CODE (x) == CC0)
853 return reg_mentioned_p (x, in);
857 endregno = regno + (regno < FIRST_PSEUDO_REGISTER
858 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
860 return refers_to_regno_p (regno, endregno, in, NULL_PTR);
863 /* Used for communications between the next few functions. */
865 static int reg_set_last_unknown;
866 static rtx reg_set_last_value;
867 static int reg_set_last_first_regno, reg_set_last_last_regno;
869 /* Called via note_stores from reg_set_last. */
872 reg_set_last_1 (x, pat)
878 /* If X is not a register, or is not one in the range we care
880 if (GET_CODE (x) != REG)
884 last = first + (first < FIRST_PSEUDO_REGISTER
885 ? HARD_REGNO_NREGS (first, GET_MODE (x)) : 1);
887 if (first >= reg_set_last_last_regno
888 || last <= reg_set_last_first_regno)
891 /* If this is a CLOBBER or is some complex LHS, or doesn't modify
892 exactly the registers we care about, show we don't know the value. */
893 if (GET_CODE (pat) == CLOBBER || SET_DEST (pat) != x
894 || first != reg_set_last_first_regno
895 || last != reg_set_last_last_regno)
896 reg_set_last_unknown = 1;
898 reg_set_last_value = SET_SRC (pat);
901 /* Return the last value to which REG was set prior to INSN. If we can't
902 find it easily, return 0.
904 We only return a REG, SUBREG, or constant because it is too hard to
905 check if a MEM remains unchanged. */
908 reg_set_last (x, insn)
912 rtx orig_insn = insn;
914 reg_set_last_first_regno = REGNO (x);
916 reg_set_last_last_regno
917 = reg_set_last_first_regno
918 + (reg_set_last_first_regno < FIRST_PSEUDO_REGISTER
919 ? HARD_REGNO_NREGS (reg_set_last_first_regno, GET_MODE (x)) : 1);
921 reg_set_last_unknown = 0;
922 reg_set_last_value = 0;
924 /* Scan backwards until reg_set_last_1 changed one of the above flags.
925 Stop when we reach a label or X is a hard reg and we reach a
926 CALL_INSN (if reg_set_last_last_regno is a hard reg).
928 If we find a set of X, ensure that its SET_SRC remains unchanged. */
930 /* We compare with <= here, because reg_set_last_last_regno
931 is actually the number of the first reg *not* in X. */
933 insn && GET_CODE (insn) != CODE_LABEL
934 && ! (GET_CODE (insn) == CALL_INSN
935 && reg_set_last_last_regno <= FIRST_PSEUDO_REGISTER);
936 insn = PREV_INSN (insn))
937 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
939 note_stores (PATTERN (insn), reg_set_last_1);
940 if (reg_set_last_unknown)
942 else if (reg_set_last_value)
944 if (CONSTANT_P (reg_set_last_value)
945 || ((GET_CODE (reg_set_last_value) == REG
946 || GET_CODE (reg_set_last_value) == SUBREG)
947 && ! reg_set_between_p (reg_set_last_value,
949 return reg_set_last_value;
958 /* This is 1 until after the rtl generation pass. */
959 int rtx_equal_function_value_matters;
961 /* Return 1 if X and Y are identical-looking rtx's.
962 This is the Lisp function EQUAL for rtx arguments. */
970 register enum rtx_code code;
975 if (x == 0 || y == 0)
979 /* Rtx's of different codes cannot be equal. */
980 if (code != GET_CODE (y))
983 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
984 (REG:SI x) and (REG:HI x) are NOT equivalent. */
986 if (GET_MODE (x) != GET_MODE (y))
989 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
992 /* Until rtl generation is complete, don't consider a reference to the
993 return register of the current function the same as the return from a
994 called function. This eases the job of function integration. Once the
995 distinction is no longer needed, they can be considered equivalent. */
996 return (REGNO (x) == REGNO (y)
997 && (! rtx_equal_function_value_matters
998 || REG_FUNCTION_VALUE_P (x) == REG_FUNCTION_VALUE_P (y)));
999 else if (code == LABEL_REF)
1000 return XEXP (x, 0) == XEXP (y, 0);
1001 else if (code == SYMBOL_REF)
1002 return XSTR (x, 0) == XSTR (y, 0);
1003 else if (code == SCRATCH || code == CONST_DOUBLE)
1006 /* Compare the elements. If any pair of corresponding elements
1007 fail to match, return 0 for the whole things. */
1009 fmt = GET_RTX_FORMAT (code);
1010 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1015 if (XWINT (x, i) != XWINT (y, i))
1021 if (XINT (x, i) != XINT (y, i))
1027 /* Two vectors must have the same length. */
1028 if (XVECLEN (x, i) != XVECLEN (y, i))
1031 /* And the corresponding elements must match. */
1032 for (j = 0; j < XVECLEN (x, i); j++)
1033 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
1038 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
1044 if (strcmp (XSTR (x, i), XSTR (y, i)))
1049 /* These are just backpointers, so they don't matter. */
1055 /* It is believed that rtx's at this level will never
1056 contain anything but integers and other rtx's,
1057 except for within LABEL_REFs and SYMBOL_REFs. */
1065 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1066 (X would be the pattern of an insn).
1067 FUN receives two arguments:
1068 the REG, MEM, CC0 or PC being stored in or clobbered,
1069 the SET or CLOBBER rtx that does the store.
1071 If the item being stored in or clobbered is a SUBREG of a hard register,
1072 the SUBREG will be passed. */
1075 note_stores (x, fun)
1079 if ((GET_CODE (x) == SET || GET_CODE (x) == CLOBBER))
1081 register rtx dest = SET_DEST (x);
1082 while ((GET_CODE (dest) == SUBREG
1083 && (GET_CODE (SUBREG_REG (dest)) != REG
1084 || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER))
1085 || GET_CODE (dest) == ZERO_EXTRACT
1086 || GET_CODE (dest) == SIGN_EXTRACT
1087 || GET_CODE (dest) == STRICT_LOW_PART)
1088 dest = XEXP (dest, 0);
1091 else if (GET_CODE (x) == PARALLEL)
1094 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
1096 register rtx y = XVECEXP (x, 0, i);
1097 if (GET_CODE (y) == SET || GET_CODE (y) == CLOBBER)
1099 register rtx dest = SET_DEST (y);
1100 while ((GET_CODE (dest) == SUBREG
1101 && (GET_CODE (SUBREG_REG (dest)) != REG
1102 || (REGNO (SUBREG_REG (dest))
1103 >= FIRST_PSEUDO_REGISTER)))
1104 || GET_CODE (dest) == ZERO_EXTRACT
1105 || GET_CODE (dest) == SIGN_EXTRACT
1106 || GET_CODE (dest) == STRICT_LOW_PART)
1107 dest = XEXP (dest, 0);
1114 /* Return nonzero if X's old contents don't survive after INSN.
1115 This will be true if X is (cc0) or if X is a register and
1116 X dies in INSN or because INSN entirely sets X.
1118 "Entirely set" means set directly and not through a SUBREG,
1119 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1120 Likewise, REG_INC does not count.
1122 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1123 but for this use that makes no difference, since regs don't overlap
1124 during their lifetimes. Therefore, this function may be used
1125 at any time after deaths have been computed (in flow.c).
1127 If REG is a hard reg that occupies multiple machine registers, this
1128 function will only return 1 if each of those registers will be replaced
1132 dead_or_set_p (insn, x)
1136 register int regno, last_regno;
1139 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1140 if (GET_CODE (x) == CC0)
1143 if (GET_CODE (x) != REG)
1147 last_regno = (regno >= FIRST_PSEUDO_REGISTER ? regno
1148 : regno + HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1);
1150 for (i = regno; i <= last_regno; i++)
1151 if (! dead_or_set_regno_p (insn, i))
1157 /* Utility function for dead_or_set_p to check an individual register. Also
1158 called from flow.c. */
1161 dead_or_set_regno_p (insn, test_regno)
1165 int regno, endregno;
1168 /* REG_READ notes are not normally maintained after reload, so we
1169 ignore them if the are invalid. */
1170 if (! reload_completed
1171 #ifdef PRESERVE_DEATH_INFO_REGNO_P
1172 || PRESERVE_DEATH_INFO_REGNO_P (test_regno)
1176 /* See if there is a death note for something that includes
1178 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1180 if (REG_NOTE_KIND (link) != REG_DEAD
1181 || GET_CODE (XEXP (link, 0)) != REG)
1184 regno = REGNO (XEXP (link, 0));
1185 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1186 : regno + HARD_REGNO_NREGS (regno,
1187 GET_MODE (XEXP (link, 0))));
1189 if (test_regno >= regno && test_regno < endregno)
1194 if (GET_CODE (insn) == CALL_INSN
1195 && find_regno_fusage (insn, CLOBBER, test_regno))
1198 if (GET_CODE (PATTERN (insn)) == SET)
1200 rtx dest = SET_DEST (PATTERN (insn));
1202 /* A value is totally replaced if it is the destination or the
1203 destination is a SUBREG of REGNO that does not change the number of
1205 if (GET_CODE (dest) == SUBREG
1206 && (((GET_MODE_SIZE (GET_MODE (dest))
1207 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1208 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1209 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1210 dest = SUBREG_REG (dest);
1212 if (GET_CODE (dest) != REG)
1215 regno = REGNO (dest);
1216 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1217 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1219 return (test_regno >= regno && test_regno < endregno);
1221 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1225 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
1227 rtx body = XVECEXP (PATTERN (insn), 0, i);
1229 if (GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1231 rtx dest = SET_DEST (body);
1233 if (GET_CODE (dest) == SUBREG
1234 && (((GET_MODE_SIZE (GET_MODE (dest))
1235 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1236 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1237 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1238 dest = SUBREG_REG (dest);
1240 if (GET_CODE (dest) != REG)
1243 regno = REGNO (dest);
1244 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1245 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1247 if (test_regno >= regno && test_regno < endregno)
1256 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1257 If DATUM is nonzero, look for one whose datum is DATUM. */
1260 find_reg_note (insn, kind, datum)
1267 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1268 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
1271 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1272 if (REG_NOTE_KIND (link) == kind
1273 && (datum == 0 || datum == XEXP (link, 0)))
1278 /* Return the reg-note of kind KIND in insn INSN which applies to register
1279 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1280 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1281 it might be the case that the note overlaps REGNO. */
1284 find_regno_note (insn, kind, regno)
1291 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1292 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
1295 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1296 if (REG_NOTE_KIND (link) == kind
1297 /* Verify that it is a register, so that scratch and MEM won't cause a
1299 && GET_CODE (XEXP (link, 0)) == REG
1300 && REGNO (XEXP (link, 0)) <= regno
1301 && ((REGNO (XEXP (link, 0))
1302 + (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
1303 : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
1304 GET_MODE (XEXP (link, 0)))))
1310 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1311 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1314 find_reg_fusage (insn, code, datum)
1319 /* If it's not a CALL_INSN, it can't possibly have a
1320 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1321 if (GET_CODE (insn) != CALL_INSN)
1327 if (GET_CODE (datum) != REG)
1331 for (link = CALL_INSN_FUNCTION_USAGE (insn);
1333 link = XEXP (link, 1))
1334 if (GET_CODE (XEXP (link, 0)) == code
1335 && rtx_equal_p (datum, SET_DEST (XEXP (link, 0))))
1340 register int regno = REGNO (datum);
1342 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1343 to pseudo registers, so don't bother checking. */
1345 if (regno < FIRST_PSEUDO_REGISTER)
1347 int end_regno = regno + HARD_REGNO_NREGS (regno, GET_MODE (datum));
1350 for (i = regno; i < end_regno; i++)
1351 if (find_regno_fusage (insn, code, i))
1359 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1360 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1363 find_regno_fusage (insn, code, regno)
1370 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1371 to pseudo registers, so don't bother checking. */
1373 if (regno >= FIRST_PSEUDO_REGISTER
1374 || GET_CODE (insn) != CALL_INSN )
1377 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1379 register int regnote;
1382 if (GET_CODE (op = XEXP (link, 0)) == code
1383 && GET_CODE (SET_DEST (op)) == REG
1384 && (regnote = REGNO (SET_DEST (op))) <= regno
1386 + HARD_REGNO_NREGS (regnote, GET_MODE (SET_DEST (op)))
1394 /* Remove register note NOTE from the REG_NOTES of INSN. */
1397 remove_note (insn, note)
1403 if (REG_NOTES (insn) == note)
1405 REG_NOTES (insn) = XEXP (note, 1);
1409 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1410 if (XEXP (link, 1) == note)
1412 XEXP (link, 1) = XEXP (note, 1);
1419 /* Nonzero if X contains any volatile instructions. These are instructions
1420 which may cause unpredictable machine state instructions, and thus no
1421 instructions should be moved or combined across them. This includes
1422 only volatile asms and UNSPEC_VOLATILE instructions. */
1428 register RTX_CODE code;
1430 code = GET_CODE (x);
1450 case UNSPEC_VOLATILE:
1451 /* case TRAP_IF: This isn't clear yet. */
1455 if (MEM_VOLATILE_P (x))
1462 /* Recursively scan the operands of this expression. */
1465 register char *fmt = GET_RTX_FORMAT (code);
1468 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1472 if (volatile_insn_p (XEXP (x, i)))
1478 for (j = 0; j < XVECLEN (x, i); j++)
1479 if (volatile_insn_p (XVECEXP (x, i, j)))
1487 /* Nonzero if X contains any volatile memory references
1488 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1494 register RTX_CODE code;
1496 code = GET_CODE (x);
1515 case UNSPEC_VOLATILE:
1516 /* case TRAP_IF: This isn't clear yet. */
1521 if (MEM_VOLATILE_P (x))
1528 /* Recursively scan the operands of this expression. */
1531 register char *fmt = GET_RTX_FORMAT (code);
1534 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1538 if (volatile_refs_p (XEXP (x, i)))
1544 for (j = 0; j < XVECLEN (x, i); j++)
1545 if (volatile_refs_p (XVECEXP (x, i, j)))
1553 /* Similar to above, except that it also rejects register pre- and post-
1560 register RTX_CODE code;
1562 code = GET_CODE (x);
1580 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1581 when some combination can't be done. If we see one, don't think
1582 that we can simplify the expression. */
1583 return (GET_MODE (x) != VOIDmode);
1590 case UNSPEC_VOLATILE:
1591 /* case TRAP_IF: This isn't clear yet. */
1596 if (MEM_VOLATILE_P (x))
1603 /* Recursively scan the operands of this expression. */
1606 register char *fmt = GET_RTX_FORMAT (code);
1609 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1613 if (side_effects_p (XEXP (x, i)))
1619 for (j = 0; j < XVECLEN (x, i); j++)
1620 if (side_effects_p (XVECEXP (x, i, j)))
1628 /* Return nonzero if evaluating rtx X might cause a trap. */
1640 code = GET_CODE (x);
1643 /* Handle these cases quickly. */
1655 /* Conditional trap can trap! */
1656 case UNSPEC_VOLATILE:
1660 /* Memory ref can trap unless it's a static var or a stack slot. */
1662 return rtx_addr_can_trap_p (XEXP (x, 0));
1664 /* Division by a non-constant might trap. */
1669 if (! CONSTANT_P (XEXP (x, 1))
1670 || GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1672 /* This was const0_rtx, but by not using that,
1673 we can link this file into other programs. */
1674 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
1679 /* An EXPR_LIST is used to represent a function call. This
1680 certainly may trap. */
1684 /* Any floating arithmetic may trap. */
1685 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1689 fmt = GET_RTX_FORMAT (code);
1690 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1694 if (may_trap_p (XEXP (x, i)))
1697 else if (fmt[i] == 'E')
1700 for (j = 0; j < XVECLEN (x, i); j++)
1701 if (may_trap_p (XVECEXP (x, i, j)))
1708 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1709 i.e., an inequality. */
1712 inequality_comparisons_p (x)
1716 register int len, i;
1717 register enum rtx_code code = GET_CODE (x);
1746 len = GET_RTX_LENGTH (code);
1747 fmt = GET_RTX_FORMAT (code);
1749 for (i = 0; i < len; i++)
1753 if (inequality_comparisons_p (XEXP (x, i)))
1756 else if (fmt[i] == 'E')
1759 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1760 if (inequality_comparisons_p (XVECEXP (x, i, j)))
1768 /* Replace any occurrence of FROM in X with TO.
1770 Note that copying is not done so X must not be shared unless all copies
1771 are to be modified. */
1774 replace_rtx (x, from, to)
1783 /* Allow this function to make replacements in EXPR_LISTs. */
1787 fmt = GET_RTX_FORMAT (GET_CODE (x));
1788 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
1791 XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
1792 else if (fmt[i] == 'E')
1793 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1794 XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
1800 /* Throughout the rtx X, replace many registers according to REG_MAP.
1801 Return the replacement for X (which may be X with altered contents).
1802 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
1803 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
1805 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
1806 should not be mapped to pseudos or vice versa since validate_change
1809 If REPLACE_DEST is 1, replacements are also done in destinations;
1810 otherwise, only sources are replaced. */
1813 replace_regs (x, reg_map, nregs, replace_dest)
1819 register enum rtx_code code;
1826 code = GET_CODE (x);
1840 /* Verify that the register has an entry before trying to access it. */
1841 if (REGNO (x) < nregs && reg_map[REGNO (x)] != 0)
1843 /* SUBREGs can't be shared. Always return a copy to ensure that if
1844 this replacement occurs more than once then each instance will
1845 get distinct rtx. */
1846 if (GET_CODE (reg_map[REGNO (x)]) == SUBREG)
1847 return copy_rtx (reg_map[REGNO (x)]);
1848 return reg_map[REGNO (x)];
1853 /* Prevent making nested SUBREGs. */
1854 if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < nregs
1855 && reg_map[REGNO (SUBREG_REG (x))] != 0
1856 && GET_CODE (reg_map[REGNO (SUBREG_REG (x))]) == SUBREG)
1858 rtx map_val = reg_map[REGNO (SUBREG_REG (x))];
1859 rtx map_inner = SUBREG_REG (map_val);
1861 if (GET_MODE (x) == GET_MODE (map_inner))
1865 /* We cannot call gen_rtx here since we may be linked with
1867 /* Let's try clobbering the incoming SUBREG and see
1868 if this is really safe. */
1869 SUBREG_REG (x) = map_inner;
1870 SUBREG_WORD (x) += SUBREG_WORD (map_val);
1873 rtx new = rtx_alloc (SUBREG);
1874 PUT_MODE (new, GET_MODE (x));
1875 SUBREG_REG (new) = map_inner;
1876 SUBREG_WORD (new) = SUBREG_WORD (x) + SUBREG_WORD (map_val);
1884 SET_DEST (x) = replace_regs (SET_DEST (x), reg_map, nregs, 0);
1886 else if (GET_CODE (SET_DEST (x)) == MEM
1887 || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
1888 /* Even if we are not to replace destinations, replace register if it
1889 is CONTAINED in destination (destination is memory or
1890 STRICT_LOW_PART). */
1891 XEXP (SET_DEST (x), 0) = replace_regs (XEXP (SET_DEST (x), 0),
1893 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
1894 /* Similarly, for ZERO_EXTRACT we replace all operands. */
1897 SET_SRC (x) = replace_regs (SET_SRC (x), reg_map, nregs, 0);
1904 fmt = GET_RTX_FORMAT (code);
1905 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1908 XEXP (x, i) = replace_regs (XEXP (x, i), reg_map, nregs, replace_dest);
1912 for (j = 0; j < XVECLEN (x, i); j++)
1913 XVECEXP (x, i, j) = replace_regs (XVECEXP (x, i, j), reg_map,
1914 nregs, replace_dest);
1920 /* Return 1 if X, the SRC_SRC of SET of (pc) contain a REG or MEM that is
1921 not in the constant pool and not in the condition of an IF_THEN_ELSE. */
1924 jmp_uses_reg_or_mem (x)
1927 enum rtx_code code = GET_CODE (x);
1942 return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
1943 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
1946 return (jmp_uses_reg_or_mem (XEXP (x, 1))
1947 || jmp_uses_reg_or_mem (XEXP (x, 2)));
1949 case PLUS: case MINUS: case MULT:
1950 return (jmp_uses_reg_or_mem (XEXP (x, 0))
1951 || jmp_uses_reg_or_mem (XEXP (x, 1)));
1957 fmt = GET_RTX_FORMAT (code);
1958 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1961 && jmp_uses_reg_or_mem (XEXP (x, i)))
1965 for (j = 0; j < XVECLEN (x, i); j++)
1966 if (jmp_uses_reg_or_mem (XVECEXP (x, i, j)))
1973 /* Return nonzero if INSN is an indirect jump (aka computed jump).
1975 Tablejumps and casesi insns are not considered indirect jumps;
1976 we can recognize them by a (use (lael_ref)). */
1979 computed_jump_p (insn)
1983 if (GET_CODE (insn) == JUMP_INSN)
1985 rtx pat = PATTERN (insn);
1987 if (GET_CODE (pat) == PARALLEL)
1989 int len = XVECLEN (pat, 0);
1990 int has_use_labelref = 0;
1992 for (i = len - 1; i >= 0; i--)
1993 if (GET_CODE (XVECEXP (pat, 0, i)) == USE
1994 && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0))
1996 has_use_labelref = 1;
1998 if (! has_use_labelref)
1999 for (i = len - 1; i >= 0; i--)
2000 if (GET_CODE (XVECEXP (pat, 0, i)) == SET
2001 && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
2002 && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i))))
2005 else if (GET_CODE (pat) == SET
2006 && SET_DEST (pat) == pc_rtx
2007 && jmp_uses_reg_or_mem (SET_SRC (pat)))