1 /* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 88, 92-98, 1999 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 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
330 no JUMP_INSN insn. */
333 no_jumps_between_p (beg
, end
)
337 for (p
= NEXT_INSN (beg
); p
!= end
; p
= NEXT_INSN (p
))
338 if (GET_CODE (p
) == JUMP_INSN
)
343 /* Nonzero if register REG is used in an insn between
344 FROM_INSN and TO_INSN (exclusive of those two). */
347 reg_used_between_p (reg
, from_insn
, to_insn
)
348 rtx reg
, from_insn
, to_insn
;
352 if (from_insn
== to_insn
)
355 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
356 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
357 && (reg_overlap_mentioned_p (reg
, PATTERN (insn
))
358 || (GET_CODE (insn
) == CALL_INSN
359 && (find_reg_fusage (insn
, USE
, reg
)
360 || find_reg_fusage (insn
, CLOBBER
, reg
)))))
365 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
366 is entirely replaced by a new value and the only use is as a SET_DEST,
367 we do not consider it a reference. */
370 reg_referenced_p (x
, body
)
376 switch (GET_CODE (body
))
379 if (reg_overlap_mentioned_p (x
, SET_SRC (body
)))
382 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
383 of a REG that occupies all of the REG, the insn references X if
384 it is mentioned in the destination. */
385 if (GET_CODE (SET_DEST (body
)) != CC0
386 && GET_CODE (SET_DEST (body
)) != PC
387 && GET_CODE (SET_DEST (body
)) != REG
388 && ! (GET_CODE (SET_DEST (body
)) == SUBREG
389 && GET_CODE (SUBREG_REG (SET_DEST (body
))) == REG
390 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body
))))
391 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)
392 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body
)))
393 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)))
394 && reg_overlap_mentioned_p (x
, SET_DEST (body
)))
399 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
400 if (reg_overlap_mentioned_p (x
, ASM_OPERANDS_INPUT (body
, i
)))
406 return reg_overlap_mentioned_p (x
, body
);
409 return reg_overlap_mentioned_p (x
, TRAP_CONDITION (body
));
412 case UNSPEC_VOLATILE
:
414 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
415 if (reg_referenced_p (x
, XVECEXP (body
, 0, i
)))
424 /* Nonzero if register REG is referenced in an insn between
425 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
429 reg_referenced_between_p (reg
, from_insn
, to_insn
)
430 rtx reg
, from_insn
, to_insn
;
434 if (from_insn
== to_insn
)
437 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
438 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
439 && (reg_referenced_p (reg
, PATTERN (insn
))
440 || (GET_CODE (insn
) == CALL_INSN
441 && find_reg_fusage (insn
, USE
, reg
))))
446 /* Nonzero if register REG is set or clobbered in an insn between
447 FROM_INSN and TO_INSN (exclusive of those two). */
450 reg_set_between_p (reg
, from_insn
, to_insn
)
451 rtx reg
, from_insn
, to_insn
;
455 if (from_insn
== to_insn
)
458 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
459 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
460 && reg_set_p (reg
, insn
))
465 /* Internals of reg_set_between_p. */
467 static rtx reg_set_reg
;
468 static int reg_set_flag
;
473 rtx pat ATTRIBUTE_UNUSED
;
475 /* We don't want to return 1 if X is a MEM that contains a register
476 within REG_SET_REG. */
478 if ((GET_CODE (x
) != MEM
)
479 && reg_overlap_mentioned_p (reg_set_reg
, x
))
484 reg_set_p (reg
, insn
)
489 /* We can be passed an insn or part of one. If we are passed an insn,
490 check if a side-effect of the insn clobbers REG. */
491 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
493 if (FIND_REG_INC_NOTE (insn
, reg
)
494 || (GET_CODE (insn
) == CALL_INSN
495 /* We'd like to test call_used_regs here, but rtlanal.c can't
496 reference that variable due to its use in genattrtab. So
497 we'll just be more conservative.
499 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
500 information holds all clobbered registers. */
501 && ((GET_CODE (reg
) == REG
502 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
503 || GET_CODE (reg
) == MEM
504 || find_reg_fusage (insn
, CLOBBER
, reg
))))
507 body
= PATTERN (insn
);
512 note_stores (body
, reg_set_p_1
);
516 /* Similar to reg_set_between_p, but check all registers in X. Return 0
517 only if none of them are modified between START and END. Do not
518 consider non-registers one way or the other. */
521 regs_set_between_p (x
, start
, end
)
525 enum rtx_code code
= GET_CODE (x
);
541 return reg_set_between_p (x
, start
, end
);
547 fmt
= GET_RTX_FORMAT (code
);
548 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
550 if (fmt
[i
] == 'e' && regs_set_between_p (XEXP (x
, i
), start
, end
))
553 else if (fmt
[i
] == 'E')
554 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
555 if (regs_set_between_p (XVECEXP (x
, i
, j
), start
, end
))
562 /* Similar to reg_set_between_p, but check all registers in X. Return 0
563 only if none of them are modified between START and END. Return 1 if
564 X contains a MEM; this routine does not perform any memory aliasing. */
567 modified_between_p (x
, start
, end
)
571 enum rtx_code code
= GET_CODE (x
);
589 /* If the memory is not constant, assume it is modified. If it is
590 constant, we still have to check the address. */
591 if (! RTX_UNCHANGING_P (x
))
596 return reg_set_between_p (x
, start
, end
);
602 fmt
= GET_RTX_FORMAT (code
);
603 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
605 if (fmt
[i
] == 'e' && modified_between_p (XEXP (x
, i
), start
, end
))
609 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
610 if (modified_between_p (XVECEXP (x
, i
, j
), start
, end
))
617 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
618 of them are modified in INSN. Return 1 if X contains a MEM; this routine
619 does not perform any memory aliasing. */
622 modified_in_p (x
, insn
)
626 enum rtx_code code
= GET_CODE (x
);
644 /* If the memory is not constant, assume it is modified. If it is
645 constant, we still have to check the address. */
646 if (! RTX_UNCHANGING_P (x
))
651 return reg_set_p (x
, insn
);
657 fmt
= GET_RTX_FORMAT (code
);
658 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
660 if (fmt
[i
] == 'e' && modified_in_p (XEXP (x
, i
), insn
))
664 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
665 if (modified_in_p (XVECEXP (x
, i
, j
), insn
))
672 /* Given an INSN, return a SET expression if this insn has only a single SET.
673 It may also have CLOBBERs, USEs, or SET whose output
674 will not be used, which we ignore. */
683 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
686 if (GET_CODE (PATTERN (insn
)) == SET
)
687 return PATTERN (insn
);
689 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
691 for (i
= 0, set
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
692 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, i
)) == SET
693 && (! find_reg_note (insn
, REG_UNUSED
,
694 SET_DEST (XVECEXP (PATTERN (insn
), 0, i
)))
695 || side_effects_p (XVECEXP (PATTERN (insn
), 0, i
))))
700 set
= XVECEXP (PATTERN (insn
), 0, i
);
708 /* Given an INSN, return nonzero if it has more than one SET, else return
718 /* INSN must be an insn. */
719 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
722 /* Only a PARALLEL can have multiple SETs. */
723 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
725 for (i
= 0, found
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
726 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, i
)) == SET
)
728 /* If we have already found a SET, then return now. */
736 /* Either zero or one SET. */
740 /* Return the last thing that X was assigned from before *PINSN. Verify that
741 the object is not modified up to VALID_TO. If it was, if we hit
742 a partial assignment to X, or hit a CODE_LABEL first, return X. If we
743 found an assignment, update *PINSN to point to it.
744 ALLOW_HWREG is set to 1 if hardware registers are allowed to be the src. */
747 find_last_value (x
, pinsn
, valid_to
, allow_hwreg
)
755 for (p
= PREV_INSN (*pinsn
); p
&& GET_CODE (p
) != CODE_LABEL
;
757 if (GET_RTX_CLASS (GET_CODE (p
)) == 'i')
759 rtx set
= single_set (p
);
760 rtx note
= find_reg_note (p
, REG_EQUAL
, NULL_RTX
);
762 if (set
&& rtx_equal_p (x
, SET_DEST (set
)))
764 rtx src
= SET_SRC (set
);
766 if (note
&& GET_CODE (XEXP (note
, 0)) != EXPR_LIST
)
767 src
= XEXP (note
, 0);
769 if (! modified_between_p (src
, PREV_INSN (p
), valid_to
)
770 /* Reject hard registers because we don't usually want
771 to use them; we'd rather use a pseudo. */
772 && (! (GET_CODE (src
) == REG
773 && REGNO (src
) < FIRST_PSEUDO_REGISTER
) || allow_hwreg
))
780 /* If set in non-simple way, we don't have a value. */
781 if (reg_set_p (x
, p
))
788 /* Return nonzero if register in range [REGNO, ENDREGNO)
789 appears either explicitly or implicitly in X
790 other than being stored into.
792 References contained within the substructure at LOC do not count.
793 LOC may be zero, meaning don't ignore anything. */
796 refers_to_regno_p (regno
, endregno
, x
, loc
)
802 register RTX_CODE code
;
806 /* The contents of a REG_NONNEG note is always zero, so we must come here
807 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
818 /* If we modifying the stack, frame, or argument pointer, it will
819 clobber a virtual register. In fact, we could be more precise,
820 but it isn't worth it. */
821 if ((i
== STACK_POINTER_REGNUM
822 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
823 || i
== ARG_POINTER_REGNUM
825 || i
== FRAME_POINTER_REGNUM
)
826 && regno
>= FIRST_VIRTUAL_REGISTER
&& regno
<= LAST_VIRTUAL_REGISTER
)
830 && regno
< i
+ (i
< FIRST_PSEUDO_REGISTER
831 ? HARD_REGNO_NREGS (i
, GET_MODE (x
))
835 /* If this is a SUBREG of a hard reg, we can see exactly which
836 registers are being modified. Otherwise, handle normally. */
837 if (GET_CODE (SUBREG_REG (x
)) == REG
838 && REGNO (SUBREG_REG (x
)) < FIRST_PSEUDO_REGISTER
)
840 int inner_regno
= REGNO (SUBREG_REG (x
)) + SUBREG_WORD (x
);
842 = inner_regno
+ (inner_regno
< FIRST_PSEUDO_REGISTER
843 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
845 return endregno
> inner_regno
&& regno
< inner_endregno
;
851 if (&SET_DEST (x
) != loc
852 /* Note setting a SUBREG counts as referring to the REG it is in for
853 a pseudo but not for hard registers since we can
854 treat each word individually. */
855 && ((GET_CODE (SET_DEST (x
)) == SUBREG
856 && loc
!= &SUBREG_REG (SET_DEST (x
))
857 && GET_CODE (SUBREG_REG (SET_DEST (x
))) == REG
858 && REGNO (SUBREG_REG (SET_DEST (x
))) >= FIRST_PSEUDO_REGISTER
859 && refers_to_regno_p (regno
, endregno
,
860 SUBREG_REG (SET_DEST (x
)), loc
))
861 || (GET_CODE (SET_DEST (x
)) != REG
862 && refers_to_regno_p (regno
, endregno
, SET_DEST (x
), loc
))))
865 if (code
== CLOBBER
|| loc
== &SET_SRC (x
))
874 /* X does not match, so try its subexpressions. */
876 fmt
= GET_RTX_FORMAT (code
);
877 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
879 if (fmt
[i
] == 'e' && loc
!= &XEXP (x
, i
))
887 if (refers_to_regno_p (regno
, endregno
, XEXP (x
, i
), loc
))
890 else if (fmt
[i
] == 'E')
893 for (j
= XVECLEN (x
, i
) - 1; j
>=0; j
--)
894 if (loc
!= &XVECEXP (x
, i
, j
)
895 && refers_to_regno_p (regno
, endregno
, XVECEXP (x
, i
, j
), loc
))
902 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
903 we check if any register number in X conflicts with the relevant register
904 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
905 contains a MEM (we don't bother checking for memory addresses that can't
906 conflict because we expect this to be a rare case. */
909 reg_overlap_mentioned_p (x
, in
)
914 /* Overly conservative. */
915 if (GET_CODE (x
) == STRICT_LOW_PART
)
918 /* If either argument is a constant, then modifying X can not affect IN. */
919 if (CONSTANT_P (x
) || CONSTANT_P (in
))
921 else if (GET_CODE (x
) == SUBREG
)
923 regno
= REGNO (SUBREG_REG (x
));
924 if (regno
< FIRST_PSEUDO_REGISTER
)
925 regno
+= SUBREG_WORD (x
);
927 else if (GET_CODE (x
) == REG
)
929 else if (GET_CODE (x
) == MEM
)
934 if (GET_CODE (in
) == MEM
)
937 fmt
= GET_RTX_FORMAT (GET_CODE (in
));
939 for (i
= GET_RTX_LENGTH (GET_CODE (in
)) - 1; i
>= 0; i
--)
940 if (fmt
[i
] == 'e' && reg_overlap_mentioned_p (x
, XEXP (in
, i
)))
945 else if (GET_CODE (x
) == SCRATCH
|| GET_CODE (x
) == PC
946 || GET_CODE (x
) == CC0
)
947 return reg_mentioned_p (x
, in
);
948 else if (GET_CODE (x
) == PARALLEL
949 && GET_MODE (x
) == BLKmode
)
953 /* If any register in here refers to it
955 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
956 if (reg_overlap_mentioned_p (SET_DEST (XVECEXP (x
, 0, i
)), in
))
963 endregno
= regno
+ (regno
< FIRST_PSEUDO_REGISTER
964 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
966 return refers_to_regno_p (regno
, endregno
, in
, NULL_PTR
);
969 /* Used for communications between the next few functions. */
971 static int reg_set_last_unknown
;
972 static rtx reg_set_last_value
;
973 static int reg_set_last_first_regno
, reg_set_last_last_regno
;
975 /* Called via note_stores from reg_set_last. */
978 reg_set_last_1 (x
, pat
)
984 /* If X is not a register, or is not one in the range we care
986 if (GET_CODE (x
) != REG
)
990 last
= first
+ (first
< FIRST_PSEUDO_REGISTER
991 ? HARD_REGNO_NREGS (first
, GET_MODE (x
)) : 1);
993 if (first
>= reg_set_last_last_regno
994 || last
<= reg_set_last_first_regno
)
997 /* If this is a CLOBBER or is some complex LHS, or doesn't modify
998 exactly the registers we care about, show we don't know the value. */
999 if (GET_CODE (pat
) == CLOBBER
|| SET_DEST (pat
) != x
1000 || first
!= reg_set_last_first_regno
1001 || last
!= reg_set_last_last_regno
)
1002 reg_set_last_unknown
= 1;
1004 reg_set_last_value
= SET_SRC (pat
);
1007 /* Return the last value to which REG was set prior to INSN. If we can't
1008 find it easily, return 0.
1010 We only return a REG, SUBREG, or constant because it is too hard to
1011 check if a MEM remains unchanged. */
1014 reg_set_last (x
, insn
)
1018 rtx orig_insn
= insn
;
1020 reg_set_last_first_regno
= REGNO (x
);
1022 reg_set_last_last_regno
1023 = reg_set_last_first_regno
1024 + (reg_set_last_first_regno
< FIRST_PSEUDO_REGISTER
1025 ? HARD_REGNO_NREGS (reg_set_last_first_regno
, GET_MODE (x
)) : 1);
1027 reg_set_last_unknown
= 0;
1028 reg_set_last_value
= 0;
1030 /* Scan backwards until reg_set_last_1 changed one of the above flags.
1031 Stop when we reach a label or X is a hard reg and we reach a
1032 CALL_INSN (if reg_set_last_last_regno is a hard reg).
1034 If we find a set of X, ensure that its SET_SRC remains unchanged. */
1036 /* We compare with <= here, because reg_set_last_last_regno
1037 is actually the number of the first reg *not* in X. */
1039 insn
&& GET_CODE (insn
) != CODE_LABEL
1040 && ! (GET_CODE (insn
) == CALL_INSN
1041 && reg_set_last_last_regno
<= FIRST_PSEUDO_REGISTER
);
1042 insn
= PREV_INSN (insn
))
1043 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
1045 note_stores (PATTERN (insn
), reg_set_last_1
);
1046 if (reg_set_last_unknown
)
1048 else if (reg_set_last_value
)
1050 if (CONSTANT_P (reg_set_last_value
)
1051 || ((GET_CODE (reg_set_last_value
) == REG
1052 || GET_CODE (reg_set_last_value
) == SUBREG
)
1053 && ! reg_set_between_p (reg_set_last_value
,
1055 return reg_set_last_value
;
1064 /* This is 1 until after the rtl generation pass. */
1065 int rtx_equal_function_value_matters
;
1067 /* Return 1 if X and Y are identical-looking rtx's.
1068 This is the Lisp function EQUAL for rtx arguments. */
1076 register enum rtx_code code
;
1081 if (x
== 0 || y
== 0)
1084 code
= GET_CODE (x
);
1085 /* Rtx's of different codes cannot be equal. */
1086 if (code
!= GET_CODE (y
))
1089 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1090 (REG:SI x) and (REG:HI x) are NOT equivalent. */
1092 if (GET_MODE (x
) != GET_MODE (y
))
1095 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
1098 /* Until rtl generation is complete, don't consider a reference to the
1099 return register of the current function the same as the return from a
1100 called function. This eases the job of function integration. Once the
1101 distinction is no longer needed, they can be considered equivalent. */
1102 return (REGNO (x
) == REGNO (y
)
1103 && (! rtx_equal_function_value_matters
1104 || REG_FUNCTION_VALUE_P (x
) == REG_FUNCTION_VALUE_P (y
)));
1105 else if (code
== LABEL_REF
)
1106 return XEXP (x
, 0) == XEXP (y
, 0);
1107 else if (code
== SYMBOL_REF
)
1108 return XSTR (x
, 0) == XSTR (y
, 0);
1109 else if (code
== SCRATCH
|| code
== CONST_DOUBLE
)
1112 /* Compare the elements. If any pair of corresponding elements
1113 fail to match, return 0 for the whole things. */
1115 fmt
= GET_RTX_FORMAT (code
);
1116 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1121 if (XWINT (x
, i
) != XWINT (y
, i
))
1127 if (XINT (x
, i
) != XINT (y
, i
))
1133 /* Two vectors must have the same length. */
1134 if (XVECLEN (x
, i
) != XVECLEN (y
, i
))
1137 /* And the corresponding elements must match. */
1138 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1139 if (rtx_equal_p (XVECEXP (x
, i
, j
), XVECEXP (y
, i
, j
)) == 0)
1144 if (rtx_equal_p (XEXP (x
, i
), XEXP (y
, i
)) == 0)
1150 if (strcmp (XSTR (x
, i
), XSTR (y
, i
)))
1155 /* These are just backpointers, so they don't matter. */
1161 /* It is believed that rtx's at this level will never
1162 contain anything but integers and other rtx's,
1163 except for within LABEL_REFs and SYMBOL_REFs. */
1171 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1172 (X would be the pattern of an insn).
1173 FUN receives two arguments:
1174 the REG, MEM, CC0 or PC being stored in or clobbered,
1175 the SET or CLOBBER rtx that does the store.
1177 If the item being stored in or clobbered is a SUBREG of a hard register,
1178 the SUBREG will be passed. */
1181 note_stores (x
, fun
)
1183 void (*fun
) PROTO ((rtx
, rtx
));
1185 if ((GET_CODE (x
) == SET
|| GET_CODE (x
) == CLOBBER
))
1187 register rtx dest
= SET_DEST (x
);
1188 while ((GET_CODE (dest
) == SUBREG
1189 && (GET_CODE (SUBREG_REG (dest
)) != REG
1190 || REGNO (SUBREG_REG (dest
)) >= FIRST_PSEUDO_REGISTER
))
1191 || GET_CODE (dest
) == ZERO_EXTRACT
1192 || GET_CODE (dest
) == SIGN_EXTRACT
1193 || GET_CODE (dest
) == STRICT_LOW_PART
)
1194 dest
= XEXP (dest
, 0);
1196 if (GET_CODE (dest
) == PARALLEL
1197 && GET_MODE (dest
) == BLKmode
)
1200 for (i
= XVECLEN (dest
, 0) - 1; i
>= 0; i
--)
1201 (*fun
) (SET_DEST (XVECEXP (dest
, 0, i
)), x
);
1206 else if (GET_CODE (x
) == PARALLEL
)
1209 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1211 register rtx y
= XVECEXP (x
, 0, i
);
1212 if (GET_CODE (y
) == SET
|| GET_CODE (y
) == CLOBBER
)
1214 register rtx dest
= SET_DEST (y
);
1215 while ((GET_CODE (dest
) == SUBREG
1216 && (GET_CODE (SUBREG_REG (dest
)) != REG
1217 || (REGNO (SUBREG_REG (dest
))
1218 >= FIRST_PSEUDO_REGISTER
)))
1219 || GET_CODE (dest
) == ZERO_EXTRACT
1220 || GET_CODE (dest
) == SIGN_EXTRACT
1221 || GET_CODE (dest
) == STRICT_LOW_PART
)
1222 dest
= XEXP (dest
, 0);
1223 if (GET_CODE (dest
) == PARALLEL
1224 && GET_MODE (dest
) == BLKmode
)
1227 for (i
= XVECLEN (dest
, 0) - 1; i
>= 0; i
--)
1228 (*fun
) (SET_DEST (XVECEXP (dest
, 0, i
)), y
);
1237 /* Return nonzero if X's old contents don't survive after INSN.
1238 This will be true if X is (cc0) or if X is a register and
1239 X dies in INSN or because INSN entirely sets X.
1241 "Entirely set" means set directly and not through a SUBREG,
1242 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1243 Likewise, REG_INC does not count.
1245 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1246 but for this use that makes no difference, since regs don't overlap
1247 during their lifetimes. Therefore, this function may be used
1248 at any time after deaths have been computed (in flow.c).
1250 If REG is a hard reg that occupies multiple machine registers, this
1251 function will only return 1 if each of those registers will be replaced
1255 dead_or_set_p (insn
, x
)
1259 register int regno
, last_regno
;
1262 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1263 if (GET_CODE (x
) == CC0
)
1266 if (GET_CODE (x
) != REG
)
1270 last_regno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
1271 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (x
)) - 1);
1273 for (i
= regno
; i
<= last_regno
; i
++)
1274 if (! dead_or_set_regno_p (insn
, i
))
1280 /* Utility function for dead_or_set_p to check an individual register. Also
1281 called from flow.c. */
1284 dead_or_set_regno_p (insn
, test_regno
)
1288 int regno
, endregno
;
1291 /* See if there is a death note for something that includes
1293 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1295 if (REG_NOTE_KIND (link
) != REG_DEAD
1296 || GET_CODE (XEXP (link
, 0)) != REG
)
1299 regno
= REGNO (XEXP (link
, 0));
1300 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1301 : regno
+ HARD_REGNO_NREGS (regno
,
1302 GET_MODE (XEXP (link
, 0))));
1304 if (test_regno
>= regno
&& test_regno
< endregno
)
1308 if (GET_CODE (insn
) == CALL_INSN
1309 && find_regno_fusage (insn
, CLOBBER
, test_regno
))
1312 if (GET_CODE (PATTERN (insn
)) == SET
)
1314 rtx dest
= SET_DEST (PATTERN (insn
));
1316 /* A value is totally replaced if it is the destination or the
1317 destination is a SUBREG of REGNO that does not change the number of
1319 if (GET_CODE (dest
) == SUBREG
1320 && (((GET_MODE_SIZE (GET_MODE (dest
))
1321 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1322 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1323 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1324 dest
= SUBREG_REG (dest
);
1326 if (GET_CODE (dest
) != REG
)
1329 regno
= REGNO (dest
);
1330 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1331 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1333 return (test_regno
>= regno
&& test_regno
< endregno
);
1335 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
1339 for (i
= XVECLEN (PATTERN (insn
), 0) - 1; i
>= 0; i
--)
1341 rtx body
= XVECEXP (PATTERN (insn
), 0, i
);
1343 if (GET_CODE (body
) == SET
|| GET_CODE (body
) == CLOBBER
)
1345 rtx dest
= SET_DEST (body
);
1347 if (GET_CODE (dest
) == SUBREG
1348 && (((GET_MODE_SIZE (GET_MODE (dest
))
1349 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1350 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1351 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1352 dest
= SUBREG_REG (dest
);
1354 if (GET_CODE (dest
) != REG
)
1357 regno
= REGNO (dest
);
1358 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1359 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1361 if (test_regno
>= regno
&& test_regno
< endregno
)
1370 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1371 If DATUM is nonzero, look for one whose datum is DATUM. */
1374 find_reg_note (insn
, kind
, datum
)
1381 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1382 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
1385 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1386 if (REG_NOTE_KIND (link
) == kind
1387 && (datum
== 0 || datum
== XEXP (link
, 0)))
1392 /* Return the reg-note of kind KIND in insn INSN which applies to register
1393 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1394 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1395 it might be the case that the note overlaps REGNO. */
1398 find_regno_note (insn
, kind
, regno
)
1405 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1406 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
1409 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1410 if (REG_NOTE_KIND (link
) == kind
1411 /* Verify that it is a register, so that scratch and MEM won't cause a
1413 && GET_CODE (XEXP (link
, 0)) == REG
1414 && REGNO (XEXP (link
, 0)) <= regno
1415 && ((REGNO (XEXP (link
, 0))
1416 + (REGNO (XEXP (link
, 0)) >= FIRST_PSEUDO_REGISTER
? 1
1417 : HARD_REGNO_NREGS (REGNO (XEXP (link
, 0)),
1418 GET_MODE (XEXP (link
, 0)))))
1424 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1425 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1428 find_reg_fusage (insn
, code
, datum
)
1433 /* If it's not a CALL_INSN, it can't possibly have a
1434 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1435 if (GET_CODE (insn
) != CALL_INSN
)
1441 if (GET_CODE (datum
) != REG
)
1445 for (link
= CALL_INSN_FUNCTION_USAGE (insn
);
1447 link
= XEXP (link
, 1))
1448 if (GET_CODE (XEXP (link
, 0)) == code
1449 && rtx_equal_p (datum
, SET_DEST (XEXP (link
, 0))))
1454 register int regno
= REGNO (datum
);
1456 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1457 to pseudo registers, so don't bother checking. */
1459 if (regno
< FIRST_PSEUDO_REGISTER
)
1461 int end_regno
= regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (datum
));
1464 for (i
= regno
; i
< end_regno
; i
++)
1465 if (find_regno_fusage (insn
, code
, i
))
1473 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1474 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1477 find_regno_fusage (insn
, code
, regno
)
1484 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1485 to pseudo registers, so don't bother checking. */
1487 if (regno
>= FIRST_PSEUDO_REGISTER
1488 || GET_CODE (insn
) != CALL_INSN
)
1491 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
1493 register int regnote
;
1496 if (GET_CODE (op
= XEXP (link
, 0)) == code
1497 && GET_CODE (SET_DEST (op
)) == REG
1498 && (regnote
= REGNO (SET_DEST (op
))) <= regno
1500 + HARD_REGNO_NREGS (regnote
, GET_MODE (SET_DEST (op
)))
1508 /* Remove register note NOTE from the REG_NOTES of INSN. */
1511 remove_note (insn
, note
)
1517 if (REG_NOTES (insn
) == note
)
1519 REG_NOTES (insn
) = XEXP (note
, 1);
1523 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1524 if (XEXP (link
, 1) == note
)
1526 XEXP (link
, 1) = XEXP (note
, 1);
1533 /* Search LISTP (an EXPR_LIST) for NODE and remove NODE from the list
1536 A simple equality test is used to determine if NODE is on the
1540 remove_node_from_expr_list (node
, listp
)
1545 rtx prev
= NULL_RTX
;
1549 if (node
== XEXP (temp
, 0))
1551 /* Splice the node out of the list. */
1553 XEXP (prev
, 1) = XEXP (temp
, 1);
1555 *listp
= XEXP (temp
, 1);
1559 temp
= XEXP (temp
, 1);
1563 /* Nonzero if X contains any volatile instructions. These are instructions
1564 which may cause unpredictable machine state instructions, and thus no
1565 instructions should be moved or combined across them. This includes
1566 only volatile asms and UNSPEC_VOLATILE instructions. */
1572 register RTX_CODE code
;
1574 code
= GET_CODE (x
);
1594 case UNSPEC_VOLATILE
:
1595 /* case TRAP_IF: This isn't clear yet. */
1599 if (MEM_VOLATILE_P (x
))
1606 /* Recursively scan the operands of this expression. */
1609 register char *fmt
= GET_RTX_FORMAT (code
);
1612 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1616 if (volatile_insn_p (XEXP (x
, i
)))
1622 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1623 if (volatile_insn_p (XVECEXP (x
, i
, j
)))
1631 /* Nonzero if X contains any volatile memory references
1632 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1638 register RTX_CODE code
;
1640 code
= GET_CODE (x
);
1659 case UNSPEC_VOLATILE
:
1660 /* case TRAP_IF: This isn't clear yet. */
1665 if (MEM_VOLATILE_P (x
))
1672 /* Recursively scan the operands of this expression. */
1675 register char *fmt
= GET_RTX_FORMAT (code
);
1678 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1682 if (volatile_refs_p (XEXP (x
, i
)))
1688 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1689 if (volatile_refs_p (XVECEXP (x
, i
, j
)))
1697 /* Similar to above, except that it also rejects register pre- and post-
1704 register RTX_CODE code
;
1706 code
= GET_CODE (x
);
1724 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1725 when some combination can't be done. If we see one, don't think
1726 that we can simplify the expression. */
1727 return (GET_MODE (x
) != VOIDmode
);
1734 case UNSPEC_VOLATILE
:
1735 /* case TRAP_IF: This isn't clear yet. */
1740 if (MEM_VOLATILE_P (x
))
1747 /* Recursively scan the operands of this expression. */
1750 register char *fmt
= GET_RTX_FORMAT (code
);
1753 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1757 if (side_effects_p (XEXP (x
, i
)))
1763 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1764 if (side_effects_p (XVECEXP (x
, i
, j
)))
1772 /* Return nonzero if evaluating rtx X might cause a trap. */
1784 code
= GET_CODE (x
);
1787 /* Handle these cases quickly. */
1799 /* Conditional trap can trap! */
1800 case UNSPEC_VOLATILE
:
1804 /* Memory ref can trap unless it's a static var or a stack slot. */
1806 return rtx_addr_can_trap_p (XEXP (x
, 0));
1808 /* Division by a non-constant might trap. */
1813 if (! CONSTANT_P (XEXP (x
, 1))
1814 || GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
1816 /* This was const0_rtx, but by not using that,
1817 we can link this file into other programs. */
1818 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
&& INTVAL (XEXP (x
, 1)) == 0)
1823 /* An EXPR_LIST is used to represent a function call. This
1824 certainly may trap. */
1828 /* Any floating arithmetic may trap. */
1829 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
1833 fmt
= GET_RTX_FORMAT (code
);
1834 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1838 if (may_trap_p (XEXP (x
, i
)))
1841 else if (fmt
[i
] == 'E')
1844 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1845 if (may_trap_p (XVECEXP (x
, i
, j
)))
1852 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1853 i.e., an inequality. */
1856 inequality_comparisons_p (x
)
1860 register int len
, i
;
1861 register enum rtx_code code
= GET_CODE (x
);
1890 len
= GET_RTX_LENGTH (code
);
1891 fmt
= GET_RTX_FORMAT (code
);
1893 for (i
= 0; i
< len
; i
++)
1897 if (inequality_comparisons_p (XEXP (x
, i
)))
1900 else if (fmt
[i
] == 'E')
1903 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1904 if (inequality_comparisons_p (XVECEXP (x
, i
, j
)))
1912 /* Replace any occurrence of FROM in X with TO. The function does
1913 not enter into CONST_DOUBLE for the replace.
1915 Note that copying is not done so X must not be shared unless all copies
1916 are to be modified. */
1919 replace_rtx (x
, from
, to
)
1925 /* The following prevents loops occurrence when we change MEM in
1926 CONST_DOUBLE onto the same CONST_DOUBLE. */
1927 if (x
!= 0 && GET_CODE (x
) == CONST_DOUBLE
)
1933 /* Allow this function to make replacements in EXPR_LISTs. */
1937 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
1938 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
1941 XEXP (x
, i
) = replace_rtx (XEXP (x
, i
), from
, to
);
1942 else if (fmt
[i
] == 'E')
1943 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1944 XVECEXP (x
, i
, j
) = replace_rtx (XVECEXP (x
, i
, j
), from
, to
);
1950 /* Throughout the rtx X, replace many registers according to REG_MAP.
1951 Return the replacement for X (which may be X with altered contents).
1952 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
1953 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
1955 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
1956 should not be mapped to pseudos or vice versa since validate_change
1959 If REPLACE_DEST is 1, replacements are also done in destinations;
1960 otherwise, only sources are replaced. */
1963 replace_regs (x
, reg_map
, nregs
, replace_dest
)
1969 register enum rtx_code code
;
1976 code
= GET_CODE (x
);
1990 /* Verify that the register has an entry before trying to access it. */
1991 if (REGNO (x
) < nregs
&& reg_map
[REGNO (x
)] != 0)
1993 /* SUBREGs can't be shared. Always return a copy to ensure that if
1994 this replacement occurs more than once then each instance will
1995 get distinct rtx. */
1996 if (GET_CODE (reg_map
[REGNO (x
)]) == SUBREG
)
1997 return copy_rtx (reg_map
[REGNO (x
)]);
1998 return reg_map
[REGNO (x
)];
2003 /* Prevent making nested SUBREGs. */
2004 if (GET_CODE (SUBREG_REG (x
)) == REG
&& REGNO (SUBREG_REG (x
)) < nregs
2005 && reg_map
[REGNO (SUBREG_REG (x
))] != 0
2006 && GET_CODE (reg_map
[REGNO (SUBREG_REG (x
))]) == SUBREG
)
2008 rtx map_val
= reg_map
[REGNO (SUBREG_REG (x
))];
2009 rtx map_inner
= SUBREG_REG (map_val
);
2011 if (GET_MODE (x
) == GET_MODE (map_inner
))
2015 /* We cannot call gen_rtx here since we may be linked with
2017 /* Let's try clobbering the incoming SUBREG and see
2018 if this is really safe. */
2019 SUBREG_REG (x
) = map_inner
;
2020 SUBREG_WORD (x
) += SUBREG_WORD (map_val
);
2023 rtx
new = rtx_alloc (SUBREG
);
2024 PUT_MODE (new, GET_MODE (x
));
2025 SUBREG_REG (new) = map_inner
;
2026 SUBREG_WORD (new) = SUBREG_WORD (x
) + SUBREG_WORD (map_val
);
2034 SET_DEST (x
) = replace_regs (SET_DEST (x
), reg_map
, nregs
, 0);
2036 else if (GET_CODE (SET_DEST (x
)) == MEM
2037 || GET_CODE (SET_DEST (x
)) == STRICT_LOW_PART
)
2038 /* Even if we are not to replace destinations, replace register if it
2039 is CONTAINED in destination (destination is memory or
2040 STRICT_LOW_PART). */
2041 XEXP (SET_DEST (x
), 0) = replace_regs (XEXP (SET_DEST (x
), 0),
2043 else if (GET_CODE (SET_DEST (x
)) == ZERO_EXTRACT
)
2044 /* Similarly, for ZERO_EXTRACT we replace all operands. */
2047 SET_SRC (x
) = replace_regs (SET_SRC (x
), reg_map
, nregs
, 0);
2054 fmt
= GET_RTX_FORMAT (code
);
2055 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2058 XEXP (x
, i
) = replace_regs (XEXP (x
, i
), reg_map
, nregs
, replace_dest
);
2062 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2063 XVECEXP (x
, i
, j
) = replace_regs (XVECEXP (x
, i
, j
), reg_map
,
2064 nregs
, replace_dest
);
2070 /* Return 1 if X, the SRC_SRC of SET of (pc) contain a REG or MEM that is
2071 not in the constant pool and not in the condition of an IF_THEN_ELSE. */
2074 jmp_uses_reg_or_mem (x
)
2077 enum rtx_code code
= GET_CODE (x
);
2092 return ! (GET_CODE (XEXP (x
, 0)) == SYMBOL_REF
2093 && CONSTANT_POOL_ADDRESS_P (XEXP (x
, 0)));
2096 return (jmp_uses_reg_or_mem (XEXP (x
, 1))
2097 || jmp_uses_reg_or_mem (XEXP (x
, 2)));
2099 case PLUS
: case MINUS
: case MULT
:
2100 return (jmp_uses_reg_or_mem (XEXP (x
, 0))
2101 || jmp_uses_reg_or_mem (XEXP (x
, 1)));
2107 fmt
= GET_RTX_FORMAT (code
);
2108 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2111 && jmp_uses_reg_or_mem (XEXP (x
, i
)))
2115 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2116 if (jmp_uses_reg_or_mem (XVECEXP (x
, i
, j
)))
2123 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2125 Tablejumps and casesi insns are not considered indirect jumps;
2126 we can recognize them by a (use (lael_ref)). */
2129 computed_jump_p (insn
)
2133 if (GET_CODE (insn
) == JUMP_INSN
)
2135 rtx pat
= PATTERN (insn
);
2137 if (GET_CODE (pat
) == PARALLEL
)
2139 int len
= XVECLEN (pat
, 0);
2140 int has_use_labelref
= 0;
2142 for (i
= len
- 1; i
>= 0; i
--)
2143 if (GET_CODE (XVECEXP (pat
, 0, i
)) == USE
2144 && (GET_CODE (XEXP (XVECEXP (pat
, 0, i
), 0))
2146 has_use_labelref
= 1;
2148 if (! has_use_labelref
)
2149 for (i
= len
- 1; i
>= 0; i
--)
2150 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
2151 && SET_DEST (XVECEXP (pat
, 0, i
)) == pc_rtx
2152 && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat
, 0, i
))))
2155 else if (GET_CODE (pat
) == SET
2156 && SET_DEST (pat
) == pc_rtx
2157 && jmp_uses_reg_or_mem (SET_SRC (pat
)))
2163 /* Traverse X via depth-first search, calling F for each
2164 sub-expression (including X itself). F is also passed the DATA.
2165 If F returns -1, do not traverse sub-expressions, but continue
2166 traversing the rest of the tree. If F ever returns any other
2167 non-zero value, stop the traversal, and return the value returned
2168 by F. Otherwise, return 0. This function does not traverse inside
2169 tree structure that contains RTX_EXPRs, or into sub-expressions
2170 whose format code is `0' since it is not known whether or not those
2171 codes are actually RTL.
2173 This routine is very general, and could (should?) be used to
2174 implement many of the other routines in this file. */
2177 for_each_rtx (x
, f
, data
)
2188 result
= (*f
)(x
, data
);
2190 /* Do not traverse sub-expressions. */
2192 else if (result
!= 0)
2193 /* Stop the traversal. */
2197 /* There are no sub-expressions. */
2200 length
= GET_RTX_LENGTH (GET_CODE (*x
));
2201 format
= GET_RTX_FORMAT (GET_CODE (*x
));
2203 for (i
= 0; i
< length
; ++i
)
2208 result
= for_each_rtx (&XEXP (*x
, i
), f
, data
);
2215 if (XVEC (*x
, i
) != 0)
2218 for (j
= 0; j
< XVECLEN (*x
, i
); ++j
)
2220 result
= for_each_rtx (&XVECEXP (*x
, i
, j
), f
, data
);
2228 /* Nothing to do. */
2237 /* Searches X for any reference to REGNO, returning the rtx of the
2238 reference found if any. Otherwise, returns NULL_RTX. */
2241 regno_use_in (regno
, x
)
2249 if (GET_CODE (x
) == REG
&& REGNO (x
) == regno
)
2252 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
2253 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
2257 if ((tem
= regno_use_in (regno
, XEXP (x
, i
))))
2260 else if (fmt
[i
] == 'E')
2261 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
2262 if ((tem
= regno_use_in (regno
, XVECEXP (x
, i
, j
))))
2270 /* Return 1 if X is an autoincrement side effect and the register is
2271 not the stack pointer. */
2276 switch (GET_CODE (x
))
2284 /* There are no REG_INC notes for SP. */
2285 if (XEXP (x
, 0) != stack_pointer_rtx
)