OSDN Git Service

* Makefile.am (LTLDFLAGS): Define.
[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, 2007, 2008, 2009
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 3, 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 COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This is the pathetic reminder of old fame of the jump-optimization pass
23    of the compiler.  Now it contains basically a set of utility functions 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 #include "tree-pass.h"
59 #include "target.h"
60
61 /* Optimize jump y; x: ... y: jumpif... x?
62    Don't know if it is worth bothering with.  */
63 /* Optimize two cases of conditional jump to conditional jump?
64    This can never delete any instruction or make anything dead,
65    or even change what is live at any point.
66    So perhaps let combiner do it.  */
67
68 static void init_label_info (rtx);
69 static void mark_all_labels (rtx);
70 static void mark_jump_label_1 (rtx, rtx, bool, bool);
71 static void redirect_exp_1 (rtx *, rtx, rtx, rtx);
72 static int invert_exp_1 (rtx, rtx);
73 static int returnjump_p_1 (rtx *, void *);
74 \f
75 /* This function rebuilds the JUMP_LABEL field and REG_LABEL_TARGET
76    notes in jumping insns and REG_LABEL_OPERAND notes in non-jumping
77    instructions and jumping insns that have labels as operands
78    (e.g. cbranchsi4).  */
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 (LABEL_P (XEXP (insn, 0)))
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 unsigned int
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 (BARRIER_P (insn))
114         {
115           prev = prev_nonnote_insn (insn);
116           if (BARRIER_P (prev))
117             delete_insn (insn);
118           else if (prev != PREV_INSN (insn))
119             reorder_insns (insn, insn, prev);
120         }
121     }
122   return 0;
123 }
124
125 struct rtl_opt_pass pass_cleanup_barriers =
126 {
127  {
128   RTL_PASS,
129   "barriers",                           /* name */
130   NULL,                                 /* gate */
131   cleanup_barriers,                     /* execute */
132   NULL,                                 /* sub */
133   NULL,                                 /* next */
134   0,                                    /* static_pass_number */
135   TV_NONE,                              /* tv_id */
136   0,                                    /* properties_required */
137   0,                                    /* properties_provided */
138   0,                                    /* properties_destroyed */
139   0,                                    /* todo_flags_start */
140   TODO_dump_func                        /* todo_flags_finish */
141  }
142 };
143
144 \f
145 /* Initialize LABEL_NUSES and JUMP_LABEL fields, add REG_LABEL_TARGET
146    for remaining targets for JUMP_P.  Delete any REG_LABEL_OPERAND
147    notes whose labels don't occur in the insn any more.  */
148
149 static void
150 init_label_info (rtx f)
151 {
152   rtx insn;
153
154   for (insn = f; insn; insn = NEXT_INSN (insn))
155     {
156       if (LABEL_P (insn))
157         LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
158
159       /* REG_LABEL_TARGET notes (including the JUMP_LABEL field) are
160          sticky and not reset here; that way we won't lose association
161          with a label when e.g. the source for a target register
162          disappears out of reach for targets that may use jump-target
163          registers.  Jump transformations are supposed to transform
164          any REG_LABEL_TARGET notes.  The target label reference in a
165          branch may disappear from the branch (and from the
166          instruction before it) for other reasons, like register
167          allocation.  */
168
169       if (INSN_P (insn))
170         {
171           rtx note, next;
172
173           for (note = REG_NOTES (insn); note; note = next)
174             {
175               next = XEXP (note, 1);
176               if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
177                   && ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
178                 remove_note (insn, note);
179             }
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   rtx prev_nonjump_insn = NULL;
192
193   for (insn = f; insn; insn = NEXT_INSN (insn))
194     if (INSN_P (insn))
195       {
196         mark_jump_label (PATTERN (insn), insn, 0);
197
198         /* If the previous non-jump insn sets something to a label,
199            something that this jump insn uses, make that label the primary
200            target of this insn if we don't yet have any.  That previous
201            insn must be a single_set and not refer to more than one label.
202            The jump insn must not refer to other labels as jump targets
203            and must be a plain (set (pc) ...), maybe in a parallel, and
204            may refer to the item being set only directly or as one of the
205            arms in an IF_THEN_ELSE.  */
206         if (! INSN_DELETED_P (insn)
207             && JUMP_P (insn)
208             && JUMP_LABEL (insn) == NULL)
209           {
210             rtx label_note = NULL;
211             rtx pc = pc_set (insn);
212             rtx pc_src = pc != NULL ? SET_SRC (pc) : NULL;
213
214             if (prev_nonjump_insn != NULL)
215               label_note
216                 = find_reg_note (prev_nonjump_insn, REG_LABEL_OPERAND, NULL);
217
218             if (label_note != NULL && pc_src != NULL)
219               {
220                 rtx label_set = single_set (prev_nonjump_insn);
221                 rtx label_dest
222                   = label_set != NULL ? SET_DEST (label_set) : NULL;
223
224                 if (label_set != NULL
225                     /* The source must be the direct LABEL_REF, not a
226                        PLUS, UNSPEC, IF_THEN_ELSE etc.  */
227                     && GET_CODE (SET_SRC (label_set)) == LABEL_REF
228                     && (rtx_equal_p (label_dest, pc_src)
229                         || (GET_CODE (pc_src) == IF_THEN_ELSE
230                             && (rtx_equal_p (label_dest, XEXP (pc_src, 1))
231                                 || rtx_equal_p (label_dest,
232                                                 XEXP (pc_src, 2))))))
233                                 
234                   {
235                     /* The CODE_LABEL referred to in the note must be the
236                        CODE_LABEL in the LABEL_REF of the "set".  We can
237                        conveniently use it for the marker function, which
238                        requires a LABEL_REF wrapping.  */
239                     gcc_assert (XEXP (label_note, 0)
240                                 == XEXP (SET_SRC (label_set), 0));
241
242                     mark_jump_label_1 (label_set, insn, false, true);
243                     gcc_assert (JUMP_LABEL (insn)
244                                 == XEXP (SET_SRC (label_set), 0));
245                   }
246               }
247           }
248         else if (! INSN_DELETED_P (insn))
249           prev_nonjump_insn = insn;
250       }
251     else if (LABEL_P (insn))
252       prev_nonjump_insn = NULL;
253
254   /* If we are in cfglayout mode, there may be non-insns between the
255      basic blocks.  If those non-insns represent tablejump data, they
256      contain label references that we must record.  */
257   if (current_ir_type () == IR_RTL_CFGLAYOUT)
258     {
259       basic_block bb;
260       rtx insn;
261       FOR_EACH_BB (bb)
262         {
263           for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
264             if (INSN_P (insn))
265               {
266                 gcc_assert (JUMP_TABLE_DATA_P (insn));
267                 mark_jump_label (PATTERN (insn), insn, 0);
268               }
269
270           for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
271             if (INSN_P (insn))
272               {
273                 gcc_assert (JUMP_TABLE_DATA_P (insn));
274                 mark_jump_label (PATTERN (insn), insn, 0);
275               }
276         }
277     }
278 }
279 \f
280 /* Given a comparison (CODE ARG0 ARG1), inside an insn, INSN, return a code
281    of reversed comparison if it is possible to do so.  Otherwise return UNKNOWN.
282    UNKNOWN may be returned in case we are having CC_MODE compare and we don't
283    know whether it's source is floating point or integer comparison.  Machine
284    description should define REVERSIBLE_CC_MODE and REVERSE_CONDITION macros
285    to help this function avoid overhead in these cases.  */
286 enum rtx_code
287 reversed_comparison_code_parts (enum rtx_code code, const_rtx arg0,
288                                 const_rtx arg1, const_rtx insn)
289 {
290   enum machine_mode mode;
291
292   /* If this is not actually a comparison, we can't reverse it.  */
293   if (GET_RTX_CLASS (code) != RTX_COMPARE
294       && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
295     return UNKNOWN;
296
297   mode = GET_MODE (arg0);
298   if (mode == VOIDmode)
299     mode = GET_MODE (arg1);
300
301   /* First see if machine description supplies us way to reverse the
302      comparison.  Give it priority over everything else to allow
303      machine description to do tricks.  */
304   if (GET_MODE_CLASS (mode) == MODE_CC
305       && REVERSIBLE_CC_MODE (mode))
306     {
307 #ifdef REVERSE_CONDITION
308       return REVERSE_CONDITION (code, mode);
309 #endif
310       return reverse_condition (code);
311     }
312
313   /* Try a few special cases based on the comparison code.  */
314   switch (code)
315     {
316     case GEU:
317     case GTU:
318     case LEU:
319     case LTU:
320     case NE:
321     case EQ:
322       /* It is always safe to reverse EQ and NE, even for the floating
323          point.  Similarly the unsigned comparisons are never used for
324          floating point so we can reverse them in the default way.  */
325       return reverse_condition (code);
326     case ORDERED:
327     case UNORDERED:
328     case LTGT:
329     case UNEQ:
330       /* In case we already see unordered comparison, we can be sure to
331          be dealing with floating point so we don't need any more tests.  */
332       return reverse_condition_maybe_unordered (code);
333     case UNLT:
334     case UNLE:
335     case UNGT:
336     case UNGE:
337       /* We don't have safe way to reverse these yet.  */
338       return UNKNOWN;
339     default:
340       break;
341     }
342
343   if (GET_MODE_CLASS (mode) == MODE_CC || CC0_P (arg0))
344     {
345       const_rtx prev;
346       /* Try to search for the comparison to determine the real mode.
347          This code is expensive, but with sane machine description it
348          will be never used, since REVERSIBLE_CC_MODE will return true
349          in all cases.  */
350       if (! insn)
351         return UNKNOWN;
352
353       /* These CONST_CAST's are okay because prev_nonnote_insn just
354          returns its argument and we assign it to a const_rtx
355          variable.  */
356       for (prev = prev_nonnote_insn (CONST_CAST_RTX(insn));
357            prev != 0 && !LABEL_P (prev);
358            prev = prev_nonnote_insn (CONST_CAST_RTX(prev)))
359         {
360           const_rtx set = set_of (arg0, prev);
361           if (set && GET_CODE (set) == SET
362               && rtx_equal_p (SET_DEST (set), arg0))
363             {
364               rtx src = SET_SRC (set);
365
366               if (GET_CODE (src) == COMPARE)
367                 {
368                   rtx comparison = src;
369                   arg0 = XEXP (src, 0);
370                   mode = GET_MODE (arg0);
371                   if (mode == VOIDmode)
372                     mode = GET_MODE (XEXP (comparison, 1));
373                   break;
374                 }
375               /* We can get past reg-reg moves.  This may be useful for model
376                  of i387 comparisons that first move flag registers around.  */
377               if (REG_P (src))
378                 {
379                   arg0 = src;
380                   continue;
381                 }
382             }
383           /* If register is clobbered in some ununderstandable way,
384              give up.  */
385           if (set)
386             return UNKNOWN;
387         }
388     }
389
390   /* Test for an integer condition, or a floating-point comparison
391      in which NaNs can be ignored.  */
392   if (GET_CODE (arg0) == CONST_INT
393       || (GET_MODE (arg0) != VOIDmode
394           && GET_MODE_CLASS (mode) != MODE_CC
395           && !HONOR_NANS (mode)))
396     return reverse_condition (code);
397
398   return UNKNOWN;
399 }
400
401 /* A wrapper around the previous function to take COMPARISON as rtx
402    expression.  This simplifies many callers.  */
403 enum rtx_code
404 reversed_comparison_code (const_rtx comparison, const_rtx insn)
405 {
406   if (!COMPARISON_P (comparison))
407     return UNKNOWN;
408   return reversed_comparison_code_parts (GET_CODE (comparison),
409                                          XEXP (comparison, 0),
410                                          XEXP (comparison, 1), insn);
411 }
412
413 /* Return comparison with reversed code of EXP.
414    Return NULL_RTX in case we fail to do the reversal.  */
415 rtx
416 reversed_comparison (const_rtx exp, enum machine_mode mode)
417 {
418   enum rtx_code reversed_code = reversed_comparison_code (exp, NULL_RTX);
419   if (reversed_code == UNKNOWN)
420     return NULL_RTX;
421   else
422     return simplify_gen_relational (reversed_code, mode, VOIDmode,
423                                     XEXP (exp, 0), XEXP (exp, 1));
424 }
425
426 \f
427 /* Given an rtx-code for a comparison, return the code for the negated
428    comparison.  If no such code exists, return UNKNOWN.
429
430    WATCH OUT!  reverse_condition is not safe to use on a jump that might
431    be acting on the results of an IEEE floating point comparison, because
432    of the special treatment of non-signaling nans in comparisons.
433    Use reversed_comparison_code instead.  */
434
435 enum rtx_code
436 reverse_condition (enum rtx_code code)
437 {
438   switch (code)
439     {
440     case EQ:
441       return NE;
442     case NE:
443       return EQ;
444     case GT:
445       return LE;
446     case GE:
447       return LT;
448     case LT:
449       return GE;
450     case LE:
451       return GT;
452     case GTU:
453       return LEU;
454     case GEU:
455       return LTU;
456     case LTU:
457       return GEU;
458     case LEU:
459       return GTU;
460     case UNORDERED:
461       return ORDERED;
462     case ORDERED:
463       return UNORDERED;
464
465     case UNLT:
466     case UNLE:
467     case UNGT:
468     case UNGE:
469     case UNEQ:
470     case LTGT:
471       return UNKNOWN;
472
473     default:
474       gcc_unreachable ();
475     }
476 }
477
478 /* Similar, but we're allowed to generate unordered comparisons, which
479    makes it safe for IEEE floating-point.  Of course, we have to recognize
480    that the target will support them too...  */
481
482 enum rtx_code
483 reverse_condition_maybe_unordered (enum rtx_code code)
484 {
485   switch (code)
486     {
487     case EQ:
488       return NE;
489     case NE:
490       return EQ;
491     case GT:
492       return UNLE;
493     case GE:
494       return UNLT;
495     case LT:
496       return UNGE;
497     case LE:
498       return UNGT;
499     case LTGT:
500       return UNEQ;
501     case UNORDERED:
502       return ORDERED;
503     case ORDERED:
504       return UNORDERED;
505     case UNLT:
506       return GE;
507     case UNLE:
508       return GT;
509     case UNGT:
510       return LE;
511     case UNGE:
512       return LT;
513     case UNEQ:
514       return LTGT;
515
516     default:
517       gcc_unreachable ();
518     }
519 }
520
521 /* Similar, but return the code when two operands of a comparison are swapped.
522    This IS safe for IEEE floating-point.  */
523
524 enum rtx_code
525 swap_condition (enum rtx_code code)
526 {
527   switch (code)
528     {
529     case EQ:
530     case NE:
531     case UNORDERED:
532     case ORDERED:
533     case UNEQ:
534     case LTGT:
535       return code;
536
537     case GT:
538       return LT;
539     case GE:
540       return LE;
541     case LT:
542       return GT;
543     case LE:
544       return GE;
545     case GTU:
546       return LTU;
547     case GEU:
548       return LEU;
549     case LTU:
550       return GTU;
551     case LEU:
552       return GEU;
553     case UNLT:
554       return UNGT;
555     case UNLE:
556       return UNGE;
557     case UNGT:
558       return UNLT;
559     case UNGE:
560       return UNLE;
561
562     default:
563       gcc_unreachable ();
564     }
565 }
566
567 /* Given a comparison CODE, return the corresponding unsigned comparison.
568    If CODE is an equality comparison or already an unsigned comparison,
569    CODE is returned.  */
570
571 enum rtx_code
572 unsigned_condition (enum rtx_code code)
573 {
574   switch (code)
575     {
576     case EQ:
577     case NE:
578     case GTU:
579     case GEU:
580     case LTU:
581     case LEU:
582       return code;
583
584     case GT:
585       return GTU;
586     case GE:
587       return GEU;
588     case LT:
589       return LTU;
590     case LE:
591       return LEU;
592
593     default:
594       gcc_unreachable ();
595     }
596 }
597
598 /* Similarly, return the signed version of a comparison.  */
599
600 enum rtx_code
601 signed_condition (enum rtx_code code)
602 {
603   switch (code)
604     {
605     case EQ:
606     case NE:
607     case GT:
608     case GE:
609     case LT:
610     case LE:
611       return code;
612
613     case GTU:
614       return GT;
615     case GEU:
616       return GE;
617     case LTU:
618       return LT;
619     case LEU:
620       return LE;
621
622     default:
623       gcc_unreachable ();
624     }
625 }
626 \f
627 /* Return nonzero if CODE1 is more strict than CODE2, i.e., if the
628    truth of CODE1 implies the truth of CODE2.  */
629
630 int
631 comparison_dominates_p (enum rtx_code code1, enum rtx_code code2)
632 {
633   /* UNKNOWN comparison codes can happen as a result of trying to revert
634      comparison codes.
635      They can't match anything, so we have to reject them here.  */
636   if (code1 == UNKNOWN || code2 == UNKNOWN)
637     return 0;
638
639   if (code1 == code2)
640     return 1;
641
642   switch (code1)
643     {
644     case UNEQ:
645       if (code2 == UNLE || code2 == UNGE)
646         return 1;
647       break;
648
649     case EQ:
650       if (code2 == LE || code2 == LEU || code2 == GE || code2 == GEU
651           || code2 == ORDERED)
652         return 1;
653       break;
654
655     case UNLT:
656       if (code2 == UNLE || code2 == NE)
657         return 1;
658       break;
659
660     case LT:
661       if (code2 == LE || code2 == NE || code2 == ORDERED || code2 == LTGT)
662         return 1;
663       break;
664
665     case UNGT:
666       if (code2 == UNGE || code2 == NE)
667         return 1;
668       break;
669
670     case GT:
671       if (code2 == GE || code2 == NE || code2 == ORDERED || code2 == LTGT)
672         return 1;
673       break;
674
675     case GE:
676     case LE:
677       if (code2 == ORDERED)
678         return 1;
679       break;
680
681     case LTGT:
682       if (code2 == NE || code2 == ORDERED)
683         return 1;
684       break;
685
686     case LTU:
687       if (code2 == LEU || code2 == NE)
688         return 1;
689       break;
690
691     case GTU:
692       if (code2 == GEU || code2 == NE)
693         return 1;
694       break;
695
696     case UNORDERED:
697       if (code2 == NE || code2 == UNEQ || code2 == UNLE || code2 == UNLT
698           || code2 == UNGE || code2 == UNGT)
699         return 1;
700       break;
701
702     default:
703       break;
704     }
705
706   return 0;
707 }
708 \f
709 /* Return 1 if INSN is an unconditional jump and nothing else.  */
710
711 int
712 simplejump_p (const_rtx insn)
713 {
714   return (JUMP_P (insn)
715           && GET_CODE (PATTERN (insn)) == SET
716           && GET_CODE (SET_DEST (PATTERN (insn))) == PC
717           && GET_CODE (SET_SRC (PATTERN (insn))) == LABEL_REF);
718 }
719
720 /* Return nonzero if INSN is a (possibly) conditional jump
721    and nothing more.
722
723    Use of this function is deprecated, since we need to support combined
724    branch and compare insns.  Use any_condjump_p instead whenever possible.  */
725
726 int
727 condjump_p (const_rtx insn)
728 {
729   const_rtx x = PATTERN (insn);
730
731   if (GET_CODE (x) != SET
732       || GET_CODE (SET_DEST (x)) != PC)
733     return 0;
734
735   x = SET_SRC (x);
736   if (GET_CODE (x) == LABEL_REF)
737     return 1;
738   else
739     return (GET_CODE (x) == IF_THEN_ELSE
740             && ((GET_CODE (XEXP (x, 2)) == PC
741                  && (GET_CODE (XEXP (x, 1)) == LABEL_REF
742                      || GET_CODE (XEXP (x, 1)) == RETURN))
743                 || (GET_CODE (XEXP (x, 1)) == PC
744                     && (GET_CODE (XEXP (x, 2)) == LABEL_REF
745                         || GET_CODE (XEXP (x, 2)) == RETURN))));
746 }
747
748 /* Return nonzero if INSN is a (possibly) conditional jump inside a
749    PARALLEL.
750
751    Use this function is deprecated, since we need to support combined
752    branch and compare insns.  Use any_condjump_p instead whenever possible.  */
753
754 int
755 condjump_in_parallel_p (const_rtx insn)
756 {
757   const_rtx x = PATTERN (insn);
758
759   if (GET_CODE (x) != PARALLEL)
760     return 0;
761   else
762     x = XVECEXP (x, 0, 0);
763
764   if (GET_CODE (x) != SET)
765     return 0;
766   if (GET_CODE (SET_DEST (x)) != PC)
767     return 0;
768   if (GET_CODE (SET_SRC (x)) == LABEL_REF)
769     return 1;
770   if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
771     return 0;
772   if (XEXP (SET_SRC (x), 2) == pc_rtx
773       && (GET_CODE (XEXP (SET_SRC (x), 1)) == LABEL_REF
774           || GET_CODE (XEXP (SET_SRC (x), 1)) == RETURN))
775     return 1;
776   if (XEXP (SET_SRC (x), 1) == pc_rtx
777       && (GET_CODE (XEXP (SET_SRC (x), 2)) == LABEL_REF
778           || GET_CODE (XEXP (SET_SRC (x), 2)) == RETURN))
779     return 1;
780   return 0;
781 }
782
783 /* Return set of PC, otherwise NULL.  */
784
785 rtx
786 pc_set (const_rtx insn)
787 {
788   rtx pat;
789   if (!JUMP_P (insn))
790     return NULL_RTX;
791   pat = PATTERN (insn);
792
793   /* The set is allowed to appear either as the insn pattern or
794      the first set in a PARALLEL.  */
795   if (GET_CODE (pat) == PARALLEL)
796     pat = XVECEXP (pat, 0, 0);
797   if (GET_CODE (pat) == SET && GET_CODE (SET_DEST (pat)) == PC)
798     return pat;
799
800   return NULL_RTX;
801 }
802
803 /* Return true when insn is an unconditional direct jump,
804    possibly bundled inside a PARALLEL.  */
805
806 int
807 any_uncondjump_p (const_rtx insn)
808 {
809   const_rtx x = pc_set (insn);
810   if (!x)
811     return 0;
812   if (GET_CODE (SET_SRC (x)) != LABEL_REF)
813     return 0;
814   if (find_reg_note (insn, REG_NON_LOCAL_GOTO, NULL_RTX))
815     return 0;
816   return 1;
817 }
818
819 /* Return true when insn is a conditional jump.  This function works for
820    instructions containing PC sets in PARALLELs.  The instruction may have
821    various other effects so before removing the jump you must verify
822    onlyjump_p.
823
824    Note that unlike condjump_p it returns false for unconditional jumps.  */
825
826 int
827 any_condjump_p (const_rtx insn)
828 {
829   const_rtx x = pc_set (insn);
830   enum rtx_code a, b;
831
832   if (!x)
833     return 0;
834   if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
835     return 0;
836
837   a = GET_CODE (XEXP (SET_SRC (x), 1));
838   b = GET_CODE (XEXP (SET_SRC (x), 2));
839
840   return ((b == PC && (a == LABEL_REF || a == RETURN))
841           || (a == PC && (b == LABEL_REF || b == RETURN)));
842 }
843
844 /* Return the label of a conditional jump.  */
845
846 rtx
847 condjump_label (const_rtx insn)
848 {
849   rtx x = pc_set (insn);
850
851   if (!x)
852     return NULL_RTX;
853   x = SET_SRC (x);
854   if (GET_CODE (x) == LABEL_REF)
855     return x;
856   if (GET_CODE (x) != IF_THEN_ELSE)
857     return NULL_RTX;
858   if (XEXP (x, 2) == pc_rtx && GET_CODE (XEXP (x, 1)) == LABEL_REF)
859     return XEXP (x, 1);
860   if (XEXP (x, 1) == pc_rtx && GET_CODE (XEXP (x, 2)) == LABEL_REF)
861     return XEXP (x, 2);
862   return NULL_RTX;
863 }
864
865 /* Return true if INSN is a (possibly conditional) return insn.  */
866
867 static int
868 returnjump_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
869 {
870   rtx x = *loc;
871
872   if (x == NULL)
873     return false;
874
875   switch (GET_CODE (x))
876     {
877     case RETURN:
878     case EH_RETURN:
879       return true;
880
881     case SET:
882       return SET_IS_RETURN_P (x);
883
884     default:
885       return false;
886     }
887 }
888
889 /* Return TRUE if INSN is a return jump.  */
890
891 int
892 returnjump_p (rtx insn)
893 {
894   /* Handle delayed branches.  */
895   if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
896     insn = XVECEXP (PATTERN (insn), 0, 0);
897
898   if (!JUMP_P (insn))
899     return 0;
900
901   return for_each_rtx (&PATTERN (insn), returnjump_p_1, NULL);
902 }
903
904 /* Return true if INSN is a (possibly conditional) return insn.  */
905
906 static int
907 eh_returnjump_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
908 {
909   return *loc && GET_CODE (*loc) == EH_RETURN;
910 }
911
912 int
913 eh_returnjump_p (rtx insn)
914 {
915   if (!JUMP_P (insn))
916     return 0;
917   return for_each_rtx (&PATTERN (insn), eh_returnjump_p_1, NULL);
918 }
919
920 /* Return true if INSN is a jump that only transfers control and
921    nothing more.  */
922
923 int
924 onlyjump_p (const_rtx insn)
925 {
926   rtx set;
927
928   if (!JUMP_P (insn))
929     return 0;
930
931   set = single_set (insn);
932   if (set == NULL)
933     return 0;
934   if (GET_CODE (SET_DEST (set)) != PC)
935     return 0;
936   if (side_effects_p (SET_SRC (set)))
937     return 0;
938
939   return 1;
940 }
941
942 #ifdef HAVE_cc0
943
944 /* Return nonzero if X is an RTX that only sets the condition codes
945    and has no side effects.  */
946
947 int
948 only_sets_cc0_p (const_rtx x)
949 {
950   if (! x)
951     return 0;
952
953   if (INSN_P (x))
954     x = PATTERN (x);
955
956   return sets_cc0_p (x) == 1 && ! side_effects_p (x);
957 }
958
959 /* Return 1 if X is an RTX that does nothing but set the condition codes
960    and CLOBBER or USE registers.
961    Return -1 if X does explicitly set the condition codes,
962    but also does other things.  */
963
964 int
965 sets_cc0_p (const_rtx x)
966 {
967   if (! x)
968     return 0;
969
970   if (INSN_P (x))
971     x = PATTERN (x);
972
973   if (GET_CODE (x) == SET && SET_DEST (x) == cc0_rtx)
974     return 1;
975   if (GET_CODE (x) == PARALLEL)
976     {
977       int i;
978       int sets_cc0 = 0;
979       int other_things = 0;
980       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
981         {
982           if (GET_CODE (XVECEXP (x, 0, i)) == SET
983               && SET_DEST (XVECEXP (x, 0, i)) == cc0_rtx)
984             sets_cc0 = 1;
985           else if (GET_CODE (XVECEXP (x, 0, i)) == SET)
986             other_things = 1;
987         }
988       return ! sets_cc0 ? 0 : other_things ? -1 : 1;
989     }
990   return 0;
991 }
992 #endif
993 \f
994 /* Find all CODE_LABELs referred to in X, and increment their use
995    counts.  If INSN is a JUMP_INSN and there is at least one
996    CODE_LABEL referenced in INSN as a jump target, then store the last
997    one in JUMP_LABEL (INSN).  For a tablejump, this must be the label
998    for the ADDR_VEC.  Store any other jump targets as REG_LABEL_TARGET
999    notes.  If INSN is an INSN or a CALL_INSN or non-target operands of
1000    a JUMP_INSN, and there is at least one CODE_LABEL referenced in
1001    INSN, add a REG_LABEL_OPERAND note containing that label to INSN.
1002
1003    Note that two labels separated by a loop-beginning note
1004    must be kept distinct if we have not yet done loop-optimization,
1005    because the gap between them is where loop-optimize
1006    will want to move invariant code to.  CROSS_JUMP tells us
1007    that loop-optimization is done with.  */
1008
1009 void
1010 mark_jump_label (rtx x, rtx insn, int in_mem)
1011 {
1012   mark_jump_label_1 (x, insn, in_mem != 0,
1013                      (insn != NULL && x == PATTERN (insn) && JUMP_P (insn)));
1014 }
1015
1016 /* Worker function for mark_jump_label.  IN_MEM is TRUE when X occurs
1017    within a (MEM ...).  IS_TARGET is TRUE when X is to be treated as a
1018    jump-target; when the JUMP_LABEL field of INSN should be set or a
1019    REG_LABEL_TARGET note should be added, not a REG_LABEL_OPERAND
1020    note.  */
1021
1022 static void
1023 mark_jump_label_1 (rtx x, rtx insn, bool in_mem, bool is_target)
1024 {
1025   RTX_CODE code = GET_CODE (x);
1026   int i;
1027   const char *fmt;
1028
1029   switch (code)
1030     {
1031     case PC:
1032     case CC0:
1033     case REG:
1034     case CONST_INT:
1035     case CONST_DOUBLE:
1036     case CLOBBER:
1037     case CALL:
1038       return;
1039
1040     case MEM:
1041       in_mem = true;
1042       break;
1043
1044     case SEQUENCE:
1045       for (i = 0; i < XVECLEN (x, 0); i++)
1046         mark_jump_label (PATTERN (XVECEXP (x, 0, i)),
1047                          XVECEXP (x, 0, i), 0);
1048       return;
1049
1050     case SYMBOL_REF:
1051       if (!in_mem)
1052         return;
1053
1054       /* If this is a constant-pool reference, see if it is a label.  */
1055       if (CONSTANT_POOL_ADDRESS_P (x))
1056         mark_jump_label_1 (get_pool_constant (x), insn, in_mem, is_target);
1057       break;
1058
1059       /* Handle operands in the condition of an if-then-else as for a
1060          non-jump insn.  */
1061     case IF_THEN_ELSE:
1062       if (!is_target)
1063         break;
1064       mark_jump_label_1 (XEXP (x, 0), insn, in_mem, false);
1065       mark_jump_label_1 (XEXP (x, 1), insn, in_mem, true);
1066       mark_jump_label_1 (XEXP (x, 2), insn, in_mem, true);
1067       return;
1068
1069     case LABEL_REF:
1070       {
1071         rtx label = XEXP (x, 0);
1072
1073         /* Ignore remaining references to unreachable labels that
1074            have been deleted.  */
1075         if (NOTE_P (label)
1076             && NOTE_KIND (label) == NOTE_INSN_DELETED_LABEL)
1077           break;
1078
1079         gcc_assert (LABEL_P (label));
1080
1081         /* Ignore references to labels of containing functions.  */
1082         if (LABEL_REF_NONLOCAL_P (x))
1083           break;
1084
1085         XEXP (x, 0) = label;
1086         if (! insn || ! INSN_DELETED_P (insn))
1087           ++LABEL_NUSES (label);
1088
1089         if (insn)
1090           {
1091             if (is_target
1092                 /* Do not change a previous setting of JUMP_LABEL.  If the
1093                    JUMP_LABEL slot is occupied by a different label,
1094                    create a note for this label.  */
1095                 && (JUMP_LABEL (insn) == NULL || JUMP_LABEL (insn) == label))
1096               JUMP_LABEL (insn) = label;
1097             else
1098               {
1099                 enum reg_note kind
1100                   = is_target ? REG_LABEL_TARGET : REG_LABEL_OPERAND;
1101
1102                 /* Add a REG_LABEL_OPERAND or REG_LABEL_TARGET note
1103                    for LABEL unless there already is one.  All uses of
1104                    a label, except for the primary target of a jump,
1105                    must have such a note.  */
1106                 if (! find_reg_note (insn, kind, label))
1107                   add_reg_note (insn, kind, label);
1108               }
1109           }
1110         return;
1111       }
1112
1113   /* Do walk the labels in a vector, but not the first operand of an
1114      ADDR_DIFF_VEC.  Don't set the JUMP_LABEL of a vector.  */
1115     case ADDR_VEC:
1116     case ADDR_DIFF_VEC:
1117       if (! INSN_DELETED_P (insn))
1118         {
1119           int eltnum = code == ADDR_DIFF_VEC ? 1 : 0;
1120
1121           for (i = 0; i < XVECLEN (x, eltnum); i++)
1122             mark_jump_label_1 (XVECEXP (x, eltnum, i), NULL_RTX, in_mem,
1123                                is_target);
1124         }
1125       return;
1126
1127     default:
1128       break;
1129     }
1130
1131   fmt = GET_RTX_FORMAT (code);
1132
1133   /* The primary target of a tablejump is the label of the ADDR_VEC,
1134      which is canonically mentioned *last* in the insn.  To get it
1135      marked as JUMP_LABEL, we iterate over items in reverse order.  */
1136   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1137     {
1138       if (fmt[i] == 'e')
1139         mark_jump_label_1 (XEXP (x, i), insn, in_mem, is_target);
1140       else if (fmt[i] == 'E')
1141         {
1142           int j;
1143
1144           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1145             mark_jump_label_1 (XVECEXP (x, i, j), insn, in_mem,
1146                                is_target);
1147         }
1148     }
1149 }
1150
1151 \f
1152 /* Delete insn INSN from the chain of insns and update label ref counts
1153    and delete insns now unreachable.
1154
1155    Returns the first insn after INSN that was not deleted.
1156
1157    Usage of this instruction is deprecated.  Use delete_insn instead and
1158    subsequent cfg_cleanup pass to delete unreachable code if needed.  */
1159
1160 rtx
1161 delete_related_insns (rtx insn)
1162 {
1163   int was_code_label = (LABEL_P (insn));
1164   rtx note;
1165   rtx next = NEXT_INSN (insn), prev = PREV_INSN (insn);
1166
1167   while (next && INSN_DELETED_P (next))
1168     next = NEXT_INSN (next);
1169
1170   /* This insn is already deleted => return first following nondeleted.  */
1171   if (INSN_DELETED_P (insn))
1172     return next;
1173
1174   delete_insn (insn);
1175
1176   /* If instruction is followed by a barrier,
1177      delete the barrier too.  */
1178
1179   if (next != 0 && BARRIER_P (next))
1180     delete_insn (next);
1181
1182   /* If deleting a jump, decrement the count of the label,
1183      and delete the label if it is now unused.  */
1184
1185   if (JUMP_P (insn) && JUMP_LABEL (insn))
1186     {
1187       rtx lab = JUMP_LABEL (insn), lab_next;
1188
1189       if (LABEL_NUSES (lab) == 0)
1190         /* This can delete NEXT or PREV,
1191            either directly if NEXT is JUMP_LABEL (INSN),
1192            or indirectly through more levels of jumps.  */
1193         delete_related_insns (lab);
1194       else if (tablejump_p (insn, NULL, &lab_next))
1195         {
1196           /* If we're deleting the tablejump, delete the dispatch table.
1197              We may not be able to kill the label immediately preceding
1198              just yet, as it might be referenced in code leading up to
1199              the tablejump.  */
1200           delete_related_insns (lab_next);
1201         }
1202     }
1203
1204   /* Likewise if we're deleting a dispatch table.  */
1205
1206   if (JUMP_P (insn)
1207       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
1208           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
1209     {
1210       rtx pat = PATTERN (insn);
1211       int i, diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
1212       int len = XVECLEN (pat, diff_vec_p);
1213
1214       for (i = 0; i < len; i++)
1215         if (LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0)) == 0)
1216           delete_related_insns (XEXP (XVECEXP (pat, diff_vec_p, i), 0));
1217       while (next && INSN_DELETED_P (next))
1218         next = NEXT_INSN (next);
1219       return next;
1220     }
1221
1222   /* Likewise for any JUMP_P / INSN / CALL_INSN with a
1223      REG_LABEL_OPERAND or REG_LABEL_TARGET note.  */
1224   if (INSN_P (insn))
1225     for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1226       if ((REG_NOTE_KIND (note) == REG_LABEL_OPERAND
1227            || REG_NOTE_KIND (note) == REG_LABEL_TARGET)
1228           /* This could also be a NOTE_INSN_DELETED_LABEL note.  */
1229           && LABEL_P (XEXP (note, 0)))
1230         if (LABEL_NUSES (XEXP (note, 0)) == 0)
1231           delete_related_insns (XEXP (note, 0));
1232
1233   while (prev && (INSN_DELETED_P (prev) || NOTE_P (prev)))
1234     prev = PREV_INSN (prev);
1235
1236   /* If INSN was a label and a dispatch table follows it,
1237      delete the dispatch table.  The tablejump must have gone already.
1238      It isn't useful to fall through into a table.  */
1239
1240   if (was_code_label
1241       && NEXT_INSN (insn) != 0
1242       && JUMP_P (NEXT_INSN (insn))
1243       && (GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_VEC
1244           || GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_DIFF_VEC))
1245     next = delete_related_insns (NEXT_INSN (insn));
1246
1247   /* If INSN was a label, delete insns following it if now unreachable.  */
1248
1249   if (was_code_label && prev && BARRIER_P (prev))
1250     {
1251       enum rtx_code code;
1252       while (next)
1253         {
1254           code = GET_CODE (next);
1255           if (code == NOTE)
1256             next = NEXT_INSN (next);
1257           /* Keep going past other deleted labels to delete what follows.  */
1258           else if (code == CODE_LABEL && INSN_DELETED_P (next))
1259             next = NEXT_INSN (next);
1260           else if (code == BARRIER || INSN_P (next))
1261             /* Note: if this deletes a jump, it can cause more
1262                deletion of unreachable code, after a different label.
1263                As long as the value from this recursive call is correct,
1264                this invocation functions correctly.  */
1265             next = delete_related_insns (next);
1266           else
1267             break;
1268         }
1269     }
1270
1271   /* I feel a little doubtful about this loop,
1272      but I see no clean and sure alternative way
1273      to find the first insn after INSN that is not now deleted.
1274      I hope this works.  */
1275   while (next && INSN_DELETED_P (next))
1276     next = NEXT_INSN (next);
1277   return next;
1278 }
1279 \f
1280 /* Delete a range of insns from FROM to TO, inclusive.
1281    This is for the sake of peephole optimization, so assume
1282    that whatever these insns do will still be done by a new
1283    peephole insn that will replace them.  */
1284
1285 void
1286 delete_for_peephole (rtx from, rtx to)
1287 {
1288   rtx insn = from;
1289
1290   while (1)
1291     {
1292       rtx next = NEXT_INSN (insn);
1293       rtx prev = PREV_INSN (insn);
1294
1295       if (!NOTE_P (insn))
1296         {
1297           INSN_DELETED_P (insn) = 1;
1298
1299           /* Patch this insn out of the chain.  */
1300           /* We don't do this all at once, because we
1301              must preserve all NOTEs.  */
1302           if (prev)
1303             NEXT_INSN (prev) = next;
1304
1305           if (next)
1306             PREV_INSN (next) = prev;
1307         }
1308
1309       if (insn == to)
1310         break;
1311       insn = next;
1312     }
1313
1314   /* Note that if TO is an unconditional jump
1315      we *do not* delete the BARRIER that follows,
1316      since the peephole that replaces this sequence
1317      is also an unconditional jump in that case.  */
1318 }
1319 \f
1320 /* Throughout LOC, redirect OLABEL to NLABEL.  Treat null OLABEL or
1321    NLABEL as a return.  Accrue modifications into the change group.  */
1322
1323 static void
1324 redirect_exp_1 (rtx *loc, rtx olabel, rtx nlabel, rtx insn)
1325 {
1326   rtx x = *loc;
1327   RTX_CODE code = GET_CODE (x);
1328   int i;
1329   const char *fmt;
1330
1331   if (code == LABEL_REF)
1332     {
1333       if (XEXP (x, 0) == olabel)
1334         {
1335           rtx n;
1336           if (nlabel)
1337             n = gen_rtx_LABEL_REF (Pmode, nlabel);
1338           else
1339             n = gen_rtx_RETURN (VOIDmode);
1340
1341           validate_change (insn, loc, n, 1);
1342           return;
1343         }
1344     }
1345   else if (code == RETURN && olabel == 0)
1346     {
1347       if (nlabel)
1348         x = gen_rtx_LABEL_REF (Pmode, nlabel);
1349       else
1350         x = gen_rtx_RETURN (VOIDmode);
1351       if (loc == &PATTERN (insn))
1352         x = gen_rtx_SET (VOIDmode, pc_rtx, x);
1353       validate_change (insn, loc, x, 1);
1354       return;
1355     }
1356
1357   if (code == SET && nlabel == 0 && SET_DEST (x) == pc_rtx
1358       && GET_CODE (SET_SRC (x)) == LABEL_REF
1359       && XEXP (SET_SRC (x), 0) == olabel)
1360     {
1361       validate_change (insn, loc, gen_rtx_RETURN (VOIDmode), 1);
1362       return;
1363     }
1364
1365   if (code == IF_THEN_ELSE)
1366     {
1367       /* Skip the condition of an IF_THEN_ELSE.  We only want to
1368          change jump destinations, not eventual label comparisons.  */
1369       redirect_exp_1 (&XEXP (x, 1), olabel, nlabel, insn);
1370       redirect_exp_1 (&XEXP (x, 2), olabel, nlabel, insn);
1371       return;
1372     }
1373
1374   fmt = GET_RTX_FORMAT (code);
1375   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1376     {
1377       if (fmt[i] == 'e')
1378         redirect_exp_1 (&XEXP (x, i), olabel, nlabel, insn);
1379       else if (fmt[i] == 'E')
1380         {
1381           int j;
1382           for (j = 0; j < XVECLEN (x, i); j++)
1383             redirect_exp_1 (&XVECEXP (x, i, j), olabel, nlabel, insn);
1384         }
1385     }
1386 }
1387
1388 /* Make JUMP go to NLABEL instead of where it jumps now.  Accrue
1389    the modifications into the change group.  Return false if we did
1390    not see how to do that.  */
1391
1392 int
1393 redirect_jump_1 (rtx jump, rtx nlabel)
1394 {
1395   int ochanges = num_validated_changes ();
1396   rtx *loc;
1397
1398   if (GET_CODE (PATTERN (jump)) == PARALLEL)
1399     loc = &XVECEXP (PATTERN (jump), 0, 0);
1400   else
1401     loc = &PATTERN (jump);
1402
1403   redirect_exp_1 (loc, JUMP_LABEL (jump), nlabel, jump);
1404   return num_validated_changes () > ochanges;
1405 }
1406
1407 /* Make JUMP go to NLABEL instead of where it jumps now.  If the old
1408    jump target label is unused as a result, it and the code following
1409    it may be deleted.
1410
1411    If NLABEL is zero, we are to turn the jump into a (possibly conditional)
1412    RETURN insn.
1413
1414    The return value will be 1 if the change was made, 0 if it wasn't
1415    (this can only occur for NLABEL == 0).  */
1416
1417 int
1418 redirect_jump (rtx jump, rtx nlabel, int delete_unused)
1419 {
1420   rtx olabel = JUMP_LABEL (jump);
1421
1422   if (nlabel == olabel)
1423     return 1;
1424
1425   if (! redirect_jump_1 (jump, nlabel) || ! apply_change_group ())
1426     return 0;
1427
1428   redirect_jump_2 (jump, olabel, nlabel, delete_unused, 0);
1429   return 1;
1430 }
1431
1432 /* Fix up JUMP_LABEL and label ref counts after OLABEL has been replaced with
1433    NLABEL in JUMP.  
1434    If DELETE_UNUSED is positive, delete related insn to OLABEL if its ref
1435    count has dropped to zero.  */
1436 void
1437 redirect_jump_2 (rtx jump, rtx olabel, rtx nlabel, int delete_unused,
1438                  int invert)
1439 {
1440   rtx note;
1441
1442   gcc_assert (JUMP_LABEL (jump) == olabel);
1443
1444   /* Negative DELETE_UNUSED used to be used to signalize behavior on
1445      moving FUNCTION_END note.  Just sanity check that no user still worry
1446      about this.  */
1447   gcc_assert (delete_unused >= 0);
1448   JUMP_LABEL (jump) = nlabel;
1449   if (nlabel)
1450     ++LABEL_NUSES (nlabel);
1451
1452   /* Update labels in any REG_EQUAL note.  */
1453   if ((note = find_reg_note (jump, REG_EQUAL, NULL_RTX)) != NULL_RTX)
1454     {
1455       if (!nlabel || (invert && !invert_exp_1 (XEXP (note, 0), jump)))
1456         remove_note (jump, note);
1457       else
1458         {
1459           redirect_exp_1 (&XEXP (note, 0), olabel, nlabel, jump);
1460           confirm_change_group ();
1461         }
1462     }
1463
1464   if (olabel && --LABEL_NUSES (olabel) == 0 && delete_unused > 0
1465       /* Undefined labels will remain outside the insn stream.  */
1466       && INSN_UID (olabel))
1467     delete_related_insns (olabel);
1468   if (invert)
1469     invert_br_probabilities (jump);
1470 }
1471
1472 /* Invert the jump condition X contained in jump insn INSN.  Accrue the
1473    modifications into the change group.  Return nonzero for success.  */
1474 static int
1475 invert_exp_1 (rtx x, rtx insn)
1476 {
1477   RTX_CODE code = GET_CODE (x);
1478
1479   if (code == IF_THEN_ELSE)
1480     {
1481       rtx comp = XEXP (x, 0);
1482       rtx tem;
1483       enum rtx_code reversed_code;
1484
1485       /* We can do this in two ways:  The preferable way, which can only
1486          be done if this is not an integer comparison, is to reverse
1487          the comparison code.  Otherwise, swap the THEN-part and ELSE-part
1488          of the IF_THEN_ELSE.  If we can't do either, fail.  */
1489
1490       reversed_code = reversed_comparison_code (comp, insn);
1491
1492       if (reversed_code != UNKNOWN)
1493         {
1494           validate_change (insn, &XEXP (x, 0),
1495                            gen_rtx_fmt_ee (reversed_code,
1496                                            GET_MODE (comp), XEXP (comp, 0),
1497                                            XEXP (comp, 1)),
1498                            1);
1499           return 1;
1500         }
1501
1502       tem = XEXP (x, 1);
1503       validate_change (insn, &XEXP (x, 1), XEXP (x, 2), 1);
1504       validate_change (insn, &XEXP (x, 2), tem, 1);
1505       return 1;
1506     }
1507   else
1508     return 0;
1509 }
1510
1511 /* Invert the condition of the jump JUMP, and make it jump to label
1512    NLABEL instead of where it jumps now.  Accrue changes into the
1513    change group.  Return false if we didn't see how to perform the
1514    inversion and redirection.  */
1515
1516 int
1517 invert_jump_1 (rtx jump, rtx nlabel)
1518 {
1519   rtx x = pc_set (jump);
1520   int ochanges;
1521   int ok;
1522
1523   ochanges = num_validated_changes ();
1524   gcc_assert (x);
1525   ok = invert_exp_1 (SET_SRC (x), jump);
1526   gcc_assert (ok);
1527   
1528   if (num_validated_changes () == ochanges)
1529     return 0;
1530
1531   /* redirect_jump_1 will fail of nlabel == olabel, and the current use is
1532      in Pmode, so checking this is not merely an optimization.  */
1533   return nlabel == JUMP_LABEL (jump) || redirect_jump_1 (jump, nlabel);
1534 }
1535
1536 /* Invert the condition of the jump JUMP, and make it jump to label
1537    NLABEL instead of where it jumps now.  Return true if successful.  */
1538
1539 int
1540 invert_jump (rtx jump, rtx nlabel, int delete_unused)
1541 {
1542   rtx olabel = JUMP_LABEL (jump);
1543
1544   if (invert_jump_1 (jump, nlabel) && apply_change_group ())
1545     {
1546       redirect_jump_2 (jump, olabel, nlabel, delete_unused, 1);
1547       return 1;
1548     }
1549   cancel_changes (0);
1550   return 0;
1551 }
1552
1553 \f
1554 /* Like rtx_equal_p except that it considers two REGs as equal
1555    if they renumber to the same value and considers two commutative
1556    operations to be the same if the order of the operands has been
1557    reversed.  */
1558
1559 int
1560 rtx_renumbered_equal_p (const_rtx x, const_rtx y)
1561 {
1562   int i;
1563   const enum rtx_code code = GET_CODE (x);
1564   const char *fmt;
1565
1566   if (x == y)
1567     return 1;
1568
1569   if ((code == REG || (code == SUBREG && REG_P (SUBREG_REG (x))))
1570       && (REG_P (y) || (GET_CODE (y) == SUBREG
1571                                   && REG_P (SUBREG_REG (y)))))
1572     {
1573       int reg_x = -1, reg_y = -1;
1574       int byte_x = 0, byte_y = 0;
1575       struct subreg_info info;
1576
1577       if (GET_MODE (x) != GET_MODE (y))
1578         return 0;
1579
1580       /* If we haven't done any renumbering, don't
1581          make any assumptions.  */
1582       if (reg_renumber == 0)
1583         return rtx_equal_p (x, y);
1584
1585       if (code == SUBREG)
1586         {
1587           reg_x = REGNO (SUBREG_REG (x));
1588           byte_x = SUBREG_BYTE (x);
1589
1590           if (reg_renumber[reg_x] >= 0)
1591             {
1592               subreg_get_info (reg_renumber[reg_x],
1593                                GET_MODE (SUBREG_REG (x)), byte_x,
1594                                GET_MODE (x), &info);
1595               if (!info.representable_p)
1596                 return 0;
1597               reg_x = info.offset;
1598               byte_x = 0;
1599             }
1600         }
1601       else
1602         {
1603           reg_x = REGNO (x);
1604           if (reg_renumber[reg_x] >= 0)
1605             reg_x = reg_renumber[reg_x];
1606         }
1607
1608       if (GET_CODE (y) == SUBREG)
1609         {
1610           reg_y = REGNO (SUBREG_REG (y));
1611           byte_y = SUBREG_BYTE (y);
1612
1613           if (reg_renumber[reg_y] >= 0)
1614             {
1615               subreg_get_info (reg_renumber[reg_y],
1616                                GET_MODE (SUBREG_REG (y)), byte_y,
1617                                GET_MODE (y), &info);
1618               if (!info.representable_p)
1619                 return 0;
1620               reg_y = info.offset;
1621               byte_y = 0;
1622             }
1623         }
1624       else
1625         {
1626           reg_y = REGNO (y);
1627           if (reg_renumber[reg_y] >= 0)
1628             reg_y = reg_renumber[reg_y];
1629         }
1630
1631       return reg_x >= 0 && reg_x == reg_y && byte_x == byte_y;
1632     }
1633
1634   /* Now we have disposed of all the cases
1635      in which different rtx codes can match.  */
1636   if (code != GET_CODE (y))
1637     return 0;
1638
1639   switch (code)
1640     {
1641     case PC:
1642     case CC0:
1643     case ADDR_VEC:
1644     case ADDR_DIFF_VEC:
1645     case CONST_INT:
1646     case CONST_DOUBLE:
1647       return 0;
1648
1649     case LABEL_REF:
1650       /* We can't assume nonlocal labels have their following insns yet.  */
1651       if (LABEL_REF_NONLOCAL_P (x) || LABEL_REF_NONLOCAL_P (y))
1652         return XEXP (x, 0) == XEXP (y, 0);
1653
1654       /* Two label-refs are equivalent if they point at labels
1655          in the same position in the instruction stream.  */
1656       return (next_real_insn (XEXP (x, 0))
1657               == next_real_insn (XEXP (y, 0)));
1658
1659     case SYMBOL_REF:
1660       return XSTR (x, 0) == XSTR (y, 0);
1661
1662     case CODE_LABEL:
1663       /* If we didn't match EQ equality above, they aren't the same.  */
1664       return 0;
1665
1666     default:
1667       break;
1668     }
1669
1670   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.  */
1671
1672   if (GET_MODE (x) != GET_MODE (y))
1673     return 0;
1674
1675   /* For commutative operations, the RTX match if the operand match in any
1676      order.  Also handle the simple binary and unary cases without a loop.  */
1677   if (targetm.commutative_p (x, UNKNOWN))
1678     return ((rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
1679              && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)))
1680             || (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 1))
1681                 && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 0))));
1682   else if (NON_COMMUTATIVE_P (x))
1683     return (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
1684             && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)));
1685   else if (UNARY_P (x))
1686     return rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0));
1687
1688   /* Compare the elements.  If any pair of corresponding elements
1689      fail to match, return 0 for the whole things.  */
1690
1691   fmt = GET_RTX_FORMAT (code);
1692   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1693     {
1694       int j;
1695       switch (fmt[i])
1696         {
1697         case 'w':
1698           if (XWINT (x, i) != XWINT (y, i))
1699             return 0;
1700           break;
1701
1702         case 'i':
1703           if (XINT (x, i) != XINT (y, i))
1704             return 0;
1705           break;
1706
1707         case 't':
1708           if (XTREE (x, i) != XTREE (y, i))
1709             return 0;
1710           break;
1711
1712         case 's':
1713           if (strcmp (XSTR (x, i), XSTR (y, i)))
1714             return 0;
1715           break;
1716
1717         case 'e':
1718           if (! rtx_renumbered_equal_p (XEXP (x, i), XEXP (y, i)))
1719             return 0;
1720           break;
1721
1722         case 'u':
1723           if (XEXP (x, i) != XEXP (y, i))
1724             return 0;
1725           /* Fall through.  */
1726         case '0':
1727           break;
1728
1729         case 'E':
1730           if (XVECLEN (x, i) != XVECLEN (y, i))
1731             return 0;
1732           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1733             if (!rtx_renumbered_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)))
1734               return 0;
1735           break;
1736
1737         default:
1738           gcc_unreachable ();
1739         }
1740     }
1741   return 1;
1742 }
1743 \f
1744 /* If X is a hard register or equivalent to one or a subregister of one,
1745    return the hard register number.  If X is a pseudo register that was not
1746    assigned a hard register, return the pseudo register number.  Otherwise,
1747    return -1.  Any rtx is valid for X.  */
1748
1749 int
1750 true_regnum (const_rtx x)
1751 {
1752   if (REG_P (x))
1753     {
1754       if (REGNO (x) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO (x)] >= 0)
1755         return reg_renumber[REGNO (x)];
1756       return REGNO (x);
1757     }
1758   if (GET_CODE (x) == SUBREG)
1759     {
1760       int base = true_regnum (SUBREG_REG (x));
1761       if (base >= 0
1762           && base < FIRST_PSEUDO_REGISTER)
1763         {
1764           struct subreg_info info;
1765
1766           subreg_get_info (REGNO (SUBREG_REG (x)),
1767                            GET_MODE (SUBREG_REG (x)),
1768                            SUBREG_BYTE (x), GET_MODE (x), &info);
1769
1770           if (info.representable_p)
1771             return base + info.offset;
1772         }
1773     }
1774   return -1;
1775 }
1776
1777 /* Return regno of the register REG and handle subregs too.  */
1778 unsigned int
1779 reg_or_subregno (const_rtx reg)
1780 {
1781   if (GET_CODE (reg) == SUBREG)
1782     reg = SUBREG_REG (reg);
1783   gcc_assert (REG_P (reg));
1784   return REGNO (reg);
1785 }