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