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