1 /* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
27 #include "hard-reg-set.h"
30 /* Forward declarations */
31 static void set_of_1
PARAMS ((rtx
, rtx
, void *));
32 static void insn_dependent_p_1
PARAMS ((rtx
, rtx
, void *));
33 static int computed_jump_p_1
PARAMS ((rtx
));
34 static void parms_set
PARAMS ((rtx
, rtx
, void *));
36 /* Bit flags that specify the machine subtype we are compiling for.
37 Bits are tested using macros TARGET_... defined in the tm.h file
38 and set by `-m...' switches. Must be defined in rtlanal.c. */
42 /* Return 1 if the value of X is unstable
43 (would be different at a different point in the program).
44 The frame pointer, arg pointer, etc. are considered stable
45 (within one function) and so is anything marked `unchanging'. */
51 RTX_CODE code
= GET_CODE (x
);
58 return ! RTX_UNCHANGING_P (x
) || rtx_unstable_p (XEXP (x
, 0));
73 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
74 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
75 /* The arg pointer varies if it is not a fixed register. */
76 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
])
77 || RTX_UNCHANGING_P (x
))
79 #ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
80 /* ??? When call-clobbered, the value is stable modulo the restore
81 that must happen after a call. This currently screws up local-alloc
82 into believing that the restore is not needed. */
83 if (x
== pic_offset_table_rtx
)
89 if (MEM_VOLATILE_P (x
))
98 fmt
= GET_RTX_FORMAT (code
);
99 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
102 if (rtx_unstable_p (XEXP (x
, i
)))
105 else if (fmt
[i
] == 'E')
108 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
109 if (rtx_unstable_p (XVECEXP (x
, i
, j
)))
116 /* Return 1 if X has a value that can vary even between two
117 executions of the program. 0 means X can be compared reliably
118 against certain constants or near-constants.
119 FOR_ALIAS is nonzero if we are called from alias analysis; if it is
120 zero, we are slightly more conservative.
121 The frame pointer and the arg pointer are considered constant. */
124 rtx_varies_p (x
, for_alias
)
128 RTX_CODE code
= GET_CODE (x
);
135 return ! RTX_UNCHANGING_P (x
) || rtx_varies_p (XEXP (x
, 0), for_alias
);
149 /* Note that we have to test for the actual rtx used for the frame
150 and arg pointers and not just the register number in case we have
151 eliminated the frame and/or arg pointer and are using it
153 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
154 /* The arg pointer varies if it is not a fixed register. */
155 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
]))
157 if (x
== pic_offset_table_rtx
158 #ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
159 /* ??? When call-clobbered, the value is stable modulo the restore
160 that must happen after a call. This currently screws up
161 local-alloc into believing that the restore is not needed, so we
162 must return 0 only if we are called from alias analysis. */
170 /* The operand 0 of a LO_SUM is considered constant
171 (in fact it is related specifically to operand 1)
172 during alias analysis. */
173 return (! for_alias
&& rtx_varies_p (XEXP (x
, 0), for_alias
))
174 || rtx_varies_p (XEXP (x
, 1), for_alias
);
177 if (MEM_VOLATILE_P (x
))
186 fmt
= GET_RTX_FORMAT (code
);
187 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
190 if (rtx_varies_p (XEXP (x
, i
), for_alias
))
193 else if (fmt
[i
] == 'E')
196 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
197 if (rtx_varies_p (XVECEXP (x
, i
, j
), for_alias
))
204 /* Return 0 if the use of X as an address in a MEM can cause a trap. */
207 rtx_addr_can_trap_p (x
)
210 enum rtx_code code
= GET_CODE (x
);
215 return SYMBOL_REF_WEAK (x
);
221 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
222 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
223 || x
== stack_pointer_rtx
224 /* The arg pointer varies if it is not a fixed register. */
225 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
]))
227 /* All of the virtual frame registers are stack references. */
228 if (REGNO (x
) >= FIRST_VIRTUAL_REGISTER
229 && REGNO (x
) <= LAST_VIRTUAL_REGISTER
)
234 return rtx_addr_can_trap_p (XEXP (x
, 0));
237 /* An address is assumed not to trap if it is an address that can't
238 trap plus a constant integer or it is the pic register plus a
240 return ! ((! rtx_addr_can_trap_p (XEXP (x
, 0))
241 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
242 || (XEXP (x
, 0) == pic_offset_table_rtx
243 && CONSTANT_P (XEXP (x
, 1))));
247 return rtx_addr_can_trap_p (XEXP (x
, 1));
254 return rtx_addr_can_trap_p (XEXP (x
, 0));
260 /* If it isn't one of the case above, it can cause a trap. */
264 /* Return 1 if X refers to a memory location whose address
265 cannot be compared reliably with constant addresses,
266 or if X refers to a BLKmode memory object.
267 FOR_ALIAS is nonzero if we are called from alias analysis; if it is
268 zero, we are slightly more conservative. */
271 rtx_addr_varies_p (x
, for_alias
)
284 return GET_MODE (x
) == BLKmode
|| rtx_varies_p (XEXP (x
, 0), for_alias
);
286 fmt
= GET_RTX_FORMAT (code
);
287 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
290 if (rtx_addr_varies_p (XEXP (x
, i
), for_alias
))
293 else if (fmt
[i
] == 'E')
296 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
297 if (rtx_addr_varies_p (XVECEXP (x
, i
, j
), for_alias
))
303 /* Return the value of the integer term in X, if one is apparent;
305 Only obvious integer terms are detected.
306 This is used in cse.c with the `related_value' field. */
312 if (GET_CODE (x
) == CONST
)
315 if (GET_CODE (x
) == MINUS
316 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
317 return - INTVAL (XEXP (x
, 1));
318 if (GET_CODE (x
) == PLUS
319 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
320 return INTVAL (XEXP (x
, 1));
324 /* If X is a constant, return the value sans apparent integer term;
326 Only obvious integer terms are detected. */
329 get_related_value (x
)
332 if (GET_CODE (x
) != CONST
)
335 if (GET_CODE (x
) == PLUS
336 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
338 else if (GET_CODE (x
) == MINUS
339 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
344 /* Given a tablejump insn INSN, return the RTL expression for the offset
345 into the jump table. If the offset cannot be determined, then return
348 If EARLIEST is non-zero, it is a pointer to a place where the earliest
349 insn used in locating the offset was found. */
352 get_jump_table_offset (insn
, earliest
)
366 if (GET_CODE (insn
) != JUMP_INSN
367 || ! (label
= JUMP_LABEL (insn
))
368 || ! (table
= NEXT_INSN (label
))
369 || GET_CODE (table
) != JUMP_INSN
370 || (GET_CODE (PATTERN (table
)) != ADDR_VEC
371 && GET_CODE (PATTERN (table
)) != ADDR_DIFF_VEC
)
372 || ! (set
= single_set (insn
)))
377 /* Some targets (eg, ARM) emit a tablejump that also
378 contains the out-of-range target. */
379 if (GET_CODE (x
) == IF_THEN_ELSE
380 && GET_CODE (XEXP (x
, 2)) == LABEL_REF
)
383 /* Search backwards and locate the expression stored in X. */
384 for (old_x
= NULL_RTX
; GET_CODE (x
) == REG
&& x
!= old_x
;
385 old_x
= x
, x
= find_last_value (x
, &insn
, NULL_RTX
, 0))
388 /* If X is an expression using a relative address then strip
389 off the addition / subtraction of PC, PIC_OFFSET_TABLE_REGNUM,
390 or the jump table label. */
391 if (GET_CODE (PATTERN (table
)) == ADDR_DIFF_VEC
392 && (GET_CODE (x
) == PLUS
|| GET_CODE (x
) == MINUS
))
394 for (i
= 0; i
< 2; i
++)
399 if (y
== pc_rtx
|| y
== pic_offset_table_rtx
)
402 for (old_y
= NULL_RTX
; GET_CODE (y
) == REG
&& y
!= old_y
;
403 old_y
= y
, y
= find_last_value (y
, &old_insn
, NULL_RTX
, 0))
406 if ((GET_CODE (y
) == LABEL_REF
&& XEXP (y
, 0) == label
))
415 for (old_x
= NULL_RTX
; GET_CODE (x
) == REG
&& x
!= old_x
;
416 old_x
= x
, x
= find_last_value (x
, &insn
, NULL_RTX
, 0))
420 /* Strip off any sign or zero extension. */
421 if (GET_CODE (x
) == SIGN_EXTEND
|| GET_CODE (x
) == ZERO_EXTEND
)
425 for (old_x
= NULL_RTX
; GET_CODE (x
) == REG
&& x
!= old_x
;
426 old_x
= x
, x
= find_last_value (x
, &insn
, NULL_RTX
, 0))
430 /* If X isn't a MEM then this isn't a tablejump we understand. */
431 if (GET_CODE (x
) != MEM
)
434 /* Strip off the MEM. */
437 for (old_x
= NULL_RTX
; GET_CODE (x
) == REG
&& x
!= old_x
;
438 old_x
= x
, x
= find_last_value (x
, &insn
, NULL_RTX
, 0))
441 /* If X isn't a PLUS than this isn't a tablejump we understand. */
442 if (GET_CODE (x
) != PLUS
)
445 /* At this point we should have an expression representing the jump table
446 plus an offset. Examine each operand in order to determine which one
447 represents the jump table. Knowing that tells us that the other operand
448 must represent the offset. */
449 for (i
= 0; i
< 2; i
++)
454 for (old_y
= NULL_RTX
; GET_CODE (y
) == REG
&& y
!= old_y
;
455 old_y
= y
, y
= find_last_value (y
, &old_insn
, NULL_RTX
, 0))
458 if ((GET_CODE (y
) == CONST
|| GET_CODE (y
) == LABEL_REF
)
459 && reg_mentioned_p (label
, y
))
468 /* Strip off the addition / subtraction of PIC_OFFSET_TABLE_REGNUM. */
469 if (GET_CODE (x
) == PLUS
|| GET_CODE (x
) == MINUS
)
470 for (i
= 0; i
< 2; i
++)
471 if (XEXP (x
, i
) == pic_offset_table_rtx
)
480 /* Return the RTL expression representing the offset. */
484 /* Return the number of places FIND appears within X. If COUNT_DEST is
485 zero, we do not count occurrences inside the destination of a SET. */
488 count_occurrences (x
, find
, count_dest
)
494 const char *format_ptr
;
515 if (GET_CODE (find
) == MEM
&& rtx_equal_p (x
, find
))
520 if (SET_DEST (x
) == find
&& ! count_dest
)
521 return count_occurrences (SET_SRC (x
), find
, count_dest
);
528 format_ptr
= GET_RTX_FORMAT (code
);
531 for (i
= 0; i
< GET_RTX_LENGTH (code
); i
++)
533 switch (*format_ptr
++)
536 count
+= count_occurrences (XEXP (x
, i
), find
, count_dest
);
540 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
541 count
+= count_occurrences (XVECEXP (x
, i
, j
), find
, count_dest
);
548 /* Nonzero if register REG appears somewhere within IN.
549 Also works if REG is not a register; in this case it checks
550 for a subexpression of IN that is Lisp "equal" to REG. */
553 reg_mentioned_p (reg
, in
)
566 if (GET_CODE (in
) == LABEL_REF
)
567 return reg
== XEXP (in
, 0);
569 code
= GET_CODE (in
);
573 /* Compare registers by number. */
575 return GET_CODE (reg
) == REG
&& REGNO (in
) == REGNO (reg
);
577 /* These codes have no constituent expressions
585 return GET_CODE (reg
) == CONST_INT
&& INTVAL (in
) == INTVAL (reg
);
589 /* These are kept unique for a given value. */
596 if (GET_CODE (reg
) == code
&& rtx_equal_p (reg
, in
))
599 fmt
= GET_RTX_FORMAT (code
);
601 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
606 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; j
--)
607 if (reg_mentioned_p (reg
, XVECEXP (in
, i
, j
)))
610 else if (fmt
[i
] == 'e'
611 && reg_mentioned_p (reg
, XEXP (in
, i
)))
617 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
618 no CODE_LABEL insn. */
621 no_labels_between_p (beg
, end
)
627 for (p
= NEXT_INSN (beg
); p
!= end
; p
= NEXT_INSN (p
))
628 if (GET_CODE (p
) == CODE_LABEL
)
633 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
634 no JUMP_INSN insn. */
637 no_jumps_between_p (beg
, end
)
641 for (p
= NEXT_INSN (beg
); p
!= end
; p
= NEXT_INSN (p
))
642 if (GET_CODE (p
) == JUMP_INSN
)
647 /* Nonzero if register REG is used in an insn between
648 FROM_INSN and TO_INSN (exclusive of those two). */
651 reg_used_between_p (reg
, from_insn
, to_insn
)
652 rtx reg
, from_insn
, to_insn
;
656 if (from_insn
== to_insn
)
659 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
661 && (reg_overlap_mentioned_p (reg
, PATTERN (insn
))
662 || (GET_CODE (insn
) == CALL_INSN
663 && (find_reg_fusage (insn
, USE
, reg
)
664 || find_reg_fusage (insn
, CLOBBER
, reg
)))))
669 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
670 is entirely replaced by a new value and the only use is as a SET_DEST,
671 we do not consider it a reference. */
674 reg_referenced_p (x
, body
)
680 switch (GET_CODE (body
))
683 if (reg_overlap_mentioned_p (x
, SET_SRC (body
)))
686 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
687 of a REG that occupies all of the REG, the insn references X if
688 it is mentioned in the destination. */
689 if (GET_CODE (SET_DEST (body
)) != CC0
690 && GET_CODE (SET_DEST (body
)) != PC
691 && GET_CODE (SET_DEST (body
)) != REG
692 && ! (GET_CODE (SET_DEST (body
)) == SUBREG
693 && GET_CODE (SUBREG_REG (SET_DEST (body
))) == REG
694 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body
))))
695 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)
696 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body
)))
697 + (UNITS_PER_WORD
- 1)) / UNITS_PER_WORD
)))
698 && reg_overlap_mentioned_p (x
, SET_DEST (body
)))
703 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
704 if (reg_overlap_mentioned_p (x
, ASM_OPERANDS_INPUT (body
, i
)))
711 return reg_overlap_mentioned_p (x
, body
);
714 return reg_overlap_mentioned_p (x
, TRAP_CONDITION (body
));
717 return reg_overlap_mentioned_p (x
, XEXP (body
, 0));
720 case UNSPEC_VOLATILE
:
721 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
722 if (reg_overlap_mentioned_p (x
, XVECEXP (body
, 0, i
)))
727 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
728 if (reg_referenced_p (x
, XVECEXP (body
, 0, i
)))
733 if (GET_CODE (XEXP (body
, 0)) == MEM
)
734 if (reg_overlap_mentioned_p (x
, XEXP (XEXP (body
, 0), 0)))
739 if (reg_overlap_mentioned_p (x
, COND_EXEC_TEST (body
)))
741 return reg_referenced_p (x
, COND_EXEC_CODE (body
));
748 /* Nonzero if register REG is referenced in an insn between
749 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
753 reg_referenced_between_p (reg
, from_insn
, to_insn
)
754 rtx reg
, from_insn
, to_insn
;
758 if (from_insn
== to_insn
)
761 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
763 && (reg_referenced_p (reg
, PATTERN (insn
))
764 || (GET_CODE (insn
) == CALL_INSN
765 && find_reg_fusage (insn
, USE
, reg
))))
770 /* Nonzero if register REG is set or clobbered in an insn between
771 FROM_INSN and TO_INSN (exclusive of those two). */
774 reg_set_between_p (reg
, from_insn
, to_insn
)
775 rtx reg
, from_insn
, to_insn
;
779 if (from_insn
== to_insn
)
782 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
783 if (INSN_P (insn
) && reg_set_p (reg
, insn
))
788 /* Internals of reg_set_between_p. */
790 reg_set_p (reg
, insn
)
795 /* We can be passed an insn or part of one. If we are passed an insn,
796 check if a side-effect of the insn clobbers REG. */
799 if (FIND_REG_INC_NOTE (insn
, reg
)
800 || (GET_CODE (insn
) == CALL_INSN
801 /* We'd like to test call_used_regs here, but rtlanal.c can't
802 reference that variable due to its use in genattrtab. So
803 we'll just be more conservative.
805 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
806 information holds all clobbered registers. */
807 && ((GET_CODE (reg
) == REG
808 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
809 || GET_CODE (reg
) == MEM
810 || find_reg_fusage (insn
, CLOBBER
, reg
))))
813 body
= PATTERN (insn
);
816 return set_of (reg
, insn
) != NULL_RTX
;
819 /* Similar to reg_set_between_p, but check all registers in X. Return 0
820 only if none of them are modified between START and END. Do not
821 consider non-registers one way or the other. */
824 regs_set_between_p (x
, start
, end
)
828 enum rtx_code code
= GET_CODE (x
);
845 return reg_set_between_p (x
, start
, end
);
851 fmt
= GET_RTX_FORMAT (code
);
852 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
854 if (fmt
[i
] == 'e' && regs_set_between_p (XEXP (x
, i
), start
, end
))
857 else if (fmt
[i
] == 'E')
858 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
859 if (regs_set_between_p (XVECEXP (x
, i
, j
), start
, end
))
866 /* Similar to reg_set_between_p, but check all registers in X. Return 0
867 only if none of them are modified between START and END. Return 1 if
868 X contains a MEM; this routine does not perform any memory aliasing. */
871 modified_between_p (x
, start
, end
)
875 enum rtx_code code
= GET_CODE (x
);
894 /* If the memory is not constant, assume it is modified. If it is
895 constant, we still have to check the address. */
896 if (! RTX_UNCHANGING_P (x
))
901 return reg_set_between_p (x
, start
, end
);
907 fmt
= GET_RTX_FORMAT (code
);
908 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
910 if (fmt
[i
] == 'e' && modified_between_p (XEXP (x
, i
), start
, end
))
913 else if (fmt
[i
] == 'E')
914 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
915 if (modified_between_p (XVECEXP (x
, i
, j
), start
, end
))
922 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
923 of them are modified in INSN. Return 1 if X contains a MEM; this routine
924 does not perform any memory aliasing. */
927 modified_in_p (x
, insn
)
931 enum rtx_code code
= GET_CODE (x
);
950 /* If the memory is not constant, assume it is modified. If it is
951 constant, we still have to check the address. */
952 if (! RTX_UNCHANGING_P (x
))
957 return reg_set_p (x
, insn
);
963 fmt
= GET_RTX_FORMAT (code
);
964 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
966 if (fmt
[i
] == 'e' && modified_in_p (XEXP (x
, i
), insn
))
969 else if (fmt
[i
] == 'E')
970 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
971 if (modified_in_p (XVECEXP (x
, i
, j
), insn
))
978 /* Return true if anything in insn X is (anti,output,true) dependent on
979 anything in insn Y. */
982 insn_dependent_p (x
, y
)
987 if (! INSN_P (x
) || ! INSN_P (y
))
991 note_stores (PATTERN (x
), insn_dependent_p_1
, &tmp
);
996 note_stores (PATTERN (y
), insn_dependent_p_1
, &tmp
);
1003 /* A helper routine for insn_dependent_p called through note_stores. */
1006 insn_dependent_p_1 (x
, pat
, data
)
1008 rtx pat ATTRIBUTE_UNUSED
;
1011 rtx
* pinsn
= (rtx
*) data
;
1013 if (*pinsn
&& reg_mentioned_p (x
, *pinsn
))
1017 /* Helper function for set_of. */
1025 set_of_1 (x
, pat
, data1
)
1030 struct set_of_data
*data
= (struct set_of_data
*) (data1
);
1031 if (rtx_equal_p (x
, data
->pat
)
1032 || (GET_CODE (x
) != MEM
&& reg_overlap_mentioned_p (data
->pat
, x
)))
1036 /* Give an INSN, return a SET or CLOBBER expression that does modify PAT
1037 (either directly or via STRICT_LOW_PART and similar modifiers). */
1042 struct set_of_data data
;
1043 data
.found
= NULL_RTX
;
1045 note_stores (INSN_P (insn
) ? PATTERN (insn
) : insn
, set_of_1
, &data
);
1049 /* Given an INSN, return a SET expression if this insn has only a single SET.
1050 It may also have CLOBBERs, USEs, or SET whose output
1051 will not be used, which we ignore. */
1054 single_set_2 (insn
, pat
)
1058 int set_verified
= 1;
1061 if (GET_CODE (pat
) == PARALLEL
)
1063 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
1065 rtx sub
= XVECEXP (pat
, 0, i
);
1066 switch (GET_CODE (sub
))
1073 /* We can consider insns having multiple sets, where all
1074 but one are dead as single set insns. In common case
1075 only single set is present in the pattern so we want
1076 to avoid checking for REG_UNUSED notes unless necessary.
1078 When we reach set first time, we just expect this is
1079 the single set we are looking for and only when more
1080 sets are found in the insn, we check them. */
1083 if (find_reg_note (insn
, REG_UNUSED
, SET_DEST (set
))
1084 && !side_effects_p (set
))
1090 set
= sub
, set_verified
= 0;
1091 else if (!find_reg_note (insn
, REG_UNUSED
, SET_DEST (sub
))
1092 || side_effects_p (sub
))
1104 /* Given an INSN, return nonzero if it has more than one SET, else return
1108 multiple_sets (insn
)
1114 /* INSN must be an insn. */
1115 if (! INSN_P (insn
))
1118 /* Only a PARALLEL can have multiple SETs. */
1119 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
1121 for (i
= 0, found
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
1122 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, i
)) == SET
)
1124 /* If we have already found a SET, then return now. */
1132 /* Either zero or one SET. */
1136 /* Return nonzero if the destination of SET equals the source
1137 and there are no side effects. */
1143 rtx src
= SET_SRC (set
);
1144 rtx dst
= SET_DEST (set
);
1146 if (side_effects_p (src
) || side_effects_p (dst
))
1149 if (GET_CODE (dst
) == MEM
&& GET_CODE (src
) == MEM
)
1150 return rtx_equal_p (dst
, src
);
1152 if (dst
== pc_rtx
&& src
== pc_rtx
)
1155 if (GET_CODE (dst
) == SIGN_EXTRACT
1156 || GET_CODE (dst
) == ZERO_EXTRACT
)
1157 return rtx_equal_p (XEXP (dst
, 0), src
)
1158 && ! BYTES_BIG_ENDIAN
&& XEXP (dst
, 2) == const0_rtx
;
1160 if (GET_CODE (dst
) == STRICT_LOW_PART
)
1161 dst
= XEXP (dst
, 0);
1163 if (GET_CODE (src
) == SUBREG
&& GET_CODE (dst
) == SUBREG
)
1165 if (SUBREG_BYTE (src
) != SUBREG_BYTE (dst
))
1167 src
= SUBREG_REG (src
);
1168 dst
= SUBREG_REG (dst
);
1171 return (GET_CODE (src
) == REG
&& GET_CODE (dst
) == REG
1172 && REGNO (src
) == REGNO (dst
));
1175 /* Return nonzero if an insn consists only of SETs, each of which only sets a
1182 rtx pat
= PATTERN (insn
);
1184 if (INSN_CODE (insn
) == NOOP_MOVE_INSN_CODE
)
1187 /* Insns carrying these notes are useful later on. */
1188 if (find_reg_note (insn
, REG_EQUAL
, NULL_RTX
))
1191 /* For now treat an insn with a REG_RETVAL note as a
1192 a special insn which should not be considered a no-op. */
1193 if (find_reg_note (insn
, REG_RETVAL
, NULL_RTX
))
1196 if (GET_CODE (pat
) == SET
&& set_noop_p (pat
))
1199 if (GET_CODE (pat
) == PARALLEL
)
1202 /* If nothing but SETs of registers to themselves,
1203 this insn can also be deleted. */
1204 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
1206 rtx tem
= XVECEXP (pat
, 0, i
);
1208 if (GET_CODE (tem
) == USE
1209 || GET_CODE (tem
) == CLOBBER
)
1212 if (GET_CODE (tem
) != SET
|| ! set_noop_p (tem
))
1222 /* Return the last thing that X was assigned from before *PINSN. If VALID_TO
1223 is not NULL_RTX then verify that the object is not modified up to VALID_TO.
1224 If the object was modified, if we hit a partial assignment to X, or hit a
1225 CODE_LABEL first, return X. If we found an assignment, update *PINSN to
1226 point to it. ALLOW_HWREG is set to 1 if hardware registers are allowed to
1230 find_last_value (x
, pinsn
, valid_to
, allow_hwreg
)
1238 for (p
= PREV_INSN (*pinsn
); p
&& GET_CODE (p
) != CODE_LABEL
;
1242 rtx set
= single_set (p
);
1243 rtx note
= find_reg_note (p
, REG_EQUAL
, NULL_RTX
);
1245 if (set
&& rtx_equal_p (x
, SET_DEST (set
)))
1247 rtx src
= SET_SRC (set
);
1249 if (note
&& GET_CODE (XEXP (note
, 0)) != EXPR_LIST
)
1250 src
= XEXP (note
, 0);
1252 if ((valid_to
== NULL_RTX
1253 || ! modified_between_p (src
, PREV_INSN (p
), valid_to
))
1254 /* Reject hard registers because we don't usually want
1255 to use them; we'd rather use a pseudo. */
1256 && (! (GET_CODE (src
) == REG
1257 && REGNO (src
) < FIRST_PSEUDO_REGISTER
) || allow_hwreg
))
1264 /* If set in non-simple way, we don't have a value. */
1265 if (reg_set_p (x
, p
))
1272 /* Return nonzero if register in range [REGNO, ENDREGNO)
1273 appears either explicitly or implicitly in X
1274 other than being stored into.
1276 References contained within the substructure at LOC do not count.
1277 LOC may be zero, meaning don't ignore anything. */
1280 refers_to_regno_p (regno
, endregno
, x
, loc
)
1281 unsigned int regno
, endregno
;
1286 unsigned int x_regno
;
1291 /* The contents of a REG_NONNEG note is always zero, so we must come here
1292 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
1296 code
= GET_CODE (x
);
1301 x_regno
= REGNO (x
);
1303 /* If we modifying the stack, frame, or argument pointer, it will
1304 clobber a virtual register. In fact, we could be more precise,
1305 but it isn't worth it. */
1306 if ((x_regno
== STACK_POINTER_REGNUM
1307 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1308 || x_regno
== ARG_POINTER_REGNUM
1310 || x_regno
== FRAME_POINTER_REGNUM
)
1311 && regno
>= FIRST_VIRTUAL_REGISTER
&& regno
<= LAST_VIRTUAL_REGISTER
)
1314 return (endregno
> x_regno
1315 && regno
< x_regno
+ (x_regno
< FIRST_PSEUDO_REGISTER
1316 ? HARD_REGNO_NREGS (x_regno
, GET_MODE (x
))
1320 /* If this is a SUBREG of a hard reg, we can see exactly which
1321 registers are being modified. Otherwise, handle normally. */
1322 if (GET_CODE (SUBREG_REG (x
)) == REG
1323 && REGNO (SUBREG_REG (x
)) < FIRST_PSEUDO_REGISTER
)
1325 unsigned int inner_regno
= subreg_regno (x
);
1326 unsigned int inner_endregno
1327 = inner_regno
+ (inner_regno
< FIRST_PSEUDO_REGISTER
1328 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
1330 return endregno
> inner_regno
&& regno
< inner_endregno
;
1336 if (&SET_DEST (x
) != loc
1337 /* Note setting a SUBREG counts as referring to the REG it is in for
1338 a pseudo but not for hard registers since we can
1339 treat each word individually. */
1340 && ((GET_CODE (SET_DEST (x
)) == SUBREG
1341 && loc
!= &SUBREG_REG (SET_DEST (x
))
1342 && GET_CODE (SUBREG_REG (SET_DEST (x
))) == REG
1343 && REGNO (SUBREG_REG (SET_DEST (x
))) >= FIRST_PSEUDO_REGISTER
1344 && refers_to_regno_p (regno
, endregno
,
1345 SUBREG_REG (SET_DEST (x
)), loc
))
1346 || (GET_CODE (SET_DEST (x
)) != REG
1347 && refers_to_regno_p (regno
, endregno
, SET_DEST (x
), loc
))))
1350 if (code
== CLOBBER
|| loc
== &SET_SRC (x
))
1359 /* X does not match, so try its subexpressions. */
1361 fmt
= GET_RTX_FORMAT (code
);
1362 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1364 if (fmt
[i
] == 'e' && loc
!= &XEXP (x
, i
))
1372 if (refers_to_regno_p (regno
, endregno
, XEXP (x
, i
), loc
))
1375 else if (fmt
[i
] == 'E')
1378 for (j
= XVECLEN (x
, i
) - 1; j
>=0; j
--)
1379 if (loc
!= &XVECEXP (x
, i
, j
)
1380 && refers_to_regno_p (regno
, endregno
, XVECEXP (x
, i
, j
), loc
))
1387 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
1388 we check if any register number in X conflicts with the relevant register
1389 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
1390 contains a MEM (we don't bother checking for memory addresses that can't
1391 conflict because we expect this to be a rare case. */
1394 reg_overlap_mentioned_p (x
, in
)
1397 unsigned int regno
, endregno
;
1399 /* Overly conservative. */
1400 if (GET_CODE (x
) == STRICT_LOW_PART
)
1403 /* If either argument is a constant, then modifying X can not affect IN. */
1404 if (CONSTANT_P (x
) || CONSTANT_P (in
))
1407 switch (GET_CODE (x
))
1410 regno
= REGNO (SUBREG_REG (x
));
1411 if (regno
< FIRST_PSEUDO_REGISTER
)
1412 regno
= subreg_regno (x
);
1418 endregno
= regno
+ (regno
< FIRST_PSEUDO_REGISTER
1419 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
1420 return refers_to_regno_p (regno
, endregno
, in
, (rtx
*) 0);
1427 if (GET_CODE (in
) == MEM
)
1430 fmt
= GET_RTX_FORMAT (GET_CODE (in
));
1431 for (i
= GET_RTX_LENGTH (GET_CODE (in
)) - 1; i
>= 0; i
--)
1432 if (fmt
[i
] == 'e' && reg_overlap_mentioned_p (x
, XEXP (in
, i
)))
1441 return reg_mentioned_p (x
, in
);
1447 /* If any register in here refers to it we return true. */
1448 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1449 if (XEXP (XVECEXP (x
, 0, i
), 0) != 0
1450 && reg_overlap_mentioned_p (XEXP (XVECEXP (x
, 0, i
), 0), in
))
1462 /* Return the last value to which REG was set prior to INSN. If we can't
1463 find it easily, return 0.
1465 We only return a REG, SUBREG, or constant because it is too hard to
1466 check if a MEM remains unchanged. */
1469 reg_set_last (x
, insn
)
1473 rtx orig_insn
= insn
;
1475 /* Scan backwards until reg_set_last_1 changed one of the above flags.
1476 Stop when we reach a label or X is a hard reg and we reach a
1477 CALL_INSN (if reg_set_last_last_regno is a hard reg).
1479 If we find a set of X, ensure that its SET_SRC remains unchanged. */
1481 /* We compare with <= here, because reg_set_last_last_regno
1482 is actually the number of the first reg *not* in X. */
1484 insn
&& GET_CODE (insn
) != CODE_LABEL
1485 && ! (GET_CODE (insn
) == CALL_INSN
1486 && REGNO (x
) <= FIRST_PSEUDO_REGISTER
);
1487 insn
= PREV_INSN (insn
))
1490 rtx set
= set_of (x
, insn
);
1491 /* OK, this function modify our register. See if we understand it. */
1495 if (GET_CODE (set
) != SET
|| SET_DEST (set
) != x
)
1497 last_value
= SET_SRC (x
);
1498 if (CONSTANT_P (last_value
)
1499 || ((GET_CODE (last_value
) == REG
1500 || GET_CODE (last_value
) == SUBREG
)
1501 && ! reg_set_between_p (last_value
,
1512 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1513 (X would be the pattern of an insn).
1514 FUN receives two arguments:
1515 the REG, MEM, CC0 or PC being stored in or clobbered,
1516 the SET or CLOBBER rtx that does the store.
1518 If the item being stored in or clobbered is a SUBREG of a hard register,
1519 the SUBREG will be passed. */
1522 note_stores (x
, fun
, data
)
1524 void (*fun
) PARAMS ((rtx
, rtx
, void *));
1529 if (GET_CODE (x
) == COND_EXEC
)
1530 x
= COND_EXEC_CODE (x
);
1532 if (GET_CODE (x
) == SET
|| GET_CODE (x
) == CLOBBER
)
1534 rtx dest
= SET_DEST (x
);
1536 while ((GET_CODE (dest
) == SUBREG
1537 && (GET_CODE (SUBREG_REG (dest
)) != REG
1538 || REGNO (SUBREG_REG (dest
)) >= FIRST_PSEUDO_REGISTER
))
1539 || GET_CODE (dest
) == ZERO_EXTRACT
1540 || GET_CODE (dest
) == SIGN_EXTRACT
1541 || GET_CODE (dest
) == STRICT_LOW_PART
)
1542 dest
= XEXP (dest
, 0);
1544 /* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions,
1545 each of whose first operand is a register. */
1546 if (GET_CODE (dest
) == PARALLEL
)
1548 for (i
= XVECLEN (dest
, 0) - 1; i
>= 0; i
--)
1549 if (XEXP (XVECEXP (dest
, 0, i
), 0) != 0)
1550 (*fun
) (XEXP (XVECEXP (dest
, 0, i
), 0), x
, data
);
1553 (*fun
) (dest
, x
, data
);
1556 else if (GET_CODE (x
) == PARALLEL
)
1557 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1558 note_stores (XVECEXP (x
, 0, i
), fun
, data
);
1561 /* Like notes_stores, but call FUN for each expression that is being
1562 referenced in PBODY, a pointer to the PATTERN of an insn. We only call
1563 FUN for each expression, not any interior subexpressions. FUN receives a
1564 pointer to the expression and the DATA passed to this function.
1566 Note that this is not quite the same test as that done in reg_referenced_p
1567 since that considers something as being referenced if it is being
1568 partially set, while we do not. */
1571 note_uses (pbody
, fun
, data
)
1573 void (*fun
) PARAMS ((rtx
*, void *));
1579 switch (GET_CODE (body
))
1582 (*fun
) (&COND_EXEC_TEST (body
), data
);
1583 note_uses (&COND_EXEC_CODE (body
), fun
, data
);
1587 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
1588 note_uses (&XVECEXP (body
, 0, i
), fun
, data
);
1592 (*fun
) (&XEXP (body
, 0), data
);
1596 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
1597 (*fun
) (&ASM_OPERANDS_INPUT (body
, i
), data
);
1601 (*fun
) (&TRAP_CONDITION (body
), data
);
1605 (*fun
) (&XEXP (body
, 0), data
);
1609 case UNSPEC_VOLATILE
:
1610 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
1611 (*fun
) (&XVECEXP (body
, 0, i
), data
);
1615 if (GET_CODE (XEXP (body
, 0)) == MEM
)
1616 (*fun
) (&XEXP (XEXP (body
, 0), 0), data
);
1621 rtx dest
= SET_DEST (body
);
1623 /* For sets we replace everything in source plus registers in memory
1624 expression in store and operands of a ZERO_EXTRACT. */
1625 (*fun
) (&SET_SRC (body
), data
);
1627 if (GET_CODE (dest
) == ZERO_EXTRACT
)
1629 (*fun
) (&XEXP (dest
, 1), data
);
1630 (*fun
) (&XEXP (dest
, 2), data
);
1633 while (GET_CODE (dest
) == SUBREG
|| GET_CODE (dest
) == STRICT_LOW_PART
)
1634 dest
= XEXP (dest
, 0);
1636 if (GET_CODE (dest
) == MEM
)
1637 (*fun
) (&XEXP (dest
, 0), data
);
1642 /* All the other possibilities never store. */
1643 (*fun
) (pbody
, data
);
1648 /* Return nonzero if X's old contents don't survive after INSN.
1649 This will be true if X is (cc0) or if X is a register and
1650 X dies in INSN or because INSN entirely sets X.
1652 "Entirely set" means set directly and not through a SUBREG,
1653 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1654 Likewise, REG_INC does not count.
1656 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1657 but for this use that makes no difference, since regs don't overlap
1658 during their lifetimes. Therefore, this function may be used
1659 at any time after deaths have been computed (in flow.c).
1661 If REG is a hard reg that occupies multiple machine registers, this
1662 function will only return 1 if each of those registers will be replaced
1666 dead_or_set_p (insn
, x
)
1670 unsigned int regno
, last_regno
;
1673 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1674 if (GET_CODE (x
) == CC0
)
1677 if (GET_CODE (x
) != REG
)
1681 last_regno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
1682 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (x
)) - 1);
1684 for (i
= regno
; i
<= last_regno
; i
++)
1685 if (! dead_or_set_regno_p (insn
, i
))
1691 /* Utility function for dead_or_set_p to check an individual register. Also
1692 called from flow.c. */
1695 dead_or_set_regno_p (insn
, test_regno
)
1697 unsigned int test_regno
;
1699 unsigned int regno
, endregno
;
1702 /* See if there is a death note for something that includes TEST_REGNO. */
1703 if (find_regno_note (insn
, REG_DEAD
, test_regno
))
1706 if (GET_CODE (insn
) == CALL_INSN
1707 && find_regno_fusage (insn
, CLOBBER
, test_regno
))
1710 pattern
= PATTERN (insn
);
1712 if (GET_CODE (pattern
) == COND_EXEC
)
1713 pattern
= COND_EXEC_CODE (pattern
);
1715 if (GET_CODE (pattern
) == SET
)
1717 rtx dest
= SET_DEST (PATTERN (insn
));
1719 /* A value is totally replaced if it is the destination or the
1720 destination is a SUBREG of REGNO that does not change the number of
1722 if (GET_CODE (dest
) == SUBREG
1723 && (((GET_MODE_SIZE (GET_MODE (dest
))
1724 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1725 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1726 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1727 dest
= SUBREG_REG (dest
);
1729 if (GET_CODE (dest
) != REG
)
1732 regno
= REGNO (dest
);
1733 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1734 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1736 return (test_regno
>= regno
&& test_regno
< endregno
);
1738 else if (GET_CODE (pattern
) == PARALLEL
)
1742 for (i
= XVECLEN (pattern
, 0) - 1; i
>= 0; i
--)
1744 rtx body
= XVECEXP (pattern
, 0, i
);
1746 if (GET_CODE (body
) == COND_EXEC
)
1747 body
= COND_EXEC_CODE (body
);
1749 if (GET_CODE (body
) == SET
|| GET_CODE (body
) == CLOBBER
)
1751 rtx dest
= SET_DEST (body
);
1753 if (GET_CODE (dest
) == SUBREG
1754 && (((GET_MODE_SIZE (GET_MODE (dest
))
1755 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)
1756 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest
)))
1757 + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
)))
1758 dest
= SUBREG_REG (dest
);
1760 if (GET_CODE (dest
) != REG
)
1763 regno
= REGNO (dest
);
1764 endregno
= (regno
>= FIRST_PSEUDO_REGISTER
? regno
+ 1
1765 : regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (dest
)));
1767 if (test_regno
>= regno
&& test_regno
< endregno
)
1776 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1777 If DATUM is nonzero, look for one whose datum is DATUM. */
1780 find_reg_note (insn
, kind
, datum
)
1787 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1788 if (! INSN_P (insn
))
1791 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1792 if (REG_NOTE_KIND (link
) == kind
1793 && (datum
== 0 || datum
== XEXP (link
, 0)))
1798 /* Return the reg-note of kind KIND in insn INSN which applies to register
1799 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1800 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1801 it might be the case that the note overlaps REGNO. */
1804 find_regno_note (insn
, kind
, regno
)
1811 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1812 if (! INSN_P (insn
))
1815 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1816 if (REG_NOTE_KIND (link
) == kind
1817 /* Verify that it is a register, so that scratch and MEM won't cause a
1819 && GET_CODE (XEXP (link
, 0)) == REG
1820 && REGNO (XEXP (link
, 0)) <= regno
1821 && ((REGNO (XEXP (link
, 0))
1822 + (REGNO (XEXP (link
, 0)) >= FIRST_PSEUDO_REGISTER
? 1
1823 : HARD_REGNO_NREGS (REGNO (XEXP (link
, 0)),
1824 GET_MODE (XEXP (link
, 0)))))
1830 /* Return a REG_EQUIV or REG_EQUAL note if insn has only a single set and
1834 find_reg_equal_equiv_note (insn
)
1839 if (single_set (insn
) == 0)
1841 else if ((note
= find_reg_note (insn
, REG_EQUIV
, NULL_RTX
)) != 0)
1844 return find_reg_note (insn
, REG_EQUAL
, NULL_RTX
);
1847 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1848 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1851 find_reg_fusage (insn
, code
, datum
)
1856 /* If it's not a CALL_INSN, it can't possibly have a
1857 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1858 if (GET_CODE (insn
) != CALL_INSN
)
1864 if (GET_CODE (datum
) != REG
)
1868 for (link
= CALL_INSN_FUNCTION_USAGE (insn
);
1870 link
= XEXP (link
, 1))
1871 if (GET_CODE (XEXP (link
, 0)) == code
1872 && rtx_equal_p (datum
, XEXP (XEXP (link
, 0), 0)))
1877 unsigned int regno
= REGNO (datum
);
1879 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1880 to pseudo registers, so don't bother checking. */
1882 if (regno
< FIRST_PSEUDO_REGISTER
)
1884 unsigned int end_regno
1885 = regno
+ HARD_REGNO_NREGS (regno
, GET_MODE (datum
));
1888 for (i
= regno
; i
< end_regno
; i
++)
1889 if (find_regno_fusage (insn
, code
, i
))
1897 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1898 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1901 find_regno_fusage (insn
, code
, regno
)
1908 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1909 to pseudo registers, so don't bother checking. */
1911 if (regno
>= FIRST_PSEUDO_REGISTER
1912 || GET_CODE (insn
) != CALL_INSN
)
1915 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
1917 unsigned int regnote
;
1920 if (GET_CODE (op
= XEXP (link
, 0)) == code
1921 && GET_CODE (reg
= XEXP (op
, 0)) == REG
1922 && (regnote
= REGNO (reg
)) <= regno
1923 && regnote
+ HARD_REGNO_NREGS (regnote
, GET_MODE (reg
)) > regno
)
1930 /* Return true if INSN is a call to a pure function. */
1938 if (GET_CODE (insn
) != CALL_INSN
|| ! CONST_OR_PURE_CALL_P (insn
))
1941 /* Look for the note that differentiates const and pure functions. */
1942 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
1946 if (GET_CODE (u
= XEXP (link
, 0)) == USE
1947 && GET_CODE (m
= XEXP (u
, 0)) == MEM
&& GET_MODE (m
) == BLKmode
1948 && GET_CODE (XEXP (m
, 0)) == SCRATCH
)
1955 /* Remove register note NOTE from the REG_NOTES of INSN. */
1958 remove_note (insn
, note
)
1964 if (note
== NULL_RTX
)
1967 if (REG_NOTES (insn
) == note
)
1969 REG_NOTES (insn
) = XEXP (note
, 1);
1973 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1974 if (XEXP (link
, 1) == note
)
1976 XEXP (link
, 1) = XEXP (note
, 1);
1983 /* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
1984 return 1 if it is found. A simple equality test is used to determine if
1988 in_expr_list_p (listp
, node
)
1994 for (x
= listp
; x
; x
= XEXP (x
, 1))
1995 if (node
== XEXP (x
, 0))
2001 /* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
2002 remove that entry from the list if it is found.
2004 A simple equality test is used to determine if NODE matches. */
2007 remove_node_from_expr_list (node
, listp
)
2012 rtx prev
= NULL_RTX
;
2016 if (node
== XEXP (temp
, 0))
2018 /* Splice the node out of the list. */
2020 XEXP (prev
, 1) = XEXP (temp
, 1);
2022 *listp
= XEXP (temp
, 1);
2028 temp
= XEXP (temp
, 1);
2032 /* Nonzero if X contains any volatile instructions. These are instructions
2033 which may cause unpredictable machine state instructions, and thus no
2034 instructions should be moved or combined across them. This includes
2035 only volatile asms and UNSPEC_VOLATILE instructions. */
2043 code
= GET_CODE (x
);
2064 case UNSPEC_VOLATILE
:
2065 /* case TRAP_IF: This isn't clear yet. */
2069 if (MEM_VOLATILE_P (x
))
2076 /* Recursively scan the operands of this expression. */
2079 const char *fmt
= GET_RTX_FORMAT (code
);
2082 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2086 if (volatile_insn_p (XEXP (x
, i
)))
2089 else if (fmt
[i
] == 'E')
2092 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2093 if (volatile_insn_p (XVECEXP (x
, i
, j
)))
2101 /* Nonzero if X contains any volatile memory references
2102 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
2110 code
= GET_CODE (x
);
2130 case UNSPEC_VOLATILE
:
2131 /* case TRAP_IF: This isn't clear yet. */
2136 if (MEM_VOLATILE_P (x
))
2143 /* Recursively scan the operands of this expression. */
2146 const char *fmt
= GET_RTX_FORMAT (code
);
2149 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2153 if (volatile_refs_p (XEXP (x
, i
)))
2156 else if (fmt
[i
] == 'E')
2159 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2160 if (volatile_refs_p (XVECEXP (x
, i
, j
)))
2168 /* Similar to above, except that it also rejects register pre- and post-
2177 code
= GET_CODE (x
);
2196 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
2197 when some combination can't be done. If we see one, don't think
2198 that we can simplify the expression. */
2199 return (GET_MODE (x
) != VOIDmode
);
2208 case UNSPEC_VOLATILE
:
2209 /* case TRAP_IF: This isn't clear yet. */
2214 if (MEM_VOLATILE_P (x
))
2221 /* Recursively scan the operands of this expression. */
2224 const char *fmt
= GET_RTX_FORMAT (code
);
2227 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2231 if (side_effects_p (XEXP (x
, i
)))
2234 else if (fmt
[i
] == 'E')
2237 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2238 if (side_effects_p (XVECEXP (x
, i
, j
)))
2246 /* Return nonzero if evaluating rtx X might cause a trap. */
2258 code
= GET_CODE (x
);
2261 /* Handle these cases quickly. */
2275 case UNSPEC_VOLATILE
:
2280 return MEM_VOLATILE_P (x
);
2282 /* Memory ref can trap unless it's a static var or a stack slot. */
2284 return rtx_addr_can_trap_p (XEXP (x
, 0));
2286 /* Division by a non-constant might trap. */
2291 if (! CONSTANT_P (XEXP (x
, 1))
2292 || GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2294 /* This was const0_rtx, but by not using that,
2295 we can link this file into other programs. */
2296 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
&& INTVAL (XEXP (x
, 1)) == 0)
2301 /* An EXPR_LIST is used to represent a function call. This
2302 certainly may trap. */
2310 /* Some floating point comparisons may trap. */
2311 /* ??? There is no machine independent way to check for tests that trap
2312 when COMPARE is used, though many targets do make this distinction.
2313 For instance, sparc uses CCFPE for compares which generate exceptions
2314 and CCFP for compares which do not generate exceptions. */
2315 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2317 /* But often the compare has some CC mode, so check operand
2319 if (GET_MODE_CLASS (GET_MODE (XEXP (x
, 0))) == MODE_FLOAT
2320 || GET_MODE_CLASS (GET_MODE (XEXP (x
, 1))) == MODE_FLOAT
)
2326 /* These operations don't trap even with floating point. */
2330 /* Any floating arithmetic may trap. */
2331 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2335 fmt
= GET_RTX_FORMAT (code
);
2336 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2340 if (may_trap_p (XEXP (x
, i
)))
2343 else if (fmt
[i
] == 'E')
2346 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2347 if (may_trap_p (XVECEXP (x
, i
, j
)))
2354 /* Return nonzero if X contains a comparison that is not either EQ or NE,
2355 i.e., an inequality. */
2358 inequality_comparisons_p (x
)
2363 enum rtx_code code
= GET_CODE (x
);
2393 len
= GET_RTX_LENGTH (code
);
2394 fmt
= GET_RTX_FORMAT (code
);
2396 for (i
= 0; i
< len
; i
++)
2400 if (inequality_comparisons_p (XEXP (x
, i
)))
2403 else if (fmt
[i
] == 'E')
2406 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
2407 if (inequality_comparisons_p (XVECEXP (x
, i
, j
)))
2415 /* Replace any occurrence of FROM in X with TO. The function does
2416 not enter into CONST_DOUBLE for the replace.
2418 Note that copying is not done so X must not be shared unless all copies
2419 are to be modified. */
2422 replace_rtx (x
, from
, to
)
2428 /* The following prevents loops occurrence when we change MEM in
2429 CONST_DOUBLE onto the same CONST_DOUBLE. */
2430 if (x
!= 0 && GET_CODE (x
) == CONST_DOUBLE
)
2436 /* Allow this function to make replacements in EXPR_LISTs. */
2440 if (GET_CODE (x
) == SUBREG
)
2442 rtx
new = replace_rtx (SUBREG_REG (x
), from
, to
);
2444 if (GET_CODE (new) == CONST_INT
)
2446 x
= simplify_subreg (GET_MODE (x
), new,
2447 GET_MODE (SUBREG_REG (x
)),
2453 SUBREG_REG (x
) = new;
2457 else if (GET_CODE (x
) == ZERO_EXTEND
)
2459 rtx
new = replace_rtx (XEXP (x
, 0), from
, to
);
2461 if (GET_CODE (new) == CONST_INT
)
2463 x
= simplify_unary_operation (ZERO_EXTEND
, GET_MODE (x
),
2464 new, GET_MODE (XEXP (x
, 0)));
2474 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
2475 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
2478 XEXP (x
, i
) = replace_rtx (XEXP (x
, i
), from
, to
);
2479 else if (fmt
[i
] == 'E')
2480 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
2481 XVECEXP (x
, i
, j
) = replace_rtx (XVECEXP (x
, i
, j
), from
, to
);
2487 /* Throughout the rtx X, replace many registers according to REG_MAP.
2488 Return the replacement for X (which may be X with altered contents).
2489 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
2490 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
2492 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
2493 should not be mapped to pseudos or vice versa since validate_change
2496 If REPLACE_DEST is 1, replacements are also done in destinations;
2497 otherwise, only sources are replaced. */
2500 replace_regs (x
, reg_map
, nregs
, replace_dest
)
2513 code
= GET_CODE (x
);
2528 /* Verify that the register has an entry before trying to access it. */
2529 if (REGNO (x
) < nregs
&& reg_map
[REGNO (x
)] != 0)
2531 /* SUBREGs can't be shared. Always return a copy to ensure that if
2532 this replacement occurs more than once then each instance will
2533 get distinct rtx. */
2534 if (GET_CODE (reg_map
[REGNO (x
)]) == SUBREG
)
2535 return copy_rtx (reg_map
[REGNO (x
)]);
2536 return reg_map
[REGNO (x
)];
2541 /* Prevent making nested SUBREGs. */
2542 if (GET_CODE (SUBREG_REG (x
)) == REG
&& REGNO (SUBREG_REG (x
)) < nregs
2543 && reg_map
[REGNO (SUBREG_REG (x
))] != 0
2544 && GET_CODE (reg_map
[REGNO (SUBREG_REG (x
))]) == SUBREG
)
2546 rtx map_val
= reg_map
[REGNO (SUBREG_REG (x
))];
2547 return simplify_gen_subreg (GET_MODE (x
), map_val
,
2548 GET_MODE (SUBREG_REG (x
)),
2555 SET_DEST (x
) = replace_regs (SET_DEST (x
), reg_map
, nregs
, 0);
2557 else if (GET_CODE (SET_DEST (x
)) == MEM
2558 || GET_CODE (SET_DEST (x
)) == STRICT_LOW_PART
)
2559 /* Even if we are not to replace destinations, replace register if it
2560 is CONTAINED in destination (destination is memory or
2561 STRICT_LOW_PART). */
2562 XEXP (SET_DEST (x
), 0) = replace_regs (XEXP (SET_DEST (x
), 0),
2564 else if (GET_CODE (SET_DEST (x
)) == ZERO_EXTRACT
)
2565 /* Similarly, for ZERO_EXTRACT we replace all operands. */
2568 SET_SRC (x
) = replace_regs (SET_SRC (x
), reg_map
, nregs
, 0);
2575 fmt
= GET_RTX_FORMAT (code
);
2576 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2579 XEXP (x
, i
) = replace_regs (XEXP (x
, i
), reg_map
, nregs
, replace_dest
);
2580 else if (fmt
[i
] == 'E')
2583 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2584 XVECEXP (x
, i
, j
) = replace_regs (XVECEXP (x
, i
, j
), reg_map
,
2585 nregs
, replace_dest
);
2591 /* A subroutine of computed_jump_p, return 1 if X contains a REG or MEM or
2592 constant that is not in the constant pool and not in the condition
2593 of an IF_THEN_ELSE. */
2596 computed_jump_p_1 (x
)
2599 enum rtx_code code
= GET_CODE (x
);
2618 return ! (GET_CODE (XEXP (x
, 0)) == SYMBOL_REF
2619 && CONSTANT_POOL_ADDRESS_P (XEXP (x
, 0)));
2622 return (computed_jump_p_1 (XEXP (x
, 1))
2623 || computed_jump_p_1 (XEXP (x
, 2)));
2629 fmt
= GET_RTX_FORMAT (code
);
2630 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2633 && computed_jump_p_1 (XEXP (x
, i
)))
2636 else if (fmt
[i
] == 'E')
2637 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2638 if (computed_jump_p_1 (XVECEXP (x
, i
, j
)))
2645 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2647 Tablejumps and casesi insns are not considered indirect jumps;
2648 we can recognize them by a (use (label_ref)). */
2651 computed_jump_p (insn
)
2655 if (GET_CODE (insn
) == JUMP_INSN
)
2657 rtx pat
= PATTERN (insn
);
2659 if (find_reg_note (insn
, REG_LABEL
, NULL_RTX
))
2661 else if (GET_CODE (pat
) == PARALLEL
)
2663 int len
= XVECLEN (pat
, 0);
2664 int has_use_labelref
= 0;
2666 for (i
= len
- 1; i
>= 0; i
--)
2667 if (GET_CODE (XVECEXP (pat
, 0, i
)) == USE
2668 && (GET_CODE (XEXP (XVECEXP (pat
, 0, i
), 0))
2670 has_use_labelref
= 1;
2672 if (! has_use_labelref
)
2673 for (i
= len
- 1; i
>= 0; i
--)
2674 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
2675 && SET_DEST (XVECEXP (pat
, 0, i
)) == pc_rtx
2676 && computed_jump_p_1 (SET_SRC (XVECEXP (pat
, 0, i
))))
2679 else if (GET_CODE (pat
) == SET
2680 && SET_DEST (pat
) == pc_rtx
2681 && computed_jump_p_1 (SET_SRC (pat
)))
2687 /* Traverse X via depth-first search, calling F for each
2688 sub-expression (including X itself). F is also passed the DATA.
2689 If F returns -1, do not traverse sub-expressions, but continue
2690 traversing the rest of the tree. If F ever returns any other
2691 non-zero value, stop the traversal, and return the value returned
2692 by F. Otherwise, return 0. This function does not traverse inside
2693 tree structure that contains RTX_EXPRs, or into sub-expressions
2694 whose format code is `0' since it is not known whether or not those
2695 codes are actually RTL.
2697 This routine is very general, and could (should?) be used to
2698 implement many of the other routines in this file. */
2701 for_each_rtx (x
, f
, data
)
2712 result
= (*f
) (x
, data
);
2714 /* Do not traverse sub-expressions. */
2716 else if (result
!= 0)
2717 /* Stop the traversal. */
2721 /* There are no sub-expressions. */
2724 length
= GET_RTX_LENGTH (GET_CODE (*x
));
2725 format
= GET_RTX_FORMAT (GET_CODE (*x
));
2727 for (i
= 0; i
< length
; ++i
)
2732 result
= for_each_rtx (&XEXP (*x
, i
), f
, data
);
2739 if (XVEC (*x
, i
) != 0)
2742 for (j
= 0; j
< XVECLEN (*x
, i
); ++j
)
2744 result
= for_each_rtx (&XVECEXP (*x
, i
, j
), f
, data
);
2752 /* Nothing to do. */
2761 /* Searches X for any reference to REGNO, returning the rtx of the
2762 reference found if any. Otherwise, returns NULL_RTX. */
2765 regno_use_in (regno
, x
)
2773 if (GET_CODE (x
) == REG
&& REGNO (x
) == regno
)
2776 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
2777 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
2781 if ((tem
= regno_use_in (regno
, XEXP (x
, i
))))
2784 else if (fmt
[i
] == 'E')
2785 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
2786 if ((tem
= regno_use_in (regno
, XVECEXP (x
, i
, j
))))
2793 /* Return a value indicating whether OP, an operand of a commutative
2794 operation, is preferred as the first or second operand. The higher
2795 the value, the stronger the preference for being the first operand.
2796 We use negative values to indicate a preference for the first operand
2797 and positive values for the second operand. */
2800 commutative_operand_precedence (op
)
2803 /* Constants always come the second operand. Prefer "nice" constants. */
2804 if (GET_CODE (op
) == CONST_INT
)
2806 if (GET_CODE (op
) == CONST_DOUBLE
)
2808 if (CONSTANT_P (op
))
2811 /* SUBREGs of objects should come second. */
2812 if (GET_CODE (op
) == SUBREG
2813 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op
))) == 'o')
2816 /* If only one operand is a `neg', `not',
2817 `mult', `plus', or `minus' expression, it will be the first
2819 if (GET_CODE (op
) == NEG
|| GET_CODE (op
) == NOT
2820 || GET_CODE (op
) == MULT
|| GET_CODE (op
) == PLUS
2821 || GET_CODE (op
) == MINUS
)
2824 /* Complex expressions should be the first, so decrease priority
2826 if (GET_RTX_CLASS (GET_CODE (op
)) == 'o')
2831 /* Return 1 iff it is necessary to swap operands of commutative operation
2832 in order to canonicalize expression. */
2835 swap_commutative_operands_p (x
, y
)
2838 return (commutative_operand_precedence (x
)
2839 < commutative_operand_precedence (y
));
2842 /* Return 1 if X is an autoincrement side effect and the register is
2843 not the stack pointer. */
2848 switch (GET_CODE (x
))
2856 /* There are no REG_INC notes for SP. */
2857 if (XEXP (x
, 0) != stack_pointer_rtx
)
2865 /* Return 1 if the sequence of instructions beginning with FROM and up
2866 to and including TO is safe to move. If NEW_TO is non-NULL, and
2867 the sequence is not already safe to move, but can be easily
2868 extended to a sequence which is safe, then NEW_TO will point to the
2869 end of the extended sequence.
2871 For now, this function only checks that the region contains whole
2872 exception regions, but it could be extended to check additional
2873 conditions as well. */
2876 insns_safe_to_move_p (from
, to
, new_to
)
2881 int eh_region_count
= 0;
2885 /* By default, assume the end of the region will be what was
2892 if (GET_CODE (r
) == NOTE
)
2894 switch (NOTE_LINE_NUMBER (r
))
2896 case NOTE_INSN_EH_REGION_BEG
:
2900 case NOTE_INSN_EH_REGION_END
:
2901 if (eh_region_count
== 0)
2902 /* This sequence of instructions contains the end of
2903 an exception region, but not he beginning. Moving
2904 it will cause chaos. */
2915 /* If we've passed TO, and we see a non-note instruction, we
2916 can't extend the sequence to a movable sequence. */
2922 /* It's OK to move the sequence if there were matched sets of
2923 exception region notes. */
2924 return eh_region_count
== 0;
2929 /* It's OK to move the sequence if there were matched sets of
2930 exception region notes. */
2931 if (past_to_p
&& eh_region_count
== 0)
2937 /* Go to the next instruction. */
2944 /* Return non-zero if IN contains a piece of rtl that has the address LOC */
2946 loc_mentioned_in_p (loc
, in
)
2949 enum rtx_code code
= GET_CODE (in
);
2950 const char *fmt
= GET_RTX_FORMAT (code
);
2953 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2955 if (loc
== &in
->fld
[i
].rtx
)
2959 if (loc_mentioned_in_p (loc
, XEXP (in
, i
)))
2962 else if (fmt
[i
] == 'E')
2963 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; j
--)
2964 if (loc_mentioned_in_p (loc
, XVECEXP (in
, i
, j
)))
2970 /* Given a subreg X, return the bit offset where the subreg begins
2971 (counting from the least significant bit of the reg). */
2977 enum machine_mode inner_mode
= GET_MODE (SUBREG_REG (x
));
2978 enum machine_mode mode
= GET_MODE (x
);
2979 unsigned int bitpos
;
2983 /* A paradoxical subreg begins at bit position 0. */
2984 if (GET_MODE_BITSIZE (mode
) > GET_MODE_BITSIZE (inner_mode
))
2987 if (WORDS_BIG_ENDIAN
!= BYTES_BIG_ENDIAN
)
2988 /* If the subreg crosses a word boundary ensure that
2989 it also begins and ends on a word boundary. */
2990 if ((SUBREG_BYTE (x
) % UNITS_PER_WORD
2991 + GET_MODE_SIZE (mode
)) > UNITS_PER_WORD
2992 && (SUBREG_BYTE (x
) % UNITS_PER_WORD
2993 || GET_MODE_SIZE (mode
) % UNITS_PER_WORD
))
2996 if (WORDS_BIG_ENDIAN
)
2997 word
= (GET_MODE_SIZE (inner_mode
)
2998 - (SUBREG_BYTE (x
) + GET_MODE_SIZE (mode
))) / UNITS_PER_WORD
;
3000 word
= SUBREG_BYTE (x
) / UNITS_PER_WORD
;
3001 bitpos
= word
* BITS_PER_WORD
;
3003 if (BYTES_BIG_ENDIAN
)
3004 byte
= (GET_MODE_SIZE (inner_mode
)
3005 - (SUBREG_BYTE (x
) + GET_MODE_SIZE (mode
))) % UNITS_PER_WORD
;
3007 byte
= SUBREG_BYTE (x
) % UNITS_PER_WORD
;
3008 bitpos
+= byte
* BITS_PER_UNIT
;
3013 /* This function returns the regno offset of a subreg expression.
3014 xregno - A regno of an inner hard subreg_reg (or what will become one).
3015 xmode - The mode of xregno.
3016 offset - The byte offset.
3017 ymode - The mode of a top level SUBREG (or what may become one).
3018 RETURN - The regno offset which would be used. */
3020 subreg_regno_offset (xregno
, xmode
, offset
, ymode
)
3021 unsigned int xregno
;
3022 enum machine_mode xmode
;
3023 unsigned int offset
;
3024 enum machine_mode ymode
;
3026 int nregs_xmode
, nregs_ymode
;
3027 int mode_multiple
, nregs_multiple
;
3030 if (xregno
>= FIRST_PSEUDO_REGISTER
)
3033 nregs_xmode
= HARD_REGNO_NREGS (xregno
, xmode
);
3034 nregs_ymode
= HARD_REGNO_NREGS (xregno
, ymode
);
3035 if (offset
== 0 || nregs_xmode
== nregs_ymode
)
3038 /* size of ymode must not be greater than the size of xmode. */
3039 mode_multiple
= GET_MODE_SIZE (xmode
) / GET_MODE_SIZE (ymode
);
3040 if (mode_multiple
== 0)
3043 y_offset
= offset
/ GET_MODE_SIZE (ymode
);
3044 nregs_multiple
= nregs_xmode
/ nregs_ymode
;
3045 return (y_offset
/ (mode_multiple
/ nregs_multiple
)) * nregs_ymode
;
3048 /* Return the final regno that a subreg expression refers to. */
3054 rtx subreg
= SUBREG_REG (x
);
3055 int regno
= REGNO (subreg
);
3057 ret
= regno
+ subreg_regno_offset (regno
,
3064 struct parms_set_data
3070 /* Helper function for noticing stores to parameter registers. */
3072 parms_set (x
, pat
, data
)
3073 rtx x
, pat ATTRIBUTE_UNUSED
;
3076 struct parms_set_data
*d
= data
;
3077 if (REG_P (x
) && REGNO (x
) < FIRST_PSEUDO_REGISTER
3078 && TEST_HARD_REG_BIT (d
->regs
, REGNO (x
)))
3080 CLEAR_HARD_REG_BIT (d
->regs
, REGNO (x
));
3085 /* Look backward for first parameter to be loaded.
3086 Do not skip BOUNDARY. */
3088 find_first_parameter_load (call_insn
, boundary
)
3089 rtx call_insn
, boundary
;
3091 struct parms_set_data parm
;
3094 /* Since different machines initialize their parameter registers
3095 in different orders, assume nothing. Collect the set of all
3096 parameter registers. */
3097 CLEAR_HARD_REG_SET (parm
.regs
);
3099 for (p
= CALL_INSN_FUNCTION_USAGE (call_insn
); p
; p
= XEXP (p
, 1))
3100 if (GET_CODE (XEXP (p
, 0)) == USE
3101 && GET_CODE (XEXP (XEXP (p
, 0), 0)) == REG
)
3103 if (REGNO (XEXP (XEXP (p
, 0), 0)) >= FIRST_PSEUDO_REGISTER
)
3106 /* We only care about registers which can hold function
3108 if (!FUNCTION_ARG_REGNO_P (REGNO (XEXP (XEXP (p
, 0), 0))))
3111 SET_HARD_REG_BIT (parm
.regs
, REGNO (XEXP (XEXP (p
, 0), 0)));
3116 /* Search backward for the first set of a register in this set. */
3117 while (parm
.nregs
&& before
!= boundary
)
3119 before
= PREV_INSN (before
);
3121 /* It is possible that some loads got CSEed from one call to
3122 another. Stop in that case. */
3123 if (GET_CODE (before
) == CALL_INSN
)
3126 /* Our caller needs either ensure that we will find all sets
3127 (in case code has not been optimized yet), or take care
3128 for possible labels in a way by setting boundary to preceding
3130 if (GET_CODE (before
) == CODE_LABEL
)
3132 if (before
!= boundary
)
3137 if (INSN_P (before
))
3138 note_stores (PATTERN (before
), parms_set
, &parm
);