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