flow.c (mark_set_1, [...]): Now case; rework to allow entry to be EXPR_LIST.
[platform/upstream/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, 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); i >= 0; i--)
1189           {
1190             rtx reg = XVECEXP (x, 0, i);
1191
1192             if (GET_CODE (reg) == EXPR_LIST)
1193               reg = XEXP (reg, 0);
1194
1195             if (reg_overlap_mentioned_p (reg, in))
1196               return 1;
1197             return 0;
1198           
1199           }
1200       }
1201
1202     default:
1203       break;
1204     }
1205
1206   abort ();
1207 }
1208 \f
1209 /* Return the last value to which REG was set prior to INSN.  If we can't
1210    find it easily, return 0.
1211
1212    We only return a REG, SUBREG, or constant because it is too hard to
1213    check if a MEM remains unchanged.  */
1214
1215 rtx
1216 reg_set_last (x, insn)
1217      rtx x;
1218      rtx insn;
1219 {
1220   rtx orig_insn = insn;
1221
1222   /* Scan backwards until reg_set_last_1 changed one of the above flags.
1223      Stop when we reach a label or X is a hard reg and we reach a
1224      CALL_INSN (if reg_set_last_last_regno is a hard reg).
1225
1226      If we find a set of X, ensure that its SET_SRC remains unchanged.  */
1227
1228   /* We compare with <= here, because reg_set_last_last_regno
1229      is actually the number of the first reg *not* in X.  */
1230   for (;
1231        insn && GET_CODE (insn) != CODE_LABEL
1232        && ! (GET_CODE (insn) == CALL_INSN
1233              && REGNO (x) <= FIRST_PSEUDO_REGISTER);
1234        insn = PREV_INSN (insn))
1235     if (INSN_P (insn))
1236       {
1237         rtx set = set_of (x, insn);
1238         /* OK, this function modify our register.  See if we understand it.  */
1239         if (set)
1240           {
1241             rtx last_value;
1242             if (GET_CODE (set) != SET || SET_DEST (set) != x)
1243               return 0;
1244             last_value = SET_SRC (x);
1245             if (CONSTANT_P (last_value)
1246                 || ((GET_CODE (last_value) == REG
1247                      || GET_CODE (last_value) == SUBREG)
1248                     && ! reg_set_between_p (last_value,
1249                                             insn, orig_insn)))
1250               return last_value;
1251             else
1252               return 0;
1253           }
1254       }
1255
1256   return 0;
1257 }
1258 \f
1259 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1260    (X would be the pattern of an insn).
1261    FUN receives two arguments:
1262      the REG, MEM, CC0 or PC being stored in or clobbered,
1263      the SET or CLOBBER rtx that does the store.
1264
1265   If the item being stored in or clobbered is a SUBREG of a hard register,
1266   the SUBREG will be passed.  */
1267      
1268 void
1269 note_stores (x, fun, data)
1270      register rtx x;
1271      void (*fun) PARAMS ((rtx, rtx, void *));
1272      void *data;
1273 {
1274   int i;
1275
1276   if (GET_CODE (x) == COND_EXEC)
1277     x = COND_EXEC_CODE (x);
1278
1279   if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
1280     {
1281       register rtx dest = SET_DEST (x);
1282
1283       while ((GET_CODE (dest) == SUBREG
1284               && (GET_CODE (SUBREG_REG (dest)) != REG
1285                   || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER))
1286              || GET_CODE (dest) == ZERO_EXTRACT
1287              || GET_CODE (dest) == SIGN_EXTRACT
1288              || GET_CODE (dest) == STRICT_LOW_PART)
1289         dest = XEXP (dest, 0);
1290
1291       /* If we have a PARALLEL, SET_DEST is a list of registers or
1292          EXPR_LIST expressions, each of whose first operand is a register.
1293          We can't know what precisely is being set in these cases, so
1294          make up a CLOBBER to pass to the function.  */
1295       if (GET_CODE (dest) == PARALLEL && GET_MODE (dest) == BLKmode)
1296         for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
1297           {
1298             rtx reg = XVECEXP (dest, 0, i);
1299
1300             if (GET_CODE (reg) == EXPR_LIST)
1301               reg = XEXP (reg, 0);
1302
1303             (*fun) (reg, gen_rtx_CLOBBER (VOIDmode, reg), data);
1304           }
1305       else
1306         (*fun) (dest, x, data);
1307     }
1308
1309   else if (GET_CODE (x) == PARALLEL)
1310     for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
1311       note_stores (XVECEXP (x, 0, i), fun, data);
1312 }
1313 \f
1314 /* Return nonzero if X's old contents don't survive after INSN.
1315    This will be true if X is (cc0) or if X is a register and
1316    X dies in INSN or because INSN entirely sets X.
1317
1318    "Entirely set" means set directly and not through a SUBREG,
1319    ZERO_EXTRACT or SIGN_EXTRACT, so no trace of the old contents remains.
1320    Likewise, REG_INC does not count.
1321
1322    REG may be a hard or pseudo reg.  Renumbering is not taken into account,
1323    but for this use that makes no difference, since regs don't overlap
1324    during their lifetimes.  Therefore, this function may be used
1325    at any time after deaths have been computed (in flow.c).
1326
1327    If REG is a hard reg that occupies multiple machine registers, this
1328    function will only return 1 if each of those registers will be replaced
1329    by INSN.  */
1330
1331 int
1332 dead_or_set_p (insn, x)
1333      rtx insn;
1334      rtx x;
1335 {
1336   unsigned int regno, last_regno;
1337   unsigned int i;
1338
1339   /* Can't use cc0_rtx below since this file is used by genattrtab.c.  */
1340   if (GET_CODE (x) == CC0)
1341     return 1;
1342
1343   if (GET_CODE (x) != REG)
1344     abort ();
1345
1346   regno = REGNO (x);
1347   last_regno = (regno >= FIRST_PSEUDO_REGISTER ? regno
1348                 : regno + HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1);
1349
1350   for (i = regno; i <= last_regno; i++)
1351     if (! dead_or_set_regno_p (insn, i))
1352       return 0;
1353
1354   return 1;
1355 }
1356
1357 /* Utility function for dead_or_set_p to check an individual register.  Also
1358    called from flow.c.  */
1359
1360 int
1361 dead_or_set_regno_p (insn, test_regno)
1362      rtx insn;
1363      unsigned int test_regno;
1364 {
1365   unsigned int regno, endregno;
1366   rtx pattern;
1367
1368   /* See if there is a death note for something that includes TEST_REGNO.  */
1369   if (find_regno_note (insn, REG_DEAD, test_regno))
1370     return 1;
1371
1372   if (GET_CODE (insn) == CALL_INSN
1373       && find_regno_fusage (insn, CLOBBER, test_regno))
1374     return 1;
1375
1376   pattern = PATTERN (insn);
1377
1378   if (GET_CODE (pattern) == COND_EXEC)
1379     pattern = COND_EXEC_CODE (pattern);
1380
1381   if (GET_CODE (pattern) == SET)
1382     {
1383       rtx dest = SET_DEST (PATTERN (insn));
1384  
1385       /* A value is totally replaced if it is the destination or the
1386          destination is a SUBREG of REGNO that does not change the number of
1387          words in it.  */
1388       if (GET_CODE (dest) == SUBREG
1389           && (((GET_MODE_SIZE (GET_MODE (dest))
1390                 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1391               == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1392                    + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1393         dest = SUBREG_REG (dest);
1394
1395       if (GET_CODE (dest) != REG)
1396         return 0;
1397
1398       regno = REGNO (dest);
1399       endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1400                   : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1401
1402       return (test_regno >= regno && test_regno < endregno);
1403     }
1404   else if (GET_CODE (pattern) == PARALLEL)
1405     {
1406       register int i;
1407
1408       for (i = XVECLEN (pattern, 0) - 1; i >= 0; i--)
1409         {
1410           rtx body = XVECEXP (pattern, 0, i);
1411
1412           if (GET_CODE (body) == COND_EXEC)
1413             body = COND_EXEC_CODE (body);
1414
1415           if (GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1416             {
1417               rtx dest = SET_DEST (body);
1418
1419               if (GET_CODE (dest) == SUBREG
1420                   && (((GET_MODE_SIZE (GET_MODE (dest))
1421                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1422                       == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1423                            + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1424                 dest = SUBREG_REG (dest);
1425
1426               if (GET_CODE (dest) != REG)
1427                 continue;
1428
1429               regno = REGNO (dest);
1430               endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1431                           : regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)));
1432
1433               if (test_regno >= regno && test_regno < endregno)
1434                 return 1;
1435             }
1436         }
1437     }
1438
1439   return 0;
1440 }
1441
1442 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1443    If DATUM is nonzero, look for one whose datum is DATUM.  */
1444
1445 rtx
1446 find_reg_note (insn, kind, datum)
1447      rtx insn;
1448      enum reg_note kind;
1449      rtx datum;
1450 {
1451   register rtx link;
1452
1453   /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN.  */
1454   if (! INSN_P (insn))
1455     return 0;
1456
1457   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1458     if (REG_NOTE_KIND (link) == kind
1459         && (datum == 0 || datum == XEXP (link, 0)))
1460       return link;
1461   return 0;
1462 }
1463
1464 /* Return the reg-note of kind KIND in insn INSN which applies to register
1465    number REGNO, if any.  Return 0 if there is no such reg-note.  Note that
1466    the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1467    it might be the case that the note overlaps REGNO.  */
1468
1469 rtx
1470 find_regno_note (insn, kind, regno)
1471      rtx insn;
1472      enum reg_note kind;
1473      unsigned int regno;
1474 {
1475   register rtx link;
1476
1477   /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN.  */
1478   if (! INSN_P (insn))
1479     return 0;
1480
1481   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1482     if (REG_NOTE_KIND (link) == kind
1483         /* Verify that it is a register, so that scratch and MEM won't cause a
1484            problem here.  */
1485         && GET_CODE (XEXP (link, 0)) == REG
1486         && REGNO (XEXP (link, 0)) <= regno
1487         && ((REGNO (XEXP (link, 0))
1488              + (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
1489                 : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
1490                                     GET_MODE (XEXP (link, 0)))))
1491             > regno))
1492       return link;
1493   return 0;
1494 }
1495
1496 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1497    in the CALL_INSN_FUNCTION_USAGE information of INSN.  */
1498
1499 int
1500 find_reg_fusage (insn, code, datum)
1501      rtx insn;
1502      enum rtx_code code;
1503      rtx datum;
1504 {
1505   /* If it's not a CALL_INSN, it can't possibly have a
1506      CALL_INSN_FUNCTION_USAGE field, so don't bother checking.  */
1507   if (GET_CODE (insn) != CALL_INSN)
1508     return 0;
1509
1510   if (! datum)
1511     abort();
1512
1513   if (GET_CODE (datum) != REG)
1514     {
1515       register rtx link;
1516
1517       for (link = CALL_INSN_FUNCTION_USAGE (insn);
1518            link;
1519            link = XEXP (link, 1))
1520         if (GET_CODE (XEXP (link, 0)) == code
1521             && rtx_equal_p (datum, SET_DEST (XEXP (link, 0))))
1522           return 1;
1523     }
1524   else
1525     {
1526       unsigned int regno = REGNO (datum);
1527
1528       /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1529          to pseudo registers, so don't bother checking.  */
1530
1531       if (regno < FIRST_PSEUDO_REGISTER)
1532         {
1533           unsigned int end_regno
1534             = regno + HARD_REGNO_NREGS (regno, GET_MODE (datum));
1535           unsigned int i;
1536
1537           for (i = regno; i < end_regno; i++)
1538             if (find_regno_fusage (insn, code, i))
1539               return 1;
1540         }
1541     }
1542
1543   return 0;
1544 }
1545
1546 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1547    in the CALL_INSN_FUNCTION_USAGE information of INSN.  */
1548
1549 int
1550 find_regno_fusage (insn, code, regno)
1551      rtx insn;
1552      enum rtx_code code;
1553      unsigned int regno;
1554 {
1555   register rtx link;
1556
1557   /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1558      to pseudo registers, so don't bother checking.  */
1559
1560   if (regno >= FIRST_PSEUDO_REGISTER
1561       || GET_CODE (insn) != CALL_INSN )
1562     return 0;
1563
1564   for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1565     {
1566       unsigned int regnote;
1567       rtx op, reg;
1568
1569       if (GET_CODE (op = XEXP (link, 0)) == code
1570           && GET_CODE (reg = XEXP (op, 0)) == REG
1571           && (regnote = REGNO (reg)) <= regno
1572           && regnote + HARD_REGNO_NREGS (regnote, GET_MODE (reg)) > regno)
1573         return 1;
1574     }
1575
1576   return 0;
1577 }
1578 \f
1579 /* Remove register note NOTE from the REG_NOTES of INSN.  */
1580
1581 void
1582 remove_note (insn, note)
1583      register rtx insn;
1584      register rtx note;
1585 {
1586   register rtx link;
1587
1588   if (note == NULL_RTX)
1589     return;
1590
1591   if (REG_NOTES (insn) == note)
1592     {
1593       REG_NOTES (insn) = XEXP (note, 1);
1594       return;
1595     }
1596
1597   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1598     if (XEXP (link, 1) == note)
1599       {
1600         XEXP (link, 1) = XEXP (note, 1);
1601         return;
1602       }
1603
1604   abort ();
1605 }
1606
1607 /* Search LISTP (an EXPR_LIST) for NODE and remove NODE from the list
1608    if it is found.
1609
1610    A simple equality test is used to determine if NODE is on the
1611    EXPR_LIST.  */
1612
1613 void
1614 remove_node_from_expr_list (node, listp)
1615      rtx node;
1616      rtx *listp;
1617 {
1618   rtx temp = *listp;
1619   rtx prev = NULL_RTX;
1620
1621   while (temp)
1622     {
1623       if (node == XEXP (temp, 0))
1624         {
1625           /* Splice the node out of the list.  */
1626           if (prev)
1627             XEXP (prev, 1) = XEXP (temp, 1);
1628           else
1629             *listp = XEXP (temp, 1);
1630
1631           return;
1632         }
1633       temp = XEXP (temp, 1);
1634     }
1635 }
1636 \f
1637 /* Nonzero if X contains any volatile instructions.  These are instructions
1638    which may cause unpredictable machine state instructions, and thus no
1639    instructions should be moved or combined across them.  This includes
1640    only volatile asms and UNSPEC_VOLATILE instructions.  */
1641
1642 int
1643 volatile_insn_p (x)
1644      rtx x;
1645 {
1646   register RTX_CODE code;
1647
1648   code = GET_CODE (x);
1649   switch (code)
1650     {
1651     case LABEL_REF:
1652     case SYMBOL_REF:
1653     case CONST_INT:
1654     case CONST:
1655     case CONST_DOUBLE:
1656     case CC0:
1657     case PC:
1658     case REG:
1659     case SCRATCH:
1660     case CLOBBER:
1661     case ASM_INPUT:
1662     case ADDR_VEC:
1663     case ADDR_DIFF_VEC:
1664     case CALL:
1665     case MEM:
1666       return 0;
1667
1668     case UNSPEC_VOLATILE:
1669  /* case TRAP_IF: This isn't clear yet.  */
1670       return 1;
1671
1672     case ASM_OPERANDS:
1673       if (MEM_VOLATILE_P (x))
1674         return 1;
1675
1676     default:
1677       break;
1678     }
1679
1680   /* Recursively scan the operands of this expression.  */
1681
1682   {
1683     register const char *fmt = GET_RTX_FORMAT (code);
1684     register int i;
1685     
1686     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1687       {
1688         if (fmt[i] == 'e')
1689           {
1690             if (volatile_insn_p (XEXP (x, i)))
1691               return 1;
1692           }
1693         else if (fmt[i] == 'E')
1694           {
1695             register int j;
1696             for (j = 0; j < XVECLEN (x, i); j++)
1697               if (volatile_insn_p (XVECEXP (x, i, j)))
1698                 return 1;
1699           }
1700       }
1701   }
1702   return 0;
1703 }
1704
1705 /* Nonzero if X contains any volatile memory references
1706    UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions.  */
1707
1708 int
1709 volatile_refs_p (x)
1710      rtx x;
1711 {
1712   register RTX_CODE code;
1713
1714   code = GET_CODE (x);
1715   switch (code)
1716     {
1717     case LABEL_REF:
1718     case SYMBOL_REF:
1719     case CONST_INT:
1720     case CONST:
1721     case CONST_DOUBLE:
1722     case CC0:
1723     case PC:
1724     case REG:
1725     case SCRATCH:
1726     case CLOBBER:
1727     case ASM_INPUT:
1728     case ADDR_VEC:
1729     case ADDR_DIFF_VEC:
1730       return 0;
1731
1732     case CALL:
1733     case UNSPEC_VOLATILE:
1734  /* case TRAP_IF: This isn't clear yet.  */
1735       return 1;
1736
1737     case MEM:
1738     case ASM_OPERANDS:
1739       if (MEM_VOLATILE_P (x))
1740         return 1;
1741
1742     default:
1743       break;
1744     }
1745
1746   /* Recursively scan the operands of this expression.  */
1747
1748   {
1749     register const char *fmt = GET_RTX_FORMAT (code);
1750     register int i;
1751     
1752     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1753       {
1754         if (fmt[i] == 'e')
1755           {
1756             if (volatile_refs_p (XEXP (x, i)))
1757               return 1;
1758           }
1759         else if (fmt[i] == 'E')
1760           {
1761             register int j;
1762             for (j = 0; j < XVECLEN (x, i); j++)
1763               if (volatile_refs_p (XVECEXP (x, i, j)))
1764                 return 1;
1765           }
1766       }
1767   }
1768   return 0;
1769 }
1770
1771 /* Similar to above, except that it also rejects register pre- and post-
1772    incrementing.  */
1773
1774 int
1775 side_effects_p (x)
1776      rtx x;
1777 {
1778   register RTX_CODE code;
1779
1780   code = GET_CODE (x);
1781   switch (code)
1782     {
1783     case LABEL_REF:
1784     case SYMBOL_REF:
1785     case CONST_INT:
1786     case CONST:
1787     case CONST_DOUBLE:
1788     case CC0:
1789     case PC:
1790     case REG:
1791     case SCRATCH:
1792     case ASM_INPUT:
1793     case ADDR_VEC:
1794     case ADDR_DIFF_VEC:
1795       return 0;
1796
1797     case CLOBBER:
1798       /* Reject CLOBBER with a non-VOID mode.  These are made by combine.c
1799          when some combination can't be done.  If we see one, don't think
1800          that we can simplify the expression.  */
1801       return (GET_MODE (x) != VOIDmode);
1802
1803     case PRE_INC:
1804     case PRE_DEC:
1805     case POST_INC:
1806     case POST_DEC:
1807     case PRE_MODIFY:
1808     case POST_MODIFY:
1809     case CALL:
1810     case UNSPEC_VOLATILE:
1811  /* case TRAP_IF: This isn't clear yet.  */
1812       return 1;
1813
1814     case MEM:
1815     case ASM_OPERANDS:
1816       if (MEM_VOLATILE_P (x))
1817         return 1;
1818
1819     default:
1820       break;
1821     }
1822
1823   /* Recursively scan the operands of this expression.  */
1824
1825   {
1826     register const char *fmt = GET_RTX_FORMAT (code);
1827     register int i;
1828     
1829     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1830       {
1831         if (fmt[i] == 'e')
1832           {
1833             if (side_effects_p (XEXP (x, i)))
1834               return 1;
1835           }
1836         else if (fmt[i] == 'E')
1837           {
1838             register int j;
1839             for (j = 0; j < XVECLEN (x, i); j++)
1840               if (side_effects_p (XVECEXP (x, i, j)))
1841                 return 1;
1842           }
1843       }
1844   }
1845   return 0;
1846 }
1847 \f
1848 /* Return nonzero if evaluating rtx X might cause a trap.  */
1849
1850 int
1851 may_trap_p (x)
1852      rtx x;
1853 {
1854   int i;
1855   enum rtx_code code;
1856   const char *fmt;
1857
1858   if (x == 0)
1859     return 0;
1860   code = GET_CODE (x);
1861   switch (code)
1862     {
1863       /* Handle these cases quickly.  */
1864     case CONST_INT:
1865     case CONST_DOUBLE:
1866     case SYMBOL_REF:
1867     case LABEL_REF:
1868     case CONST:
1869     case PC:
1870     case CC0:
1871     case REG:
1872     case SCRATCH:
1873       return 0;
1874
1875     case ASM_INPUT:
1876     case UNSPEC_VOLATILE:
1877     case TRAP_IF:
1878       return 1;
1879
1880     case ASM_OPERANDS:
1881       return MEM_VOLATILE_P (x);
1882
1883       /* Memory ref can trap unless it's a static var or a stack slot.  */
1884     case MEM:
1885       return rtx_addr_can_trap_p (XEXP (x, 0));
1886
1887       /* Division by a non-constant might trap.  */
1888     case DIV:
1889     case MOD:
1890     case UDIV:
1891     case UMOD:
1892       if (! CONSTANT_P (XEXP (x, 1))
1893           || GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1894         return 1;
1895       /* This was const0_rtx, but by not using that,
1896          we can link this file into other programs.  */
1897       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
1898         return 1;
1899       break;
1900
1901     case EXPR_LIST:
1902       /* An EXPR_LIST is used to represent a function call.  This
1903          certainly may trap.  */
1904       return 1;
1905
1906     case GE:
1907     case GT:
1908     case LE:
1909     case LT:
1910     case COMPARE:
1911       /* Some floating point comparisons may trap.  */
1912       /* ??? There is no machine independent way to check for tests that trap
1913          when COMPARE is used, though many targets do make this distinction.
1914          For instance, sparc uses CCFPE for compares which generate exceptions
1915          and CCFP for compares which do not generate exceptions.  */
1916       if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1917         return 1;
1918       /* But often the compare has some CC mode, so check operand
1919          modes as well.  */
1920       if (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_FLOAT
1921           || GET_MODE_CLASS (GET_MODE (XEXP (x, 1))) == MODE_FLOAT)
1922         return 1;
1923       break;
1924
1925     default:
1926       /* Any floating arithmetic may trap.  */
1927       if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1928         return 1;
1929     }
1930
1931   fmt = GET_RTX_FORMAT (code);
1932   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1933     {
1934       if (fmt[i] == 'e')
1935         {
1936           if (may_trap_p (XEXP (x, i)))
1937             return 1;
1938         }
1939       else if (fmt[i] == 'E')
1940         {
1941           register int j;
1942           for (j = 0; j < XVECLEN (x, i); j++)
1943             if (may_trap_p (XVECEXP (x, i, j)))
1944               return 1;
1945         }
1946     }
1947   return 0;
1948 }
1949 \f
1950 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1951    i.e., an inequality.  */
1952
1953 int
1954 inequality_comparisons_p (x)
1955      rtx x;
1956 {
1957   register const char *fmt;
1958   register int len, i;
1959   register enum rtx_code code = GET_CODE (x);
1960
1961   switch (code)
1962     {
1963     case REG:
1964     case SCRATCH:
1965     case PC:
1966     case CC0:
1967     case CONST_INT:
1968     case CONST_DOUBLE:
1969     case CONST:
1970     case LABEL_REF:
1971     case SYMBOL_REF:
1972       return 0;
1973
1974     case LT:
1975     case LTU:
1976     case GT:
1977     case GTU:
1978     case LE:
1979     case LEU:
1980     case GE:
1981     case GEU:
1982       return 1;
1983       
1984     default:
1985       break;
1986     }
1987
1988   len = GET_RTX_LENGTH (code);
1989   fmt = GET_RTX_FORMAT (code);
1990
1991   for (i = 0; i < len; i++)
1992     {
1993       if (fmt[i] == 'e')
1994         {
1995           if (inequality_comparisons_p (XEXP (x, i)))
1996             return 1;
1997         }
1998       else if (fmt[i] == 'E')
1999         {
2000           register int j;
2001           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2002             if (inequality_comparisons_p (XVECEXP (x, i, j)))
2003               return 1;
2004         }
2005     }
2006             
2007   return 0;
2008 }
2009 \f
2010 /* Replace any occurrence of FROM in X with TO.  The function does
2011    not enter into CONST_DOUBLE for the replace.
2012
2013    Note that copying is not done so X must not be shared unless all copies
2014    are to be modified.  */
2015
2016 rtx
2017 replace_rtx (x, from, to)
2018      rtx x, from, to;
2019 {
2020   register int i, j;
2021   register const char *fmt;
2022
2023   /* The following prevents loops occurrence when we change MEM in
2024      CONST_DOUBLE onto the same CONST_DOUBLE. */
2025   if (x != 0 && GET_CODE (x) == CONST_DOUBLE)
2026     return x;
2027
2028   if (x == from)
2029     return to;
2030
2031   /* Allow this function to make replacements in EXPR_LISTs.  */
2032   if (x == 0)
2033     return 0;
2034
2035   fmt = GET_RTX_FORMAT (GET_CODE (x));
2036   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2037     {
2038       if (fmt[i] == 'e')
2039         XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
2040       else if (fmt[i] == 'E')
2041         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2042           XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
2043     }
2044
2045   return x;
2046 }  
2047 \f
2048 /* Throughout the rtx X, replace many registers according to REG_MAP.
2049    Return the replacement for X (which may be X with altered contents).
2050    REG_MAP[R] is the replacement for register R, or 0 for don't replace.
2051    NREGS is the length of REG_MAP; regs >= NREGS are not mapped.  
2052
2053    We only support REG_MAP entries of REG or SUBREG.  Also, hard registers
2054    should not be mapped to pseudos or vice versa since validate_change
2055    is not called.
2056
2057    If REPLACE_DEST is 1, replacements are also done in destinations;
2058    otherwise, only sources are replaced.  */
2059
2060 rtx
2061 replace_regs (x, reg_map, nregs, replace_dest)
2062      rtx x;
2063      rtx *reg_map;
2064      unsigned int nregs;
2065      int replace_dest;
2066 {
2067   register enum rtx_code code;
2068   register int i;
2069   register const char *fmt;
2070
2071   if (x == 0)
2072     return x;
2073
2074   code = GET_CODE (x);
2075   switch (code)
2076     {
2077     case SCRATCH:
2078     case PC:
2079     case CC0:
2080     case CONST_INT:
2081     case CONST_DOUBLE:
2082     case CONST:
2083     case SYMBOL_REF:
2084     case LABEL_REF:
2085       return x;
2086
2087     case REG:
2088       /* Verify that the register has an entry before trying to access it.  */
2089       if (REGNO (x) < nregs && reg_map[REGNO (x)] != 0)
2090         {
2091           /* SUBREGs can't be shared.  Always return a copy to ensure that if
2092              this replacement occurs more than once then each instance will
2093              get distinct rtx.  */
2094           if (GET_CODE (reg_map[REGNO (x)]) == SUBREG)
2095             return copy_rtx (reg_map[REGNO (x)]);
2096           return reg_map[REGNO (x)];
2097         }
2098       return x;
2099
2100     case SUBREG:
2101       /* Prevent making nested SUBREGs.  */
2102       if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < nregs
2103           && reg_map[REGNO (SUBREG_REG (x))] != 0
2104           && GET_CODE (reg_map[REGNO (SUBREG_REG (x))]) == SUBREG)
2105         {
2106           rtx map_val = reg_map[REGNO (SUBREG_REG (x))];
2107           rtx map_inner = SUBREG_REG (map_val);
2108
2109           if (GET_MODE (x) == GET_MODE (map_inner))
2110             return map_inner;
2111           else
2112             {
2113               /* We cannot call gen_rtx here since we may be linked with
2114                  genattrtab.c.  */
2115               /* Let's try clobbering the incoming SUBREG and see
2116                  if this is really safe.  */
2117               SUBREG_REG (x) = map_inner;
2118               SUBREG_WORD (x) += SUBREG_WORD (map_val);
2119               return x;
2120 #if 0
2121               rtx new = rtx_alloc (SUBREG);
2122               PUT_MODE (new, GET_MODE (x));
2123               SUBREG_REG (new) = map_inner;
2124               SUBREG_WORD (new) = SUBREG_WORD (x) + SUBREG_WORD (map_val);
2125 #endif
2126             }
2127         }
2128       break;
2129
2130     case SET:
2131       if (replace_dest)
2132         SET_DEST (x) = replace_regs (SET_DEST (x), reg_map, nregs, 0);
2133
2134       else if (GET_CODE (SET_DEST (x)) == MEM
2135                || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
2136         /* Even if we are not to replace destinations, replace register if it
2137            is CONTAINED in destination (destination is memory or
2138            STRICT_LOW_PART).  */
2139         XEXP (SET_DEST (x), 0) = replace_regs (XEXP (SET_DEST (x), 0),
2140                                                reg_map, nregs, 0);
2141       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
2142         /* Similarly, for ZERO_EXTRACT we replace all operands.  */
2143         break;
2144
2145       SET_SRC (x) = replace_regs (SET_SRC (x), reg_map, nregs, 0);
2146       return x;
2147       
2148     default:
2149       break;
2150     }
2151
2152   fmt = GET_RTX_FORMAT (code);
2153   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2154     {
2155       if (fmt[i] == 'e')
2156         XEXP (x, i) = replace_regs (XEXP (x, i), reg_map, nregs, replace_dest);
2157       else if (fmt[i] == 'E')
2158         {
2159           register int j;
2160           for (j = 0; j < XVECLEN (x, i); j++)
2161             XVECEXP (x, i, j) = replace_regs (XVECEXP (x, i, j), reg_map,
2162                                               nregs, replace_dest);
2163         }
2164     }
2165   return x;
2166 }
2167
2168 /* A subroutine of computed_jump_p, return 1 if X contains a REG or MEM or
2169    constant that is not in the constant pool and not in the condition
2170    of an IF_THEN_ELSE.  */
2171
2172 static int
2173 computed_jump_p_1 (x)
2174      rtx x;
2175 {
2176   enum rtx_code code = GET_CODE (x);
2177   int i, j;
2178   const char *fmt;
2179
2180   switch (code)
2181     {
2182     case LABEL_REF:
2183     case PC:
2184       return 0;
2185
2186     case CONST:
2187     case CONST_INT:
2188     case CONST_DOUBLE:
2189     case SYMBOL_REF:
2190     case REG:
2191       return 1;
2192
2193     case MEM:
2194       return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
2195                 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
2196
2197     case IF_THEN_ELSE:
2198       return (computed_jump_p_1 (XEXP (x, 1))
2199               || computed_jump_p_1 (XEXP (x, 2)));
2200
2201     default:
2202       break;
2203     }
2204
2205   fmt = GET_RTX_FORMAT (code);
2206   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2207     {
2208       if (fmt[i] == 'e'
2209           && computed_jump_p_1 (XEXP (x, i)))
2210         return 1;
2211
2212       else if (fmt[i] == 'E')
2213         for (j = 0; j < XVECLEN (x, i); j++)
2214           if (computed_jump_p_1 (XVECEXP (x, i, j)))
2215             return 1;
2216     }
2217
2218   return 0;
2219 }
2220
2221 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2222
2223    Tablejumps and casesi insns are not considered indirect jumps;
2224    we can recognize them by a (use (label_ref)).  */
2225
2226 int
2227 computed_jump_p (insn)
2228      rtx insn;
2229 {
2230   int i;
2231   if (GET_CODE (insn) == JUMP_INSN)
2232     {
2233       rtx pat = PATTERN (insn);
2234
2235       if (find_reg_note (insn, REG_LABEL, NULL_RTX))
2236         return 0;
2237       else if (GET_CODE (pat) == PARALLEL)
2238         {
2239           int len = XVECLEN (pat, 0);
2240           int has_use_labelref = 0;
2241
2242           for (i = len - 1; i >= 0; i--)
2243             if (GET_CODE (XVECEXP (pat, 0, i)) == USE
2244                 && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0))
2245                     == LABEL_REF))
2246               has_use_labelref = 1;
2247
2248           if (! has_use_labelref)
2249             for (i = len - 1; i >= 0; i--)
2250               if (GET_CODE (XVECEXP (pat, 0, i)) == SET
2251                   && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
2252                   && computed_jump_p_1 (SET_SRC (XVECEXP (pat, 0, i))))
2253                 return 1;
2254         }
2255       else if (GET_CODE (pat) == SET
2256                && SET_DEST (pat) == pc_rtx
2257                && computed_jump_p_1 (SET_SRC (pat)))
2258         return 1;
2259     }
2260   return 0;
2261 }
2262
2263 /* Traverse X via depth-first search, calling F for each
2264    sub-expression (including X itself).  F is also passed the DATA.
2265    If F returns -1, do not traverse sub-expressions, but continue
2266    traversing the rest of the tree.  If F ever returns any other
2267    non-zero value, stop the traversal, and return the value returned
2268    by F.  Otherwise, return 0.  This function does not traverse inside
2269    tree structure that contains RTX_EXPRs, or into sub-expressions
2270    whose format code is `0' since it is not known whether or not those
2271    codes are actually RTL.
2272
2273    This routine is very general, and could (should?) be used to
2274    implement many of the other routines in this file.  */
2275
2276 int
2277 for_each_rtx (x, f, data)
2278      rtx *x;
2279      rtx_function f;
2280      void *data;
2281 {
2282   int result;
2283   int length;
2284   const char* format;
2285   int i;
2286
2287   /* Call F on X.  */
2288   result = (*f)(x, data);
2289   if (result == -1)
2290     /* Do not traverse sub-expressions.  */
2291     return 0;
2292   else if (result != 0)
2293     /* Stop the traversal.  */
2294     return result;
2295
2296   if (*x == NULL_RTX)
2297     /* There are no sub-expressions.  */
2298     return 0;
2299
2300   length = GET_RTX_LENGTH (GET_CODE (*x));
2301   format = GET_RTX_FORMAT (GET_CODE (*x));
2302
2303   for (i = 0; i < length; ++i) 
2304     {
2305       switch (format[i]) 
2306         {
2307         case 'e':
2308           result = for_each_rtx (&XEXP (*x, i), f, data);
2309           if (result != 0)
2310             return result;
2311           break;
2312
2313         case 'V':
2314         case 'E':
2315           if (XVEC (*x, i) != 0) 
2316             {
2317               int j;
2318               for (j = 0; j < XVECLEN (*x, i); ++j)
2319                 {
2320                   result = for_each_rtx (&XVECEXP (*x, i, j), f, data);
2321                   if (result != 0)
2322                     return result;
2323                 }
2324             }
2325           break; 
2326
2327         default:
2328           /* Nothing to do.  */
2329           break;
2330         }
2331
2332     }
2333
2334   return 0;
2335 }
2336
2337 /* Searches X for any reference to REGNO, returning the rtx of the
2338    reference found if any.  Otherwise, returns NULL_RTX.  */
2339
2340 rtx
2341 regno_use_in (regno, x)
2342      unsigned int regno;
2343      rtx x;
2344 {
2345   register const char *fmt;
2346   int i, j;
2347   rtx tem;
2348
2349   if (GET_CODE (x) == REG && REGNO (x) == regno)
2350     return x;
2351
2352   fmt = GET_RTX_FORMAT (GET_CODE (x));
2353   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2354     {
2355       if (fmt[i] == 'e')
2356         {
2357           if ((tem = regno_use_in (regno, XEXP (x, i))))
2358             return tem;
2359         }
2360       else if (fmt[i] == 'E')
2361         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2362           if ((tem = regno_use_in (regno , XVECEXP (x, i, j))))
2363             return tem;
2364     }
2365
2366   return NULL_RTX;
2367 }
2368
2369
2370 /* Return 1 if X is an autoincrement side effect and the register is
2371    not the stack pointer.  */
2372 int
2373 auto_inc_p (x)
2374      rtx x;
2375 {
2376   switch (GET_CODE (x))
2377     {
2378     case PRE_INC:
2379     case POST_INC:
2380     case PRE_DEC:
2381     case POST_DEC:
2382     case PRE_MODIFY:
2383     case POST_MODIFY:
2384       /* There are no REG_INC notes for SP.  */
2385       if (XEXP (x, 0) != stack_pointer_rtx)
2386         return 1;
2387     default:
2388       break;
2389     }
2390   return 0;
2391 }
2392
2393 /* Return 1 if the sequence of instructions beginning with FROM and up
2394    to and including TO is safe to move.  If NEW_TO is non-NULL, and
2395    the sequence is not already safe to move, but can be easily
2396    extended to a sequence which is safe, then NEW_TO will point to the
2397    end of the extended sequence.  
2398  
2399    For now, this function only checks that the region contains whole
2400    exception regiongs, but it could be extended to check additional
2401    conditions as well.  */
2402
2403 int
2404 insns_safe_to_move_p (from, to, new_to)
2405      rtx from;
2406      rtx to;
2407      rtx *new_to;
2408 {
2409   int eh_region_count = 0;
2410   int past_to_p = 0;
2411   rtx r = from;
2412
2413   /* By default, assume the end of the region will be what was
2414      suggested.  */
2415   if (new_to)
2416     *new_to = to;
2417
2418   while (r)
2419     {
2420       if (GET_CODE (r) == NOTE)
2421         {
2422           switch (NOTE_LINE_NUMBER (r))
2423             {
2424             case NOTE_INSN_EH_REGION_BEG:
2425               ++eh_region_count;
2426               break;
2427
2428             case NOTE_INSN_EH_REGION_END:
2429               if (eh_region_count == 0)
2430                 /* This sequence of instructions contains the end of
2431                    an exception region, but not he beginning.  Moving
2432                    it will cause chaos.  */
2433                 return 0;
2434
2435               --eh_region_count;
2436               break;
2437
2438             default:
2439               break;
2440             }
2441         }
2442       else if (past_to_p)
2443         /* If we've passed TO, and we see a non-note instruction, we
2444            can't extend the sequence to a movable sequence.  */
2445         return 0;
2446
2447       if (r == to)
2448         {
2449           if (!new_to)
2450             /* It's OK to move the sequence if there were matched sets of
2451                exception region notes.  */
2452             return eh_region_count == 0;
2453           
2454           past_to_p = 1;
2455         }
2456
2457       /* It's OK to move the sequence if there were matched sets of
2458          exception region notes.  */
2459       if (past_to_p && eh_region_count == 0)
2460         {
2461           *new_to = r;
2462           return 1;
2463         }
2464
2465       /* Go to the next instruction.  */
2466       r = NEXT_INSN (r);
2467     }
2468   
2469   return 0;
2470 }
2471
2472 /* Return non-zero if IN contains a piece of rtl that has the address LOC */
2473 int
2474 loc_mentioned_in_p (loc, in)
2475      rtx *loc, in;
2476 {
2477   enum rtx_code code = GET_CODE (in);
2478   const char *fmt = GET_RTX_FORMAT (code);
2479   int i, j;
2480
2481   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2482     {
2483       if (loc == &in->fld[i].rtx)
2484         return 1;
2485       if (fmt[i] == 'e')
2486         {
2487           if (loc_mentioned_in_p (loc, XEXP (in, i)))
2488             return 1;
2489         }
2490       else if (fmt[i] == 'E')
2491         for (j = XVECLEN (in, i) - 1; j >= 0; j--)
2492           if (loc_mentioned_in_p (loc, XVECEXP (in, i, j)))
2493             return 1;
2494     }
2495   return 0;
2496 }