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