OSDN Git Service

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