Merge trunk version 211672 into gupc branch.
[official-gcc.git] / gcc / jump.c
blob9418f6529fa23aa8f5e67fc210b703c5095ccb0a
1 /* Optimize jump instructions, for GNU compiler.
2 Copyright (C) 1987-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
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.
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.
33 The subroutines redirect_jump and invert_jump are used
34 from other passes as well. */
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40 #include "rtl.h"
41 #include "tm_p.h"
42 #include "flags.h"
43 #include "hard-reg-set.h"
44 #include "regs.h"
45 #include "insn-config.h"
46 #include "insn-attr.h"
47 #include "recog.h"
48 #include "function.h"
49 #include "basic-block.h"
50 #include "expr.h"
51 #include "except.h"
52 #include "diagnostic-core.h"
53 #include "reload.h"
54 #include "predict.h"
55 #include "tree-pass.h"
56 #include "target.h"
58 /* Optimize jump y; x: ... y: jumpif... x?
59 Don't know if it is worth bothering with. */
60 /* Optimize two cases of conditional jump to conditional jump?
61 This can never delete any instruction or make anything dead,
62 or even change what is live at any point.
63 So perhaps let combiner do it. */
65 static void init_label_info (rtx);
66 static void mark_all_labels (rtx);
67 static void mark_jump_label_1 (rtx, rtx, bool, bool);
68 static void mark_jump_label_asm (rtx, rtx);
69 static void redirect_exp_1 (rtx *, rtx, rtx, rtx);
70 static int invert_exp_1 (rtx, rtx);
71 static int returnjump_p_1 (rtx *, void *);
73 /* Worker for rebuild_jump_labels and rebuild_jump_labels_chain. */
74 static void
75 rebuild_jump_labels_1 (rtx f, bool count_forced)
77 rtx insn;
79 timevar_push (TV_REBUILD_JUMP);
80 init_label_info (f);
81 mark_all_labels (f);
83 /* Keep track of labels used from static data; we don't track them
84 closely enough to delete them here, so make sure their reference
85 count doesn't drop to zero. */
87 if (count_forced)
88 for (insn = forced_labels; insn; insn = XEXP (insn, 1))
89 if (LABEL_P (XEXP (insn, 0)))
90 LABEL_NUSES (XEXP (insn, 0))++;
91 timevar_pop (TV_REBUILD_JUMP);
94 /* This function rebuilds the JUMP_LABEL field and REG_LABEL_TARGET
95 notes in jumping insns and REG_LABEL_OPERAND notes in non-jumping
96 instructions and jumping insns that have labels as operands
97 (e.g. cbranchsi4). */
98 void
99 rebuild_jump_labels (rtx f)
101 rebuild_jump_labels_1 (f, true);
104 /* This function is like rebuild_jump_labels, but doesn't run over
105 forced_labels. It can be used on insn chains that aren't the
106 main function chain. */
107 void
108 rebuild_jump_labels_chain (rtx chain)
110 rebuild_jump_labels_1 (chain, false);
113 /* Some old code expects exactly one BARRIER as the NEXT_INSN of a
114 non-fallthru insn. This is not generally true, as multiple barriers
115 may have crept in, or the BARRIER may be separated from the last
116 real insn by one or more NOTEs.
118 This simple pass moves barriers and removes duplicates so that the
119 old code is happy.
121 static unsigned int
122 cleanup_barriers (void)
124 rtx insn, next, prev;
125 for (insn = get_insns (); insn; insn = next)
127 next = NEXT_INSN (insn);
128 if (BARRIER_P (insn))
130 prev = prev_nonnote_insn (insn);
131 if (!prev)
132 continue;
133 if (BARRIER_P (prev))
134 delete_insn (insn);
135 else if (prev != PREV_INSN (insn))
136 reorder_insns_nobb (insn, insn, prev);
139 return 0;
142 namespace {
144 const pass_data pass_data_cleanup_barriers =
146 RTL_PASS, /* type */
147 "barriers", /* name */
148 OPTGROUP_NONE, /* optinfo_flags */
149 true, /* has_execute */
150 TV_NONE, /* tv_id */
151 0, /* properties_required */
152 0, /* properties_provided */
153 0, /* properties_destroyed */
154 0, /* todo_flags_start */
155 0, /* todo_flags_finish */
158 class pass_cleanup_barriers : public rtl_opt_pass
160 public:
161 pass_cleanup_barriers (gcc::context *ctxt)
162 : rtl_opt_pass (pass_data_cleanup_barriers, ctxt)
165 /* opt_pass methods: */
166 virtual unsigned int execute (function *) { return cleanup_barriers (); }
168 }; // class pass_cleanup_barriers
170 } // anon namespace
172 rtl_opt_pass *
173 make_pass_cleanup_barriers (gcc::context *ctxt)
175 return new pass_cleanup_barriers (ctxt);
179 /* Initialize LABEL_NUSES and JUMP_LABEL fields, add REG_LABEL_TARGET
180 for remaining targets for JUMP_P. Delete any REG_LABEL_OPERAND
181 notes whose labels don't occur in the insn any more. */
183 static void
184 init_label_info (rtx f)
186 rtx insn;
188 for (insn = f; insn; insn = NEXT_INSN (insn))
190 if (LABEL_P (insn))
191 LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
193 /* REG_LABEL_TARGET notes (including the JUMP_LABEL field) are
194 sticky and not reset here; that way we won't lose association
195 with a label when e.g. the source for a target register
196 disappears out of reach for targets that may use jump-target
197 registers. Jump transformations are supposed to transform
198 any REG_LABEL_TARGET notes. The target label reference in a
199 branch may disappear from the branch (and from the
200 instruction before it) for other reasons, like register
201 allocation. */
203 if (INSN_P (insn))
205 rtx note, next;
207 for (note = REG_NOTES (insn); note; note = next)
209 next = XEXP (note, 1);
210 if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
211 && ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
212 remove_note (insn, note);
218 /* A subroutine of mark_all_labels. Trivially propagate a simple label
219 load into a jump_insn that uses it. */
221 static void
222 maybe_propagate_label_ref (rtx jump_insn, rtx prev_nonjump_insn)
224 rtx label_note, pc, pc_src;
226 pc = pc_set (jump_insn);
227 pc_src = pc != NULL ? SET_SRC (pc) : NULL;
228 label_note = find_reg_note (prev_nonjump_insn, REG_LABEL_OPERAND, NULL);
230 /* If the previous non-jump insn sets something to a label,
231 something that this jump insn uses, make that label the primary
232 target of this insn if we don't yet have any. That previous
233 insn must be a single_set and not refer to more than one label.
234 The jump insn must not refer to other labels as jump targets
235 and must be a plain (set (pc) ...), maybe in a parallel, and
236 may refer to the item being set only directly or as one of the
237 arms in an IF_THEN_ELSE. */
239 if (label_note != NULL && pc_src != NULL)
241 rtx label_set = single_set (prev_nonjump_insn);
242 rtx label_dest = label_set != NULL ? SET_DEST (label_set) : NULL;
244 if (label_set != NULL
245 /* The source must be the direct LABEL_REF, not a
246 PLUS, UNSPEC, IF_THEN_ELSE etc. */
247 && GET_CODE (SET_SRC (label_set)) == LABEL_REF
248 && (rtx_equal_p (label_dest, pc_src)
249 || (GET_CODE (pc_src) == IF_THEN_ELSE
250 && (rtx_equal_p (label_dest, XEXP (pc_src, 1))
251 || rtx_equal_p (label_dest, XEXP (pc_src, 2))))))
253 /* The CODE_LABEL referred to in the note must be the
254 CODE_LABEL in the LABEL_REF of the "set". We can
255 conveniently use it for the marker function, which
256 requires a LABEL_REF wrapping. */
257 gcc_assert (XEXP (label_note, 0) == XEXP (SET_SRC (label_set), 0));
259 mark_jump_label_1 (label_set, jump_insn, false, true);
261 gcc_assert (JUMP_LABEL (jump_insn) == XEXP (label_note, 0));
266 /* Mark the label each jump jumps to.
267 Combine consecutive labels, and count uses of labels. */
269 static void
270 mark_all_labels (rtx f)
272 rtx insn;
274 if (current_ir_type () == IR_RTL_CFGLAYOUT)
276 basic_block bb;
277 FOR_EACH_BB_FN (bb, cfun)
279 /* In cfglayout mode, we don't bother with trivial next-insn
280 propagation of LABEL_REFs into JUMP_LABEL. This will be
281 handled by other optimizers using better algorithms. */
282 FOR_BB_INSNS (bb, insn)
284 gcc_assert (! INSN_DELETED_P (insn));
285 if (NONDEBUG_INSN_P (insn))
286 mark_jump_label (PATTERN (insn), insn, 0);
289 /* In cfglayout mode, there may be non-insns between the
290 basic blocks. If those non-insns represent tablejump data,
291 they contain label references that we must record. */
292 for (insn = BB_HEADER (bb); insn; insn = NEXT_INSN (insn))
293 if (JUMP_TABLE_DATA_P (insn))
294 mark_jump_label (PATTERN (insn), insn, 0);
295 for (insn = BB_FOOTER (bb); insn; insn = NEXT_INSN (insn))
296 if (JUMP_TABLE_DATA_P (insn))
297 mark_jump_label (PATTERN (insn), insn, 0);
300 else
302 rtx prev_nonjump_insn = NULL;
303 for (insn = f; insn; insn = NEXT_INSN (insn))
305 if (INSN_DELETED_P (insn))
307 else if (LABEL_P (insn))
308 prev_nonjump_insn = NULL;
309 else if (JUMP_TABLE_DATA_P (insn))
310 mark_jump_label (PATTERN (insn), insn, 0);
311 else if (NONDEBUG_INSN_P (insn))
313 mark_jump_label (PATTERN (insn), insn, 0);
314 if (JUMP_P (insn))
316 if (JUMP_LABEL (insn) == NULL && prev_nonjump_insn != NULL)
317 maybe_propagate_label_ref (insn, prev_nonjump_insn);
319 else
320 prev_nonjump_insn = insn;
326 /* Given a comparison (CODE ARG0 ARG1), inside an insn, INSN, return a code
327 of reversed comparison if it is possible to do so. Otherwise return UNKNOWN.
328 UNKNOWN may be returned in case we are having CC_MODE compare and we don't
329 know whether it's source is floating point or integer comparison. Machine
330 description should define REVERSIBLE_CC_MODE and REVERSE_CONDITION macros
331 to help this function avoid overhead in these cases. */
332 enum rtx_code
333 reversed_comparison_code_parts (enum rtx_code code, const_rtx arg0,
334 const_rtx arg1, const_rtx insn)
336 enum machine_mode mode;
338 /* If this is not actually a comparison, we can't reverse it. */
339 if (GET_RTX_CLASS (code) != RTX_COMPARE
340 && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
341 return UNKNOWN;
343 mode = GET_MODE (arg0);
344 if (mode == VOIDmode)
345 mode = GET_MODE (arg1);
347 /* First see if machine description supplies us way to reverse the
348 comparison. Give it priority over everything else to allow
349 machine description to do tricks. */
350 if (GET_MODE_CLASS (mode) == MODE_CC
351 && REVERSIBLE_CC_MODE (mode))
353 #ifdef REVERSE_CONDITION
354 return REVERSE_CONDITION (code, mode);
355 #else
356 return reverse_condition (code);
357 #endif
360 /* Try a few special cases based on the comparison code. */
361 switch (code)
363 case GEU:
364 case GTU:
365 case LEU:
366 case LTU:
367 case NE:
368 case EQ:
369 /* It is always safe to reverse EQ and NE, even for the floating
370 point. Similarly the unsigned comparisons are never used for
371 floating point so we can reverse them in the default way. */
372 return reverse_condition (code);
373 case ORDERED:
374 case UNORDERED:
375 case LTGT:
376 case UNEQ:
377 /* In case we already see unordered comparison, we can be sure to
378 be dealing with floating point so we don't need any more tests. */
379 return reverse_condition_maybe_unordered (code);
380 case UNLT:
381 case UNLE:
382 case UNGT:
383 case UNGE:
384 /* We don't have safe way to reverse these yet. */
385 return UNKNOWN;
386 default:
387 break;
390 if (GET_MODE_CLASS (mode) == MODE_CC || CC0_P (arg0))
392 const_rtx prev;
393 /* Try to search for the comparison to determine the real mode.
394 This code is expensive, but with sane machine description it
395 will be never used, since REVERSIBLE_CC_MODE will return true
396 in all cases. */
397 if (! insn)
398 return UNKNOWN;
400 /* These CONST_CAST's are okay because prev_nonnote_insn just
401 returns its argument and we assign it to a const_rtx
402 variable. */
403 for (prev = prev_nonnote_insn (CONST_CAST_RTX (insn));
404 prev != 0 && !LABEL_P (prev);
405 prev = prev_nonnote_insn (CONST_CAST_RTX (prev)))
407 const_rtx set = set_of (arg0, prev);
408 if (set && GET_CODE (set) == SET
409 && rtx_equal_p (SET_DEST (set), arg0))
411 rtx src = SET_SRC (set);
413 if (GET_CODE (src) == COMPARE)
415 rtx comparison = src;
416 arg0 = XEXP (src, 0);
417 mode = GET_MODE (arg0);
418 if (mode == VOIDmode)
419 mode = GET_MODE (XEXP (comparison, 1));
420 break;
422 /* We can get past reg-reg moves. This may be useful for model
423 of i387 comparisons that first move flag registers around. */
424 if (REG_P (src))
426 arg0 = src;
427 continue;
430 /* If register is clobbered in some ununderstandable way,
431 give up. */
432 if (set)
433 return UNKNOWN;
437 /* Test for an integer condition, or a floating-point comparison
438 in which NaNs can be ignored. */
439 if (CONST_INT_P (arg0)
440 || (GET_MODE (arg0) != VOIDmode
441 && GET_MODE_CLASS (mode) != MODE_CC
442 && !HONOR_NANS (mode)))
443 return reverse_condition (code);
445 return UNKNOWN;
448 /* A wrapper around the previous function to take COMPARISON as rtx
449 expression. This simplifies many callers. */
450 enum rtx_code
451 reversed_comparison_code (const_rtx comparison, const_rtx insn)
453 if (!COMPARISON_P (comparison))
454 return UNKNOWN;
455 return reversed_comparison_code_parts (GET_CODE (comparison),
456 XEXP (comparison, 0),
457 XEXP (comparison, 1), insn);
460 /* Return comparison with reversed code of EXP.
461 Return NULL_RTX in case we fail to do the reversal. */
463 reversed_comparison (const_rtx exp, enum machine_mode mode)
465 enum rtx_code reversed_code = reversed_comparison_code (exp, NULL_RTX);
466 if (reversed_code == UNKNOWN)
467 return NULL_RTX;
468 else
469 return simplify_gen_relational (reversed_code, mode, VOIDmode,
470 XEXP (exp, 0), XEXP (exp, 1));
474 /* Given an rtx-code for a comparison, return the code for the negated
475 comparison. If no such code exists, return UNKNOWN.
477 WATCH OUT! reverse_condition is not safe to use on a jump that might
478 be acting on the results of an IEEE floating point comparison, because
479 of the special treatment of non-signaling nans in comparisons.
480 Use reversed_comparison_code instead. */
482 enum rtx_code
483 reverse_condition (enum rtx_code code)
485 switch (code)
487 case EQ:
488 return NE;
489 case NE:
490 return EQ;
491 case GT:
492 return LE;
493 case GE:
494 return LT;
495 case LT:
496 return GE;
497 case LE:
498 return GT;
499 case GTU:
500 return LEU;
501 case GEU:
502 return LTU;
503 case LTU:
504 return GEU;
505 case LEU:
506 return GTU;
507 case UNORDERED:
508 return ORDERED;
509 case ORDERED:
510 return UNORDERED;
512 case UNLT:
513 case UNLE:
514 case UNGT:
515 case UNGE:
516 case UNEQ:
517 case LTGT:
518 return UNKNOWN;
520 default:
521 gcc_unreachable ();
525 /* Similar, but we're allowed to generate unordered comparisons, which
526 makes it safe for IEEE floating-point. Of course, we have to recognize
527 that the target will support them too... */
529 enum rtx_code
530 reverse_condition_maybe_unordered (enum rtx_code code)
532 switch (code)
534 case EQ:
535 return NE;
536 case NE:
537 return EQ;
538 case GT:
539 return UNLE;
540 case GE:
541 return UNLT;
542 case LT:
543 return UNGE;
544 case LE:
545 return UNGT;
546 case LTGT:
547 return UNEQ;
548 case UNORDERED:
549 return ORDERED;
550 case ORDERED:
551 return UNORDERED;
552 case UNLT:
553 return GE;
554 case UNLE:
555 return GT;
556 case UNGT:
557 return LE;
558 case UNGE:
559 return LT;
560 case UNEQ:
561 return LTGT;
563 default:
564 gcc_unreachable ();
568 /* Similar, but return the code when two operands of a comparison are swapped.
569 This IS safe for IEEE floating-point. */
571 enum rtx_code
572 swap_condition (enum rtx_code code)
574 switch (code)
576 case EQ:
577 case NE:
578 case UNORDERED:
579 case ORDERED:
580 case UNEQ:
581 case LTGT:
582 return code;
584 case GT:
585 return LT;
586 case GE:
587 return LE;
588 case LT:
589 return GT;
590 case LE:
591 return GE;
592 case GTU:
593 return LTU;
594 case GEU:
595 return LEU;
596 case LTU:
597 return GTU;
598 case LEU:
599 return GEU;
600 case UNLT:
601 return UNGT;
602 case UNLE:
603 return UNGE;
604 case UNGT:
605 return UNLT;
606 case UNGE:
607 return UNLE;
609 default:
610 gcc_unreachable ();
614 /* Given a comparison CODE, return the corresponding unsigned comparison.
615 If CODE is an equality comparison or already an unsigned comparison,
616 CODE is returned. */
618 enum rtx_code
619 unsigned_condition (enum rtx_code code)
621 switch (code)
623 case EQ:
624 case NE:
625 case GTU:
626 case GEU:
627 case LTU:
628 case LEU:
629 return code;
631 case GT:
632 return GTU;
633 case GE:
634 return GEU;
635 case LT:
636 return LTU;
637 case LE:
638 return LEU;
640 default:
641 gcc_unreachable ();
645 /* Similarly, return the signed version of a comparison. */
647 enum rtx_code
648 signed_condition (enum rtx_code code)
650 switch (code)
652 case EQ:
653 case NE:
654 case GT:
655 case GE:
656 case LT:
657 case LE:
658 return code;
660 case GTU:
661 return GT;
662 case GEU:
663 return GE;
664 case LTU:
665 return LT;
666 case LEU:
667 return LE;
669 default:
670 gcc_unreachable ();
674 /* Return nonzero if CODE1 is more strict than CODE2, i.e., if the
675 truth of CODE1 implies the truth of CODE2. */
678 comparison_dominates_p (enum rtx_code code1, enum rtx_code code2)
680 /* UNKNOWN comparison codes can happen as a result of trying to revert
681 comparison codes.
682 They can't match anything, so we have to reject them here. */
683 if (code1 == UNKNOWN || code2 == UNKNOWN)
684 return 0;
686 if (code1 == code2)
687 return 1;
689 switch (code1)
691 case UNEQ:
692 if (code2 == UNLE || code2 == UNGE)
693 return 1;
694 break;
696 case EQ:
697 if (code2 == LE || code2 == LEU || code2 == GE || code2 == GEU
698 || code2 == ORDERED)
699 return 1;
700 break;
702 case UNLT:
703 if (code2 == UNLE || code2 == NE)
704 return 1;
705 break;
707 case LT:
708 if (code2 == LE || code2 == NE || code2 == ORDERED || code2 == LTGT)
709 return 1;
710 break;
712 case UNGT:
713 if (code2 == UNGE || code2 == NE)
714 return 1;
715 break;
717 case GT:
718 if (code2 == GE || code2 == NE || code2 == ORDERED || code2 == LTGT)
719 return 1;
720 break;
722 case GE:
723 case LE:
724 if (code2 == ORDERED)
725 return 1;
726 break;
728 case LTGT:
729 if (code2 == NE || code2 == ORDERED)
730 return 1;
731 break;
733 case LTU:
734 if (code2 == LEU || code2 == NE)
735 return 1;
736 break;
738 case GTU:
739 if (code2 == GEU || code2 == NE)
740 return 1;
741 break;
743 case UNORDERED:
744 if (code2 == NE || code2 == UNEQ || code2 == UNLE || code2 == UNLT
745 || code2 == UNGE || code2 == UNGT)
746 return 1;
747 break;
749 default:
750 break;
753 return 0;
756 /* Return 1 if INSN is an unconditional jump and nothing else. */
759 simplejump_p (const_rtx insn)
761 return (JUMP_P (insn)
762 && GET_CODE (PATTERN (insn)) == SET
763 && GET_CODE (SET_DEST (PATTERN (insn))) == PC
764 && GET_CODE (SET_SRC (PATTERN (insn))) == LABEL_REF);
767 /* Return nonzero if INSN is a (possibly) conditional jump
768 and nothing more.
770 Use of this function is deprecated, since we need to support combined
771 branch and compare insns. Use any_condjump_p instead whenever possible. */
774 condjump_p (const_rtx insn)
776 const_rtx x = PATTERN (insn);
778 if (GET_CODE (x) != SET
779 || GET_CODE (SET_DEST (x)) != PC)
780 return 0;
782 x = SET_SRC (x);
783 if (GET_CODE (x) == LABEL_REF)
784 return 1;
785 else
786 return (GET_CODE (x) == IF_THEN_ELSE
787 && ((GET_CODE (XEXP (x, 2)) == PC
788 && (GET_CODE (XEXP (x, 1)) == LABEL_REF
789 || ANY_RETURN_P (XEXP (x, 1))))
790 || (GET_CODE (XEXP (x, 1)) == PC
791 && (GET_CODE (XEXP (x, 2)) == LABEL_REF
792 || ANY_RETURN_P (XEXP (x, 2))))));
795 /* Return nonzero if INSN is a (possibly) conditional jump inside a
796 PARALLEL.
798 Use this function is deprecated, since we need to support combined
799 branch and compare insns. Use any_condjump_p instead whenever possible. */
802 condjump_in_parallel_p (const_rtx insn)
804 const_rtx x = PATTERN (insn);
806 if (GET_CODE (x) != PARALLEL)
807 return 0;
808 else
809 x = XVECEXP (x, 0, 0);
811 if (GET_CODE (x) != SET)
812 return 0;
813 if (GET_CODE (SET_DEST (x)) != PC)
814 return 0;
815 if (GET_CODE (SET_SRC (x)) == LABEL_REF)
816 return 1;
817 if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
818 return 0;
819 if (XEXP (SET_SRC (x), 2) == pc_rtx
820 && (GET_CODE (XEXP (SET_SRC (x), 1)) == LABEL_REF
821 || ANY_RETURN_P (XEXP (SET_SRC (x), 1))))
822 return 1;
823 if (XEXP (SET_SRC (x), 1) == pc_rtx
824 && (GET_CODE (XEXP (SET_SRC (x), 2)) == LABEL_REF
825 || ANY_RETURN_P (XEXP (SET_SRC (x), 2))))
826 return 1;
827 return 0;
830 /* Return set of PC, otherwise NULL. */
833 pc_set (const_rtx insn)
835 rtx pat;
836 if (!JUMP_P (insn))
837 return NULL_RTX;
838 pat = PATTERN (insn);
840 /* The set is allowed to appear either as the insn pattern or
841 the first set in a PARALLEL. */
842 if (GET_CODE (pat) == PARALLEL)
843 pat = XVECEXP (pat, 0, 0);
844 if (GET_CODE (pat) == SET && GET_CODE (SET_DEST (pat)) == PC)
845 return pat;
847 return NULL_RTX;
850 /* Return true when insn is an unconditional direct jump,
851 possibly bundled inside a PARALLEL. */
854 any_uncondjump_p (const_rtx insn)
856 const_rtx x = pc_set (insn);
857 if (!x)
858 return 0;
859 if (GET_CODE (SET_SRC (x)) != LABEL_REF)
860 return 0;
861 if (find_reg_note (insn, REG_NON_LOCAL_GOTO, NULL_RTX))
862 return 0;
863 return 1;
866 /* Return true when insn is a conditional jump. This function works for
867 instructions containing PC sets in PARALLELs. The instruction may have
868 various other effects so before removing the jump you must verify
869 onlyjump_p.
871 Note that unlike condjump_p it returns false for unconditional jumps. */
874 any_condjump_p (const_rtx insn)
876 const_rtx x = pc_set (insn);
877 enum rtx_code a, b;
879 if (!x)
880 return 0;
881 if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
882 return 0;
884 a = GET_CODE (XEXP (SET_SRC (x), 1));
885 b = GET_CODE (XEXP (SET_SRC (x), 2));
887 return ((b == PC && (a == LABEL_REF || a == RETURN || a == SIMPLE_RETURN))
888 || (a == PC
889 && (b == LABEL_REF || b == RETURN || b == SIMPLE_RETURN)));
892 /* Return the label of a conditional jump. */
895 condjump_label (const_rtx insn)
897 rtx x = pc_set (insn);
899 if (!x)
900 return NULL_RTX;
901 x = SET_SRC (x);
902 if (GET_CODE (x) == LABEL_REF)
903 return x;
904 if (GET_CODE (x) != IF_THEN_ELSE)
905 return NULL_RTX;
906 if (XEXP (x, 2) == pc_rtx && GET_CODE (XEXP (x, 1)) == LABEL_REF)
907 return XEXP (x, 1);
908 if (XEXP (x, 1) == pc_rtx && GET_CODE (XEXP (x, 2)) == LABEL_REF)
909 return XEXP (x, 2);
910 return NULL_RTX;
913 /* Return true if INSN is a (possibly conditional) return insn. */
915 static int
916 returnjump_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
918 rtx x = *loc;
920 if (x == NULL)
921 return false;
923 switch (GET_CODE (x))
925 case RETURN:
926 case SIMPLE_RETURN:
927 case EH_RETURN:
928 return true;
930 case SET:
931 return SET_IS_RETURN_P (x);
933 default:
934 return false;
938 /* Return TRUE if INSN is a return jump. */
941 returnjump_p (rtx insn)
943 if (!JUMP_P (insn))
944 return 0;
945 return for_each_rtx (&PATTERN (insn), returnjump_p_1, NULL);
948 /* Return true if INSN is a (possibly conditional) return insn. */
950 static int
951 eh_returnjump_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
953 return *loc && GET_CODE (*loc) == EH_RETURN;
957 eh_returnjump_p (rtx insn)
959 if (!JUMP_P (insn))
960 return 0;
961 return for_each_rtx (&PATTERN (insn), eh_returnjump_p_1, NULL);
964 /* Return true if INSN is a jump that only transfers control and
965 nothing more. */
968 onlyjump_p (const_rtx insn)
970 rtx set;
972 if (!JUMP_P (insn))
973 return 0;
975 set = single_set (insn);
976 if (set == NULL)
977 return 0;
978 if (GET_CODE (SET_DEST (set)) != PC)
979 return 0;
980 if (side_effects_p (SET_SRC (set)))
981 return 0;
983 return 1;
986 /* Return true iff INSN is a jump and its JUMP_LABEL is a label, not
987 NULL or a return. */
988 bool
989 jump_to_label_p (rtx insn)
991 return (JUMP_P (insn)
992 && JUMP_LABEL (insn) != NULL && !ANY_RETURN_P (JUMP_LABEL (insn)));
995 #ifdef HAVE_cc0
997 /* Return nonzero if X is an RTX that only sets the condition codes
998 and has no side effects. */
1001 only_sets_cc0_p (const_rtx x)
1003 if (! x)
1004 return 0;
1006 if (INSN_P (x))
1007 x = PATTERN (x);
1009 return sets_cc0_p (x) == 1 && ! side_effects_p (x);
1012 /* Return 1 if X is an RTX that does nothing but set the condition codes
1013 and CLOBBER or USE registers.
1014 Return -1 if X does explicitly set the condition codes,
1015 but also does other things. */
1018 sets_cc0_p (const_rtx x)
1020 if (! x)
1021 return 0;
1023 if (INSN_P (x))
1024 x = PATTERN (x);
1026 if (GET_CODE (x) == SET && SET_DEST (x) == cc0_rtx)
1027 return 1;
1028 if (GET_CODE (x) == PARALLEL)
1030 int i;
1031 int sets_cc0 = 0;
1032 int other_things = 0;
1033 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
1035 if (GET_CODE (XVECEXP (x, 0, i)) == SET
1036 && SET_DEST (XVECEXP (x, 0, i)) == cc0_rtx)
1037 sets_cc0 = 1;
1038 else if (GET_CODE (XVECEXP (x, 0, i)) == SET)
1039 other_things = 1;
1041 return ! sets_cc0 ? 0 : other_things ? -1 : 1;
1043 return 0;
1045 #endif
1047 /* Find all CODE_LABELs referred to in X, and increment their use
1048 counts. If INSN is a JUMP_INSN and there is at least one
1049 CODE_LABEL referenced in INSN as a jump target, then store the last
1050 one in JUMP_LABEL (INSN). For a tablejump, this must be the label
1051 for the ADDR_VEC. Store any other jump targets as REG_LABEL_TARGET
1052 notes. If INSN is an INSN or a CALL_INSN or non-target operands of
1053 a JUMP_INSN, and there is at least one CODE_LABEL referenced in
1054 INSN, add a REG_LABEL_OPERAND note containing that label to INSN.
1055 For returnjumps, the JUMP_LABEL will also be set as appropriate.
1057 Note that two labels separated by a loop-beginning note
1058 must be kept distinct if we have not yet done loop-optimization,
1059 because the gap between them is where loop-optimize
1060 will want to move invariant code to. CROSS_JUMP tells us
1061 that loop-optimization is done with. */
1063 void
1064 mark_jump_label (rtx x, rtx insn, int in_mem)
1066 rtx asmop = extract_asm_operands (x);
1067 if (asmop)
1068 mark_jump_label_asm (asmop, insn);
1069 else
1070 mark_jump_label_1 (x, insn, in_mem != 0,
1071 (insn != NULL && x == PATTERN (insn) && JUMP_P (insn)));
1074 /* Worker function for mark_jump_label. IN_MEM is TRUE when X occurs
1075 within a (MEM ...). IS_TARGET is TRUE when X is to be treated as a
1076 jump-target; when the JUMP_LABEL field of INSN should be set or a
1077 REG_LABEL_TARGET note should be added, not a REG_LABEL_OPERAND
1078 note. */
1080 static void
1081 mark_jump_label_1 (rtx x, rtx insn, bool in_mem, bool is_target)
1083 RTX_CODE code = GET_CODE (x);
1084 int i;
1085 const char *fmt;
1087 switch (code)
1089 case PC:
1090 case CC0:
1091 case REG:
1092 case CLOBBER:
1093 case CALL:
1094 return;
1096 case RETURN:
1097 case SIMPLE_RETURN:
1098 if (is_target)
1100 gcc_assert (JUMP_LABEL (insn) == NULL || JUMP_LABEL (insn) == x);
1101 JUMP_LABEL (insn) = x;
1103 return;
1105 case MEM:
1106 in_mem = true;
1107 break;
1109 case SEQUENCE:
1110 for (i = 0; i < XVECLEN (x, 0); i++)
1111 mark_jump_label (PATTERN (XVECEXP (x, 0, i)),
1112 XVECEXP (x, 0, i), 0);
1113 return;
1115 case SYMBOL_REF:
1116 if (!in_mem)
1117 return;
1119 /* If this is a constant-pool reference, see if it is a label. */
1120 if (CONSTANT_POOL_ADDRESS_P (x))
1121 mark_jump_label_1 (get_pool_constant (x), insn, in_mem, is_target);
1122 break;
1124 /* Handle operands in the condition of an if-then-else as for a
1125 non-jump insn. */
1126 case IF_THEN_ELSE:
1127 if (!is_target)
1128 break;
1129 mark_jump_label_1 (XEXP (x, 0), insn, in_mem, false);
1130 mark_jump_label_1 (XEXP (x, 1), insn, in_mem, true);
1131 mark_jump_label_1 (XEXP (x, 2), insn, in_mem, true);
1132 return;
1134 case LABEL_REF:
1136 rtx label = XEXP (x, 0);
1138 /* Ignore remaining references to unreachable labels that
1139 have been deleted. */
1140 if (NOTE_P (label)
1141 && NOTE_KIND (label) == NOTE_INSN_DELETED_LABEL)
1142 break;
1144 gcc_assert (LABEL_P (label));
1146 /* Ignore references to labels of containing functions. */
1147 if (LABEL_REF_NONLOCAL_P (x))
1148 break;
1150 XEXP (x, 0) = label;
1151 if (! insn || ! INSN_DELETED_P (insn))
1152 ++LABEL_NUSES (label);
1154 if (insn)
1156 if (is_target
1157 /* Do not change a previous setting of JUMP_LABEL. If the
1158 JUMP_LABEL slot is occupied by a different label,
1159 create a note for this label. */
1160 && (JUMP_LABEL (insn) == NULL || JUMP_LABEL (insn) == label))
1161 JUMP_LABEL (insn) = label;
1162 else
1164 enum reg_note kind
1165 = is_target ? REG_LABEL_TARGET : REG_LABEL_OPERAND;
1167 /* Add a REG_LABEL_OPERAND or REG_LABEL_TARGET note
1168 for LABEL unless there already is one. All uses of
1169 a label, except for the primary target of a jump,
1170 must have such a note. */
1171 if (! find_reg_note (insn, kind, label))
1172 add_reg_note (insn, kind, label);
1175 return;
1178 /* Do walk the labels in a vector, but not the first operand of an
1179 ADDR_DIFF_VEC. Don't set the JUMP_LABEL of a vector. */
1180 case ADDR_VEC:
1181 case ADDR_DIFF_VEC:
1182 if (! INSN_DELETED_P (insn))
1184 int eltnum = code == ADDR_DIFF_VEC ? 1 : 0;
1186 for (i = 0; i < XVECLEN (x, eltnum); i++)
1187 mark_jump_label_1 (XVECEXP (x, eltnum, i), NULL_RTX, in_mem,
1188 is_target);
1190 return;
1192 default:
1193 break;
1196 fmt = GET_RTX_FORMAT (code);
1198 /* The primary target of a tablejump is the label of the ADDR_VEC,
1199 which is canonically mentioned *last* in the insn. To get it
1200 marked as JUMP_LABEL, we iterate over items in reverse order. */
1201 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1203 if (fmt[i] == 'e')
1204 mark_jump_label_1 (XEXP (x, i), insn, in_mem, is_target);
1205 else if (fmt[i] == 'E')
1207 int j;
1209 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1210 mark_jump_label_1 (XVECEXP (x, i, j), insn, in_mem,
1211 is_target);
1216 /* Worker function for mark_jump_label. Handle asm insns specially.
1217 In particular, output operands need not be considered so we can
1218 avoid re-scanning the replicated asm_operand. Also, the asm_labels
1219 need to be considered targets. */
1221 static void
1222 mark_jump_label_asm (rtx asmop, rtx insn)
1224 int i;
1226 for (i = ASM_OPERANDS_INPUT_LENGTH (asmop) - 1; i >= 0; --i)
1227 mark_jump_label_1 (ASM_OPERANDS_INPUT (asmop, i), insn, false, false);
1229 for (i = ASM_OPERANDS_LABEL_LENGTH (asmop) - 1; i >= 0; --i)
1230 mark_jump_label_1 (ASM_OPERANDS_LABEL (asmop, i), insn, false, true);
1233 /* Delete insn INSN from the chain of insns and update label ref counts
1234 and delete insns now unreachable.
1236 Returns the first insn after INSN that was not deleted.
1238 Usage of this instruction is deprecated. Use delete_insn instead and
1239 subsequent cfg_cleanup pass to delete unreachable code if needed. */
1242 delete_related_insns (rtx insn)
1244 int was_code_label = (LABEL_P (insn));
1245 rtx note;
1246 rtx next = NEXT_INSN (insn), prev = PREV_INSN (insn);
1248 while (next && INSN_DELETED_P (next))
1249 next = NEXT_INSN (next);
1251 /* This insn is already deleted => return first following nondeleted. */
1252 if (INSN_DELETED_P (insn))
1253 return next;
1255 delete_insn (insn);
1257 /* If instruction is followed by a barrier,
1258 delete the barrier too. */
1260 if (next != 0 && BARRIER_P (next))
1261 delete_insn (next);
1263 /* If this is a call, then we have to remove the var tracking note
1264 for the call arguments. */
1266 if (CALL_P (insn)
1267 || (NONJUMP_INSN_P (insn)
1268 && GET_CODE (PATTERN (insn)) == SEQUENCE
1269 && CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
1271 rtx p;
1273 for (p = next && INSN_DELETED_P (next) ? NEXT_INSN (next) : next;
1274 p && NOTE_P (p);
1275 p = NEXT_INSN (p))
1276 if (NOTE_KIND (p) == NOTE_INSN_CALL_ARG_LOCATION)
1278 remove_insn (p);
1279 break;
1283 /* If deleting a jump, decrement the count of the label,
1284 and delete the label if it is now unused. */
1286 if (jump_to_label_p (insn))
1288 rtx lab = JUMP_LABEL (insn), lab_next;
1290 if (LABEL_NUSES (lab) == 0)
1291 /* This can delete NEXT or PREV,
1292 either directly if NEXT is JUMP_LABEL (INSN),
1293 or indirectly through more levels of jumps. */
1294 delete_related_insns (lab);
1295 else if (tablejump_p (insn, NULL, &lab_next))
1297 /* If we're deleting the tablejump, delete the dispatch table.
1298 We may not be able to kill the label immediately preceding
1299 just yet, as it might be referenced in code leading up to
1300 the tablejump. */
1301 delete_related_insns (lab_next);
1305 /* Likewise if we're deleting a dispatch table. */
1307 if (JUMP_TABLE_DATA_P (insn))
1309 rtx pat = PATTERN (insn);
1310 int i, diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
1311 int len = XVECLEN (pat, diff_vec_p);
1313 for (i = 0; i < len; i++)
1314 if (LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0)) == 0)
1315 delete_related_insns (XEXP (XVECEXP (pat, diff_vec_p, i), 0));
1316 while (next && INSN_DELETED_P (next))
1317 next = NEXT_INSN (next);
1318 return next;
1321 /* Likewise for any JUMP_P / INSN / CALL_INSN with a
1322 REG_LABEL_OPERAND or REG_LABEL_TARGET note. */
1323 if (INSN_P (insn))
1324 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1325 if ((REG_NOTE_KIND (note) == REG_LABEL_OPERAND
1326 || REG_NOTE_KIND (note) == REG_LABEL_TARGET)
1327 /* This could also be a NOTE_INSN_DELETED_LABEL note. */
1328 && LABEL_P (XEXP (note, 0)))
1329 if (LABEL_NUSES (XEXP (note, 0)) == 0)
1330 delete_related_insns (XEXP (note, 0));
1332 while (prev && (INSN_DELETED_P (prev) || NOTE_P (prev)))
1333 prev = PREV_INSN (prev);
1335 /* If INSN was a label and a dispatch table follows it,
1336 delete the dispatch table. The tablejump must have gone already.
1337 It isn't useful to fall through into a table. */
1339 if (was_code_label
1340 && NEXT_INSN (insn) != 0
1341 && JUMP_TABLE_DATA_P (NEXT_INSN (insn)))
1342 next = delete_related_insns (NEXT_INSN (insn));
1344 /* If INSN was a label, delete insns following it if now unreachable. */
1346 if (was_code_label && prev && BARRIER_P (prev))
1348 enum rtx_code code;
1349 while (next)
1351 code = GET_CODE (next);
1352 if (code == NOTE)
1353 next = NEXT_INSN (next);
1354 /* Keep going past other deleted labels to delete what follows. */
1355 else if (code == CODE_LABEL && INSN_DELETED_P (next))
1356 next = NEXT_INSN (next);
1357 /* Keep the (use (insn))s created by dbr_schedule, which needs
1358 them in order to track liveness relative to a previous
1359 barrier. */
1360 else if (INSN_P (next)
1361 && GET_CODE (PATTERN (next)) == USE
1362 && INSN_P (XEXP (PATTERN (next), 0)))
1363 next = NEXT_INSN (next);
1364 else if (code == BARRIER || INSN_P (next))
1365 /* Note: if this deletes a jump, it can cause more
1366 deletion of unreachable code, after a different label.
1367 As long as the value from this recursive call is correct,
1368 this invocation functions correctly. */
1369 next = delete_related_insns (next);
1370 else
1371 break;
1375 /* I feel a little doubtful about this loop,
1376 but I see no clean and sure alternative way
1377 to find the first insn after INSN that is not now deleted.
1378 I hope this works. */
1379 while (next && INSN_DELETED_P (next))
1380 next = NEXT_INSN (next);
1381 return next;
1384 /* Delete a range of insns from FROM to TO, inclusive.
1385 This is for the sake of peephole optimization, so assume
1386 that whatever these insns do will still be done by a new
1387 peephole insn that will replace them. */
1389 void
1390 delete_for_peephole (rtx from, rtx to)
1392 rtx insn = from;
1394 while (1)
1396 rtx next = NEXT_INSN (insn);
1397 rtx prev = PREV_INSN (insn);
1399 if (!NOTE_P (insn))
1401 INSN_DELETED_P (insn) = 1;
1403 /* Patch this insn out of the chain. */
1404 /* We don't do this all at once, because we
1405 must preserve all NOTEs. */
1406 if (prev)
1407 NEXT_INSN (prev) = next;
1409 if (next)
1410 PREV_INSN (next) = prev;
1413 if (insn == to)
1414 break;
1415 insn = next;
1418 /* Note that if TO is an unconditional jump
1419 we *do not* delete the BARRIER that follows,
1420 since the peephole that replaces this sequence
1421 is also an unconditional jump in that case. */
1424 /* A helper function for redirect_exp_1; examines its input X and returns
1425 either a LABEL_REF around a label, or a RETURN if X was NULL. */
1426 static rtx
1427 redirect_target (rtx x)
1429 if (x == NULL_RTX)
1430 return ret_rtx;
1431 if (!ANY_RETURN_P (x))
1432 return gen_rtx_LABEL_REF (Pmode, x);
1433 return x;
1436 /* Throughout LOC, redirect OLABEL to NLABEL. Treat null OLABEL or
1437 NLABEL as a return. Accrue modifications into the change group. */
1439 static void
1440 redirect_exp_1 (rtx *loc, rtx olabel, rtx nlabel, rtx insn)
1442 rtx x = *loc;
1443 RTX_CODE code = GET_CODE (x);
1444 int i;
1445 const char *fmt;
1447 if ((code == LABEL_REF && XEXP (x, 0) == olabel)
1448 || x == olabel)
1450 x = redirect_target (nlabel);
1451 if (GET_CODE (x) == LABEL_REF && loc == &PATTERN (insn))
1452 x = gen_rtx_SET (VOIDmode, pc_rtx, x);
1453 validate_change (insn, loc, x, 1);
1454 return;
1457 if (code == SET && SET_DEST (x) == pc_rtx
1458 && ANY_RETURN_P (nlabel)
1459 && GET_CODE (SET_SRC (x)) == LABEL_REF
1460 && XEXP (SET_SRC (x), 0) == olabel)
1462 validate_change (insn, loc, nlabel, 1);
1463 return;
1466 if (code == IF_THEN_ELSE)
1468 /* Skip the condition of an IF_THEN_ELSE. We only want to
1469 change jump destinations, not eventual label comparisons. */
1470 redirect_exp_1 (&XEXP (x, 1), olabel, nlabel, insn);
1471 redirect_exp_1 (&XEXP (x, 2), olabel, nlabel, insn);
1472 return;
1475 fmt = GET_RTX_FORMAT (code);
1476 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1478 if (fmt[i] == 'e')
1479 redirect_exp_1 (&XEXP (x, i), olabel, nlabel, insn);
1480 else if (fmt[i] == 'E')
1482 int j;
1483 for (j = 0; j < XVECLEN (x, i); j++)
1484 redirect_exp_1 (&XVECEXP (x, i, j), olabel, nlabel, insn);
1489 /* Make JUMP go to NLABEL instead of where it jumps now. Accrue
1490 the modifications into the change group. Return false if we did
1491 not see how to do that. */
1494 redirect_jump_1 (rtx jump, rtx nlabel)
1496 int ochanges = num_validated_changes ();
1497 rtx *loc, asmop;
1499 gcc_assert (nlabel != NULL_RTX);
1500 asmop = extract_asm_operands (PATTERN (jump));
1501 if (asmop)
1503 if (nlabel == NULL)
1504 return 0;
1505 gcc_assert (ASM_OPERANDS_LABEL_LENGTH (asmop) == 1);
1506 loc = &ASM_OPERANDS_LABEL (asmop, 0);
1508 else if (GET_CODE (PATTERN (jump)) == PARALLEL)
1509 loc = &XVECEXP (PATTERN (jump), 0, 0);
1510 else
1511 loc = &PATTERN (jump);
1513 redirect_exp_1 (loc, JUMP_LABEL (jump), nlabel, jump);
1514 return num_validated_changes () > ochanges;
1517 /* Make JUMP go to NLABEL instead of where it jumps now. If the old
1518 jump target label is unused as a result, it and the code following
1519 it may be deleted.
1521 Normally, NLABEL will be a label, but it may also be a RETURN rtx;
1522 in that case we are to turn the jump into a (possibly conditional)
1523 return insn.
1525 The return value will be 1 if the change was made, 0 if it wasn't
1526 (this can only occur when trying to produce return insns). */
1529 redirect_jump (rtx jump, rtx nlabel, int delete_unused)
1531 rtx olabel = JUMP_LABEL (jump);
1533 if (!nlabel)
1535 /* If there is no label, we are asked to redirect to the EXIT block.
1536 When before the epilogue is emitted, return/simple_return cannot be
1537 created so we return 0 immediately. After the epilogue is emitted,
1538 we always expect a label, either a non-null label, or a
1539 return/simple_return RTX. */
1541 if (!epilogue_completed)
1542 return 0;
1543 gcc_unreachable ();
1546 if (nlabel == olabel)
1547 return 1;
1549 if (! redirect_jump_1 (jump, nlabel) || ! apply_change_group ())
1550 return 0;
1552 redirect_jump_2 (jump, olabel, nlabel, delete_unused, 0);
1553 return 1;
1556 /* Fix up JUMP_LABEL and label ref counts after OLABEL has been replaced with
1557 NLABEL in JUMP.
1558 If DELETE_UNUSED is positive, delete related insn to OLABEL if its ref
1559 count has dropped to zero. */
1560 void
1561 redirect_jump_2 (rtx jump, rtx olabel, rtx nlabel, int delete_unused,
1562 int invert)
1564 rtx note;
1566 gcc_assert (JUMP_LABEL (jump) == olabel);
1568 /* Negative DELETE_UNUSED used to be used to signalize behavior on
1569 moving FUNCTION_END note. Just sanity check that no user still worry
1570 about this. */
1571 gcc_assert (delete_unused >= 0);
1572 JUMP_LABEL (jump) = nlabel;
1573 if (!ANY_RETURN_P (nlabel))
1574 ++LABEL_NUSES (nlabel);
1576 /* Update labels in any REG_EQUAL note. */
1577 if ((note = find_reg_note (jump, REG_EQUAL, NULL_RTX)) != NULL_RTX)
1579 if (ANY_RETURN_P (nlabel)
1580 || (invert && !invert_exp_1 (XEXP (note, 0), jump)))
1581 remove_note (jump, note);
1582 else
1584 redirect_exp_1 (&XEXP (note, 0), olabel, nlabel, jump);
1585 confirm_change_group ();
1589 /* Handle the case where we had a conditional crossing jump to a return
1590 label and are now changing it into a direct conditional return.
1591 The jump is no longer crossing in that case. */
1592 if (ANY_RETURN_P (nlabel))
1593 CROSSING_JUMP_P (jump) = 0;
1595 if (!ANY_RETURN_P (olabel)
1596 && --LABEL_NUSES (olabel) == 0 && delete_unused > 0
1597 /* Undefined labels will remain outside the insn stream. */
1598 && INSN_UID (olabel))
1599 delete_related_insns (olabel);
1600 if (invert)
1601 invert_br_probabilities (jump);
1604 /* Invert the jump condition X contained in jump insn INSN. Accrue the
1605 modifications into the change group. Return nonzero for success. */
1606 static int
1607 invert_exp_1 (rtx x, rtx insn)
1609 RTX_CODE code = GET_CODE (x);
1611 if (code == IF_THEN_ELSE)
1613 rtx comp = XEXP (x, 0);
1614 rtx tem;
1615 enum rtx_code reversed_code;
1617 /* We can do this in two ways: The preferable way, which can only
1618 be done if this is not an integer comparison, is to reverse
1619 the comparison code. Otherwise, swap the THEN-part and ELSE-part
1620 of the IF_THEN_ELSE. If we can't do either, fail. */
1622 reversed_code = reversed_comparison_code (comp, insn);
1624 if (reversed_code != UNKNOWN)
1626 validate_change (insn, &XEXP (x, 0),
1627 gen_rtx_fmt_ee (reversed_code,
1628 GET_MODE (comp), XEXP (comp, 0),
1629 XEXP (comp, 1)),
1631 return 1;
1634 tem = XEXP (x, 1);
1635 validate_change (insn, &XEXP (x, 1), XEXP (x, 2), 1);
1636 validate_change (insn, &XEXP (x, 2), tem, 1);
1637 return 1;
1639 else
1640 return 0;
1643 /* Invert the condition of the jump JUMP, and make it jump to label
1644 NLABEL instead of where it jumps now. Accrue changes into the
1645 change group. Return false if we didn't see how to perform the
1646 inversion and redirection. */
1649 invert_jump_1 (rtx jump, rtx nlabel)
1651 rtx x = pc_set (jump);
1652 int ochanges;
1653 int ok;
1655 ochanges = num_validated_changes ();
1656 if (x == NULL)
1657 return 0;
1658 ok = invert_exp_1 (SET_SRC (x), jump);
1659 gcc_assert (ok);
1661 if (num_validated_changes () == ochanges)
1662 return 0;
1664 /* redirect_jump_1 will fail of nlabel == olabel, and the current use is
1665 in Pmode, so checking this is not merely an optimization. */
1666 return nlabel == JUMP_LABEL (jump) || redirect_jump_1 (jump, nlabel);
1669 /* Invert the condition of the jump JUMP, and make it jump to label
1670 NLABEL instead of where it jumps now. Return true if successful. */
1673 invert_jump (rtx jump, rtx nlabel, int delete_unused)
1675 rtx olabel = JUMP_LABEL (jump);
1677 if (invert_jump_1 (jump, nlabel) && apply_change_group ())
1679 redirect_jump_2 (jump, olabel, nlabel, delete_unused, 1);
1680 return 1;
1682 cancel_changes (0);
1683 return 0;
1687 /* Like rtx_equal_p except that it considers two REGs as equal
1688 if they renumber to the same value and considers two commutative
1689 operations to be the same if the order of the operands has been
1690 reversed. */
1693 rtx_renumbered_equal_p (const_rtx x, const_rtx y)
1695 int i;
1696 const enum rtx_code code = GET_CODE (x);
1697 const char *fmt;
1699 if (x == y)
1700 return 1;
1702 if ((code == REG || (code == SUBREG && REG_P (SUBREG_REG (x))))
1703 && (REG_P (y) || (GET_CODE (y) == SUBREG
1704 && REG_P (SUBREG_REG (y)))))
1706 int reg_x = -1, reg_y = -1;
1707 int byte_x = 0, byte_y = 0;
1708 struct subreg_info info;
1710 if (GET_MODE (x) != GET_MODE (y))
1711 return 0;
1713 /* If we haven't done any renumbering, don't
1714 make any assumptions. */
1715 if (reg_renumber == 0)
1716 return rtx_equal_p (x, y);
1718 if (code == SUBREG)
1720 reg_x = REGNO (SUBREG_REG (x));
1721 byte_x = SUBREG_BYTE (x);
1723 if (reg_renumber[reg_x] >= 0)
1725 subreg_get_info (reg_renumber[reg_x],
1726 GET_MODE (SUBREG_REG (x)), byte_x,
1727 GET_MODE (x), &info);
1728 if (!info.representable_p)
1729 return 0;
1730 reg_x = info.offset;
1731 byte_x = 0;
1734 else
1736 reg_x = REGNO (x);
1737 if (reg_renumber[reg_x] >= 0)
1738 reg_x = reg_renumber[reg_x];
1741 if (GET_CODE (y) == SUBREG)
1743 reg_y = REGNO (SUBREG_REG (y));
1744 byte_y = SUBREG_BYTE (y);
1746 if (reg_renumber[reg_y] >= 0)
1748 subreg_get_info (reg_renumber[reg_y],
1749 GET_MODE (SUBREG_REG (y)), byte_y,
1750 GET_MODE (y), &info);
1751 if (!info.representable_p)
1752 return 0;
1753 reg_y = info.offset;
1754 byte_y = 0;
1757 else
1759 reg_y = REGNO (y);
1760 if (reg_renumber[reg_y] >= 0)
1761 reg_y = reg_renumber[reg_y];
1764 return reg_x >= 0 && reg_x == reg_y && byte_x == byte_y;
1767 /* Now we have disposed of all the cases
1768 in which different rtx codes can match. */
1769 if (code != GET_CODE (y))
1770 return 0;
1772 switch (code)
1774 case PC:
1775 case CC0:
1776 case ADDR_VEC:
1777 case ADDR_DIFF_VEC:
1778 CASE_CONST_UNIQUE:
1779 return 0;
1781 case LABEL_REF:
1782 /* We can't assume nonlocal labels have their following insns yet. */
1783 if (LABEL_REF_NONLOCAL_P (x) || LABEL_REF_NONLOCAL_P (y))
1784 return XEXP (x, 0) == XEXP (y, 0);
1786 /* Two label-refs are equivalent if they point at labels
1787 in the same position in the instruction stream. */
1788 return (next_real_insn (XEXP (x, 0))
1789 == next_real_insn (XEXP (y, 0)));
1791 case SYMBOL_REF:
1792 return XSTR (x, 0) == XSTR (y, 0);
1794 case CODE_LABEL:
1795 /* If we didn't match EQ equality above, they aren't the same. */
1796 return 0;
1798 default:
1799 break;
1802 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */
1804 if (GET_MODE (x) != GET_MODE (y))
1805 return 0;
1807 /* MEMs referring to different address space are not equivalent. */
1808 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
1809 return 0;
1811 /* For commutative operations, the RTX match if the operand match in any
1812 order. Also handle the simple binary and unary cases without a loop. */
1813 if (targetm.commutative_p (x, UNKNOWN))
1814 return ((rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
1815 && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)))
1816 || (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 1))
1817 && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 0))));
1818 else if (NON_COMMUTATIVE_P (x))
1819 return (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
1820 && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)));
1821 else if (UNARY_P (x))
1822 return rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0));
1824 /* Compare the elements. If any pair of corresponding elements
1825 fail to match, return 0 for the whole things. */
1827 fmt = GET_RTX_FORMAT (code);
1828 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1830 int j;
1831 switch (fmt[i])
1833 case 'w':
1834 if (XWINT (x, i) != XWINT (y, i))
1835 return 0;
1836 break;
1838 case 'i':
1839 if (XINT (x, i) != XINT (y, i))
1841 if (((code == ASM_OPERANDS && i == 6)
1842 || (code == ASM_INPUT && i == 1)))
1843 break;
1844 return 0;
1846 break;
1848 case 't':
1849 if (XTREE (x, i) != XTREE (y, i))
1850 return 0;
1851 break;
1853 case 's':
1854 if (strcmp (XSTR (x, i), XSTR (y, i)))
1855 return 0;
1856 break;
1858 case 'e':
1859 if (! rtx_renumbered_equal_p (XEXP (x, i), XEXP (y, i)))
1860 return 0;
1861 break;
1863 case 'u':
1864 if (XEXP (x, i) != XEXP (y, i))
1865 return 0;
1866 /* Fall through. */
1867 case '0':
1868 break;
1870 case 'E':
1871 if (XVECLEN (x, i) != XVECLEN (y, i))
1872 return 0;
1873 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1874 if (!rtx_renumbered_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)))
1875 return 0;
1876 break;
1878 default:
1879 gcc_unreachable ();
1882 return 1;
1885 /* If X is a hard register or equivalent to one or a subregister of one,
1886 return the hard register number. If X is a pseudo register that was not
1887 assigned a hard register, return the pseudo register number. Otherwise,
1888 return -1. Any rtx is valid for X. */
1891 true_regnum (const_rtx x)
1893 if (REG_P (x))
1895 if (REGNO (x) >= FIRST_PSEUDO_REGISTER
1896 && (lra_in_progress || reg_renumber[REGNO (x)] >= 0))
1897 return reg_renumber[REGNO (x)];
1898 return REGNO (x);
1900 if (GET_CODE (x) == SUBREG)
1902 int base = true_regnum (SUBREG_REG (x));
1903 if (base >= 0
1904 && base < FIRST_PSEUDO_REGISTER)
1906 struct subreg_info info;
1908 subreg_get_info (lra_in_progress
1909 ? (unsigned) base : REGNO (SUBREG_REG (x)),
1910 GET_MODE (SUBREG_REG (x)),
1911 SUBREG_BYTE (x), GET_MODE (x), &info);
1913 if (info.representable_p)
1914 return base + info.offset;
1917 return -1;
1920 /* Return regno of the register REG and handle subregs too. */
1921 unsigned int
1922 reg_or_subregno (const_rtx reg)
1924 if (GET_CODE (reg) == SUBREG)
1925 reg = SUBREG_REG (reg);
1926 gcc_assert (REG_P (reg));
1927 return REGNO (reg);