OSDN Git Service

* resource.c (mark_set_resources): Use MARK_SRC_DEST for
[pf3gnuchains/gcc-fork.git] / gcc / rtlanal.c
1 /* Analyze RTL for C-Compiler
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000 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 PRE_MODIFY:
1853     case POST_MODIFY:
1854     case CALL:
1855     case UNSPEC_VOLATILE:
1856  /* case TRAP_IF: This isn't clear yet.  */
1857       return 1;
1858
1859     case MEM:
1860     case ASM_OPERANDS:
1861       if (MEM_VOLATILE_P (x))
1862         return 1;
1863
1864     default:
1865       break;
1866     }
1867
1868   /* Recursively scan the operands of this expression.  */
1869
1870   {
1871     register const char *fmt = GET_RTX_FORMAT (code);
1872     register int i;
1873     
1874     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1875       {
1876         if (fmt[i] == 'e')
1877           {
1878             if (side_effects_p (XEXP (x, i)))
1879               return 1;
1880           }
1881         else if (fmt[i] == 'E')
1882           {
1883             register int j;
1884             for (j = 0; j < XVECLEN (x, i); j++)
1885               if (side_effects_p (XVECEXP (x, i, j)))
1886                 return 1;
1887           }
1888       }
1889   }
1890   return 0;
1891 }
1892 \f
1893 /* Return nonzero if evaluating rtx X might cause a trap.  */
1894
1895 int
1896 may_trap_p (x)
1897      rtx x;
1898 {
1899   int i;
1900   enum rtx_code code;
1901   const char *fmt;
1902
1903   if (x == 0)
1904     return 0;
1905   code = GET_CODE (x);
1906   switch (code)
1907     {
1908       /* Handle these cases quickly.  */
1909     case CONST_INT:
1910     case CONST_DOUBLE:
1911     case SYMBOL_REF:
1912     case LABEL_REF:
1913     case CONST:
1914     case PC:
1915     case CC0:
1916     case REG:
1917     case SCRATCH:
1918       return 0;
1919
1920     case ASM_INPUT:
1921     case UNSPEC_VOLATILE:
1922     case TRAP_IF:
1923       return 1;
1924
1925     case ASM_OPERANDS:
1926       return MEM_VOLATILE_P (x);
1927
1928       /* Memory ref can trap unless it's a static var or a stack slot.  */
1929     case MEM:
1930       return rtx_addr_can_trap_p (XEXP (x, 0));
1931
1932       /* Division by a non-constant might trap.  */
1933     case DIV:
1934     case MOD:
1935     case UDIV:
1936     case UMOD:
1937       if (! CONSTANT_P (XEXP (x, 1))
1938           || GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1939         return 1;
1940       /* This was const0_rtx, but by not using that,
1941          we can link this file into other programs.  */
1942       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
1943         return 1;
1944       break;
1945
1946     case EXPR_LIST:
1947       /* An EXPR_LIST is used to represent a function call.  This
1948          certainly may trap.  */
1949       return 1;
1950
1951     case GE:
1952     case GT:
1953     case LE:
1954     case LT:
1955     case COMPARE:
1956       /* Some floating point comparisons may trap.  */
1957       /* ??? There is no machine independent way to check for tests that trap
1958          when COMPARE is used, though many targets do make this distinction.
1959          For instance, sparc uses CCFPE for compares which generate exceptions
1960          and CCFP for compares which do not generate exceptions.  */
1961       if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1962         return 1;
1963       /* But often the compare has some CC mode, so check operand
1964          modes as well.  */
1965       if (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_FLOAT
1966           || GET_MODE_CLASS (GET_MODE (XEXP (x, 1))) == MODE_FLOAT)
1967         return 1;
1968       break;
1969
1970     default:
1971       /* Any floating arithmetic may trap.  */
1972       if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1973         return 1;
1974     }
1975
1976   fmt = GET_RTX_FORMAT (code);
1977   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1978     {
1979       if (fmt[i] == 'e')
1980         {
1981           if (may_trap_p (XEXP (x, i)))
1982             return 1;
1983         }
1984       else if (fmt[i] == 'E')
1985         {
1986           register int j;
1987           for (j = 0; j < XVECLEN (x, i); j++)
1988             if (may_trap_p (XVECEXP (x, i, j)))
1989               return 1;
1990         }
1991     }
1992   return 0;
1993 }
1994 \f
1995 /* Return nonzero if X contains a comparison that is not either EQ or NE,
1996    i.e., an inequality.  */
1997
1998 int
1999 inequality_comparisons_p (x)
2000      rtx x;
2001 {
2002   register const char *fmt;
2003   register int len, i;
2004   register enum rtx_code code = GET_CODE (x);
2005
2006   switch (code)
2007     {
2008     case REG:
2009     case SCRATCH:
2010     case PC:
2011     case CC0:
2012     case CONST_INT:
2013     case CONST_DOUBLE:
2014     case CONST:
2015     case LABEL_REF:
2016     case SYMBOL_REF:
2017       return 0;
2018
2019     case LT:
2020     case LTU:
2021     case GT:
2022     case GTU:
2023     case LE:
2024     case LEU:
2025     case GE:
2026     case GEU:
2027       return 1;
2028       
2029     default:
2030       break;
2031     }
2032
2033   len = GET_RTX_LENGTH (code);
2034   fmt = GET_RTX_FORMAT (code);
2035
2036   for (i = 0; i < len; i++)
2037     {
2038       if (fmt[i] == 'e')
2039         {
2040           if (inequality_comparisons_p (XEXP (x, i)))
2041             return 1;
2042         }
2043       else if (fmt[i] == 'E')
2044         {
2045           register int j;
2046           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2047             if (inequality_comparisons_p (XVECEXP (x, i, j)))
2048               return 1;
2049         }
2050     }
2051             
2052   return 0;
2053 }
2054 \f
2055 /* Replace any occurrence of FROM in X with TO.  The function does
2056    not enter into CONST_DOUBLE for the replace.
2057
2058    Note that copying is not done so X must not be shared unless all copies
2059    are to be modified.  */
2060
2061 rtx
2062 replace_rtx (x, from, to)
2063      rtx x, from, to;
2064 {
2065   register int i, j;
2066   register const char *fmt;
2067
2068   /* The following prevents loops occurrence when we change MEM in
2069      CONST_DOUBLE onto the same CONST_DOUBLE. */
2070   if (x != 0 && GET_CODE (x) == CONST_DOUBLE)
2071     return x;
2072
2073   if (x == from)
2074     return to;
2075
2076   /* Allow this function to make replacements in EXPR_LISTs.  */
2077   if (x == 0)
2078     return 0;
2079
2080   fmt = GET_RTX_FORMAT (GET_CODE (x));
2081   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2082     {
2083       if (fmt[i] == 'e')
2084         XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
2085       else if (fmt[i] == 'E')
2086         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2087           XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
2088     }
2089
2090   return x;
2091 }  
2092 \f
2093 /* Throughout the rtx X, replace many registers according to REG_MAP.
2094    Return the replacement for X (which may be X with altered contents).
2095    REG_MAP[R] is the replacement for register R, or 0 for don't replace.
2096    NREGS is the length of REG_MAP; regs >= NREGS are not mapped.  
2097
2098    We only support REG_MAP entries of REG or SUBREG.  Also, hard registers
2099    should not be mapped to pseudos or vice versa since validate_change
2100    is not called.
2101
2102    If REPLACE_DEST is 1, replacements are also done in destinations;
2103    otherwise, only sources are replaced.  */
2104
2105 rtx
2106 replace_regs (x, reg_map, nregs, replace_dest)
2107      rtx x;
2108      rtx *reg_map;
2109      unsigned int nregs;
2110      int replace_dest;
2111 {
2112   register enum rtx_code code;
2113   register int i;
2114   register const char *fmt;
2115
2116   if (x == 0)
2117     return x;
2118
2119   code = GET_CODE (x);
2120   switch (code)
2121     {
2122     case SCRATCH:
2123     case PC:
2124     case CC0:
2125     case CONST_INT:
2126     case CONST_DOUBLE:
2127     case CONST:
2128     case SYMBOL_REF:
2129     case LABEL_REF:
2130       return x;
2131
2132     case REG:
2133       /* Verify that the register has an entry before trying to access it.  */
2134       if (REGNO (x) < nregs && reg_map[REGNO (x)] != 0)
2135         {
2136           /* SUBREGs can't be shared.  Always return a copy to ensure that if
2137              this replacement occurs more than once then each instance will
2138              get distinct rtx.  */
2139           if (GET_CODE (reg_map[REGNO (x)]) == SUBREG)
2140             return copy_rtx (reg_map[REGNO (x)]);
2141           return reg_map[REGNO (x)];
2142         }
2143       return x;
2144
2145     case SUBREG:
2146       /* Prevent making nested SUBREGs.  */
2147       if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < nregs
2148           && reg_map[REGNO (SUBREG_REG (x))] != 0
2149           && GET_CODE (reg_map[REGNO (SUBREG_REG (x))]) == SUBREG)
2150         {
2151           rtx map_val = reg_map[REGNO (SUBREG_REG (x))];
2152           rtx map_inner = SUBREG_REG (map_val);
2153
2154           if (GET_MODE (x) == GET_MODE (map_inner))
2155             return map_inner;
2156           else
2157             {
2158               /* We cannot call gen_rtx here since we may be linked with
2159                  genattrtab.c.  */
2160               /* Let's try clobbering the incoming SUBREG and see
2161                  if this is really safe.  */
2162               SUBREG_REG (x) = map_inner;
2163               SUBREG_WORD (x) += SUBREG_WORD (map_val);
2164               return x;
2165 #if 0
2166               rtx new = rtx_alloc (SUBREG);
2167               PUT_MODE (new, GET_MODE (x));
2168               SUBREG_REG (new) = map_inner;
2169               SUBREG_WORD (new) = SUBREG_WORD (x) + SUBREG_WORD (map_val);
2170 #endif
2171             }
2172         }
2173       break;
2174
2175     case SET:
2176       if (replace_dest)
2177         SET_DEST (x) = replace_regs (SET_DEST (x), reg_map, nregs, 0);
2178
2179       else if (GET_CODE (SET_DEST (x)) == MEM
2180                || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
2181         /* Even if we are not to replace destinations, replace register if it
2182            is CONTAINED in destination (destination is memory or
2183            STRICT_LOW_PART).  */
2184         XEXP (SET_DEST (x), 0) = replace_regs (XEXP (SET_DEST (x), 0),
2185                                                reg_map, nregs, 0);
2186       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
2187         /* Similarly, for ZERO_EXTRACT we replace all operands.  */
2188         break;
2189
2190       SET_SRC (x) = replace_regs (SET_SRC (x), reg_map, nregs, 0);
2191       return x;
2192       
2193     default:
2194       break;
2195     }
2196
2197   fmt = GET_RTX_FORMAT (code);
2198   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2199     {
2200       if (fmt[i] == 'e')
2201         XEXP (x, i) = replace_regs (XEXP (x, i), reg_map, nregs, replace_dest);
2202       else if (fmt[i] == 'E')
2203         {
2204           register int j;
2205           for (j = 0; j < XVECLEN (x, i); j++)
2206             XVECEXP (x, i, j) = replace_regs (XVECEXP (x, i, j), reg_map,
2207                                               nregs, replace_dest);
2208         }
2209     }
2210   return x;
2211 }
2212
2213 /* Return 1 if X, the SRC_SRC of  SET of (pc) contain a REG or MEM that is
2214    not in the constant pool and not in the condition of an IF_THEN_ELSE.  */
2215
2216 static int
2217 jmp_uses_reg_or_mem (x)
2218      rtx x;
2219 {
2220   enum rtx_code code = GET_CODE (x);
2221   int i, j;
2222   const char *fmt;
2223
2224   switch (code)
2225     {
2226     case CONST:
2227     case LABEL_REF:
2228     case PC:
2229       return 0;
2230
2231     case REG:
2232       return 1;
2233
2234     case MEM:
2235       return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
2236                 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
2237
2238     case IF_THEN_ELSE:
2239       return (jmp_uses_reg_or_mem (XEXP (x, 1))
2240               || jmp_uses_reg_or_mem (XEXP (x, 2)));
2241
2242     case PLUS:  case MINUS:  case MULT:
2243       return (jmp_uses_reg_or_mem (XEXP (x, 0))
2244               || jmp_uses_reg_or_mem (XEXP (x, 1)));
2245
2246     default:
2247       break;
2248     }
2249
2250   fmt = GET_RTX_FORMAT (code);
2251   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2252     {
2253       if (fmt[i] == 'e'
2254           && jmp_uses_reg_or_mem (XEXP (x, i)))
2255         return 1;
2256
2257       else if (fmt[i] == 'E')
2258         for (j = 0; j < XVECLEN (x, i); j++)
2259           if (jmp_uses_reg_or_mem (XVECEXP (x, i, j)))
2260             return 1;
2261     }
2262
2263   return 0;
2264 }
2265
2266 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2267
2268    Tablejumps and casesi insns are not considered indirect jumps;
2269    we can recognize them by a (use (label_ref)).  */
2270
2271 int
2272 computed_jump_p (insn)
2273      rtx insn;
2274 {
2275   int i;
2276   if (GET_CODE (insn) == JUMP_INSN)
2277     {
2278       rtx pat = PATTERN (insn);
2279
2280       if (GET_CODE (pat) == PARALLEL)
2281         {
2282           int len = XVECLEN (pat, 0);
2283           int has_use_labelref = 0;
2284
2285           for (i = len - 1; i >= 0; i--)
2286             if (GET_CODE (XVECEXP (pat, 0, i)) == USE
2287                 && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0))
2288                     == LABEL_REF))
2289               has_use_labelref = 1;
2290
2291           if (! has_use_labelref)
2292             for (i = len - 1; i >= 0; i--)
2293               if (GET_CODE (XVECEXP (pat, 0, i)) == SET
2294                   && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
2295                   && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i))))
2296                 return 1;
2297         }
2298       else if (GET_CODE (pat) == SET
2299                && SET_DEST (pat) == pc_rtx
2300                && jmp_uses_reg_or_mem (SET_SRC (pat)))
2301         return 1;
2302     }
2303   return 0;
2304 }
2305
2306 /* Traverse X via depth-first search, calling F for each
2307    sub-expression (including X itself).  F is also passed the DATA.
2308    If F returns -1, do not traverse sub-expressions, but continue
2309    traversing the rest of the tree.  If F ever returns any other
2310    non-zero value, stop the traversal, and return the value returned
2311    by F.  Otherwise, return 0.  This function does not traverse inside
2312    tree structure that contains RTX_EXPRs, or into sub-expressions
2313    whose format code is `0' since it is not known whether or not those
2314    codes are actually RTL.
2315
2316    This routine is very general, and could (should?) be used to
2317    implement many of the other routines in this file.  */
2318
2319 int
2320 for_each_rtx (x, f, data)
2321      rtx *x;
2322      rtx_function f;
2323      void *data;
2324 {
2325   int result;
2326   int length;
2327   const char* format;
2328   int i;
2329
2330   /* Call F on X.  */
2331   result = (*f)(x, data);
2332   if (result == -1)
2333     /* Do not traverse sub-expressions.  */
2334     return 0;
2335   else if (result != 0)
2336     /* Stop the traversal.  */
2337     return result;
2338
2339   if (*x == NULL_RTX)
2340     /* There are no sub-expressions.  */
2341     return 0;
2342
2343   length = GET_RTX_LENGTH (GET_CODE (*x));
2344   format = GET_RTX_FORMAT (GET_CODE (*x));
2345
2346   for (i = 0; i < length; ++i) 
2347     {
2348       switch (format[i]) 
2349         {
2350         case 'e':
2351           result = for_each_rtx (&XEXP (*x, i), f, data);
2352           if (result != 0)
2353             return result;
2354           break;
2355
2356         case 'V':
2357         case 'E':
2358           if (XVEC (*x, i) != 0) 
2359             {
2360               int j;
2361               for (j = 0; j < XVECLEN (*x, i); ++j)
2362                 {
2363                   result = for_each_rtx (&XVECEXP (*x, i, j), f, data);
2364                   if (result != 0)
2365                     return result;
2366                 }
2367             }
2368           break; 
2369
2370         default:
2371           /* Nothing to do.  */
2372           break;
2373         }
2374
2375     }
2376
2377   return 0;
2378 }
2379
2380 /* Searches X for any reference to REGNO, returning the rtx of the
2381    reference found if any.  Otherwise, returns NULL_RTX.  */
2382
2383 rtx
2384 regno_use_in (regno, x)
2385      unsigned int regno;
2386      rtx x;
2387 {
2388   register const char *fmt;
2389   int i, j;
2390   rtx tem;
2391
2392   if (GET_CODE (x) == REG && REGNO (x) == regno)
2393     return x;
2394
2395   fmt = GET_RTX_FORMAT (GET_CODE (x));
2396   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2397     {
2398       if (fmt[i] == 'e')
2399         {
2400           if ((tem = regno_use_in (regno, XEXP (x, i))))
2401             return tem;
2402         }
2403       else if (fmt[i] == 'E')
2404         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2405           if ((tem = regno_use_in (regno , XVECEXP (x, i, j))))
2406             return tem;
2407     }
2408
2409   return NULL_RTX;
2410 }
2411
2412
2413 /* Return 1 if X is an autoincrement side effect and the register is
2414    not the stack pointer.  */
2415 int
2416 auto_inc_p (x)
2417      rtx x;
2418 {
2419   switch (GET_CODE (x))
2420     {
2421     case PRE_INC:
2422     case POST_INC:
2423     case PRE_DEC:
2424     case POST_DEC:
2425     case PRE_MODIFY:
2426     case POST_MODIFY:
2427       /* There are no REG_INC notes for SP.  */
2428       if (XEXP (x, 0) != stack_pointer_rtx)
2429         return 1;
2430     default:
2431       break;
2432     }
2433   return 0;
2434 }
2435
2436 /* Return 1 if the sequence of instructions beginning with FROM and up
2437    to and including TO is safe to move.  If NEW_TO is non-NULL, and
2438    the sequence is not already safe to move, but can be easily
2439    extended to a sequence which is safe, then NEW_TO will point to the
2440    end of the extended sequence.  
2441  
2442    For now, this function only checks that the region contains whole
2443    exception regiongs, but it could be extended to check additional
2444    conditions as well.  */
2445
2446 int
2447 insns_safe_to_move_p (from, to, new_to)
2448      rtx from;
2449      rtx to;
2450      rtx *new_to;
2451 {
2452   int eh_region_count = 0;
2453   int past_to_p = 0;
2454   rtx r = from;
2455
2456   /* By default, assume the end of the region will be what was
2457      suggested.  */
2458   if (new_to)
2459     *new_to = to;
2460
2461   while (r)
2462     {
2463       if (GET_CODE (r) == NOTE)
2464         {
2465           switch (NOTE_LINE_NUMBER (r))
2466             {
2467             case NOTE_INSN_EH_REGION_BEG:
2468               ++eh_region_count;
2469               break;
2470
2471             case NOTE_INSN_EH_REGION_END:
2472               if (eh_region_count == 0)
2473                 /* This sequence of instructions contains the end of
2474                    an exception region, but not he beginning.  Moving
2475                    it will cause chaos.  */
2476                 return 0;
2477
2478               --eh_region_count;
2479               break;
2480
2481             default:
2482               break;
2483             }
2484         }
2485       else if (past_to_p)
2486         /* If we've passed TO, and we see a non-note instruction, we
2487            can't extend the sequence to a movable sequence.  */
2488         return 0;
2489
2490       if (r == to)
2491         {
2492           if (!new_to)
2493             /* It's OK to move the sequence if there were matched sets of
2494                exception region notes.  */
2495             return eh_region_count == 0;
2496           
2497           past_to_p = 1;
2498         }
2499
2500       /* It's OK to move the sequence if there were matched sets of
2501          exception region notes.  */
2502       if (past_to_p && eh_region_count == 0)
2503         {
2504           *new_to = r;
2505           return 1;
2506         }
2507
2508       /* Go to the next instruction.  */
2509       r = NEXT_INSN (r);
2510     }
2511   
2512   return 0;
2513 }
2514
2515 /* Return non-zero if IN contains a piece of rtl that has the address LOC */
2516 int
2517 loc_mentioned_in_p (loc, in)
2518      rtx *loc, in;
2519 {
2520   enum rtx_code code = GET_CODE (in);
2521   const char *fmt = GET_RTX_FORMAT (code);
2522   int i, j;
2523
2524   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2525     {
2526       if (loc == &in->fld[i].rtx)
2527         return 1;
2528       if (fmt[i] == 'e')
2529         {
2530           if (loc_mentioned_in_p (loc, XEXP (in, i)))
2531             return 1;
2532         }
2533       else if (fmt[i] == 'E')
2534         for (j = XVECLEN (in, i) - 1; j >= 0; j--)
2535           if (loc_mentioned_in_p (loc, XVECEXP (in, i, j)))
2536             return 1;
2537     }
2538   return 0;
2539 }