]> gcc.gnu.org Git - gcc.git/blob - gcc/rtlanal.c
(GCC_FOR_TARGET): Put -B./ here.
[gcc.git] / gcc / rtlanal.c
1 /* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 1988, 1991, 1992 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
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.
10
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.
15
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, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21 #include "config.h"
22 #include "rtl.h"
23
24 void note_stores ();
25 int 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
31 int 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
38 int
39 rtx_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
73 int
74 rtx_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
117 int
118 rtx_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
159 int
160 rtx_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
187 HOST_WIDE_INT
188 get_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
207 rtx
208 get_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
227 int
228 reg_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
291 int
292 no_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
305 int
306 reg_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
325 int
326 reg_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
383 int
384 reg_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
402 int
403 reg_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
420 static rtx reg_set_reg;
421 static int reg_set_flag;
422
423 void
424 reg_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
435 int
436 reg_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
468 int
469 modified_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
514 rtx
515 single_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
551 rtx
552 find_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
599 int
600 refers_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
697 int
698 reg_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
743 static int reg_set_last_unknown;
744 static rtx reg_set_last_value;
745 static int reg_set_last_first_regno, reg_set_last_last_regno;
746
747 /* Called via note_stores from reg_set_last. */
748
749 static void
750 reg_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 or constant because it is too hard to check if a
783 MEM remains unchanged. */
784
785 rtx
786 reg_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 for (;
809 insn && GET_CODE (insn) != CODE_LABEL
810 && ! (GET_CODE (insn) == CALL_INSN
811 && reg_set_last_last_regno <= FIRST_PSEUDO_REGISTER);
812 insn = PREV_INSN (insn))
813 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
814 {
815 note_stores (PATTERN (insn), reg_set_last_1);
816 if (reg_set_last_unknown)
817 return 0;
818 else if (reg_set_last_value)
819 {
820 if (CONSTANT_P (reg_set_last_value)
821 || (GET_CODE (reg_set_last_value) == REG
822 && ! reg_set_between_p (reg_set_last_value,
823 NEXT_INSN (insn), orig_insn)))
824 return reg_set_last_value;
825 else
826 return 0;
827 }
828 }
829
830 return 0;
831 }
832 \f
833 /* This is 1 until after reload pass. */
834 int rtx_equal_function_value_matters;
835
836 /* Return 1 if X and Y are identical-looking rtx's.
837 This is the Lisp function EQUAL for rtx arguments. */
838
839 int
840 rtx_equal_p (x, y)
841 rtx x, y;
842 {
843 register int i;
844 register int j;
845 register enum rtx_code code;
846 register char *fmt;
847
848 if (x == y)
849 return 1;
850 if (x == 0 || y == 0)
851 return 0;
852
853 code = GET_CODE (x);
854 /* Rtx's of different codes cannot be equal. */
855 if (code != GET_CODE (y))
856 return 0;
857
858 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
859 (REG:SI x) and (REG:HI x) are NOT equivalent. */
860
861 if (GET_MODE (x) != GET_MODE (y))
862 return 0;
863
864 /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
865
866 if (code == REG)
867 /* Until rtl generation is complete, don't consider a reference to the
868 return register of the current function the same as the return from a
869 called function. This eases the job of function integration. Once the
870 distinction is no longer needed, they can be considered equivalent. */
871 return (REGNO (x) == REGNO (y)
872 && (! rtx_equal_function_value_matters
873 || REG_FUNCTION_VALUE_P (x) == REG_FUNCTION_VALUE_P (y)));
874 else if (code == LABEL_REF)
875 return XEXP (x, 0) == XEXP (y, 0);
876 else if (code == SYMBOL_REF)
877 return XSTR (x, 0) == XSTR (y, 0);
878 else if (code == SCRATCH || code == CONST_DOUBLE)
879 return 0;
880
881 /* Compare the elements. If any pair of corresponding elements
882 fail to match, return 0 for the whole things. */
883
884 fmt = GET_RTX_FORMAT (code);
885 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
886 {
887 switch (fmt[i])
888 {
889 case 'w':
890 if (XWINT (x, i) != XWINT (y, i))
891 return 0;
892 break;
893
894 case 'n':
895 case 'i':
896 if (XINT (x, i) != XINT (y, i))
897 return 0;
898 break;
899
900 case 'V':
901 case 'E':
902 /* Two vectors must have the same length. */
903 if (XVECLEN (x, i) != XVECLEN (y, i))
904 return 0;
905
906 /* And the corresponding elements must match. */
907 for (j = 0; j < XVECLEN (x, i); j++)
908 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
909 return 0;
910 break;
911
912 case 'e':
913 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
914 return 0;
915 break;
916
917 case 'S':
918 case 's':
919 if (strcmp (XSTR (x, i), XSTR (y, i)))
920 return 0;
921 break;
922
923 case 'u':
924 /* These are just backpointers, so they don't matter. */
925 break;
926
927 case '0':
928 break;
929
930 /* It is believed that rtx's at this level will never
931 contain anything but integers and other rtx's,
932 except for within LABEL_REFs and SYMBOL_REFs. */
933 default:
934 abort ();
935 }
936 }
937 return 1;
938 }
939 \f
940 /* Call FUN on each register or MEM that is stored into or clobbered by X.
941 (X would be the pattern of an insn).
942 FUN receives two arguments:
943 the REG, MEM, CC0 or PC being stored in or clobbered,
944 the SET or CLOBBER rtx that does the store.
945
946 If the item being stored in or clobbered is a SUBREG of a hard register,
947 the SUBREG will be passed. */
948
949 void
950 note_stores (x, fun)
951 register rtx x;
952 void (*fun) ();
953 {
954 if ((GET_CODE (x) == SET || GET_CODE (x) == CLOBBER))
955 {
956 register rtx dest = SET_DEST (x);
957 while ((GET_CODE (dest) == SUBREG
958 && (GET_CODE (SUBREG_REG (dest)) != REG
959 || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER))
960 || GET_CODE (dest) == ZERO_EXTRACT
961 || GET_CODE (dest) == SIGN_EXTRACT
962 || GET_CODE (dest) == STRICT_LOW_PART)
963 dest = XEXP (dest, 0);
964 (*fun) (dest, x);
965 }
966 else if (GET_CODE (x) == PARALLEL)
967 {
968 register int i;
969 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
970 {
971 register rtx y = XVECEXP (x, 0, i);
972 if (GET_CODE (y) == SET || GET_CODE (y) == CLOBBER)
973 {
974 register rtx dest = SET_DEST (y);
975 while ((GET_CODE (dest) == SUBREG
976 && (GET_CODE (SUBREG_REG (dest)) != REG
977 || (REGNO (SUBREG_REG (dest))
978 >= FIRST_PSEUDO_REGISTER)))
979 || GET_CODE (dest) == ZERO_EXTRACT
980 || GET_CODE (dest) == SIGN_EXTRACT
981 || GET_CODE (dest) == STRICT_LOW_PART)
982 dest = XEXP (dest, 0);
983 (*fun) (dest, y);
984 }
985 }
986 }
987 }
988 \f
989 /* Return nonzero if X's old contents don't survive after INSN.
990 This will be true if X is (cc0) or if X is a register and
991 X dies in INSN or because INSN entirely sets X.
992
993 "Entirely set" means set directly and not through a SUBREG,
994 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
995 Likewise, REG_INC does not count.
996
997 REG may be a hard or pseudo reg. Renumbering is not taken into account,
998 but for this use that makes no difference, since regs don't overlap
999 during their lifetimes. Therefore, this function may be used
1000 at any time after deaths have been computed (in flow.c).
1001
1002 If REG is a hard reg that occupies multiple machine registers, this
1003 function will only return 1 if each of those registers will be replaced
1004 by INSN. */
1005
1006 int
1007 dead_or_set_p (insn, x)
1008 rtx insn;
1009 rtx x;
1010 {
1011 register int regno, last_regno;
1012 register int i;
1013
1014 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1015 if (GET_CODE (x) == CC0)
1016 return 1;
1017
1018 if (GET_CODE (x) != REG)
1019 abort ();
1020
1021 regno = REGNO (x);
1022 last_regno = (regno >= FIRST_PSEUDO_REGISTER ? regno
1023 : regno + HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1);
1024
1025 for (i = regno; i <= last_regno; i++)
1026 if (! dead_or_set_regno_p (insn, i))
1027 return 0;
1028
1029 return 1;
1030 }
1031
1032 /* Utility function for dead_or_set_p to check an individual register. Also
1033 called from flow.c. */
1034
1035 int
1036 dead_or_set_regno_p (insn, test_regno)
1037 rtx insn;
1038 int test_regno;
1039 {
1040 int regno, endregno;
1041 rtx link;
1042
1043 /* See if there is a death note for something that includes TEST_REGNO. */
1044 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1045 {
1046 if (REG_NOTE_KIND (link) != REG_DEAD || GET_CODE (XEXP (link, 0)) != REG)
1047 continue;
1048
1049 regno = REGNO (XEXP (link, 0));
1050 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1051 : regno + HARD_REGNO_NREGS (regno,
1052 GET_MODE (XEXP (link, 0))));
1053
1054 if (test_regno >= regno && test_regno < endregno)
1055 return 1;
1056 }
1057
1058 if (GET_CODE (PATTERN (insn)) == SET)
1059 {
1060 rtx dest = SET_DEST (PATTERN (insn));
1061
1062 /* A value is totally replaced if it is the destination or the
1063 destination is a SUBREG of REGNO that does not change the number of
1064 words in it. */
1065 if (GET_CODE (dest) == SUBREG
1066 && (((GET_MODE_SIZE (GET_MODE (dest))
1067 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1068 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1069 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1070 dest = SUBREG_REG (dest);
1071
1072 if (GET_CODE (dest) != REG)
1073 return 0;
1074
1075 regno = REGNO (dest);
1076 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1077 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1078
1079 return (test_regno >= regno && test_regno < endregno);
1080 }
1081 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1082 {
1083 register int i;
1084
1085 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
1086 {
1087 rtx body = XVECEXP (PATTERN (insn), 0, i);
1088
1089 if (GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1090 {
1091 rtx dest = SET_DEST (body);
1092
1093 if (GET_CODE (dest) == SUBREG
1094 && (((GET_MODE_SIZE (GET_MODE (dest))
1095 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1096 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1097 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1098 dest = SUBREG_REG (dest);
1099
1100 if (GET_CODE (dest) != REG)
1101 continue;
1102
1103 regno = REGNO (dest);
1104 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1105 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1106
1107 if (test_regno >= regno && test_regno < endregno)
1108 return 1;
1109 }
1110 }
1111 }
1112
1113 return 0;
1114 }
1115
1116 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1117 If DATUM is nonzero, look for one whose datum is DATUM. */
1118
1119 rtx
1120 find_reg_note (insn, kind, datum)
1121 rtx insn;
1122 enum reg_note kind;
1123 rtx datum;
1124 {
1125 register rtx link;
1126
1127 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1128 if (REG_NOTE_KIND (link) == kind
1129 && (datum == 0 || datum == XEXP (link, 0)))
1130 return link;
1131 return 0;
1132 }
1133
1134 /* Return the reg-note of kind KIND in insn INSN which applies to register
1135 number REGNO, if any. Return 0 if there is no such reg-note. */
1136
1137 rtx
1138 find_regno_note (insn, kind, regno)
1139 rtx insn;
1140 enum reg_note kind;
1141 int regno;
1142 {
1143 register rtx link;
1144
1145 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1146 if (REG_NOTE_KIND (link) == kind
1147 /* Verify that it is a register, so that scratch and MEM won't cause a
1148 problem here. */
1149 && GET_CODE (XEXP (link, 0)) == REG
1150 && REGNO (XEXP (link, 0)) == regno)
1151 return link;
1152 return 0;
1153 }
1154 \f
1155 /* Remove register note NOTE from the REG_NOTES of INSN. */
1156
1157 void
1158 remove_note (insn, note)
1159 register rtx note;
1160 register rtx insn;
1161 {
1162 register rtx link;
1163
1164 if (REG_NOTES (insn) == note)
1165 {
1166 REG_NOTES (insn) = XEXP (note, 1);
1167 return;
1168 }
1169
1170 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1171 if (XEXP (link, 1) == note)
1172 {
1173 XEXP (link, 1) = XEXP (note, 1);
1174 return;
1175 }
1176
1177 abort ();
1178 }
1179 \f
1180 /* Nonzero if X contains any volatile memory references
1181 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1182
1183 int
1184 volatile_refs_p (x)
1185 rtx x;
1186 {
1187 register RTX_CODE code;
1188
1189 code = GET_CODE (x);
1190 switch (code)
1191 {
1192 case LABEL_REF:
1193 case SYMBOL_REF:
1194 case CONST_INT:
1195 case CONST:
1196 case CONST_DOUBLE:
1197 case CC0:
1198 case PC:
1199 case REG:
1200 case SCRATCH:
1201 case CLOBBER:
1202 case ASM_INPUT:
1203 case ADDR_VEC:
1204 case ADDR_DIFF_VEC:
1205 return 0;
1206
1207 case CALL:
1208 case UNSPEC_VOLATILE:
1209 /* case TRAP_IF: This isn't clear yet. */
1210 return 1;
1211
1212 case MEM:
1213 case ASM_OPERANDS:
1214 if (MEM_VOLATILE_P (x))
1215 return 1;
1216 }
1217
1218 /* Recursively scan the operands of this expression. */
1219
1220 {
1221 register char *fmt = GET_RTX_FORMAT (code);
1222 register int i;
1223
1224 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1225 {
1226 if (fmt[i] == 'e')
1227 {
1228 if (volatile_refs_p (XEXP (x, i)))
1229 return 1;
1230 }
1231 if (fmt[i] == 'E')
1232 {
1233 register int j;
1234 for (j = 0; j < XVECLEN (x, i); j++)
1235 if (volatile_refs_p (XVECEXP (x, i, j)))
1236 return 1;
1237 }
1238 }
1239 }
1240 return 0;
1241 }
1242
1243 /* Similar to above, except that it also rejects register pre- and post-
1244 incrementing. */
1245
1246 int
1247 side_effects_p (x)
1248 rtx x;
1249 {
1250 register RTX_CODE code;
1251
1252 code = GET_CODE (x);
1253 switch (code)
1254 {
1255 case LABEL_REF:
1256 case SYMBOL_REF:
1257 case CONST_INT:
1258 case CONST:
1259 case CONST_DOUBLE:
1260 case CC0:
1261 case PC:
1262 case REG:
1263 case SCRATCH:
1264 case ASM_INPUT:
1265 case ADDR_VEC:
1266 case ADDR_DIFF_VEC:
1267 return 0;
1268
1269 case CLOBBER:
1270 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1271 when some combination can't be done. If we see one, don't think
1272 that we can simplify the expression. */
1273 return (GET_MODE (x) != VOIDmode);
1274
1275 case PRE_INC:
1276 case PRE_DEC:
1277 case POST_INC:
1278 case POST_DEC:
1279 case CALL:
1280 case UNSPEC_VOLATILE:
1281 /* case TRAP_IF: This isn't clear yet. */
1282 return 1;
1283
1284 case MEM:
1285 case ASM_OPERANDS:
1286 if (MEM_VOLATILE_P (x))
1287 return 1;
1288 }
1289
1290 /* Recursively scan the operands of this expression. */
1291
1292 {
1293 register char *fmt = GET_RTX_FORMAT (code);
1294 register int i;
1295
1296 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1297 {
1298 if (fmt[i] == 'e')
1299 {
1300 if (side_effects_p (XEXP (x, i)))
1301 return 1;
1302 }
1303 if (fmt[i] == 'E')
1304 {
1305 register int j;
1306 for (j = 0; j < XVECLEN (x, i); j++)
1307 if (side_effects_p (XVECEXP (x, i, j)))
1308 return 1;
1309 }
1310 }
1311 }
1312 return 0;
1313 }
1314 \f
1315 /* Return nonzero if evaluating rtx X might cause a trap. */
1316
1317 int
1318 may_trap_p (x)
1319 rtx x;
1320 {
1321 int i;
1322 enum rtx_code code;
1323 char *fmt;
1324
1325 if (x == 0)
1326 return 0;
1327 code = GET_CODE (x);
1328 switch (code)
1329 {
1330 /* Handle these cases quickly. */
1331 case CONST_INT:
1332 case CONST_DOUBLE:
1333 case SYMBOL_REF:
1334 case LABEL_REF:
1335 case CONST:
1336 case PC:
1337 case CC0:
1338 case REG:
1339 case SCRATCH:
1340 return 0;
1341
1342 /* Conditional trap can trap! */
1343 case UNSPEC_VOLATILE:
1344 case TRAP_IF:
1345 return 1;
1346
1347 /* Memory ref can trap unless it's a static var or a stack slot. */
1348 case MEM:
1349 return rtx_addr_can_trap_p (XEXP (x, 0));
1350
1351 /* Division by a non-constant might trap. */
1352 case DIV:
1353 case MOD:
1354 case UDIV:
1355 case UMOD:
1356 if (! CONSTANT_P (XEXP (x, 1)))
1357 return 1;
1358 /* This was const0_rtx, but by not using that,
1359 we can link this file into other programs. */
1360 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
1361 return 1;
1362 default:
1363 /* Any floating arithmetic may trap. */
1364 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1365 return 1;
1366 }
1367
1368 fmt = GET_RTX_FORMAT (code);
1369 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1370 {
1371 if (fmt[i] == 'e')
1372 {
1373 if (may_trap_p (XEXP (x, i)))
1374 return 1;
1375 }
1376 else if (fmt[i] == 'E')
1377 {
1378 register int j;
1379 for (j = 0; j < XVECLEN (x, i); j++)
1380 if (may_trap_p (XVECEXP (x, i, j)))
1381 return 1;
1382 }
1383 }
1384 return 0;
1385 }
1386 \f
1387 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1388 i.e., an inequality. */
1389
1390 int
1391 inequality_comparisons_p (x)
1392 rtx x;
1393 {
1394 register char *fmt;
1395 register int len, i;
1396 register enum rtx_code code = GET_CODE (x);
1397
1398 switch (code)
1399 {
1400 case REG:
1401 case SCRATCH:
1402 case PC:
1403 case CC0:
1404 case CONST_INT:
1405 case CONST_DOUBLE:
1406 case CONST:
1407 case LABEL_REF:
1408 case SYMBOL_REF:
1409 return 0;
1410
1411 case LT:
1412 case LTU:
1413 case GT:
1414 case GTU:
1415 case LE:
1416 case LEU:
1417 case GE:
1418 case GEU:
1419 return 1;
1420 }
1421
1422 len = GET_RTX_LENGTH (code);
1423 fmt = GET_RTX_FORMAT (code);
1424
1425 for (i = 0; i < len; i++)
1426 {
1427 if (fmt[i] == 'e')
1428 {
1429 if (inequality_comparisons_p (XEXP (x, i)))
1430 return 1;
1431 }
1432 else if (fmt[i] == 'E')
1433 {
1434 register int j;
1435 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1436 if (inequality_comparisons_p (XVECEXP (x, i, j)))
1437 return 1;
1438 }
1439 }
1440
1441 return 0;
1442 }
1443 \f
1444 /* Replace any occurrence of FROM in X with TO.
1445
1446 Note that copying is not done so X must not be shared unless all copies
1447 are to be modified. */
1448
1449 rtx
1450 replace_rtx (x, from, to)
1451 rtx x, from, to;
1452 {
1453 register int i, j;
1454 register char *fmt;
1455
1456 if (x == from)
1457 return to;
1458
1459 /* Allow this function to make replacements in EXPR_LISTs. */
1460 if (x == 0)
1461 return 0;
1462
1463 fmt = GET_RTX_FORMAT (GET_CODE (x));
1464 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
1465 {
1466 if (fmt[i] == 'e')
1467 XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
1468 else if (fmt[i] == 'E')
1469 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1470 XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
1471 }
1472
1473 return x;
1474 }
1475 \f
1476 /* Throughout the rtx X, replace many registers according to REG_MAP.
1477 Return the replacement for X (which may be X with altered contents).
1478 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
1479 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
1480
1481 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
1482 should not be mapped to pseudos or vice versa since validate_change
1483 is not called.
1484
1485 If REPLACE_DEST is 1, replacements are also done in destinations;
1486 otherwise, only sources are replaced. */
1487
1488 rtx
1489 replace_regs (x, reg_map, nregs, replace_dest)
1490 rtx x;
1491 rtx *reg_map;
1492 int nregs;
1493 int replace_dest;
1494 {
1495 register enum rtx_code code;
1496 register int i;
1497 register char *fmt;
1498
1499 if (x == 0)
1500 return x;
1501
1502 code = GET_CODE (x);
1503 switch (code)
1504 {
1505 case SCRATCH:
1506 case PC:
1507 case CC0:
1508 case CONST_INT:
1509 case CONST_DOUBLE:
1510 case CONST:
1511 case SYMBOL_REF:
1512 case LABEL_REF:
1513 return x;
1514
1515 case REG:
1516 /* Verify that the register has an entry before trying to access it. */
1517 if (REGNO (x) < nregs && reg_map[REGNO (x)] != 0)
1518 return reg_map[REGNO (x)];
1519 return x;
1520
1521 case SUBREG:
1522 /* Prevent making nested SUBREGs. */
1523 if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < nregs
1524 && reg_map[REGNO (SUBREG_REG (x))] != 0
1525 && GET_CODE (reg_map[REGNO (SUBREG_REG (x))]) == SUBREG)
1526 {
1527 rtx map_val = reg_map[REGNO (SUBREG_REG (x))];
1528 rtx map_inner = SUBREG_REG (map_val);
1529
1530 if (GET_MODE (x) == GET_MODE (map_inner))
1531 return map_inner;
1532 else
1533 {
1534 /* We cannot call gen_rtx here since we may be linked with
1535 genattrtab.c. */
1536 /* Let's try clobbering the incoming SUBREG and see
1537 if this is really safe. */
1538 SUBREG_REG (x) = map_inner;
1539 SUBREG_WORD (x) += SUBREG_WORD (map_val);
1540 return x;
1541 #if 0
1542 rtx new = rtx_alloc (SUBREG);
1543 PUT_MODE (new, GET_MODE (x));
1544 SUBREG_REG (new) = map_inner;
1545 SUBREG_WORD (new) = SUBREG_WORD (x) + SUBREG_WORD (map_val);
1546 #endif
1547 }
1548 }
1549 break;
1550
1551 case SET:
1552 if (replace_dest)
1553 SET_DEST (x) = replace_regs (SET_DEST (x), reg_map, nregs, 0);
1554
1555 else if (GET_CODE (SET_DEST (x)) == MEM
1556 || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
1557 /* Even if we are not to replace destinations, replace register if it
1558 is CONTAINED in destination (destination is memory or
1559 STRICT_LOW_PART). */
1560 XEXP (SET_DEST (x), 0) = replace_regs (XEXP (SET_DEST (x), 0),
1561 reg_map, nregs, 0);
1562 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
1563 /* Similarly, for ZERO_EXTRACT we replace all operands. */
1564 break;
1565
1566 SET_SRC (x) = replace_regs (SET_SRC (x), reg_map, nregs, 0);
1567 return x;
1568 }
1569
1570 fmt = GET_RTX_FORMAT (code);
1571 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1572 {
1573 if (fmt[i] == 'e')
1574 XEXP (x, i) = replace_regs (XEXP (x, i), reg_map, nregs, replace_dest);
1575 if (fmt[i] == 'E')
1576 {
1577 register int j;
1578 for (j = 0; j < XVECLEN (x, i); j++)
1579 XVECEXP (x, i, j) = replace_regs (XVECEXP (x, i, j), reg_map,
1580 nregs, replace_dest);
1581 }
1582 }
1583 return x;
1584 }
This page took 0.105809 seconds and 5 git commands to generate.