OSDN Git Service

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