OSDN Git Service

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