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