1 /* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 88, 9-5, 1996 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. */
28 /* Bit flags that specify the machine subtype we are compiling for.
29 Bits are tested using macros TARGET_... defined in the tm.h file
30 and set by `-m...' switches. Must be defined in rtlanal.c. */
34 /* Return 1 if the value of X is unstable
35 (would be different at a different point in the program).
36 The frame pointer, arg pointer, etc. are considered stable
37 (within one function) and so is anything marked `unchanging'. */
43 register RTX_CODE code
= GET_CODE (x
);
48 return ! RTX_UNCHANGING_P (x
);
53 if (code
== CONST
|| code
== CONST_INT
)
57 return ! (REGNO (x
) == FRAME_POINTER_REGNUM
58 || REGNO (x
) == HARD_FRAME_POINTER_REGNUM
59 || REGNO (x
) == ARG_POINTER_REGNUM
60 || RTX_UNCHANGING_P (x
));
62 fmt
= GET_RTX_FORMAT (code
);
63 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
65 if (rtx_unstable_p (XEXP (x
, i
)))
70 /* Return 1 if X has a value that can vary even between two
71 executions of the program. 0 means X can be compared reliably
72 against certain constants or near-constants.
73 The frame pointer and the arg pointer are considered constant. */
79 register RTX_CODE code
= GET_CODE (x
);
97 /* Note that we have to test for the actual rtx used for the frame
98 and arg pointers and not just the register number in case we have
99 eliminated the frame and/or arg pointer and are using it
101 return ! (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
102 || x
== arg_pointer_rtx
);
105 /* The operand 0 of a LO_SUM is considered constant
106 (in fact is it related specifically to operand 1). */
107 return rtx_varies_p (XEXP (x
, 1));
110 fmt
= GET_RTX_FORMAT (code
);
111 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
113 if (rtx_varies_p (XEXP (x
, i
)))
118 /* Return 0 if the use of X as an address in a MEM can cause a trap. */
121 rtx_addr_can_trap_p (x
)
124 register enum rtx_code code
= GET_CODE (x
);
130 /* SYMBOL_REF is problematic due to the possible presence of
131 a #pragma weak, but to say that loads from symbols can trap is
132 *very* costly. It's not at all clear what's best here. For
133 now, we ignore the impact of #pragma weak. */
137 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
138 return ! (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
139 || x
== stack_pointer_rtx
|| x
== arg_pointer_rtx
);
142 return rtx_addr_can_trap_p (XEXP (x
, 0));
145 /* An address is assumed not to trap if it is an address that can't
146 trap plus a constant integer. */
147 return (rtx_addr_can_trap_p (XEXP (x
, 0))
148 || GET_CODE (XEXP (x
, 1)) != CONST_INT
);
151 return rtx_addr_can_trap_p (XEXP (x
, 1));
154 /* If it isn't one of the case above, it can cause a trap. */
158 /* Return 1 if X refers to a memory location whose address
159 cannot be compared reliably with constant addresses,
160 or if X refers to a BLKmode memory object. */
163 rtx_addr_varies_p (x
)
166 register enum rtx_code code
;
175 return GET_MODE (x
) == BLKmode
|| rtx_varies_p (XEXP (x
, 0));
177 fmt
= GET_RTX_FORMAT (code
);
178 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
181 if (rtx_addr_varies_p (XEXP (x
, i
)))
184 else if (fmt
[i
] == 'E')
187 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
188 if (rtx_addr_varies_p (XVECEXP (x
, i
, j
)))
194 /* Return the value of the integer term in X, if one is apparent;
196 Only obvious integer terms are detected.
197 This is used in cse.c with the `related_value' field.*/
203 if (GET_CODE (x
) == CONST
)
206 if (GET_CODE (x
) == MINUS
207 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
208 return - INTVAL (XEXP (x
, 1));
209 if (GET_CODE (x
) == PLUS
210 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
211 return INTVAL (XEXP (x
, 1));
215 /* If X is a constant, return the value sans apparent integer term;
217 Only obvious integer terms are detected. */
220 get_related_value (x
)
223 if (GET_CODE (x
) != CONST
)
226 if (GET_CODE (x
) == PLUS
227 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
229 else if (GET_CODE (x
) == MINUS
230 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
235 /* Nonzero if register REG appears somewhere within IN.
236 Also works if REG is not a register; in this case it checks
237 for a subexpression of IN that is Lisp "equal" to REG. */
240 reg_mentioned_p (reg
, in
)
241 register rtx reg
, in
;
245 register enum rtx_code code
;
253 if (GET_CODE (in
) == LABEL_REF
)
254 return reg
== XEXP (in
, 0);
256 code
= GET_CODE (in
);
260 /* Compare registers by number. */
262 return GET_CODE (reg
) == REG
&& REGNO (in
) == REGNO (reg
);
264 /* These codes have no constituent expressions
272 return GET_CODE (reg
) == CONST_INT
&& INTVAL (in
) == INTVAL (reg
);
275 /* These are kept unique for a given value. */
279 if (GET_CODE (reg
) == code
&& rtx_equal_p (reg
, in
))
282 fmt
= GET_RTX_FORMAT (code
);
284 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
289 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; j
--)
290 if (reg_mentioned_p (reg
, XVECEXP (in
, i
, j
)))
293 else if (fmt
[i
] == 'e'
294 && reg_mentioned_p (reg
, XEXP (in
, i
)))
300 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
301 no CODE_LABEL insn. */
304 no_labels_between_p (beg
, end
)
308 for (p
= NEXT_INSN (beg
); p
!= end
; p
= NEXT_INSN (p
))
309 if (GET_CODE (p
) == CODE_LABEL
)
314 /* Nonzero if register REG is used in an insn between
315 FROM_INSN and TO_INSN (exclusive of those two). */
318 reg_used_between_p (reg
, from_insn
, to_insn
)
319 rtx reg
, from_insn
, to_insn
;
323 if (from_insn
== to_insn
)
326 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
327 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
328 && (reg_overlap_mentioned_p (reg
, PATTERN (insn
))
329 || (GET_CODE (insn
) == CALL_INSN
330 && (find_reg_fusage (insn
, USE
, reg
)
331 || find_reg_fusage (insn
, CLOBBER
, reg
)))))
336 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
337 is entirely replaced by a new value and the only use is as a SET_DEST,
338 we do not consider it a reference. */
341 reg_referenced_p (x
, body
)
347 switch (GET_CODE (body
))
350 if (reg_overlap_mentioned_p (x
, SET_SRC (body
)))
353 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
354 of a REG that occupies all of the REG, the insn references X if
355 it is mentioned in the destination. */
356 if (GET_CODE (SET_DEST (body
)) != CC0
357 && GET_CODE (SET_DEST (body
)) != PC
358 && GET_CODE (SET_DEST (body
)) != REG
359 && ! (GET_CODE (SET_DEST (body
)) == SUBREG
360 && GET_CODE (SUBREG_REG (SET_DEST (body
))) == REG
361 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body
))))
362 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)
363 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body
)))
364 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)))
365 && reg_overlap_mentioned_p (x
, SET_DEST (body
)))
370 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
371 if (reg_overlap_mentioned_p (x
, ASM_OPERANDS_INPUT (body
, i
)))
377 return reg_overlap_mentioned_p (x
, body
);
380 return reg_overlap_mentioned_p (x
, TRAP_CONDITION (body
));
383 case UNSPEC_VOLATILE
:
385 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
386 if (reg_referenced_p (x
, XVECEXP (body
, 0, i
)))
394 /* Nonzero if register REG is referenced in an insn between
395 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
399 reg_referenced_between_p (reg
, from_insn
, to_insn
)
400 rtx reg
, from_insn
, to_insn
;
404 if (from_insn
== to_insn
)
407 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
408 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
409 && (reg_referenced_p (reg
, PATTERN (insn
))
410 || (GET_CODE (insn
) == CALL_INSN
411 && find_reg_fusage (insn
, USE
, reg
))))
416 /* Nonzero if register REG is set or clobbered in an insn between
417 FROM_INSN and TO_INSN (exclusive of those two). */
420 reg_set_between_p (reg
, from_insn
, to_insn
)
421 rtx reg
, from_insn
, to_insn
;
425 if (from_insn
== to_insn
)
428 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
429 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
430 && reg_set_p (reg
, insn
))
435 /* Internals of reg_set_between_p. */
437 static rtx reg_set_reg
;
438 static int reg_set_flag
;
444 /* We don't want to return 1 if X is a MEM that contains a register
445 within REG_SET_REG. */
447 if ((GET_CODE (x
) != MEM
)
448 && reg_overlap_mentioned_p (reg_set_reg
, x
))
453 reg_set_p (reg
, insn
)
458 /* We can be passed an insn or part of one. If we are passed an insn,
459 check if a side-effect of the insn clobbers REG. */
460 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
462 if (FIND_REG_INC_NOTE (insn
, reg
)
463 || (GET_CODE (insn
) == CALL_INSN
464 /* We'd like to test call_used_regs here, but rtlanal.c can't
465 reference that variable due to its use in genattrtab. So
466 we'll just be more conservative.
468 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
469 information holds all clobbered registers. */
470 && ((GET_CODE (reg
) == REG
471 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
472 || GET_CODE (reg
) == MEM
473 || find_reg_fusage (insn
, CLOBBER
, reg
))))
476 body
= PATTERN (insn
);
481 note_stores (body
, reg_set_p_1
);
485 /* Similar to reg_set_between_p, but check all registers in X. Return 0
486 only if none of them are modified between START and END. Return 1 if
487 X contains a MEM; this routine does not perform any memory aliasing. */
490 modified_between_p (x
, start
, end
)
494 enum rtx_code code
= GET_CODE (x
);
512 /* If the memory is not constant, assume it is modified. If it is
513 constant, we still have to check the address. */
514 if (! RTX_UNCHANGING_P (x
))
519 return reg_set_between_p (x
, start
, end
);
522 fmt
= GET_RTX_FORMAT (code
);
523 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
525 if (fmt
[i
] == 'e' && modified_between_p (XEXP (x
, i
), start
, end
))
529 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
530 if (modified_between_p (XVECEXP (x
, i
, j
), start
, end
))
537 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
538 of them are modified in INSN. Return 1 if X contains a MEM; this routine
539 does not perform any memory aliasing. */
542 modified_in_p (x
, insn
)
546 enum rtx_code code
= GET_CODE (x
);
564 /* If the memory is not constant, assume it is modified. If it is
565 constant, we still have to check the address. */
566 if (! RTX_UNCHANGING_P (x
))
571 return reg_set_p (x
, insn
);
574 fmt
= GET_RTX_FORMAT (code
);
575 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
577 if (fmt
[i
] == 'e' && modified_in_p (XEXP (x
, i
), insn
))
581 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
582 if (modified_in_p (XVECEXP (x
, i
, j
), insn
))
589 /* Given an INSN, return a SET expression if this insn has only a single SET.
590 It may also have CLOBBERs, USEs, or SET whose output
591 will not be used, which we ignore. */
600 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
603 if (GET_CODE (PATTERN (insn
)) == SET
)
604 return PATTERN (insn
);
606 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
608 for (i
= 0, set
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
609 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, i
)) == SET
610 && (! find_reg_note (insn
, REG_UNUSED
,
611 SET_DEST (XVECEXP (PATTERN (insn
), 0, i
)))
612 || side_effects_p (XVECEXP (PATTERN (insn
), 0, i
))))
617 set
= XVECEXP (PATTERN (insn
), 0, i
);
625 /* Return the last thing that X was assigned from before *PINSN. Verify that
626 the object is not modified up to VALID_TO. If it was, if we hit
627 a partial assignment to X, or hit a CODE_LABEL first, return X. If we
628 found an assignment, update *PINSN to point to it. */
631 find_last_value (x
, pinsn
, valid_to
)
638 for (p
= PREV_INSN (*pinsn
); p
&& GET_CODE (p
) != CODE_LABEL
;
640 if (GET_RTX_CLASS (GET_CODE (p
)) == 'i')
642 rtx set
= single_set (p
);
643 rtx note
= find_reg_note (p
, REG_EQUAL
, NULL_RTX
);
645 if (set
&& rtx_equal_p (x
, SET_DEST (set
)))
647 rtx src
= SET_SRC (set
);
649 if (note
&& GET_CODE (XEXP (note
, 0)) != EXPR_LIST
)
650 src
= XEXP (note
, 0);
652 if (! modified_between_p (src
, PREV_INSN (p
), valid_to
)
653 /* Reject hard registers because we don't usually want
654 to use them; we'd rather use a pseudo. */
655 && ! (GET_CODE (src
) == REG
656 && REGNO (src
) < FIRST_PSEUDO_REGISTER
))
663 /* If set in non-simple way, we don't have a value. */
664 if (reg_set_p (x
, p
))
671 /* Return nonzero if register in range [REGNO, ENDREGNO)
672 appears either explicitly or implicitly in X
673 other than being stored into.
675 References contained within the substructure at LOC do not count.
676 LOC may be zero, meaning don't ignore anything. */
679 refers_to_regno_p (regno
, endregno
, x
, loc
)
685 register RTX_CODE code
;
689 /* The contents of a REG_NONNEG note is always zero, so we must come here
690 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
701 /* If we modifying the stack, frame, or argument pointer, it will
702 clobber a virtual register. In fact, we could be more precise,
703 but it isn't worth it. */
704 if ((i
== STACK_POINTER_REGNUM
705 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
706 || i
== ARG_POINTER_REGNUM
708 || i
== FRAME_POINTER_REGNUM
)
709 && regno
>= FIRST_VIRTUAL_REGISTER
&& regno
<= LAST_VIRTUAL_REGISTER
)
713 && regno
< i
+ (i
< FIRST_PSEUDO_REGISTER
714 ? HARD_REGNO_NREGS (i
, GET_MODE (x
))
718 /* If this is a SUBREG of a hard reg, we can see exactly which
719 registers are being modified. Otherwise, handle normally. */
720 if (GET_CODE (SUBREG_REG (x
)) == REG
721 && REGNO (SUBREG_REG (x
)) < FIRST_PSEUDO_REGISTER
)
723 int inner_regno
= REGNO (SUBREG_REG (x
)) + SUBREG_WORD (x
);
725 = inner_regno
+ (inner_regno
< FIRST_PSEUDO_REGISTER
726 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
728 return endregno
> inner_regno
&& regno
< inner_endregno
;
734 if (&SET_DEST (x
) != loc
735 /* Note setting a SUBREG counts as referring to the REG it is in for
736 a pseudo but not for hard registers since we can
737 treat each word individually. */
738 && ((GET_CODE (SET_DEST (x
)) == SUBREG
739 && loc
!= &SUBREG_REG (SET_DEST (x
))
740 && GET_CODE (SUBREG_REG (SET_DEST (x
))) == REG
741 && REGNO (SUBREG_REG (SET_DEST (x
))) >= FIRST_PSEUDO_REGISTER
742 && refers_to_regno_p (regno
, endregno
,
743 SUBREG_REG (SET_DEST (x
)), loc
))
744 || (GET_CODE (SET_DEST (x
)) != REG
745 && refers_to_regno_p (regno
, endregno
, SET_DEST (x
), loc
))))
748 if (code
== CLOBBER
|| loc
== &SET_SRC (x
))
754 /* X does not match, so try its subexpressions. */
756 fmt
= GET_RTX_FORMAT (code
);
757 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
759 if (fmt
[i
] == 'e' && loc
!= &XEXP (x
, i
))
767 if (refers_to_regno_p (regno
, endregno
, XEXP (x
, i
), loc
))
770 else if (fmt
[i
] == 'E')
773 for (j
= XVECLEN (x
, i
) - 1; j
>=0; j
--)
774 if (loc
!= &XVECEXP (x
, i
, j
)
775 && refers_to_regno_p (regno
, endregno
, XVECEXP (x
, i
, j
), loc
))
782 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
783 we check if any register number in X conflicts with the relevant register
784 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
785 contains a MEM (we don't bother checking for memory addresses that can't
786 conflict because we expect this to be a rare case. */
789 reg_overlap_mentioned_p (x
, in
)
794 if (GET_CODE (x
) == SUBREG
)
796 regno
= REGNO (SUBREG_REG (x
));
797 if (regno
< FIRST_PSEUDO_REGISTER
)
798 regno
+= SUBREG_WORD (x
);
800 else if (GET_CODE (x
) == REG
)
802 else if (CONSTANT_P (x
))
804 else if (GET_CODE (x
) == MEM
)
809 if (GET_CODE (in
) == MEM
)
812 fmt
= GET_RTX_FORMAT (GET_CODE (in
));
814 for (i
= GET_RTX_LENGTH (GET_CODE (in
)) - 1; i
>= 0; i
--)
815 if (fmt
[i
] == 'e' && reg_overlap_mentioned_p (x
, XEXP (in
, i
)))
820 else if (GET_CODE (x
) == SCRATCH
|| GET_CODE (x
) == PC
821 || GET_CODE (x
) == CC0
)
822 return reg_mentioned_p (x
, in
);
826 endregno
= regno
+ (regno
< FIRST_PSEUDO_REGISTER
827 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
829 return refers_to_regno_p (regno
, endregno
, in
, NULL_PTR
);
832 /* Used for communications between the next few functions. */
834 static int reg_set_last_unknown
;
835 static rtx reg_set_last_value
;
836 static int reg_set_last_first_regno
, reg_set_last_last_regno
;
838 /* Called via note_stores from reg_set_last. */
841 reg_set_last_1 (x
, pat
)
847 /* If X is not a register, or is not one in the range we care
849 if (GET_CODE (x
) != REG
)
853 last
= first
+ (first
< FIRST_PSEUDO_REGISTER
854 ? HARD_REGNO_NREGS (first
, GET_MODE (x
)) : 1);
856 if (first
>= reg_set_last_last_regno
857 || last
<= reg_set_last_first_regno
)
860 /* If this is a CLOBBER or is some complex LHS, or doesn't modify
861 exactly the registers we care about, show we don't know the value. */
862 if (GET_CODE (pat
) == CLOBBER
|| SET_DEST (pat
) != x
863 || first
!= reg_set_last_first_regno
864 || last
!= reg_set_last_last_regno
)
865 reg_set_last_unknown
= 1;
867 reg_set_last_value
= SET_SRC (pat
);
870 /* Return the last value to which REG was set prior to INSN. If we can't
871 find it easily, return 0.
873 We only return a REG, SUBREG, or constant because it is too hard to
874 check if a MEM remains unchanged. */
877 reg_set_last (x
, insn
)
881 rtx orig_insn
= insn
;
883 reg_set_last_first_regno
= REGNO (x
);
885 reg_set_last_last_regno
886 = reg_set_last_first_regno
887 + (reg_set_last_first_regno
< FIRST_PSEUDO_REGISTER
888 ? HARD_REGNO_NREGS (reg_set_last_first_regno
, GET_MODE (x
)) : 1);
890 reg_set_last_unknown
= 0;
891 reg_set_last_value
= 0;
893 /* Scan backwards until reg_set_last_1 changed one of the above flags.
894 Stop when we reach a label or X is a hard reg and we reach a
895 CALL_INSN (if reg_set_last_last_regno is a hard reg).
897 If we find a set of X, ensure that its SET_SRC remains unchanged. */
899 /* We compare with <= here, because reg_set_last_last_regno
900 is actually the number of the first reg *not* in X. */
902 insn
&& GET_CODE (insn
) != CODE_LABEL
903 && ! (GET_CODE (insn
) == CALL_INSN
904 && reg_set_last_last_regno
<= FIRST_PSEUDO_REGISTER
);
905 insn
= PREV_INSN (insn
))
906 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
908 note_stores (PATTERN (insn
), reg_set_last_1
);
909 if (reg_set_last_unknown
)
911 else if (reg_set_last_value
)
913 if (CONSTANT_P (reg_set_last_value
)
914 || ((GET_CODE (reg_set_last_value
) == REG
915 || GET_CODE (reg_set_last_value
) == SUBREG
)
916 && ! reg_set_between_p (reg_set_last_value
,
918 return reg_set_last_value
;
927 /* This is 1 until after the rtl generation pass. */
928 int rtx_equal_function_value_matters
;
930 /* Return 1 if X and Y are identical-looking rtx's.
931 This is the Lisp function EQUAL for rtx arguments. */
939 register enum rtx_code code
;
944 if (x
== 0 || y
== 0)
948 /* Rtx's of different codes cannot be equal. */
949 if (code
!= GET_CODE (y
))
952 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
953 (REG:SI x) and (REG:HI x) are NOT equivalent. */
955 if (GET_MODE (x
) != GET_MODE (y
))
958 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
961 /* Until rtl generation is complete, don't consider a reference to the
962 return register of the current function the same as the return from a
963 called function. This eases the job of function integration. Once the
964 distinction is no longer needed, they can be considered equivalent. */
965 return (REGNO (x
) == REGNO (y
)
966 && (! rtx_equal_function_value_matters
967 || REG_FUNCTION_VALUE_P (x
) == REG_FUNCTION_VALUE_P (y
)));
968 else if (code
== LABEL_REF
)
969 return XEXP (x
, 0) == XEXP (y
, 0);
970 else if (code
== SYMBOL_REF
)
971 return XSTR (x
, 0) == XSTR (y
, 0);
972 else if (code
== SCRATCH
|| code
== CONST_DOUBLE
)
975 /* Compare the elements. If any pair of corresponding elements
976 fail to match, return 0 for the whole things. */
978 fmt
= GET_RTX_FORMAT (code
);
979 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
984 if (XWINT (x
, i
) != XWINT (y
, i
))
990 if (XINT (x
, i
) != XINT (y
, i
))
996 /* Two vectors must have the same length. */
997 if (XVECLEN (x
, i
) != XVECLEN (y
, i
))
1000 /* And the corresponding elements must match. */
1001 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1002 if (rtx_equal_p (XVECEXP (x
, i
, j
), XVECEXP (y
, i
, j
)) == 0)
1007 if (rtx_equal_p (XEXP (x
, i
), XEXP (y
, i
)) == 0)
1013 if (strcmp (XSTR (x
, i
), XSTR (y
, i
)))
1018 /* These are just backpointers, so they don't matter. */
1024 /* It is believed that rtx's at this level will never
1025 contain anything but integers and other rtx's,
1026 except for within LABEL_REFs and SYMBOL_REFs. */
1034 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1035 (X would be the pattern of an insn).
1036 FUN receives two arguments:
1037 the REG, MEM, CC0 or PC being stored in or clobbered,
1038 the SET or CLOBBER rtx that does the store.
1040 If the item being stored in or clobbered is a SUBREG of a hard register,
1041 the SUBREG will be passed. */
1044 note_stores (x
, fun
)
1048 if ((GET_CODE (x
) == SET
|| GET_CODE (x
) == CLOBBER
))
1050 register rtx dest
= SET_DEST (x
);
1051 while ((GET_CODE (dest
) == SUBREG
1052 && (GET_CODE (SUBREG_REG (dest
)) != REG
1053 || REGNO (SUBREG_REG (dest
)) >= FIRST_PSEUDO_REGISTER
))
1054 || GET_CODE (dest
) == ZERO_EXTRACT
1055 || GET_CODE (dest
) == SIGN_EXTRACT
1056 || GET_CODE (dest
) == STRICT_LOW_PART
)
1057 dest
= XEXP (dest
, 0);
1060 else if (GET_CODE (x
) == PARALLEL
)
1063 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1065 register rtx y
= XVECEXP (x
, 0, i
);
1066 if (GET_CODE (y
) == SET
|| GET_CODE (y
) == CLOBBER
)
1068 register rtx dest
= SET_DEST (y
);
1069 while ((GET_CODE (dest
) == SUBREG
1070 && (GET_CODE (SUBREG_REG (dest
)) != REG
1071 || (REGNO (SUBREG_REG (dest
))
1072 >= FIRST_PSEUDO_REGISTER
)))
1073 || GET_CODE (dest
) == ZERO_EXTRACT
1074 || GET_CODE (dest
) == SIGN_EXTRACT
1075 || GET_CODE (dest
) == STRICT_LOW_PART
)
1076 dest
= XEXP (dest
, 0);
1083 /* Return nonzero if X's old contents don't survive after INSN.
1084 This will be true if X is (cc0) or if X is a register and
1085 X dies in INSN or because INSN entirely sets X.
1087 "Entirely set" means set directly and not through a SUBREG,
1088 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1089 Likewise, REG_INC does not count.
1091 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1092 but for this use that makes no difference, since regs don't overlap
1093 during their lifetimes. Therefore, this function may be used
1094 at any time after deaths have been computed (in flow.c).
1096 If REG is a hard reg that occupies multiple machine registers, this
1097 function will only return 1 if each of those registers will be replaced
1101 dead_or_set_p (insn
, x
)
1105 register int regno
, last_regno
;
1108 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1109 if (GET_CODE (x
) == CC0
)
1112 if (GET_CODE (x
) != REG
)
1116 last_regno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
1117 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (x
)) - 1);
1119 for (i
= regno
; i
<= last_regno
; i
++)
1120 if (! dead_or_set_regno_p (insn
, i
))
1126 /* Utility function for dead_or_set_p to check an individual register. Also
1127 called from flow.c. */
1130 dead_or_set_regno_p (insn
, test_regno
)
1134 int regno
, endregno
;
1137 /* See if there is a death note for something that includes TEST_REGNO. */
1138 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1140 if (REG_NOTE_KIND (link
) != REG_DEAD
|| GET_CODE (XEXP (link
, 0)) != REG
)
1143 regno
= REGNO (XEXP (link
, 0));
1144 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1145 : regno
+ HARD_REGNO_NREGS (regno
,
1146 GET_MODE (XEXP (link
, 0))));
1148 if (test_regno
>= regno
&& test_regno
< endregno
)
1152 if (GET_CODE (insn
) == CALL_INSN
1153 && find_regno_fusage (insn
, CLOBBER
, test_regno
))
1156 if (GET_CODE (PATTERN (insn
)) == SET
)
1158 rtx dest
= SET_DEST (PATTERN (insn
));
1160 /* A value is totally replaced if it is the destination or the
1161 destination is a SUBREG of REGNO that does not change the number of
1163 if (GET_CODE (dest
) == SUBREG
1164 && (((GET_MODE_SIZE (GET_MODE (dest
))
1165 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1166 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1167 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1168 dest
= SUBREG_REG (dest
);
1170 if (GET_CODE (dest
) != REG
)
1173 regno
= REGNO (dest
);
1174 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1175 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1177 return (test_regno
>= regno
&& test_regno
< endregno
);
1179 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
1183 for (i
= XVECLEN (PATTERN (insn
), 0) - 1; i
>= 0; i
--)
1185 rtx body
= XVECEXP (PATTERN (insn
), 0, i
);
1187 if (GET_CODE (body
) == SET
|| GET_CODE (body
) == CLOBBER
)
1189 rtx dest
= SET_DEST (body
);
1191 if (GET_CODE (dest
) == SUBREG
1192 && (((GET_MODE_SIZE (GET_MODE (dest
))
1193 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1194 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1195 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1196 dest
= SUBREG_REG (dest
);
1198 if (GET_CODE (dest
) != REG
)
1201 regno
= REGNO (dest
);
1202 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1203 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1205 if (test_regno
>= regno
&& test_regno
< endregno
)
1214 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1215 If DATUM is nonzero, look for one whose datum is DATUM. */
1218 find_reg_note (insn
, kind
, datum
)
1225 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1226 if (REG_NOTE_KIND (link
) == kind
1227 && (datum
== 0 || datum
== XEXP (link
, 0)))
1232 /* Return the reg-note of kind KIND in insn INSN which applies to register
1233 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1234 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1235 it might be the case that the note overlaps REGNO. */
1238 find_regno_note (insn
, kind
, regno
)
1245 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1246 if (REG_NOTE_KIND (link
) == kind
1247 /* Verify that it is a register, so that scratch and MEM won't cause a
1249 && GET_CODE (XEXP (link
, 0)) == REG
1250 && REGNO (XEXP (link
, 0)) <= regno
1251 && ((REGNO (XEXP (link
, 0))
1252 + (REGNO (XEXP (link
, 0)) >= FIRST_PSEUDO_REGISTER
? 1
1253 : HARD_REGNO_NREGS (REGNO (XEXP (link
, 0)),
1254 GET_MODE (XEXP (link
, 0)))))
1260 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1261 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1264 find_reg_fusage (insn
, code
, datum
)
1269 /* If it's not a CALL_INSN, it can't possibly have a
1270 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1271 if (GET_CODE (insn
) != CALL_INSN
)
1277 if (GET_CODE (datum
) != REG
)
1281 for (link
= CALL_INSN_FUNCTION_USAGE (insn
);
1283 link
= XEXP (link
, 1))
1284 if (GET_CODE (XEXP (link
, 0)) == code
1285 && rtx_equal_p (datum
, SET_DEST (XEXP (link
, 0))))
1290 register int regno
= REGNO (datum
);
1292 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1293 to pseudo registers, so don't bother checking. */
1295 if (regno
< FIRST_PSEUDO_REGISTER
)
1297 int end_regno
= regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (datum
));
1300 for (i
= regno
; i
< end_regno
; i
++)
1301 if (find_regno_fusage (insn
, code
, i
))
1309 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1310 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1313 find_regno_fusage (insn
, code
, regno
)
1320 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1321 to pseudo registers, so don't bother checking. */
1323 if (regno
>= FIRST_PSEUDO_REGISTER
1324 || GET_CODE (insn
) != CALL_INSN
)
1327 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
1329 register int regnote
;
1332 if (GET_CODE (op
= XEXP (link
, 0)) == code
1333 && GET_CODE (SET_DEST (op
)) == REG
1334 && (regnote
= REGNO (SET_DEST (op
))) <= regno
1336 + HARD_REGNO_NREGS (regnote
, GET_MODE (SET_DEST (op
)))
1344 /* Remove register note NOTE from the REG_NOTES of INSN. */
1347 remove_note (insn
, note
)
1353 if (REG_NOTES (insn
) == note
)
1355 REG_NOTES (insn
) = XEXP (note
, 1);
1359 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1360 if (XEXP (link
, 1) == note
)
1362 XEXP (link
, 1) = XEXP (note
, 1);
1369 /* Nonzero if X contains any volatile instructions. These are instructions
1370 which may cause unpredictable machine state instructions, and thus no
1371 instructions should be moved or combined across them. This includes
1372 only volatile asms and UNSPEC_VOLATILE instructions. */
1378 register RTX_CODE code
;
1380 code
= GET_CODE (x
);
1400 case UNSPEC_VOLATILE
:
1401 /* case TRAP_IF: This isn't clear yet. */
1405 if (MEM_VOLATILE_P (x
))
1409 /* Recursively scan the operands of this expression. */
1412 register char *fmt
= GET_RTX_FORMAT (code
);
1415 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1419 if (volatile_insn_p (XEXP (x
, i
)))
1425 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1426 if (volatile_insn_p (XVECEXP (x
, i
, j
)))
1434 /* Nonzero if X contains any volatile memory references
1435 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1441 register RTX_CODE code
;
1443 code
= GET_CODE (x
);
1462 case UNSPEC_VOLATILE
:
1463 /* case TRAP_IF: This isn't clear yet. */
1468 if (MEM_VOLATILE_P (x
))
1472 /* Recursively scan the operands of this expression. */
1475 register char *fmt
= GET_RTX_FORMAT (code
);
1478 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1482 if (volatile_refs_p (XEXP (x
, i
)))
1488 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1489 if (volatile_refs_p (XVECEXP (x
, i
, j
)))
1497 /* Similar to above, except that it also rejects register pre- and post-
1504 register RTX_CODE code
;
1506 code
= GET_CODE (x
);
1524 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1525 when some combination can't be done. If we see one, don't think
1526 that we can simplify the expression. */
1527 return (GET_MODE (x
) != VOIDmode
);
1534 case UNSPEC_VOLATILE
:
1535 /* case TRAP_IF: This isn't clear yet. */
1540 if (MEM_VOLATILE_P (x
))
1544 /* Recursively scan the operands of this expression. */
1547 register char *fmt
= GET_RTX_FORMAT (code
);
1550 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1554 if (side_effects_p (XEXP (x
, i
)))
1560 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1561 if (side_effects_p (XVECEXP (x
, i
, j
)))
1569 /* Return nonzero if evaluating rtx X might cause a trap. */
1581 code
= GET_CODE (x
);
1584 /* Handle these cases quickly. */
1596 /* Conditional trap can trap! */
1597 case UNSPEC_VOLATILE
:
1601 /* Memory ref can trap unless it's a static var or a stack slot. */
1603 return rtx_addr_can_trap_p (XEXP (x
, 0));
1605 /* Division by a non-constant might trap. */
1610 if (! CONSTANT_P (XEXP (x
, 1)))
1612 /* This was const0_rtx, but by not using that,
1613 we can link this file into other programs. */
1614 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
&& INTVAL (XEXP (x
, 1)) == 0)
1617 /* An EXPR_LIST is used to represent a function call. This
1618 certainly may trap. */
1621 /* Any floating arithmetic may trap. */
1622 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
1626 fmt
= GET_RTX_FORMAT (code
);
1627 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1631 if (may_trap_p (XEXP (x
, i
)))
1634 else if (fmt
[i
] == 'E')
1637 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1638 if (may_trap_p (XVECEXP (x
, i
, j
)))
1645 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1646 i.e., an inequality. */
1649 inequality_comparisons_p (x
)
1653 register int len
, i
;
1654 register enum rtx_code code
= GET_CODE (x
);
1680 len
= GET_RTX_LENGTH (code
);
1681 fmt
= GET_RTX_FORMAT (code
);
1683 for (i
= 0; i
< len
; i
++)
1687 if (inequality_comparisons_p (XEXP (x
, i
)))
1690 else if (fmt
[i
] == 'E')
1693 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1694 if (inequality_comparisons_p (XVECEXP (x
, i
, j
)))
1702 /* Replace any occurrence of FROM in X with TO.
1704 Note that copying is not done so X must not be shared unless all copies
1705 are to be modified. */
1708 replace_rtx (x
, from
, to
)
1717 /* Allow this function to make replacements in EXPR_LISTs. */
1721 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
1722 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
1725 XEXP (x
, i
) = replace_rtx (XEXP (x
, i
), from
, to
);
1726 else if (fmt
[i
] == 'E')
1727 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1728 XVECEXP (x
, i
, j
) = replace_rtx (XVECEXP (x
, i
, j
), from
, to
);
1734 /* Throughout the rtx X, replace many registers according to REG_MAP.
1735 Return the replacement for X (which may be X with altered contents).
1736 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
1737 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
1739 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
1740 should not be mapped to pseudos or vice versa since validate_change
1743 If REPLACE_DEST is 1, replacements are also done in destinations;
1744 otherwise, only sources are replaced. */
1747 replace_regs (x
, reg_map
, nregs
, replace_dest
)
1753 register enum rtx_code code
;
1760 code
= GET_CODE (x
);
1774 /* Verify that the register has an entry before trying to access it. */
1775 if (REGNO (x
) < nregs
&& reg_map
[REGNO (x
)] != 0)
1777 /* SUBREGs can't be shared. Always return a copy to ensure that if
1778 this replacement occurs more than once then each instance will
1779 get distinct rtx. */
1780 if (GET_CODE (reg_map
[REGNO (x
)]) == SUBREG
)
1781 return copy_rtx (reg_map
[REGNO (x
)]);
1782 return reg_map
[REGNO (x
)];
1787 /* Prevent making nested SUBREGs. */
1788 if (GET_CODE (SUBREG_REG (x
)) == REG
&& REGNO (SUBREG_REG (x
)) < nregs
1789 && reg_map
[REGNO (SUBREG_REG (x
))] != 0
1790 && GET_CODE (reg_map
[REGNO (SUBREG_REG (x
))]) == SUBREG
)
1792 rtx map_val
= reg_map
[REGNO (SUBREG_REG (x
))];
1793 rtx map_inner
= SUBREG_REG (map_val
);
1795 if (GET_MODE (x
) == GET_MODE (map_inner
))
1799 /* We cannot call gen_rtx here since we may be linked with
1801 /* Let's try clobbering the incoming SUBREG and see
1802 if this is really safe. */
1803 SUBREG_REG (x
) = map_inner
;
1804 SUBREG_WORD (x
) += SUBREG_WORD (map_val
);
1807 rtx
new = rtx_alloc (SUBREG
);
1808 PUT_MODE (new, GET_MODE (x
));
1809 SUBREG_REG (new) = map_inner
;
1810 SUBREG_WORD (new) = SUBREG_WORD (x
) + SUBREG_WORD (map_val
);
1818 SET_DEST (x
) = replace_regs (SET_DEST (x
), reg_map
, nregs
, 0);
1820 else if (GET_CODE (SET_DEST (x
)) == MEM
1821 || GET_CODE (SET_DEST (x
)) == STRICT_LOW_PART
)
1822 /* Even if we are not to replace destinations, replace register if it
1823 is CONTAINED in destination (destination is memory or
1824 STRICT_LOW_PART). */
1825 XEXP (SET_DEST (x
), 0) = replace_regs (XEXP (SET_DEST (x
), 0),
1827 else if (GET_CODE (SET_DEST (x
)) == ZERO_EXTRACT
)
1828 /* Similarly, for ZERO_EXTRACT we replace all operands. */
1831 SET_SRC (x
) = replace_regs (SET_SRC (x
), reg_map
, nregs
, 0);
1835 fmt
= GET_RTX_FORMAT (code
);
1836 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1839 XEXP (x
, i
) = replace_regs (XEXP (x
, i
), reg_map
, nregs
, replace_dest
);
1843 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1844 XVECEXP (x
, i
, j
) = replace_regs (XVECEXP (x
, i
, j
), reg_map
,
1845 nregs
, replace_dest
);