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