1998-09-21 Ben Elliston <bje@cygnus.com>
[official-gcc.git] / gcc / rtlanal.c
blob6e5fa77fd3e0abfdae340cdda522eaa78d104d66
1 /* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 88, 92-97, 1998 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "rtl.h"
26 static int rtx_addr_can_trap_p PROTO((rtx));
27 static void reg_set_p_1 PROTO((rtx, rtx));
28 static void reg_set_last_1 PROTO((rtx, rtx));
31 /* Forward declarations */
32 static int jmp_uses_reg_or_mem PROTO((rtx));
34 /* Bit flags that specify the machine subtype we are compiling for.
35 Bits are tested using macros TARGET_... defined in the tm.h file
36 and set by `-m...' switches. Must be defined in rtlanal.c. */
38 int target_flags;
40 /* Return 1 if the value of X is unstable
41 (would be different at a different point in the program).
42 The frame pointer, arg pointer, etc. are considered stable
43 (within one function) and so is anything marked `unchanging'. */
45 int
46 rtx_unstable_p (x)
47 rtx x;
49 register RTX_CODE code = GET_CODE (x);
50 register int i;
51 register char *fmt;
53 if (code == MEM)
54 return ! RTX_UNCHANGING_P (x);
56 if (code == QUEUED)
57 return 1;
59 if (code == CONST || code == CONST_INT)
60 return 0;
62 if (code == REG)
63 return ! (REGNO (x) == FRAME_POINTER_REGNUM
64 || REGNO (x) == HARD_FRAME_POINTER_REGNUM
65 || REGNO (x) == ARG_POINTER_REGNUM
66 || RTX_UNCHANGING_P (x));
68 fmt = GET_RTX_FORMAT (code);
69 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
70 if (fmt[i] == 'e')
71 if (rtx_unstable_p (XEXP (x, i)))
72 return 1;
73 return 0;
76 /* Return 1 if X has a value that can vary even between two
77 executions of the program. 0 means X can be compared reliably
78 against certain constants or near-constants.
79 The frame pointer and the arg pointer are considered constant. */
81 int
82 rtx_varies_p (x)
83 rtx x;
85 register RTX_CODE code = GET_CODE (x);
86 register int i;
87 register char *fmt;
89 switch (code)
91 case MEM:
92 case QUEUED:
93 return 1;
95 case CONST:
96 case CONST_INT:
97 case CONST_DOUBLE:
98 case SYMBOL_REF:
99 case LABEL_REF:
100 return 0;
102 case REG:
103 /* Note that we have to test for the actual rtx used for the frame
104 and arg pointers and not just the register number in case we have
105 eliminated the frame and/or arg pointer and are using it
106 for pseudos. */
107 return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
108 || x == arg_pointer_rtx || x == pic_offset_table_rtx);
110 case LO_SUM:
111 /* The operand 0 of a LO_SUM is considered constant
112 (in fact is it related specifically to operand 1). */
113 return rtx_varies_p (XEXP (x, 1));
115 default:
116 break;
119 fmt = GET_RTX_FORMAT (code);
120 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
121 if (fmt[i] == 'e')
122 if (rtx_varies_p (XEXP (x, i)))
123 return 1;
124 return 0;
127 /* Return 0 if the use of X as an address in a MEM can cause a trap. */
129 static int
130 rtx_addr_can_trap_p (x)
131 register rtx x;
133 register enum rtx_code code = GET_CODE (x);
135 switch (code)
137 case SYMBOL_REF:
138 case LABEL_REF:
139 /* SYMBOL_REF is problematic due to the possible presence of
140 a #pragma weak, but to say that loads from symbols can trap is
141 *very* costly. It's not at all clear what's best here. For
142 now, we ignore the impact of #pragma weak. */
143 return 0;
145 case REG:
146 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
147 return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
148 || x == stack_pointer_rtx || x == arg_pointer_rtx);
150 case CONST:
151 return rtx_addr_can_trap_p (XEXP (x, 0));
153 case PLUS:
154 /* An address is assumed not to trap if it is an address that can't
155 trap plus a constant integer. */
156 return (rtx_addr_can_trap_p (XEXP (x, 0))
157 || GET_CODE (XEXP (x, 1)) != CONST_INT);
159 case LO_SUM:
160 return rtx_addr_can_trap_p (XEXP (x, 1));
162 default:
163 break;
166 /* If it isn't one of the case above, it can cause a trap. */
167 return 1;
170 /* Return 1 if X refers to a memory location whose address
171 cannot be compared reliably with constant addresses,
172 or if X refers to a BLKmode memory object. */
175 rtx_addr_varies_p (x)
176 rtx x;
178 register enum rtx_code code;
179 register int i;
180 register char *fmt;
182 if (x == 0)
183 return 0;
185 code = GET_CODE (x);
186 if (code == MEM)
187 return GET_MODE (x) == BLKmode || rtx_varies_p (XEXP (x, 0));
189 fmt = GET_RTX_FORMAT (code);
190 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
191 if (fmt[i] == 'e')
193 if (rtx_addr_varies_p (XEXP (x, i)))
194 return 1;
196 else if (fmt[i] == 'E')
198 int j;
199 for (j = 0; j < XVECLEN (x, i); j++)
200 if (rtx_addr_varies_p (XVECEXP (x, i, j)))
201 return 1;
203 return 0;
206 /* Return the value of the integer term in X, if one is apparent;
207 otherwise return 0.
208 Only obvious integer terms are detected.
209 This is used in cse.c with the `related_value' field.*/
211 HOST_WIDE_INT
212 get_integer_term (x)
213 rtx x;
215 if (GET_CODE (x) == CONST)
216 x = XEXP (x, 0);
218 if (GET_CODE (x) == MINUS
219 && GET_CODE (XEXP (x, 1)) == CONST_INT)
220 return - INTVAL (XEXP (x, 1));
221 if (GET_CODE (x) == PLUS
222 && GET_CODE (XEXP (x, 1)) == CONST_INT)
223 return INTVAL (XEXP (x, 1));
224 return 0;
227 /* If X is a constant, return the value sans apparent integer term;
228 otherwise return 0.
229 Only obvious integer terms are detected. */
232 get_related_value (x)
233 rtx x;
235 if (GET_CODE (x) != CONST)
236 return 0;
237 x = XEXP (x, 0);
238 if (GET_CODE (x) == PLUS
239 && GET_CODE (XEXP (x, 1)) == CONST_INT)
240 return XEXP (x, 0);
241 else if (GET_CODE (x) == MINUS
242 && GET_CODE (XEXP (x, 1)) == CONST_INT)
243 return XEXP (x, 0);
244 return 0;
247 /* Nonzero if register REG appears somewhere within IN.
248 Also works if REG is not a register; in this case it checks
249 for a subexpression of IN that is Lisp "equal" to REG. */
252 reg_mentioned_p (reg, in)
253 register rtx reg, in;
255 register char *fmt;
256 register int i;
257 register enum rtx_code code;
259 if (in == 0)
260 return 0;
262 if (reg == in)
263 return 1;
265 if (GET_CODE (in) == LABEL_REF)
266 return reg == XEXP (in, 0);
268 code = GET_CODE (in);
270 switch (code)
272 /* Compare registers by number. */
273 case REG:
274 return GET_CODE (reg) == REG && REGNO (in) == REGNO (reg);
276 /* These codes have no constituent expressions
277 and are unique. */
278 case SCRATCH:
279 case CC0:
280 case PC:
281 return 0;
283 case CONST_INT:
284 return GET_CODE (reg) == CONST_INT && INTVAL (in) == INTVAL (reg);
286 case CONST_DOUBLE:
287 /* These are kept unique for a given value. */
288 return 0;
290 default:
291 break;
294 if (GET_CODE (reg) == code && rtx_equal_p (reg, in))
295 return 1;
297 fmt = GET_RTX_FORMAT (code);
299 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
301 if (fmt[i] == 'E')
303 register int j;
304 for (j = XVECLEN (in, i) - 1; j >= 0; j--)
305 if (reg_mentioned_p (reg, XVECEXP (in, i, j)))
306 return 1;
308 else if (fmt[i] == 'e'
309 && reg_mentioned_p (reg, XEXP (in, i)))
310 return 1;
312 return 0;
315 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
316 no CODE_LABEL insn. */
319 no_labels_between_p (beg, end)
320 rtx beg, end;
322 register rtx p;
323 for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
324 if (GET_CODE (p) == CODE_LABEL)
325 return 0;
326 return 1;
329 /* Nonzero if register REG is used in an insn between
330 FROM_INSN and TO_INSN (exclusive of those two). */
333 reg_used_between_p (reg, from_insn, to_insn)
334 rtx reg, from_insn, to_insn;
336 register rtx insn;
338 if (from_insn == to_insn)
339 return 0;
341 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
342 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
343 && (reg_overlap_mentioned_p (reg, PATTERN (insn))
344 || (GET_CODE (insn) == CALL_INSN
345 && (find_reg_fusage (insn, USE, reg)
346 || find_reg_fusage (insn, CLOBBER, reg)))))
347 return 1;
348 return 0;
351 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
352 is entirely replaced by a new value and the only use is as a SET_DEST,
353 we do not consider it a reference. */
356 reg_referenced_p (x, body)
357 rtx x;
358 rtx body;
360 int i;
362 switch (GET_CODE (body))
364 case SET:
365 if (reg_overlap_mentioned_p (x, SET_SRC (body)))
366 return 1;
368 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
369 of a REG that occupies all of the REG, the insn references X if
370 it is mentioned in the destination. */
371 if (GET_CODE (SET_DEST (body)) != CC0
372 && GET_CODE (SET_DEST (body)) != PC
373 && GET_CODE (SET_DEST (body)) != REG
374 && ! (GET_CODE (SET_DEST (body)) == SUBREG
375 && GET_CODE (SUBREG_REG (SET_DEST (body))) == REG
376 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body))))
377 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
378 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body)))
379 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
380 && reg_overlap_mentioned_p (x, SET_DEST (body)))
381 return 1;
382 return 0;
384 case ASM_OPERANDS:
385 for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
386 if (reg_overlap_mentioned_p (x, ASM_OPERANDS_INPUT (body, i)))
387 return 1;
388 return 0;
390 case CALL:
391 case USE:
392 return reg_overlap_mentioned_p (x, body);
394 case TRAP_IF:
395 return reg_overlap_mentioned_p (x, TRAP_CONDITION (body));
397 case UNSPEC:
398 case UNSPEC_VOLATILE:
399 case PARALLEL:
400 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
401 if (reg_referenced_p (x, XVECEXP (body, 0, i)))
402 return 1;
403 return 0;
405 default:
406 return 0;
410 /* Nonzero if register REG is referenced in an insn between
411 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
412 not count. */
415 reg_referenced_between_p (reg, from_insn, to_insn)
416 rtx reg, from_insn, to_insn;
418 register rtx insn;
420 if (from_insn == to_insn)
421 return 0;
423 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
424 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
425 && (reg_referenced_p (reg, PATTERN (insn))
426 || (GET_CODE (insn) == CALL_INSN
427 && find_reg_fusage (insn, USE, reg))))
428 return 1;
429 return 0;
432 /* Nonzero if register REG is set or clobbered in an insn between
433 FROM_INSN and TO_INSN (exclusive of those two). */
436 reg_set_between_p (reg, from_insn, to_insn)
437 rtx reg, from_insn, to_insn;
439 register rtx insn;
441 if (from_insn == to_insn)
442 return 0;
444 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
445 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
446 && reg_set_p (reg, insn))
447 return 1;
448 return 0;
451 /* Internals of reg_set_between_p. */
453 static rtx reg_set_reg;
454 static int reg_set_flag;
456 static void
457 reg_set_p_1 (x, pat)
458 rtx x;
459 rtx pat ATTRIBUTE_UNUSED;
461 /* We don't want to return 1 if X is a MEM that contains a register
462 within REG_SET_REG. */
464 if ((GET_CODE (x) != MEM)
465 && reg_overlap_mentioned_p (reg_set_reg, x))
466 reg_set_flag = 1;
470 reg_set_p (reg, insn)
471 rtx reg, insn;
473 rtx body = insn;
475 /* We can be passed an insn or part of one. If we are passed an insn,
476 check if a side-effect of the insn clobbers REG. */
477 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
479 if (FIND_REG_INC_NOTE (insn, reg)
480 || (GET_CODE (insn) == CALL_INSN
481 /* We'd like to test call_used_regs here, but rtlanal.c can't
482 reference that variable due to its use in genattrtab. So
483 we'll just be more conservative.
485 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
486 information holds all clobbered registers. */
487 && ((GET_CODE (reg) == REG
488 && REGNO (reg) < FIRST_PSEUDO_REGISTER)
489 || GET_CODE (reg) == MEM
490 || find_reg_fusage (insn, CLOBBER, reg))))
491 return 1;
493 body = PATTERN (insn);
496 reg_set_reg = reg;
497 reg_set_flag = 0;
498 note_stores (body, reg_set_p_1);
499 return reg_set_flag;
502 /* Similar to reg_set_between_p, but check all registers in X. Return 0
503 only if none of them are modified between START and END. Return 1 if
504 X contains a MEM; this routine does not perform any memory aliasing. */
507 modified_between_p (x, start, end)
508 rtx x;
509 rtx start, end;
511 enum rtx_code code = GET_CODE (x);
512 char *fmt;
513 int i, j;
515 switch (code)
517 case CONST_INT:
518 case CONST_DOUBLE:
519 case CONST:
520 case SYMBOL_REF:
521 case LABEL_REF:
522 return 0;
524 case PC:
525 case CC0:
526 return 1;
528 case MEM:
529 /* If the memory is not constant, assume it is modified. If it is
530 constant, we still have to check the address. */
531 if (! RTX_UNCHANGING_P (x))
532 return 1;
533 break;
535 case REG:
536 return reg_set_between_p (x, start, end);
538 default:
539 break;
542 fmt = GET_RTX_FORMAT (code);
543 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
545 if (fmt[i] == 'e' && modified_between_p (XEXP (x, i), start, end))
546 return 1;
548 if (fmt[i] == 'E')
549 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
550 if (modified_between_p (XVECEXP (x, i, j), start, end))
551 return 1;
554 return 0;
557 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
558 of them are modified in INSN. Return 1 if X contains a MEM; this routine
559 does not perform any memory aliasing. */
562 modified_in_p (x, insn)
563 rtx x;
564 rtx insn;
566 enum rtx_code code = GET_CODE (x);
567 char *fmt;
568 int i, j;
570 switch (code)
572 case CONST_INT:
573 case CONST_DOUBLE:
574 case CONST:
575 case SYMBOL_REF:
576 case LABEL_REF:
577 return 0;
579 case PC:
580 case CC0:
581 return 1;
583 case MEM:
584 /* If the memory is not constant, assume it is modified. If it is
585 constant, we still have to check the address. */
586 if (! RTX_UNCHANGING_P (x))
587 return 1;
588 break;
590 case REG:
591 return reg_set_p (x, insn);
593 default:
594 break;
597 fmt = GET_RTX_FORMAT (code);
598 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
600 if (fmt[i] == 'e' && modified_in_p (XEXP (x, i), insn))
601 return 1;
603 if (fmt[i] == 'E')
604 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
605 if (modified_in_p (XVECEXP (x, i, j), insn))
606 return 1;
609 return 0;
612 /* Given an INSN, return a SET expression if this insn has only a single SET.
613 It may also have CLOBBERs, USEs, or SET whose output
614 will not be used, which we ignore. */
617 single_set (insn)
618 rtx insn;
620 rtx set;
621 int i;
623 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
624 return 0;
626 if (GET_CODE (PATTERN (insn)) == SET)
627 return PATTERN (insn);
629 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
631 for (i = 0, set = 0; i < XVECLEN (PATTERN (insn), 0); i++)
632 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET
633 && (! find_reg_note (insn, REG_UNUSED,
634 SET_DEST (XVECEXP (PATTERN (insn), 0, i)))
635 || side_effects_p (XVECEXP (PATTERN (insn), 0, i))))
637 if (set)
638 return 0;
639 else
640 set = XVECEXP (PATTERN (insn), 0, i);
642 return set;
645 return 0;
648 /* Return the last thing that X was assigned from before *PINSN. Verify that
649 the object is not modified up to VALID_TO. If it was, if we hit
650 a partial assignment to X, or hit a CODE_LABEL first, return X. If we
651 found an assignment, update *PINSN to point to it. */
654 find_last_value (x, pinsn, valid_to)
655 rtx x;
656 rtx *pinsn;
657 rtx valid_to;
659 rtx p;
661 for (p = PREV_INSN (*pinsn); p && GET_CODE (p) != CODE_LABEL;
662 p = PREV_INSN (p))
663 if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
665 rtx set = single_set (p);
666 rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
668 if (set && rtx_equal_p (x, SET_DEST (set)))
670 rtx src = SET_SRC (set);
672 if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
673 src = XEXP (note, 0);
675 if (! modified_between_p (src, PREV_INSN (p), valid_to)
676 /* Reject hard registers because we don't usually want
677 to use them; we'd rather use a pseudo. */
678 && ! (GET_CODE (src) == REG
679 && REGNO (src) < FIRST_PSEUDO_REGISTER))
681 *pinsn = p;
682 return src;
686 /* If set in non-simple way, we don't have a value. */
687 if (reg_set_p (x, p))
688 break;
691 return x;
694 /* Return nonzero if register in range [REGNO, ENDREGNO)
695 appears either explicitly or implicitly in X
696 other than being stored into.
698 References contained within the substructure at LOC do not count.
699 LOC may be zero, meaning don't ignore anything. */
702 refers_to_regno_p (regno, endregno, x, loc)
703 int regno, endregno;
704 rtx x;
705 rtx *loc;
707 register int i;
708 register RTX_CODE code;
709 register char *fmt;
711 repeat:
712 /* The contents of a REG_NONNEG note is always zero, so we must come here
713 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
714 if (x == 0)
715 return 0;
717 code = GET_CODE (x);
719 switch (code)
721 case REG:
722 i = REGNO (x);
724 /* If we modifying the stack, frame, or argument pointer, it will
725 clobber a virtual register. In fact, we could be more precise,
726 but it isn't worth it. */
727 if ((i == STACK_POINTER_REGNUM
728 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
729 || i == ARG_POINTER_REGNUM
730 #endif
731 || i == FRAME_POINTER_REGNUM)
732 && regno >= FIRST_VIRTUAL_REGISTER && regno <= LAST_VIRTUAL_REGISTER)
733 return 1;
735 return (endregno > i
736 && regno < i + (i < FIRST_PSEUDO_REGISTER
737 ? HARD_REGNO_NREGS (i, GET_MODE (x))
738 : 1));
740 case SUBREG:
741 /* If this is a SUBREG of a hard reg, we can see exactly which
742 registers are being modified. Otherwise, handle normally. */
743 if (GET_CODE (SUBREG_REG (x)) == REG
744 && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
746 int inner_regno = REGNO (SUBREG_REG (x)) + SUBREG_WORD (x);
747 int inner_endregno
748 = inner_regno + (inner_regno < FIRST_PSEUDO_REGISTER
749 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
751 return endregno > inner_regno && regno < inner_endregno;
753 break;
755 case CLOBBER:
756 case SET:
757 if (&SET_DEST (x) != loc
758 /* Note setting a SUBREG counts as referring to the REG it is in for
759 a pseudo but not for hard registers since we can
760 treat each word individually. */
761 && ((GET_CODE (SET_DEST (x)) == SUBREG
762 && loc != &SUBREG_REG (SET_DEST (x))
763 && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG
764 && REGNO (SUBREG_REG (SET_DEST (x))) >= FIRST_PSEUDO_REGISTER
765 && refers_to_regno_p (regno, endregno,
766 SUBREG_REG (SET_DEST (x)), loc))
767 || (GET_CODE (SET_DEST (x)) != REG
768 && refers_to_regno_p (regno, endregno, SET_DEST (x), loc))))
769 return 1;
771 if (code == CLOBBER || loc == &SET_SRC (x))
772 return 0;
773 x = SET_SRC (x);
774 goto repeat;
776 default:
777 break;
780 /* X does not match, so try its subexpressions. */
782 fmt = GET_RTX_FORMAT (code);
783 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
785 if (fmt[i] == 'e' && loc != &XEXP (x, i))
787 if (i == 0)
789 x = XEXP (x, 0);
790 goto repeat;
792 else
793 if (refers_to_regno_p (regno, endregno, XEXP (x, i), loc))
794 return 1;
796 else if (fmt[i] == 'E')
798 register int j;
799 for (j = XVECLEN (x, i) - 1; j >=0; j--)
800 if (loc != &XVECEXP (x, i, j)
801 && refers_to_regno_p (regno, endregno, XVECEXP (x, i, j), loc))
802 return 1;
805 return 0;
808 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
809 we check if any register number in X conflicts with the relevant register
810 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
811 contains a MEM (we don't bother checking for memory addresses that can't
812 conflict because we expect this to be a rare case. */
815 reg_overlap_mentioned_p (x, in)
816 rtx x, in;
818 int regno, endregno;
820 /* Overly conservative. */
821 if (GET_CODE (x) == STRICT_LOW_PART)
822 x = XEXP (x, 0);
824 /* If either argument is a constant, then modifying X can not affect IN. */
825 if (CONSTANT_P (x) || CONSTANT_P (in))
826 return 0;
827 else if (GET_CODE (x) == SUBREG)
829 regno = REGNO (SUBREG_REG (x));
830 if (regno < FIRST_PSEUDO_REGISTER)
831 regno += SUBREG_WORD (x);
833 else if (GET_CODE (x) == REG)
834 regno = REGNO (x);
835 else if (GET_CODE (x) == MEM)
837 char *fmt;
838 int i;
840 if (GET_CODE (in) == MEM)
841 return 1;
843 fmt = GET_RTX_FORMAT (GET_CODE (in));
845 for (i = GET_RTX_LENGTH (GET_CODE (in)) - 1; i >= 0; i--)
846 if (fmt[i] == 'e' && reg_overlap_mentioned_p (x, XEXP (in, i)))
847 return 1;
849 return 0;
851 else if (GET_CODE (x) == SCRATCH || GET_CODE (x) == PC
852 || GET_CODE (x) == CC0)
853 return reg_mentioned_p (x, in);
854 else if (GET_CODE (x) == PARALLEL
855 && GET_MODE (x) == BLKmode)
857 register int i;
859 /* If any register in here refers to it
860 we return true. */
861 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
862 if (reg_overlap_mentioned_p (SET_DEST (XVECEXP (x, 0, i)), in))
863 return 1;
864 return 0;
866 else
867 abort ();
869 endregno = regno + (regno < FIRST_PSEUDO_REGISTER
870 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
872 return refers_to_regno_p (regno, endregno, in, NULL_PTR);
875 /* Used for communications between the next few functions. */
877 static int reg_set_last_unknown;
878 static rtx reg_set_last_value;
879 static int reg_set_last_first_regno, reg_set_last_last_regno;
881 /* Called via note_stores from reg_set_last. */
883 static void
884 reg_set_last_1 (x, pat)
885 rtx x;
886 rtx pat;
888 int first, last;
890 /* If X is not a register, or is not one in the range we care
891 about, ignore. */
892 if (GET_CODE (x) != REG)
893 return;
895 first = REGNO (x);
896 last = first + (first < FIRST_PSEUDO_REGISTER
897 ? HARD_REGNO_NREGS (first, GET_MODE (x)) : 1);
899 if (first >= reg_set_last_last_regno
900 || last <= reg_set_last_first_regno)
901 return;
903 /* If this is a CLOBBER or is some complex LHS, or doesn't modify
904 exactly the registers we care about, show we don't know the value. */
905 if (GET_CODE (pat) == CLOBBER || SET_DEST (pat) != x
906 || first != reg_set_last_first_regno
907 || last != reg_set_last_last_regno)
908 reg_set_last_unknown = 1;
909 else
910 reg_set_last_value = SET_SRC (pat);
913 /* Return the last value to which REG was set prior to INSN. If we can't
914 find it easily, return 0.
916 We only return a REG, SUBREG, or constant because it is too hard to
917 check if a MEM remains unchanged. */
920 reg_set_last (x, insn)
921 rtx x;
922 rtx insn;
924 rtx orig_insn = insn;
926 reg_set_last_first_regno = REGNO (x);
928 reg_set_last_last_regno
929 = reg_set_last_first_regno
930 + (reg_set_last_first_regno < FIRST_PSEUDO_REGISTER
931 ? HARD_REGNO_NREGS (reg_set_last_first_regno, GET_MODE (x)) : 1);
933 reg_set_last_unknown = 0;
934 reg_set_last_value = 0;
936 /* Scan backwards until reg_set_last_1 changed one of the above flags.
937 Stop when we reach a label or X is a hard reg and we reach a
938 CALL_INSN (if reg_set_last_last_regno is a hard reg).
940 If we find a set of X, ensure that its SET_SRC remains unchanged. */
942 /* We compare with <= here, because reg_set_last_last_regno
943 is actually the number of the first reg *not* in X. */
944 for (;
945 insn && GET_CODE (insn) != CODE_LABEL
946 && ! (GET_CODE (insn) == CALL_INSN
947 && reg_set_last_last_regno <= FIRST_PSEUDO_REGISTER);
948 insn = PREV_INSN (insn))
949 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
951 note_stores (PATTERN (insn), reg_set_last_1);
952 if (reg_set_last_unknown)
953 return 0;
954 else if (reg_set_last_value)
956 if (CONSTANT_P (reg_set_last_value)
957 || ((GET_CODE (reg_set_last_value) == REG
958 || GET_CODE (reg_set_last_value) == SUBREG)
959 && ! reg_set_between_p (reg_set_last_value,
960 insn, orig_insn)))
961 return reg_set_last_value;
962 else
963 return 0;
967 return 0;
970 /* This is 1 until after the rtl generation pass. */
971 int rtx_equal_function_value_matters;
973 /* Return 1 if X and Y are identical-looking rtx's.
974 This is the Lisp function EQUAL for rtx arguments. */
977 rtx_equal_p (x, y)
978 rtx x, y;
980 register int i;
981 register int j;
982 register enum rtx_code code;
983 register char *fmt;
985 if (x == y)
986 return 1;
987 if (x == 0 || y == 0)
988 return 0;
990 code = GET_CODE (x);
991 /* Rtx's of different codes cannot be equal. */
992 if (code != GET_CODE (y))
993 return 0;
995 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
996 (REG:SI x) and (REG:HI x) are NOT equivalent. */
998 if (GET_MODE (x) != GET_MODE (y))
999 return 0;
1001 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
1003 if (code == REG)
1004 /* Until rtl generation is complete, don't consider a reference to the
1005 return register of the current function the same as the return from a
1006 called function. This eases the job of function integration. Once the
1007 distinction is no longer needed, they can be considered equivalent. */
1008 return (REGNO (x) == REGNO (y)
1009 && (! rtx_equal_function_value_matters
1010 || REG_FUNCTION_VALUE_P (x) == REG_FUNCTION_VALUE_P (y)));
1011 else if (code == LABEL_REF)
1012 return XEXP (x, 0) == XEXP (y, 0);
1013 else if (code == SYMBOL_REF)
1014 return XSTR (x, 0) == XSTR (y, 0);
1015 else if (code == SCRATCH || code == CONST_DOUBLE)
1016 return 0;
1018 /* Compare the elements. If any pair of corresponding elements
1019 fail to match, return 0 for the whole things. */
1021 fmt = GET_RTX_FORMAT (code);
1022 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1024 switch (fmt[i])
1026 case 'w':
1027 if (XWINT (x, i) != XWINT (y, i))
1028 return 0;
1029 break;
1031 case 'n':
1032 case 'i':
1033 if (XINT (x, i) != XINT (y, i))
1034 return 0;
1035 break;
1037 case 'V':
1038 case 'E':
1039 /* Two vectors must have the same length. */
1040 if (XVECLEN (x, i) != XVECLEN (y, i))
1041 return 0;
1043 /* And the corresponding elements must match. */
1044 for (j = 0; j < XVECLEN (x, i); j++)
1045 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
1046 return 0;
1047 break;
1049 case 'e':
1050 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
1051 return 0;
1052 break;
1054 case 'S':
1055 case 's':
1056 if (strcmp (XSTR (x, i), XSTR (y, i)))
1057 return 0;
1058 break;
1060 case 'u':
1061 /* These are just backpointers, so they don't matter. */
1062 break;
1064 case '0':
1065 break;
1067 /* It is believed that rtx's at this level will never
1068 contain anything but integers and other rtx's,
1069 except for within LABEL_REFs and SYMBOL_REFs. */
1070 default:
1071 abort ();
1074 return 1;
1077 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1078 (X would be the pattern of an insn).
1079 FUN receives two arguments:
1080 the REG, MEM, CC0 or PC being stored in or clobbered,
1081 the SET or CLOBBER rtx that does the store.
1083 If the item being stored in or clobbered is a SUBREG of a hard register,
1084 the SUBREG will be passed. */
1086 void
1087 note_stores (x, fun)
1088 register rtx x;
1089 void (*fun) ();
1091 if ((GET_CODE (x) == SET || GET_CODE (x) == CLOBBER))
1093 register rtx dest = SET_DEST (x);
1094 while ((GET_CODE (dest) == SUBREG
1095 && (GET_CODE (SUBREG_REG (dest)) != REG
1096 || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER))
1097 || GET_CODE (dest) == ZERO_EXTRACT
1098 || GET_CODE (dest) == SIGN_EXTRACT
1099 || GET_CODE (dest) == STRICT_LOW_PART)
1100 dest = XEXP (dest, 0);
1102 if (GET_CODE (dest) == PARALLEL
1103 && GET_MODE (dest) == BLKmode)
1105 register int i;
1106 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
1107 (*fun) (SET_DEST (XVECEXP (dest, 0, i)), x);
1109 else
1110 (*fun) (dest, x);
1112 else if (GET_CODE (x) == PARALLEL)
1114 register int i;
1115 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
1117 register rtx y = XVECEXP (x, 0, i);
1118 if (GET_CODE (y) == SET || GET_CODE (y) == CLOBBER)
1120 register rtx dest = SET_DEST (y);
1121 while ((GET_CODE (dest) == SUBREG
1122 && (GET_CODE (SUBREG_REG (dest)) != REG
1123 || (REGNO (SUBREG_REG (dest))
1124 >= FIRST_PSEUDO_REGISTER)))
1125 || GET_CODE (dest) == ZERO_EXTRACT
1126 || GET_CODE (dest) == SIGN_EXTRACT
1127 || GET_CODE (dest) == STRICT_LOW_PART)
1128 dest = XEXP (dest, 0);
1129 if (GET_CODE (dest) == PARALLEL
1130 && GET_MODE (dest) == BLKmode)
1132 register int i;
1133 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
1134 (*fun) (SET_DEST (XVECEXP (dest, 0, i)), y);
1136 else
1137 (*fun) (dest, y);
1143 /* Return nonzero if X's old contents don't survive after INSN.
1144 This will be true if X is (cc0) or if X is a register and
1145 X dies in INSN or because INSN entirely sets X.
1147 "Entirely set" means set directly and not through a SUBREG,
1148 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1149 Likewise, REG_INC does not count.
1151 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1152 but for this use that makes no difference, since regs don't overlap
1153 during their lifetimes. Therefore, this function may be used
1154 at any time after deaths have been computed (in flow.c).
1156 If REG is a hard reg that occupies multiple machine registers, this
1157 function will only return 1 if each of those registers will be replaced
1158 by INSN. */
1161 dead_or_set_p (insn, x)
1162 rtx insn;
1163 rtx x;
1165 register int regno, last_regno;
1166 register int i;
1168 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1169 if (GET_CODE (x) == CC0)
1170 return 1;
1172 if (GET_CODE (x) != REG)
1173 abort ();
1175 regno = REGNO (x);
1176 last_regno = (regno >= FIRST_PSEUDO_REGISTER ? regno
1177 : regno + HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1);
1179 for (i = regno; i <= last_regno; i++)
1180 if (! dead_or_set_regno_p (insn, i))
1181 return 0;
1183 return 1;
1186 /* Utility function for dead_or_set_p to check an individual register. Also
1187 called from flow.c. */
1190 dead_or_set_regno_p (insn, test_regno)
1191 rtx insn;
1192 int test_regno;
1194 int regno, endregno;
1195 rtx link;
1197 /* REG_READ notes are not normally maintained after reload, so we
1198 ignore them if the are invalid. */
1199 if (! reload_completed
1200 #ifdef PRESERVE_DEATH_INFO_REGNO_P
1201 || PRESERVE_DEATH_INFO_REGNO_P (test_regno)
1202 #endif
1205 /* See if there is a death note for something that includes
1206 TEST_REGNO. */
1207 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1209 if (REG_NOTE_KIND (link) != REG_DEAD
1210 || GET_CODE (XEXP (link, 0)) != REG)
1211 continue;
1213 regno = REGNO (XEXP (link, 0));
1214 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1215 : regno + HARD_REGNO_NREGS (regno,
1216 GET_MODE (XEXP (link, 0))));
1218 if (test_regno >= regno && test_regno < endregno)
1219 return 1;
1223 if (GET_CODE (insn) == CALL_INSN
1224 && find_regno_fusage (insn, CLOBBER, test_regno))
1225 return 1;
1227 if (GET_CODE (PATTERN (insn)) == SET)
1229 rtx dest = SET_DEST (PATTERN (insn));
1231 /* A value is totally replaced if it is the destination or the
1232 destination is a SUBREG of REGNO that does not change the number of
1233 words in it. */
1234 if (GET_CODE (dest) == SUBREG
1235 && (((GET_MODE_SIZE (GET_MODE (dest))
1236 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1237 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1238 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1239 dest = SUBREG_REG (dest);
1241 if (GET_CODE (dest) != REG)
1242 return 0;
1244 regno = REGNO (dest);
1245 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1246 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1248 return (test_regno >= regno && test_regno < endregno);
1250 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1252 register int i;
1254 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
1256 rtx body = XVECEXP (PATTERN (insn), 0, i);
1258 if (GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1260 rtx dest = SET_DEST (body);
1262 if (GET_CODE (dest) == SUBREG
1263 && (((GET_MODE_SIZE (GET_MODE (dest))
1264 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1265 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1266 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1267 dest = SUBREG_REG (dest);
1269 if (GET_CODE (dest) != REG)
1270 continue;
1272 regno = REGNO (dest);
1273 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1274 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1276 if (test_regno >= regno && test_regno < endregno)
1277 return 1;
1282 return 0;
1285 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1286 If DATUM is nonzero, look for one whose datum is DATUM. */
1289 find_reg_note (insn, kind, datum)
1290 rtx insn;
1291 enum reg_note kind;
1292 rtx datum;
1294 register rtx link;
1296 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1297 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
1298 return 0;
1300 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1301 if (REG_NOTE_KIND (link) == kind
1302 && (datum == 0 || datum == XEXP (link, 0)))
1303 return link;
1304 return 0;
1307 /* Return the reg-note of kind KIND in insn INSN which applies to register
1308 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1309 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1310 it might be the case that the note overlaps REGNO. */
1313 find_regno_note (insn, kind, regno)
1314 rtx insn;
1315 enum reg_note kind;
1316 int regno;
1318 register rtx link;
1320 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1321 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
1322 return 0;
1324 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1325 if (REG_NOTE_KIND (link) == kind
1326 /* Verify that it is a register, so that scratch and MEM won't cause a
1327 problem here. */
1328 && GET_CODE (XEXP (link, 0)) == REG
1329 && REGNO (XEXP (link, 0)) <= regno
1330 && ((REGNO (XEXP (link, 0))
1331 + (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
1332 : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
1333 GET_MODE (XEXP (link, 0)))))
1334 > regno))
1335 return link;
1336 return 0;
1339 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1340 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1343 find_reg_fusage (insn, code, datum)
1344 rtx insn;
1345 enum rtx_code code;
1346 rtx datum;
1348 /* If it's not a CALL_INSN, it can't possibly have a
1349 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1350 if (GET_CODE (insn) != CALL_INSN)
1351 return 0;
1353 if (! datum)
1354 abort();
1356 if (GET_CODE (datum) != REG)
1358 register rtx link;
1360 for (link = CALL_INSN_FUNCTION_USAGE (insn);
1361 link;
1362 link = XEXP (link, 1))
1363 if (GET_CODE (XEXP (link, 0)) == code
1364 && rtx_equal_p (datum, SET_DEST (XEXP (link, 0))))
1365 return 1;
1367 else
1369 register int regno = REGNO (datum);
1371 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1372 to pseudo registers, so don't bother checking. */
1374 if (regno < FIRST_PSEUDO_REGISTER)
1376 int end_regno = regno + HARD_REGNO_NREGS (regno, GET_MODE (datum));
1377 int i;
1379 for (i = regno; i < end_regno; i++)
1380 if (find_regno_fusage (insn, code, i))
1381 return 1;
1385 return 0;
1388 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1389 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1392 find_regno_fusage (insn, code, regno)
1393 rtx insn;
1394 enum rtx_code code;
1395 int regno;
1397 register rtx link;
1399 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1400 to pseudo registers, so don't bother checking. */
1402 if (regno >= FIRST_PSEUDO_REGISTER
1403 || GET_CODE (insn) != CALL_INSN )
1404 return 0;
1406 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1408 register int regnote;
1409 register rtx op;
1411 if (GET_CODE (op = XEXP (link, 0)) == code
1412 && GET_CODE (SET_DEST (op)) == REG
1413 && (regnote = REGNO (SET_DEST (op))) <= regno
1414 && regnote
1415 + HARD_REGNO_NREGS (regnote, GET_MODE (SET_DEST (op)))
1416 > regno)
1417 return 1;
1420 return 0;
1423 /* Remove register note NOTE from the REG_NOTES of INSN. */
1425 void
1426 remove_note (insn, note)
1427 register rtx note;
1428 register rtx insn;
1430 register rtx link;
1432 if (REG_NOTES (insn) == note)
1434 REG_NOTES (insn) = XEXP (note, 1);
1435 return;
1438 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1439 if (XEXP (link, 1) == note)
1441 XEXP (link, 1) = XEXP (note, 1);
1442 return;
1445 abort ();
1448 /* Nonzero if X contains any volatile instructions. These are instructions
1449 which may cause unpredictable machine state instructions, and thus no
1450 instructions should be moved or combined across them. This includes
1451 only volatile asms and UNSPEC_VOLATILE instructions. */
1454 volatile_insn_p (x)
1455 rtx x;
1457 register RTX_CODE code;
1459 code = GET_CODE (x);
1460 switch (code)
1462 case LABEL_REF:
1463 case SYMBOL_REF:
1464 case CONST_INT:
1465 case CONST:
1466 case CONST_DOUBLE:
1467 case CC0:
1468 case PC:
1469 case REG:
1470 case SCRATCH:
1471 case CLOBBER:
1472 case ASM_INPUT:
1473 case ADDR_VEC:
1474 case ADDR_DIFF_VEC:
1475 case CALL:
1476 case MEM:
1477 return 0;
1479 case UNSPEC_VOLATILE:
1480 /* case TRAP_IF: This isn't clear yet. */
1481 return 1;
1483 case ASM_OPERANDS:
1484 if (MEM_VOLATILE_P (x))
1485 return 1;
1487 default:
1488 break;
1491 /* Recursively scan the operands of this expression. */
1494 register char *fmt = GET_RTX_FORMAT (code);
1495 register int i;
1497 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1499 if (fmt[i] == 'e')
1501 if (volatile_insn_p (XEXP (x, i)))
1502 return 1;
1504 if (fmt[i] == 'E')
1506 register int j;
1507 for (j = 0; j < XVECLEN (x, i); j++)
1508 if (volatile_insn_p (XVECEXP (x, i, j)))
1509 return 1;
1513 return 0;
1516 /* Nonzero if X contains any volatile memory references
1517 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1520 volatile_refs_p (x)
1521 rtx x;
1523 register RTX_CODE code;
1525 code = GET_CODE (x);
1526 switch (code)
1528 case LABEL_REF:
1529 case SYMBOL_REF:
1530 case CONST_INT:
1531 case CONST:
1532 case CONST_DOUBLE:
1533 case CC0:
1534 case PC:
1535 case REG:
1536 case SCRATCH:
1537 case CLOBBER:
1538 case ASM_INPUT:
1539 case ADDR_VEC:
1540 case ADDR_DIFF_VEC:
1541 return 0;
1543 case CALL:
1544 case UNSPEC_VOLATILE:
1545 /* case TRAP_IF: This isn't clear yet. */
1546 return 1;
1548 case MEM:
1549 case ASM_OPERANDS:
1550 if (MEM_VOLATILE_P (x))
1551 return 1;
1553 default:
1554 break;
1557 /* Recursively scan the operands of this expression. */
1560 register char *fmt = GET_RTX_FORMAT (code);
1561 register int i;
1563 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1565 if (fmt[i] == 'e')
1567 if (volatile_refs_p (XEXP (x, i)))
1568 return 1;
1570 if (fmt[i] == 'E')
1572 register int j;
1573 for (j = 0; j < XVECLEN (x, i); j++)
1574 if (volatile_refs_p (XVECEXP (x, i, j)))
1575 return 1;
1579 return 0;
1582 /* Similar to above, except that it also rejects register pre- and post-
1583 incrementing. */
1586 side_effects_p (x)
1587 rtx x;
1589 register RTX_CODE code;
1591 code = GET_CODE (x);
1592 switch (code)
1594 case LABEL_REF:
1595 case SYMBOL_REF:
1596 case CONST_INT:
1597 case CONST:
1598 case CONST_DOUBLE:
1599 case CC0:
1600 case PC:
1601 case REG:
1602 case SCRATCH:
1603 case ASM_INPUT:
1604 case ADDR_VEC:
1605 case ADDR_DIFF_VEC:
1606 return 0;
1608 case CLOBBER:
1609 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1610 when some combination can't be done. If we see one, don't think
1611 that we can simplify the expression. */
1612 return (GET_MODE (x) != VOIDmode);
1614 case PRE_INC:
1615 case PRE_DEC:
1616 case POST_INC:
1617 case POST_DEC:
1618 case CALL:
1619 case UNSPEC_VOLATILE:
1620 /* case TRAP_IF: This isn't clear yet. */
1621 return 1;
1623 case MEM:
1624 case ASM_OPERANDS:
1625 if (MEM_VOLATILE_P (x))
1626 return 1;
1628 default:
1629 break;
1632 /* Recursively scan the operands of this expression. */
1635 register char *fmt = GET_RTX_FORMAT (code);
1636 register int i;
1638 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1640 if (fmt[i] == 'e')
1642 if (side_effects_p (XEXP (x, i)))
1643 return 1;
1645 if (fmt[i] == 'E')
1647 register int j;
1648 for (j = 0; j < XVECLEN (x, i); j++)
1649 if (side_effects_p (XVECEXP (x, i, j)))
1650 return 1;
1654 return 0;
1657 /* Return nonzero if evaluating rtx X might cause a trap. */
1660 may_trap_p (x)
1661 rtx x;
1663 int i;
1664 enum rtx_code code;
1665 char *fmt;
1667 if (x == 0)
1668 return 0;
1669 code = GET_CODE (x);
1670 switch (code)
1672 /* Handle these cases quickly. */
1673 case CONST_INT:
1674 case CONST_DOUBLE:
1675 case SYMBOL_REF:
1676 case LABEL_REF:
1677 case CONST:
1678 case PC:
1679 case CC0:
1680 case REG:
1681 case SCRATCH:
1682 return 0;
1684 /* Conditional trap can trap! */
1685 case UNSPEC_VOLATILE:
1686 case TRAP_IF:
1687 return 1;
1689 /* Memory ref can trap unless it's a static var or a stack slot. */
1690 case MEM:
1691 return rtx_addr_can_trap_p (XEXP (x, 0));
1693 /* Division by a non-constant might trap. */
1694 case DIV:
1695 case MOD:
1696 case UDIV:
1697 case UMOD:
1698 if (! CONSTANT_P (XEXP (x, 1))
1699 || GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1700 return 1;
1701 /* This was const0_rtx, but by not using that,
1702 we can link this file into other programs. */
1703 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
1704 return 1;
1705 break;
1707 case EXPR_LIST:
1708 /* An EXPR_LIST is used to represent a function call. This
1709 certainly may trap. */
1710 return 1;
1712 default:
1713 /* Any floating arithmetic may trap. */
1714 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1715 return 1;
1718 fmt = GET_RTX_FORMAT (code);
1719 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1721 if (fmt[i] == 'e')
1723 if (may_trap_p (XEXP (x, i)))
1724 return 1;
1726 else if (fmt[i] == 'E')
1728 register int j;
1729 for (j = 0; j < XVECLEN (x, i); j++)
1730 if (may_trap_p (XVECEXP (x, i, j)))
1731 return 1;
1734 return 0;
1737 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1738 i.e., an inequality. */
1741 inequality_comparisons_p (x)
1742 rtx x;
1744 register char *fmt;
1745 register int len, i;
1746 register enum rtx_code code = GET_CODE (x);
1748 switch (code)
1750 case REG:
1751 case SCRATCH:
1752 case PC:
1753 case CC0:
1754 case CONST_INT:
1755 case CONST_DOUBLE:
1756 case CONST:
1757 case LABEL_REF:
1758 case SYMBOL_REF:
1759 return 0;
1761 case LT:
1762 case LTU:
1763 case GT:
1764 case GTU:
1765 case LE:
1766 case LEU:
1767 case GE:
1768 case GEU:
1769 return 1;
1771 default:
1772 break;
1775 len = GET_RTX_LENGTH (code);
1776 fmt = GET_RTX_FORMAT (code);
1778 for (i = 0; i < len; i++)
1780 if (fmt[i] == 'e')
1782 if (inequality_comparisons_p (XEXP (x, i)))
1783 return 1;
1785 else if (fmt[i] == 'E')
1787 register int j;
1788 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1789 if (inequality_comparisons_p (XVECEXP (x, i, j)))
1790 return 1;
1794 return 0;
1797 /* Replace any occurrence of FROM in X with TO. The function does
1798 not enter into CONST_DOUBLE for the replace.
1800 Note that copying is not done so X must not be shared unless all copies
1801 are to be modified. */
1804 replace_rtx (x, from, to)
1805 rtx x, from, to;
1807 register int i, j;
1808 register char *fmt;
1810 /* The following prevents loops occurrence when we change MEM in
1811 CONST_DOUBLE onto the same CONST_DOUBLE. */
1812 if (x != 0 && GET_CODE (x) == CONST_DOUBLE)
1813 return x;
1815 if (x == from)
1816 return to;
1818 /* Allow this function to make replacements in EXPR_LISTs. */
1819 if (x == 0)
1820 return 0;
1822 fmt = GET_RTX_FORMAT (GET_CODE (x));
1823 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
1825 if (fmt[i] == 'e')
1826 XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
1827 else if (fmt[i] == 'E')
1828 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1829 XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
1832 return x;
1835 /* Throughout the rtx X, replace many registers according to REG_MAP.
1836 Return the replacement for X (which may be X with altered contents).
1837 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
1838 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
1840 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
1841 should not be mapped to pseudos or vice versa since validate_change
1842 is not called.
1844 If REPLACE_DEST is 1, replacements are also done in destinations;
1845 otherwise, only sources are replaced. */
1848 replace_regs (x, reg_map, nregs, replace_dest)
1849 rtx x;
1850 rtx *reg_map;
1851 int nregs;
1852 int replace_dest;
1854 register enum rtx_code code;
1855 register int i;
1856 register char *fmt;
1858 if (x == 0)
1859 return x;
1861 code = GET_CODE (x);
1862 switch (code)
1864 case SCRATCH:
1865 case PC:
1866 case CC0:
1867 case CONST_INT:
1868 case CONST_DOUBLE:
1869 case CONST:
1870 case SYMBOL_REF:
1871 case LABEL_REF:
1872 return x;
1874 case REG:
1875 /* Verify that the register has an entry before trying to access it. */
1876 if (REGNO (x) < nregs && reg_map[REGNO (x)] != 0)
1878 /* SUBREGs can't be shared. Always return a copy to ensure that if
1879 this replacement occurs more than once then each instance will
1880 get distinct rtx. */
1881 if (GET_CODE (reg_map[REGNO (x)]) == SUBREG)
1882 return copy_rtx (reg_map[REGNO (x)]);
1883 return reg_map[REGNO (x)];
1885 return x;
1887 case SUBREG:
1888 /* Prevent making nested SUBREGs. */
1889 if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < nregs
1890 && reg_map[REGNO (SUBREG_REG (x))] != 0
1891 && GET_CODE (reg_map[REGNO (SUBREG_REG (x))]) == SUBREG)
1893 rtx map_val = reg_map[REGNO (SUBREG_REG (x))];
1894 rtx map_inner = SUBREG_REG (map_val);
1896 if (GET_MODE (x) == GET_MODE (map_inner))
1897 return map_inner;
1898 else
1900 /* We cannot call gen_rtx here since we may be linked with
1901 genattrtab.c. */
1902 /* Let's try clobbering the incoming SUBREG and see
1903 if this is really safe. */
1904 SUBREG_REG (x) = map_inner;
1905 SUBREG_WORD (x) += SUBREG_WORD (map_val);
1906 return x;
1907 #if 0
1908 rtx new = rtx_alloc (SUBREG);
1909 PUT_MODE (new, GET_MODE (x));
1910 SUBREG_REG (new) = map_inner;
1911 SUBREG_WORD (new) = SUBREG_WORD (x) + SUBREG_WORD (map_val);
1912 #endif
1915 break;
1917 case SET:
1918 if (replace_dest)
1919 SET_DEST (x) = replace_regs (SET_DEST (x), reg_map, nregs, 0);
1921 else if (GET_CODE (SET_DEST (x)) == MEM
1922 || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
1923 /* Even if we are not to replace destinations, replace register if it
1924 is CONTAINED in destination (destination is memory or
1925 STRICT_LOW_PART). */
1926 XEXP (SET_DEST (x), 0) = replace_regs (XEXP (SET_DEST (x), 0),
1927 reg_map, nregs, 0);
1928 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
1929 /* Similarly, for ZERO_EXTRACT we replace all operands. */
1930 break;
1932 SET_SRC (x) = replace_regs (SET_SRC (x), reg_map, nregs, 0);
1933 return x;
1935 default:
1936 break;
1939 fmt = GET_RTX_FORMAT (code);
1940 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1942 if (fmt[i] == 'e')
1943 XEXP (x, i) = replace_regs (XEXP (x, i), reg_map, nregs, replace_dest);
1944 if (fmt[i] == 'E')
1946 register int j;
1947 for (j = 0; j < XVECLEN (x, i); j++)
1948 XVECEXP (x, i, j) = replace_regs (XVECEXP (x, i, j), reg_map,
1949 nregs, replace_dest);
1952 return x;
1955 /* Return 1 if X, the SRC_SRC of SET of (pc) contain a REG or MEM that is
1956 not in the constant pool and not in the condition of an IF_THEN_ELSE. */
1958 static int
1959 jmp_uses_reg_or_mem (x)
1960 rtx x;
1962 enum rtx_code code = GET_CODE (x);
1963 int i, j;
1964 char *fmt;
1966 switch (code)
1968 case CONST:
1969 case LABEL_REF:
1970 case PC:
1971 return 0;
1973 case REG:
1974 return 1;
1976 case MEM:
1977 return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
1978 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
1980 case IF_THEN_ELSE:
1981 return (jmp_uses_reg_or_mem (XEXP (x, 1))
1982 || jmp_uses_reg_or_mem (XEXP (x, 2)));
1984 case PLUS: case MINUS: case MULT:
1985 return (jmp_uses_reg_or_mem (XEXP (x, 0))
1986 || jmp_uses_reg_or_mem (XEXP (x, 1)));
1988 default:
1989 break;
1992 fmt = GET_RTX_FORMAT (code);
1993 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1995 if (fmt[i] == 'e'
1996 && jmp_uses_reg_or_mem (XEXP (x, i)))
1997 return 1;
1999 if (fmt[i] == 'E')
2000 for (j = 0; j < XVECLEN (x, i); j++)
2001 if (jmp_uses_reg_or_mem (XVECEXP (x, i, j)))
2002 return 1;
2005 return 0;
2008 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2010 Tablejumps and casesi insns are not considered indirect jumps;
2011 we can recognize them by a (use (lael_ref)). */
2014 computed_jump_p (insn)
2015 rtx insn;
2017 int i;
2018 if (GET_CODE (insn) == JUMP_INSN)
2020 rtx pat = PATTERN (insn);
2022 if (GET_CODE (pat) == PARALLEL)
2024 int len = XVECLEN (pat, 0);
2025 int has_use_labelref = 0;
2027 for (i = len - 1; i >= 0; i--)
2028 if (GET_CODE (XVECEXP (pat, 0, i)) == USE
2029 && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0))
2030 == LABEL_REF))
2031 has_use_labelref = 1;
2033 if (! has_use_labelref)
2034 for (i = len - 1; i >= 0; i--)
2035 if (GET_CODE (XVECEXP (pat, 0, i)) == SET
2036 && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
2037 && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i))))
2038 return 1;
2040 else if (GET_CODE (pat) == SET
2041 && SET_DEST (pat) == pc_rtx
2042 && jmp_uses_reg_or_mem (SET_SRC (pat)))
2043 return 1;
2045 return 0;
2048 /* Traverse X via depth-first search, calling F for each
2049 sub-expression (including X itself). F is also passed the DATA.
2050 If F returns -1, do not traverse sub-expressions, but continue
2051 traversing the rest of the tree. If F ever returns any other
2052 non-zero value, stop the traversal, and return the value returned
2053 by F. Otherwise, return 0. This function does not traverse inside
2054 tree structure that contains RTX_EXPRs, or into sub-expressions
2055 whose format code is `0' since it is not known whether or not those
2056 codes are actually RTL.
2058 This routine is very general, and could (should?) be used to
2059 implement many of the other routines in this file. */
2061 int for_each_rtx (x, f, data)
2062 rtx* x;
2063 rtx_function f;
2064 void* data;
2066 int result;
2067 int length;
2068 char* format;
2069 int i;
2071 /* Call F on X. */
2072 result = (*f)(x, data);
2073 if (result == -1)
2074 /* Do not traverse sub-expressions. */
2075 return 0;
2076 else if (result != 0)
2077 /* Stop the traversal. */
2078 return result;
2080 if (*x == NULL_RTX)
2081 /* There are no sub-expressions. */
2082 return 0;
2084 length = GET_RTX_LENGTH (GET_CODE (*x));
2085 format = GET_RTX_FORMAT (GET_CODE (*x));
2087 for (i = 0; i < length; ++i)
2089 switch (format[i])
2091 case 'e':
2092 result = for_each_rtx (&XEXP (*x, i), f, data);
2093 if (result != 0)
2094 return result;
2095 break;
2097 case 'V':
2098 case 'E':
2099 if (XVEC (*x, i) != 0)
2101 int j;
2102 for (j = 0; j < XVECLEN (*x, i); ++j)
2104 result = for_each_rtx (&XVECEXP (*x, i, j), f, data);
2105 if (result != 0)
2106 return result;
2109 break;
2111 default:
2112 /* Nothing to do. */
2113 break;
2118 return 0;