1 /* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
27 #include "hard-reg-set.h"
29 /* Forward declarations */
30 static void set_of_1
PARAMS ((rtx
, rtx
, void *));
31 static void insn_dependent_p_1
PARAMS ((rtx
, rtx
, void *));
32 static int computed_jump_p_1
PARAMS ((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
);
51 register const char *fmt
;
56 return ! RTX_UNCHANGING_P (x
) || rtx_unstable_p (XEXP (x
, 0));
69 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
70 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
71 /* The arg pointer varies if it is not a fixed register. */
72 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
])
73 || RTX_UNCHANGING_P (x
))
75 #ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
76 /* ??? When call-clobbered, the value is stable modulo the restore
77 that must happen after a call. This currently screws up local-alloc
78 into believing that the restore is not needed. */
79 if (x
== pic_offset_table_rtx
)
85 if (MEM_VOLATILE_P (x
))
94 fmt
= GET_RTX_FORMAT (code
);
95 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
98 if (rtx_unstable_p (XEXP (x
, i
)))
101 else if (fmt
[i
] == 'E')
104 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
105 if (rtx_unstable_p (XVECEXP (x
, i
, j
)))
112 /* Return 1 if X has a value that can vary even between two
113 executions of the program. 0 means X can be compared reliably
114 against certain constants or near-constants.
115 FOR_ALIAS is nonzero if we are called from alias analysis; if it is
116 zero, we are slightly more conservative.
117 The frame pointer and the arg pointer are considered constant. */
120 rtx_varies_p (x
, for_alias
)
124 register RTX_CODE code
= GET_CODE (x
);
126 register const char *fmt
;
131 return ! RTX_UNCHANGING_P (x
) || rtx_varies_p (XEXP (x
, 0), for_alias
);
144 /* Note that we have to test for the actual rtx used for the frame
145 and arg pointers and not just the register number in case we have
146 eliminated the frame and/or arg pointer and are using it
148 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
149 /* The arg pointer varies if it is not a fixed register. */
150 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
]))
152 if (x
== pic_offset_table_rtx
153 #ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
154 /* ??? When call-clobbered, the value is stable modulo the restore
155 that must happen after a call. This currently screws up
156 local-alloc into believing that the restore is not needed, so we
157 must return 0 only if we are called from alias analysis. */
165 /* The operand 0 of a LO_SUM is considered constant
166 (in fact it is related specifically to operand 1)
167 during alias analysis. */
168 return (! for_alias
&& rtx_varies_p (XEXP (x
, 0), for_alias
))
169 || rtx_varies_p (XEXP (x
, 1), for_alias
);
172 if (MEM_VOLATILE_P (x
))
181 fmt
= GET_RTX_FORMAT (code
);
182 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
185 if (rtx_varies_p (XEXP (x
, i
), for_alias
))
188 else if (fmt
[i
] == 'E')
191 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
192 if (rtx_varies_p (XVECEXP (x
, i
, j
), for_alias
))
199 /* Return 0 if the use of X as an address in a MEM can cause a trap. */
202 rtx_addr_can_trap_p (x
)
205 register enum rtx_code code
= GET_CODE (x
);
210 return SYMBOL_REF_WEAK (x
);
216 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
217 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
218 || x
== stack_pointer_rtx
219 /* The arg pointer varies if it is not a fixed register. */
220 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
]))
222 /* All of the virtual frame registers are stack references. */
223 if (REGNO (x
) >= FIRST_VIRTUAL_REGISTER
224 && REGNO (x
) <= LAST_VIRTUAL_REGISTER
)
229 return rtx_addr_can_trap_p (XEXP (x
, 0));
232 /* An address is assumed not to trap if it is an address that can't
233 trap plus a constant integer or it is the pic register plus a
235 return ! ((! rtx_addr_can_trap_p (XEXP (x
, 0))
236 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
237 || (XEXP (x
, 0) == pic_offset_table_rtx
238 && CONSTANT_P (XEXP (x
, 1))));
242 return rtx_addr_can_trap_p (XEXP (x
, 1));
249 return rtx_addr_can_trap_p (XEXP (x
, 0));
255 /* If it isn't one of the case above, it can cause a trap. */
259 /* Return 1 if X refers to a memory location whose address
260 cannot be compared reliably with constant addresses,
261 or if X refers to a BLKmode memory object.
262 FOR_ALIAS is nonzero if we are called from alias analysis; if it is
263 zero, we are slightly more conservative. */
266 rtx_addr_varies_p (x
, for_alias
)
270 register enum rtx_code code
;
272 register const char *fmt
;
279 return GET_MODE (x
) == BLKmode
|| rtx_varies_p (XEXP (x
, 0), for_alias
);
281 fmt
= GET_RTX_FORMAT (code
);
282 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
285 if (rtx_addr_varies_p (XEXP (x
, i
), for_alias
))
288 else if (fmt
[i
] == 'E')
291 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
292 if (rtx_addr_varies_p (XVECEXP (x
, i
, j
), for_alias
))
298 /* Return the value of the integer term in X, if one is apparent;
300 Only obvious integer terms are detected.
301 This is used in cse.c with the `related_value' field.*/
307 if (GET_CODE (x
) == CONST
)
310 if (GET_CODE (x
) == MINUS
311 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
312 return - INTVAL (XEXP (x
, 1));
313 if (GET_CODE (x
) == PLUS
314 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
315 return INTVAL (XEXP (x
, 1));
319 /* If X is a constant, return the value sans apparent integer term;
321 Only obvious integer terms are detected. */
324 get_related_value (x
)
327 if (GET_CODE (x
) != CONST
)
330 if (GET_CODE (x
) == PLUS
331 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
333 else if (GET_CODE (x
) == MINUS
334 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
339 /* Return the number of places FIND appears within X. If COUNT_DEST is
340 zero, we do not count occurrences inside the destination of a SET. */
343 count_occurrences (x
, find
, count_dest
)
349 const char *format_ptr
;
369 if (GET_CODE (find
) == MEM
&& rtx_equal_p (x
, find
))
374 if (SET_DEST (x
) == find
&& ! count_dest
)
375 return count_occurrences (SET_SRC (x
), find
, count_dest
);
382 format_ptr
= GET_RTX_FORMAT (code
);
385 for (i
= 0; i
< GET_RTX_LENGTH (code
); i
++)
387 switch (*format_ptr
++)
390 count
+= count_occurrences (XEXP (x
, i
), find
, count_dest
);
394 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
395 count
+= count_occurrences (XVECEXP (x
, i
, j
), find
, count_dest
);
402 /* Nonzero if register REG appears somewhere within IN.
403 Also works if REG is not a register; in this case it checks
404 for a subexpression of IN that is Lisp "equal" to REG. */
407 reg_mentioned_p (reg
, in
)
408 register rtx reg
, in
;
410 register const char *fmt
;
412 register enum rtx_code code
;
420 if (GET_CODE (in
) == LABEL_REF
)
421 return reg
== XEXP (in
, 0);
423 code
= GET_CODE (in
);
427 /* Compare registers by number. */
429 return GET_CODE (reg
) == REG
&& REGNO (in
) == REGNO (reg
);
431 /* These codes have no constituent expressions
439 return GET_CODE (reg
) == CONST_INT
&& INTVAL (in
) == INTVAL (reg
);
442 /* These are kept unique for a given value. */
449 if (GET_CODE (reg
) == code
&& rtx_equal_p (reg
, in
))
452 fmt
= GET_RTX_FORMAT (code
);
454 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
459 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; j
--)
460 if (reg_mentioned_p (reg
, XVECEXP (in
, i
, j
)))
463 else if (fmt
[i
] == 'e'
464 && reg_mentioned_p (reg
, XEXP (in
, i
)))
470 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
471 no CODE_LABEL insn. */
474 no_labels_between_p (beg
, end
)
478 for (p
= NEXT_INSN (beg
); p
!= end
; p
= NEXT_INSN (p
))
479 if (GET_CODE (p
) == CODE_LABEL
)
484 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
485 no JUMP_INSN insn. */
488 no_jumps_between_p (beg
, end
)
492 for (p
= NEXT_INSN (beg
); p
!= end
; p
= NEXT_INSN (p
))
493 if (GET_CODE (p
) == JUMP_INSN
)
498 /* Nonzero if register REG is used in an insn between
499 FROM_INSN and TO_INSN (exclusive of those two). */
502 reg_used_between_p (reg
, from_insn
, to_insn
)
503 rtx reg
, from_insn
, to_insn
;
507 if (from_insn
== to_insn
)
510 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
512 && (reg_overlap_mentioned_p (reg
, PATTERN (insn
))
513 || (GET_CODE (insn
) == CALL_INSN
514 && (find_reg_fusage (insn
, USE
, reg
)
515 || find_reg_fusage (insn
, CLOBBER
, reg
)))))
520 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
521 is entirely replaced by a new value and the only use is as a SET_DEST,
522 we do not consider it a reference. */
525 reg_referenced_p (x
, body
)
531 switch (GET_CODE (body
))
534 if (reg_overlap_mentioned_p (x
, SET_SRC (body
)))
537 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
538 of a REG that occupies all of the REG, the insn references X if
539 it is mentioned in the destination. */
540 if (GET_CODE (SET_DEST (body
)) != CC0
541 && GET_CODE (SET_DEST (body
)) != PC
542 && GET_CODE (SET_DEST (body
)) != REG
543 && ! (GET_CODE (SET_DEST (body
)) == SUBREG
544 && GET_CODE (SUBREG_REG (SET_DEST (body
))) == REG
545 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body
))))
546 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)
547 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body
)))
548 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)))
549 && reg_overlap_mentioned_p (x
, SET_DEST (body
)))
554 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
555 if (reg_overlap_mentioned_p (x
, ASM_OPERANDS_INPUT (body
, i
)))
562 return reg_overlap_mentioned_p (x
, body
);
565 return reg_overlap_mentioned_p (x
, TRAP_CONDITION (body
));
568 case UNSPEC_VOLATILE
:
569 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
570 if (reg_overlap_mentioned_p (x
, XVECEXP (body
, 0, i
)))
575 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
576 if (reg_referenced_p (x
, XVECEXP (body
, 0, i
)))
581 if (GET_CODE (XEXP (body
, 0)) == MEM
)
582 if (reg_overlap_mentioned_p (x
, XEXP (XEXP (body
, 0), 0)))
587 if (reg_overlap_mentioned_p (x
, COND_EXEC_TEST (body
)))
589 return reg_referenced_p (x
, COND_EXEC_CODE (body
));
596 /* Nonzero if register REG is referenced in an insn between
597 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
601 reg_referenced_between_p (reg
, from_insn
, to_insn
)
602 rtx reg
, from_insn
, to_insn
;
606 if (from_insn
== to_insn
)
609 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
611 && (reg_referenced_p (reg
, PATTERN (insn
))
612 || (GET_CODE (insn
) == CALL_INSN
613 && find_reg_fusage (insn
, USE
, reg
))))
618 /* Nonzero if register REG is set or clobbered in an insn between
619 FROM_INSN and TO_INSN (exclusive of those two). */
622 reg_set_between_p (reg
, from_insn
, to_insn
)
623 rtx reg
, from_insn
, to_insn
;
627 if (from_insn
== to_insn
)
630 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
631 if (INSN_P (insn
) && reg_set_p (reg
, insn
))
636 /* Internals of reg_set_between_p. */
638 reg_set_p (reg
, insn
)
643 /* We can be passed an insn or part of one. If we are passed an insn,
644 check if a side-effect of the insn clobbers REG. */
647 if (FIND_REG_INC_NOTE (insn
, reg
)
648 || (GET_CODE (insn
) == CALL_INSN
649 /* We'd like to test call_used_regs here, but rtlanal.c can't
650 reference that variable due to its use in genattrtab. So
651 we'll just be more conservative.
653 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
654 information holds all clobbered registers. */
655 && ((GET_CODE (reg
) == REG
656 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
657 || GET_CODE (reg
) == MEM
658 || find_reg_fusage (insn
, CLOBBER
, reg
))))
661 body
= PATTERN (insn
);
664 return set_of (reg
, insn
) != NULL_RTX
;
667 /* Similar to reg_set_between_p, but check all registers in X. Return 0
668 only if none of them are modified between START and END. Do not
669 consider non-registers one way or the other. */
672 regs_set_between_p (x
, start
, end
)
676 enum rtx_code code
= GET_CODE (x
);
692 return reg_set_between_p (x
, start
, end
);
698 fmt
= GET_RTX_FORMAT (code
);
699 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
701 if (fmt
[i
] == 'e' && regs_set_between_p (XEXP (x
, i
), start
, end
))
704 else if (fmt
[i
] == 'E')
705 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
706 if (regs_set_between_p (XVECEXP (x
, i
, j
), start
, end
))
713 /* Similar to reg_set_between_p, but check all registers in X. Return 0
714 only if none of them are modified between START and END. Return 1 if
715 X contains a MEM; this routine does not perform any memory aliasing. */
718 modified_between_p (x
, start
, end
)
722 enum rtx_code code
= GET_CODE (x
);
740 /* If the memory is not constant, assume it is modified. If it is
741 constant, we still have to check the address. */
742 if (! RTX_UNCHANGING_P (x
))
747 return reg_set_between_p (x
, start
, end
);
753 fmt
= GET_RTX_FORMAT (code
);
754 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
756 if (fmt
[i
] == 'e' && modified_between_p (XEXP (x
, i
), start
, end
))
759 else if (fmt
[i
] == 'E')
760 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
761 if (modified_between_p (XVECEXP (x
, i
, j
), start
, end
))
768 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
769 of them are modified in INSN. Return 1 if X contains a MEM; this routine
770 does not perform any memory aliasing. */
773 modified_in_p (x
, insn
)
777 enum rtx_code code
= GET_CODE (x
);
795 /* If the memory is not constant, assume it is modified. If it is
796 constant, we still have to check the address. */
797 if (! RTX_UNCHANGING_P (x
))
802 return reg_set_p (x
, insn
);
808 fmt
= GET_RTX_FORMAT (code
);
809 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
811 if (fmt
[i
] == 'e' && modified_in_p (XEXP (x
, i
), insn
))
814 else if (fmt
[i
] == 'E')
815 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
816 if (modified_in_p (XVECEXP (x
, i
, j
), insn
))
823 /* Return true if anything in insn X is (anti,output,true) dependent on
824 anything in insn Y. */
827 insn_dependent_p (x
, y
)
832 if (! INSN_P (x
) || ! INSN_P (y
))
836 note_stores (PATTERN (x
), insn_dependent_p_1
, &tmp
);
841 note_stores (PATTERN (y
), insn_dependent_p_1
, &tmp
);
848 /* A helper routine for insn_dependent_p called through note_stores. */
851 insn_dependent_p_1 (x
, pat
, data
)
853 rtx pat ATTRIBUTE_UNUSED
;
856 rtx
* pinsn
= (rtx
*) data
;
858 if (*pinsn
&& reg_mentioned_p (x
, *pinsn
))
862 /* Helper function for set_of. */
870 set_of_1 (x
, pat
, data1
)
875 struct set_of_data
*data
= (struct set_of_data
*) (data1
);
876 if (rtx_equal_p (x
, data
->pat
)
877 || (GET_CODE (x
) != MEM
&& reg_overlap_mentioned_p (data
->pat
, x
)))
881 /* Give an INSN, return a SET or CLOBBER expression that does modify PAT
882 (eighter directly or via STRICT_LOW_PART and similar modifiers). */
887 struct set_of_data data
;
888 data
.found
= NULL_RTX
;
890 note_stores (INSN_P (insn
) ? PATTERN (insn
) : insn
, set_of_1
, &data
);
894 /* Given an INSN, return a SET expression if this insn has only a single SET.
895 It may also have CLOBBERs, USEs, or SET whose output
896 will not be used, which we ignore. */
899 single_set_2 (insn
, pat
)
903 int set_verified
= 1;
906 if (GET_CODE (pat
) == PARALLEL
)
908 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
910 rtx sub
= XVECEXP (pat
, 0, i
);
911 switch (GET_CODE (sub
))
918 /* We can consider insns having multiple sets, where all
919 but one are dead as single set insns. In common case
920 only single set is present in the pattern so we want
921 to avoid checking for REG_UNUSED notes unless neccesary.
923 When we reach set first time, we just expect this is
924 the single set we are looking for and only when more
925 sets are found in the insn, we check them. */
928 if (find_reg_note (insn
, REG_UNUSED
, SET_DEST (set
))
929 && !side_effects_p (set
))
935 set
= sub
, set_verified
= 0;
936 else if (!find_reg_note (insn
, REG_UNUSED
, SET_DEST (sub
))
937 || side_effects_p (sub
))
949 /* Given an INSN, return nonzero if it has more than one SET, else return
959 /* INSN must be an insn. */
963 /* Only a PARALLEL can have multiple SETs. */
964 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
966 for (i
= 0, found
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
967 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, i
)) == SET
)
969 /* If we have already found a SET, then return now. */
977 /* Either zero or one SET. */
981 /* Return nonzero if the destination of SET equals the source
982 and there are no side effects. */
988 rtx src
= SET_SRC (set
);
989 rtx dst
= SET_DEST (set
);
991 if (side_effects_p (src
) || side_effects_p (dst
))
994 if (GET_CODE (dst
) == MEM
&& GET_CODE (src
) == MEM
)
995 return rtx_equal_p (dst
, src
);
997 if (GET_CODE (dst
) == SIGN_EXTRACT
998 || GET_CODE (dst
) == ZERO_EXTRACT
)
999 return rtx_equal_p (XEXP (dst
, 0), src
)
1000 && ! BYTES_BIG_ENDIAN
&& XEXP (dst
, 2) == const0_rtx
;
1002 if (GET_CODE (dst
) == STRICT_LOW_PART
)
1003 dst
= XEXP (dst
, 0);
1005 if (GET_CODE (src
) == SUBREG
&& GET_CODE (dst
) == SUBREG
)
1007 if (SUBREG_BYTE (src
) != SUBREG_BYTE (dst
))
1009 src
= SUBREG_REG (src
);
1010 dst
= SUBREG_REG (dst
);
1013 return (GET_CODE (src
) == REG
&& GET_CODE (dst
) == REG
1014 && REGNO (src
) == REGNO (dst
));
1017 /* Return the last thing that X was assigned from before *PINSN. If VALID_TO
1018 is not NULL_RTX then verify that the object is not modified up to VALID_TO.
1019 If the object was modified, if we hit a partial assignment to X, or hit a
1020 CODE_LABEL first, return X. If we found an assignment, update *PINSN to
1021 point to it. ALLOW_HWREG is set to 1 if hardware registers are allowed to
1025 find_last_value (x
, pinsn
, valid_to
, allow_hwreg
)
1033 for (p
= PREV_INSN (*pinsn
); p
&& GET_CODE (p
) != CODE_LABEL
;
1037 rtx set
= single_set (p
);
1038 rtx note
= find_reg_note (p
, REG_EQUAL
, NULL_RTX
);
1040 if (set
&& rtx_equal_p (x
, SET_DEST (set
)))
1042 rtx src
= SET_SRC (set
);
1044 if (note
&& GET_CODE (XEXP (note
, 0)) != EXPR_LIST
)
1045 src
= XEXP (note
, 0);
1047 if ((valid_to
== NULL_RTX
1048 || ! modified_between_p (src
, PREV_INSN (p
), valid_to
))
1049 /* Reject hard registers because we don't usually want
1050 to use them; we'd rather use a pseudo. */
1051 && (! (GET_CODE (src
) == REG
1052 && REGNO (src
) < FIRST_PSEUDO_REGISTER
) || allow_hwreg
))
1059 /* If set in non-simple way, we don't have a value. */
1060 if (reg_set_p (x
, p
))
1067 /* Return nonzero if register in range [REGNO, ENDREGNO)
1068 appears either explicitly or implicitly in X
1069 other than being stored into.
1071 References contained within the substructure at LOC do not count.
1072 LOC may be zero, meaning don't ignore anything. */
1075 refers_to_regno_p (regno
, endregno
, x
, loc
)
1076 unsigned int regno
, endregno
;
1081 unsigned int x_regno
;
1086 /* The contents of a REG_NONNEG note is always zero, so we must come here
1087 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
1091 code
= GET_CODE (x
);
1096 x_regno
= REGNO (x
);
1098 /* If we modifying the stack, frame, or argument pointer, it will
1099 clobber a virtual register. In fact, we could be more precise,
1100 but it isn't worth it. */
1101 if ((x_regno
== STACK_POINTER_REGNUM
1102 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1103 || x_regno
== ARG_POINTER_REGNUM
1105 || x_regno
== FRAME_POINTER_REGNUM
)
1106 && regno
>= FIRST_VIRTUAL_REGISTER
&& regno
<= LAST_VIRTUAL_REGISTER
)
1109 return (endregno
> x_regno
1110 && regno
< x_regno
+ (x_regno
< FIRST_PSEUDO_REGISTER
1111 ? HARD_REGNO_NREGS (x_regno
, GET_MODE (x
))
1115 /* If this is a SUBREG of a hard reg, we can see exactly which
1116 registers are being modified. Otherwise, handle normally. */
1117 if (GET_CODE (SUBREG_REG (x
)) == REG
1118 && REGNO (SUBREG_REG (x
)) < FIRST_PSEUDO_REGISTER
)
1120 unsigned int inner_regno
= subreg_regno (x
);
1121 unsigned int inner_endregno
1122 = inner_regno
+ (inner_regno
< FIRST_PSEUDO_REGISTER
1123 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
1125 return endregno
> inner_regno
&& regno
< inner_endregno
;
1131 if (&SET_DEST (x
) != loc
1132 /* Note setting a SUBREG counts as referring to the REG it is in for
1133 a pseudo but not for hard registers since we can
1134 treat each word individually. */
1135 && ((GET_CODE (SET_DEST (x
)) == SUBREG
1136 && loc
!= &SUBREG_REG (SET_DEST (x
))
1137 && GET_CODE (SUBREG_REG (SET_DEST (x
))) == REG
1138 && REGNO (SUBREG_REG (SET_DEST (x
))) >= FIRST_PSEUDO_REGISTER
1139 && refers_to_regno_p (regno
, endregno
,
1140 SUBREG_REG (SET_DEST (x
)), loc
))
1141 || (GET_CODE (SET_DEST (x
)) != REG
1142 && refers_to_regno_p (regno
, endregno
, SET_DEST (x
), loc
))))
1145 if (code
== CLOBBER
|| loc
== &SET_SRC (x
))
1154 /* X does not match, so try its subexpressions. */
1156 fmt
= GET_RTX_FORMAT (code
);
1157 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1159 if (fmt
[i
] == 'e' && loc
!= &XEXP (x
, i
))
1167 if (refers_to_regno_p (regno
, endregno
, XEXP (x
, i
), loc
))
1170 else if (fmt
[i
] == 'E')
1173 for (j
= XVECLEN (x
, i
) - 1; j
>=0; j
--)
1174 if (loc
!= &XVECEXP (x
, i
, j
)
1175 && refers_to_regno_p (regno
, endregno
, XVECEXP (x
, i
, j
), loc
))
1182 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
1183 we check if any register number in X conflicts with the relevant register
1184 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
1185 contains a MEM (we don't bother checking for memory addresses that can't
1186 conflict because we expect this to be a rare case. */
1189 reg_overlap_mentioned_p (x
, in
)
1192 unsigned int regno
, endregno
;
1194 /* Overly conservative. */
1195 if (GET_CODE (x
) == STRICT_LOW_PART
)
1198 /* If either argument is a constant, then modifying X can not affect IN. */
1199 if (CONSTANT_P (x
) || CONSTANT_P (in
))
1202 switch (GET_CODE (x
))
1205 regno
= REGNO (SUBREG_REG (x
));
1206 if (regno
< FIRST_PSEUDO_REGISTER
)
1207 regno
= subreg_regno (x
);
1213 endregno
= regno
+ (regno
< FIRST_PSEUDO_REGISTER
1214 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
1215 return refers_to_regno_p (regno
, endregno
, in
, (rtx
*)0);
1222 if (GET_CODE (in
) == MEM
)
1225 fmt
= GET_RTX_FORMAT (GET_CODE (in
));
1226 for (i
= GET_RTX_LENGTH (GET_CODE (in
)) - 1; i
>= 0; i
--)
1227 if (fmt
[i
] == 'e' && reg_overlap_mentioned_p (x
, XEXP (in
, i
)))
1236 return reg_mentioned_p (x
, in
);
1242 /* If any register in here refers to it we return true. */
1243 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1244 if (XEXP (XVECEXP (x
, 0, i
), 0) != 0
1245 && reg_overlap_mentioned_p (XEXP (XVECEXP (x
, 0, i
), 0), in
))
1257 /* Return the last value to which REG was set prior to INSN. If we can't
1258 find it easily, return 0.
1260 We only return a REG, SUBREG, or constant because it is too hard to
1261 check if a MEM remains unchanged. */
1264 reg_set_last (x
, insn
)
1268 rtx orig_insn
= insn
;
1270 /* Scan backwards until reg_set_last_1 changed one of the above flags.
1271 Stop when we reach a label or X is a hard reg and we reach a
1272 CALL_INSN (if reg_set_last_last_regno is a hard reg).
1274 If we find a set of X, ensure that its SET_SRC remains unchanged. */
1276 /* We compare with <= here, because reg_set_last_last_regno
1277 is actually the number of the first reg *not* in X. */
1279 insn
&& GET_CODE (insn
) != CODE_LABEL
1280 && ! (GET_CODE (insn
) == CALL_INSN
1281 && REGNO (x
) <= FIRST_PSEUDO_REGISTER
);
1282 insn
= PREV_INSN (insn
))
1285 rtx set
= set_of (x
, insn
);
1286 /* OK, this function modify our register. See if we understand it. */
1290 if (GET_CODE (set
) != SET
|| SET_DEST (set
) != x
)
1292 last_value
= SET_SRC (x
);
1293 if (CONSTANT_P (last_value
)
1294 || ((GET_CODE (last_value
) == REG
1295 || GET_CODE (last_value
) == SUBREG
)
1296 && ! reg_set_between_p (last_value
,
1307 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1308 (X would be the pattern of an insn).
1309 FUN receives two arguments:
1310 the REG, MEM, CC0 or PC being stored in or clobbered,
1311 the SET or CLOBBER rtx that does the store.
1313 If the item being stored in or clobbered is a SUBREG of a hard register,
1314 the SUBREG will be passed. */
1317 note_stores (x
, fun
, data
)
1319 void (*fun
) PARAMS ((rtx
, rtx
, void *));
1324 if (GET_CODE (x
) == COND_EXEC
)
1325 x
= COND_EXEC_CODE (x
);
1327 if (GET_CODE (x
) == SET
|| GET_CODE (x
) == CLOBBER
)
1329 register rtx dest
= SET_DEST (x
);
1331 while ((GET_CODE (dest
) == SUBREG
1332 && (GET_CODE (SUBREG_REG (dest
)) != REG
1333 || REGNO (SUBREG_REG (dest
)) >= FIRST_PSEUDO_REGISTER
))
1334 || GET_CODE (dest
) == ZERO_EXTRACT
1335 || GET_CODE (dest
) == SIGN_EXTRACT
1336 || GET_CODE (dest
) == STRICT_LOW_PART
)
1337 dest
= XEXP (dest
, 0);
1339 /* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions,
1340 each of whose first operand is a register. We can't know what
1341 precisely is being set in these cases, so make up a CLOBBER to pass
1343 if (GET_CODE (dest
) == PARALLEL
)
1345 for (i
= XVECLEN (dest
, 0) - 1; i
>= 0; i
--)
1346 if (XEXP (XVECEXP (dest
, 0, i
), 0) != 0)
1347 (*fun
) (XEXP (XVECEXP (dest
, 0, i
), 0),
1348 gen_rtx_CLOBBER (VOIDmode
,
1349 XEXP (XVECEXP (dest
, 0, i
), 0)),
1353 (*fun
) (dest
, x
, data
);
1356 else if (GET_CODE (x
) == PARALLEL
)
1357 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1358 note_stores (XVECEXP (x
, 0, i
), fun
, data
);
1361 /* Like notes_stores, but call FUN for each expression that is being
1362 referenced in PBODY, a pointer to the PATTERN of an insn. We only call
1363 FUN for each expression, not any interior subexpressions. FUN receives a
1364 pointer to the expression and the DATA passed to this function.
1366 Note that this is not quite the same test as that done in reg_referenced_p
1367 since that considers something as being referenced if it is being
1368 partially set, while we do not. */
1371 note_uses (pbody
, fun
, data
)
1373 void (*fun
) PARAMS ((rtx
*, void *));
1379 switch (GET_CODE (body
))
1382 (*fun
) (&COND_EXEC_TEST (body
), data
);
1383 note_uses (&COND_EXEC_CODE (body
), fun
, data
);
1387 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
1388 note_uses (&XVECEXP (body
, 0, i
), fun
, data
);
1392 (*fun
) (&XEXP (body
, 0), data
);
1396 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
1397 (*fun
) (&ASM_OPERANDS_INPUT (body
, i
), data
);
1401 (*fun
) (&TRAP_CONDITION (body
), data
);
1405 case UNSPEC_VOLATILE
:
1406 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
1407 (*fun
) (&XVECEXP (body
, 0, i
), data
);
1411 if (GET_CODE (XEXP (body
, 0)) == MEM
)
1412 (*fun
) (&XEXP (XEXP (body
, 0), 0), data
);
1417 rtx dest
= SET_DEST (body
);
1419 /* For sets we replace everything in source plus registers in memory
1420 expression in store and operands of a ZERO_EXTRACT. */
1421 (*fun
) (&SET_SRC (body
), data
);
1423 if (GET_CODE (dest
) == ZERO_EXTRACT
)
1425 (*fun
) (&XEXP (dest
, 1), data
);
1426 (*fun
) (&XEXP (dest
, 2), data
);
1429 while (GET_CODE (dest
) == SUBREG
|| GET_CODE (dest
) == STRICT_LOW_PART
)
1430 dest
= XEXP (dest
, 0);
1432 if (GET_CODE (dest
) == MEM
)
1433 (*fun
) (&XEXP (dest
, 0), data
);
1438 /* All the other possibilities never store. */
1439 (*fun
) (pbody
, data
);
1444 /* Return nonzero if X's old contents don't survive after INSN.
1445 This will be true if X is (cc0) or if X is a register and
1446 X dies in INSN or because INSN entirely sets X.
1448 "Entirely set" means set directly and not through a SUBREG,
1449 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1450 Likewise, REG_INC does not count.
1452 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1453 but for this use that makes no difference, since regs don't overlap
1454 during their lifetimes. Therefore, this function may be used
1455 at any time after deaths have been computed (in flow.c).
1457 If REG is a hard reg that occupies multiple machine registers, this
1458 function will only return 1 if each of those registers will be replaced
1462 dead_or_set_p (insn
, x
)
1466 unsigned int regno
, last_regno
;
1469 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1470 if (GET_CODE (x
) == CC0
)
1473 if (GET_CODE (x
) != REG
)
1477 last_regno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
1478 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (x
)) - 1);
1480 for (i
= regno
; i
<= last_regno
; i
++)
1481 if (! dead_or_set_regno_p (insn
, i
))
1487 /* Utility function for dead_or_set_p to check an individual register. Also
1488 called from flow.c. */
1491 dead_or_set_regno_p (insn
, test_regno
)
1493 unsigned int test_regno
;
1495 unsigned int regno
, endregno
;
1498 /* See if there is a death note for something that includes TEST_REGNO. */
1499 if (find_regno_note (insn
, REG_DEAD
, test_regno
))
1502 if (GET_CODE (insn
) == CALL_INSN
1503 && find_regno_fusage (insn
, CLOBBER
, test_regno
))
1506 pattern
= PATTERN (insn
);
1508 if (GET_CODE (pattern
) == COND_EXEC
)
1509 pattern
= COND_EXEC_CODE (pattern
);
1511 if (GET_CODE (pattern
) == SET
)
1513 rtx dest
= SET_DEST (PATTERN (insn
));
1515 /* A value is totally replaced if it is the destination or the
1516 destination is a SUBREG of REGNO that does not change the number of
1518 if (GET_CODE (dest
) == SUBREG
1519 && (((GET_MODE_SIZE (GET_MODE (dest
))
1520 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1521 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1522 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1523 dest
= SUBREG_REG (dest
);
1525 if (GET_CODE (dest
) != REG
)
1528 regno
= REGNO (dest
);
1529 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1530 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1532 return (test_regno
>= regno
&& test_regno
< endregno
);
1534 else if (GET_CODE (pattern
) == PARALLEL
)
1538 for (i
= XVECLEN (pattern
, 0) - 1; i
>= 0; i
--)
1540 rtx body
= XVECEXP (pattern
, 0, i
);
1542 if (GET_CODE (body
) == COND_EXEC
)
1543 body
= COND_EXEC_CODE (body
);
1545 if (GET_CODE (body
) == SET
|| GET_CODE (body
) == CLOBBER
)
1547 rtx dest
= SET_DEST (body
);
1549 if (GET_CODE (dest
) == SUBREG
1550 && (((GET_MODE_SIZE (GET_MODE (dest
))
1551 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1552 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1553 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1554 dest
= SUBREG_REG (dest
);
1556 if (GET_CODE (dest
) != REG
)
1559 regno
= REGNO (dest
);
1560 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1561 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1563 if (test_regno
>= regno
&& test_regno
< endregno
)
1572 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1573 If DATUM is nonzero, look for one whose datum is DATUM. */
1576 find_reg_note (insn
, kind
, datum
)
1583 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1584 if (! INSN_P (insn
))
1587 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1588 if (REG_NOTE_KIND (link
) == kind
1589 && (datum
== 0 || datum
== XEXP (link
, 0)))
1594 /* Return the reg-note of kind KIND in insn INSN which applies to register
1595 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1596 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1597 it might be the case that the note overlaps REGNO. */
1600 find_regno_note (insn
, kind
, regno
)
1607 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1608 if (! INSN_P (insn
))
1611 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1612 if (REG_NOTE_KIND (link
) == kind
1613 /* Verify that it is a register, so that scratch and MEM won't cause a
1615 && GET_CODE (XEXP (link
, 0)) == REG
1616 && REGNO (XEXP (link
, 0)) <= regno
1617 && ((REGNO (XEXP (link
, 0))
1618 + (REGNO (XEXP (link
, 0)) >= FIRST_PSEUDO_REGISTER
? 1
1619 : HARD_REGNO_NREGS (REGNO (XEXP (link
, 0)),
1620 GET_MODE (XEXP (link
, 0)))))
1626 /* Return a REG_EQUIV or REG_EQUAL note if insn has only a single set and
1630 find_reg_equal_equiv_note (insn
)
1635 if (single_set (insn
) == 0)
1637 else if ((note
= find_reg_note (insn
, REG_EQUIV
, NULL_RTX
)) != 0)
1640 return find_reg_note (insn
, REG_EQUAL
, NULL_RTX
);
1643 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1644 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1647 find_reg_fusage (insn
, code
, datum
)
1652 /* If it's not a CALL_INSN, it can't possibly have a
1653 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1654 if (GET_CODE (insn
) != CALL_INSN
)
1660 if (GET_CODE (datum
) != REG
)
1664 for (link
= CALL_INSN_FUNCTION_USAGE (insn
);
1666 link
= XEXP (link
, 1))
1667 if (GET_CODE (XEXP (link
, 0)) == code
1668 && rtx_equal_p (datum
, SET_DEST (XEXP (link
, 0))))
1673 unsigned int regno
= REGNO (datum
);
1675 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1676 to pseudo registers, so don't bother checking. */
1678 if (regno
< FIRST_PSEUDO_REGISTER
)
1680 unsigned int end_regno
1681 = regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (datum
));
1684 for (i
= regno
; i
< end_regno
; i
++)
1685 if (find_regno_fusage (insn
, code
, i
))
1693 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1694 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1697 find_regno_fusage (insn
, code
, regno
)
1704 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1705 to pseudo registers, so don't bother checking. */
1707 if (regno
>= FIRST_PSEUDO_REGISTER
1708 || GET_CODE (insn
) != CALL_INSN
)
1711 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
1713 unsigned int regnote
;
1716 if (GET_CODE (op
= XEXP (link
, 0)) == code
1717 && GET_CODE (reg
= XEXP (op
, 0)) == REG
1718 && (regnote
= REGNO (reg
)) <= regno
1719 && regnote
+ HARD_REGNO_NREGS (regnote
, GET_MODE (reg
)) > regno
)
1726 /* Remove register note NOTE from the REG_NOTES of INSN. */
1729 remove_note (insn
, note
)
1735 if (note
== NULL_RTX
)
1738 if (REG_NOTES (insn
) == note
)
1740 REG_NOTES (insn
) = XEXP (note
, 1);
1744 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1745 if (XEXP (link
, 1) == note
)
1747 XEXP (link
, 1) = XEXP (note
, 1);
1754 /* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
1755 remove that entry from the list if it is found.
1757 A simple equality test is used to determine if NODE matches. */
1760 remove_node_from_expr_list (node
, listp
)
1765 rtx prev
= NULL_RTX
;
1769 if (node
== XEXP (temp
, 0))
1771 /* Splice the node out of the list. */
1773 XEXP (prev
, 1) = XEXP (temp
, 1);
1775 *listp
= XEXP (temp
, 1);
1781 temp
= XEXP (temp
, 1);
1785 /* Nonzero if X contains any volatile instructions. These are instructions
1786 which may cause unpredictable machine state instructions, and thus no
1787 instructions should be moved or combined across them. This includes
1788 only volatile asms and UNSPEC_VOLATILE instructions. */
1794 register RTX_CODE code
;
1796 code
= GET_CODE (x
);
1816 case UNSPEC_VOLATILE
:
1817 /* case TRAP_IF: This isn't clear yet. */
1821 if (MEM_VOLATILE_P (x
))
1828 /* Recursively scan the operands of this expression. */
1831 register const char *fmt
= GET_RTX_FORMAT (code
);
1834 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1838 if (volatile_insn_p (XEXP (x
, i
)))
1841 else if (fmt
[i
] == 'E')
1844 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1845 if (volatile_insn_p (XVECEXP (x
, i
, j
)))
1853 /* Nonzero if X contains any volatile memory references
1854 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1860 register RTX_CODE code
;
1862 code
= GET_CODE (x
);
1881 case UNSPEC_VOLATILE
:
1882 /* case TRAP_IF: This isn't clear yet. */
1887 if (MEM_VOLATILE_P (x
))
1894 /* Recursively scan the operands of this expression. */
1897 register const char *fmt
= GET_RTX_FORMAT (code
);
1900 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1904 if (volatile_refs_p (XEXP (x
, i
)))
1907 else if (fmt
[i
] == 'E')
1910 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1911 if (volatile_refs_p (XVECEXP (x
, i
, j
)))
1919 /* Similar to above, except that it also rejects register pre- and post-
1926 register RTX_CODE code
;
1928 code
= GET_CODE (x
);
1946 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1947 when some combination can't be done. If we see one, don't think
1948 that we can simplify the expression. */
1949 return (GET_MODE (x
) != VOIDmode
);
1958 case UNSPEC_VOLATILE
:
1959 /* case TRAP_IF: This isn't clear yet. */
1964 if (MEM_VOLATILE_P (x
))
1971 /* Recursively scan the operands of this expression. */
1974 register const char *fmt
= GET_RTX_FORMAT (code
);
1977 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1981 if (side_effects_p (XEXP (x
, i
)))
1984 else if (fmt
[i
] == 'E')
1987 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1988 if (side_effects_p (XVECEXP (x
, i
, j
)))
1996 /* Return nonzero if evaluating rtx X might cause a trap. */
2008 code
= GET_CODE (x
);
2011 /* Handle these cases quickly. */
2024 case UNSPEC_VOLATILE
:
2029 return MEM_VOLATILE_P (x
);
2031 /* Memory ref can trap unless it's a static var or a stack slot. */
2033 return rtx_addr_can_trap_p (XEXP (x
, 0));
2035 /* Division by a non-constant might trap. */
2040 if (! CONSTANT_P (XEXP (x
, 1))
2041 || GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2043 /* This was const0_rtx, but by not using that,
2044 we can link this file into other programs. */
2045 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
&& INTVAL (XEXP (x
, 1)) == 0)
2050 /* An EXPR_LIST is used to represent a function call. This
2051 certainly may trap. */
2059 /* Some floating point comparisons may trap. */
2060 /* ??? There is no machine independent way to check for tests that trap
2061 when COMPARE is used, though many targets do make this distinction.
2062 For instance, sparc uses CCFPE for compares which generate exceptions
2063 and CCFP for compares which do not generate exceptions. */
2064 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2066 /* But often the compare has some CC mode, so check operand
2068 if (GET_MODE_CLASS (GET_MODE (XEXP (x
, 0))) == MODE_FLOAT
2069 || GET_MODE_CLASS (GET_MODE (XEXP (x
, 1))) == MODE_FLOAT
)
2075 /* These operations don't trap even with floating point. */
2079 /* Any floating arithmetic may trap. */
2080 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2084 fmt
= GET_RTX_FORMAT (code
);
2085 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2089 if (may_trap_p (XEXP (x
, i
)))
2092 else if (fmt
[i
] == 'E')
2095 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2096 if (may_trap_p (XVECEXP (x
, i
, j
)))
2103 /* Return nonzero if X contains a comparison that is not either EQ or NE,
2104 i.e., an inequality. */
2107 inequality_comparisons_p (x
)
2110 register const char *fmt
;
2111 register int len
, i
;
2112 register enum rtx_code code
= GET_CODE (x
);
2141 len
= GET_RTX_LENGTH (code
);
2142 fmt
= GET_RTX_FORMAT (code
);
2144 for (i
= 0; i
< len
; i
++)
2148 if (inequality_comparisons_p (XEXP (x
, i
)))
2151 else if (fmt
[i
] == 'E')
2154 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
2155 if (inequality_comparisons_p (XVECEXP (x
, i
, j
)))
2163 /* Replace any occurrence of FROM in X with TO. The function does
2164 not enter into CONST_DOUBLE for the replace.
2166 Note that copying is not done so X must not be shared unless all copies
2167 are to be modified. */
2170 replace_rtx (x
, from
, to
)
2174 register const char *fmt
;
2176 /* The following prevents loops occurrence when we change MEM in
2177 CONST_DOUBLE onto the same CONST_DOUBLE. */
2178 if (x
!= 0 && GET_CODE (x
) == CONST_DOUBLE
)
2184 /* Allow this function to make replacements in EXPR_LISTs. */
2188 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
2189 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
2192 XEXP (x
, i
) = replace_rtx (XEXP (x
, i
), from
, to
);
2193 else if (fmt
[i
] == 'E')
2194 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
2195 XVECEXP (x
, i
, j
) = replace_rtx (XVECEXP (x
, i
, j
), from
, to
);
2201 /* Throughout the rtx X, replace many registers according to REG_MAP.
2202 Return the replacement for X (which may be X with altered contents).
2203 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
2204 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
2206 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
2207 should not be mapped to pseudos or vice versa since validate_change
2210 If REPLACE_DEST is 1, replacements are also done in destinations;
2211 otherwise, only sources are replaced. */
2214 replace_regs (x
, reg_map
, nregs
, replace_dest
)
2220 register enum rtx_code code
;
2222 register const char *fmt
;
2227 code
= GET_CODE (x
);
2241 /* Verify that the register has an entry before trying to access it. */
2242 if (REGNO (x
) < nregs
&& reg_map
[REGNO (x
)] != 0)
2244 /* SUBREGs can't be shared. Always return a copy to ensure that if
2245 this replacement occurs more than once then each instance will
2246 get distinct rtx. */
2247 if (GET_CODE (reg_map
[REGNO (x
)]) == SUBREG
)
2248 return copy_rtx (reg_map
[REGNO (x
)]);
2249 return reg_map
[REGNO (x
)];
2254 /* Prevent making nested SUBREGs. */
2255 if (GET_CODE (SUBREG_REG (x
)) == REG
&& REGNO (SUBREG_REG (x
)) < nregs
2256 && reg_map
[REGNO (SUBREG_REG (x
))] != 0
2257 && GET_CODE (reg_map
[REGNO (SUBREG_REG (x
))]) == SUBREG
)
2259 rtx map_val
= reg_map
[REGNO (SUBREG_REG (x
))];
2260 rtx map_inner
= SUBREG_REG (map_val
);
2262 if (GET_MODE (x
) == GET_MODE (map_inner
))
2266 int final_offset
= SUBREG_BYTE (x
) + SUBREG_BYTE (map_val
);
2268 /* When working with REG SUBREGs the rule is that the byte
2269 offset must be a multiple of the SUBREG's mode. */
2270 final_offset
= (final_offset
/ GET_MODE_SIZE (GET_MODE (x
)));
2271 final_offset
= (final_offset
* GET_MODE_SIZE (GET_MODE (x
)));
2273 /* We cannot call gen_rtx here since we may be linked with
2275 /* Let's try clobbering the incoming SUBREG and see
2276 if this is really safe. */
2277 SUBREG_REG (x
) = map_inner
;
2278 SUBREG_BYTE (x
) = final_offset
;
2281 rtx
new = rtx_alloc (SUBREG
);
2282 int final_offset
= SUBREG_BYTE (x
) + SUBREG_BYTE (map_val
);
2284 /* When working with REG SUBREGs the rule is that the byte
2285 offset must be a multiple of the SUBREG's mode. */
2286 final_offset
= (final_offset
/ GET_MODE_SIZE (GET_MODE (x
)));
2287 final_offset
= (final_offset
* GET_MODE_SIZE (GET_MODE (x
)));
2289 PUT_MODE (new, GET_MODE (x
));
2290 SUBREG_REG (new) = map_inner
;
2291 SUBREG_BYTE (new) = final_offset
;
2299 SET_DEST (x
) = replace_regs (SET_DEST (x
), reg_map
, nregs
, 0);
2301 else if (GET_CODE (SET_DEST (x
)) == MEM
2302 || GET_CODE (SET_DEST (x
)) == STRICT_LOW_PART
)
2303 /* Even if we are not to replace destinations, replace register if it
2304 is CONTAINED in destination (destination is memory or
2305 STRICT_LOW_PART). */
2306 XEXP (SET_DEST (x
), 0) = replace_regs (XEXP (SET_DEST (x
), 0),
2308 else if (GET_CODE (SET_DEST (x
)) == ZERO_EXTRACT
)
2309 /* Similarly, for ZERO_EXTRACT we replace all operands. */
2312 SET_SRC (x
) = replace_regs (SET_SRC (x
), reg_map
, nregs
, 0);
2319 fmt
= GET_RTX_FORMAT (code
);
2320 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2323 XEXP (x
, i
) = replace_regs (XEXP (x
, i
), reg_map
, nregs
, replace_dest
);
2324 else if (fmt
[i
] == 'E')
2327 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2328 XVECEXP (x
, i
, j
) = replace_regs (XVECEXP (x
, i
, j
), reg_map
,
2329 nregs
, replace_dest
);
2335 /* A subroutine of computed_jump_p, return 1 if X contains a REG or MEM or
2336 constant that is not in the constant pool and not in the condition
2337 of an IF_THEN_ELSE. */
2340 computed_jump_p_1 (x
)
2343 enum rtx_code code
= GET_CODE (x
);
2361 return ! (GET_CODE (XEXP (x
, 0)) == SYMBOL_REF
2362 && CONSTANT_POOL_ADDRESS_P (XEXP (x
, 0)));
2365 return (computed_jump_p_1 (XEXP (x
, 1))
2366 || computed_jump_p_1 (XEXP (x
, 2)));
2372 fmt
= GET_RTX_FORMAT (code
);
2373 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2376 && computed_jump_p_1 (XEXP (x
, i
)))
2379 else if (fmt
[i
] == 'E')
2380 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2381 if (computed_jump_p_1 (XVECEXP (x
, i
, j
)))
2388 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2390 Tablejumps and casesi insns are not considered indirect jumps;
2391 we can recognize them by a (use (label_ref)). */
2394 computed_jump_p (insn
)
2398 if (GET_CODE (insn
) == JUMP_INSN
)
2400 rtx pat
= PATTERN (insn
);
2402 if (find_reg_note (insn
, REG_LABEL
, NULL_RTX
))
2404 else if (GET_CODE (pat
) == PARALLEL
)
2406 int len
= XVECLEN (pat
, 0);
2407 int has_use_labelref
= 0;
2409 for (i
= len
- 1; i
>= 0; i
--)
2410 if (GET_CODE (XVECEXP (pat
, 0, i
)) == USE
2411 && (GET_CODE (XEXP (XVECEXP (pat
, 0, i
), 0))
2413 has_use_labelref
= 1;
2415 if (! has_use_labelref
)
2416 for (i
= len
- 1; i
>= 0; i
--)
2417 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
2418 && SET_DEST (XVECEXP (pat
, 0, i
)) == pc_rtx
2419 && computed_jump_p_1 (SET_SRC (XVECEXP (pat
, 0, i
))))
2422 else if (GET_CODE (pat
) == SET
2423 && SET_DEST (pat
) == pc_rtx
2424 && computed_jump_p_1 (SET_SRC (pat
)))
2430 /* Traverse X via depth-first search, calling F for each
2431 sub-expression (including X itself). F is also passed the DATA.
2432 If F returns -1, do not traverse sub-expressions, but continue
2433 traversing the rest of the tree. If F ever returns any other
2434 non-zero value, stop the traversal, and return the value returned
2435 by F. Otherwise, return 0. This function does not traverse inside
2436 tree structure that contains RTX_EXPRs, or into sub-expressions
2437 whose format code is `0' since it is not known whether or not those
2438 codes are actually RTL.
2440 This routine is very general, and could (should?) be used to
2441 implement many of the other routines in this file. */
2444 for_each_rtx (x
, f
, data
)
2455 result
= (*f
)(x
, data
);
2457 /* Do not traverse sub-expressions. */
2459 else if (result
!= 0)
2460 /* Stop the traversal. */
2464 /* There are no sub-expressions. */
2467 length
= GET_RTX_LENGTH (GET_CODE (*x
));
2468 format
= GET_RTX_FORMAT (GET_CODE (*x
));
2470 for (i
= 0; i
< length
; ++i
)
2475 result
= for_each_rtx (&XEXP (*x
, i
), f
, data
);
2482 if (XVEC (*x
, i
) != 0)
2485 for (j
= 0; j
< XVECLEN (*x
, i
); ++j
)
2487 result
= for_each_rtx (&XVECEXP (*x
, i
, j
), f
, data
);
2495 /* Nothing to do. */
2504 /* Searches X for any reference to REGNO, returning the rtx of the
2505 reference found if any. Otherwise, returns NULL_RTX. */
2508 regno_use_in (regno
, x
)
2512 register const char *fmt
;
2516 if (GET_CODE (x
) == REG
&& REGNO (x
) == regno
)
2519 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
2520 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
2524 if ((tem
= regno_use_in (regno
, XEXP (x
, i
))))
2527 else if (fmt
[i
] == 'E')
2528 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
2529 if ((tem
= regno_use_in (regno
, XVECEXP (x
, i
, j
))))
2537 /* Return 1 if X is an autoincrement side effect and the register is
2538 not the stack pointer. */
2543 switch (GET_CODE (x
))
2551 /* There are no REG_INC notes for SP. */
2552 if (XEXP (x
, 0) != stack_pointer_rtx
)
2560 /* Return 1 if the sequence of instructions beginning with FROM and up
2561 to and including TO is safe to move. If NEW_TO is non-NULL, and
2562 the sequence is not already safe to move, but can be easily
2563 extended to a sequence which is safe, then NEW_TO will point to the
2564 end of the extended sequence.
2566 For now, this function only checks that the region contains whole
2567 exception regions, but it could be extended to check additional
2568 conditions as well. */
2571 insns_safe_to_move_p (from
, to
, new_to
)
2576 int eh_region_count
= 0;
2580 /* By default, assume the end of the region will be what was
2587 if (GET_CODE (r
) == NOTE
)
2589 switch (NOTE_LINE_NUMBER (r
))
2591 case NOTE_INSN_EH_REGION_BEG
:
2595 case NOTE_INSN_EH_REGION_END
:
2596 if (eh_region_count
== 0)
2597 /* This sequence of instructions contains the end of
2598 an exception region, but not he beginning. Moving
2599 it will cause chaos. */
2610 /* If we've passed TO, and we see a non-note instruction, we
2611 can't extend the sequence to a movable sequence. */
2617 /* It's OK to move the sequence if there were matched sets of
2618 exception region notes. */
2619 return eh_region_count
== 0;
2624 /* It's OK to move the sequence if there were matched sets of
2625 exception region notes. */
2626 if (past_to_p
&& eh_region_count
== 0)
2632 /* Go to the next instruction. */
2639 /* Return non-zero if IN contains a piece of rtl that has the address LOC */
2641 loc_mentioned_in_p (loc
, in
)
2644 enum rtx_code code
= GET_CODE (in
);
2645 const char *fmt
= GET_RTX_FORMAT (code
);
2648 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2650 if (loc
== &in
->fld
[i
].rtx
)
2654 if (loc_mentioned_in_p (loc
, XEXP (in
, i
)))
2657 else if (fmt
[i
] == 'E')
2658 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; j
--)
2659 if (loc_mentioned_in_p (loc
, XVECEXP (in
, i
, j
)))
2665 /* This function returns the regno offset of a subreg expression.
2666 xregno - A regno of an inner hard subreg_reg (or what will become one).
2667 xmode - The mode of xregno.
2668 offset - The byte offset.
2669 ymode - The mode of a top level SUBREG (or what may become one).
2670 RETURN - The regno offset which would be used.
2671 This function can be overridden by defining SUBREG_REGNO_OFFSET,
2672 taking the same parameters. */
2674 subreg_regno_offset (xregno
, xmode
, offset
, ymode
)
2675 unsigned int xregno
;
2676 enum machine_mode xmode
;
2677 unsigned int offset
;
2678 enum machine_mode ymode
;
2681 int nregs_xmode
, nregs_ymode
;
2682 int mode_multiple
, nregs_multiple
;
2685 /* Check for an override, and use it instead. */
2686 #ifdef SUBREG_REGNO_OFFSET
2687 ret
= SUBREG_REGNO_OFFSET (xregno
, xmode
, offset
, ymode
)
2689 if (xregno
>= FIRST_PSEUDO_REGISTER
)
2692 nregs_xmode
= HARD_REGNO_NREGS (xregno
, xmode
);
2693 nregs_ymode
= HARD_REGNO_NREGS (xregno
, ymode
);
2694 if (offset
== 0 || nregs_xmode
== nregs_ymode
)
2697 /* size of ymode must not be greater than the size of xmode. */
2698 mode_multiple
= GET_MODE_SIZE (xmode
) / GET_MODE_SIZE (ymode
);
2699 if (mode_multiple
== 0)
2702 y_offset
= offset
/ GET_MODE_SIZE (ymode
);
2703 nregs_multiple
= nregs_xmode
/ nregs_ymode
;
2704 ret
= (y_offset
/ (mode_multiple
/ nregs_multiple
)) * nregs_ymode
;
2710 /* Return the final regno that a subreg expression refers to. */
2716 rtx subreg
= SUBREG_REG (x
);
2717 int regno
= REGNO (subreg
);
2719 ret
= regno
+ subreg_regno_offset (regno
,