OSDN Git Service

* doc/install.texi: Document that dejagnu 1.4.4 is required.
[pf3gnuchains/gcc-fork.git] / gcc / jump.c
1 /* Optimize jump instructions, for GNU compiler.
2    Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997
3    1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 /* This is the pathetic reminder of old fame of the jump-optimization pass
23    of the compiler.  Now it contains basically set of utility function to
24    operate with jumps.
25
26    Each CODE_LABEL has a count of the times it is used
27    stored in the LABEL_NUSES internal field, and each JUMP_INSN
28    has one label that it refers to stored in the
29    JUMP_LABEL internal field.  With this we can detect labels that
30    become unused because of the deletion of all the jumps that
31    formerly used them.  The JUMP_LABEL info is sometimes looked
32    at by later passes.
33
34    The subroutines redirect_jump and invert_jump are used
35    from other passes as well.  */
36
37 #include "config.h"
38 #include "system.h"
39 #include "coretypes.h"
40 #include "tm.h"
41 #include "rtl.h"
42 #include "tm_p.h"
43 #include "flags.h"
44 #include "hard-reg-set.h"
45 #include "regs.h"
46 #include "insn-config.h"
47 #include "insn-attr.h"
48 #include "recog.h"
49 #include "function.h"
50 #include "expr.h"
51 #include "real.h"
52 #include "except.h"
53 #include "diagnostic.h"
54 #include "toplev.h"
55 #include "reload.h"
56 #include "predict.h"
57 #include "timevar.h"
58
59 /* Optimize jump y; x: ... y: jumpif... x?
60    Don't know if it is worth bothering with.  */
61 /* Optimize two cases of conditional jump to conditional jump?
62    This can never delete any instruction or make anything dead,
63    or even change what is live at any point.
64    So perhaps let combiner do it.  */
65
66 static void init_label_info (rtx);
67 static void mark_all_labels (rtx);
68 static void delete_computation (rtx);
69 static void redirect_exp_1 (rtx *, rtx, rtx, rtx);
70 static int redirect_exp (rtx, rtx, rtx);
71 static void invert_exp_1 (rtx);
72 static int invert_exp (rtx);
73 static int returnjump_p_1 (rtx *, void *);
74 static void delete_prior_computation (rtx, rtx);
75 \f
76 /* Alternate entry into the jump optimizer.  This entry point only rebuilds
77    the JUMP_LABEL field in jumping insns and REG_LABEL notes in non-jumping
78    instructions.  */
79 void
80 rebuild_jump_labels (rtx f)
81 {
82   rtx insn;
83
84   timevar_push (TV_REBUILD_JUMP);
85   init_label_info (f);
86   mark_all_labels (f);
87
88   /* Keep track of labels used from static data; we don't track them
89      closely enough to delete them here, so make sure their reference
90      count doesn't drop to zero.  */
91
92   for (insn = forced_labels; insn; insn = XEXP (insn, 1))
93     if (GET_CODE (XEXP (insn, 0)) == CODE_LABEL)
94       LABEL_NUSES (XEXP (insn, 0))++;
95   timevar_pop (TV_REBUILD_JUMP);
96 }
97 \f
98 /* Some old code expects exactly one BARRIER as the NEXT_INSN of a
99    non-fallthru insn.  This is not generally true, as multiple barriers
100    may have crept in, or the BARRIER may be separated from the last
101    real insn by one or more NOTEs.
102
103    This simple pass moves barriers and removes duplicates so that the
104    old code is happy.
105  */
106 void
107 cleanup_barriers (void)
108 {
109   rtx insn, next, prev;
110   for (insn = get_insns (); insn; insn = next)
111     {
112       next = NEXT_INSN (insn);
113       if (GET_CODE (insn) == BARRIER)
114         {
115           prev = prev_nonnote_insn (insn);
116           if (GET_CODE (prev) == BARRIER)
117             delete_barrier (insn);
118           else if (prev != PREV_INSN (insn))
119             reorder_insns (insn, insn, prev);
120         }
121     }
122 }
123
124 void
125 purge_line_number_notes (rtx f)
126 {
127   rtx last_note = 0;
128   rtx insn;
129   /* Delete extraneous line number notes.
130      Note that two consecutive notes for different lines are not really
131      extraneous.  There should be some indication where that line belonged,
132      even if it became empty.  */
133
134   for (insn = f; insn; insn = NEXT_INSN (insn))
135     if (GET_CODE (insn) == NOTE)
136       {
137         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
138           /* Any previous line note was for the prologue; gdb wants a new
139              note after the prologue even if it is for the same line.  */
140           last_note = NULL_RTX;
141         else if (NOTE_LINE_NUMBER (insn) >= 0)
142           {
143             /* Delete this note if it is identical to previous note.  */
144             if (last_note
145                 && NOTE_SOURCE_FILE (insn) == NOTE_SOURCE_FILE (last_note)
146                 && NOTE_LINE_NUMBER (insn) == NOTE_LINE_NUMBER (last_note))
147               {
148                 delete_related_insns (insn);
149                 continue;
150               }
151
152             last_note = insn;
153           }
154       }
155 }
156 \f
157 /* Initialize LABEL_NUSES and JUMP_LABEL fields.  Delete any REG_LABEL
158    notes whose labels don't occur in the insn any more.  Returns the
159    largest INSN_UID found.  */
160 static void
161 init_label_info (rtx f)
162 {
163   rtx insn;
164
165   for (insn = f; insn; insn = NEXT_INSN (insn))
166     if (GET_CODE (insn) == CODE_LABEL)
167       LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
168     else if (GET_CODE (insn) == JUMP_INSN)
169       JUMP_LABEL (insn) = 0;
170     else if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
171       {
172         rtx note, next;
173
174         for (note = REG_NOTES (insn); note; note = next)
175           {
176             next = XEXP (note, 1);
177             if (REG_NOTE_KIND (note) == REG_LABEL
178                 && ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
179               remove_note (insn, note);
180           }
181       }
182 }
183
184 /* Mark the label each jump jumps to.
185    Combine consecutive labels, and count uses of labels.  */
186
187 static void
188 mark_all_labels (rtx f)
189 {
190   rtx insn;
191
192   for (insn = f; insn; insn = NEXT_INSN (insn))
193     if (INSN_P (insn))
194       {
195         if (GET_CODE (insn) == CALL_INSN
196             && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
197           {
198             mark_all_labels (XEXP (PATTERN (insn), 0));
199             mark_all_labels (XEXP (PATTERN (insn), 1));
200             mark_all_labels (XEXP (PATTERN (insn), 2));
201
202             /* Canonicalize the tail recursion label attached to the
203                CALL_PLACEHOLDER insn.  */
204             if (XEXP (PATTERN (insn), 3))
205               {
206                 rtx label_ref = gen_rtx_LABEL_REF (VOIDmode,
207                                                    XEXP (PATTERN (insn), 3));
208                 mark_jump_label (label_ref, insn, 0);
209                 XEXP (PATTERN (insn), 3) = XEXP (label_ref, 0);
210               }
211
212             continue;
213           }
214
215         mark_jump_label (PATTERN (insn), insn, 0);
216         if (! INSN_DELETED_P (insn) && GET_CODE (insn) == JUMP_INSN)
217           {
218             /* When we know the LABEL_REF contained in a REG used in
219                an indirect jump, we'll have a REG_LABEL note so that
220                flow can tell where it's going.  */
221             if (JUMP_LABEL (insn) == 0)
222               {
223                 rtx label_note = find_reg_note (insn, REG_LABEL, NULL_RTX);
224                 if (label_note)
225                   {
226                     /* But a LABEL_REF around the REG_LABEL note, so
227                        that we can canonicalize it.  */
228                     rtx label_ref = gen_rtx_LABEL_REF (VOIDmode,
229                                                        XEXP (label_note, 0));
230
231                     mark_jump_label (label_ref, insn, 0);
232                     XEXP (label_note, 0) = XEXP (label_ref, 0);
233                     JUMP_LABEL (insn) = XEXP (label_note, 0);
234                   }
235               }
236           }
237       }
238 }
239 \f
240 /* Move all block-beg, block-end, loop-beg, loop-cont, loop-vtop, loop-end,
241    notes between START and END out before START.  START and END may be such
242    notes.  Returns the values of the new starting and ending insns, which
243    may be different if the original ones were such notes.
244    Return true if there were only such notes and no real instructions.  */
245
246 bool
247 squeeze_notes (rtx* startp, rtx* endp)
248 {
249   rtx start = *startp;
250   rtx end = *endp;
251
252   rtx insn;
253   rtx next;
254   rtx last = NULL;
255   rtx past_end = NEXT_INSN (end);
256
257   for (insn = start; insn != past_end; insn = next)
258     {
259       next = NEXT_INSN (insn);
260       if (GET_CODE (insn) == NOTE
261           && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END
262               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG
263               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
264               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END
265               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT
266               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_VTOP))
267         {
268           if (insn == start)
269             start = next;
270           else
271             {
272               rtx prev = PREV_INSN (insn);
273               PREV_INSN (insn) = PREV_INSN (start);
274               NEXT_INSN (insn) = start;
275               NEXT_INSN (PREV_INSN (insn)) = insn;
276               PREV_INSN (NEXT_INSN (insn)) = insn;
277               NEXT_INSN (prev) = next;
278               PREV_INSN (next) = prev;
279             }
280         }
281       else
282         last = insn;
283     }
284
285   /* There were no real instructions.  */
286   if (start == past_end)
287     return true;
288
289   end = last;
290
291   *startp = start;
292   *endp = end;
293   return false;
294 }
295 \f
296 /* Return the label before INSN, or put a new label there.  */
297
298 rtx
299 get_label_before (rtx insn)
300 {
301   rtx label;
302
303   /* Find an existing label at this point
304      or make a new one if there is none.  */
305   label = prev_nonnote_insn (insn);
306
307   if (label == 0 || GET_CODE (label) != CODE_LABEL)
308     {
309       rtx prev = PREV_INSN (insn);
310
311       label = gen_label_rtx ();
312       emit_label_after (label, prev);
313       LABEL_NUSES (label) = 0;
314     }
315   return label;
316 }
317
318 /* Return the label after INSN, or put a new label there.  */
319
320 rtx
321 get_label_after (rtx insn)
322 {
323   rtx label;
324
325   /* Find an existing label at this point
326      or make a new one if there is none.  */
327   label = next_nonnote_insn (insn);
328
329   if (label == 0 || GET_CODE (label) != CODE_LABEL)
330     {
331       label = gen_label_rtx ();
332       emit_label_after (label, insn);
333       LABEL_NUSES (label) = 0;
334     }
335   return label;
336 }
337 \f
338 /* Given a comparison (CODE ARG0 ARG1), inside an insn, INSN, return a code
339    of reversed comparison if it is possible to do so.  Otherwise return UNKNOWN.
340    UNKNOWN may be returned in case we are having CC_MODE compare and we don't
341    know whether it's source is floating point or integer comparison.  Machine
342    description should define REVERSIBLE_CC_MODE and REVERSE_CONDITION macros
343    to help this function avoid overhead in these cases.  */
344 enum rtx_code
345 reversed_comparison_code_parts (enum rtx_code code, rtx arg0, rtx arg1, rtx insn)
346 {
347   enum machine_mode mode;
348
349   /* If this is not actually a comparison, we can't reverse it.  */
350   if (GET_RTX_CLASS (code) != RTX_COMPARE
351       && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
352     return UNKNOWN;
353
354   mode = GET_MODE (arg0);
355   if (mode == VOIDmode)
356     mode = GET_MODE (arg1);
357
358   /* First see if machine description supplies us way to reverse the
359      comparison.  Give it priority over everything else to allow
360      machine description to do tricks.  */
361   if (GET_MODE_CLASS (mode) == MODE_CC
362       && REVERSIBLE_CC_MODE (mode))
363     {
364 #ifdef REVERSE_CONDITION
365       return REVERSE_CONDITION (code, mode);
366 #endif
367       return reverse_condition (code);
368     }
369
370   /* Try a few special cases based on the comparison code.  */
371   switch (code)
372     {
373     case GEU:
374     case GTU:
375     case LEU:
376     case LTU:
377     case NE:
378     case EQ:
379       /* It is always safe to reverse EQ and NE, even for the floating
380          point.  Similarly the unsigned comparisons are never used for
381          floating point so we can reverse them in the default way.  */
382       return reverse_condition (code);
383     case ORDERED:
384     case UNORDERED:
385     case LTGT:
386     case UNEQ:
387       /* In case we already see unordered comparison, we can be sure to
388          be dealing with floating point so we don't need any more tests.  */
389       return reverse_condition_maybe_unordered (code);
390     case UNLT:
391     case UNLE:
392     case UNGT:
393     case UNGE:
394       /* We don't have safe way to reverse these yet.  */
395       return UNKNOWN;
396     default:
397       break;
398     }
399
400   if (GET_MODE_CLASS (mode) == MODE_CC || CC0_P (arg0))
401     {
402       rtx prev;
403       /* Try to search for the comparison to determine the real mode.
404          This code is expensive, but with sane machine description it
405          will be never used, since REVERSIBLE_CC_MODE will return true
406          in all cases.  */
407       if (! insn)
408         return UNKNOWN;
409
410       for (prev = prev_nonnote_insn (insn);
411            prev != 0 && GET_CODE (prev) != CODE_LABEL;
412            prev = prev_nonnote_insn (prev))
413         {
414           rtx set = set_of (arg0, prev);
415           if (set && GET_CODE (set) == SET
416               && rtx_equal_p (SET_DEST (set), arg0))
417             {
418               rtx src = SET_SRC (set);
419
420               if (GET_CODE (src) == COMPARE)
421                 {
422                   rtx comparison = src;
423                   arg0 = XEXP (src, 0);
424                   mode = GET_MODE (arg0);
425                   if (mode == VOIDmode)
426                     mode = GET_MODE (XEXP (comparison, 1));
427                   break;
428                 }
429               /* We can get past reg-reg moves.  This may be useful for model
430                  of i387 comparisons that first move flag registers around.  */
431               if (REG_P (src))
432                 {
433                   arg0 = src;
434                   continue;
435                 }
436             }
437           /* If register is clobbered in some ununderstandable way,
438              give up.  */
439           if (set)
440             return UNKNOWN;
441         }
442     }
443
444   /* Test for an integer condition, or a floating-point comparison
445      in which NaNs can be ignored.  */
446   if (GET_CODE (arg0) == CONST_INT
447       || (GET_MODE (arg0) != VOIDmode
448           && GET_MODE_CLASS (mode) != MODE_CC
449           && !HONOR_NANS (mode)))
450     return reverse_condition (code);
451
452   return UNKNOWN;
453 }
454
455 /* A wrapper around the previous function to take COMPARISON as rtx
456    expression.  This simplifies many callers.  */
457 enum rtx_code
458 reversed_comparison_code (rtx comparison, rtx insn)
459 {
460   if (!COMPARISON_P (comparison))
461     return UNKNOWN;
462   return reversed_comparison_code_parts (GET_CODE (comparison),
463                                          XEXP (comparison, 0),
464                                          XEXP (comparison, 1), insn);
465 }
466 \f
467 /* Given an rtx-code for a comparison, return the code for the negated
468    comparison.  If no such code exists, return UNKNOWN.
469
470    WATCH OUT!  reverse_condition is not safe to use on a jump that might
471    be acting on the results of an IEEE floating point comparison, because
472    of the special treatment of non-signaling nans in comparisons.
473    Use reversed_comparison_code instead.  */
474
475 enum rtx_code
476 reverse_condition (enum rtx_code code)
477 {
478   switch (code)
479     {
480     case EQ:
481       return NE;
482     case NE:
483       return EQ;
484     case GT:
485       return LE;
486     case GE:
487       return LT;
488     case LT:
489       return GE;
490     case LE:
491       return GT;
492     case GTU:
493       return LEU;
494     case GEU:
495       return LTU;
496     case LTU:
497       return GEU;
498     case LEU:
499       return GTU;
500     case UNORDERED:
501       return ORDERED;
502     case ORDERED:
503       return UNORDERED;
504
505     case UNLT:
506     case UNLE:
507     case UNGT:
508     case UNGE:
509     case UNEQ:
510     case LTGT:
511       return UNKNOWN;
512
513     default:
514       abort ();
515     }
516 }
517
518 /* Similar, but we're allowed to generate unordered comparisons, which
519    makes it safe for IEEE floating-point.  Of course, we have to recognize
520    that the target will support them too...  */
521
522 enum rtx_code
523 reverse_condition_maybe_unordered (enum rtx_code code)
524 {
525   switch (code)
526     {
527     case EQ:
528       return NE;
529     case NE:
530       return EQ;
531     case GT:
532       return UNLE;
533     case GE:
534       return UNLT;
535     case LT:
536       return UNGE;
537     case LE:
538       return UNGT;
539     case LTGT:
540       return UNEQ;
541     case UNORDERED:
542       return ORDERED;
543     case ORDERED:
544       return UNORDERED;
545     case UNLT:
546       return GE;
547     case UNLE:
548       return GT;
549     case UNGT:
550       return LE;
551     case UNGE:
552       return LT;
553     case UNEQ:
554       return LTGT;
555
556     default:
557       abort ();
558     }
559 }
560
561 /* Similar, but return the code when two operands of a comparison are swapped.
562    This IS safe for IEEE floating-point.  */
563
564 enum rtx_code
565 swap_condition (enum rtx_code code)
566 {
567   switch (code)
568     {
569     case EQ:
570     case NE:
571     case UNORDERED:
572     case ORDERED:
573     case UNEQ:
574     case LTGT:
575       return code;
576
577     case GT:
578       return LT;
579     case GE:
580       return LE;
581     case LT:
582       return GT;
583     case LE:
584       return GE;
585     case GTU:
586       return LTU;
587     case GEU:
588       return LEU;
589     case LTU:
590       return GTU;
591     case LEU:
592       return GEU;
593     case UNLT:
594       return UNGT;
595     case UNLE:
596       return UNGE;
597     case UNGT:
598       return UNLT;
599     case UNGE:
600       return UNLE;
601
602     default:
603       abort ();
604     }
605 }
606
607 /* Given a comparison CODE, return the corresponding unsigned comparison.
608    If CODE is an equality comparison or already an unsigned comparison,
609    CODE is returned.  */
610
611 enum rtx_code
612 unsigned_condition (enum rtx_code code)
613 {
614   switch (code)
615     {
616     case EQ:
617     case NE:
618     case GTU:
619     case GEU:
620     case LTU:
621     case LEU:
622       return code;
623
624     case GT:
625       return GTU;
626     case GE:
627       return GEU;
628     case LT:
629       return LTU;
630     case LE:
631       return LEU;
632
633     default:
634       abort ();
635     }
636 }
637
638 /* Similarly, return the signed version of a comparison.  */
639
640 enum rtx_code
641 signed_condition (enum rtx_code code)
642 {
643   switch (code)
644     {
645     case EQ:
646     case NE:
647     case GT:
648     case GE:
649     case LT:
650     case LE:
651       return code;
652
653     case GTU:
654       return GT;
655     case GEU:
656       return GE;
657     case LTU:
658       return LT;
659     case LEU:
660       return LE;
661
662     default:
663       abort ();
664     }
665 }
666 \f
667 /* Return nonzero if CODE1 is more strict than CODE2, i.e., if the
668    truth of CODE1 implies the truth of CODE2.  */
669
670 int
671 comparison_dominates_p (enum rtx_code code1, enum rtx_code code2)
672 {
673   /* UNKNOWN comparison codes can happen as a result of trying to revert
674      comparison codes.
675      They can't match anything, so we have to reject them here.  */
676   if (code1 == UNKNOWN || code2 == UNKNOWN)
677     return 0;
678
679   if (code1 == code2)
680     return 1;
681
682   switch (code1)
683     {
684     case UNEQ:
685       if (code2 == UNLE || code2 == UNGE)
686         return 1;
687       break;
688
689     case EQ:
690       if (code2 == LE || code2 == LEU || code2 == GE || code2 == GEU
691           || code2 == ORDERED)
692         return 1;
693       break;
694
695     case UNLT:
696       if (code2 == UNLE || code2 == NE)
697         return 1;
698       break;
699
700     case LT:
701       if (code2 == LE || code2 == NE || code2 == ORDERED || code2 == LTGT)
702         return 1;
703       break;
704
705     case UNGT:
706       if (code2 == UNGE || code2 == NE)
707         return 1;
708       break;
709
710     case GT:
711       if (code2 == GE || code2 == NE || code2 == ORDERED || code2 == LTGT)
712         return 1;
713       break;
714
715     case GE:
716     case LE:
717       if (code2 == ORDERED)
718         return 1;
719       break;
720
721     case LTGT:
722       if (code2 == NE || code2 == ORDERED)
723         return 1;
724       break;
725
726     case LTU:
727       if (code2 == LEU || code2 == NE)
728         return 1;
729       break;
730
731     case GTU:
732       if (code2 == GEU || code2 == NE)
733         return 1;
734       break;
735
736     case UNORDERED:
737       if (code2 == NE || code2 == UNEQ || code2 == UNLE || code2 == UNLT
738           || code2 == UNGE || code2 == UNGT)
739         return 1;
740       break;
741
742     default:
743       break;
744     }
745
746   return 0;
747 }
748 \f
749 /* Return 1 if INSN is an unconditional jump and nothing else.  */
750
751 int
752 simplejump_p (rtx insn)
753 {
754   return (GET_CODE (insn) == JUMP_INSN
755           && GET_CODE (PATTERN (insn)) == SET
756           && GET_CODE (SET_DEST (PATTERN (insn))) == PC
757           && GET_CODE (SET_SRC (PATTERN (insn))) == LABEL_REF);
758 }
759
760 /* Return nonzero if INSN is a (possibly) conditional jump
761    and nothing more.
762
763    Use of this function is deprecated, since we need to support combined
764    branch and compare insns.  Use any_condjump_p instead whenever possible.  */
765
766 int
767 condjump_p (rtx insn)
768 {
769   rtx x = PATTERN (insn);
770
771   if (GET_CODE (x) != SET
772       || GET_CODE (SET_DEST (x)) != PC)
773     return 0;
774
775   x = SET_SRC (x);
776   if (GET_CODE (x) == LABEL_REF)
777     return 1;
778   else
779     return (GET_CODE (x) == IF_THEN_ELSE
780             && ((GET_CODE (XEXP (x, 2)) == PC
781                  && (GET_CODE (XEXP (x, 1)) == LABEL_REF
782                      || GET_CODE (XEXP (x, 1)) == RETURN))
783                 || (GET_CODE (XEXP (x, 1)) == PC
784                     && (GET_CODE (XEXP (x, 2)) == LABEL_REF
785                         || GET_CODE (XEXP (x, 2)) == RETURN))));
786
787   return 0;
788 }
789
790 /* Return nonzero if INSN is a (possibly) conditional jump inside a
791    PARALLEL.
792
793    Use this function is deprecated, since we need to support combined
794    branch and compare insns.  Use any_condjump_p instead whenever possible.  */
795
796 int
797 condjump_in_parallel_p (rtx insn)
798 {
799   rtx x = PATTERN (insn);
800
801   if (GET_CODE (x) != PARALLEL)
802     return 0;
803   else
804     x = XVECEXP (x, 0, 0);
805
806   if (GET_CODE (x) != SET)
807     return 0;
808   if (GET_CODE (SET_DEST (x)) != PC)
809     return 0;
810   if (GET_CODE (SET_SRC (x)) == LABEL_REF)
811     return 1;
812   if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
813     return 0;
814   if (XEXP (SET_SRC (x), 2) == pc_rtx
815       && (GET_CODE (XEXP (SET_SRC (x), 1)) == LABEL_REF
816           || GET_CODE (XEXP (SET_SRC (x), 1)) == RETURN))
817     return 1;
818   if (XEXP (SET_SRC (x), 1) == pc_rtx
819       && (GET_CODE (XEXP (SET_SRC (x), 2)) == LABEL_REF
820           || GET_CODE (XEXP (SET_SRC (x), 2)) == RETURN))
821     return 1;
822   return 0;
823 }
824
825 /* Return set of PC, otherwise NULL.  */
826
827 rtx
828 pc_set (rtx insn)
829 {
830   rtx pat;
831   if (GET_CODE (insn) != JUMP_INSN)
832     return NULL_RTX;
833   pat = PATTERN (insn);
834
835   /* The set is allowed to appear either as the insn pattern or
836      the first set in a PARALLEL.  */
837   if (GET_CODE (pat) == PARALLEL)
838     pat = XVECEXP (pat, 0, 0);
839   if (GET_CODE (pat) == SET && GET_CODE (SET_DEST (pat)) == PC)
840     return pat;
841
842   return NULL_RTX;
843 }
844
845 /* Return true when insn is an unconditional direct jump,
846    possibly bundled inside a PARALLEL.  */
847
848 int
849 any_uncondjump_p (rtx insn)
850 {
851   rtx x = pc_set (insn);
852   if (!x)
853     return 0;
854   if (GET_CODE (SET_SRC (x)) != LABEL_REF)
855     return 0;
856   if (find_reg_note (insn, REG_NON_LOCAL_GOTO, NULL_RTX))
857     return 0;
858   return 1;
859 }
860
861 /* Return true when insn is a conditional jump.  This function works for
862    instructions containing PC sets in PARALLELs.  The instruction may have
863    various other effects so before removing the jump you must verify
864    onlyjump_p.
865
866    Note that unlike condjump_p it returns false for unconditional jumps.  */
867
868 int
869 any_condjump_p (rtx insn)
870 {
871   rtx x = pc_set (insn);
872   enum rtx_code a, b;
873
874   if (!x)
875     return 0;
876   if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
877     return 0;
878
879   a = GET_CODE (XEXP (SET_SRC (x), 1));
880   b = GET_CODE (XEXP (SET_SRC (x), 2));
881
882   return ((b == PC && (a == LABEL_REF || a == RETURN))
883           || (a == PC && (b == LABEL_REF || b == RETURN)));
884 }
885
886 /* Return the label of a conditional jump.  */
887
888 rtx
889 condjump_label (rtx insn)
890 {
891   rtx x = pc_set (insn);
892
893   if (!x)
894     return NULL_RTX;
895   x = SET_SRC (x);
896   if (GET_CODE (x) == LABEL_REF)
897     return x;
898   if (GET_CODE (x) != IF_THEN_ELSE)
899     return NULL_RTX;
900   if (XEXP (x, 2) == pc_rtx && GET_CODE (XEXP (x, 1)) == LABEL_REF)
901     return XEXP (x, 1);
902   if (XEXP (x, 1) == pc_rtx && GET_CODE (XEXP (x, 2)) == LABEL_REF)
903     return XEXP (x, 2);
904   return NULL_RTX;
905 }
906
907 /* Return true if INSN is a (possibly conditional) return insn.  */
908
909 static int
910 returnjump_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
911 {
912   rtx x = *loc;
913
914   return x && (GET_CODE (x) == RETURN
915                || (GET_CODE (x) == SET && SET_IS_RETURN_P (x)));
916 }
917
918 int
919 returnjump_p (rtx insn)
920 {
921   if (GET_CODE (insn) != JUMP_INSN)
922     return 0;
923   return for_each_rtx (&PATTERN (insn), returnjump_p_1, NULL);
924 }
925
926 /* Return true if INSN is a jump that only transfers control and
927    nothing more.  */
928
929 int
930 onlyjump_p (rtx insn)
931 {
932   rtx set;
933
934   if (GET_CODE (insn) != JUMP_INSN)
935     return 0;
936
937   set = single_set (insn);
938   if (set == NULL)
939     return 0;
940   if (GET_CODE (SET_DEST (set)) != PC)
941     return 0;
942   if (side_effects_p (SET_SRC (set)))
943     return 0;
944
945   return 1;
946 }
947
948 #ifdef HAVE_cc0
949
950 /* Return nonzero if X is an RTX that only sets the condition codes
951    and has no side effects.  */
952
953 int
954 only_sets_cc0_p (rtx x)
955 {
956   if (! x)
957     return 0;
958
959   if (INSN_P (x))
960     x = PATTERN (x);
961
962   return sets_cc0_p (x) == 1 && ! side_effects_p (x);
963 }
964
965 /* Return 1 if X is an RTX that does nothing but set the condition codes
966    and CLOBBER or USE registers.
967    Return -1 if X does explicitly set the condition codes,
968    but also does other things.  */
969
970 int
971 sets_cc0_p (rtx x)
972 {
973   if (! x)
974     return 0;
975
976   if (INSN_P (x))
977     x = PATTERN (x);
978
979   if (GET_CODE (x) == SET && SET_DEST (x) == cc0_rtx)
980     return 1;
981   if (GET_CODE (x) == PARALLEL)
982     {
983       int i;
984       int sets_cc0 = 0;
985       int other_things = 0;
986       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
987         {
988           if (GET_CODE (XVECEXP (x, 0, i)) == SET
989               && SET_DEST (XVECEXP (x, 0, i)) == cc0_rtx)
990             sets_cc0 = 1;
991           else if (GET_CODE (XVECEXP (x, 0, i)) == SET)
992             other_things = 1;
993         }
994       return ! sets_cc0 ? 0 : other_things ? -1 : 1;
995     }
996   return 0;
997 }
998 #endif
999 \f
1000 /* Follow any unconditional jump at LABEL;
1001    return the ultimate label reached by any such chain of jumps.
1002    If LABEL is not followed by a jump, return LABEL.
1003    If the chain loops or we can't find end, return LABEL,
1004    since that tells caller to avoid changing the insn.
1005
1006    If RELOAD_COMPLETED is 0, we do not chain across a NOTE_INSN_LOOP_BEG or
1007    a USE or CLOBBER.  */
1008
1009 rtx
1010 follow_jumps (rtx label)
1011 {
1012   rtx insn;
1013   rtx next;
1014   rtx value = label;
1015   int depth;
1016
1017   for (depth = 0;
1018        (depth < 10
1019         && (insn = next_active_insn (value)) != 0
1020         && GET_CODE (insn) == JUMP_INSN
1021         && ((JUMP_LABEL (insn) != 0 && any_uncondjump_p (insn)
1022              && onlyjump_p (insn))
1023             || GET_CODE (PATTERN (insn)) == RETURN)
1024         && (next = NEXT_INSN (insn))
1025         && GET_CODE (next) == BARRIER);
1026        depth++)
1027     {
1028       /* Don't chain through the insn that jumps into a loop
1029          from outside the loop,
1030          since that would create multiple loop entry jumps
1031          and prevent loop optimization.  */
1032       rtx tem;
1033       if (!reload_completed)
1034         for (tem = value; tem != insn; tem = NEXT_INSN (tem))
1035           if (GET_CODE (tem) == NOTE
1036               && (NOTE_LINE_NUMBER (tem) == NOTE_INSN_LOOP_BEG
1037                   /* ??? Optional.  Disables some optimizations, but makes
1038                      gcov output more accurate with -O.  */
1039                   || (flag_test_coverage && NOTE_LINE_NUMBER (tem) > 0)))
1040             return value;
1041
1042       /* If we have found a cycle, make the insn jump to itself.  */
1043       if (JUMP_LABEL (insn) == label)
1044         return label;
1045
1046       tem = next_active_insn (JUMP_LABEL (insn));
1047       if (tem && (GET_CODE (PATTERN (tem)) == ADDR_VEC
1048                   || GET_CODE (PATTERN (tem)) == ADDR_DIFF_VEC))
1049         break;
1050
1051       value = JUMP_LABEL (insn);
1052     }
1053   if (depth == 10)
1054     return label;
1055   return value;
1056 }
1057
1058 \f
1059 /* Find all CODE_LABELs referred to in X, and increment their use counts.
1060    If INSN is a JUMP_INSN and there is at least one CODE_LABEL referenced
1061    in INSN, then store one of them in JUMP_LABEL (INSN).
1062    If INSN is an INSN or a CALL_INSN and there is at least one CODE_LABEL
1063    referenced in INSN, add a REG_LABEL note containing that label to INSN.
1064    Also, when there are consecutive labels, canonicalize on the last of them.
1065
1066    Note that two labels separated by a loop-beginning note
1067    must be kept distinct if we have not yet done loop-optimization,
1068    because the gap between them is where loop-optimize
1069    will want to move invariant code to.  CROSS_JUMP tells us
1070    that loop-optimization is done with.  */
1071
1072 void
1073 mark_jump_label (rtx x, rtx insn, int in_mem)
1074 {
1075   RTX_CODE code = GET_CODE (x);
1076   int i;
1077   const char *fmt;
1078
1079   switch (code)
1080     {
1081     case PC:
1082     case CC0:
1083     case REG:
1084     case CONST_INT:
1085     case CONST_DOUBLE:
1086     case CLOBBER:
1087     case CALL:
1088       return;
1089
1090     case MEM:
1091       in_mem = 1;
1092       break;
1093
1094     case SYMBOL_REF:
1095       if (!in_mem)
1096         return;
1097
1098       /* If this is a constant-pool reference, see if it is a label.  */
1099       if (CONSTANT_POOL_ADDRESS_P (x))
1100         mark_jump_label (get_pool_constant (x), insn, in_mem);
1101       break;
1102
1103     case LABEL_REF:
1104       {
1105         rtx label = XEXP (x, 0);
1106
1107         /* Ignore remaining references to unreachable labels that
1108            have been deleted.  */
1109         if (GET_CODE (label) == NOTE
1110             && NOTE_LINE_NUMBER (label) == NOTE_INSN_DELETED_LABEL)
1111           break;
1112
1113         if (GET_CODE (label) != CODE_LABEL)
1114           abort ();
1115
1116         /* Ignore references to labels of containing functions.  */
1117         if (LABEL_REF_NONLOCAL_P (x))
1118           break;
1119
1120         XEXP (x, 0) = label;
1121         if (! insn || ! INSN_DELETED_P (insn))
1122           ++LABEL_NUSES (label);
1123
1124         if (insn)
1125           {
1126             if (GET_CODE (insn) == JUMP_INSN)
1127               JUMP_LABEL (insn) = label;
1128             else
1129               {
1130                 /* Add a REG_LABEL note for LABEL unless there already
1131                    is one.  All uses of a label, except for labels
1132                    that are the targets of jumps, must have a
1133                    REG_LABEL note.  */
1134                 if (! find_reg_note (insn, REG_LABEL, label))
1135                   REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_LABEL, label,
1136                                                         REG_NOTES (insn));
1137               }
1138           }
1139         return;
1140       }
1141
1142   /* Do walk the labels in a vector, but not the first operand of an
1143      ADDR_DIFF_VEC.  Don't set the JUMP_LABEL of a vector.  */
1144     case ADDR_VEC:
1145     case ADDR_DIFF_VEC:
1146       if (! INSN_DELETED_P (insn))
1147         {
1148           int eltnum = code == ADDR_DIFF_VEC ? 1 : 0;
1149
1150           for (i = 0; i < XVECLEN (x, eltnum); i++)
1151             mark_jump_label (XVECEXP (x, eltnum, i), NULL_RTX, in_mem);
1152         }
1153       return;
1154
1155     default:
1156       break;
1157     }
1158
1159   fmt = GET_RTX_FORMAT (code);
1160   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1161     {
1162       if (fmt[i] == 'e')
1163         mark_jump_label (XEXP (x, i), insn, in_mem);
1164       else if (fmt[i] == 'E')
1165         {
1166           int j;
1167           for (j = 0; j < XVECLEN (x, i); j++)
1168             mark_jump_label (XVECEXP (x, i, j), insn, in_mem);
1169         }
1170     }
1171 }
1172
1173 /* If all INSN does is set the pc, delete it,
1174    and delete the insn that set the condition codes for it
1175    if that's what the previous thing was.  */
1176
1177 void
1178 delete_jump (rtx insn)
1179 {
1180   rtx set = single_set (insn);
1181
1182   if (set && GET_CODE (SET_DEST (set)) == PC)
1183     delete_computation (insn);
1184 }
1185
1186 /* Verify INSN is a BARRIER and delete it.  */
1187
1188 void
1189 delete_barrier (rtx insn)
1190 {
1191   if (GET_CODE (insn) != BARRIER)
1192     abort ();
1193
1194   delete_insn (insn);
1195 }
1196
1197 /* Recursively delete prior insns that compute the value (used only by INSN
1198    which the caller is deleting) stored in the register mentioned by NOTE
1199    which is a REG_DEAD note associated with INSN.  */
1200
1201 static void
1202 delete_prior_computation (rtx note, rtx insn)
1203 {
1204   rtx our_prev;
1205   rtx reg = XEXP (note, 0);
1206
1207   for (our_prev = prev_nonnote_insn (insn);
1208        our_prev && (GET_CODE (our_prev) == INSN
1209                     || GET_CODE (our_prev) == CALL_INSN);
1210        our_prev = prev_nonnote_insn (our_prev))
1211     {
1212       rtx pat = PATTERN (our_prev);
1213
1214       /* If we reach a CALL which is not calling a const function
1215          or the callee pops the arguments, then give up.  */
1216       if (GET_CODE (our_prev) == CALL_INSN
1217           && (! CONST_OR_PURE_CALL_P (our_prev)
1218               || GET_CODE (pat) != SET || GET_CODE (SET_SRC (pat)) != CALL))
1219         break;
1220
1221       /* If we reach a SEQUENCE, it is too complex to try to
1222          do anything with it, so give up.  We can be run during
1223          and after reorg, so SEQUENCE rtl can legitimately show
1224          up here.  */
1225       if (GET_CODE (pat) == SEQUENCE)
1226         break;
1227
1228       if (GET_CODE (pat) == USE
1229           && GET_CODE (XEXP (pat, 0)) == INSN)
1230         /* reorg creates USEs that look like this.  We leave them
1231            alone because reorg needs them for its own purposes.  */
1232         break;
1233
1234       if (reg_set_p (reg, pat))
1235         {
1236           if (side_effects_p (pat) && GET_CODE (our_prev) != CALL_INSN)
1237             break;
1238
1239           if (GET_CODE (pat) == PARALLEL)
1240             {
1241               /* If we find a SET of something else, we can't
1242                  delete the insn.  */
1243
1244               int i;
1245
1246               for (i = 0; i < XVECLEN (pat, 0); i++)
1247                 {
1248                   rtx part = XVECEXP (pat, 0, i);
1249
1250                   if (GET_CODE (part) == SET
1251                       && SET_DEST (part) != reg)
1252                     break;
1253                 }
1254
1255               if (i == XVECLEN (pat, 0))
1256                 delete_computation (our_prev);
1257             }
1258           else if (GET_CODE (pat) == SET
1259                    && GET_CODE (SET_DEST (pat)) == REG)
1260             {
1261               int dest_regno = REGNO (SET_DEST (pat));
1262               int dest_endregno
1263                 = (dest_regno
1264                    + (dest_regno < FIRST_PSEUDO_REGISTER
1265                       ? hard_regno_nregs[dest_regno]
1266                                         [GET_MODE (SET_DEST (pat))] : 1));
1267               int regno = REGNO (reg);
1268               int endregno
1269                 = (regno
1270                    + (regno < FIRST_PSEUDO_REGISTER
1271                       ? hard_regno_nregs[regno][GET_MODE (reg)] : 1));
1272
1273               if (dest_regno >= regno
1274                   && dest_endregno <= endregno)
1275                 delete_computation (our_prev);
1276
1277               /* We may have a multi-word hard register and some, but not
1278                  all, of the words of the register are needed in subsequent
1279                  insns.  Write REG_UNUSED notes for those parts that were not
1280                  needed.  */
1281               else if (dest_regno <= regno
1282                        && dest_endregno >= endregno)
1283                 {
1284                   int i;
1285
1286                   REG_NOTES (our_prev)
1287                     = gen_rtx_EXPR_LIST (REG_UNUSED, reg,
1288                                          REG_NOTES (our_prev));
1289
1290                   for (i = dest_regno; i < dest_endregno; i++)
1291                     if (! find_regno_note (our_prev, REG_UNUSED, i))
1292                       break;
1293
1294                   if (i == dest_endregno)
1295                     delete_computation (our_prev);
1296                 }
1297             }
1298
1299           break;
1300         }
1301
1302       /* If PAT references the register that dies here, it is an
1303          additional use.  Hence any prior SET isn't dead.  However, this
1304          insn becomes the new place for the REG_DEAD note.  */
1305       if (reg_overlap_mentioned_p (reg, pat))
1306         {
1307           XEXP (note, 1) = REG_NOTES (our_prev);
1308           REG_NOTES (our_prev) = note;
1309           break;
1310         }
1311     }
1312 }
1313
1314 /* Delete INSN and recursively delete insns that compute values used only
1315    by INSN.  This uses the REG_DEAD notes computed during flow analysis.
1316    If we are running before flow.c, we need do nothing since flow.c will
1317    delete dead code.  We also can't know if the registers being used are
1318    dead or not at this point.
1319
1320    Otherwise, look at all our REG_DEAD notes.  If a previous insn does
1321    nothing other than set a register that dies in this insn, we can delete
1322    that insn as well.
1323
1324    On machines with CC0, if CC0 is used in this insn, we may be able to
1325    delete the insn that set it.  */
1326
1327 static void
1328 delete_computation (rtx insn)
1329 {
1330   rtx note, next;
1331
1332 #ifdef HAVE_cc0
1333   if (reg_referenced_p (cc0_rtx, PATTERN (insn)))
1334     {
1335       rtx prev = prev_nonnote_insn (insn);
1336       /* We assume that at this stage
1337          CC's are always set explicitly
1338          and always immediately before the jump that
1339          will use them.  So if the previous insn
1340          exists to set the CC's, delete it
1341          (unless it performs auto-increments, etc.).  */
1342       if (prev && GET_CODE (prev) == INSN
1343           && sets_cc0_p (PATTERN (prev)))
1344         {
1345           if (sets_cc0_p (PATTERN (prev)) > 0
1346               && ! side_effects_p (PATTERN (prev)))
1347             delete_computation (prev);
1348           else
1349             /* Otherwise, show that cc0 won't be used.  */
1350             REG_NOTES (prev) = gen_rtx_EXPR_LIST (REG_UNUSED,
1351                                                   cc0_rtx, REG_NOTES (prev));
1352         }
1353     }
1354 #endif
1355
1356   for (note = REG_NOTES (insn); note; note = next)
1357     {
1358       next = XEXP (note, 1);
1359
1360       if (REG_NOTE_KIND (note) != REG_DEAD
1361           /* Verify that the REG_NOTE is legitimate.  */
1362           || GET_CODE (XEXP (note, 0)) != REG)
1363         continue;
1364
1365       delete_prior_computation (note, insn);
1366     }
1367
1368   delete_related_insns (insn);
1369 }
1370 \f
1371 /* Delete insn INSN from the chain of insns and update label ref counts
1372    and delete insns now unreachable.
1373
1374    Returns the first insn after INSN that was not deleted.
1375
1376    Usage of this instruction is deprecated.  Use delete_insn instead and
1377    subsequent cfg_cleanup pass to delete unreachable code if needed.  */
1378
1379 rtx
1380 delete_related_insns (rtx insn)
1381 {
1382   int was_code_label = (GET_CODE (insn) == CODE_LABEL);
1383   rtx note;
1384   rtx next = NEXT_INSN (insn), prev = PREV_INSN (insn);
1385
1386   while (next && INSN_DELETED_P (next))
1387     next = NEXT_INSN (next);
1388
1389   /* This insn is already deleted => return first following nondeleted.  */
1390   if (INSN_DELETED_P (insn))
1391     return next;
1392
1393   delete_insn (insn);
1394
1395   /* If instruction is followed by a barrier,
1396      delete the barrier too.  */
1397
1398   if (next != 0 && GET_CODE (next) == BARRIER)
1399     delete_insn (next);
1400
1401   /* If deleting a jump, decrement the count of the label,
1402      and delete the label if it is now unused.  */
1403
1404   if (GET_CODE (insn) == JUMP_INSN && JUMP_LABEL (insn))
1405     {
1406       rtx lab = JUMP_LABEL (insn), lab_next;
1407
1408       if (LABEL_NUSES (lab) == 0)
1409         {
1410           /* This can delete NEXT or PREV,
1411              either directly if NEXT is JUMP_LABEL (INSN),
1412              or indirectly through more levels of jumps.  */
1413           delete_related_insns (lab);
1414
1415           /* I feel a little doubtful about this loop,
1416              but I see no clean and sure alternative way
1417              to find the first insn after INSN that is not now deleted.
1418              I hope this works.  */
1419           while (next && INSN_DELETED_P (next))
1420             next = NEXT_INSN (next);
1421           return next;
1422         }
1423       else if (tablejump_p (insn, NULL, &lab_next))
1424         {
1425           /* If we're deleting the tablejump, delete the dispatch table.
1426              We may not be able to kill the label immediately preceding
1427              just yet, as it might be referenced in code leading up to
1428              the tablejump.  */
1429           delete_related_insns (lab_next);
1430         }
1431     }
1432
1433   /* Likewise if we're deleting a dispatch table.  */
1434
1435   if (GET_CODE (insn) == JUMP_INSN
1436       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
1437           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
1438     {
1439       rtx pat = PATTERN (insn);
1440       int i, diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
1441       int len = XVECLEN (pat, diff_vec_p);
1442
1443       for (i = 0; i < len; i++)
1444         if (LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0)) == 0)
1445           delete_related_insns (XEXP (XVECEXP (pat, diff_vec_p, i), 0));
1446       while (next && INSN_DELETED_P (next))
1447         next = NEXT_INSN (next);
1448       return next;
1449     }
1450
1451   /* Likewise for an ordinary INSN / CALL_INSN with a REG_LABEL note.  */
1452   if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
1453     for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1454       if (REG_NOTE_KIND (note) == REG_LABEL
1455           /* This could also be a NOTE_INSN_DELETED_LABEL note.  */
1456           && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
1457         if (LABEL_NUSES (XEXP (note, 0)) == 0)
1458           delete_related_insns (XEXP (note, 0));
1459
1460   while (prev && (INSN_DELETED_P (prev) || GET_CODE (prev) == NOTE))
1461     prev = PREV_INSN (prev);
1462
1463   /* If INSN was a label and a dispatch table follows it,
1464      delete the dispatch table.  The tablejump must have gone already.
1465      It isn't useful to fall through into a table.  */
1466
1467   if (was_code_label
1468       && NEXT_INSN (insn) != 0
1469       && GET_CODE (NEXT_INSN (insn)) == JUMP_INSN
1470       && (GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_VEC
1471           || GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_DIFF_VEC))
1472     next = delete_related_insns (NEXT_INSN (insn));
1473
1474   /* If INSN was a label, delete insns following it if now unreachable.  */
1475
1476   if (was_code_label && prev && GET_CODE (prev) == BARRIER)
1477     {
1478       enum rtx_code code;
1479       while (next)
1480         {
1481           code = GET_CODE (next);
1482           if (code == NOTE
1483               && NOTE_LINE_NUMBER (next) != NOTE_INSN_FUNCTION_END)
1484             next = NEXT_INSN (next);
1485           /* Keep going past other deleted labels to delete what follows.  */
1486           else if (code == CODE_LABEL && INSN_DELETED_P (next))
1487             next = NEXT_INSN (next);
1488           else if (code == BARRIER || INSN_P (next))
1489             /* Note: if this deletes a jump, it can cause more
1490                deletion of unreachable code, after a different label.
1491                As long as the value from this recursive call is correct,
1492                this invocation functions correctly.  */
1493             next = delete_related_insns (next);
1494           else
1495             break;
1496         }
1497     }
1498
1499   return next;
1500 }
1501 \f
1502 /* Delete a range of insns from FROM to TO, inclusive.
1503    This is for the sake of peephole optimization, so assume
1504    that whatever these insns do will still be done by a new
1505    peephole insn that will replace them.  */
1506
1507 void
1508 delete_for_peephole (rtx from, rtx to)
1509 {
1510   rtx insn = from;
1511
1512   while (1)
1513     {
1514       rtx next = NEXT_INSN (insn);
1515       rtx prev = PREV_INSN (insn);
1516
1517       if (GET_CODE (insn) != NOTE)
1518         {
1519           INSN_DELETED_P (insn) = 1;
1520
1521           /* Patch this insn out of the chain.  */
1522           /* We don't do this all at once, because we
1523              must preserve all NOTEs.  */
1524           if (prev)
1525             NEXT_INSN (prev) = next;
1526
1527           if (next)
1528             PREV_INSN (next) = prev;
1529         }
1530
1531       if (insn == to)
1532         break;
1533       insn = next;
1534     }
1535
1536   /* Note that if TO is an unconditional jump
1537      we *do not* delete the BARRIER that follows,
1538      since the peephole that replaces this sequence
1539      is also an unconditional jump in that case.  */
1540 }
1541 \f
1542 /* Throughout LOC, redirect OLABEL to NLABEL.  Treat null OLABEL or
1543    NLABEL as a return.  Accrue modifications into the change group.  */
1544
1545 static void
1546 redirect_exp_1 (rtx *loc, rtx olabel, rtx nlabel, rtx insn)
1547 {
1548   rtx x = *loc;
1549   RTX_CODE code = GET_CODE (x);
1550   int i;
1551   const char *fmt;
1552
1553   if (code == LABEL_REF)
1554     {
1555       if (XEXP (x, 0) == olabel)
1556         {
1557           rtx n;
1558           if (nlabel)
1559             n = gen_rtx_LABEL_REF (VOIDmode, nlabel);
1560           else
1561             n = gen_rtx_RETURN (VOIDmode);
1562
1563           validate_change (insn, loc, n, 1);
1564           return;
1565         }
1566     }
1567   else if (code == RETURN && olabel == 0)
1568     {
1569       x = gen_rtx_LABEL_REF (VOIDmode, nlabel);
1570       if (loc == &PATTERN (insn))
1571         x = gen_rtx_SET (VOIDmode, pc_rtx, x);
1572       validate_change (insn, loc, x, 1);
1573       return;
1574     }
1575
1576   if (code == SET && nlabel == 0 && SET_DEST (x) == pc_rtx
1577       && GET_CODE (SET_SRC (x)) == LABEL_REF
1578       && XEXP (SET_SRC (x), 0) == olabel)
1579     {
1580       validate_change (insn, loc, gen_rtx_RETURN (VOIDmode), 1);
1581       return;
1582     }
1583
1584   fmt = GET_RTX_FORMAT (code);
1585   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1586     {
1587       if (fmt[i] == 'e')
1588         redirect_exp_1 (&XEXP (x, i), olabel, nlabel, insn);
1589       else if (fmt[i] == 'E')
1590         {
1591           int j;
1592           for (j = 0; j < XVECLEN (x, i); j++)
1593             redirect_exp_1 (&XVECEXP (x, i, j), olabel, nlabel, insn);
1594         }
1595     }
1596 }
1597
1598 /* Similar, but apply the change group and report success or failure.  */
1599
1600 static int
1601 redirect_exp (rtx olabel, rtx nlabel, rtx insn)
1602 {
1603   rtx *loc;
1604
1605   if (GET_CODE (PATTERN (insn)) == PARALLEL)
1606     loc = &XVECEXP (PATTERN (insn), 0, 0);
1607   else
1608     loc = &PATTERN (insn);
1609
1610   redirect_exp_1 (loc, olabel, nlabel, insn);
1611   if (num_validated_changes () == 0)
1612     return 0;
1613
1614   return apply_change_group ();
1615 }
1616
1617 /* Make JUMP go to NLABEL instead of where it jumps now.  Accrue
1618    the modifications into the change group.  Return false if we did
1619    not see how to do that.  */
1620
1621 int
1622 redirect_jump_1 (rtx jump, rtx nlabel)
1623 {
1624   int ochanges = num_validated_changes ();
1625   rtx *loc;
1626
1627   if (GET_CODE (PATTERN (jump)) == PARALLEL)
1628     loc = &XVECEXP (PATTERN (jump), 0, 0);
1629   else
1630     loc = &PATTERN (jump);
1631
1632   redirect_exp_1 (loc, JUMP_LABEL (jump), nlabel, jump);
1633   return num_validated_changes () > ochanges;
1634 }
1635
1636 /* Make JUMP go to NLABEL instead of where it jumps now.  If the old
1637    jump target label is unused as a result, it and the code following
1638    it may be deleted.
1639
1640    If NLABEL is zero, we are to turn the jump into a (possibly conditional)
1641    RETURN insn.
1642
1643    The return value will be 1 if the change was made, 0 if it wasn't
1644    (this can only occur for NLABEL == 0).  */
1645
1646 int
1647 redirect_jump (rtx jump, rtx nlabel, int delete_unused)
1648 {
1649   rtx olabel = JUMP_LABEL (jump);
1650   rtx note;
1651
1652   if (nlabel == olabel)
1653     return 1;
1654
1655   if (! redirect_exp (olabel, nlabel, jump))
1656     return 0;
1657
1658   JUMP_LABEL (jump) = nlabel;
1659   if (nlabel)
1660     ++LABEL_NUSES (nlabel);
1661
1662   /* Update labels in any REG_EQUAL note.  */
1663   if ((note = find_reg_note (jump, REG_EQUAL, NULL_RTX)) != NULL_RTX)
1664     {
1665       if (nlabel && olabel)
1666         {
1667           rtx dest = XEXP (note, 0);
1668
1669           if (GET_CODE (dest) == IF_THEN_ELSE)
1670             {
1671               if (GET_CODE (XEXP (dest, 1)) == LABEL_REF
1672                   && XEXP (XEXP (dest, 1), 0) == olabel)
1673                 XEXP (XEXP (dest, 1), 0) = nlabel;
1674               if (GET_CODE (XEXP (dest, 2)) == LABEL_REF
1675                   && XEXP (XEXP (dest, 2), 0) == olabel)
1676                 XEXP (XEXP (dest, 2), 0) = nlabel;
1677             }
1678           else
1679             remove_note (jump, note);
1680         }
1681       else
1682         remove_note (jump, note);
1683     }
1684
1685   /* If we're eliding the jump over exception cleanups at the end of a
1686      function, move the function end note so that -Wreturn-type works.  */
1687   if (olabel && nlabel
1688       && NEXT_INSN (olabel)
1689       && GET_CODE (NEXT_INSN (olabel)) == NOTE
1690       && NOTE_LINE_NUMBER (NEXT_INSN (olabel)) == NOTE_INSN_FUNCTION_END)
1691     emit_note_after (NOTE_INSN_FUNCTION_END, nlabel);
1692
1693   if (olabel && --LABEL_NUSES (olabel) == 0 && delete_unused
1694       /* Undefined labels will remain outside the insn stream.  */
1695       && INSN_UID (olabel))
1696     delete_related_insns (olabel);
1697
1698   return 1;
1699 }
1700
1701 /* Invert the jump condition of rtx X contained in jump insn, INSN.
1702    Accrue the modifications into the change group.  */
1703
1704 static void
1705 invert_exp_1 (rtx insn)
1706 {
1707   RTX_CODE code;
1708   rtx x = pc_set (insn);
1709
1710   if (!x)
1711     abort ();
1712   x = SET_SRC (x);
1713
1714   code = GET_CODE (x);
1715
1716   if (code == IF_THEN_ELSE)
1717     {
1718       rtx comp = XEXP (x, 0);
1719       rtx tem;
1720       enum rtx_code reversed_code;
1721
1722       /* We can do this in two ways:  The preferable way, which can only
1723          be done if this is not an integer comparison, is to reverse
1724          the comparison code.  Otherwise, swap the THEN-part and ELSE-part
1725          of the IF_THEN_ELSE.  If we can't do either, fail.  */
1726
1727       reversed_code = reversed_comparison_code (comp, insn);
1728
1729       if (reversed_code != UNKNOWN)
1730         {
1731           validate_change (insn, &XEXP (x, 0),
1732                            gen_rtx_fmt_ee (reversed_code,
1733                                            GET_MODE (comp), XEXP (comp, 0),
1734                                            XEXP (comp, 1)),
1735                            1);
1736           return;
1737         }
1738
1739       tem = XEXP (x, 1);
1740       validate_change (insn, &XEXP (x, 1), XEXP (x, 2), 1);
1741       validate_change (insn, &XEXP (x, 2), tem, 1);
1742     }
1743   else
1744     abort ();
1745 }
1746
1747 /* Invert the jump condition of conditional jump insn, INSN.
1748
1749    Return 1 if we can do so, 0 if we cannot find a way to do so that
1750    matches a pattern.  */
1751
1752 static int
1753 invert_exp (rtx insn)
1754 {
1755   invert_exp_1 (insn);
1756   if (num_validated_changes () == 0)
1757     return 0;
1758
1759   return apply_change_group ();
1760 }
1761
1762 /* Invert the condition of the jump JUMP, and make it jump to label
1763    NLABEL instead of where it jumps now.  Accrue changes into the
1764    change group.  Return false if we didn't see how to perform the
1765    inversion and redirection.  */
1766
1767 int
1768 invert_jump_1 (rtx jump, rtx nlabel)
1769 {
1770   int ochanges;
1771
1772   ochanges = num_validated_changes ();
1773   invert_exp_1 (jump);
1774   if (num_validated_changes () == ochanges)
1775     return 0;
1776
1777   return redirect_jump_1 (jump, nlabel);
1778 }
1779
1780 /* Invert the condition of the jump JUMP, and make it jump to label
1781    NLABEL instead of where it jumps now.  Return true if successful.  */
1782
1783 int
1784 invert_jump (rtx jump, rtx nlabel, int delete_unused)
1785 {
1786   /* We have to either invert the condition and change the label or
1787      do neither.  Either operation could fail.  We first try to invert
1788      the jump. If that succeeds, we try changing the label.  If that fails,
1789      we invert the jump back to what it was.  */
1790
1791   if (! invert_exp (jump))
1792     return 0;
1793
1794   if (redirect_jump (jump, nlabel, delete_unused))
1795     {
1796       /* Remove REG_EQUAL note if we have one.  */
1797       rtx note = find_reg_note (jump, REG_EQUAL, NULL_RTX);
1798       if (note)
1799         remove_note (jump, note);
1800
1801       invert_br_probabilities (jump);
1802
1803       return 1;
1804     }
1805
1806   if (! invert_exp (jump))
1807     /* This should just be putting it back the way it was.  */
1808     abort ();
1809
1810   return 0;
1811 }
1812
1813 \f
1814 /* Like rtx_equal_p except that it considers two REGs as equal
1815    if they renumber to the same value and considers two commutative
1816    operations to be the same if the order of the operands has been
1817    reversed.
1818
1819    ??? Addition is not commutative on the PA due to the weird implicit
1820    space register selection rules for memory addresses.  Therefore, we
1821    don't consider a + b == b + a.
1822
1823    We could/should make this test a little tighter.  Possibly only
1824    disabling it on the PA via some backend macro or only disabling this
1825    case when the PLUS is inside a MEM.  */
1826
1827 int
1828 rtx_renumbered_equal_p (rtx x, rtx y)
1829 {
1830   int i;
1831   enum rtx_code code = GET_CODE (x);
1832   const char *fmt;
1833
1834   if (x == y)
1835     return 1;
1836
1837   if ((code == REG || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG))
1838       && (GET_CODE (y) == REG || (GET_CODE (y) == SUBREG
1839                                   && GET_CODE (SUBREG_REG (y)) == REG)))
1840     {
1841       int reg_x = -1, reg_y = -1;
1842       int byte_x = 0, byte_y = 0;
1843
1844       if (GET_MODE (x) != GET_MODE (y))
1845         return 0;
1846
1847       /* If we haven't done any renumbering, don't
1848          make any assumptions.  */
1849       if (reg_renumber == 0)
1850         return rtx_equal_p (x, y);
1851
1852       if (code == SUBREG)
1853         {
1854           reg_x = REGNO (SUBREG_REG (x));
1855           byte_x = SUBREG_BYTE (x);
1856
1857           if (reg_renumber[reg_x] >= 0)
1858             {
1859               reg_x = subreg_regno_offset (reg_renumber[reg_x],
1860                                            GET_MODE (SUBREG_REG (x)),
1861                                            byte_x,
1862                                            GET_MODE (x));
1863               byte_x = 0;
1864             }
1865         }
1866       else
1867         {
1868           reg_x = REGNO (x);
1869           if (reg_renumber[reg_x] >= 0)
1870             reg_x = reg_renumber[reg_x];
1871         }
1872
1873       if (GET_CODE (y) == SUBREG)
1874         {
1875           reg_y = REGNO (SUBREG_REG (y));
1876           byte_y = SUBREG_BYTE (y);
1877
1878           if (reg_renumber[reg_y] >= 0)
1879             {
1880               reg_y = subreg_regno_offset (reg_renumber[reg_y],
1881                                            GET_MODE (SUBREG_REG (y)),
1882                                            byte_y,
1883                                            GET_MODE (y));
1884               byte_y = 0;
1885             }
1886         }
1887       else
1888         {
1889           reg_y = REGNO (y);
1890           if (reg_renumber[reg_y] >= 0)
1891             reg_y = reg_renumber[reg_y];
1892         }
1893
1894       return reg_x >= 0 && reg_x == reg_y && byte_x == byte_y;
1895     }
1896
1897   /* Now we have disposed of all the cases
1898      in which different rtx codes can match.  */
1899   if (code != GET_CODE (y))
1900     return 0;
1901
1902   switch (code)
1903     {
1904     case PC:
1905     case CC0:
1906     case ADDR_VEC:
1907     case ADDR_DIFF_VEC:
1908     case CONST_INT:
1909       return 0;
1910
1911     case LABEL_REF:
1912       /* We can't assume nonlocal labels have their following insns yet.  */
1913       if (LABEL_REF_NONLOCAL_P (x) || LABEL_REF_NONLOCAL_P (y))
1914         return XEXP (x, 0) == XEXP (y, 0);
1915
1916       /* Two label-refs are equivalent if they point at labels
1917          in the same position in the instruction stream.  */
1918       return (next_real_insn (XEXP (x, 0))
1919               == next_real_insn (XEXP (y, 0)));
1920
1921     case SYMBOL_REF:
1922       return XSTR (x, 0) == XSTR (y, 0);
1923
1924     case CODE_LABEL:
1925       /* If we didn't match EQ equality above, they aren't the same.  */
1926       return 0;
1927
1928     default:
1929       break;
1930     }
1931
1932   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.  */
1933
1934   if (GET_MODE (x) != GET_MODE (y))
1935     return 0;
1936
1937   /* For commutative operations, the RTX match if the operand match in any
1938      order.  Also handle the simple binary and unary cases without a loop.
1939
1940      ??? Don't consider PLUS a commutative operator; see comments above.  */
1941   if (COMMUTATIVE_P (x) && code != PLUS)
1942     return ((rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
1943              && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)))
1944             || (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 1))
1945                 && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 0))));
1946   else if (NON_COMMUTATIVE_P (x))
1947     return (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
1948             && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)));
1949   else if (UNARY_P (x))
1950     return rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0));
1951
1952   /* Compare the elements.  If any pair of corresponding elements
1953      fail to match, return 0 for the whole things.  */
1954
1955   fmt = GET_RTX_FORMAT (code);
1956   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1957     {
1958       int j;
1959       switch (fmt[i])
1960         {
1961         case 'w':
1962           if (XWINT (x, i) != XWINT (y, i))
1963             return 0;
1964           break;
1965
1966         case 'i':
1967           if (XINT (x, i) != XINT (y, i))
1968             return 0;
1969           break;
1970
1971         case 't':
1972           if (XTREE (x, i) != XTREE (y, i))
1973             return 0;
1974           break;
1975
1976         case 's':
1977           if (strcmp (XSTR (x, i), XSTR (y, i)))
1978             return 0;
1979           break;
1980
1981         case 'e':
1982           if (! rtx_renumbered_equal_p (XEXP (x, i), XEXP (y, i)))
1983             return 0;
1984           break;
1985
1986         case 'u':
1987           if (XEXP (x, i) != XEXP (y, i))
1988             return 0;
1989           /* Fall through.  */
1990         case '0':
1991           break;
1992
1993         case 'E':
1994           if (XVECLEN (x, i) != XVECLEN (y, i))
1995             return 0;
1996           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1997             if (!rtx_renumbered_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)))
1998               return 0;
1999           break;
2000
2001         default:
2002           abort ();
2003         }
2004     }
2005   return 1;
2006 }
2007 \f
2008 /* If X is a hard register or equivalent to one or a subregister of one,
2009    return the hard register number.  If X is a pseudo register that was not
2010    assigned a hard register, return the pseudo register number.  Otherwise,
2011    return -1.  Any rtx is valid for X.  */
2012
2013 int
2014 true_regnum (rtx x)
2015 {
2016   if (GET_CODE (x) == REG)
2017     {
2018       if (REGNO (x) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO (x)] >= 0)
2019         return reg_renumber[REGNO (x)];
2020       return REGNO (x);
2021     }
2022   if (GET_CODE (x) == SUBREG)
2023     {
2024       int base = true_regnum (SUBREG_REG (x));
2025       if (base >= 0 && base < FIRST_PSEUDO_REGISTER)
2026         return base + subreg_regno_offset (REGNO (SUBREG_REG (x)),
2027                                            GET_MODE (SUBREG_REG (x)),
2028                                            SUBREG_BYTE (x), GET_MODE (x));
2029     }
2030   return -1;
2031 }
2032
2033 /* Return regno of the register REG and handle subregs too.  */
2034 unsigned int
2035 reg_or_subregno (rtx reg)
2036 {
2037   if (REG_P (reg))
2038     return REGNO (reg);
2039   if (GET_CODE (reg) == SUBREG)
2040     return REGNO (SUBREG_REG (reg));
2041   abort ();
2042 }