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