* verify.c (verify_jvm_instructions): Fix typo.
[official-gcc.git] / gcc / rtlanal.c
blob9c8830d40007d8dce75536c6cf2c26320246a422
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 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
10 version.
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
15 for more details.
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
20 02111-1307, USA. */
23 #include "config.h"
24 #include "system.h"
25 #include "toplev.h"
26 #include "rtl.h"
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));
33 static void parms_set PARAMS ((rtx, rtx, void *));
35 /* Bit flags that specify the machine subtype we are compiling for.
36 Bits are tested using macros TARGET_... defined in the tm.h file
37 and set by `-m...' switches. Must be defined in rtlanal.c. */
39 int target_flags;
41 /* Return 1 if the value of X is unstable
42 (would be different at a different point in the program).
43 The frame pointer, arg pointer, etc. are considered stable
44 (within one function) and so is anything marked `unchanging'. */
46 int
47 rtx_unstable_p (x)
48 rtx x;
50 register RTX_CODE code = GET_CODE (x);
51 register int i;
52 register const char *fmt;
54 switch (code)
56 case MEM:
57 return ! RTX_UNCHANGING_P (x) || rtx_unstable_p (XEXP (x, 0));
59 case QUEUED:
60 return 1;
62 case ADDRESSOF:
63 case CONST:
64 case CONST_INT:
65 case CONST_DOUBLE:
66 case SYMBOL_REF:
67 case LABEL_REF:
68 return 0;
70 case REG:
71 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
72 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
73 /* The arg pointer varies if it is not a fixed register. */
74 || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
75 || RTX_UNCHANGING_P (x))
76 return 0;
77 #ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
78 /* ??? When call-clobbered, the value is stable modulo the restore
79 that must happen after a call. This currently screws up local-alloc
80 into believing that the restore is not needed. */
81 if (x == pic_offset_table_rtx)
82 return 0;
83 #endif
84 return 1;
86 case ASM_OPERANDS:
87 if (MEM_VOLATILE_P (x))
88 return 1;
90 /* FALLTHROUGH */
92 default:
93 break;
96 fmt = GET_RTX_FORMAT (code);
97 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
98 if (fmt[i] == 'e')
100 if (rtx_unstable_p (XEXP (x, i)))
101 return 1;
103 else if (fmt[i] == 'E')
105 int j;
106 for (j = 0; j < XVECLEN (x, i); j++)
107 if (rtx_unstable_p (XVECEXP (x, i, j)))
108 return 1;
111 return 0;
114 /* Return 1 if X has a value that can vary even between two
115 executions of the program. 0 means X can be compared reliably
116 against certain constants or near-constants.
117 FOR_ALIAS is nonzero if we are called from alias analysis; if it is
118 zero, we are slightly more conservative.
119 The frame pointer and the arg pointer are considered constant. */
122 rtx_varies_p (x, for_alias)
123 rtx x;
124 int for_alias;
126 register RTX_CODE code = GET_CODE (x);
127 register int i;
128 register const char *fmt;
130 switch (code)
132 case MEM:
133 return ! RTX_UNCHANGING_P (x) || rtx_varies_p (XEXP (x, 0), for_alias);
135 case QUEUED:
136 return 1;
138 case CONST:
139 case CONST_INT:
140 case CONST_DOUBLE:
141 case SYMBOL_REF:
142 case LABEL_REF:
143 return 0;
145 case REG:
146 /* Note that we have to test for the actual rtx used for the frame
147 and arg pointers and not just the register number in case we have
148 eliminated the frame and/or arg pointer and are using it
149 for pseudos. */
150 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
151 /* The arg pointer varies if it is not a fixed register. */
152 || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
153 return 0;
154 if (x == pic_offset_table_rtx
155 #ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
156 /* ??? When call-clobbered, the value is stable modulo the restore
157 that must happen after a call. This currently screws up
158 local-alloc into believing that the restore is not needed, so we
159 must return 0 only if we are called from alias analysis. */
160 && for_alias
161 #endif
163 return 0;
164 return 1;
166 case LO_SUM:
167 /* The operand 0 of a LO_SUM is considered constant
168 (in fact it is related specifically to operand 1)
169 during alias analysis. */
170 return (! for_alias && rtx_varies_p (XEXP (x, 0), for_alias))
171 || rtx_varies_p (XEXP (x, 1), for_alias);
173 case ASM_OPERANDS:
174 if (MEM_VOLATILE_P (x))
175 return 1;
177 /* FALLTHROUGH */
179 default:
180 break;
183 fmt = GET_RTX_FORMAT (code);
184 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
185 if (fmt[i] == 'e')
187 if (rtx_varies_p (XEXP (x, i), for_alias))
188 return 1;
190 else if (fmt[i] == 'E')
192 int j;
193 for (j = 0; j < XVECLEN (x, i); j++)
194 if (rtx_varies_p (XVECEXP (x, i, j), for_alias))
195 return 1;
198 return 0;
201 /* Return 0 if the use of X as an address in a MEM can cause a trap. */
204 rtx_addr_can_trap_p (x)
205 register rtx x;
207 register enum rtx_code code = GET_CODE (x);
209 switch (code)
211 case SYMBOL_REF:
212 return SYMBOL_REF_WEAK (x);
214 case LABEL_REF:
215 return 0;
217 case REG:
218 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
219 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
220 || x == stack_pointer_rtx
221 /* The arg pointer varies if it is not a fixed register. */
222 || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
223 return 0;
224 /* All of the virtual frame registers are stack references. */
225 if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
226 && REGNO (x) <= LAST_VIRTUAL_REGISTER)
227 return 0;
228 return 1;
230 case CONST:
231 return rtx_addr_can_trap_p (XEXP (x, 0));
233 case PLUS:
234 /* An address is assumed not to trap if it is an address that can't
235 trap plus a constant integer or it is the pic register plus a
236 constant. */
237 return ! ((! rtx_addr_can_trap_p (XEXP (x, 0))
238 && GET_CODE (XEXP (x, 1)) == CONST_INT)
239 || (XEXP (x, 0) == pic_offset_table_rtx
240 && CONSTANT_P (XEXP (x, 1))));
242 case LO_SUM:
243 case PRE_MODIFY:
244 return rtx_addr_can_trap_p (XEXP (x, 1));
246 case PRE_DEC:
247 case PRE_INC:
248 case POST_DEC:
249 case POST_INC:
250 case POST_MODIFY:
251 return rtx_addr_can_trap_p (XEXP (x, 0));
253 default:
254 break;
257 /* If it isn't one of the case above, it can cause a trap. */
258 return 1;
261 /* Return 1 if X refers to a memory location whose address
262 cannot be compared reliably with constant addresses,
263 or if X refers to a BLKmode memory object.
264 FOR_ALIAS is nonzero if we are called from alias analysis; if it is
265 zero, we are slightly more conservative. */
268 rtx_addr_varies_p (x, for_alias)
269 rtx x;
270 int for_alias;
272 register enum rtx_code code;
273 register int i;
274 register const char *fmt;
276 if (x == 0)
277 return 0;
279 code = GET_CODE (x);
280 if (code == MEM)
281 return GET_MODE (x) == BLKmode || rtx_varies_p (XEXP (x, 0), for_alias);
283 fmt = GET_RTX_FORMAT (code);
284 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
285 if (fmt[i] == 'e')
287 if (rtx_addr_varies_p (XEXP (x, i), for_alias))
288 return 1;
290 else if (fmt[i] == 'E')
292 int j;
293 for (j = 0; j < XVECLEN (x, i); j++)
294 if (rtx_addr_varies_p (XVECEXP (x, i, j), for_alias))
295 return 1;
297 return 0;
300 /* Return the value of the integer term in X, if one is apparent;
301 otherwise return 0.
302 Only obvious integer terms are detected.
303 This is used in cse.c with the `related_value' field.*/
305 HOST_WIDE_INT
306 get_integer_term (x)
307 rtx x;
309 if (GET_CODE (x) == CONST)
310 x = XEXP (x, 0);
312 if (GET_CODE (x) == MINUS
313 && GET_CODE (XEXP (x, 1)) == CONST_INT)
314 return - INTVAL (XEXP (x, 1));
315 if (GET_CODE (x) == PLUS
316 && GET_CODE (XEXP (x, 1)) == CONST_INT)
317 return INTVAL (XEXP (x, 1));
318 return 0;
321 /* If X is a constant, return the value sans apparent integer term;
322 otherwise return 0.
323 Only obvious integer terms are detected. */
326 get_related_value (x)
327 rtx x;
329 if (GET_CODE (x) != CONST)
330 return 0;
331 x = XEXP (x, 0);
332 if (GET_CODE (x) == PLUS
333 && GET_CODE (XEXP (x, 1)) == CONST_INT)
334 return XEXP (x, 0);
335 else if (GET_CODE (x) == MINUS
336 && GET_CODE (XEXP (x, 1)) == CONST_INT)
337 return XEXP (x, 0);
338 return 0;
341 /* Return the number of places FIND appears within X. If COUNT_DEST is
342 zero, we do not count occurrences inside the destination of a SET. */
345 count_occurrences (x, find, count_dest)
346 rtx x, find;
347 int count_dest;
349 int i, j;
350 enum rtx_code code;
351 const char *format_ptr;
352 int count;
354 if (x == find)
355 return 1;
357 code = GET_CODE (x);
359 switch (code)
361 case REG:
362 case CONST_INT:
363 case CONST_DOUBLE:
364 case SYMBOL_REF:
365 case CODE_LABEL:
366 case PC:
367 case CC0:
368 return 0;
370 case MEM:
371 if (GET_CODE (find) == MEM && rtx_equal_p (x, find))
372 return 1;
373 break;
375 case SET:
376 if (SET_DEST (x) == find && ! count_dest)
377 return count_occurrences (SET_SRC (x), find, count_dest);
378 break;
380 default:
381 break;
384 format_ptr = GET_RTX_FORMAT (code);
385 count = 0;
387 for (i = 0; i < GET_RTX_LENGTH (code); i++)
389 switch (*format_ptr++)
391 case 'e':
392 count += count_occurrences (XEXP (x, i), find, count_dest);
393 break;
395 case 'E':
396 for (j = 0; j < XVECLEN (x, i); j++)
397 count += count_occurrences (XVECEXP (x, i, j), find, count_dest);
398 break;
401 return count;
404 /* Nonzero if register REG appears somewhere within IN.
405 Also works if REG is not a register; in this case it checks
406 for a subexpression of IN that is Lisp "equal" to REG. */
409 reg_mentioned_p (reg, in)
410 register rtx reg, in;
412 register const char *fmt;
413 register int i;
414 register enum rtx_code code;
416 if (in == 0)
417 return 0;
419 if (reg == in)
420 return 1;
422 if (GET_CODE (in) == LABEL_REF)
423 return reg == XEXP (in, 0);
425 code = GET_CODE (in);
427 switch (code)
429 /* Compare registers by number. */
430 case REG:
431 return GET_CODE (reg) == REG && REGNO (in) == REGNO (reg);
433 /* These codes have no constituent expressions
434 and are unique. */
435 case SCRATCH:
436 case CC0:
437 case PC:
438 return 0;
440 case CONST_INT:
441 return GET_CODE (reg) == CONST_INT && INTVAL (in) == INTVAL (reg);
443 case CONST_DOUBLE:
444 /* These are kept unique for a given value. */
445 return 0;
447 default:
448 break;
451 if (GET_CODE (reg) == code && rtx_equal_p (reg, in))
452 return 1;
454 fmt = GET_RTX_FORMAT (code);
456 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
458 if (fmt[i] == 'E')
460 register int j;
461 for (j = XVECLEN (in, i) - 1; j >= 0; j--)
462 if (reg_mentioned_p (reg, XVECEXP (in, i, j)))
463 return 1;
465 else if (fmt[i] == 'e'
466 && reg_mentioned_p (reg, XEXP (in, i)))
467 return 1;
469 return 0;
472 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
473 no CODE_LABEL insn. */
476 no_labels_between_p (beg, end)
477 rtx beg, end;
479 register rtx p;
480 if (beg == end)
481 return 0;
482 for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
483 if (GET_CODE (p) == CODE_LABEL)
484 return 0;
485 return 1;
488 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
489 no JUMP_INSN insn. */
492 no_jumps_between_p (beg, end)
493 rtx beg, end;
495 register rtx p;
496 for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
497 if (GET_CODE (p) == JUMP_INSN)
498 return 0;
499 return 1;
502 /* Nonzero if register REG is used in an insn between
503 FROM_INSN and TO_INSN (exclusive of those two). */
506 reg_used_between_p (reg, from_insn, to_insn)
507 rtx reg, from_insn, to_insn;
509 register rtx insn;
511 if (from_insn == to_insn)
512 return 0;
514 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
515 if (INSN_P (insn)
516 && (reg_overlap_mentioned_p (reg, PATTERN (insn))
517 || (GET_CODE (insn) == CALL_INSN
518 && (find_reg_fusage (insn, USE, reg)
519 || find_reg_fusage (insn, CLOBBER, reg)))))
520 return 1;
521 return 0;
524 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
525 is entirely replaced by a new value and the only use is as a SET_DEST,
526 we do not consider it a reference. */
529 reg_referenced_p (x, body)
530 rtx x;
531 rtx body;
533 int i;
535 switch (GET_CODE (body))
537 case SET:
538 if (reg_overlap_mentioned_p (x, SET_SRC (body)))
539 return 1;
541 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
542 of a REG that occupies all of the REG, the insn references X if
543 it is mentioned in the destination. */
544 if (GET_CODE (SET_DEST (body)) != CC0
545 && GET_CODE (SET_DEST (body)) != PC
546 && GET_CODE (SET_DEST (body)) != REG
547 && ! (GET_CODE (SET_DEST (body)) == SUBREG
548 && GET_CODE (SUBREG_REG (SET_DEST (body))) == REG
549 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body))))
550 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
551 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body)))
552 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
553 && reg_overlap_mentioned_p (x, SET_DEST (body)))
554 return 1;
555 return 0;
557 case ASM_OPERANDS:
558 for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
559 if (reg_overlap_mentioned_p (x, ASM_OPERANDS_INPUT (body, i)))
560 return 1;
561 return 0;
563 case CALL:
564 case USE:
565 case IF_THEN_ELSE:
566 return reg_overlap_mentioned_p (x, body);
568 case TRAP_IF:
569 return reg_overlap_mentioned_p (x, TRAP_CONDITION (body));
571 case UNSPEC:
572 case UNSPEC_VOLATILE:
573 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
574 if (reg_overlap_mentioned_p (x, XVECEXP (body, 0, i)))
575 return 1;
576 return 0;
578 case PARALLEL:
579 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
580 if (reg_referenced_p (x, XVECEXP (body, 0, i)))
581 return 1;
582 return 0;
584 case CLOBBER:
585 if (GET_CODE (XEXP (body, 0)) == MEM)
586 if (reg_overlap_mentioned_p (x, XEXP (XEXP (body, 0), 0)))
587 return 1;
588 return 0;
590 case COND_EXEC:
591 if (reg_overlap_mentioned_p (x, COND_EXEC_TEST (body)))
592 return 1;
593 return reg_referenced_p (x, COND_EXEC_CODE (body));
595 default:
596 return 0;
600 /* Nonzero if register REG is referenced in an insn between
601 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
602 not count. */
605 reg_referenced_between_p (reg, from_insn, to_insn)
606 rtx reg, from_insn, to_insn;
608 register rtx insn;
610 if (from_insn == to_insn)
611 return 0;
613 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
614 if (INSN_P (insn)
615 && (reg_referenced_p (reg, PATTERN (insn))
616 || (GET_CODE (insn) == CALL_INSN
617 && find_reg_fusage (insn, USE, reg))))
618 return 1;
619 return 0;
622 /* Nonzero if register REG is set or clobbered in an insn between
623 FROM_INSN and TO_INSN (exclusive of those two). */
626 reg_set_between_p (reg, from_insn, to_insn)
627 rtx reg, from_insn, to_insn;
629 register rtx insn;
631 if (from_insn == to_insn)
632 return 0;
634 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
635 if (INSN_P (insn) && reg_set_p (reg, insn))
636 return 1;
637 return 0;
640 /* Internals of reg_set_between_p. */
642 reg_set_p (reg, insn)
643 rtx reg, insn;
645 rtx body = insn;
647 /* We can be passed an insn or part of one. If we are passed an insn,
648 check if a side-effect of the insn clobbers REG. */
649 if (INSN_P (insn))
651 if (FIND_REG_INC_NOTE (insn, reg)
652 || (GET_CODE (insn) == CALL_INSN
653 /* We'd like to test call_used_regs here, but rtlanal.c can't
654 reference that variable due to its use in genattrtab. So
655 we'll just be more conservative.
657 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
658 information holds all clobbered registers. */
659 && ((GET_CODE (reg) == REG
660 && REGNO (reg) < FIRST_PSEUDO_REGISTER)
661 || GET_CODE (reg) == MEM
662 || find_reg_fusage (insn, CLOBBER, reg))))
663 return 1;
665 body = PATTERN (insn);
668 return set_of (reg, insn) != NULL_RTX;
671 /* Similar to reg_set_between_p, but check all registers in X. Return 0
672 only if none of them are modified between START and END. Do not
673 consider non-registers one way or the other. */
676 regs_set_between_p (x, start, end)
677 rtx x;
678 rtx start, end;
680 enum rtx_code code = GET_CODE (x);
681 const char *fmt;
682 int i, j;
684 switch (code)
686 case CONST_INT:
687 case CONST_DOUBLE:
688 case CONST:
689 case SYMBOL_REF:
690 case LABEL_REF:
691 case PC:
692 case CC0:
693 return 0;
695 case REG:
696 return reg_set_between_p (x, start, end);
698 default:
699 break;
702 fmt = GET_RTX_FORMAT (code);
703 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
705 if (fmt[i] == 'e' && regs_set_between_p (XEXP (x, i), start, end))
706 return 1;
708 else if (fmt[i] == 'E')
709 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
710 if (regs_set_between_p (XVECEXP (x, i, j), start, end))
711 return 1;
714 return 0;
717 /* Similar to reg_set_between_p, but check all registers in X. Return 0
718 only if none of them are modified between START and END. Return 1 if
719 X contains a MEM; this routine does not perform any memory aliasing. */
722 modified_between_p (x, start, end)
723 rtx x;
724 rtx start, end;
726 enum rtx_code code = GET_CODE (x);
727 const char *fmt;
728 int i, j;
730 switch (code)
732 case CONST_INT:
733 case CONST_DOUBLE:
734 case CONST:
735 case SYMBOL_REF:
736 case LABEL_REF:
737 return 0;
739 case PC:
740 case CC0:
741 return 1;
743 case MEM:
744 /* If the memory is not constant, assume it is modified. If it is
745 constant, we still have to check the address. */
746 if (! RTX_UNCHANGING_P (x))
747 return 1;
748 break;
750 case REG:
751 return reg_set_between_p (x, start, end);
753 default:
754 break;
757 fmt = GET_RTX_FORMAT (code);
758 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
760 if (fmt[i] == 'e' && modified_between_p (XEXP (x, i), start, end))
761 return 1;
763 else if (fmt[i] == 'E')
764 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
765 if (modified_between_p (XVECEXP (x, i, j), start, end))
766 return 1;
769 return 0;
772 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
773 of them are modified in INSN. Return 1 if X contains a MEM; this routine
774 does not perform any memory aliasing. */
777 modified_in_p (x, insn)
778 rtx x;
779 rtx insn;
781 enum rtx_code code = GET_CODE (x);
782 const char *fmt;
783 int i, j;
785 switch (code)
787 case CONST_INT:
788 case CONST_DOUBLE:
789 case CONST:
790 case SYMBOL_REF:
791 case LABEL_REF:
792 return 0;
794 case PC:
795 case CC0:
796 return 1;
798 case MEM:
799 /* If the memory is not constant, assume it is modified. If it is
800 constant, we still have to check the address. */
801 if (! RTX_UNCHANGING_P (x))
802 return 1;
803 break;
805 case REG:
806 return reg_set_p (x, insn);
808 default:
809 break;
812 fmt = GET_RTX_FORMAT (code);
813 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
815 if (fmt[i] == 'e' && modified_in_p (XEXP (x, i), insn))
816 return 1;
818 else if (fmt[i] == 'E')
819 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
820 if (modified_in_p (XVECEXP (x, i, j), insn))
821 return 1;
824 return 0;
827 /* Return true if anything in insn X is (anti,output,true) dependent on
828 anything in insn Y. */
831 insn_dependent_p (x, y)
832 rtx x, y;
834 rtx tmp;
836 if (! INSN_P (x) || ! INSN_P (y))
837 abort ();
839 tmp = PATTERN (y);
840 note_stores (PATTERN (x), insn_dependent_p_1, &tmp);
841 if (tmp == NULL_RTX)
842 return 1;
844 tmp = PATTERN (x);
845 note_stores (PATTERN (y), insn_dependent_p_1, &tmp);
846 if (tmp == NULL_RTX)
847 return 1;
849 return 0;
852 /* A helper routine for insn_dependent_p called through note_stores. */
854 static void
855 insn_dependent_p_1 (x, pat, data)
856 rtx x;
857 rtx pat ATTRIBUTE_UNUSED;
858 void *data;
860 rtx * pinsn = (rtx *) data;
862 if (*pinsn && reg_mentioned_p (x, *pinsn))
863 *pinsn = NULL_RTX;
866 /* Helper function for set_of. */
867 struct set_of_data
869 rtx found;
870 rtx pat;
873 static void
874 set_of_1 (x, pat, data1)
875 rtx x;
876 rtx pat;
877 void *data1;
879 struct set_of_data *data = (struct set_of_data *) (data1);
880 if (rtx_equal_p (x, data->pat)
881 || (GET_CODE (x) != MEM && reg_overlap_mentioned_p (data->pat, x)))
882 data->found = pat;
885 /* Give an INSN, return a SET or CLOBBER expression that does modify PAT
886 (eighter directly or via STRICT_LOW_PART and similar modifiers). */
888 set_of (pat, insn)
889 rtx pat, insn;
891 struct set_of_data data;
892 data.found = NULL_RTX;
893 data.pat = pat;
894 note_stores (INSN_P (insn) ? PATTERN (insn) : insn, set_of_1, &data);
895 return data.found;
898 /* Given an INSN, return a SET expression if this insn has only a single SET.
899 It may also have CLOBBERs, USEs, or SET whose output
900 will not be used, which we ignore. */
903 single_set_2 (insn, pat)
904 rtx insn, pat;
906 rtx set = NULL;
907 int set_verified = 1;
908 int i;
910 if (GET_CODE (pat) == PARALLEL)
912 for (i = 0; i < XVECLEN (pat, 0); i++)
914 rtx sub = XVECEXP (pat, 0, i);
915 switch (GET_CODE (sub))
917 case USE:
918 case CLOBBER:
919 break;
921 case SET:
922 /* We can consider insns having multiple sets, where all
923 but one are dead as single set insns. In common case
924 only single set is present in the pattern so we want
925 to avoid checking for REG_UNUSED notes unless neccesary.
927 When we reach set first time, we just expect this is
928 the single set we are looking for and only when more
929 sets are found in the insn, we check them. */
930 if (!set_verified)
932 if (find_reg_note (insn, REG_UNUSED, SET_DEST (set))
933 && !side_effects_p (set))
934 set = NULL;
935 else
936 set_verified = 1;
938 if (!set)
939 set = sub, set_verified = 0;
940 else if (!find_reg_note (insn, REG_UNUSED, SET_DEST (sub))
941 || side_effects_p (sub))
942 return NULL_RTX;
943 break;
945 default:
946 return NULL_RTX;
950 return set;
953 /* Given an INSN, return nonzero if it has more than one SET, else return
954 zero. */
957 multiple_sets (insn)
958 rtx insn;
960 int found;
961 int i;
963 /* INSN must be an insn. */
964 if (! INSN_P (insn))
965 return 0;
967 /* Only a PARALLEL can have multiple SETs. */
968 if (GET_CODE (PATTERN (insn)) == PARALLEL)
970 for (i = 0, found = 0; i < XVECLEN (PATTERN (insn), 0); i++)
971 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
973 /* If we have already found a SET, then return now. */
974 if (found)
975 return 1;
976 else
977 found = 1;
981 /* Either zero or one SET. */
982 return 0;
985 /* Return nonzero if the destination of SET equals the source
986 and there are no side effects. */
989 set_noop_p (set)
990 rtx set;
992 rtx src = SET_SRC (set);
993 rtx dst = SET_DEST (set);
995 if (side_effects_p (src) || side_effects_p (dst))
996 return 0;
998 if (GET_CODE (dst) == MEM && GET_CODE (src) == MEM)
999 return rtx_equal_p (dst, src);
1001 if (dst == pc_rtx && src == pc_rtx)
1002 return 1;
1004 if (GET_CODE (dst) == SIGN_EXTRACT
1005 || GET_CODE (dst) == ZERO_EXTRACT)
1006 return rtx_equal_p (XEXP (dst, 0), src)
1007 && ! BYTES_BIG_ENDIAN && XEXP (dst, 2) == const0_rtx;
1009 if (GET_CODE (dst) == STRICT_LOW_PART)
1010 dst = XEXP (dst, 0);
1012 if (GET_CODE (src) == SUBREG && GET_CODE (dst) == SUBREG)
1014 if (SUBREG_BYTE (src) != SUBREG_BYTE (dst))
1015 return 0;
1016 src = SUBREG_REG (src);
1017 dst = SUBREG_REG (dst);
1020 return (GET_CODE (src) == REG && GET_CODE (dst) == REG
1021 && REGNO (src) == REGNO (dst));
1024 /* Return nonzero if an insn consists only of SETs, each of which only sets a
1025 value to itself. */
1028 noop_move_p (insn)
1029 rtx insn;
1031 rtx pat = PATTERN (insn);
1033 if (INSN_CODE (insn) == NOOP_MOVE_INSN_CODE)
1034 return 1;
1036 /* Insns carrying these notes are useful later on. */
1037 if (find_reg_note (insn, REG_EQUAL, NULL_RTX))
1038 return 0;
1040 if (GET_CODE (pat) == SET && set_noop_p (pat))
1041 return 1;
1043 if (GET_CODE (pat) == PARALLEL)
1045 int i;
1046 /* If nothing but SETs of registers to themselves,
1047 this insn can also be deleted. */
1048 for (i = 0; i < XVECLEN (pat, 0); i++)
1050 rtx tem = XVECEXP (pat, 0, i);
1052 if (GET_CODE (tem) == USE
1053 || GET_CODE (tem) == CLOBBER)
1054 continue;
1056 if (GET_CODE (tem) != SET || ! set_noop_p (tem))
1057 return 0;
1060 return 1;
1062 return 0;
1066 /* Return the last thing that X was assigned from before *PINSN. If VALID_TO
1067 is not NULL_RTX then verify that the object is not modified up to VALID_TO.
1068 If the object was modified, if we hit a partial assignment to X, or hit a
1069 CODE_LABEL first, return X. If we found an assignment, update *PINSN to
1070 point to it. ALLOW_HWREG is set to 1 if hardware registers are allowed to
1071 be the src. */
1074 find_last_value (x, pinsn, valid_to, allow_hwreg)
1075 rtx x;
1076 rtx *pinsn;
1077 rtx valid_to;
1078 int allow_hwreg;
1080 rtx p;
1082 for (p = PREV_INSN (*pinsn); p && GET_CODE (p) != CODE_LABEL;
1083 p = PREV_INSN (p))
1084 if (INSN_P (p))
1086 rtx set = single_set (p);
1087 rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
1089 if (set && rtx_equal_p (x, SET_DEST (set)))
1091 rtx src = SET_SRC (set);
1093 if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
1094 src = XEXP (note, 0);
1096 if ((valid_to == NULL_RTX
1097 || ! modified_between_p (src, PREV_INSN (p), valid_to))
1098 /* Reject hard registers because we don't usually want
1099 to use them; we'd rather use a pseudo. */
1100 && (! (GET_CODE (src) == REG
1101 && REGNO (src) < FIRST_PSEUDO_REGISTER) || allow_hwreg))
1103 *pinsn = p;
1104 return src;
1108 /* If set in non-simple way, we don't have a value. */
1109 if (reg_set_p (x, p))
1110 break;
1113 return x;
1116 /* Return nonzero if register in range [REGNO, ENDREGNO)
1117 appears either explicitly or implicitly in X
1118 other than being stored into.
1120 References contained within the substructure at LOC do not count.
1121 LOC may be zero, meaning don't ignore anything. */
1124 refers_to_regno_p (regno, endregno, x, loc)
1125 unsigned int regno, endregno;
1126 rtx x;
1127 rtx *loc;
1129 int i;
1130 unsigned int x_regno;
1131 RTX_CODE code;
1132 const char *fmt;
1134 repeat:
1135 /* The contents of a REG_NONNEG note is always zero, so we must come here
1136 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
1137 if (x == 0)
1138 return 0;
1140 code = GET_CODE (x);
1142 switch (code)
1144 case REG:
1145 x_regno = REGNO (x);
1147 /* If we modifying the stack, frame, or argument pointer, it will
1148 clobber a virtual register. In fact, we could be more precise,
1149 but it isn't worth it. */
1150 if ((x_regno == STACK_POINTER_REGNUM
1151 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1152 || x_regno == ARG_POINTER_REGNUM
1153 #endif
1154 || x_regno == FRAME_POINTER_REGNUM)
1155 && regno >= FIRST_VIRTUAL_REGISTER && regno <= LAST_VIRTUAL_REGISTER)
1156 return 1;
1158 return (endregno > x_regno
1159 && regno < x_regno + (x_regno < FIRST_PSEUDO_REGISTER
1160 ? HARD_REGNO_NREGS (x_regno, GET_MODE (x))
1161 : 1));
1163 case SUBREG:
1164 /* If this is a SUBREG of a hard reg, we can see exactly which
1165 registers are being modified. Otherwise, handle normally. */
1166 if (GET_CODE (SUBREG_REG (x)) == REG
1167 && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
1169 unsigned int inner_regno = subreg_regno (x);
1170 unsigned int inner_endregno
1171 = inner_regno + (inner_regno < FIRST_PSEUDO_REGISTER
1172 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
1174 return endregno > inner_regno && regno < inner_endregno;
1176 break;
1178 case CLOBBER:
1179 case SET:
1180 if (&SET_DEST (x) != loc
1181 /* Note setting a SUBREG counts as referring to the REG it is in for
1182 a pseudo but not for hard registers since we can
1183 treat each word individually. */
1184 && ((GET_CODE (SET_DEST (x)) == SUBREG
1185 && loc != &SUBREG_REG (SET_DEST (x))
1186 && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG
1187 && REGNO (SUBREG_REG (SET_DEST (x))) >= FIRST_PSEUDO_REGISTER
1188 && refers_to_regno_p (regno, endregno,
1189 SUBREG_REG (SET_DEST (x)), loc))
1190 || (GET_CODE (SET_DEST (x)) != REG
1191 && refers_to_regno_p (regno, endregno, SET_DEST (x), loc))))
1192 return 1;
1194 if (code == CLOBBER || loc == &SET_SRC (x))
1195 return 0;
1196 x = SET_SRC (x);
1197 goto repeat;
1199 default:
1200 break;
1203 /* X does not match, so try its subexpressions. */
1205 fmt = GET_RTX_FORMAT (code);
1206 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1208 if (fmt[i] == 'e' && loc != &XEXP (x, i))
1210 if (i == 0)
1212 x = XEXP (x, 0);
1213 goto repeat;
1215 else
1216 if (refers_to_regno_p (regno, endregno, XEXP (x, i), loc))
1217 return 1;
1219 else if (fmt[i] == 'E')
1221 register int j;
1222 for (j = XVECLEN (x, i) - 1; j >=0; j--)
1223 if (loc != &XVECEXP (x, i, j)
1224 && refers_to_regno_p (regno, endregno, XVECEXP (x, i, j), loc))
1225 return 1;
1228 return 0;
1231 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
1232 we check if any register number in X conflicts with the relevant register
1233 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
1234 contains a MEM (we don't bother checking for memory addresses that can't
1235 conflict because we expect this to be a rare case. */
1238 reg_overlap_mentioned_p (x, in)
1239 rtx x, in;
1241 unsigned int regno, endregno;
1243 /* Overly conservative. */
1244 if (GET_CODE (x) == STRICT_LOW_PART)
1245 x = XEXP (x, 0);
1247 /* If either argument is a constant, then modifying X can not affect IN. */
1248 if (CONSTANT_P (x) || CONSTANT_P (in))
1249 return 0;
1251 switch (GET_CODE (x))
1253 case SUBREG:
1254 regno = REGNO (SUBREG_REG (x));
1255 if (regno < FIRST_PSEUDO_REGISTER)
1256 regno = subreg_regno (x);
1257 goto do_reg;
1259 case REG:
1260 regno = REGNO (x);
1261 do_reg:
1262 endregno = regno + (regno < FIRST_PSEUDO_REGISTER
1263 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
1264 return refers_to_regno_p (regno, endregno, in, (rtx*)0);
1266 case MEM:
1268 const char *fmt;
1269 int i;
1271 if (GET_CODE (in) == MEM)
1272 return 1;
1274 fmt = GET_RTX_FORMAT (GET_CODE (in));
1275 for (i = GET_RTX_LENGTH (GET_CODE (in)) - 1; i >= 0; i--)
1276 if (fmt[i] == 'e' && reg_overlap_mentioned_p (x, XEXP (in, i)))
1277 return 1;
1279 return 0;
1282 case SCRATCH:
1283 case PC:
1284 case CC0:
1285 return reg_mentioned_p (x, in);
1287 case PARALLEL:
1289 int i;
1291 /* If any register in here refers to it we return true. */
1292 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
1293 if (XEXP (XVECEXP (x, 0, i), 0) != 0
1294 && reg_overlap_mentioned_p (XEXP (XVECEXP (x, 0, i), 0), in))
1295 return 1;
1296 return 0;
1299 default:
1300 break;
1303 abort ();
1306 /* Return the last value to which REG was set prior to INSN. If we can't
1307 find it easily, return 0.
1309 We only return a REG, SUBREG, or constant because it is too hard to
1310 check if a MEM remains unchanged. */
1313 reg_set_last (x, insn)
1314 rtx x;
1315 rtx insn;
1317 rtx orig_insn = insn;
1319 /* Scan backwards until reg_set_last_1 changed one of the above flags.
1320 Stop when we reach a label or X is a hard reg and we reach a
1321 CALL_INSN (if reg_set_last_last_regno is a hard reg).
1323 If we find a set of X, ensure that its SET_SRC remains unchanged. */
1325 /* We compare with <= here, because reg_set_last_last_regno
1326 is actually the number of the first reg *not* in X. */
1327 for (;
1328 insn && GET_CODE (insn) != CODE_LABEL
1329 && ! (GET_CODE (insn) == CALL_INSN
1330 && REGNO (x) <= FIRST_PSEUDO_REGISTER);
1331 insn = PREV_INSN (insn))
1332 if (INSN_P (insn))
1334 rtx set = set_of (x, insn);
1335 /* OK, this function modify our register. See if we understand it. */
1336 if (set)
1338 rtx last_value;
1339 if (GET_CODE (set) != SET || SET_DEST (set) != x)
1340 return 0;
1341 last_value = SET_SRC (x);
1342 if (CONSTANT_P (last_value)
1343 || ((GET_CODE (last_value) == REG
1344 || GET_CODE (last_value) == SUBREG)
1345 && ! reg_set_between_p (last_value,
1346 insn, orig_insn)))
1347 return last_value;
1348 else
1349 return 0;
1353 return 0;
1356 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1357 (X would be the pattern of an insn).
1358 FUN receives two arguments:
1359 the REG, MEM, CC0 or PC being stored in or clobbered,
1360 the SET or CLOBBER rtx that does the store.
1362 If the item being stored in or clobbered is a SUBREG of a hard register,
1363 the SUBREG will be passed. */
1365 void
1366 note_stores (x, fun, data)
1367 register rtx x;
1368 void (*fun) PARAMS ((rtx, rtx, void *));
1369 void *data;
1371 int i;
1373 if (GET_CODE (x) == COND_EXEC)
1374 x = COND_EXEC_CODE (x);
1376 if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
1378 register rtx dest = SET_DEST (x);
1380 while ((GET_CODE (dest) == SUBREG
1381 && (GET_CODE (SUBREG_REG (dest)) != REG
1382 || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER))
1383 || GET_CODE (dest) == ZERO_EXTRACT
1384 || GET_CODE (dest) == SIGN_EXTRACT
1385 || GET_CODE (dest) == STRICT_LOW_PART)
1386 dest = XEXP (dest, 0);
1388 /* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions,
1389 each of whose first operand is a register. We can't know what
1390 precisely is being set in these cases, so make up a CLOBBER to pass
1391 to the function. */
1392 if (GET_CODE (dest) == PARALLEL)
1394 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
1395 if (XEXP (XVECEXP (dest, 0, i), 0) != 0)
1396 (*fun) (XEXP (XVECEXP (dest, 0, i), 0),
1397 gen_rtx_CLOBBER (VOIDmode,
1398 XEXP (XVECEXP (dest, 0, i), 0)),
1399 data);
1401 else
1402 (*fun) (dest, x, data);
1405 else if (GET_CODE (x) == PARALLEL)
1406 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
1407 note_stores (XVECEXP (x, 0, i), fun, data);
1410 /* Like notes_stores, but call FUN for each expression that is being
1411 referenced in PBODY, a pointer to the PATTERN of an insn. We only call
1412 FUN for each expression, not any interior subexpressions. FUN receives a
1413 pointer to the expression and the DATA passed to this function.
1415 Note that this is not quite the same test as that done in reg_referenced_p
1416 since that considers something as being referenced if it is being
1417 partially set, while we do not. */
1419 void
1420 note_uses (pbody, fun, data)
1421 rtx *pbody;
1422 void (*fun) PARAMS ((rtx *, void *));
1423 void *data;
1425 rtx body = *pbody;
1426 int i;
1428 switch (GET_CODE (body))
1430 case COND_EXEC:
1431 (*fun) (&COND_EXEC_TEST (body), data);
1432 note_uses (&COND_EXEC_CODE (body), fun, data);
1433 return;
1435 case PARALLEL:
1436 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
1437 note_uses (&XVECEXP (body, 0, i), fun, data);
1438 return;
1440 case USE:
1441 (*fun) (&XEXP (body, 0), data);
1442 return;
1444 case ASM_OPERANDS:
1445 for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
1446 (*fun) (&ASM_OPERANDS_INPUT (body, i), data);
1447 return;
1449 case TRAP_IF:
1450 (*fun) (&TRAP_CONDITION (body), data);
1451 return;
1453 case UNSPEC:
1454 case UNSPEC_VOLATILE:
1455 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
1456 (*fun) (&XVECEXP (body, 0, i), data);
1457 return;
1459 case CLOBBER:
1460 if (GET_CODE (XEXP (body, 0)) == MEM)
1461 (*fun) (&XEXP (XEXP (body, 0), 0), data);
1462 return;
1464 case SET:
1466 rtx dest = SET_DEST (body);
1468 /* For sets we replace everything in source plus registers in memory
1469 expression in store and operands of a ZERO_EXTRACT. */
1470 (*fun) (&SET_SRC (body), data);
1472 if (GET_CODE (dest) == ZERO_EXTRACT)
1474 (*fun) (&XEXP (dest, 1), data);
1475 (*fun) (&XEXP (dest, 2), data);
1478 while (GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART)
1479 dest = XEXP (dest, 0);
1481 if (GET_CODE (dest) == MEM)
1482 (*fun) (&XEXP (dest, 0), data);
1484 return;
1486 default:
1487 /* All the other possibilities never store. */
1488 (*fun) (pbody, data);
1489 return;
1493 /* Return nonzero if X's old contents don't survive after INSN.
1494 This will be true if X is (cc0) or if X is a register and
1495 X dies in INSN or because INSN entirely sets X.
1497 "Entirely set" means set directly and not through a SUBREG,
1498 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1499 Likewise, REG_INC does not count.
1501 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1502 but for this use that makes no difference, since regs don't overlap
1503 during their lifetimes. Therefore, this function may be used
1504 at any time after deaths have been computed (in flow.c).
1506 If REG is a hard reg that occupies multiple machine registers, this
1507 function will only return 1 if each of those registers will be replaced
1508 by INSN. */
1511 dead_or_set_p (insn, x)
1512 rtx insn;
1513 rtx x;
1515 unsigned int regno, last_regno;
1516 unsigned int i;
1518 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1519 if (GET_CODE (x) == CC0)
1520 return 1;
1522 if (GET_CODE (x) != REG)
1523 abort ();
1525 regno = REGNO (x);
1526 last_regno = (regno >= FIRST_PSEUDO_REGISTER ? regno
1527 : regno + HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1);
1529 for (i = regno; i <= last_regno; i++)
1530 if (! dead_or_set_regno_p (insn, i))
1531 return 0;
1533 return 1;
1536 /* Utility function for dead_or_set_p to check an individual register. Also
1537 called from flow.c. */
1540 dead_or_set_regno_p (insn, test_regno)
1541 rtx insn;
1542 unsigned int test_regno;
1544 unsigned int regno, endregno;
1545 rtx pattern;
1547 /* See if there is a death note for something that includes TEST_REGNO. */
1548 if (find_regno_note (insn, REG_DEAD, test_regno))
1549 return 1;
1551 if (GET_CODE (insn) == CALL_INSN
1552 && find_regno_fusage (insn, CLOBBER, test_regno))
1553 return 1;
1555 pattern = PATTERN (insn);
1557 if (GET_CODE (pattern) == COND_EXEC)
1558 pattern = COND_EXEC_CODE (pattern);
1560 if (GET_CODE (pattern) == SET)
1562 rtx dest = SET_DEST (PATTERN (insn));
1564 /* A value is totally replaced if it is the destination or the
1565 destination is a SUBREG of REGNO that does not change the number of
1566 words in it. */
1567 if (GET_CODE (dest) == SUBREG
1568 && (((GET_MODE_SIZE (GET_MODE (dest))
1569 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1570 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1571 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1572 dest = SUBREG_REG (dest);
1574 if (GET_CODE (dest) != REG)
1575 return 0;
1577 regno = REGNO (dest);
1578 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1579 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1581 return (test_regno >= regno && test_regno < endregno);
1583 else if (GET_CODE (pattern) == PARALLEL)
1585 register int i;
1587 for (i = XVECLEN (pattern, 0) - 1; i >= 0; i--)
1589 rtx body = XVECEXP (pattern, 0, i);
1591 if (GET_CODE (body) == COND_EXEC)
1592 body = COND_EXEC_CODE (body);
1594 if (GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1596 rtx dest = SET_DEST (body);
1598 if (GET_CODE (dest) == SUBREG
1599 && (((GET_MODE_SIZE (GET_MODE (dest))
1600 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1601 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1602 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1603 dest = SUBREG_REG (dest);
1605 if (GET_CODE (dest) != REG)
1606 continue;
1608 regno = REGNO (dest);
1609 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1610 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1612 if (test_regno >= regno && test_regno < endregno)
1613 return 1;
1618 return 0;
1621 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1622 If DATUM is nonzero, look for one whose datum is DATUM. */
1625 find_reg_note (insn, kind, datum)
1626 rtx insn;
1627 enum reg_note kind;
1628 rtx datum;
1630 register rtx link;
1632 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1633 if (! INSN_P (insn))
1634 return 0;
1636 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1637 if (REG_NOTE_KIND (link) == kind
1638 && (datum == 0 || datum == XEXP (link, 0)))
1639 return link;
1640 return 0;
1643 /* Return the reg-note of kind KIND in insn INSN which applies to register
1644 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1645 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1646 it might be the case that the note overlaps REGNO. */
1649 find_regno_note (insn, kind, regno)
1650 rtx insn;
1651 enum reg_note kind;
1652 unsigned int regno;
1654 register rtx link;
1656 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1657 if (! INSN_P (insn))
1658 return 0;
1660 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1661 if (REG_NOTE_KIND (link) == kind
1662 /* Verify that it is a register, so that scratch and MEM won't cause a
1663 problem here. */
1664 && GET_CODE (XEXP (link, 0)) == REG
1665 && REGNO (XEXP (link, 0)) <= regno
1666 && ((REGNO (XEXP (link, 0))
1667 + (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
1668 : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
1669 GET_MODE (XEXP (link, 0)))))
1670 > regno))
1671 return link;
1672 return 0;
1675 /* Return a REG_EQUIV or REG_EQUAL note if insn has only a single set and
1676 has such a note. */
1679 find_reg_equal_equiv_note (insn)
1680 rtx insn;
1682 rtx note;
1684 if (single_set (insn) == 0)
1685 return 0;
1686 else if ((note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
1687 return note;
1688 else
1689 return find_reg_note (insn, REG_EQUAL, NULL_RTX);
1692 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1693 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1696 find_reg_fusage (insn, code, datum)
1697 rtx insn;
1698 enum rtx_code code;
1699 rtx datum;
1701 /* If it's not a CALL_INSN, it can't possibly have a
1702 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1703 if (GET_CODE (insn) != CALL_INSN)
1704 return 0;
1706 if (! datum)
1707 abort();
1709 if (GET_CODE (datum) != REG)
1711 register rtx link;
1713 for (link = CALL_INSN_FUNCTION_USAGE (insn);
1714 link;
1715 link = XEXP (link, 1))
1716 if (GET_CODE (XEXP (link, 0)) == code
1717 && rtx_equal_p (datum, SET_DEST (XEXP (link, 0))))
1718 return 1;
1720 else
1722 unsigned int regno = REGNO (datum);
1724 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1725 to pseudo registers, so don't bother checking. */
1727 if (regno < FIRST_PSEUDO_REGISTER)
1729 unsigned int end_regno
1730 = regno + HARD_REGNO_NREGS (regno, GET_MODE (datum));
1731 unsigned int i;
1733 for (i = regno; i < end_regno; i++)
1734 if (find_regno_fusage (insn, code, i))
1735 return 1;
1739 return 0;
1742 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1743 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1746 find_regno_fusage (insn, code, regno)
1747 rtx insn;
1748 enum rtx_code code;
1749 unsigned int regno;
1751 register rtx link;
1753 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1754 to pseudo registers, so don't bother checking. */
1756 if (regno >= FIRST_PSEUDO_REGISTER
1757 || GET_CODE (insn) != CALL_INSN )
1758 return 0;
1760 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1762 unsigned int regnote;
1763 rtx op, reg;
1765 if (GET_CODE (op = XEXP (link, 0)) == code
1766 && GET_CODE (reg = XEXP (op, 0)) == REG
1767 && (regnote = REGNO (reg)) <= regno
1768 && regnote + HARD_REGNO_NREGS (regnote, GET_MODE (reg)) > regno)
1769 return 1;
1772 return 0;
1775 /* Remove register note NOTE from the REG_NOTES of INSN. */
1777 void
1778 remove_note (insn, note)
1779 register rtx insn;
1780 register rtx note;
1782 register rtx link;
1784 if (note == NULL_RTX)
1785 return;
1787 if (REG_NOTES (insn) == note)
1789 REG_NOTES (insn) = XEXP (note, 1);
1790 return;
1793 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1794 if (XEXP (link, 1) == note)
1796 XEXP (link, 1) = XEXP (note, 1);
1797 return;
1800 abort ();
1803 /* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
1804 remove that entry from the list if it is found.
1806 A simple equality test is used to determine if NODE matches. */
1808 void
1809 remove_node_from_expr_list (node, listp)
1810 rtx node;
1811 rtx *listp;
1813 rtx temp = *listp;
1814 rtx prev = NULL_RTX;
1816 while (temp)
1818 if (node == XEXP (temp, 0))
1820 /* Splice the node out of the list. */
1821 if (prev)
1822 XEXP (prev, 1) = XEXP (temp, 1);
1823 else
1824 *listp = XEXP (temp, 1);
1826 return;
1829 prev = temp;
1830 temp = XEXP (temp, 1);
1834 /* Nonzero if X contains any volatile instructions. These are instructions
1835 which may cause unpredictable machine state instructions, and thus no
1836 instructions should be moved or combined across them. This includes
1837 only volatile asms and UNSPEC_VOLATILE instructions. */
1840 volatile_insn_p (x)
1841 rtx x;
1843 register RTX_CODE code;
1845 code = GET_CODE (x);
1846 switch (code)
1848 case LABEL_REF:
1849 case SYMBOL_REF:
1850 case CONST_INT:
1851 case CONST:
1852 case CONST_DOUBLE:
1853 case CC0:
1854 case PC:
1855 case REG:
1856 case SCRATCH:
1857 case CLOBBER:
1858 case ASM_INPUT:
1859 case ADDR_VEC:
1860 case ADDR_DIFF_VEC:
1861 case CALL:
1862 case MEM:
1863 return 0;
1865 case UNSPEC_VOLATILE:
1866 /* case TRAP_IF: This isn't clear yet. */
1867 return 1;
1869 case ASM_OPERANDS:
1870 if (MEM_VOLATILE_P (x))
1871 return 1;
1873 default:
1874 break;
1877 /* Recursively scan the operands of this expression. */
1880 register const char *fmt = GET_RTX_FORMAT (code);
1881 register int i;
1883 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1885 if (fmt[i] == 'e')
1887 if (volatile_insn_p (XEXP (x, i)))
1888 return 1;
1890 else if (fmt[i] == 'E')
1892 register int j;
1893 for (j = 0; j < XVECLEN (x, i); j++)
1894 if (volatile_insn_p (XVECEXP (x, i, j)))
1895 return 1;
1899 return 0;
1902 /* Nonzero if X contains any volatile memory references
1903 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1906 volatile_refs_p (x)
1907 rtx x;
1909 register RTX_CODE code;
1911 code = GET_CODE (x);
1912 switch (code)
1914 case LABEL_REF:
1915 case SYMBOL_REF:
1916 case CONST_INT:
1917 case CONST:
1918 case CONST_DOUBLE:
1919 case CC0:
1920 case PC:
1921 case REG:
1922 case SCRATCH:
1923 case CLOBBER:
1924 case ASM_INPUT:
1925 case ADDR_VEC:
1926 case ADDR_DIFF_VEC:
1927 return 0;
1929 case CALL:
1930 case UNSPEC_VOLATILE:
1931 /* case TRAP_IF: This isn't clear yet. */
1932 return 1;
1934 case MEM:
1935 case ASM_OPERANDS:
1936 if (MEM_VOLATILE_P (x))
1937 return 1;
1939 default:
1940 break;
1943 /* Recursively scan the operands of this expression. */
1946 register const char *fmt = GET_RTX_FORMAT (code);
1947 register int i;
1949 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1951 if (fmt[i] == 'e')
1953 if (volatile_refs_p (XEXP (x, i)))
1954 return 1;
1956 else if (fmt[i] == 'E')
1958 register int j;
1959 for (j = 0; j < XVECLEN (x, i); j++)
1960 if (volatile_refs_p (XVECEXP (x, i, j)))
1961 return 1;
1965 return 0;
1968 /* Similar to above, except that it also rejects register pre- and post-
1969 incrementing. */
1972 side_effects_p (x)
1973 rtx x;
1975 register RTX_CODE code;
1977 code = GET_CODE (x);
1978 switch (code)
1980 case LABEL_REF:
1981 case SYMBOL_REF:
1982 case CONST_INT:
1983 case CONST:
1984 case CONST_DOUBLE:
1985 case CC0:
1986 case PC:
1987 case REG:
1988 case SCRATCH:
1989 case ASM_INPUT:
1990 case ADDR_VEC:
1991 case ADDR_DIFF_VEC:
1992 return 0;
1994 case CLOBBER:
1995 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1996 when some combination can't be done. If we see one, don't think
1997 that we can simplify the expression. */
1998 return (GET_MODE (x) != VOIDmode);
2000 case PRE_INC:
2001 case PRE_DEC:
2002 case POST_INC:
2003 case POST_DEC:
2004 case PRE_MODIFY:
2005 case POST_MODIFY:
2006 case CALL:
2007 case UNSPEC_VOLATILE:
2008 /* case TRAP_IF: This isn't clear yet. */
2009 return 1;
2011 case MEM:
2012 case ASM_OPERANDS:
2013 if (MEM_VOLATILE_P (x))
2014 return 1;
2016 default:
2017 break;
2020 /* Recursively scan the operands of this expression. */
2023 register const char *fmt = GET_RTX_FORMAT (code);
2024 register int i;
2026 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2028 if (fmt[i] == 'e')
2030 if (side_effects_p (XEXP (x, i)))
2031 return 1;
2033 else if (fmt[i] == 'E')
2035 register int j;
2036 for (j = 0; j < XVECLEN (x, i); j++)
2037 if (side_effects_p (XVECEXP (x, i, j)))
2038 return 1;
2042 return 0;
2045 /* Return nonzero if evaluating rtx X might cause a trap. */
2048 may_trap_p (x)
2049 rtx x;
2051 int i;
2052 enum rtx_code code;
2053 const char *fmt;
2055 if (x == 0)
2056 return 0;
2057 code = GET_CODE (x);
2058 switch (code)
2060 /* Handle these cases quickly. */
2061 case CONST_INT:
2062 case CONST_DOUBLE:
2063 case SYMBOL_REF:
2064 case LABEL_REF:
2065 case CONST:
2066 case PC:
2067 case CC0:
2068 case REG:
2069 case SCRATCH:
2070 return 0;
2072 case ASM_INPUT:
2073 case UNSPEC_VOLATILE:
2074 case TRAP_IF:
2075 return 1;
2077 case ASM_OPERANDS:
2078 return MEM_VOLATILE_P (x);
2080 /* Memory ref can trap unless it's a static var or a stack slot. */
2081 case MEM:
2082 return rtx_addr_can_trap_p (XEXP (x, 0));
2084 /* Division by a non-constant might trap. */
2085 case DIV:
2086 case MOD:
2087 case UDIV:
2088 case UMOD:
2089 if (! CONSTANT_P (XEXP (x, 1))
2090 || GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2091 return 1;
2092 /* This was const0_rtx, but by not using that,
2093 we can link this file into other programs. */
2094 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
2095 return 1;
2096 break;
2098 case EXPR_LIST:
2099 /* An EXPR_LIST is used to represent a function call. This
2100 certainly may trap. */
2101 return 1;
2103 case GE:
2104 case GT:
2105 case LE:
2106 case LT:
2107 case COMPARE:
2108 /* Some floating point comparisons may trap. */
2109 /* ??? There is no machine independent way to check for tests that trap
2110 when COMPARE is used, though many targets do make this distinction.
2111 For instance, sparc uses CCFPE for compares which generate exceptions
2112 and CCFP for compares which do not generate exceptions. */
2113 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2114 return 1;
2115 /* But often the compare has some CC mode, so check operand
2116 modes as well. */
2117 if (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_FLOAT
2118 || GET_MODE_CLASS (GET_MODE (XEXP (x, 1))) == MODE_FLOAT)
2119 return 1;
2120 break;
2122 case NEG:
2123 case ABS:
2124 /* These operations don't trap even with floating point. */
2125 break;
2127 default:
2128 /* Any floating arithmetic may trap. */
2129 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2130 return 1;
2133 fmt = GET_RTX_FORMAT (code);
2134 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2136 if (fmt[i] == 'e')
2138 if (may_trap_p (XEXP (x, i)))
2139 return 1;
2141 else if (fmt[i] == 'E')
2143 register int j;
2144 for (j = 0; j < XVECLEN (x, i); j++)
2145 if (may_trap_p (XVECEXP (x, i, j)))
2146 return 1;
2149 return 0;
2152 /* Return nonzero if X contains a comparison that is not either EQ or NE,
2153 i.e., an inequality. */
2156 inequality_comparisons_p (x)
2157 rtx x;
2159 register const char *fmt;
2160 register int len, i;
2161 register enum rtx_code code = GET_CODE (x);
2163 switch (code)
2165 case REG:
2166 case SCRATCH:
2167 case PC:
2168 case CC0:
2169 case CONST_INT:
2170 case CONST_DOUBLE:
2171 case CONST:
2172 case LABEL_REF:
2173 case SYMBOL_REF:
2174 return 0;
2176 case LT:
2177 case LTU:
2178 case GT:
2179 case GTU:
2180 case LE:
2181 case LEU:
2182 case GE:
2183 case GEU:
2184 return 1;
2186 default:
2187 break;
2190 len = GET_RTX_LENGTH (code);
2191 fmt = GET_RTX_FORMAT (code);
2193 for (i = 0; i < len; i++)
2195 if (fmt[i] == 'e')
2197 if (inequality_comparisons_p (XEXP (x, i)))
2198 return 1;
2200 else if (fmt[i] == 'E')
2202 register int j;
2203 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2204 if (inequality_comparisons_p (XVECEXP (x, i, j)))
2205 return 1;
2209 return 0;
2212 /* Replace any occurrence of FROM in X with TO. The function does
2213 not enter into CONST_DOUBLE for the replace.
2215 Note that copying is not done so X must not be shared unless all copies
2216 are to be modified. */
2219 replace_rtx (x, from, to)
2220 rtx x, from, to;
2222 register int i, j;
2223 register const char *fmt;
2225 /* The following prevents loops occurrence when we change MEM in
2226 CONST_DOUBLE onto the same CONST_DOUBLE. */
2227 if (x != 0 && GET_CODE (x) == CONST_DOUBLE)
2228 return x;
2230 if (x == from)
2231 return to;
2233 /* Allow this function to make replacements in EXPR_LISTs. */
2234 if (x == 0)
2235 return 0;
2237 fmt = GET_RTX_FORMAT (GET_CODE (x));
2238 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2240 if (fmt[i] == 'e')
2241 XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
2242 else if (fmt[i] == 'E')
2243 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2244 XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
2247 return x;
2250 /* Throughout the rtx X, replace many registers according to REG_MAP.
2251 Return the replacement for X (which may be X with altered contents).
2252 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
2253 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
2255 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
2256 should not be mapped to pseudos or vice versa since validate_change
2257 is not called.
2259 If REPLACE_DEST is 1, replacements are also done in destinations;
2260 otherwise, only sources are replaced. */
2263 replace_regs (x, reg_map, nregs, replace_dest)
2264 rtx x;
2265 rtx *reg_map;
2266 unsigned int nregs;
2267 int replace_dest;
2269 register enum rtx_code code;
2270 register int i;
2271 register const char *fmt;
2273 if (x == 0)
2274 return x;
2276 code = GET_CODE (x);
2277 switch (code)
2279 case SCRATCH:
2280 case PC:
2281 case CC0:
2282 case CONST_INT:
2283 case CONST_DOUBLE:
2284 case CONST:
2285 case SYMBOL_REF:
2286 case LABEL_REF:
2287 return x;
2289 case REG:
2290 /* Verify that the register has an entry before trying to access it. */
2291 if (REGNO (x) < nregs && reg_map[REGNO (x)] != 0)
2293 /* SUBREGs can't be shared. Always return a copy to ensure that if
2294 this replacement occurs more than once then each instance will
2295 get distinct rtx. */
2296 if (GET_CODE (reg_map[REGNO (x)]) == SUBREG)
2297 return copy_rtx (reg_map[REGNO (x)]);
2298 return reg_map[REGNO (x)];
2300 return x;
2302 case SUBREG:
2303 /* Prevent making nested SUBREGs. */
2304 if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < nregs
2305 && reg_map[REGNO (SUBREG_REG (x))] != 0
2306 && GET_CODE (reg_map[REGNO (SUBREG_REG (x))]) == SUBREG)
2308 rtx map_val = reg_map[REGNO (SUBREG_REG (x))];
2309 return simplify_gen_subreg (GET_MODE (x), map_val,
2310 GET_MODE (SUBREG_REG (x)),
2311 SUBREG_BYTE (x));
2313 break;
2315 case SET:
2316 if (replace_dest)
2317 SET_DEST (x) = replace_regs (SET_DEST (x), reg_map, nregs, 0);
2319 else if (GET_CODE (SET_DEST (x)) == MEM
2320 || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
2321 /* Even if we are not to replace destinations, replace register if it
2322 is CONTAINED in destination (destination is memory or
2323 STRICT_LOW_PART). */
2324 XEXP (SET_DEST (x), 0) = replace_regs (XEXP (SET_DEST (x), 0),
2325 reg_map, nregs, 0);
2326 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
2327 /* Similarly, for ZERO_EXTRACT we replace all operands. */
2328 break;
2330 SET_SRC (x) = replace_regs (SET_SRC (x), reg_map, nregs, 0);
2331 return x;
2333 default:
2334 break;
2337 fmt = GET_RTX_FORMAT (code);
2338 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2340 if (fmt[i] == 'e')
2341 XEXP (x, i) = replace_regs (XEXP (x, i), reg_map, nregs, replace_dest);
2342 else if (fmt[i] == 'E')
2344 register int j;
2345 for (j = 0; j < XVECLEN (x, i); j++)
2346 XVECEXP (x, i, j) = replace_regs (XVECEXP (x, i, j), reg_map,
2347 nregs, replace_dest);
2350 return x;
2353 /* A subroutine of computed_jump_p, return 1 if X contains a REG or MEM or
2354 constant that is not in the constant pool and not in the condition
2355 of an IF_THEN_ELSE. */
2357 static int
2358 computed_jump_p_1 (x)
2359 rtx x;
2361 enum rtx_code code = GET_CODE (x);
2362 int i, j;
2363 const char *fmt;
2365 switch (code)
2367 case LABEL_REF:
2368 case PC:
2369 return 0;
2371 case CONST:
2372 case CONST_INT:
2373 case CONST_DOUBLE:
2374 case SYMBOL_REF:
2375 case REG:
2376 return 1;
2378 case MEM:
2379 return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
2380 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
2382 case IF_THEN_ELSE:
2383 return (computed_jump_p_1 (XEXP (x, 1))
2384 || computed_jump_p_1 (XEXP (x, 2)));
2386 default:
2387 break;
2390 fmt = GET_RTX_FORMAT (code);
2391 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2393 if (fmt[i] == 'e'
2394 && computed_jump_p_1 (XEXP (x, i)))
2395 return 1;
2397 else if (fmt[i] == 'E')
2398 for (j = 0; j < XVECLEN (x, i); j++)
2399 if (computed_jump_p_1 (XVECEXP (x, i, j)))
2400 return 1;
2403 return 0;
2406 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2408 Tablejumps and casesi insns are not considered indirect jumps;
2409 we can recognize them by a (use (label_ref)). */
2412 computed_jump_p (insn)
2413 rtx insn;
2415 int i;
2416 if (GET_CODE (insn) == JUMP_INSN)
2418 rtx pat = PATTERN (insn);
2420 if (find_reg_note (insn, REG_LABEL, NULL_RTX))
2421 return 0;
2422 else if (GET_CODE (pat) == PARALLEL)
2424 int len = XVECLEN (pat, 0);
2425 int has_use_labelref = 0;
2427 for (i = len - 1; i >= 0; i--)
2428 if (GET_CODE (XVECEXP (pat, 0, i)) == USE
2429 && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0))
2430 == LABEL_REF))
2431 has_use_labelref = 1;
2433 if (! has_use_labelref)
2434 for (i = len - 1; i >= 0; i--)
2435 if (GET_CODE (XVECEXP (pat, 0, i)) == SET
2436 && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
2437 && computed_jump_p_1 (SET_SRC (XVECEXP (pat, 0, i))))
2438 return 1;
2440 else if (GET_CODE (pat) == SET
2441 && SET_DEST (pat) == pc_rtx
2442 && computed_jump_p_1 (SET_SRC (pat)))
2443 return 1;
2445 return 0;
2448 /* Traverse X via depth-first search, calling F for each
2449 sub-expression (including X itself). F is also passed the DATA.
2450 If F returns -1, do not traverse sub-expressions, but continue
2451 traversing the rest of the tree. If F ever returns any other
2452 non-zero value, stop the traversal, and return the value returned
2453 by F. Otherwise, return 0. This function does not traverse inside
2454 tree structure that contains RTX_EXPRs, or into sub-expressions
2455 whose format code is `0' since it is not known whether or not those
2456 codes are actually RTL.
2458 This routine is very general, and could (should?) be used to
2459 implement many of the other routines in this file. */
2462 for_each_rtx (x, f, data)
2463 rtx *x;
2464 rtx_function f;
2465 void *data;
2467 int result;
2468 int length;
2469 const char *format;
2470 int i;
2472 /* Call F on X. */
2473 result = (*f) (x, data);
2474 if (result == -1)
2475 /* Do not traverse sub-expressions. */
2476 return 0;
2477 else if (result != 0)
2478 /* Stop the traversal. */
2479 return result;
2481 if (*x == NULL_RTX)
2482 /* There are no sub-expressions. */
2483 return 0;
2485 length = GET_RTX_LENGTH (GET_CODE (*x));
2486 format = GET_RTX_FORMAT (GET_CODE (*x));
2488 for (i = 0; i < length; ++i)
2490 switch (format[i])
2492 case 'e':
2493 result = for_each_rtx (&XEXP (*x, i), f, data);
2494 if (result != 0)
2495 return result;
2496 break;
2498 case 'V':
2499 case 'E':
2500 if (XVEC (*x, i) != 0)
2502 int j;
2503 for (j = 0; j < XVECLEN (*x, i); ++j)
2505 result = for_each_rtx (&XVECEXP (*x, i, j), f, data);
2506 if (result != 0)
2507 return result;
2510 break;
2512 default:
2513 /* Nothing to do. */
2514 break;
2519 return 0;
2522 /* Searches X for any reference to REGNO, returning the rtx of the
2523 reference found if any. Otherwise, returns NULL_RTX. */
2526 regno_use_in (regno, x)
2527 unsigned int regno;
2528 rtx x;
2530 register const char *fmt;
2531 int i, j;
2532 rtx tem;
2534 if (GET_CODE (x) == REG && REGNO (x) == regno)
2535 return x;
2537 fmt = GET_RTX_FORMAT (GET_CODE (x));
2538 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2540 if (fmt[i] == 'e')
2542 if ((tem = regno_use_in (regno, XEXP (x, i))))
2543 return tem;
2545 else if (fmt[i] == 'E')
2546 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2547 if ((tem = regno_use_in (regno , XVECEXP (x, i, j))))
2548 return tem;
2551 return NULL_RTX;
2554 /* Return a value indicating whether OP, an operand of a commutative
2555 operation, is preferred as the first or second operand. The higher
2556 the value, the stronger the preference for being the first operand.
2557 We use negative values to indicate a preference for the first operand
2558 and positive values for the second operand. */
2561 commutative_operand_precedence (op)
2562 rtx op;
2564 /* Constants always come the second operand. Prefer "nice" constants. */
2565 if (GET_CODE (op) == CONST_INT)
2566 return -5;
2567 if (GET_CODE (op) == CONST_DOUBLE)
2568 return -4;
2569 if (CONSTANT_P (op))
2570 return -3;
2572 /* SUBREGs of objects should come second. */
2573 if (GET_CODE (op) == SUBREG
2574 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op))) == 'o')
2575 return -2;
2577 /* If only one operand is a `neg', `not',
2578 `mult', `plus', or `minus' expression, it will be the first
2579 operand. */
2580 if (GET_CODE (op) == NEG || GET_CODE (op) == NOT
2581 || GET_CODE (op) == MULT || GET_CODE (op) == PLUS
2582 || GET_CODE (op) == MINUS)
2583 return 2;
2585 /* Complex expressions should be the first, so decrease priority
2586 of objects. */
2587 if (GET_RTX_CLASS (GET_CODE (op)) == 'o')
2588 return -1;
2589 return 0;
2592 /* Return 1 iff it is neccesary to swap operands of commutative operation
2593 in order to canonicalize expression. */
2596 swap_commutative_operands_p (x, y)
2597 rtx x, y;
2599 return (commutative_operand_precedence (x)
2600 < commutative_operand_precedence (y));
2603 /* Return 1 if X is an autoincrement side effect and the register is
2604 not the stack pointer. */
2606 auto_inc_p (x)
2607 rtx x;
2609 switch (GET_CODE (x))
2611 case PRE_INC:
2612 case POST_INC:
2613 case PRE_DEC:
2614 case POST_DEC:
2615 case PRE_MODIFY:
2616 case POST_MODIFY:
2617 /* There are no REG_INC notes for SP. */
2618 if (XEXP (x, 0) != stack_pointer_rtx)
2619 return 1;
2620 default:
2621 break;
2623 return 0;
2626 /* Return 1 if the sequence of instructions beginning with FROM and up
2627 to and including TO is safe to move. If NEW_TO is non-NULL, and
2628 the sequence is not already safe to move, but can be easily
2629 extended to a sequence which is safe, then NEW_TO will point to the
2630 end of the extended sequence.
2632 For now, this function only checks that the region contains whole
2633 exception regions, but it could be extended to check additional
2634 conditions as well. */
2637 insns_safe_to_move_p (from, to, new_to)
2638 rtx from;
2639 rtx to;
2640 rtx *new_to;
2642 int eh_region_count = 0;
2643 int past_to_p = 0;
2644 rtx r = from;
2646 /* By default, assume the end of the region will be what was
2647 suggested. */
2648 if (new_to)
2649 *new_to = to;
2651 while (r)
2653 if (GET_CODE (r) == NOTE)
2655 switch (NOTE_LINE_NUMBER (r))
2657 case NOTE_INSN_EH_REGION_BEG:
2658 ++eh_region_count;
2659 break;
2661 case NOTE_INSN_EH_REGION_END:
2662 if (eh_region_count == 0)
2663 /* This sequence of instructions contains the end of
2664 an exception region, but not he beginning. Moving
2665 it will cause chaos. */
2666 return 0;
2668 --eh_region_count;
2669 break;
2671 default:
2672 break;
2675 else if (past_to_p)
2676 /* If we've passed TO, and we see a non-note instruction, we
2677 can't extend the sequence to a movable sequence. */
2678 return 0;
2680 if (r == to)
2682 if (!new_to)
2683 /* It's OK to move the sequence if there were matched sets of
2684 exception region notes. */
2685 return eh_region_count == 0;
2687 past_to_p = 1;
2690 /* It's OK to move the sequence if there were matched sets of
2691 exception region notes. */
2692 if (past_to_p && eh_region_count == 0)
2694 *new_to = r;
2695 return 1;
2698 /* Go to the next instruction. */
2699 r = NEXT_INSN (r);
2702 return 0;
2705 /* Return non-zero if IN contains a piece of rtl that has the address LOC */
2707 loc_mentioned_in_p (loc, in)
2708 rtx *loc, in;
2710 enum rtx_code code = GET_CODE (in);
2711 const char *fmt = GET_RTX_FORMAT (code);
2712 int i, j;
2714 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2716 if (loc == &in->fld[i].rtx)
2717 return 1;
2718 if (fmt[i] == 'e')
2720 if (loc_mentioned_in_p (loc, XEXP (in, i)))
2721 return 1;
2723 else if (fmt[i] == 'E')
2724 for (j = XVECLEN (in, i) - 1; j >= 0; j--)
2725 if (loc_mentioned_in_p (loc, XVECEXP (in, i, j)))
2726 return 1;
2728 return 0;
2731 /* This function returns the regno offset of a subreg expression.
2732 xregno - A regno of an inner hard subreg_reg (or what will become one).
2733 xmode - The mode of xregno.
2734 offset - The byte offset.
2735 ymode - The mode of a top level SUBREG (or what may become one).
2736 RETURN - The regno offset which would be used.
2737 This function can be overridden by defining SUBREG_REGNO_OFFSET,
2738 taking the same parameters. */
2739 unsigned int
2740 subreg_regno_offset (xregno, xmode, offset, ymode)
2741 unsigned int xregno;
2742 enum machine_mode xmode;
2743 unsigned int offset;
2744 enum machine_mode ymode;
2746 unsigned ret;
2747 int nregs_xmode, nregs_ymode;
2748 int mode_multiple, nregs_multiple;
2749 int y_offset;
2751 /* Check for an override, and use it instead. */
2752 #ifdef SUBREG_REGNO_OFFSET
2753 ret = SUBREG_REGNO_OFFSET (xregno, xmode, offset, ymode)
2754 #else
2755 if (xregno >= FIRST_PSEUDO_REGISTER)
2756 abort ();
2758 nregs_xmode = HARD_REGNO_NREGS (xregno, xmode);
2759 nregs_ymode = HARD_REGNO_NREGS (xregno, ymode);
2760 if (offset == 0 || nregs_xmode == nregs_ymode)
2761 return 0;
2763 /* size of ymode must not be greater than the size of xmode. */
2764 mode_multiple = GET_MODE_SIZE (xmode) / GET_MODE_SIZE (ymode);
2765 if (mode_multiple == 0)
2766 abort ();
2768 y_offset = offset / GET_MODE_SIZE (ymode);
2769 nregs_multiple = nregs_xmode / nregs_ymode;
2770 ret = (y_offset / (mode_multiple / nregs_multiple)) * nregs_ymode;
2771 #endif
2773 return ret;
2776 /* Return the final regno that a subreg expression refers to. */
2777 unsigned int
2778 subreg_regno (x)
2779 rtx x;
2781 unsigned int ret;
2782 rtx subreg = SUBREG_REG (x);
2783 int regno = REGNO (subreg);
2785 ret = regno + subreg_regno_offset (regno,
2786 GET_MODE (subreg),
2787 SUBREG_BYTE (x),
2788 GET_MODE (x));
2789 return ret;
2792 struct parms_set_data
2794 int nregs;
2795 HARD_REG_SET regs;
2798 /* Helper function for noticing stores to parameter registers. */
2799 static void
2800 parms_set (x, pat, data)
2801 rtx x, pat ATTRIBUTE_UNUSED;
2802 void *data;
2804 struct parms_set_data *d = data;
2805 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER
2806 && TEST_HARD_REG_BIT (d->regs, REGNO (x)))
2808 CLEAR_HARD_REG_BIT (d->regs, REGNO (x));
2809 d->nregs--;
2813 /* Look backward for first parameter to be loaded.
2814 Do not skip BOUNDARY. */
2816 find_first_parameter_load (call_insn, boundary)
2817 rtx call_insn, boundary;
2819 struct parms_set_data parm;
2820 rtx p, before;
2822 /* Since different machines initialize their parameter registers
2823 in different orders, assume nothing. Collect the set of all
2824 parameter registers. */
2825 CLEAR_HARD_REG_SET (parm.regs);
2826 parm.nregs = 0;
2827 for (p = CALL_INSN_FUNCTION_USAGE (call_insn); p; p = XEXP (p, 1))
2828 if (GET_CODE (XEXP (p, 0)) == USE
2829 && GET_CODE (XEXP (XEXP (p, 0), 0)) == REG)
2831 if (REGNO (XEXP (XEXP (p, 0), 0)) >= FIRST_PSEUDO_REGISTER)
2832 abort ();
2834 /* We only care about registers which can hold function
2835 arguments. */
2836 if (!FUNCTION_ARG_REGNO_P (REGNO (XEXP (XEXP (p, 0), 0))))
2837 continue;
2839 SET_HARD_REG_BIT (parm.regs, REGNO (XEXP (XEXP (p, 0), 0)));
2840 parm.nregs++;
2842 before = call_insn;
2844 /* Search backward for the first set of a register in this set. */
2845 while (parm.nregs && before != boundary)
2847 before = PREV_INSN (before);
2849 /* It is possible that some loads got CSEed from one call to
2850 another. Stop in that case. */
2851 if (GET_CODE (before) == CALL_INSN)
2852 break;
2854 /* Our caller needs either ensure that we will find all sets
2855 (in case code has not been optimized yet), or take care
2856 for possible labels in a way by setting boundary to preceeding
2857 CODE_LABEL. */
2858 if (GET_CODE (before) == CODE_LABEL)
2860 if (before != boundary)
2861 abort ();
2862 break;
2865 if (INSN_P (before))
2866 note_stores (PATTERN (before), parms_set, &parm);
2868 return before;