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