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