OSDN Git Service

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