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
));
29 /* Forward declarations */
30 static int jmp_uses_reg_or_mem
PROTO((rtx
));
32 /* Bit flags that specify the machine subtype we are compiling for.
33 Bits are tested using macros TARGET_... defined in the tm.h file
34 and set by `-m...' switches. Must be defined in rtlanal.c. */
38 /* Return 1 if the value of X is unstable
39 (would be different at a different point in the program).
40 The frame pointer, arg pointer, etc. are considered stable
41 (within one function) and so is anything marked `unchanging'. */
47 register RTX_CODE code
= GET_CODE (x
);
52 return ! RTX_UNCHANGING_P (x
);
57 if (code
== CONST
|| code
== CONST_INT
)
61 return ! (REGNO (x
) == FRAME_POINTER_REGNUM
62 || REGNO (x
) == HARD_FRAME_POINTER_REGNUM
63 || REGNO (x
) == ARG_POINTER_REGNUM
64 || RTX_UNCHANGING_P (x
));
66 fmt
= GET_RTX_FORMAT (code
);
67 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
69 if (rtx_unstable_p (XEXP (x
, i
)))
74 /* Return 1 if X has a value that can vary even between two
75 executions of the program. 0 means X can be compared reliably
76 against certain constants or near-constants.
77 The frame pointer and the arg pointer are considered constant. */
83 register RTX_CODE code
= GET_CODE (x
);
101 /* Note that we have to test for the actual rtx used for the frame
102 and arg pointers and not just the register number in case we have
103 eliminated the frame and/or arg pointer and are using it
105 return ! (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
106 || x
== arg_pointer_rtx
);
109 /* The operand 0 of a LO_SUM is considered constant
110 (in fact is it related specifically to operand 1). */
111 return rtx_varies_p (XEXP (x
, 1));
117 fmt
= GET_RTX_FORMAT (code
);
118 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
120 if (rtx_varies_p (XEXP (x
, i
)))
125 /* Return 0 if the use of X as an address in a MEM can cause a trap. */
128 rtx_addr_can_trap_p (x
)
131 register enum rtx_code code
= GET_CODE (x
);
137 /* SYMBOL_REF is problematic due to the possible presence of
138 a #pragma weak, but to say that loads from symbols can trap is
139 *very* costly. It's not at all clear what's best here. For
140 now, we ignore the impact of #pragma weak. */
144 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
145 return ! (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
146 || x
== stack_pointer_rtx
|| x
== arg_pointer_rtx
);
149 return rtx_addr_can_trap_p (XEXP (x
, 0));
152 /* An address is assumed not to trap if it is an address that can't
153 trap plus a constant integer. */
154 return (rtx_addr_can_trap_p (XEXP (x
, 0))
155 || GET_CODE (XEXP (x
, 1)) != CONST_INT
);
158 return rtx_addr_can_trap_p (XEXP (x
, 1));
164 /* If it isn't one of the case above, it can cause a trap. */
168 /* Return 1 if X refers to a memory location whose address
169 cannot be compared reliably with constant addresses,
170 or if X refers to a BLKmode memory object. */
173 rtx_addr_varies_p (x
)
176 register enum rtx_code code
;
185 return GET_MODE (x
) == BLKmode
|| rtx_varies_p (XEXP (x
, 0));
187 fmt
= GET_RTX_FORMAT (code
);
188 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
191 if (rtx_addr_varies_p (XEXP (x
, i
)))
194 else if (fmt
[i
] == 'E')
197 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
198 if (rtx_addr_varies_p (XVECEXP (x
, i
, j
)))
204 /* Return the value of the integer term in X, if one is apparent;
206 Only obvious integer terms are detected.
207 This is used in cse.c with the `related_value' field.*/
213 if (GET_CODE (x
) == CONST
)
216 if (GET_CODE (x
) == MINUS
217 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
218 return - INTVAL (XEXP (x
, 1));
219 if (GET_CODE (x
) == PLUS
220 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
221 return INTVAL (XEXP (x
, 1));
225 /* If X is a constant, return the value sans apparent integer term;
227 Only obvious integer terms are detected. */
230 get_related_value (x
)
233 if (GET_CODE (x
) != CONST
)
236 if (GET_CODE (x
) == PLUS
237 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
239 else if (GET_CODE (x
) == MINUS
240 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
245 /* Nonzero if register REG appears somewhere within IN.
246 Also works if REG is not a register; in this case it checks
247 for a subexpression of IN that is Lisp "equal" to REG. */
250 reg_mentioned_p (reg
, in
)
251 register rtx reg
, in
;
255 register enum rtx_code code
;
263 if (GET_CODE (in
) == LABEL_REF
)
264 return reg
== XEXP (in
, 0);
266 code
= GET_CODE (in
);
270 /* Compare registers by number. */
272 return GET_CODE (reg
) == REG
&& REGNO (in
) == REGNO (reg
);
274 /* These codes have no constituent expressions
282 return GET_CODE (reg
) == CONST_INT
&& INTVAL (in
) == INTVAL (reg
);
285 /* These are kept unique for a given value. */
292 if (GET_CODE (reg
) == code
&& rtx_equal_p (reg
, in
))
295 fmt
= GET_RTX_FORMAT (code
);
297 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
302 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; j
--)
303 if (reg_mentioned_p (reg
, XVECEXP (in
, i
, j
)))
306 else if (fmt
[i
] == 'e'
307 && reg_mentioned_p (reg
, XEXP (in
, i
)))
313 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
314 no CODE_LABEL insn. */
317 no_labels_between_p (beg
, end
)
321 for (p
= NEXT_INSN (beg
); p
!= end
; p
= NEXT_INSN (p
))
322 if (GET_CODE (p
) == CODE_LABEL
)
327 /* Nonzero if register REG is used in an insn between
328 FROM_INSN and TO_INSN (exclusive of those two). */
331 reg_used_between_p (reg
, from_insn
, to_insn
)
332 rtx reg
, from_insn
, to_insn
;
336 if (from_insn
== to_insn
)
339 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
340 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
341 && (reg_overlap_mentioned_p (reg
, PATTERN (insn
))
342 || (GET_CODE (insn
) == CALL_INSN
343 && (find_reg_fusage (insn
, USE
, reg
)
344 || find_reg_fusage (insn
, CLOBBER
, reg
)))))
349 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
350 is entirely replaced by a new value and the only use is as a SET_DEST,
351 we do not consider it a reference. */
354 reg_referenced_p (x
, body
)
360 switch (GET_CODE (body
))
363 if (reg_overlap_mentioned_p (x
, SET_SRC (body
)))
366 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
367 of a REG that occupies all of the REG, the insn references X if
368 it is mentioned in the destination. */
369 if (GET_CODE (SET_DEST (body
)) != CC0
370 && GET_CODE (SET_DEST (body
)) != PC
371 && GET_CODE (SET_DEST (body
)) != REG
372 && ! (GET_CODE (SET_DEST (body
)) == SUBREG
373 && GET_CODE (SUBREG_REG (SET_DEST (body
))) == REG
374 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body
))))
375 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)
376 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body
)))
377 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)))
378 && reg_overlap_mentioned_p (x
, SET_DEST (body
)))
383 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
384 if (reg_overlap_mentioned_p (x
, ASM_OPERANDS_INPUT (body
, i
)))
390 return reg_overlap_mentioned_p (x
, body
);
393 return reg_overlap_mentioned_p (x
, TRAP_CONDITION (body
));
396 case UNSPEC_VOLATILE
:
398 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
399 if (reg_referenced_p (x
, XVECEXP (body
, 0, i
)))
408 /* Nonzero if register REG is referenced in an insn between
409 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
413 reg_referenced_between_p (reg
, from_insn
, to_insn
)
414 rtx reg
, from_insn
, to_insn
;
418 if (from_insn
== to_insn
)
421 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
422 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
423 && (reg_referenced_p (reg
, PATTERN (insn
))
424 || (GET_CODE (insn
) == CALL_INSN
425 && find_reg_fusage (insn
, USE
, reg
))))
430 /* Nonzero if register REG is set or clobbered in an insn between
431 FROM_INSN and TO_INSN (exclusive of those two). */
434 reg_set_between_p (reg
, from_insn
, to_insn
)
435 rtx reg
, from_insn
, to_insn
;
439 if (from_insn
== to_insn
)
442 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
443 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i'
444 && reg_set_p (reg
, insn
))
449 /* Internals of reg_set_between_p. */
451 static rtx reg_set_reg
;
452 static int reg_set_flag
;
458 /* We don't want to return 1 if X is a MEM that contains a register
459 within REG_SET_REG. */
461 if ((GET_CODE (x
) != MEM
)
462 && reg_overlap_mentioned_p (reg_set_reg
, x
))
467 reg_set_p (reg
, insn
)
472 /* We can be passed an insn or part of one. If we are passed an insn,
473 check if a side-effect of the insn clobbers REG. */
474 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
476 if (FIND_REG_INC_NOTE (insn
, reg
)
477 || (GET_CODE (insn
) == CALL_INSN
478 /* We'd like to test call_used_regs here, but rtlanal.c can't
479 reference that variable due to its use in genattrtab. So
480 we'll just be more conservative.
482 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
483 information holds all clobbered registers. */
484 && ((GET_CODE (reg
) == REG
485 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
486 || GET_CODE (reg
) == MEM
487 || find_reg_fusage (insn
, CLOBBER
, reg
))))
490 body
= PATTERN (insn
);
495 note_stores (body
, reg_set_p_1
);
499 /* Similar to reg_set_between_p, but check all registers in X. Return 0
500 only if none of them are modified between START and END. Return 1 if
501 X contains a MEM; this routine does not perform any memory aliasing. */
504 modified_between_p (x
, start
, end
)
508 enum rtx_code code
= GET_CODE (x
);
526 /* If the memory is not constant, assume it is modified. If it is
527 constant, we still have to check the address. */
528 if (! RTX_UNCHANGING_P (x
))
533 return reg_set_between_p (x
, start
, end
);
539 fmt
= GET_RTX_FORMAT (code
);
540 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
542 if (fmt
[i
] == 'e' && modified_between_p (XEXP (x
, i
), start
, end
))
546 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
547 if (modified_between_p (XVECEXP (x
, i
, j
), start
, end
))
554 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
555 of them are modified in INSN. Return 1 if X contains a MEM; this routine
556 does not perform any memory aliasing. */
559 modified_in_p (x
, insn
)
563 enum rtx_code code
= GET_CODE (x
);
581 /* If the memory is not constant, assume it is modified. If it is
582 constant, we still have to check the address. */
583 if (! RTX_UNCHANGING_P (x
))
588 return reg_set_p (x
, insn
);
594 fmt
= GET_RTX_FORMAT (code
);
595 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
597 if (fmt
[i
] == 'e' && modified_in_p (XEXP (x
, i
), insn
))
601 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
602 if (modified_in_p (XVECEXP (x
, i
, j
), insn
))
609 /* Given an INSN, return a SET expression if this insn has only a single SET.
610 It may also have CLOBBERs, USEs, or SET whose output
611 will not be used, which we ignore. */
620 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
623 if (GET_CODE (PATTERN (insn
)) == SET
)
624 return PATTERN (insn
);
626 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
628 for (i
= 0, set
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
629 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, i
)) == SET
630 && (! find_reg_note (insn
, REG_UNUSED
,
631 SET_DEST (XVECEXP (PATTERN (insn
), 0, i
)))
632 || side_effects_p (XVECEXP (PATTERN (insn
), 0, i
))))
637 set
= XVECEXP (PATTERN (insn
), 0, i
);
645 /* Return the last thing that X was assigned from before *PINSN. Verify that
646 the object is not modified up to VALID_TO. If it was, if we hit
647 a partial assignment to X, or hit a CODE_LABEL first, return X. If we
648 found an assignment, update *PINSN to point to it. */
651 find_last_value (x
, pinsn
, valid_to
)
658 for (p
= PREV_INSN (*pinsn
); p
&& GET_CODE (p
) != CODE_LABEL
;
660 if (GET_RTX_CLASS (GET_CODE (p
)) == 'i')
662 rtx set
= single_set (p
);
663 rtx note
= find_reg_note (p
, REG_EQUAL
, NULL_RTX
);
665 if (set
&& rtx_equal_p (x
, SET_DEST (set
)))
667 rtx src
= SET_SRC (set
);
669 if (note
&& GET_CODE (XEXP (note
, 0)) != EXPR_LIST
)
670 src
= XEXP (note
, 0);
672 if (! modified_between_p (src
, PREV_INSN (p
), valid_to
)
673 /* Reject hard registers because we don't usually want
674 to use them; we'd rather use a pseudo. */
675 && ! (GET_CODE (src
) == REG
676 && REGNO (src
) < FIRST_PSEUDO_REGISTER
))
683 /* If set in non-simple way, we don't have a value. */
684 if (reg_set_p (x
, p
))
691 /* Return nonzero if register in range [REGNO, ENDREGNO)
692 appears either explicitly or implicitly in X
693 other than being stored into.
695 References contained within the substructure at LOC do not count.
696 LOC may be zero, meaning don't ignore anything. */
699 refers_to_regno_p (regno
, endregno
, x
, loc
)
705 register RTX_CODE code
;
709 /* The contents of a REG_NONNEG note is always zero, so we must come here
710 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
721 /* If we modifying the stack, frame, or argument pointer, it will
722 clobber a virtual register. In fact, we could be more precise,
723 but it isn't worth it. */
724 if ((i
== STACK_POINTER_REGNUM
725 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
726 || i
== ARG_POINTER_REGNUM
728 || i
== FRAME_POINTER_REGNUM
)
729 && regno
>= FIRST_VIRTUAL_REGISTER
&& regno
<= LAST_VIRTUAL_REGISTER
)
733 && regno
< i
+ (i
< FIRST_PSEUDO_REGISTER
734 ? HARD_REGNO_NREGS (i
, GET_MODE (x
))
738 /* If this is a SUBREG of a hard reg, we can see exactly which
739 registers are being modified. Otherwise, handle normally. */
740 if (GET_CODE (SUBREG_REG (x
)) == REG
741 && REGNO (SUBREG_REG (x
)) < FIRST_PSEUDO_REGISTER
)
743 int inner_regno
= REGNO (SUBREG_REG (x
)) + SUBREG_WORD (x
);
745 = inner_regno
+ (inner_regno
< FIRST_PSEUDO_REGISTER
746 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
748 return endregno
> inner_regno
&& regno
< inner_endregno
;
754 if (&SET_DEST (x
) != loc
755 /* Note setting a SUBREG counts as referring to the REG it is in for
756 a pseudo but not for hard registers since we can
757 treat each word individually. */
758 && ((GET_CODE (SET_DEST (x
)) == SUBREG
759 && loc
!= &SUBREG_REG (SET_DEST (x
))
760 && GET_CODE (SUBREG_REG (SET_DEST (x
))) == REG
761 && REGNO (SUBREG_REG (SET_DEST (x
))) >= FIRST_PSEUDO_REGISTER
762 && refers_to_regno_p (regno
, endregno
,
763 SUBREG_REG (SET_DEST (x
)), loc
))
764 || (GET_CODE (SET_DEST (x
)) != REG
765 && refers_to_regno_p (regno
, endregno
, SET_DEST (x
), loc
))))
768 if (code
== CLOBBER
|| loc
== &SET_SRC (x
))
777 /* X does not match, so try its subexpressions. */
779 fmt
= GET_RTX_FORMAT (code
);
780 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
782 if (fmt
[i
] == 'e' && loc
!= &XEXP (x
, i
))
790 if (refers_to_regno_p (regno
, endregno
, XEXP (x
, i
), loc
))
793 else if (fmt
[i
] == 'E')
796 for (j
= XVECLEN (x
, i
) - 1; j
>=0; j
--)
797 if (loc
!= &XVECEXP (x
, i
, j
)
798 && refers_to_regno_p (regno
, endregno
, XVECEXP (x
, i
, j
), loc
))
805 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
806 we check if any register number in X conflicts with the relevant register
807 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
808 contains a MEM (we don't bother checking for memory addresses that can't
809 conflict because we expect this to be a rare case. */
812 reg_overlap_mentioned_p (x
, in
)
817 if (GET_CODE (x
) == SUBREG
)
819 regno
= REGNO (SUBREG_REG (x
));
820 if (regno
< FIRST_PSEUDO_REGISTER
)
821 regno
+= SUBREG_WORD (x
);
823 else if (GET_CODE (x
) == REG
)
825 else if (CONSTANT_P (x
))
827 else if (GET_CODE (x
) == MEM
)
832 if (GET_CODE (in
) == MEM
)
835 fmt
= GET_RTX_FORMAT (GET_CODE (in
));
837 for (i
= GET_RTX_LENGTH (GET_CODE (in
)) - 1; i
>= 0; i
--)
838 if (fmt
[i
] == 'e' && reg_overlap_mentioned_p (x
, XEXP (in
, i
)))
843 else if (GET_CODE (x
) == SCRATCH
|| GET_CODE (x
) == PC
844 || GET_CODE (x
) == CC0
)
845 return reg_mentioned_p (x
, in
);
849 endregno
= regno
+ (regno
< FIRST_PSEUDO_REGISTER
850 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
852 return refers_to_regno_p (regno
, endregno
, in
, NULL_PTR
);
855 /* Used for communications between the next few functions. */
857 static int reg_set_last_unknown
;
858 static rtx reg_set_last_value
;
859 static int reg_set_last_first_regno
, reg_set_last_last_regno
;
861 /* Called via note_stores from reg_set_last. */
864 reg_set_last_1 (x
, pat
)
870 /* If X is not a register, or is not one in the range we care
872 if (GET_CODE (x
) != REG
)
876 last
= first
+ (first
< FIRST_PSEUDO_REGISTER
877 ? HARD_REGNO_NREGS (first
, GET_MODE (x
)) : 1);
879 if (first
>= reg_set_last_last_regno
880 || last
<= reg_set_last_first_regno
)
883 /* If this is a CLOBBER or is some complex LHS, or doesn't modify
884 exactly the registers we care about, show we don't know the value. */
885 if (GET_CODE (pat
) == CLOBBER
|| SET_DEST (pat
) != x
886 || first
!= reg_set_last_first_regno
887 || last
!= reg_set_last_last_regno
)
888 reg_set_last_unknown
= 1;
890 reg_set_last_value
= SET_SRC (pat
);
893 /* Return the last value to which REG was set prior to INSN. If we can't
894 find it easily, return 0.
896 We only return a REG, SUBREG, or constant because it is too hard to
897 check if a MEM remains unchanged. */
900 reg_set_last (x
, insn
)
904 rtx orig_insn
= insn
;
906 reg_set_last_first_regno
= REGNO (x
);
908 reg_set_last_last_regno
909 = reg_set_last_first_regno
910 + (reg_set_last_first_regno
< FIRST_PSEUDO_REGISTER
911 ? HARD_REGNO_NREGS (reg_set_last_first_regno
, GET_MODE (x
)) : 1);
913 reg_set_last_unknown
= 0;
914 reg_set_last_value
= 0;
916 /* Scan backwards until reg_set_last_1 changed one of the above flags.
917 Stop when we reach a label or X is a hard reg and we reach a
918 CALL_INSN (if reg_set_last_last_regno is a hard reg).
920 If we find a set of X, ensure that its SET_SRC remains unchanged. */
922 /* We compare with <= here, because reg_set_last_last_regno
923 is actually the number of the first reg *not* in X. */
925 insn
&& GET_CODE (insn
) != CODE_LABEL
926 && ! (GET_CODE (insn
) == CALL_INSN
927 && reg_set_last_last_regno
<= FIRST_PSEUDO_REGISTER
);
928 insn
= PREV_INSN (insn
))
929 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
931 note_stores (PATTERN (insn
), reg_set_last_1
);
932 if (reg_set_last_unknown
)
934 else if (reg_set_last_value
)
936 if (CONSTANT_P (reg_set_last_value
)
937 || ((GET_CODE (reg_set_last_value
) == REG
938 || GET_CODE (reg_set_last_value
) == SUBREG
)
939 && ! reg_set_between_p (reg_set_last_value
,
941 return reg_set_last_value
;
950 /* This is 1 until after the rtl generation pass. */
951 int rtx_equal_function_value_matters
;
953 /* Return 1 if X and Y are identical-looking rtx's.
954 This is the Lisp function EQUAL for rtx arguments. */
962 register enum rtx_code code
;
967 if (x
== 0 || y
== 0)
971 /* Rtx's of different codes cannot be equal. */
972 if (code
!= GET_CODE (y
))
975 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
976 (REG:SI x) and (REG:HI x) are NOT equivalent. */
978 if (GET_MODE (x
) != GET_MODE (y
))
981 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
984 /* Until rtl generation is complete, don't consider a reference to the
985 return register of the current function the same as the return from a
986 called function. This eases the job of function integration. Once the
987 distinction is no longer needed, they can be considered equivalent. */
988 return (REGNO (x
) == REGNO (y
)
989 && (! rtx_equal_function_value_matters
990 || REG_FUNCTION_VALUE_P (x
) == REG_FUNCTION_VALUE_P (y
)));
991 else if (code
== LABEL_REF
)
992 return XEXP (x
, 0) == XEXP (y
, 0);
993 else if (code
== SYMBOL_REF
)
994 return XSTR (x
, 0) == XSTR (y
, 0);
995 else if (code
== SCRATCH
|| code
== CONST_DOUBLE
)
998 /* Compare the elements. If any pair of corresponding elements
999 fail to match, return 0 for the whole things. */
1001 fmt
= GET_RTX_FORMAT (code
);
1002 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1007 if (XWINT (x
, i
) != XWINT (y
, i
))
1013 if (XINT (x
, i
) != XINT (y
, i
))
1019 /* Two vectors must have the same length. */
1020 if (XVECLEN (x
, i
) != XVECLEN (y
, i
))
1023 /* And the corresponding elements must match. */
1024 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1025 if (rtx_equal_p (XVECEXP (x
, i
, j
), XVECEXP (y
, i
, j
)) == 0)
1030 if (rtx_equal_p (XEXP (x
, i
), XEXP (y
, i
)) == 0)
1036 if (strcmp (XSTR (x
, i
), XSTR (y
, i
)))
1041 /* These are just backpointers, so they don't matter. */
1047 /* It is believed that rtx's at this level will never
1048 contain anything but integers and other rtx's,
1049 except for within LABEL_REFs and SYMBOL_REFs. */
1057 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1058 (X would be the pattern of an insn).
1059 FUN receives two arguments:
1060 the REG, MEM, CC0 or PC being stored in or clobbered,
1061 the SET or CLOBBER rtx that does the store.
1063 If the item being stored in or clobbered is a SUBREG of a hard register,
1064 the SUBREG will be passed. */
1067 note_stores (x
, fun
)
1071 if ((GET_CODE (x
) == SET
|| GET_CODE (x
) == CLOBBER
))
1073 register rtx dest
= SET_DEST (x
);
1074 while ((GET_CODE (dest
) == SUBREG
1075 && (GET_CODE (SUBREG_REG (dest
)) != REG
1076 || REGNO (SUBREG_REG (dest
)) >= FIRST_PSEUDO_REGISTER
))
1077 || GET_CODE (dest
) == ZERO_EXTRACT
1078 || GET_CODE (dest
) == SIGN_EXTRACT
1079 || GET_CODE (dest
) == STRICT_LOW_PART
)
1080 dest
= XEXP (dest
, 0);
1083 else if (GET_CODE (x
) == PARALLEL
)
1086 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1088 register rtx y
= XVECEXP (x
, 0, i
);
1089 if (GET_CODE (y
) == SET
|| GET_CODE (y
) == CLOBBER
)
1091 register rtx dest
= SET_DEST (y
);
1092 while ((GET_CODE (dest
) == SUBREG
1093 && (GET_CODE (SUBREG_REG (dest
)) != REG
1094 || (REGNO (SUBREG_REG (dest
))
1095 >= FIRST_PSEUDO_REGISTER
)))
1096 || GET_CODE (dest
) == ZERO_EXTRACT
1097 || GET_CODE (dest
) == SIGN_EXTRACT
1098 || GET_CODE (dest
) == STRICT_LOW_PART
)
1099 dest
= XEXP (dest
, 0);
1106 /* Return nonzero if X's old contents don't survive after INSN.
1107 This will be true if X is (cc0) or if X is a register and
1108 X dies in INSN or because INSN entirely sets X.
1110 "Entirely set" means set directly and not through a SUBREG,
1111 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1112 Likewise, REG_INC does not count.
1114 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1115 but for this use that makes no difference, since regs don't overlap
1116 during their lifetimes. Therefore, this function may be used
1117 at any time after deaths have been computed (in flow.c).
1119 If REG is a hard reg that occupies multiple machine registers, this
1120 function will only return 1 if each of those registers will be replaced
1124 dead_or_set_p (insn
, x
)
1128 register int regno
, last_regno
;
1131 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1132 if (GET_CODE (x
) == CC0
)
1135 if (GET_CODE (x
) != REG
)
1139 last_regno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
1140 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (x
)) - 1);
1142 for (i
= regno
; i
<= last_regno
; i
++)
1143 if (! dead_or_set_regno_p (insn
, i
))
1149 /* Utility function for dead_or_set_p to check an individual register. Also
1150 called from flow.c. */
1153 dead_or_set_regno_p (insn
, test_regno
)
1157 int regno
, endregno
;
1160 /* REG_READ notes are not normally maintained after reload, so we
1161 ignore them if the are invalid. */
1162 if (! reload_completed
1163 #ifdef PRESERVE_DEATH_INFO_REGNO_P
1164 || PRESERVE_DEATH_INFO_REGNO_P (test_regno
)
1168 /* See if there is a death note for something that includes
1170 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1172 if (REG_NOTE_KIND (link
) != REG_DEAD
1173 || GET_CODE (XEXP (link
, 0)) != REG
)
1176 regno
= REGNO (XEXP (link
, 0));
1177 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1178 : regno
+ HARD_REGNO_NREGS (regno
,
1179 GET_MODE (XEXP (link
, 0))));
1181 if (test_regno
>= regno
&& test_regno
< endregno
)
1186 if (GET_CODE (insn
) == CALL_INSN
1187 && find_regno_fusage (insn
, CLOBBER
, test_regno
))
1190 if (GET_CODE (PATTERN (insn
)) == SET
)
1192 rtx dest
= SET_DEST (PATTERN (insn
));
1194 /* A value is totally replaced if it is the destination or the
1195 destination is a SUBREG of REGNO that does not change the number of
1197 if (GET_CODE (dest
) == SUBREG
1198 && (((GET_MODE_SIZE (GET_MODE (dest
))
1199 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1200 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1201 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1202 dest
= SUBREG_REG (dest
);
1204 if (GET_CODE (dest
) != REG
)
1207 regno
= REGNO (dest
);
1208 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1209 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1211 return (test_regno
>= regno
&& test_regno
< endregno
);
1213 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
1217 for (i
= XVECLEN (PATTERN (insn
), 0) - 1; i
>= 0; i
--)
1219 rtx body
= XVECEXP (PATTERN (insn
), 0, i
);
1221 if (GET_CODE (body
) == SET
|| GET_CODE (body
) == CLOBBER
)
1223 rtx dest
= SET_DEST (body
);
1225 if (GET_CODE (dest
) == SUBREG
1226 && (((GET_MODE_SIZE (GET_MODE (dest
))
1227 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1228 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1229 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1230 dest
= SUBREG_REG (dest
);
1232 if (GET_CODE (dest
) != REG
)
1235 regno
= REGNO (dest
);
1236 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1237 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1239 if (test_regno
>= regno
&& test_regno
< endregno
)
1248 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1249 If DATUM is nonzero, look for one whose datum is DATUM. */
1252 find_reg_note (insn
, kind
, datum
)
1259 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1260 if (REG_NOTE_KIND (link
) == kind
1261 && (datum
== 0 || datum
== XEXP (link
, 0)))
1266 /* Return the reg-note of kind KIND in insn INSN which applies to register
1267 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1268 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1269 it might be the case that the note overlaps REGNO. */
1272 find_regno_note (insn
, kind
, regno
)
1279 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1280 if (REG_NOTE_KIND (link
) == kind
1281 /* Verify that it is a register, so that scratch and MEM won't cause a
1283 && GET_CODE (XEXP (link
, 0)) == REG
1284 && REGNO (XEXP (link
, 0)) <= regno
1285 && ((REGNO (XEXP (link
, 0))
1286 + (REGNO (XEXP (link
, 0)) >= FIRST_PSEUDO_REGISTER
? 1
1287 : HARD_REGNO_NREGS (REGNO (XEXP (link
, 0)),
1288 GET_MODE (XEXP (link
, 0)))))
1294 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1295 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1298 find_reg_fusage (insn
, code
, datum
)
1303 /* If it's not a CALL_INSN, it can't possibly have a
1304 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1305 if (GET_CODE (insn
) != CALL_INSN
)
1311 if (GET_CODE (datum
) != REG
)
1315 for (link
= CALL_INSN_FUNCTION_USAGE (insn
);
1317 link
= XEXP (link
, 1))
1318 if (GET_CODE (XEXP (link
, 0)) == code
1319 && rtx_equal_p (datum
, SET_DEST (XEXP (link
, 0))))
1324 register int regno
= REGNO (datum
);
1326 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1327 to pseudo registers, so don't bother checking. */
1329 if (regno
< FIRST_PSEUDO_REGISTER
)
1331 int end_regno
= regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (datum
));
1334 for (i
= regno
; i
< end_regno
; i
++)
1335 if (find_regno_fusage (insn
, code
, i
))
1343 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1344 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1347 find_regno_fusage (insn
, code
, regno
)
1354 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1355 to pseudo registers, so don't bother checking. */
1357 if (regno
>= FIRST_PSEUDO_REGISTER
1358 || GET_CODE (insn
) != CALL_INSN
)
1361 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
1363 register int regnote
;
1366 if (GET_CODE (op
= XEXP (link
, 0)) == code
1367 && GET_CODE (SET_DEST (op
)) == REG
1368 && (regnote
= REGNO (SET_DEST (op
))) <= regno
1370 + HARD_REGNO_NREGS (regnote
, GET_MODE (SET_DEST (op
)))
1378 /* Remove register note NOTE from the REG_NOTES of INSN. */
1381 remove_note (insn
, note
)
1387 if (REG_NOTES (insn
) == note
)
1389 REG_NOTES (insn
) = XEXP (note
, 1);
1393 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1394 if (XEXP (link
, 1) == note
)
1396 XEXP (link
, 1) = XEXP (note
, 1);
1403 /* Nonzero if X contains any volatile instructions. These are instructions
1404 which may cause unpredictable machine state instructions, and thus no
1405 instructions should be moved or combined across them. This includes
1406 only volatile asms and UNSPEC_VOLATILE instructions. */
1412 register RTX_CODE code
;
1414 code
= GET_CODE (x
);
1434 case UNSPEC_VOLATILE
:
1435 /* case TRAP_IF: This isn't clear yet. */
1439 if (MEM_VOLATILE_P (x
))
1446 /* Recursively scan the operands of this expression. */
1449 register char *fmt
= GET_RTX_FORMAT (code
);
1452 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1456 if (volatile_insn_p (XEXP (x
, i
)))
1462 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1463 if (volatile_insn_p (XVECEXP (x
, i
, j
)))
1471 /* Nonzero if X contains any volatile memory references
1472 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1478 register RTX_CODE code
;
1480 code
= GET_CODE (x
);
1499 case UNSPEC_VOLATILE
:
1500 /* case TRAP_IF: This isn't clear yet. */
1505 if (MEM_VOLATILE_P (x
))
1512 /* Recursively scan the operands of this expression. */
1515 register char *fmt
= GET_RTX_FORMAT (code
);
1518 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1522 if (volatile_refs_p (XEXP (x
, i
)))
1528 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1529 if (volatile_refs_p (XVECEXP (x
, i
, j
)))
1537 /* Similar to above, except that it also rejects register pre- and post-
1544 register RTX_CODE code
;
1546 code
= GET_CODE (x
);
1564 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1565 when some combination can't be done. If we see one, don't think
1566 that we can simplify the expression. */
1567 return (GET_MODE (x
) != VOIDmode
);
1574 case UNSPEC_VOLATILE
:
1575 /* case TRAP_IF: This isn't clear yet. */
1580 if (MEM_VOLATILE_P (x
))
1587 /* Recursively scan the operands of this expression. */
1590 register char *fmt
= GET_RTX_FORMAT (code
);
1593 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1597 if (side_effects_p (XEXP (x
, i
)))
1603 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1604 if (side_effects_p (XVECEXP (x
, i
, j
)))
1612 /* Return nonzero if evaluating rtx X might cause a trap. */
1624 code
= GET_CODE (x
);
1627 /* Handle these cases quickly. */
1639 /* Conditional trap can trap! */
1640 case UNSPEC_VOLATILE
:
1644 /* Memory ref can trap unless it's a static var or a stack slot. */
1646 return rtx_addr_can_trap_p (XEXP (x
, 0));
1648 /* Division by a non-constant might trap. */
1653 if (! CONSTANT_P (XEXP (x
, 1))
1654 || GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
1656 /* This was const0_rtx, but by not using that,
1657 we can link this file into other programs. */
1658 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
&& INTVAL (XEXP (x
, 1)) == 0)
1663 /* An EXPR_LIST is used to represent a function call. This
1664 certainly may trap. */
1668 /* Any floating arithmetic may trap. */
1669 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
1673 fmt
= GET_RTX_FORMAT (code
);
1674 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1678 if (may_trap_p (XEXP (x
, i
)))
1681 else if (fmt
[i
] == 'E')
1684 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1685 if (may_trap_p (XVECEXP (x
, i
, j
)))
1692 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1693 i.e., an inequality. */
1696 inequality_comparisons_p (x
)
1700 register int len
, i
;
1701 register enum rtx_code code
= GET_CODE (x
);
1730 len
= GET_RTX_LENGTH (code
);
1731 fmt
= GET_RTX_FORMAT (code
);
1733 for (i
= 0; i
< len
; i
++)
1737 if (inequality_comparisons_p (XEXP (x
, i
)))
1740 else if (fmt
[i
] == 'E')
1743 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1744 if (inequality_comparisons_p (XVECEXP (x
, i
, j
)))
1752 /* Replace any occurrence of FROM in X with TO.
1754 Note that copying is not done so X must not be shared unless all copies
1755 are to be modified. */
1758 replace_rtx (x
, from
, to
)
1767 /* Allow this function to make replacements in EXPR_LISTs. */
1771 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
1772 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
1775 XEXP (x
, i
) = replace_rtx (XEXP (x
, i
), from
, to
);
1776 else if (fmt
[i
] == 'E')
1777 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1778 XVECEXP (x
, i
, j
) = replace_rtx (XVECEXP (x
, i
, j
), from
, to
);
1784 /* Throughout the rtx X, replace many registers according to REG_MAP.
1785 Return the replacement for X (which may be X with altered contents).
1786 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
1787 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
1789 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
1790 should not be mapped to pseudos or vice versa since validate_change
1793 If REPLACE_DEST is 1, replacements are also done in destinations;
1794 otherwise, only sources are replaced. */
1797 replace_regs (x
, reg_map
, nregs
, replace_dest
)
1803 register enum rtx_code code
;
1810 code
= GET_CODE (x
);
1824 /* Verify that the register has an entry before trying to access it. */
1825 if (REGNO (x
) < nregs
&& reg_map
[REGNO (x
)] != 0)
1827 /* SUBREGs can't be shared. Always return a copy to ensure that if
1828 this replacement occurs more than once then each instance will
1829 get distinct rtx. */
1830 if (GET_CODE (reg_map
[REGNO (x
)]) == SUBREG
)
1831 return copy_rtx (reg_map
[REGNO (x
)]);
1832 return reg_map
[REGNO (x
)];
1837 /* Prevent making nested SUBREGs. */
1838 if (GET_CODE (SUBREG_REG (x
)) == REG
&& REGNO (SUBREG_REG (x
)) < nregs
1839 && reg_map
[REGNO (SUBREG_REG (x
))] != 0
1840 && GET_CODE (reg_map
[REGNO (SUBREG_REG (x
))]) == SUBREG
)
1842 rtx map_val
= reg_map
[REGNO (SUBREG_REG (x
))];
1843 rtx map_inner
= SUBREG_REG (map_val
);
1845 if (GET_MODE (x
) == GET_MODE (map_inner
))
1849 /* We cannot call gen_rtx here since we may be linked with
1851 /* Let's try clobbering the incoming SUBREG and see
1852 if this is really safe. */
1853 SUBREG_REG (x
) = map_inner
;
1854 SUBREG_WORD (x
) += SUBREG_WORD (map_val
);
1857 rtx
new = rtx_alloc (SUBREG
);
1858 PUT_MODE (new, GET_MODE (x
));
1859 SUBREG_REG (new) = map_inner
;
1860 SUBREG_WORD (new) = SUBREG_WORD (x
) + SUBREG_WORD (map_val
);
1868 SET_DEST (x
) = replace_regs (SET_DEST (x
), reg_map
, nregs
, 0);
1870 else if (GET_CODE (SET_DEST (x
)) == MEM
1871 || GET_CODE (SET_DEST (x
)) == STRICT_LOW_PART
)
1872 /* Even if we are not to replace destinations, replace register if it
1873 is CONTAINED in destination (destination is memory or
1874 STRICT_LOW_PART). */
1875 XEXP (SET_DEST (x
), 0) = replace_regs (XEXP (SET_DEST (x
), 0),
1877 else if (GET_CODE (SET_DEST (x
)) == ZERO_EXTRACT
)
1878 /* Similarly, for ZERO_EXTRACT we replace all operands. */
1881 SET_SRC (x
) = replace_regs (SET_SRC (x
), reg_map
, nregs
, 0);
1888 fmt
= GET_RTX_FORMAT (code
);
1889 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1892 XEXP (x
, i
) = replace_regs (XEXP (x
, i
), reg_map
, nregs
, replace_dest
);
1896 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1897 XVECEXP (x
, i
, j
) = replace_regs (XVECEXP (x
, i
, j
), reg_map
,
1898 nregs
, replace_dest
);
1904 /* Return 1 if X, the SRC_SRC of SET of (pc) contain a REG or MEM that is
1905 not in the constant pool and not in the condition of an IF_THEN_ELSE. */
1908 jmp_uses_reg_or_mem (x
)
1911 enum rtx_code code
= GET_CODE (x
);
1926 return ! (GET_CODE (XEXP (x
, 0)) == SYMBOL_REF
1927 && CONSTANT_POOL_ADDRESS_P (XEXP (x
, 0)));
1930 return (jmp_uses_reg_or_mem (XEXP (x
, 1))
1931 || jmp_uses_reg_or_mem (XEXP (x
, 2)));
1933 case PLUS
: case MINUS
: case MULT
:
1934 return (jmp_uses_reg_or_mem (XEXP (x
, 0))
1935 || jmp_uses_reg_or_mem (XEXP (x
, 1)));
1941 fmt
= GET_RTX_FORMAT (code
);
1942 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1945 && jmp_uses_reg_or_mem (XEXP (x
, i
)))
1949 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1950 if (jmp_uses_reg_or_mem (XVECEXP (x
, i
, j
)))
1957 /* Return nonzero if INSN is an indirect jump (aka computed jump).
1959 Tablejumps and casesi insns are not considered indirect jumps;
1960 we can recognize them by a (use (lael_ref)). */
1963 computed_jump_p (insn
)
1967 if (GET_CODE (insn
) == JUMP_INSN
)
1969 rtx pat
= PATTERN (insn
);
1971 if (GET_CODE (pat
) == PARALLEL
)
1973 int len
= XVECLEN (pat
, 0);
1974 int has_use_labelref
= 0;
1976 for (i
= len
- 1; i
>= 0; i
--)
1977 if (GET_CODE (XVECEXP (pat
, 0, i
)) == USE
1978 && (GET_CODE (XEXP (XVECEXP (pat
, 0, i
), 0))
1980 has_use_labelref
= 1;
1982 if (! has_use_labelref
)
1983 for (i
= len
- 1; i
>= 0; i
--)
1984 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
1985 && SET_DEST (XVECEXP (pat
, 0, i
)) == pc_rtx
1986 && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat
, 0, i
))))
1989 else if (GET_CODE (pat
) == SET
1990 && SET_DEST (pat
) == pc_rtx
1991 && jmp_uses_reg_or_mem (SET_SRC (pat
)))