Please let stdio.h define sys_errlist and sys_nerr,
[unix-history] / gnu / usr.bin / cc / common / rtlanal.c
CommitLineData
9bf86ebb
PR
1/* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 1988, 1991, 1992 Free Software Foundation, Inc.
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include "config.h"
22#include "rtl.h"
23
24void note_stores ();
25int reg_set_p ();
26
27/* Bit flags that specify the machine subtype we are compiling for.
28 Bits are tested using macros TARGET_... defined in the tm.h file
29 and set by `-m...' switches. Must be defined in rtlanal.c. */
30
31int target_flags;
32\f
33/* Return 1 if the value of X is unstable
34 (would be different at a different point in the program).
35 The frame pointer, arg pointer, etc. are considered stable
36 (within one function) and so is anything marked `unchanging'. */
37
38int
39rtx_unstable_p (x)
40 rtx x;
41{
42 register RTX_CODE code = GET_CODE (x);
43 register int i;
44 register char *fmt;
45
46 if (code == MEM)
47 return ! RTX_UNCHANGING_P (x);
48
49 if (code == QUEUED)
50 return 1;
51
52 if (code == CONST || code == CONST_INT)
53 return 0;
54
55 if (code == REG)
56 return ! (REGNO (x) == FRAME_POINTER_REGNUM
57 || REGNO (x) == ARG_POINTER_REGNUM
58 || RTX_UNCHANGING_P (x));
59
60 fmt = GET_RTX_FORMAT (code);
61 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
62 if (fmt[i] == 'e')
63 if (rtx_unstable_p (XEXP (x, i)))
64 return 1;
65 return 0;
66}
67
68/* Return 1 if X has a value that can vary even between two
69 executions of the program. 0 means X can be compared reliably
70 against certain constants or near-constants.
71 The frame pointer and the arg pointer are considered constant. */
72
73int
74rtx_varies_p (x)
75 rtx x;
76{
77 register RTX_CODE code = GET_CODE (x);
78 register int i;
79 register char *fmt;
80
81 switch (code)
82 {
83 case MEM:
84 case QUEUED:
85 return 1;
86
87 case CONST:
88 case CONST_INT:
89 case CONST_DOUBLE:
90 case SYMBOL_REF:
91 case LABEL_REF:
92 return 0;
93
94 case REG:
95 /* Note that we have to test for the actual rtx used for the frame
96 and arg pointers and not just the register number in case we have
97 eliminated the frame and/or arg pointer and are using it
98 for pseudos. */
99 return ! (x == frame_pointer_rtx || x == arg_pointer_rtx);
100
101 case LO_SUM:
102 /* The operand 0 of a LO_SUM is considered constant
103 (in fact is it related specifically to operand 1). */
104 return rtx_varies_p (XEXP (x, 1));
105 }
106
107 fmt = GET_RTX_FORMAT (code);
108 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
109 if (fmt[i] == 'e')
110 if (rtx_varies_p (XEXP (x, i)))
111 return 1;
112 return 0;
113}
114
115/* Return 0 if the use of X as an address in a MEM can cause a trap. */
116
117int
118rtx_addr_can_trap_p (x)
119 register rtx x;
120{
121 register enum rtx_code code = GET_CODE (x);
122
123 switch (code)
124 {
125 case SYMBOL_REF:
126 case LABEL_REF:
127 /* SYMBOL_REF is problematic due to the possible presence of
128 a #pragma weak, but to say that loads from symbols can trap is
129 *very* costly. It's not at all clear what's best here. For
130 now, we ignore the impact of #pragma weak. */
131 return 0;
132
133 case REG:
134 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
135 return ! (x == frame_pointer_rtx || x == stack_pointer_rtx
136 || x == arg_pointer_rtx);
137
138 case CONST:
139 return rtx_addr_can_trap_p (XEXP (x, 0));
140
141 case PLUS:
142 /* An address is assumed not to trap if it is an address that can't
143 trap plus a constant integer. */
144 return (rtx_addr_can_trap_p (XEXP (x, 0))
145 || GET_CODE (XEXP (x, 1)) != CONST_INT);
146
147 case LO_SUM:
148 return rtx_addr_can_trap_p (XEXP (x, 1));
149 }
150
151 /* If it isn't one of the case above, it can cause a trap. */
152 return 1;
153}
154
155/* Return 1 if X refers to a memory location whose address
156 cannot be compared reliably with constant addresses,
157 or if X refers to a BLKmode memory object. */
158
159int
160rtx_addr_varies_p (x)
161 rtx x;
162{
163 register enum rtx_code code;
164 register int i;
165 register char *fmt;
166
167 if (x == 0)
168 return 0;
169
170 code = GET_CODE (x);
171 if (code == MEM)
172 return GET_MODE (x) == BLKmode || rtx_varies_p (XEXP (x, 0));
173
174 fmt = GET_RTX_FORMAT (code);
175 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
176 if (fmt[i] == 'e')
177 if (rtx_addr_varies_p (XEXP (x, i)))
178 return 1;
179 return 0;
180}
181\f
182/* Return the value of the integer term in X, if one is apparent;
183 otherwise return 0.
184 Only obvious integer terms are detected.
185 This is used in cse.c with the `related_value' field.*/
186
187HOST_WIDE_INT
188get_integer_term (x)
189 rtx x;
190{
191 if (GET_CODE (x) == CONST)
192 x = XEXP (x, 0);
193
194 if (GET_CODE (x) == MINUS
195 && GET_CODE (XEXP (x, 1)) == CONST_INT)
196 return - INTVAL (XEXP (x, 1));
197 if (GET_CODE (x) == PLUS
198 && GET_CODE (XEXP (x, 1)) == CONST_INT)
199 return INTVAL (XEXP (x, 1));
200 return 0;
201}
202
203/* If X is a constant, return the value sans apparent integer term;
204 otherwise return 0.
205 Only obvious integer terms are detected. */
206
207rtx
208get_related_value (x)
209 rtx x;
210{
211 if (GET_CODE (x) != CONST)
212 return 0;
213 x = XEXP (x, 0);
214 if (GET_CODE (x) == PLUS
215 && GET_CODE (XEXP (x, 1)) == CONST_INT)
216 return XEXP (x, 0);
217 else if (GET_CODE (x) == MINUS
218 && GET_CODE (XEXP (x, 1)) == CONST_INT)
219 return XEXP (x, 0);
220 return 0;
221}
222\f
223/* Nonzero if register REG appears somewhere within IN.
224 Also works if REG is not a register; in this case it checks
225 for a subexpression of IN that is Lisp "equal" to REG. */
226
227int
228reg_mentioned_p (reg, in)
229 register rtx reg, in;
230{
231 register char *fmt;
232 register int i;
233 register enum rtx_code code;
234
235 if (in == 0)
236 return 0;
237
238 if (reg == in)
239 return 1;
240
241 if (GET_CODE (in) == LABEL_REF)
242 return reg == XEXP (in, 0);
243
244 code = GET_CODE (in);
245
246 switch (code)
247 {
248 /* Compare registers by number. */
249 case REG:
250 return GET_CODE (reg) == REG && REGNO (in) == REGNO (reg);
251
252 /* These codes have no constituent expressions
253 and are unique. */
254 case SCRATCH:
255 case CC0:
256 case PC:
257 return 0;
258
259 case CONST_INT:
260 return GET_CODE (reg) == CONST_INT && INTVAL (in) == INTVAL (reg);
261
262 case CONST_DOUBLE:
263 /* These are kept unique for a given value. */
264 return 0;
265 }
266
267 if (GET_CODE (reg) == code && rtx_equal_p (reg, in))
268 return 1;
269
270 fmt = GET_RTX_FORMAT (code);
271
272 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
273 {
274 if (fmt[i] == 'E')
275 {
276 register int j;
277 for (j = XVECLEN (in, i) - 1; j >= 0; j--)
278 if (reg_mentioned_p (reg, XVECEXP (in, i, j)))
279 return 1;
280 }
281 else if (fmt[i] == 'e'
282 && reg_mentioned_p (reg, XEXP (in, i)))
283 return 1;
284 }
285 return 0;
286}
287\f
288/* Return 1 if in between BEG and END, exclusive of BEG and END, there is
289 no CODE_LABEL insn. */
290
291int
292no_labels_between_p (beg, end)
293 rtx beg, end;
294{
295 register rtx p;
296 for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
297 if (GET_CODE (p) == CODE_LABEL)
298 return 0;
299 return 1;
300}
301
302/* Nonzero if register REG is used in an insn between
303 FROM_INSN and TO_INSN (exclusive of those two). */
304
305int
306reg_used_between_p (reg, from_insn, to_insn)
307 rtx reg, from_insn, to_insn;
308{
309 register rtx insn;
310
311 if (from_insn == to_insn)
312 return 0;
313
314 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
315 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
316 && reg_overlap_mentioned_p (reg, PATTERN (insn)))
317 return 1;
318 return 0;
319}
320\f
321/* Nonzero if the old value of X, a register, is referenced in BODY. If X
322 is entirely replaced by a new value and the only use is as a SET_DEST,
323 we do not consider it a reference. */
324
325int
326reg_referenced_p (x, body)
327 rtx x;
328 rtx body;
329{
330 int i;
331
332 switch (GET_CODE (body))
333 {
334 case SET:
335 if (reg_overlap_mentioned_p (x, SET_SRC (body)))
336 return 1;
337
338 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
339 of a REG that occupies all of the REG, the insn references X if
340 it is mentioned in the destination. */
341 if (GET_CODE (SET_DEST (body)) != CC0
342 && GET_CODE (SET_DEST (body)) != PC
343 && GET_CODE (SET_DEST (body)) != REG
344 && ! (GET_CODE (SET_DEST (body)) == SUBREG
345 && GET_CODE (SUBREG_REG (SET_DEST (body))) == REG
346 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body))))
347 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
348 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body)))
349 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
350 && reg_overlap_mentioned_p (x, SET_DEST (body)))
351 return 1;
352 break;
353
354 case ASM_OPERANDS:
355 for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
356 if (reg_overlap_mentioned_p (x, ASM_OPERANDS_INPUT (body, i)))
357 return 1;
358 break;
359
360 case CALL:
361 case USE:
362 return reg_overlap_mentioned_p (x, body);
363
364 case TRAP_IF:
365 return reg_overlap_mentioned_p (x, TRAP_CONDITION (body));
366
367 case UNSPEC:
368 case UNSPEC_VOLATILE:
369 case PARALLEL:
370 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
371 if (reg_referenced_p (x, XVECEXP (body, 0, i)))
372 return 1;
373 break;
374 }
375
376 return 0;
377}
378
379/* Nonzero if register REG is referenced in an insn between
380 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
381 not count. */
382
383int
384reg_referenced_between_p (reg, from_insn, to_insn)
385 rtx reg, from_insn, to_insn;
386{
387 register rtx insn;
388
389 if (from_insn == to_insn)
390 return 0;
391
392 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
393 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
394 && reg_referenced_p (reg, PATTERN (insn)))
395 return 1;
396 return 0;
397}
398\f
399/* Nonzero if register REG is set or clobbered in an insn between
400 FROM_INSN and TO_INSN (exclusive of those two). */
401
402int
403reg_set_between_p (reg, from_insn, to_insn)
404 rtx reg, from_insn, to_insn;
405{
406 register rtx insn;
407
408 if (from_insn == to_insn)
409 return 0;
410
411 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
412 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
413 && reg_set_p (reg, insn))
414 return 1;
415 return 0;
416}
417
418/* Internals of reg_set_between_p. */
419
420static rtx reg_set_reg;
421static int reg_set_flag;
422
423void
424reg_set_p_1 (x)
425 rtx x;
426{
427 /* We don't want to return 1 if X is a MEM that contains a register
428 within REG_SET_REG. */
429
430 if ((GET_CODE (x) != MEM)
431 && reg_overlap_mentioned_p (reg_set_reg, x))
432 reg_set_flag = 1;
433}
434
435int
436reg_set_p (reg, insn)
437 rtx reg, insn;
438{
439 rtx body = insn;
440
441 /* We can be passed an insn or part of one. If we are passed an insn,
442 check if a side-effect of the insn clobbers REG. */
443 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
444 {
445 if (FIND_REG_INC_NOTE (insn, reg)
446 || (GET_CODE (insn) == CALL_INSN
447 /* We'd like to test call_used_regs here, but rtlanal.c can't
448 reference that variable due to its use in genattrtab. So
449 we'll just be more conservative. */
450 && ((GET_CODE (reg) == REG
451 && REGNO (reg) < FIRST_PSEUDO_REGISTER)
452 || GET_CODE (reg) == MEM)))
453 return 1;
454
455 body = PATTERN (insn);
456 }
457
458 reg_set_reg = reg;
459 reg_set_flag = 0;
460 note_stores (body, reg_set_p_1);
461 return reg_set_flag;
462}
463
464/* Similar to reg_set_between_p, but check all registers in X. Return 0
465 only if none of them are modified between START and END. Return 1 if
466 X contains a MEM; this routine does not perform any memory aliasing. */
467
468int
469modified_between_p (x, start, end)
470 rtx x;
471 rtx start, end;
472{
473 enum rtx_code code = GET_CODE (x);
474 char *fmt;
475 int i;
476
477 switch (code)
478 {
479 case CONST_INT:
480 case CONST_DOUBLE:
481 case CONST:
482 case SYMBOL_REF:
483 case LABEL_REF:
484 return 0;
485
486 case PC:
487 case CC0:
488 return 1;
489
490 case MEM:
491 /* If the memory is not constant, assume it is modified. If it is
492 constant, we still have to check the address. */
493 if (! RTX_UNCHANGING_P (x))
494 return 1;
495 break;
496
497 case REG:
498 return reg_set_between_p (x, start, end);
499 }
500
501 fmt = GET_RTX_FORMAT (code);
502 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
503 if (fmt[i] == 'e'
504 && modified_between_p (XEXP (x, i), start, end))
505 return 1;
506
507 return 0;
508}
509\f
510/* Given an INSN, return a SET expression if this insn has only a single SET.
511 It may also have CLOBBERs, USEs, or SET whose output
512 will not be used, which we ignore. */
513
514rtx
515single_set (insn)
516 rtx insn;
517{
518 rtx set;
519 int i;
520
521 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
522 return 0;
523
524 if (GET_CODE (PATTERN (insn)) == SET)
525 return PATTERN (insn);
526
527 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
528 {
529 for (i = 0, set = 0; i < XVECLEN (PATTERN (insn), 0); i++)
530 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET
531 && (! find_reg_note (insn, REG_UNUSED,
532 SET_DEST (XVECEXP (PATTERN (insn), 0, i)))
533 || side_effects_p (XVECEXP (PATTERN (insn), 0, i))))
534 {
535 if (set)
536 return 0;
537 else
538 set = XVECEXP (PATTERN (insn), 0, i);
539 }
540 return set;
541 }
542
543 return 0;
544}
545\f
546/* Return the last thing that X was assigned from before *PINSN. Verify that
547 the object is not modified up to VALID_TO. If it was, if we hit
548 a partial assignment to X, or hit a CODE_LABEL first, return X. If we
549 found an assignment, update *PINSN to point to it. */
550
551rtx
552find_last_value (x, pinsn, valid_to)
553 rtx x;
554 rtx *pinsn;
555 rtx valid_to;
556{
557 rtx p;
558
559 for (p = PREV_INSN (*pinsn); p && GET_CODE (p) != CODE_LABEL;
560 p = PREV_INSN (p))
561 if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
562 {
563 rtx set = single_set (p);
564 rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
565
566 if (set && rtx_equal_p (x, SET_DEST (set)))
567 {
568 rtx src = SET_SRC (set);
569
570 if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
571 src = XEXP (note, 0);
572
573 if (! modified_between_p (src, PREV_INSN (p), valid_to)
574 /* Reject hard registers because we don't usually want
575 to use them; we'd rather use a pseudo. */
576 && ! (GET_CODE (src) == REG
577 && REGNO (src) < FIRST_PSEUDO_REGISTER))
578 {
579 *pinsn = p;
580 return src;
581 }
582 }
583
584 /* If set in non-simple way, we don't have a value. */
585 if (reg_set_p (x, p))
586 break;
587 }
588
589 return x;
590}
591\f
592/* Return nonzero if register in range [REGNO, ENDREGNO)
593 appears either explicitly or implicitly in X
594 other than being stored into.
595
596 References contained within the substructure at LOC do not count.
597 LOC may be zero, meaning don't ignore anything. */
598
599int
600refers_to_regno_p (regno, endregno, x, loc)
601 int regno, endregno;
602 rtx x;
603 rtx *loc;
604{
605 register int i;
606 register RTX_CODE code;
607 register char *fmt;
608
609 repeat:
610 /* The contents of a REG_NONNEG note is always zero, so we must come here
611 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
612 if (x == 0)
613 return 0;
614
615 code = GET_CODE (x);
616
617 switch (code)
618 {
619 case REG:
620 i = REGNO (x);
621 return (endregno > i
622 && regno < i + (i < FIRST_PSEUDO_REGISTER
623 ? HARD_REGNO_NREGS (i, GET_MODE (x))
624 : 1));
625
626 case SUBREG:
627 /* If this is a SUBREG of a hard reg, we can see exactly which
628 registers are being modified. Otherwise, handle normally. */
629 if (GET_CODE (SUBREG_REG (x)) == REG
630 && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
631 {
632 int inner_regno = REGNO (SUBREG_REG (x)) + SUBREG_WORD (x);
633 int inner_endregno
634 = inner_regno + (inner_regno < FIRST_PSEUDO_REGISTER
635 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
636
637 return endregno > inner_regno && regno < inner_endregno;
638 }
639 break;
640
641 case CLOBBER:
642 case SET:
643 if (&SET_DEST (x) != loc
644 /* Note setting a SUBREG counts as referring to the REG it is in for
645 a pseudo but not for hard registers since we can
646 treat each word individually. */
647 && ((GET_CODE (SET_DEST (x)) == SUBREG
648 && loc != &SUBREG_REG (SET_DEST (x))
649 && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG
650 && REGNO (SUBREG_REG (SET_DEST (x))) >= FIRST_PSEUDO_REGISTER
651 && refers_to_regno_p (regno, endregno,
652 SUBREG_REG (SET_DEST (x)), loc))
653 || (GET_CODE (SET_DEST (x)) != REG
654 && refers_to_regno_p (regno, endregno, SET_DEST (x), loc))))
655 return 1;
656
657 if (code == CLOBBER || loc == &SET_SRC (x))
658 return 0;
659 x = SET_SRC (x);
660 goto repeat;
661 }
662
663 /* X does not match, so try its subexpressions. */
664
665 fmt = GET_RTX_FORMAT (code);
666 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
667 {
668 if (fmt[i] == 'e' && loc != &XEXP (x, i))
669 {
670 if (i == 0)
671 {
672 x = XEXP (x, 0);
673 goto repeat;
674 }
675 else
676 if (refers_to_regno_p (regno, endregno, XEXP (x, i), loc))
677 return 1;
678 }
679 else if (fmt[i] == 'E')
680 {
681 register int j;
682 for (j = XVECLEN (x, i) - 1; j >=0; j--)
683 if (loc != &XVECEXP (x, i, j)
684 && refers_to_regno_p (regno, endregno, XVECEXP (x, i, j), loc))
685 return 1;
686 }
687 }
688 return 0;
689}
690
691/* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
692 we check if any register number in X conflicts with the relevant register
693 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
694 contains a MEM (we don't bother checking for memory addresses that can't
695 conflict because we expect this to be a rare case. */
696
697int
698reg_overlap_mentioned_p (x, in)
699 rtx x, in;
700{
701 int regno, endregno;
702
703 if (GET_CODE (x) == SUBREG)
704 {
705 regno = REGNO (SUBREG_REG (x));
706 if (regno < FIRST_PSEUDO_REGISTER)
707 regno += SUBREG_WORD (x);
708 }
709 else if (GET_CODE (x) == REG)
710 regno = REGNO (x);
711 else if (CONSTANT_P (x))
712 return 0;
713 else if (GET_CODE (x) == MEM)
714 {
715 char *fmt;
716 int i;
717
718 if (GET_CODE (in) == MEM)
719 return 1;
720
721 fmt = GET_RTX_FORMAT (GET_CODE (in));
722
723 for (i = GET_RTX_LENGTH (GET_CODE (in)) - 1; i >= 0; i--)
724 if (fmt[i] == 'e' && reg_overlap_mentioned_p (x, XEXP (in, i)))
725 return 1;
726
727 return 0;
728 }
729 else if (GET_CODE (x) == SCRATCH || GET_CODE (x) == PC
730 || GET_CODE (x) == CC0)
731 return reg_mentioned_p (x, in);
732 else
733 abort ();
734
735 endregno = regno + (regno < FIRST_PSEUDO_REGISTER
736 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
737
738 return refers_to_regno_p (regno, endregno, in, NULL_PTR);
739}
740\f
741/* Used for communications between the next few functions. */
742
743static int reg_set_last_unknown;
744static rtx reg_set_last_value;
745static int reg_set_last_first_regno, reg_set_last_last_regno;
746
747/* Called via note_stores from reg_set_last. */
748
749static void
750reg_set_last_1 (x, pat)
751 rtx x;
752 rtx pat;
753{
754 int first, last;
755
756 /* If X is not a register, or is not one in the range we care
757 about, ignore. */
758 if (GET_CODE (x) != REG)
759 return;
760
761 first = REGNO (x);
762 last = first + (first < FIRST_PSEUDO_REGISTER
763 ? HARD_REGNO_NREGS (first, GET_MODE (x)) : 1);
764
765 if (first >= reg_set_last_last_regno
766 || last <= reg_set_last_first_regno)
767 return;
768
769 /* If this is a CLOBBER or is some complex LHS, or doesn't modify
770 exactly the registers we care about, show we don't know the value. */
771 if (GET_CODE (pat) == CLOBBER || SET_DEST (pat) != x
772 || first != reg_set_last_first_regno
773 || last != reg_set_last_last_regno)
774 reg_set_last_unknown = 1;
775 else
776 reg_set_last_value = SET_SRC (pat);
777}
778
779/* Return the last value to which REG was set prior to INSN. If we can't
780 find it easily, return 0.
781
782 We only return a REG, SUBREG, or constant because it is too hard to
783 check if a MEM remains unchanged. */
784
785rtx
786reg_set_last (x, insn)
787 rtx x;
788 rtx insn;
789{
790 rtx orig_insn = insn;
791
792 reg_set_last_first_regno = REGNO (x);
793
794 reg_set_last_last_regno
795 = reg_set_last_first_regno
796 + (reg_set_last_first_regno < FIRST_PSEUDO_REGISTER
797 ? HARD_REGNO_NREGS (reg_set_last_first_regno, GET_MODE (x)) : 1);
798
799 reg_set_last_unknown = 0;
800 reg_set_last_value = 0;
801
802 /* Scan backwards until reg_set_last_1 changed one of the above flags.
803 Stop when we reach a label or X is a hard reg and we reach a
804 CALL_INSN (if reg_set_last_last_regno is a hard reg).
805
806 If we find a set of X, ensure that its SET_SRC remains unchanged. */
807
808 /* We compare with <= here, because reg_set_last_last_regno
809 is actually the number of the first reg *not* in X. */
810 for (;
811 insn && GET_CODE (insn) != CODE_LABEL
812 && ! (GET_CODE (insn) == CALL_INSN
813 && reg_set_last_last_regno <= FIRST_PSEUDO_REGISTER);
814 insn = PREV_INSN (insn))
815 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
816 {
817 note_stores (PATTERN (insn), reg_set_last_1);
818 if (reg_set_last_unknown)
819 return 0;
820 else if (reg_set_last_value)
821 {
822 if (CONSTANT_P (reg_set_last_value)
823 || ((GET_CODE (reg_set_last_value) == REG
824 || GET_CODE (reg_set_last_value) == SUBREG)
825 && ! reg_set_between_p (reg_set_last_value,
826 NEXT_INSN (insn), orig_insn)))
827 return reg_set_last_value;
828 else
829 return 0;
830 }
831 }
832
833 return 0;
834}
835\f
836/* This is 1 until after reload pass. */
837int rtx_equal_function_value_matters;
838
839/* Return 1 if X and Y are identical-looking rtx's.
840 This is the Lisp function EQUAL for rtx arguments. */
841
842int
843rtx_equal_p (x, y)
844 rtx x, y;
845{
846 register int i;
847 register int j;
848 register enum rtx_code code;
849 register char *fmt;
850
851 if (x == y)
852 return 1;
853 if (x == 0 || y == 0)
854 return 0;
855
856 code = GET_CODE (x);
857 /* Rtx's of different codes cannot be equal. */
858 if (code != GET_CODE (y))
859 return 0;
860
861 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
862 (REG:SI x) and (REG:HI x) are NOT equivalent. */
863
864 if (GET_MODE (x) != GET_MODE (y))
865 return 0;
866
867 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
868
869 if (code == REG)
870 /* Until rtl generation is complete, don't consider a reference to the
871 return register of the current function the same as the return from a
872 called function. This eases the job of function integration. Once the
873 distinction is no longer needed, they can be considered equivalent. */
874 return (REGNO (x) == REGNO (y)
875 && (! rtx_equal_function_value_matters
876 || REG_FUNCTION_VALUE_P (x) == REG_FUNCTION_VALUE_P (y)));
877 else if (code == LABEL_REF)
878 return XEXP (x, 0) == XEXP (y, 0);
879 else if (code == SYMBOL_REF)
880 return XSTR (x, 0) == XSTR (y, 0);
881 else if (code == SCRATCH || code == CONST_DOUBLE)
882 return 0;
883
884 /* Compare the elements. If any pair of corresponding elements
885 fail to match, return 0 for the whole things. */
886
887 fmt = GET_RTX_FORMAT (code);
888 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
889 {
890 switch (fmt[i])
891 {
892 case 'w':
893 if (XWINT (x, i) != XWINT (y, i))
894 return 0;
895 break;
896
897 case 'n':
898 case 'i':
899 if (XINT (x, i) != XINT (y, i))
900 return 0;
901 break;
902
903 case 'V':
904 case 'E':
905 /* Two vectors must have the same length. */
906 if (XVECLEN (x, i) != XVECLEN (y, i))
907 return 0;
908
909 /* And the corresponding elements must match. */
910 for (j = 0; j < XVECLEN (x, i); j++)
911 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
912 return 0;
913 break;
914
915 case 'e':
916 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
917 return 0;
918 break;
919
920 case 'S':
921 case 's':
922 if (strcmp (XSTR (x, i), XSTR (y, i)))
923 return 0;
924 break;
925
926 case 'u':
927 /* These are just backpointers, so they don't matter. */
928 break;
929
930 case '0':
931 break;
932
933 /* It is believed that rtx's at this level will never
934 contain anything but integers and other rtx's,
935 except for within LABEL_REFs and SYMBOL_REFs. */
936 default:
937 abort ();
938 }
939 }
940 return 1;
941}
942\f
943/* Call FUN on each register or MEM that is stored into or clobbered by X.
944 (X would be the pattern of an insn).
945 FUN receives two arguments:
946 the REG, MEM, CC0 or PC being stored in or clobbered,
947 the SET or CLOBBER rtx that does the store.
948
949 If the item being stored in or clobbered is a SUBREG of a hard register,
950 the SUBREG will be passed. */
951
952void
953note_stores (x, fun)
954 register rtx x;
955 void (*fun) ();
956{
957 if ((GET_CODE (x) == SET || GET_CODE (x) == CLOBBER))
958 {
959 register rtx dest = SET_DEST (x);
960 while ((GET_CODE (dest) == SUBREG
961 && (GET_CODE (SUBREG_REG (dest)) != REG
962 || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER))
963 || GET_CODE (dest) == ZERO_EXTRACT
964 || GET_CODE (dest) == SIGN_EXTRACT
965 || GET_CODE (dest) == STRICT_LOW_PART)
966 dest = XEXP (dest, 0);
967 (*fun) (dest, x);
968 }
969 else if (GET_CODE (x) == PARALLEL)
970 {
971 register int i;
972 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
973 {
974 register rtx y = XVECEXP (x, 0, i);
975 if (GET_CODE (y) == SET || GET_CODE (y) == CLOBBER)
976 {
977 register rtx dest = SET_DEST (y);
978 while ((GET_CODE (dest) == SUBREG
979 && (GET_CODE (SUBREG_REG (dest)) != REG
980 || (REGNO (SUBREG_REG (dest))
981 >= FIRST_PSEUDO_REGISTER)))
982 || GET_CODE (dest) == ZERO_EXTRACT
983 || GET_CODE (dest) == SIGN_EXTRACT
984 || GET_CODE (dest) == STRICT_LOW_PART)
985 dest = XEXP (dest, 0);
986 (*fun) (dest, y);
987 }
988 }
989 }
990}
991\f
992/* Return nonzero if X's old contents don't survive after INSN.
993 This will be true if X is (cc0) or if X is a register and
994 X dies in INSN or because INSN entirely sets X.
995
996 "Entirely set" means set directly and not through a SUBREG,
997 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
998 Likewise, REG_INC does not count.
999
1000 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1001 but for this use that makes no difference, since regs don't overlap
1002 during their lifetimes. Therefore, this function may be used
1003 at any time after deaths have been computed (in flow.c).
1004
1005 If REG is a hard reg that occupies multiple machine registers, this
1006 function will only return 1 if each of those registers will be replaced
1007 by INSN. */
1008
1009int
1010dead_or_set_p (insn, x)
1011 rtx insn;
1012 rtx x;
1013{
1014 register int regno, last_regno;
1015 register int i;
1016
1017 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1018 if (GET_CODE (x) == CC0)
1019 return 1;
1020
1021 if (GET_CODE (x) != REG)
1022 abort ();
1023
1024 regno = REGNO (x);
1025 last_regno = (regno >= FIRST_PSEUDO_REGISTER ? regno
1026 : regno + HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1);
1027
1028 for (i = regno; i <= last_regno; i++)
1029 if (! dead_or_set_regno_p (insn, i))
1030 return 0;
1031
1032 return 1;
1033}
1034
1035/* Utility function for dead_or_set_p to check an individual register. Also
1036 called from flow.c. */
1037
1038int
1039dead_or_set_regno_p (insn, test_regno)
1040 rtx insn;
1041 int test_regno;
1042{
1043 int regno, endregno;
1044 rtx link;
1045
1046 /* See if there is a death note for something that includes TEST_REGNO. */
1047 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1048 {
1049 if (REG_NOTE_KIND (link) != REG_DEAD || GET_CODE (XEXP (link, 0)) != REG)
1050 continue;
1051
1052 regno = REGNO (XEXP (link, 0));
1053 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1054 : regno + HARD_REGNO_NREGS (regno,
1055 GET_MODE (XEXP (link, 0))));
1056
1057 if (test_regno >= regno && test_regno < endregno)
1058 return 1;
1059 }
1060
1061 if (GET_CODE (PATTERN (insn)) == SET)
1062 {
1063 rtx dest = SET_DEST (PATTERN (insn));
1064
1065 /* A value is totally replaced if it is the destination or the
1066 destination is a SUBREG of REGNO that does not change the number of
1067 words in it. */
1068 if (GET_CODE (dest) == SUBREG
1069 && (((GET_MODE_SIZE (GET_MODE (dest))
1070 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1071 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1072 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1073 dest = SUBREG_REG (dest);
1074
1075 if (GET_CODE (dest) != REG)
1076 return 0;
1077
1078 regno = REGNO (dest);
1079 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1080 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1081
1082 return (test_regno >= regno && test_regno < endregno);
1083 }
1084 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1085 {
1086 register int i;
1087
1088 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
1089 {
1090 rtx body = XVECEXP (PATTERN (insn), 0, i);
1091
1092 if (GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1093 {
1094 rtx dest = SET_DEST (body);
1095
1096 if (GET_CODE (dest) == SUBREG
1097 && (((GET_MODE_SIZE (GET_MODE (dest))
1098 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1099 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1100 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1101 dest = SUBREG_REG (dest);
1102
1103 if (GET_CODE (dest) != REG)
1104 continue;
1105
1106 regno = REGNO (dest);
1107 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1108 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1109
1110 if (test_regno >= regno && test_regno < endregno)
1111 return 1;
1112 }
1113 }
1114 }
1115
1116 return 0;
1117}
1118
1119/* Return the reg-note of kind KIND in insn INSN, if there is one.
1120 If DATUM is nonzero, look for one whose datum is DATUM. */
1121
1122rtx
1123find_reg_note (insn, kind, datum)
1124 rtx insn;
1125 enum reg_note kind;
1126 rtx datum;
1127{
1128 register rtx link;
1129
1130 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1131 if (REG_NOTE_KIND (link) == kind
1132 && (datum == 0 || datum == XEXP (link, 0)))
1133 return link;
1134 return 0;
1135}
1136
1137/* Return the reg-note of kind KIND in insn INSN which applies to register
1138 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1139 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1140 it might be the case that the note overlaps REGNO. */
1141
1142rtx
1143find_regno_note (insn, kind, regno)
1144 rtx insn;
1145 enum reg_note kind;
1146 int regno;
1147{
1148 register rtx link;
1149
1150 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1151 if (REG_NOTE_KIND (link) == kind
1152 /* Verify that it is a register, so that scratch and MEM won't cause a
1153 problem here. */
1154 && GET_CODE (XEXP (link, 0)) == REG
1155 && REGNO (XEXP (link, 0)) <= regno
1156 && ((REGNO (XEXP (link, 0))
1157 + (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
1158 : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
1159 GET_MODE (XEXP (link, 0)))))
1160 > regno))
1161 return link;
1162 return 0;
1163}
1164\f
1165/* Remove register note NOTE from the REG_NOTES of INSN. */
1166
1167void
1168remove_note (insn, note)
1169 register rtx note;
1170 register rtx insn;
1171{
1172 register rtx link;
1173
1174 if (REG_NOTES (insn) == note)
1175 {
1176 REG_NOTES (insn) = XEXP (note, 1);
1177 return;
1178 }
1179
1180 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1181 if (XEXP (link, 1) == note)
1182 {
1183 XEXP (link, 1) = XEXP (note, 1);
1184 return;
1185 }
1186
1187 abort ();
1188}
1189\f
1190/* Nonzero if X contains any volatile memory references
1191 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1192
1193int
1194volatile_refs_p (x)
1195 rtx x;
1196{
1197 register RTX_CODE code;
1198
1199 code = GET_CODE (x);
1200 switch (code)
1201 {
1202 case LABEL_REF:
1203 case SYMBOL_REF:
1204 case CONST_INT:
1205 case CONST:
1206 case CONST_DOUBLE:
1207 case CC0:
1208 case PC:
1209 case REG:
1210 case SCRATCH:
1211 case CLOBBER:
1212 case ASM_INPUT:
1213 case ADDR_VEC:
1214 case ADDR_DIFF_VEC:
1215 return 0;
1216
1217 case CALL:
1218 case UNSPEC_VOLATILE:
1219 /* case TRAP_IF: This isn't clear yet. */
1220 return 1;
1221
1222 case MEM:
1223 case ASM_OPERANDS:
1224 if (MEM_VOLATILE_P (x))
1225 return 1;
1226 }
1227
1228 /* Recursively scan the operands of this expression. */
1229
1230 {
1231 register char *fmt = GET_RTX_FORMAT (code);
1232 register int i;
1233
1234 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1235 {
1236 if (fmt[i] == 'e')
1237 {
1238 if (volatile_refs_p (XEXP (x, i)))
1239 return 1;
1240 }
1241 if (fmt[i] == 'E')
1242 {
1243 register int j;
1244 for (j = 0; j < XVECLEN (x, i); j++)
1245 if (volatile_refs_p (XVECEXP (x, i, j)))
1246 return 1;
1247 }
1248 }
1249 }
1250 return 0;
1251}
1252
1253/* Similar to above, except that it also rejects register pre- and post-
1254 incrementing. */
1255
1256int
1257side_effects_p (x)
1258 rtx x;
1259{
1260 register RTX_CODE code;
1261
1262 code = GET_CODE (x);
1263 switch (code)
1264 {
1265 case LABEL_REF:
1266 case SYMBOL_REF:
1267 case CONST_INT:
1268 case CONST:
1269 case CONST_DOUBLE:
1270 case CC0:
1271 case PC:
1272 case REG:
1273 case SCRATCH:
1274 case ASM_INPUT:
1275 case ADDR_VEC:
1276 case ADDR_DIFF_VEC:
1277 return 0;
1278
1279 case CLOBBER:
1280 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1281 when some combination can't be done. If we see one, don't think
1282 that we can simplify the expression. */
1283 return (GET_MODE (x) != VOIDmode);
1284
1285 case PRE_INC:
1286 case PRE_DEC:
1287 case POST_INC:
1288 case POST_DEC:
1289 case CALL:
1290 case UNSPEC_VOLATILE:
1291 /* case TRAP_IF: This isn't clear yet. */
1292 return 1;
1293
1294 case MEM:
1295 case ASM_OPERANDS:
1296 if (MEM_VOLATILE_P (x))
1297 return 1;
1298 }
1299
1300 /* Recursively scan the operands of this expression. */
1301
1302 {
1303 register char *fmt = GET_RTX_FORMAT (code);
1304 register int i;
1305
1306 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1307 {
1308 if (fmt[i] == 'e')
1309 {
1310 if (side_effects_p (XEXP (x, i)))
1311 return 1;
1312 }
1313 if (fmt[i] == 'E')
1314 {
1315 register int j;
1316 for (j = 0; j < XVECLEN (x, i); j++)
1317 if (side_effects_p (XVECEXP (x, i, j)))
1318 return 1;
1319 }
1320 }
1321 }
1322 return 0;
1323}
1324\f
1325/* Return nonzero if evaluating rtx X might cause a trap. */
1326
1327int
1328may_trap_p (x)
1329 rtx x;
1330{
1331 int i;
1332 enum rtx_code code;
1333 char *fmt;
1334
1335 if (x == 0)
1336 return 0;
1337 code = GET_CODE (x);
1338 switch (code)
1339 {
1340 /* Handle these cases quickly. */
1341 case CONST_INT:
1342 case CONST_DOUBLE:
1343 case SYMBOL_REF:
1344 case LABEL_REF:
1345 case CONST:
1346 case PC:
1347 case CC0:
1348 case REG:
1349 case SCRATCH:
1350 return 0;
1351
1352 /* Conditional trap can trap! */
1353 case UNSPEC_VOLATILE:
1354 case TRAP_IF:
1355 return 1;
1356
1357 /* Memory ref can trap unless it's a static var or a stack slot. */
1358 case MEM:
1359 return rtx_addr_can_trap_p (XEXP (x, 0));
1360
1361 /* Division by a non-constant might trap. */
1362 case DIV:
1363 case MOD:
1364 case UDIV:
1365 case UMOD:
1366 if (! CONSTANT_P (XEXP (x, 1)))
1367 return 1;
1368 /* This was const0_rtx, but by not using that,
1369 we can link this file into other programs. */
1370 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
1371 return 1;
1372 default:
1373 /* Any floating arithmetic may trap. */
1374 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1375 return 1;
1376 }
1377
1378 fmt = GET_RTX_FORMAT (code);
1379 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1380 {
1381 if (fmt[i] == 'e')
1382 {
1383 if (may_trap_p (XEXP (x, i)))
1384 return 1;
1385 }
1386 else if (fmt[i] == 'E')
1387 {
1388 register int j;
1389 for (j = 0; j < XVECLEN (x, i); j++)
1390 if (may_trap_p (XVECEXP (x, i, j)))
1391 return 1;
1392 }
1393 }
1394 return 0;
1395}
1396\f
1397/* Return nonzero if X contains a comparison that is not either EQ or NE,
1398 i.e., an inequality. */
1399
1400int
1401inequality_comparisons_p (x)
1402 rtx x;
1403{
1404 register char *fmt;
1405 register int len, i;
1406 register enum rtx_code code = GET_CODE (x);
1407
1408 switch (code)
1409 {
1410 case REG:
1411 case SCRATCH:
1412 case PC:
1413 case CC0:
1414 case CONST_INT:
1415 case CONST_DOUBLE:
1416 case CONST:
1417 case LABEL_REF:
1418 case SYMBOL_REF:
1419 return 0;
1420
1421 case LT:
1422 case LTU:
1423 case GT:
1424 case GTU:
1425 case LE:
1426 case LEU:
1427 case GE:
1428 case GEU:
1429 return 1;
1430 }
1431
1432 len = GET_RTX_LENGTH (code);
1433 fmt = GET_RTX_FORMAT (code);
1434
1435 for (i = 0; i < len; i++)
1436 {
1437 if (fmt[i] == 'e')
1438 {
1439 if (inequality_comparisons_p (XEXP (x, i)))
1440 return 1;
1441 }
1442 else if (fmt[i] == 'E')
1443 {
1444 register int j;
1445 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1446 if (inequality_comparisons_p (XVECEXP (x, i, j)))
1447 return 1;
1448 }
1449 }
1450
1451 return 0;
1452}
1453\f
1454/* Replace any occurrence of FROM in X with TO.
1455
1456 Note that copying is not done so X must not be shared unless all copies
1457 are to be modified. */
1458
1459rtx
1460replace_rtx (x, from, to)
1461 rtx x, from, to;
1462{
1463 register int i, j;
1464 register char *fmt;
1465
1466 if (x == from)
1467 return to;
1468
1469 /* Allow this function to make replacements in EXPR_LISTs. */
1470 if (x == 0)
1471 return 0;
1472
1473 fmt = GET_RTX_FORMAT (GET_CODE (x));
1474 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
1475 {
1476 if (fmt[i] == 'e')
1477 XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
1478 else if (fmt[i] == 'E')
1479 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1480 XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
1481 }
1482
1483 return x;
1484}
1485\f
1486/* Throughout the rtx X, replace many registers according to REG_MAP.
1487 Return the replacement for X (which may be X with altered contents).
1488 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
1489 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
1490
1491 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
1492 should not be mapped to pseudos or vice versa since validate_change
1493 is not called.
1494
1495 If REPLACE_DEST is 1, replacements are also done in destinations;
1496 otherwise, only sources are replaced. */
1497
1498rtx
1499replace_regs (x, reg_map, nregs, replace_dest)
1500 rtx x;
1501 rtx *reg_map;
1502 int nregs;
1503 int replace_dest;
1504{
1505 register enum rtx_code code;
1506 register int i;
1507 register char *fmt;
1508
1509 if (x == 0)
1510 return x;
1511
1512 code = GET_CODE (x);
1513 switch (code)
1514 {
1515 case SCRATCH:
1516 case PC:
1517 case CC0:
1518 case CONST_INT:
1519 case CONST_DOUBLE:
1520 case CONST:
1521 case SYMBOL_REF:
1522 case LABEL_REF:
1523 return x;
1524
1525 case REG:
1526 /* Verify that the register has an entry before trying to access it. */
1527 if (REGNO (x) < nregs && reg_map[REGNO (x)] != 0)
1528 return reg_map[REGNO (x)];
1529 return x;
1530
1531 case SUBREG:
1532 /* Prevent making nested SUBREGs. */
1533 if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < nregs
1534 && reg_map[REGNO (SUBREG_REG (x))] != 0
1535 && GET_CODE (reg_map[REGNO (SUBREG_REG (x))]) == SUBREG)
1536 {
1537 rtx map_val = reg_map[REGNO (SUBREG_REG (x))];
1538 rtx map_inner = SUBREG_REG (map_val);
1539
1540 if (GET_MODE (x) == GET_MODE (map_inner))
1541 return map_inner;
1542 else
1543 {
1544 /* We cannot call gen_rtx here since we may be linked with
1545 genattrtab.c. */
1546 /* Let's try clobbering the incoming SUBREG and see
1547 if this is really safe. */
1548 SUBREG_REG (x) = map_inner;
1549 SUBREG_WORD (x) += SUBREG_WORD (map_val);
1550 return x;
1551#if 0
1552 rtx new = rtx_alloc (SUBREG);
1553 PUT_MODE (new, GET_MODE (x));
1554 SUBREG_REG (new) = map_inner;
1555 SUBREG_WORD (new) = SUBREG_WORD (x) + SUBREG_WORD (map_val);
1556#endif
1557 }
1558 }
1559 break;
1560
1561 case SET:
1562 if (replace_dest)
1563 SET_DEST (x) = replace_regs (SET_DEST (x), reg_map, nregs, 0);
1564
1565 else if (GET_CODE (SET_DEST (x)) == MEM
1566 || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
1567 /* Even if we are not to replace destinations, replace register if it
1568 is CONTAINED in destination (destination is memory or
1569 STRICT_LOW_PART). */
1570 XEXP (SET_DEST (x), 0) = replace_regs (XEXP (SET_DEST (x), 0),
1571 reg_map, nregs, 0);
1572 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
1573 /* Similarly, for ZERO_EXTRACT we replace all operands. */
1574 break;
1575
1576 SET_SRC (x) = replace_regs (SET_SRC (x), reg_map, nregs, 0);
1577 return x;
1578 }
1579
1580 fmt = GET_RTX_FORMAT (code);
1581 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1582 {
1583 if (fmt[i] == 'e')
1584 XEXP (x, i) = replace_regs (XEXP (x, i), reg_map, nregs, replace_dest);
1585 if (fmt[i] == 'E')
1586 {
1587 register int j;
1588 for (j = 0; j < XVECLEN (x, i); j++)
1589 XVECEXP (x, i, j) = replace_regs (XVECEXP (x, i, j), reg_map,
1590 nregs, replace_dest);
1591 }
1592 }
1593 return x;
1594}