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