OSDN Git Service

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