]> gcc.gnu.org Git - gcc.git/blob - gcc/rtlanal.c
ia64 specific scheduling bits
[gcc.git] / gcc / rtlanal.c
1 /* Analyze RTL for C-Compiler
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22
23 #include "config.h"
24 #include "system.h"
25 #include "toplev.h"
26 #include "rtl.h"
27
28 static int rtx_addr_can_trap_p PARAMS ((rtx));
29 static void reg_set_p_1 PARAMS ((rtx, rtx, void *));
30 static void insn_dependent_p_1 PARAMS ((rtx, rtx, void *));
31 static void reg_set_last_1 PARAMS ((rtx, rtx, void *));
32
33
34 /* Forward declarations */
35 static int jmp_uses_reg_or_mem PARAMS ((rtx));
36
37 /* Bit flags that specify the machine subtype we are compiling for.
38 Bits are tested using macros TARGET_... defined in the tm.h file
39 and set by `-m...' switches. Must be defined in rtlanal.c. */
40
41 int target_flags;
42 \f
43 /* Return 1 if the value of X is unstable
44 (would be different at a different point in the program).
45 The frame pointer, arg pointer, etc. are considered stable
46 (within one function) and so is anything marked `unchanging'. */
47
48 int
49 rtx_unstable_p (x)
50 rtx x;
51 {
52 register RTX_CODE code = GET_CODE (x);
53 register int i;
54 register const char *fmt;
55
56 switch (code)
57 {
58 case MEM:
59 return ! RTX_UNCHANGING_P (x) || rtx_unstable_p (XEXP (x, 0));
60
61 case QUEUED:
62 return 1;
63
64 case CONST:
65 case CONST_INT:
66 case CONST_DOUBLE:
67 case SYMBOL_REF:
68 case LABEL_REF:
69 return 0;
70
71 case REG:
72 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
73 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
74 || x == arg_pointer_rtx || RTX_UNCHANGING_P (x))
75 return 0;
76 #ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
77 /* ??? When call-clobbered, the value is stable modulo the restore
78 that must happen after a call. This currently screws up local-alloc
79 into believing that the restore is not needed. */
80 if (x == pic_offset_table_rtx)
81 return 0;
82 #endif
83 return 1;
84
85 case ASM_OPERANDS:
86 if (MEM_VOLATILE_P (x))
87 return 1;
88
89 /* FALLTHROUGH */
90
91 default:
92 break;
93 }
94
95 fmt = GET_RTX_FORMAT (code);
96 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
97 if (fmt[i] == 'e')
98 {
99 if (rtx_unstable_p (XEXP (x, i)))
100 return 1;
101 }
102 else if (fmt[i] == 'E')
103 {
104 int j;
105 for (j = 0; j < XVECLEN (x, i); j++)
106 if (rtx_unstable_p (XVECEXP (x, i, j)))
107 return 1;
108 }
109
110 return 0;
111 }
112
113 /* Return 1 if X has a value that can vary even between two
114 executions of the program. 0 means X can be compared reliably
115 against certain constants or near-constants.
116 The frame pointer and the arg pointer are considered constant. */
117
118 int
119 rtx_varies_p (x)
120 rtx x;
121 {
122 register RTX_CODE code = GET_CODE (x);
123 register int i;
124 register const char *fmt;
125
126 switch (code)
127 {
128 case MEM:
129 return ! RTX_UNCHANGING_P (x) || rtx_varies_p (XEXP (x, 0));
130
131 case QUEUED:
132 return 1;
133
134 case CONST:
135 case CONST_INT:
136 case CONST_DOUBLE:
137 case SYMBOL_REF:
138 case LABEL_REF:
139 return 0;
140
141 case REG:
142 /* Note that we have to test for the actual rtx used for the frame
143 and arg pointers and not just the register number in case we have
144 eliminated the frame and/or arg pointer and are using it
145 for pseudos. */
146 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
147 || x == arg_pointer_rtx)
148 return 0;
149 #ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
150 /* ??? When call-clobbered, the value is stable modulo the restore
151 that must happen after a call. This currently screws up local-alloc
152 into believing that the restore is not needed. */
153 if (x == pic_offset_table_rtx)
154 return 0;
155 #endif
156 return 1;
157
158 case LO_SUM:
159 /* The operand 0 of a LO_SUM is considered constant
160 (in fact is it related specifically to operand 1). */
161 return rtx_varies_p (XEXP (x, 1));
162
163 case ASM_OPERANDS:
164 if (MEM_VOLATILE_P (x))
165 return 1;
166
167 /* FALLTHROUGH */
168
169 default:
170 break;
171 }
172
173 fmt = GET_RTX_FORMAT (code);
174 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
175 if (fmt[i] == 'e')
176 {
177 if (rtx_varies_p (XEXP (x, i)))
178 return 1;
179 }
180 else if (fmt[i] == 'E')
181 {
182 int j;
183 for (j = 0; j < XVECLEN (x, i); j++)
184 if (rtx_varies_p (XVECEXP (x, i, j)))
185 return 1;
186 }
187
188 return 0;
189 }
190
191 /* Return 0 if the use of X as an address in a MEM can cause a trap. */
192
193 static int
194 rtx_addr_can_trap_p (x)
195 register rtx x;
196 {
197 register enum rtx_code code = GET_CODE (x);
198
199 switch (code)
200 {
201 case SYMBOL_REF:
202 case LABEL_REF:
203 /* SYMBOL_REF is problematic due to the possible presence of
204 a #pragma weak, but to say that loads from symbols can trap is
205 *very* costly. It's not at all clear what's best here. For
206 now, we ignore the impact of #pragma weak. */
207 return 0;
208
209 case REG:
210 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
211 return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
212 || x == stack_pointer_rtx || x == arg_pointer_rtx);
213
214 case CONST:
215 return rtx_addr_can_trap_p (XEXP (x, 0));
216
217 case PLUS:
218 /* An address is assumed not to trap if it is an address that can't
219 trap plus a constant integer or it is the pic register plus a
220 constant. */
221 return ! ((! rtx_addr_can_trap_p (XEXP (x, 0))
222 && GET_CODE (XEXP (x, 1)) == CONST_INT)
223 || (XEXP (x, 0) == pic_offset_table_rtx
224 && CONSTANT_P (XEXP (x, 1))));
225
226 case LO_SUM:
227 return rtx_addr_can_trap_p (XEXP (x, 1));
228
229 default:
230 break;
231 }
232
233 /* If it isn't one of the case above, it can cause a trap. */
234 return 1;
235 }
236
237 /* Return 1 if X refers to a memory location whose address
238 cannot be compared reliably with constant addresses,
239 or if X refers to a BLKmode memory object. */
240
241 int
242 rtx_addr_varies_p (x)
243 rtx x;
244 {
245 register enum rtx_code code;
246 register int i;
247 register const char *fmt;
248
249 if (x == 0)
250 return 0;
251
252 code = GET_CODE (x);
253 if (code == MEM)
254 return GET_MODE (x) == BLKmode || rtx_varies_p (XEXP (x, 0));
255
256 fmt = GET_RTX_FORMAT (code);
257 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
258 if (fmt[i] == 'e')
259 {
260 if (rtx_addr_varies_p (XEXP (x, i)))
261 return 1;
262 }
263 else if (fmt[i] == 'E')
264 {
265 int j;
266 for (j = 0; j < XVECLEN (x, i); j++)
267 if (rtx_addr_varies_p (XVECEXP (x, i, j)))
268 return 1;
269 }
270 return 0;
271 }
272 \f
273 /* Return the value of the integer term in X, if one is apparent;
274 otherwise return 0.
275 Only obvious integer terms are detected.
276 This is used in cse.c with the `related_value' field.*/
277
278 HOST_WIDE_INT
279 get_integer_term (x)
280 rtx x;
281 {
282 if (GET_CODE (x) == CONST)
283 x = XEXP (x, 0);
284
285 if (GET_CODE (x) == MINUS
286 && GET_CODE (XEXP (x, 1)) == CONST_INT)
287 return - INTVAL (XEXP (x, 1));
288 if (GET_CODE (x) == PLUS
289 && GET_CODE (XEXP (x, 1)) == CONST_INT)
290 return INTVAL (XEXP (x, 1));
291 return 0;
292 }
293
294 /* If X is a constant, return the value sans apparent integer term;
295 otherwise return 0.
296 Only obvious integer terms are detected. */
297
298 rtx
299 get_related_value (x)
300 rtx x;
301 {
302 if (GET_CODE (x) != CONST)
303 return 0;
304 x = XEXP (x, 0);
305 if (GET_CODE (x) == PLUS
306 && GET_CODE (XEXP (x, 1)) == CONST_INT)
307 return XEXP (x, 0);
308 else if (GET_CODE (x) == MINUS
309 && GET_CODE (XEXP (x, 1)) == CONST_INT)
310 return XEXP (x, 0);
311 return 0;
312 }
313 \f
314 /* Return the number of places FIND appears within X. If COUNT_DEST is
315 zero, we do not count occurrences inside the destination of a SET. */
316
317 int
318 count_occurrences (x, find, count_dest)
319 rtx x, find;
320 int count_dest;
321 {
322 int i, j;
323 enum rtx_code code;
324 const char *format_ptr;
325 int count;
326
327 if (x == find)
328 return 1;
329
330 code = GET_CODE (x);
331
332 switch (code)
333 {
334 case REG:
335 case CONST_INT:
336 case CONST_DOUBLE:
337 case SYMBOL_REF:
338 case CODE_LABEL:
339 case PC:
340 case CC0:
341 return 0;
342
343 case MEM:
344 if (GET_CODE (find) == MEM && rtx_equal_p (x, find))
345 return 1;
346 break;
347
348 case SET:
349 if (SET_DEST (x) == find && ! count_dest)
350 return count_occurrences (SET_SRC (x), find, count_dest);
351 break;
352
353 default:
354 break;
355 }
356
357 format_ptr = GET_RTX_FORMAT (code);
358 count = 0;
359
360 for (i = 0; i < GET_RTX_LENGTH (code); i++)
361 {
362 switch (*format_ptr++)
363 {
364 case 'e':
365 count += count_occurrences (XEXP (x, i), find, count_dest);
366 break;
367
368 case 'E':
369 for (j = 0; j < XVECLEN (x, i); j++)
370 count += count_occurrences (XVECEXP (x, i, j), find, count_dest);
371 break;
372 }
373 }
374 return count;
375 }
376 \f
377 /* Nonzero if register REG appears somewhere within IN.
378 Also works if REG is not a register; in this case it checks
379 for a subexpression of IN that is Lisp "equal" to REG. */
380
381 int
382 reg_mentioned_p (reg, in)
383 register rtx reg, in;
384 {
385 register const char *fmt;
386 register int i;
387 register enum rtx_code code;
388
389 if (in == 0)
390 return 0;
391
392 if (reg == in)
393 return 1;
394
395 if (GET_CODE (in) == LABEL_REF)
396 return reg == XEXP (in, 0);
397
398 code = GET_CODE (in);
399
400 switch (code)
401 {
402 /* Compare registers by number. */
403 case REG:
404 return GET_CODE (reg) == REG && REGNO (in) == REGNO (reg);
405
406 /* These codes have no constituent expressions
407 and are unique. */
408 case SCRATCH:
409 case CC0:
410 case PC:
411 return 0;
412
413 case CONST_INT:
414 return GET_CODE (reg) == CONST_INT && INTVAL (in) == INTVAL (reg);
415
416 case CONST_DOUBLE:
417 /* These are kept unique for a given value. */
418 return 0;
419
420 default:
421 break;
422 }
423
424 if (GET_CODE (reg) == code && rtx_equal_p (reg, in))
425 return 1;
426
427 fmt = GET_RTX_FORMAT (code);
428
429 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
430 {
431 if (fmt[i] == 'E')
432 {
433 register int j;
434 for (j = XVECLEN (in, i) - 1; j >= 0; j--)
435 if (reg_mentioned_p (reg, XVECEXP (in, i, j)))
436 return 1;
437 }
438 else if (fmt[i] == 'e'
439 && reg_mentioned_p (reg, XEXP (in, i)))
440 return 1;
441 }
442 return 0;
443 }
444 \f
445 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
446 no CODE_LABEL insn. */
447
448 int
449 no_labels_between_p (beg, end)
450 rtx beg, end;
451 {
452 register rtx p;
453 for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
454 if (GET_CODE (p) == CODE_LABEL)
455 return 0;
456 return 1;
457 }
458
459 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
460 no JUMP_INSN insn. */
461
462 int
463 no_jumps_between_p (beg, end)
464 rtx beg, end;
465 {
466 register rtx p;
467 for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
468 if (GET_CODE (p) == JUMP_INSN)
469 return 0;
470 return 1;
471 }
472
473 /* Nonzero if register REG is used in an insn between
474 FROM_INSN and TO_INSN (exclusive of those two). */
475
476 int
477 reg_used_between_p (reg, from_insn, to_insn)
478 rtx reg, from_insn, to_insn;
479 {
480 register rtx insn;
481
482 if (from_insn == to_insn)
483 return 0;
484
485 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
486 if (INSN_P (insn)
487 && (reg_overlap_mentioned_p (reg, PATTERN (insn))
488 || (GET_CODE (insn) == CALL_INSN
489 && (find_reg_fusage (insn, USE, reg)
490 || find_reg_fusage (insn, CLOBBER, reg)))))
491 return 1;
492 return 0;
493 }
494 \f
495 /* Nonzero if the old value of X, a register, is referenced in BODY. If X
496 is entirely replaced by a new value and the only use is as a SET_DEST,
497 we do not consider it a reference. */
498
499 int
500 reg_referenced_p (x, body)
501 rtx x;
502 rtx body;
503 {
504 int i;
505
506 switch (GET_CODE (body))
507 {
508 case SET:
509 if (reg_overlap_mentioned_p (x, SET_SRC (body)))
510 return 1;
511
512 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
513 of a REG that occupies all of the REG, the insn references X if
514 it is mentioned in the destination. */
515 if (GET_CODE (SET_DEST (body)) != CC0
516 && GET_CODE (SET_DEST (body)) != PC
517 && GET_CODE (SET_DEST (body)) != REG
518 && ! (GET_CODE (SET_DEST (body)) == SUBREG
519 && GET_CODE (SUBREG_REG (SET_DEST (body))) == REG
520 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body))))
521 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
522 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body)))
523 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
524 && reg_overlap_mentioned_p (x, SET_DEST (body)))
525 return 1;
526 return 0;
527
528 case ASM_OPERANDS:
529 for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
530 if (reg_overlap_mentioned_p (x, ASM_OPERANDS_INPUT (body, i)))
531 return 1;
532 return 0;
533
534 case CALL:
535 case USE:
536 case IF_THEN_ELSE:
537 return reg_overlap_mentioned_p (x, body);
538
539 case TRAP_IF:
540 return reg_overlap_mentioned_p (x, TRAP_CONDITION (body));
541
542 case UNSPEC:
543 case UNSPEC_VOLATILE:
544 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
545 if (reg_overlap_mentioned_p (x, XVECEXP (body, 0, i)))
546 return 1;
547 return 0;
548
549 case PARALLEL:
550 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
551 if (reg_referenced_p (x, XVECEXP (body, 0, i)))
552 return 1;
553 return 0;
554
555 case CLOBBER:
556 if (GET_CODE (XEXP (body, 0)) == MEM)
557 if (reg_overlap_mentioned_p (x, XEXP (XEXP (body, 0), 0)))
558 return 1;
559 return 0;
560
561 case COND_EXEC:
562 if (reg_overlap_mentioned_p (x, COND_EXEC_TEST (body)))
563 return 1;
564 return reg_referenced_p (x, COND_EXEC_CODE (body));
565
566 default:
567 return 0;
568 }
569 }
570
571 /* Nonzero if register REG is referenced in an insn between
572 FROM_INSN and TO_INSN (exclusive of those two). Sets of REG do
573 not count. */
574
575 int
576 reg_referenced_between_p (reg, from_insn, to_insn)
577 rtx reg, from_insn, to_insn;
578 {
579 register rtx insn;
580
581 if (from_insn == to_insn)
582 return 0;
583
584 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
585 if (INSN_P (insn)
586 && (reg_referenced_p (reg, PATTERN (insn))
587 || (GET_CODE (insn) == CALL_INSN
588 && find_reg_fusage (insn, USE, reg))))
589 return 1;
590 return 0;
591 }
592 \f
593 /* Nonzero if register REG is set or clobbered in an insn between
594 FROM_INSN and TO_INSN (exclusive of those two). */
595
596 int
597 reg_set_between_p (reg, from_insn, to_insn)
598 rtx reg, from_insn, to_insn;
599 {
600 register rtx insn;
601
602 if (from_insn == to_insn)
603 return 0;
604
605 for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
606 if (INSN_P (insn) && reg_set_p (reg, insn))
607 return 1;
608 return 0;
609 }
610
611 /* Internals of reg_set_between_p. */
612
613 static rtx reg_set_reg;
614 static int reg_set_flag;
615
616 static void
617 reg_set_p_1 (x, pat, data)
618 rtx x;
619 rtx pat ATTRIBUTE_UNUSED;
620 void *data ATTRIBUTE_UNUSED;
621 {
622 /* We don't want to return 1 if X is a MEM that contains a register
623 within REG_SET_REG. */
624
625 if ((GET_CODE (x) != MEM)
626 && reg_overlap_mentioned_p (reg_set_reg, x))
627 reg_set_flag = 1;
628 }
629
630 int
631 reg_set_p (reg, insn)
632 rtx reg, insn;
633 {
634 rtx body = insn;
635
636 /* We can be passed an insn or part of one. If we are passed an insn,
637 check if a side-effect of the insn clobbers REG. */
638 if (INSN_P (insn))
639 {
640 if (FIND_REG_INC_NOTE (insn, reg)
641 || (GET_CODE (insn) == CALL_INSN
642 /* We'd like to test call_used_regs here, but rtlanal.c can't
643 reference that variable due to its use in genattrtab. So
644 we'll just be more conservative.
645
646 ??? Unless we could ensure that the CALL_INSN_FUNCTION_USAGE
647 information holds all clobbered registers. */
648 && ((GET_CODE (reg) == REG
649 && REGNO (reg) < FIRST_PSEUDO_REGISTER)
650 || GET_CODE (reg) == MEM
651 || find_reg_fusage (insn, CLOBBER, reg))))
652 return 1;
653
654 body = PATTERN (insn);
655 }
656
657 reg_set_reg = reg;
658 reg_set_flag = 0;
659 note_stores (body, reg_set_p_1, NULL);
660 return reg_set_flag;
661 }
662
663 /* Similar to reg_set_between_p, but check all registers in X. Return 0
664 only if none of them are modified between START and END. Do not
665 consider non-registers one way or the other. */
666
667 int
668 regs_set_between_p (x, start, end)
669 rtx x;
670 rtx start, end;
671 {
672 enum rtx_code code = GET_CODE (x);
673 const char *fmt;
674 int i, j;
675
676 switch (code)
677 {
678 case CONST_INT:
679 case CONST_DOUBLE:
680 case CONST:
681 case SYMBOL_REF:
682 case LABEL_REF:
683 case PC:
684 case CC0:
685 return 0;
686
687 case REG:
688 return reg_set_between_p (x, start, end);
689
690 default:
691 break;
692 }
693
694 fmt = GET_RTX_FORMAT (code);
695 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
696 {
697 if (fmt[i] == 'e' && regs_set_between_p (XEXP (x, i), start, end))
698 return 1;
699
700 else if (fmt[i] == 'E')
701 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
702 if (regs_set_between_p (XVECEXP (x, i, j), start, end))
703 return 1;
704 }
705
706 return 0;
707 }
708
709 /* Similar to reg_set_between_p, but check all registers in X. Return 0
710 only if none of them are modified between START and END. Return 1 if
711 X contains a MEM; this routine does not perform any memory aliasing. */
712
713 int
714 modified_between_p (x, start, end)
715 rtx x;
716 rtx start, end;
717 {
718 enum rtx_code code = GET_CODE (x);
719 const char *fmt;
720 int i, j;
721
722 switch (code)
723 {
724 case CONST_INT:
725 case CONST_DOUBLE:
726 case CONST:
727 case SYMBOL_REF:
728 case LABEL_REF:
729 return 0;
730
731 case PC:
732 case CC0:
733 return 1;
734
735 case MEM:
736 /* If the memory is not constant, assume it is modified. If it is
737 constant, we still have to check the address. */
738 if (! RTX_UNCHANGING_P (x))
739 return 1;
740 break;
741
742 case REG:
743 return reg_set_between_p (x, start, end);
744
745 default:
746 break;
747 }
748
749 fmt = GET_RTX_FORMAT (code);
750 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
751 {
752 if (fmt[i] == 'e' && modified_between_p (XEXP (x, i), start, end))
753 return 1;
754
755 else if (fmt[i] == 'E')
756 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
757 if (modified_between_p (XVECEXP (x, i, j), start, end))
758 return 1;
759 }
760
761 return 0;
762 }
763
764 /* Similar to reg_set_p, but check all registers in X. Return 0 only if none
765 of them are modified in INSN. Return 1 if X contains a MEM; this routine
766 does not perform any memory aliasing. */
767
768 int
769 modified_in_p (x, insn)
770 rtx x;
771 rtx insn;
772 {
773 enum rtx_code code = GET_CODE (x);
774 const char *fmt;
775 int i, j;
776
777 switch (code)
778 {
779 case CONST_INT:
780 case CONST_DOUBLE:
781 case CONST:
782 case SYMBOL_REF:
783 case LABEL_REF:
784 return 0;
785
786 case PC:
787 case CC0:
788 return 1;
789
790 case MEM:
791 /* If the memory is not constant, assume it is modified. If it is
792 constant, we still have to check the address. */
793 if (! RTX_UNCHANGING_P (x))
794 return 1;
795 break;
796
797 case REG:
798 return reg_set_p (x, insn);
799
800 default:
801 break;
802 }
803
804 fmt = GET_RTX_FORMAT (code);
805 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
806 {
807 if (fmt[i] == 'e' && modified_in_p (XEXP (x, i), insn))
808 return 1;
809
810 else if (fmt[i] == 'E')
811 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
812 if (modified_in_p (XVECEXP (x, i, j), insn))
813 return 1;
814 }
815
816 return 0;
817 }
818
819 /* Return true if anything in insn X is (anti,output,true) dependent on
820 anything in insn Y. */
821
822 int
823 insn_dependent_p (x, y)
824 rtx x, y;
825 {
826 rtx tmp;
827
828 if (! INSN_P (x) || ! INSN_P (y))
829 abort ();
830
831 tmp = PATTERN (y);
832 note_stores (PATTERN (x), insn_dependent_p_1, &tmp);
833 if (tmp == NULL_RTX)
834 return 1;
835
836 tmp = PATTERN (x);
837 note_stores (PATTERN (y), insn_dependent_p_1, &tmp);
838 if (tmp == NULL_RTX)
839 return 1;
840
841 return 0;
842 }
843
844 /* A helper routine for insn_dependent_p called through note_stores. */
845
846 static void
847 insn_dependent_p_1 (x, pat, data)
848 rtx x;
849 rtx pat ATTRIBUTE_UNUSED;
850 void *data;
851 {
852 rtx * pinsn = (rtx *) data;
853
854 if (*pinsn && reg_mentioned_p (x, *pinsn))
855 *pinsn = NULL_RTX;
856 }
857 \f
858 /* Given an INSN, return a SET expression if this insn has only a single SET.
859 It may also have CLOBBERs, USEs, or SET whose output
860 will not be used, which we ignore. */
861
862 rtx
863 single_set_2 (insn, pat)
864 rtx insn, pat;
865 {
866 rtx set = NULL;
867 int set_verified = 1;
868 int i;
869
870 if (GET_CODE (pat) == PARALLEL)
871 {
872 for (i = 0; i < XVECLEN (pat, 0); i++)
873 {
874 rtx sub = XVECEXP (pat, 0, i);
875 switch (GET_CODE (sub))
876 {
877 case USE:
878 case CLOBBER:
879 break;
880
881 case SET:
882 /* We can consider insns having multiple sets, where all
883 but one are dead as single set insns. In common case
884 only single set is present in the pattern so we want
885 to avoid checking for REG_UNUSED notes unless neccesary.
886
887 When we reach set first time, we just expect this is
888 the single set we are looking for and only when more
889 sets are found in the insn, we check them. */
890 if (!set_verified)
891 {
892 if (find_reg_note (insn, REG_UNUSED, SET_DEST (set))
893 && !side_effects_p (set))
894 set = NULL;
895 else
896 set_verified = 1;
897 }
898 if (!set)
899 set = sub, set_verified = 0;
900 else if (!find_reg_note (insn, REG_UNUSED, SET_DEST (sub))
901 || side_effects_p (sub))
902 return NULL_RTX;
903 break;
904
905 default:
906 return NULL_RTX;
907 }
908 }
909 }
910 return set;
911 }
912
913 /* Given an INSN, return nonzero if it has more than one SET, else return
914 zero. */
915
916 int
917 multiple_sets (insn)
918 rtx insn;
919 {
920 int found;
921 int i;
922
923 /* INSN must be an insn. */
924 if (! INSN_P (insn))
925 return 0;
926
927 /* Only a PARALLEL can have multiple SETs. */
928 if (GET_CODE (PATTERN (insn)) == PARALLEL)
929 {
930 for (i = 0, found = 0; i < XVECLEN (PATTERN (insn), 0); i++)
931 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
932 {
933 /* If we have already found a SET, then return now. */
934 if (found)
935 return 1;
936 else
937 found = 1;
938 }
939 }
940
941 /* Either zero or one SET. */
942 return 0;
943 }
944 \f
945 /* Return the last thing that X was assigned from before *PINSN. If VALID_TO
946 is not NULL_RTX then verify that the object is not modified up to VALID_TO.
947 If the object was modified, if we hit a partial assignment to X, or hit a
948 CODE_LABEL first, return X. If we found an assignment, update *PINSN to
949 point to it. ALLOW_HWREG is set to 1 if hardware registers are allowed to
950 be the src. */
951
952 rtx
953 find_last_value (x, pinsn, valid_to, allow_hwreg)
954 rtx x;
955 rtx *pinsn;
956 rtx valid_to;
957 int allow_hwreg;
958 {
959 rtx p;
960
961 for (p = PREV_INSN (*pinsn); p && GET_CODE (p) != CODE_LABEL;
962 p = PREV_INSN (p))
963 if (INSN_P (p))
964 {
965 rtx set = single_set (p);
966 rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
967
968 if (set && rtx_equal_p (x, SET_DEST (set)))
969 {
970 rtx src = SET_SRC (set);
971
972 if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
973 src = XEXP (note, 0);
974
975 if ((valid_to == NULL_RTX
976 || ! modified_between_p (src, PREV_INSN (p), valid_to))
977 /* Reject hard registers because we don't usually want
978 to use them; we'd rather use a pseudo. */
979 && (! (GET_CODE (src) == REG
980 && REGNO (src) < FIRST_PSEUDO_REGISTER) || allow_hwreg))
981 {
982 *pinsn = p;
983 return src;
984 }
985 }
986
987 /* If set in non-simple way, we don't have a value. */
988 if (reg_set_p (x, p))
989 break;
990 }
991
992 return x;
993 }
994 \f
995 /* Return nonzero if register in range [REGNO, ENDREGNO)
996 appears either explicitly or implicitly in X
997 other than being stored into.
998
999 References contained within the substructure at LOC do not count.
1000 LOC may be zero, meaning don't ignore anything. */
1001
1002 int
1003 refers_to_regno_p (regno, endregno, x, loc)
1004 unsigned int regno, endregno;
1005 rtx x;
1006 rtx *loc;
1007 {
1008 int i;
1009 unsigned int x_regno;
1010 RTX_CODE code;
1011 const char *fmt;
1012
1013 repeat:
1014 /* The contents of a REG_NONNEG note is always zero, so we must come here
1015 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
1016 if (x == 0)
1017 return 0;
1018
1019 code = GET_CODE (x);
1020
1021 switch (code)
1022 {
1023 case REG:
1024 x_regno = REGNO (x);
1025
1026 /* If we modifying the stack, frame, or argument pointer, it will
1027 clobber a virtual register. In fact, we could be more precise,
1028 but it isn't worth it. */
1029 if ((x_regno == STACK_POINTER_REGNUM
1030 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1031 || x_regno == ARG_POINTER_REGNUM
1032 #endif
1033 || x_regno == FRAME_POINTER_REGNUM)
1034 && regno >= FIRST_VIRTUAL_REGISTER && regno <= LAST_VIRTUAL_REGISTER)
1035 return 1;
1036
1037 return (endregno > x_regno
1038 && regno < x_regno + (x_regno < FIRST_PSEUDO_REGISTER
1039 ? HARD_REGNO_NREGS (x_regno, GET_MODE (x))
1040 : 1));
1041
1042 case SUBREG:
1043 /* If this is a SUBREG of a hard reg, we can see exactly which
1044 registers are being modified. Otherwise, handle normally. */
1045 if (GET_CODE (SUBREG_REG (x)) == REG
1046 && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
1047 {
1048 unsigned int inner_regno = REGNO (SUBREG_REG (x)) + SUBREG_WORD (x);
1049 unsigned int inner_endregno
1050 = inner_regno + (inner_regno < FIRST_PSEUDO_REGISTER
1051 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
1052
1053 return endregno > inner_regno && regno < inner_endregno;
1054 }
1055 break;
1056
1057 case CLOBBER:
1058 case SET:
1059 if (&SET_DEST (x) != loc
1060 /* Note setting a SUBREG counts as referring to the REG it is in for
1061 a pseudo but not for hard registers since we can
1062 treat each word individually. */
1063 && ((GET_CODE (SET_DEST (x)) == SUBREG
1064 && loc != &SUBREG_REG (SET_DEST (x))
1065 && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG
1066 && REGNO (SUBREG_REG (SET_DEST (x))) >= FIRST_PSEUDO_REGISTER
1067 && refers_to_regno_p (regno, endregno,
1068 SUBREG_REG (SET_DEST (x)), loc))
1069 || (GET_CODE (SET_DEST (x)) != REG
1070 && refers_to_regno_p (regno, endregno, SET_DEST (x), loc))))
1071 return 1;
1072
1073 if (code == CLOBBER || loc == &SET_SRC (x))
1074 return 0;
1075 x = SET_SRC (x);
1076 goto repeat;
1077
1078 default:
1079 break;
1080 }
1081
1082 /* X does not match, so try its subexpressions. */
1083
1084 fmt = GET_RTX_FORMAT (code);
1085 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1086 {
1087 if (fmt[i] == 'e' && loc != &XEXP (x, i))
1088 {
1089 if (i == 0)
1090 {
1091 x = XEXP (x, 0);
1092 goto repeat;
1093 }
1094 else
1095 if (refers_to_regno_p (regno, endregno, XEXP (x, i), loc))
1096 return 1;
1097 }
1098 else if (fmt[i] == 'E')
1099 {
1100 register int j;
1101 for (j = XVECLEN (x, i) - 1; j >=0; j--)
1102 if (loc != &XVECEXP (x, i, j)
1103 && refers_to_regno_p (regno, endregno, XVECEXP (x, i, j), loc))
1104 return 1;
1105 }
1106 }
1107 return 0;
1108 }
1109
1110 /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
1111 we check if any register number in X conflicts with the relevant register
1112 numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
1113 contains a MEM (we don't bother checking for memory addresses that can't
1114 conflict because we expect this to be a rare case. */
1115
1116 int
1117 reg_overlap_mentioned_p (x, in)
1118 rtx x, in;
1119 {
1120 unsigned int regno, endregno;
1121
1122 /* Overly conservative. */
1123 if (GET_CODE (x) == STRICT_LOW_PART)
1124 x = XEXP (x, 0);
1125
1126 /* If either argument is a constant, then modifying X can not affect IN. */
1127 if (CONSTANT_P (x) || CONSTANT_P (in))
1128 return 0;
1129
1130 switch (GET_CODE (x))
1131 {
1132 case SUBREG:
1133 regno = REGNO (SUBREG_REG (x));
1134 if (regno < FIRST_PSEUDO_REGISTER)
1135 regno += SUBREG_WORD (x);
1136 goto do_reg;
1137
1138 case REG:
1139 regno = REGNO (x);
1140 do_reg:
1141 endregno = regno + (regno < FIRST_PSEUDO_REGISTER
1142 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
1143 return refers_to_regno_p (regno, endregno, in, NULL_PTR);
1144
1145 case MEM:
1146 {
1147 const char *fmt;
1148 int i;
1149
1150 if (GET_CODE (in) == MEM)
1151 return 1;
1152
1153 fmt = GET_RTX_FORMAT (GET_CODE (in));
1154 for (i = GET_RTX_LENGTH (GET_CODE (in)) - 1; i >= 0; i--)
1155 if (fmt[i] == 'e' && reg_overlap_mentioned_p (x, XEXP (in, i)))
1156 return 1;
1157
1158 return 0;
1159 }
1160
1161 case SCRATCH:
1162 case PC:
1163 case CC0:
1164 return reg_mentioned_p (x, in);
1165
1166 case PARALLEL:
1167 {
1168 int i, n;
1169
1170 /* Check for a NULL entry, used to indicate that the parameter goes
1171 both on the stack and in registers. */
1172 if (XEXP (XVECEXP (x, 0, 0), 0))
1173 i = 0;
1174 else
1175 i = 1;
1176
1177 /* If any register in here refers to it we return true. */
1178 for (n = XVECLEN (x, 0); i < n; ++i)
1179 if (reg_overlap_mentioned_p (XEXP (XVECEXP (x, 0, i), 0), in))
1180 return 1;
1181 return 0;
1182 }
1183
1184 default:
1185 break;
1186 }
1187
1188 abort ();
1189 }
1190 \f
1191 /* Used for communications between the next few functions. */
1192
1193 static int reg_set_last_unknown;
1194 static rtx reg_set_last_value;
1195 static unsigned int reg_set_last_first_regno, reg_set_last_last_regno;
1196
1197 /* Called via note_stores from reg_set_last. */
1198
1199 static void
1200 reg_set_last_1 (x, pat, data)
1201 rtx x;
1202 rtx pat;
1203 void *data ATTRIBUTE_UNUSED;
1204 {
1205 unsigned int first, last;
1206
1207 /* If X is not a register, or is not one in the range we care
1208 about, ignore. */
1209 if (GET_CODE (x) != REG)
1210 return;
1211
1212 first = REGNO (x);
1213 last = first + (first < FIRST_PSEUDO_REGISTER
1214 ? HARD_REGNO_NREGS (first, GET_MODE (x)) : 1);
1215
1216 if (first >= reg_set_last_last_regno
1217 || last <= reg_set_last_first_regno)
1218 return;
1219
1220 /* If this is a CLOBBER or is some complex LHS, or doesn't modify
1221 exactly the registers we care about, show we don't know the value. */
1222 if (GET_CODE (pat) == CLOBBER || SET_DEST (pat) != x
1223 || first != reg_set_last_first_regno
1224 || last != reg_set_last_last_regno)
1225 reg_set_last_unknown = 1;
1226 else
1227 reg_set_last_value = SET_SRC (pat);
1228 }
1229
1230 /* Return the last value to which REG was set prior to INSN. If we can't
1231 find it easily, return 0.
1232
1233 We only return a REG, SUBREG, or constant because it is too hard to
1234 check if a MEM remains unchanged. */
1235
1236 rtx
1237 reg_set_last (x, insn)
1238 rtx x;
1239 rtx insn;
1240 {
1241 rtx orig_insn = insn;
1242
1243 reg_set_last_first_regno = REGNO (x);
1244
1245 reg_set_last_last_regno
1246 = reg_set_last_first_regno
1247 + (reg_set_last_first_regno < FIRST_PSEUDO_REGISTER
1248 ? HARD_REGNO_NREGS (reg_set_last_first_regno, GET_MODE (x)) : 1);
1249
1250 reg_set_last_unknown = 0;
1251 reg_set_last_value = 0;
1252
1253 /* Scan backwards until reg_set_last_1 changed one of the above flags.
1254 Stop when we reach a label or X is a hard reg and we reach a
1255 CALL_INSN (if reg_set_last_last_regno is a hard reg).
1256
1257 If we find a set of X, ensure that its SET_SRC remains unchanged. */
1258
1259 /* We compare with <= here, because reg_set_last_last_regno
1260 is actually the number of the first reg *not* in X. */
1261 for (;
1262 insn && GET_CODE (insn) != CODE_LABEL
1263 && ! (GET_CODE (insn) == CALL_INSN
1264 && reg_set_last_last_regno <= FIRST_PSEUDO_REGISTER);
1265 insn = PREV_INSN (insn))
1266 if (INSN_P (insn))
1267 {
1268 note_stores (PATTERN (insn), reg_set_last_1, NULL);
1269 if (reg_set_last_unknown)
1270 return 0;
1271 else if (reg_set_last_value)
1272 {
1273 if (CONSTANT_P (reg_set_last_value)
1274 || ((GET_CODE (reg_set_last_value) == REG
1275 || GET_CODE (reg_set_last_value) == SUBREG)
1276 && ! reg_set_between_p (reg_set_last_value,
1277 insn, orig_insn)))
1278 return reg_set_last_value;
1279 else
1280 return 0;
1281 }
1282 }
1283
1284 return 0;
1285 }
1286 \f
1287 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1288 (X would be the pattern of an insn).
1289 FUN receives two arguments:
1290 the REG, MEM, CC0 or PC being stored in or clobbered,
1291 the SET or CLOBBER rtx that does the store.
1292
1293 If the item being stored in or clobbered is a SUBREG of a hard register,
1294 the SUBREG will be passed. */
1295
1296 void
1297 note_stores (x, fun, data)
1298 register rtx x;
1299 void (*fun) PARAMS ((rtx, rtx, void *));
1300 void *data;
1301 {
1302 if (GET_CODE (x) == COND_EXEC)
1303 x = COND_EXEC_CODE (x);
1304 if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
1305 {
1306 register rtx dest = SET_DEST (x);
1307 while ((GET_CODE (dest) == SUBREG
1308 && (GET_CODE (SUBREG_REG (dest)) != REG
1309 || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER))
1310 || GET_CODE (dest) == ZERO_EXTRACT
1311 || GET_CODE (dest) == SIGN_EXTRACT
1312 || GET_CODE (dest) == STRICT_LOW_PART)
1313 dest = XEXP (dest, 0);
1314
1315 if (GET_CODE (dest) == PARALLEL
1316 && GET_MODE (dest) == BLKmode)
1317 {
1318 register int i;
1319 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
1320 (*fun) (SET_DEST (XVECEXP (dest, 0, i)), x, data);
1321 }
1322 else
1323 (*fun) (dest, x, data);
1324 }
1325 else if (GET_CODE (x) == PARALLEL)
1326 {
1327 register int i;
1328 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
1329 {
1330 register rtx y = XVECEXP (x, 0, i);
1331 if (GET_CODE (y) == COND_EXEC)
1332 y = COND_EXEC_CODE (y);
1333 if (GET_CODE (y) == SET || GET_CODE (y) == CLOBBER)
1334 {
1335 register rtx dest = SET_DEST (y);
1336 while ((GET_CODE (dest) == SUBREG
1337 && (GET_CODE (SUBREG_REG (dest)) != REG
1338 || (REGNO (SUBREG_REG (dest))
1339 >= FIRST_PSEUDO_REGISTER)))
1340 || GET_CODE (dest) == ZERO_EXTRACT
1341 || GET_CODE (dest) == SIGN_EXTRACT
1342 || GET_CODE (dest) == STRICT_LOW_PART)
1343 dest = XEXP (dest, 0);
1344 if (GET_CODE (dest) == PARALLEL
1345 && GET_MODE (dest) == BLKmode)
1346 {
1347 register int i;
1348
1349 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
1350 (*fun) (SET_DEST (XVECEXP (dest, 0, i)), y, data);
1351 }
1352 else
1353 (*fun) (dest, y, data);
1354 }
1355 }
1356 }
1357 }
1358 \f
1359 /* Return nonzero if X's old contents don't survive after INSN.
1360 This will be true if X is (cc0) or if X is a register and
1361 X dies in INSN or because INSN entirely sets X.
1362
1363 "Entirely set" means set directly and not through a SUBREG,
1364 ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1365 Likewise, REG_INC does not count.
1366
1367 REG may be a hard or pseudo reg. Renumbering is not taken into account,
1368 but for this use that makes no difference, since regs don't overlap
1369 during their lifetimes. Therefore, this function may be used
1370 at any time after deaths have been computed (in flow.c).
1371
1372 If REG is a hard reg that occupies multiple machine registers, this
1373 function will only return 1 if each of those registers will be replaced
1374 by INSN. */
1375
1376 int
1377 dead_or_set_p (insn, x)
1378 rtx insn;
1379 rtx x;
1380 {
1381 unsigned int regno, last_regno;
1382 unsigned int i;
1383
1384 /* Can't use cc0_rtx below since this file is used by genattrtab.c. */
1385 if (GET_CODE (x) == CC0)
1386 return 1;
1387
1388 if (GET_CODE (x) != REG)
1389 abort ();
1390
1391 regno = REGNO (x);
1392 last_regno = (regno >= FIRST_PSEUDO_REGISTER ? regno
1393 : regno + HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1);
1394
1395 for (i = regno; i <= last_regno; i++)
1396 if (! dead_or_set_regno_p (insn, i))
1397 return 0;
1398
1399 return 1;
1400 }
1401
1402 /* Utility function for dead_or_set_p to check an individual register. Also
1403 called from flow.c. */
1404
1405 int
1406 dead_or_set_regno_p (insn, test_regno)
1407 rtx insn;
1408 unsigned int test_regno;
1409 {
1410 unsigned int regno, endregno;
1411 rtx pattern;
1412
1413 /* See if there is a death note for something that includes TEST_REGNO. */
1414 if (find_regno_note (insn, REG_DEAD, test_regno))
1415 return 1;
1416
1417 if (GET_CODE (insn) == CALL_INSN
1418 && find_regno_fusage (insn, CLOBBER, test_regno))
1419 return 1;
1420
1421 pattern = PATTERN (insn);
1422
1423 if (GET_CODE (pattern) == COND_EXEC)
1424 pattern = COND_EXEC_CODE (pattern);
1425
1426 if (GET_CODE (pattern) == SET)
1427 {
1428 rtx dest = SET_DEST (PATTERN (insn));
1429
1430 /* A value is totally replaced if it is the destination or the
1431 destination is a SUBREG of REGNO that does not change the number of
1432 words in it. */
1433 if (GET_CODE (dest) == SUBREG
1434 && (((GET_MODE_SIZE (GET_MODE (dest))
1435 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1436 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1437 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1438 dest = SUBREG_REG (dest);
1439
1440 if (GET_CODE (dest) != REG)
1441 return 0;
1442
1443 regno = REGNO (dest);
1444 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1445 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1446
1447 return (test_regno >= regno && test_regno < endregno);
1448 }
1449 else if (GET_CODE (pattern) == PARALLEL)
1450 {
1451 register int i;
1452
1453 for (i = XVECLEN (pattern, 0) - 1; i >= 0; i--)
1454 {
1455 rtx body = XVECEXP (pattern, 0, i);
1456
1457 if (GET_CODE (body) == COND_EXEC)
1458 body = COND_EXEC_CODE (body);
1459
1460 if (GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1461 {
1462 rtx dest = SET_DEST (body);
1463
1464 if (GET_CODE (dest) == SUBREG
1465 && (((GET_MODE_SIZE (GET_MODE (dest))
1466 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1467 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1468 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1469 dest = SUBREG_REG (dest);
1470
1471 if (GET_CODE (dest) != REG)
1472 continue;
1473
1474 regno = REGNO (dest);
1475 endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1476 : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1477
1478 if (test_regno >= regno && test_regno < endregno)
1479 return 1;
1480 }
1481 }
1482 }
1483
1484 return 0;
1485 }
1486
1487 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1488 If DATUM is nonzero, look for one whose datum is DATUM. */
1489
1490 rtx
1491 find_reg_note (insn, kind, datum)
1492 rtx insn;
1493 enum reg_note kind;
1494 rtx datum;
1495 {
1496 register rtx link;
1497
1498 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1499 if (! INSN_P (insn))
1500 return 0;
1501
1502 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1503 if (REG_NOTE_KIND (link) == kind
1504 && (datum == 0 || datum == XEXP (link, 0)))
1505 return link;
1506 return 0;
1507 }
1508
1509 /* Return the reg-note of kind KIND in insn INSN which applies to register
1510 number REGNO, if any. Return 0 if there is no such reg-note. Note that
1511 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1512 it might be the case that the note overlaps REGNO. */
1513
1514 rtx
1515 find_regno_note (insn, kind, regno)
1516 rtx insn;
1517 enum reg_note kind;
1518 unsigned int regno;
1519 {
1520 register rtx link;
1521
1522 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
1523 if (! INSN_P (insn))
1524 return 0;
1525
1526 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1527 if (REG_NOTE_KIND (link) == kind
1528 /* Verify that it is a register, so that scratch and MEM won't cause a
1529 problem here. */
1530 && GET_CODE (XEXP (link, 0)) == REG
1531 && REGNO (XEXP (link, 0)) <= regno
1532 && ((REGNO (XEXP (link, 0))
1533 + (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
1534 : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
1535 GET_MODE (XEXP (link, 0)))))
1536 > regno))
1537 return link;
1538 return 0;
1539 }
1540
1541 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1542 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1543
1544 int
1545 find_reg_fusage (insn, code, datum)
1546 rtx insn;
1547 enum rtx_code code;
1548 rtx datum;
1549 {
1550 /* If it's not a CALL_INSN, it can't possibly have a
1551 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
1552 if (GET_CODE (insn) != CALL_INSN)
1553 return 0;
1554
1555 if (! datum)
1556 abort();
1557
1558 if (GET_CODE (datum) != REG)
1559 {
1560 register rtx link;
1561
1562 for (link = CALL_INSN_FUNCTION_USAGE (insn);
1563 link;
1564 link = XEXP (link, 1))
1565 if (GET_CODE (XEXP (link, 0)) == code
1566 && rtx_equal_p (datum, SET_DEST (XEXP (link, 0))))
1567 return 1;
1568 }
1569 else
1570 {
1571 unsigned int regno = REGNO (datum);
1572
1573 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1574 to pseudo registers, so don't bother checking. */
1575
1576 if (regno < FIRST_PSEUDO_REGISTER)
1577 {
1578 unsigned int end_regno
1579 = regno + HARD_REGNO_NREGS (regno, GET_MODE (datum));
1580 unsigned int i;
1581
1582 for (i = regno; i < end_regno; i++)
1583 if (find_regno_fusage (insn, code, i))
1584 return 1;
1585 }
1586 }
1587
1588 return 0;
1589 }
1590
1591 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1592 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
1593
1594 int
1595 find_regno_fusage (insn, code, regno)
1596 rtx insn;
1597 enum rtx_code code;
1598 unsigned int regno;
1599 {
1600 register rtx link;
1601
1602 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1603 to pseudo registers, so don't bother checking. */
1604
1605 if (regno >= FIRST_PSEUDO_REGISTER
1606 || GET_CODE (insn) != CALL_INSN )
1607 return 0;
1608
1609 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1610 {
1611 unsigned int regnote;
1612 rtx op, reg;
1613
1614 if (GET_CODE (op = XEXP (link, 0)) == code
1615 && GET_CODE (reg = XEXP (op, 0)) == REG
1616 && (regnote = REGNO (reg)) <= regno
1617 && regnote + HARD_REGNO_NREGS (regnote, GET_MODE (reg)) > regno)
1618 return 1;
1619 }
1620
1621 return 0;
1622 }
1623 \f
1624 /* Remove register note NOTE from the REG_NOTES of INSN. */
1625
1626 void
1627 remove_note (insn, note)
1628 register rtx insn;
1629 register rtx note;
1630 {
1631 register rtx link;
1632
1633 if (note == NULL_RTX)
1634 return;
1635
1636 if (REG_NOTES (insn) == note)
1637 {
1638 REG_NOTES (insn) = XEXP (note, 1);
1639 return;
1640 }
1641
1642 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1643 if (XEXP (link, 1) == note)
1644 {
1645 XEXP (link, 1) = XEXP (note, 1);
1646 return;
1647 }
1648
1649 abort ();
1650 }
1651
1652 /* Search LISTP (an EXPR_LIST) for NODE and remove NODE from the list
1653 if it is found.
1654
1655 A simple equality test is used to determine if NODE is on the
1656 EXPR_LIST. */
1657
1658 void
1659 remove_node_from_expr_list (node, listp)
1660 rtx node;
1661 rtx *listp;
1662 {
1663 rtx temp = *listp;
1664 rtx prev = NULL_RTX;
1665
1666 while (temp)
1667 {
1668 if (node == XEXP (temp, 0))
1669 {
1670 /* Splice the node out of the list. */
1671 if (prev)
1672 XEXP (prev, 1) = XEXP (temp, 1);
1673 else
1674 *listp = XEXP (temp, 1);
1675
1676 return;
1677 }
1678 temp = XEXP (temp, 1);
1679 }
1680 }
1681 \f
1682 /* Nonzero if X contains any volatile instructions. These are instructions
1683 which may cause unpredictable machine state instructions, and thus no
1684 instructions should be moved or combined across them. This includes
1685 only volatile asms and UNSPEC_VOLATILE instructions. */
1686
1687 int
1688 volatile_insn_p (x)
1689 rtx x;
1690 {
1691 register RTX_CODE code;
1692
1693 code = GET_CODE (x);
1694 switch (code)
1695 {
1696 case LABEL_REF:
1697 case SYMBOL_REF:
1698 case CONST_INT:
1699 case CONST:
1700 case CONST_DOUBLE:
1701 case CC0:
1702 case PC:
1703 case REG:
1704 case SCRATCH:
1705 case CLOBBER:
1706 case ASM_INPUT:
1707 case ADDR_VEC:
1708 case ADDR_DIFF_VEC:
1709 case CALL:
1710 case MEM:
1711 return 0;
1712
1713 case UNSPEC_VOLATILE:
1714 /* case TRAP_IF: This isn't clear yet. */
1715 return 1;
1716
1717 case ASM_OPERANDS:
1718 if (MEM_VOLATILE_P (x))
1719 return 1;
1720
1721 default:
1722 break;
1723 }
1724
1725 /* Recursively scan the operands of this expression. */
1726
1727 {
1728 register const char *fmt = GET_RTX_FORMAT (code);
1729 register int i;
1730
1731 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1732 {
1733 if (fmt[i] == 'e')
1734 {
1735 if (volatile_insn_p (XEXP (x, i)))
1736 return 1;
1737 }
1738 else if (fmt[i] == 'E')
1739 {
1740 register int j;
1741 for (j = 0; j < XVECLEN (x, i); j++)
1742 if (volatile_insn_p (XVECEXP (x, i, j)))
1743 return 1;
1744 }
1745 }
1746 }
1747 return 0;
1748 }
1749
1750 /* Nonzero if X contains any volatile memory references
1751 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
1752
1753 int
1754 volatile_refs_p (x)
1755 rtx x;
1756 {
1757 register RTX_CODE code;
1758
1759 code = GET_CODE (x);
1760 switch (code)
1761 {
1762 case LABEL_REF:
1763 case SYMBOL_REF:
1764 case CONST_INT:
1765 case CONST:
1766 case CONST_DOUBLE:
1767 case CC0:
1768 case PC:
1769 case REG:
1770 case SCRATCH:
1771 case CLOBBER:
1772 case ASM_INPUT:
1773 case ADDR_VEC:
1774 case ADDR_DIFF_VEC:
1775 return 0;
1776
1777 case CALL:
1778 case UNSPEC_VOLATILE:
1779 /* case TRAP_IF: This isn't clear yet. */
1780 return 1;
1781
1782 case MEM:
1783 case ASM_OPERANDS:
1784 if (MEM_VOLATILE_P (x))
1785 return 1;
1786
1787 default:
1788 break;
1789 }
1790
1791 /* Recursively scan the operands of this expression. */
1792
1793 {
1794 register const char *fmt = GET_RTX_FORMAT (code);
1795 register int i;
1796
1797 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1798 {
1799 if (fmt[i] == 'e')
1800 {
1801 if (volatile_refs_p (XEXP (x, i)))
1802 return 1;
1803 }
1804 else if (fmt[i] == 'E')
1805 {
1806 register int j;
1807 for (j = 0; j < XVECLEN (x, i); j++)
1808 if (volatile_refs_p (XVECEXP (x, i, j)))
1809 return 1;
1810 }
1811 }
1812 }
1813 return 0;
1814 }
1815
1816 /* Similar to above, except that it also rejects register pre- and post-
1817 incrementing. */
1818
1819 int
1820 side_effects_p (x)
1821 rtx x;
1822 {
1823 register RTX_CODE code;
1824
1825 code = GET_CODE (x);
1826 switch (code)
1827 {
1828 case LABEL_REF:
1829 case SYMBOL_REF:
1830 case CONST_INT:
1831 case CONST:
1832 case CONST_DOUBLE:
1833 case CC0:
1834 case PC:
1835 case REG:
1836 case SCRATCH:
1837 case ASM_INPUT:
1838 case ADDR_VEC:
1839 case ADDR_DIFF_VEC:
1840 return 0;
1841
1842 case CLOBBER:
1843 /* Reject CLOBBER with a non-VOID mode. These are made by combine.c
1844 when some combination can't be done. If we see one, don't think
1845 that we can simplify the expression. */
1846 return (GET_MODE (x) != VOIDmode);
1847
1848 case PRE_INC:
1849 case PRE_DEC:
1850 case POST_INC:
1851 case POST_DEC:
1852 case CALL:
1853 case UNSPEC_VOLATILE:
1854 /* case TRAP_IF: This isn't clear yet. */
1855 return 1;
1856
1857 case MEM:
1858 case ASM_OPERANDS:
1859 if (MEM_VOLATILE_P (x))
1860 return 1;
1861
1862 default:
1863 break;
1864 }
1865
1866 /* Recursively scan the operands of this expression. */
1867
1868 {
1869 register const char *fmt = GET_RTX_FORMAT (code);
1870 register int i;
1871
1872 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1873 {
1874 if (fmt[i] == 'e')
1875 {
1876 if (side_effects_p (XEXP (x, i)))
1877 return 1;
1878 }
1879 else if (fmt[i] == 'E')
1880 {
1881 register int j;
1882 for (j = 0; j < XVECLEN (x, i); j++)
1883 if (side_effects_p (XVECEXP (x, i, j)))
1884 return 1;
1885 }
1886 }
1887 }
1888 return 0;
1889 }
1890 \f
1891 /* Return nonzero if evaluating rtx X might cause a trap. */
1892
1893 int
1894 may_trap_p (x)
1895 rtx x;
1896 {
1897 int i;
1898 enum rtx_code code;
1899 const char *fmt;
1900
1901 if (x == 0)
1902 return 0;
1903 code = GET_CODE (x);
1904 switch (code)
1905 {
1906 /* Handle these cases quickly. */
1907 case CONST_INT:
1908 case CONST_DOUBLE:
1909 case SYMBOL_REF:
1910 case LABEL_REF:
1911 case CONST:
1912 case PC:
1913 case CC0:
1914 case REG:
1915 case SCRATCH:
1916 return 0;
1917
1918 case ASM_INPUT:
1919 case UNSPEC_VOLATILE:
1920 case TRAP_IF:
1921 return 1;
1922
1923 case ASM_OPERANDS:
1924 return MEM_VOLATILE_P (x);
1925
1926 /* Memory ref can trap unless it's a static var or a stack slot. */
1927 case MEM:
1928 return rtx_addr_can_trap_p (XEXP (x, 0));
1929
1930 /* Division by a non-constant might trap. */
1931 case DIV:
1932 case MOD:
1933 case UDIV:
1934 case UMOD:
1935 if (! CONSTANT_P (XEXP (x, 1))
1936 || GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1937 return 1;
1938 /* This was const0_rtx, but by not using that,
1939 we can link this file into other programs. */
1940 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
1941 return 1;
1942 break;
1943
1944 case EXPR_LIST:
1945 /* An EXPR_LIST is used to represent a function call. This
1946 certainly may trap. */
1947 return 1;
1948
1949 case GE:
1950 case GT:
1951 case LE:
1952 case LT:
1953 case COMPARE:
1954 /* Some floating point comparisons may trap. */
1955 /* ??? There is no machine independent way to check for tests that trap
1956 when COMPARE is used, though many targets do make this distinction.
1957 For instance, sparc uses CCFPE for compares which generate exceptions
1958 and CCFP for compares which do not generate exceptions. */
1959 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1960 return 1;
1961 /* But often the compare has some CC mode, so check operand
1962 modes as well. */
1963 if (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_FLOAT
1964 || GET_MODE_CLASS (GET_MODE (XEXP (x, 1))) == MODE_FLOAT)
1965 return 1;
1966 break;
1967
1968 default:
1969 /* Any floating arithmetic may trap. */
1970 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1971 return 1;
1972 }
1973
1974 fmt = GET_RTX_FORMAT (code);
1975 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1976 {
1977 if (fmt[i] == 'e')
1978 {
1979 if (may_trap_p (XEXP (x, i)))
1980 return 1;
1981 }
1982 else if (fmt[i] == 'E')
1983 {
1984 register int j;
1985 for (j = 0; j < XVECLEN (x, i); j++)
1986 if (may_trap_p (XVECEXP (x, i, j)))
1987 return 1;
1988 }
1989 }
1990 return 0;
1991 }
1992 \f
1993 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1994 i.e., an inequality. */
1995
1996 int
1997 inequality_comparisons_p (x)
1998 rtx x;
1999 {
2000 register const char *fmt;
2001 register int len, i;
2002 register enum rtx_code code = GET_CODE (x);
2003
2004 switch (code)
2005 {
2006 case REG:
2007 case SCRATCH:
2008 case PC:
2009 case CC0:
2010 case CONST_INT:
2011 case CONST_DOUBLE:
2012 case CONST:
2013 case LABEL_REF:
2014 case SYMBOL_REF:
2015 return 0;
2016
2017 case LT:
2018 case LTU:
2019 case GT:
2020 case GTU:
2021 case LE:
2022 case LEU:
2023 case GE:
2024 case GEU:
2025 return 1;
2026
2027 default:
2028 break;
2029 }
2030
2031 len = GET_RTX_LENGTH (code);
2032 fmt = GET_RTX_FORMAT (code);
2033
2034 for (i = 0; i < len; i++)
2035 {
2036 if (fmt[i] == 'e')
2037 {
2038 if (inequality_comparisons_p (XEXP (x, i)))
2039 return 1;
2040 }
2041 else if (fmt[i] == 'E')
2042 {
2043 register int j;
2044 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2045 if (inequality_comparisons_p (XVECEXP (x, i, j)))
2046 return 1;
2047 }
2048 }
2049
2050 return 0;
2051 }
2052 \f
2053 /* Replace any occurrence of FROM in X with TO. The function does
2054 not enter into CONST_DOUBLE for the replace.
2055
2056 Note that copying is not done so X must not be shared unless all copies
2057 are to be modified. */
2058
2059 rtx
2060 replace_rtx (x, from, to)
2061 rtx x, from, to;
2062 {
2063 register int i, j;
2064 register const char *fmt;
2065
2066 /* The following prevents loops occurrence when we change MEM in
2067 CONST_DOUBLE onto the same CONST_DOUBLE. */
2068 if (x != 0 && GET_CODE (x) == CONST_DOUBLE)
2069 return x;
2070
2071 if (x == from)
2072 return to;
2073
2074 /* Allow this function to make replacements in EXPR_LISTs. */
2075 if (x == 0)
2076 return 0;
2077
2078 fmt = GET_RTX_FORMAT (GET_CODE (x));
2079 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2080 {
2081 if (fmt[i] == 'e')
2082 XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
2083 else if (fmt[i] == 'E')
2084 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2085 XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
2086 }
2087
2088 return x;
2089 }
2090 \f
2091 /* Throughout the rtx X, replace many registers according to REG_MAP.
2092 Return the replacement for X (which may be X with altered contents).
2093 REG_MAP[R] is the replacement for register R, or 0 for don't replace.
2094 NREGS is the length of REG_MAP; regs >= NREGS are not mapped.
2095
2096 We only support REG_MAP entries of REG or SUBREG. Also, hard registers
2097 should not be mapped to pseudos or vice versa since validate_change
2098 is not called.
2099
2100 If REPLACE_DEST is 1, replacements are also done in destinations;
2101 otherwise, only sources are replaced. */
2102
2103 rtx
2104 replace_regs (x, reg_map, nregs, replace_dest)
2105 rtx x;
2106 rtx *reg_map;
2107 unsigned int nregs;
2108 int replace_dest;
2109 {
2110 register enum rtx_code code;
2111 register int i;
2112 register const char *fmt;
2113
2114 if (x == 0)
2115 return x;
2116
2117 code = GET_CODE (x);
2118 switch (code)
2119 {
2120 case SCRATCH:
2121 case PC:
2122 case CC0:
2123 case CONST_INT:
2124 case CONST_DOUBLE:
2125 case CONST:
2126 case SYMBOL_REF:
2127 case LABEL_REF:
2128 return x;
2129
2130 case REG:
2131 /* Verify that the register has an entry before trying to access it. */
2132 if (REGNO (x) < nregs && reg_map[REGNO (x)] != 0)
2133 {
2134 /* SUBREGs can't be shared. Always return a copy to ensure that if
2135 this replacement occurs more than once then each instance will
2136 get distinct rtx. */
2137 if (GET_CODE (reg_map[REGNO (x)]) == SUBREG)
2138 return copy_rtx (reg_map[REGNO (x)]);
2139 return reg_map[REGNO (x)];
2140 }
2141 return x;
2142
2143 case SUBREG:
2144 /* Prevent making nested SUBREGs. */
2145 if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < nregs
2146 && reg_map[REGNO (SUBREG_REG (x))] != 0
2147 && GET_CODE (reg_map[REGNO (SUBREG_REG (x))]) == SUBREG)
2148 {
2149 rtx map_val = reg_map[REGNO (SUBREG_REG (x))];
2150 rtx map_inner = SUBREG_REG (map_val);
2151
2152 if (GET_MODE (x) == GET_MODE (map_inner))
2153 return map_inner;
2154 else
2155 {
2156 /* We cannot call gen_rtx here since we may be linked with
2157 genattrtab.c. */
2158 /* Let's try clobbering the incoming SUBREG and see
2159 if this is really safe. */
2160 SUBREG_REG (x) = map_inner;
2161 SUBREG_WORD (x) += SUBREG_WORD (map_val);
2162 return x;
2163 #if 0
2164 rtx new = rtx_alloc (SUBREG);
2165 PUT_MODE (new, GET_MODE (x));
2166 SUBREG_REG (new) = map_inner;
2167 SUBREG_WORD (new) = SUBREG_WORD (x) + SUBREG_WORD (map_val);
2168 #endif
2169 }
2170 }
2171 break;
2172
2173 case SET:
2174 if (replace_dest)
2175 SET_DEST (x) = replace_regs (SET_DEST (x), reg_map, nregs, 0);
2176
2177 else if (GET_CODE (SET_DEST (x)) == MEM
2178 || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
2179 /* Even if we are not to replace destinations, replace register if it
2180 is CONTAINED in destination (destination is memory or
2181 STRICT_LOW_PART). */
2182 XEXP (SET_DEST (x), 0) = replace_regs (XEXP (SET_DEST (x), 0),
2183 reg_map, nregs, 0);
2184 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
2185 /* Similarly, for ZERO_EXTRACT we replace all operands. */
2186 break;
2187
2188 SET_SRC (x) = replace_regs (SET_SRC (x), reg_map, nregs, 0);
2189 return x;
2190
2191 default:
2192 break;
2193 }
2194
2195 fmt = GET_RTX_FORMAT (code);
2196 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2197 {
2198 if (fmt[i] == 'e')
2199 XEXP (x, i) = replace_regs (XEXP (x, i), reg_map, nregs, replace_dest);
2200 else if (fmt[i] == 'E')
2201 {
2202 register int j;
2203 for (j = 0; j < XVECLEN (x, i); j++)
2204 XVECEXP (x, i, j) = replace_regs (XVECEXP (x, i, j), reg_map,
2205 nregs, replace_dest);
2206 }
2207 }
2208 return x;
2209 }
2210
2211 /* Return 1 if X, the SRC_SRC of SET of (pc) contain a REG or MEM that is
2212 not in the constant pool and not in the condition of an IF_THEN_ELSE. */
2213
2214 static int
2215 jmp_uses_reg_or_mem (x)
2216 rtx x;
2217 {
2218 enum rtx_code code = GET_CODE (x);
2219 int i, j;
2220 const char *fmt;
2221
2222 switch (code)
2223 {
2224 case CONST:
2225 case LABEL_REF:
2226 case PC:
2227 return 0;
2228
2229 case REG:
2230 return 1;
2231
2232 case MEM:
2233 return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
2234 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
2235
2236 case IF_THEN_ELSE:
2237 return (jmp_uses_reg_or_mem (XEXP (x, 1))
2238 || jmp_uses_reg_or_mem (XEXP (x, 2)));
2239
2240 case PLUS: case MINUS: case MULT:
2241 return (jmp_uses_reg_or_mem (XEXP (x, 0))
2242 || jmp_uses_reg_or_mem (XEXP (x, 1)));
2243
2244 default:
2245 break;
2246 }
2247
2248 fmt = GET_RTX_FORMAT (code);
2249 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2250 {
2251 if (fmt[i] == 'e'
2252 && jmp_uses_reg_or_mem (XEXP (x, i)))
2253 return 1;
2254
2255 else if (fmt[i] == 'E')
2256 for (j = 0; j < XVECLEN (x, i); j++)
2257 if (jmp_uses_reg_or_mem (XVECEXP (x, i, j)))
2258 return 1;
2259 }
2260
2261 return 0;
2262 }
2263
2264 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2265
2266 Tablejumps and casesi insns are not considered indirect jumps;
2267 we can recognize them by a (use (label_ref)). */
2268
2269 int
2270 computed_jump_p (insn)
2271 rtx insn;
2272 {
2273 int i;
2274 if (GET_CODE (insn) == JUMP_INSN)
2275 {
2276 rtx pat = PATTERN (insn);
2277
2278 if (GET_CODE (pat) == PARALLEL)
2279 {
2280 int len = XVECLEN (pat, 0);
2281 int has_use_labelref = 0;
2282
2283 for (i = len - 1; i >= 0; i--)
2284 if (GET_CODE (XVECEXP (pat, 0, i)) == USE
2285 && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0))
2286 == LABEL_REF))
2287 has_use_labelref = 1;
2288
2289 if (! has_use_labelref)
2290 for (i = len - 1; i >= 0; i--)
2291 if (GET_CODE (XVECEXP (pat, 0, i)) == SET
2292 && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
2293 && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i))))
2294 return 1;
2295 }
2296 else if (GET_CODE (pat) == SET
2297 && SET_DEST (pat) == pc_rtx
2298 && jmp_uses_reg_or_mem (SET_SRC (pat)))
2299 return 1;
2300 }
2301 return 0;
2302 }
2303
2304 /* Traverse X via depth-first search, calling F for each
2305 sub-expression (including X itself). F is also passed the DATA.
2306 If F returns -1, do not traverse sub-expressions, but continue
2307 traversing the rest of the tree. If F ever returns any other
2308 non-zero value, stop the traversal, and return the value returned
2309 by F. Otherwise, return 0. This function does not traverse inside
2310 tree structure that contains RTX_EXPRs, or into sub-expressions
2311 whose format code is `0' since it is not known whether or not those
2312 codes are actually RTL.
2313
2314 This routine is very general, and could (should?) be used to
2315 implement many of the other routines in this file. */
2316
2317 int
2318 for_each_rtx (x, f, data)
2319 rtx *x;
2320 rtx_function f;
2321 void *data;
2322 {
2323 int result;
2324 int length;
2325 const char* format;
2326 int i;
2327
2328 /* Call F on X. */
2329 result = (*f)(x, data);
2330 if (result == -1)
2331 /* Do not traverse sub-expressions. */
2332 return 0;
2333 else if (result != 0)
2334 /* Stop the traversal. */
2335 return result;
2336
2337 if (*x == NULL_RTX)
2338 /* There are no sub-expressions. */
2339 return 0;
2340
2341 length = GET_RTX_LENGTH (GET_CODE (*x));
2342 format = GET_RTX_FORMAT (GET_CODE (*x));
2343
2344 for (i = 0; i < length; ++i)
2345 {
2346 switch (format[i])
2347 {
2348 case 'e':
2349 result = for_each_rtx (&XEXP (*x, i), f, data);
2350 if (result != 0)
2351 return result;
2352 break;
2353
2354 case 'V':
2355 case 'E':
2356 if (XVEC (*x, i) != 0)
2357 {
2358 int j;
2359 for (j = 0; j < XVECLEN (*x, i); ++j)
2360 {
2361 result = for_each_rtx (&XVECEXP (*x, i, j), f, data);
2362 if (result != 0)
2363 return result;
2364 }
2365 }
2366 break;
2367
2368 default:
2369 /* Nothing to do. */
2370 break;
2371 }
2372
2373 }
2374
2375 return 0;
2376 }
2377
2378 /* Searches X for any reference to REGNO, returning the rtx of the
2379 reference found if any. Otherwise, returns NULL_RTX. */
2380
2381 rtx
2382 regno_use_in (regno, x)
2383 unsigned int regno;
2384 rtx x;
2385 {
2386 register const char *fmt;
2387 int i, j;
2388 rtx tem;
2389
2390 if (GET_CODE (x) == REG && REGNO (x) == regno)
2391 return x;
2392
2393 fmt = GET_RTX_FORMAT (GET_CODE (x));
2394 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2395 {
2396 if (fmt[i] == 'e')
2397 {
2398 if ((tem = regno_use_in (regno, XEXP (x, i))))
2399 return tem;
2400 }
2401 else if (fmt[i] == 'E')
2402 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2403 if ((tem = regno_use_in (regno , XVECEXP (x, i, j))))
2404 return tem;
2405 }
2406
2407 return NULL_RTX;
2408 }
2409
2410
2411 /* Return 1 if X is an autoincrement side effect and the register is
2412 not the stack pointer. */
2413 int
2414 auto_inc_p (x)
2415 rtx x;
2416 {
2417 switch (GET_CODE (x))
2418 {
2419 case PRE_INC:
2420 case POST_INC:
2421 case PRE_DEC:
2422 case POST_DEC:
2423 case PRE_MODIFY:
2424 case POST_MODIFY:
2425 /* There are no REG_INC notes for SP. */
2426 if (XEXP (x, 0) != stack_pointer_rtx)
2427 return 1;
2428 default:
2429 break;
2430 }
2431 return 0;
2432 }
2433
2434 /* Return 1 if the sequence of instructions beginning with FROM and up
2435 to and including TO is safe to move. If NEW_TO is non-NULL, and
2436 the sequence is not already safe to move, but can be easily
2437 extended to a sequence which is safe, then NEW_TO will point to the
2438 end of the extended sequence.
2439
2440 For now, this function only checks that the region contains whole
2441 exception regiongs, but it could be extended to check additional
2442 conditions as well. */
2443
2444 int
2445 insns_safe_to_move_p (from, to, new_to)
2446 rtx from;
2447 rtx to;
2448 rtx *new_to;
2449 {
2450 int eh_region_count = 0;
2451 int past_to_p = 0;
2452 rtx r = from;
2453
2454 /* By default, assume the end of the region will be what was
2455 suggested. */
2456 if (new_to)
2457 *new_to = to;
2458
2459 while (r)
2460 {
2461 if (GET_CODE (r) == NOTE)
2462 {
2463 switch (NOTE_LINE_NUMBER (r))
2464 {
2465 case NOTE_INSN_EH_REGION_BEG:
2466 ++eh_region_count;
2467 break;
2468
2469 case NOTE_INSN_EH_REGION_END:
2470 if (eh_region_count == 0)
2471 /* This sequence of instructions contains the end of
2472 an exception region, but not he beginning. Moving
2473 it will cause chaos. */
2474 return 0;
2475
2476 --eh_region_count;
2477 break;
2478
2479 default:
2480 break;
2481 }
2482 }
2483 else if (past_to_p)
2484 /* If we've passed TO, and we see a non-note instruction, we
2485 can't extend the sequence to a movable sequence. */
2486 return 0;
2487
2488 if (r == to)
2489 {
2490 if (!new_to)
2491 /* It's OK to move the sequence if there were matched sets of
2492 exception region notes. */
2493 return eh_region_count == 0;
2494
2495 past_to_p = 1;
2496 }
2497
2498 /* It's OK to move the sequence if there were matched sets of
2499 exception region notes. */
2500 if (past_to_p && eh_region_count == 0)
2501 {
2502 *new_to = r;
2503 return 1;
2504 }
2505
2506 /* Go to the next instruction. */
2507 r = NEXT_INSN (r);
2508 }
2509
2510 return 0;
2511 }
2512
2513 /* Return non-zero if IN contains a piece of rtl that has the address LOC */
2514 int
2515 loc_mentioned_in_p (loc, in)
2516 rtx *loc, in;
2517 {
2518 enum rtx_code code = GET_CODE (in);
2519 const char *fmt = GET_RTX_FORMAT (code);
2520 int i, j;
2521
2522 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2523 {
2524 if (loc == &in->fld[i].rtx)
2525 return 1;
2526 if (fmt[i] == 'e')
2527 {
2528 if (loc_mentioned_in_p (loc, XEXP (in, i)))
2529 return 1;
2530 }
2531 else if (fmt[i] == 'E')
2532 for (j = XVECLEN (in, i) - 1; j >= 0; j--)
2533 if (loc_mentioned_in_p (loc, XVECEXP (in, i, j)))
2534 return 1;
2535 }
2536 return 0;
2537 }
This page took 0.145826 seconds and 6 git commands to generate.