1 /* Control flow optimization code for GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 /* This file contains optimizer of the control flow. The main entrypoint is
23 cleanup_cfg. Following optimizations are performed:
25 - Unreachable blocks removal
26 - Edge forwarding (edge to the forwarder block is forwarded to it's
27 succesor. Simplification of the branch instruction is performed by
28 underlying infrastructure so branch can be converted to simplejump or
30 - Cross jumping (tail merging)
31 - Conditional jump-around-simplejump simplification
32 - Basic block merging. */
37 #include "hard-reg-set.h"
38 #include "basic-block.h"
41 #include "insn-config.h"
48 /* cleanup_cfg maitains following flags for each basic block. */
50 /* Set if life info needs to be recomputed for given BB. */
52 /* Set if BB is the forwarder block to avoid too many
53 forwarder_block_p calls. */
54 BB_FORWARDER_BLOCK = 2
57 #define BB_FLAGS(bb) (enum bb_flags)(bb)->aux
58 #define BB_SET_FLAG(bb,flag) \
59 (bb)->aux = (void *) (long) ((enum bb_flags)(bb)->aux | (flag))
60 #define BB_CLEAR_FLAG(bb,flag) \
61 (bb)->aux = (void *) (long) ((enum bb_flags)(bb)->aux & ~(flag))
63 #define FORWARDER_BLOCK_P(bb) (BB_FLAGS(bb) & BB_FORWARDER_BLOCK)
65 static bool try_crossjump_to_edge PARAMS ((int, edge, edge));
66 static bool try_crossjump_bb PARAMS ((int, basic_block));
67 static bool outgoing_edges_match PARAMS ((basic_block, basic_block));
68 static int flow_find_cross_jump PARAMS ((int, basic_block, basic_block,
71 static bool delete_unreachable_blocks PARAMS ((void));
72 static bool tail_recursion_label_p PARAMS ((rtx));
73 static void merge_blocks_move_predecessor_nojumps PARAMS ((basic_block,
75 static void merge_blocks_move_successor_nojumps PARAMS ((basic_block,
77 static bool merge_blocks PARAMS ((edge,basic_block,basic_block,
79 static bool try_optimize_cfg PARAMS ((int));
80 static bool try_simplify_condjump PARAMS ((basic_block));
81 static bool try_forward_edges PARAMS ((int, basic_block));
82 static void notice_new_block PARAMS ((basic_block));
83 static void update_forwarder_flag PARAMS ((basic_block));
85 /* Set flags for newly created block. */
93 BB_SET_FLAG (bb, BB_UPDATE_LIFE);
94 if (forwarder_block_p (bb))
95 BB_SET_FLAG (bb, BB_FORWARDER_BLOCK);
98 /* Recompute forwarder flag after block has been modified. */
101 update_forwarder_flag (bb)
104 if (forwarder_block_p (bb))
105 BB_SET_FLAG (bb, BB_FORWARDER_BLOCK);
107 BB_CLEAR_FLAG (bb, BB_FORWARDER_BLOCK);
110 /* Simplify a conditional jump around an unconditional jump.
111 Return true if something changed. */
114 try_simplify_condjump (cbranch_block)
115 basic_block cbranch_block;
117 basic_block jump_block, jump_dest_block, cbranch_dest_block;
118 edge cbranch_jump_edge, cbranch_fallthru_edge;
121 /* Verify that there are exactly two successors. */
122 if (!cbranch_block->succ
123 || !cbranch_block->succ->succ_next
124 || cbranch_block->succ->succ_next->succ_next)
127 /* Verify that we've got a normal conditional branch at the end
129 cbranch_insn = cbranch_block->end;
130 if (!any_condjump_p (cbranch_insn))
133 cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block);
134 cbranch_jump_edge = BRANCH_EDGE (cbranch_block);
136 /* The next block must not have multiple predecessors, must not
137 be the last block in the function, and must contain just the
138 unconditional jump. */
139 jump_block = cbranch_fallthru_edge->dest;
140 if (jump_block->pred->pred_next
141 || jump_block->index == n_basic_blocks - 1
142 || !FORWARDER_BLOCK_P (jump_block))
144 jump_dest_block = jump_block->succ->dest;
146 /* The conditional branch must target the block after the
147 unconditional branch. */
148 cbranch_dest_block = cbranch_jump_edge->dest;
150 if (!can_fallthru (jump_block, cbranch_dest_block))
153 /* Invert the conditional branch. */
154 if (!invert_jump (cbranch_insn, block_label (jump_dest_block), 0))
158 fprintf (rtl_dump_file, "Simplifying condjump %i around jump %i\n",
159 INSN_UID (cbranch_insn), INSN_UID (jump_block->end));
161 /* Success. Update the CFG to match. Note that after this point
162 the edge variable names appear backwards; the redirection is done
163 this way to preserve edge profile data. */
164 cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge,
166 cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge,
168 cbranch_jump_edge->flags |= EDGE_FALLTHRU;
169 cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
171 /* Delete the block with the unconditional jump, and clean up the mess. */
172 flow_delete_block (jump_block);
173 tidy_fallthru_edge (cbranch_jump_edge, cbranch_block, cbranch_dest_block);
178 /* Attempt to forward edges leaving basic block B.
179 Return true if sucessful. */
182 try_forward_edges (mode, b)
186 bool changed = false;
189 for (e = b->succ; e ; e = next)
191 basic_block target, first;
196 /* Skip complex edges because we don't know how to update them.
198 Still handle fallthru edges, as we can suceed to forward fallthru
199 edge to the same place as the branch edge of conditional branch
200 and turn conditional branch to an unconditonal branch. */
201 if (e->flags & EDGE_COMPLEX)
204 target = first = e->dest;
207 /* Look for the real destination of the jump.
208 Avoid inifinite loop in the infinite empty loop by counting
209 up to n_basic_blocks. */
210 while (FORWARDER_BLOCK_P (target)
211 && target->succ->dest != EXIT_BLOCK_PTR
212 && counter < n_basic_blocks)
214 /* Bypass trivial infinite loops. */
215 if (target == target->succ->dest)
216 counter = n_basic_blocks;
218 /* Avoid killing of loop pre-headers, as it is the place loop
219 optimizer wants to hoist code to.
221 For fallthru forwarders, the LOOP_BEG note must appear between
222 the header of block and CODE_LABEL of the loop, for non forwarders
223 it must appear before the JUMP_INSN. */
224 if (mode & CLEANUP_PRE_LOOP)
226 rtx insn = (target->succ->flags & EDGE_FALLTHRU
227 ? target->head : prev_nonnote_insn (target->end));
229 if (GET_CODE (insn) != NOTE)
230 insn = NEXT_INSN (insn);
232 for (;insn && GET_CODE (insn) != CODE_LABEL && !INSN_P (insn);
233 insn = NEXT_INSN (insn))
234 if (GET_CODE (insn) == NOTE
235 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
238 if (GET_CODE (insn) == NOTE)
241 target = target->succ->dest, counter++;
244 if (counter >= n_basic_blocks)
247 fprintf (rtl_dump_file, "Infinite loop in BB %i.\n",
250 else if (target == first)
251 ; /* We didn't do anything. */
254 /* Save the values now, as the edge may get removed. */
255 gcov_type edge_count = e->count;
256 int edge_probability = e->probability;
258 if (redirect_edge_and_branch (e, target))
260 /* We successfully forwarded the edge. Now update profile
261 data: for each edge we traversed in the chain, remove
262 the original edge's execution count. */
263 int edge_frequency = ((edge_probability * b->frequency
264 + REG_BR_PROB_BASE / 2)
267 if (!FORWARDER_BLOCK_P (b) && forwarder_block_p (b))
268 BB_SET_FLAG (b, BB_FORWARDER_BLOCK);
269 BB_SET_FLAG (b, BB_UPDATE_LIFE);
273 first->count -= edge_count;
274 first->succ->count -= edge_count;
275 first->frequency -= edge_frequency;
276 first = first->succ->dest;
278 while (first != target);
285 fprintf (rtl_dump_file, "Forwarding edge %i->%i to %i failed.\n",
286 b->index, e->dest->index, target->index);
294 /* Return true if LABEL is used for tail recursion. */
297 tail_recursion_label_p (label)
302 for (x = tail_recursion_label_list; x; x = XEXP (x, 1))
303 if (label == XEXP (x, 0))
309 /* Blocks A and B are to be merged into a single block. A has no incoming
310 fallthru edge, so it can be moved before B without adding or modifying
311 any jumps (aside from the jump from A to B). */
314 merge_blocks_move_predecessor_nojumps (a, b)
320 barrier = next_nonnote_insn (a->end);
321 if (GET_CODE (barrier) != BARRIER)
323 delete_insn (barrier);
325 /* Move block and loop notes out of the chain so that we do not
328 ??? A better solution would be to squeeze out all the non-nested notes
329 and adjust the block trees appropriately. Even better would be to have
330 a tighter connection between block trees and rtl so that this is not
332 squeeze_notes (&a->head, &a->end);
334 /* Scramble the insn chain. */
335 if (a->end != PREV_INSN (b->head))
336 reorder_insns_nobb (a->head, a->end, PREV_INSN (b->head));
337 BB_SET_FLAG (a, BB_UPDATE_LIFE);
341 fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n",
345 /* Swap the records for the two blocks around. Although we are deleting B,
346 A is now where B was and we want to compact the BB array from where
348 BASIC_BLOCK (a->index) = b;
349 BASIC_BLOCK (b->index) = a;
354 /* Now blocks A and B are contiguous. Merge them. */
355 merge_blocks_nomove (a, b);
358 /* Blocks A and B are to be merged into a single block. B has no outgoing
359 fallthru edge, so it can be moved after A without adding or modifying
360 any jumps (aside from the jump from A to B). */
363 merge_blocks_move_successor_nojumps (a, b)
366 rtx barrier, real_b_end;
369 barrier = NEXT_INSN (b->end);
371 /* Recognize a jump table following block B. */
373 && GET_CODE (barrier) == CODE_LABEL
374 && NEXT_INSN (barrier)
375 && GET_CODE (NEXT_INSN (barrier)) == JUMP_INSN
376 && (GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_VEC
377 || GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_DIFF_VEC))
379 /* Temporarily add the table jump insn to b, so that it will also
380 be moved to the correct location. */
381 b->end = NEXT_INSN (barrier);
382 barrier = NEXT_INSN (b->end);
385 /* There had better have been a barrier there. Delete it. */
386 if (barrier && GET_CODE (barrier) == BARRIER)
387 delete_insn (barrier);
389 /* Move block and loop notes out of the chain so that we do not
392 ??? A better solution would be to squeeze out all the non-nested notes
393 and adjust the block trees appropriately. Even better would be to have
394 a tighter connection between block trees and rtl so that this is not
396 squeeze_notes (&b->head, &b->end);
398 /* Scramble the insn chain. */
399 reorder_insns_nobb (b->head, b->end, a->end);
401 /* Restore the real end of b. */
404 /* Now blocks A and B are contiguous. Merge them. */
405 merge_blocks_nomove (a, b);
406 BB_SET_FLAG (a, BB_UPDATE_LIFE);
410 fprintf (rtl_dump_file, "Moved block %d after %d and merged.\n",
415 /* Attempt to merge basic blocks that are potentially non-adjacent.
416 Return true iff the attempt succeeded. */
419 merge_blocks (e, b, c, mode)
424 /* If C has a tail recursion label, do not merge. There is no
425 edge recorded from the call_placeholder back to this label, as
426 that would make optimize_sibling_and_tail_recursive_calls more
427 complex for no gain. */
428 if ((mode & CLEANUP_PRE_SIBCALL)
429 && GET_CODE (c->head) == CODE_LABEL
430 && tail_recursion_label_p (c->head))
433 /* If B has a fallthru edge to C, no need to move anything. */
434 if (e->flags & EDGE_FALLTHRU)
436 merge_blocks_nomove (b, c);
437 update_forwarder_flag (b);
441 fprintf (rtl_dump_file, "Merged %d and %d without moving.\n",
447 /* Otherwise we will need to move code around. Do that only if expensive
448 transformations are allowed. */
449 else if (mode & CLEANUP_EXPENSIVE)
451 edge tmp_edge, b_fallthru_edge;
452 bool c_has_outgoing_fallthru;
453 bool b_has_incoming_fallthru;
455 /* Avoid overactive code motion, as the forwarder blocks should be
456 eliminated by edge redirection instead. One exception might have
457 been if B is a forwarder block and C has no fallthru edge, but
458 that should be cleaned up by bb-reorder instead. */
459 if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
462 /* We must make sure to not munge nesting of lexical blocks,
463 and loop notes. This is done by squeezing out all the notes
464 and leaving them there to lie. Not ideal, but functional. */
466 for (tmp_edge = c->succ; tmp_edge; tmp_edge = tmp_edge->succ_next)
467 if (tmp_edge->flags & EDGE_FALLTHRU)
469 c_has_outgoing_fallthru = (tmp_edge != NULL);
471 for (tmp_edge = b->pred; tmp_edge; tmp_edge = tmp_edge->pred_next)
472 if (tmp_edge->flags & EDGE_FALLTHRU)
474 b_has_incoming_fallthru = (tmp_edge != NULL);
475 b_fallthru_edge = tmp_edge;
477 /* Otherwise, we're going to try to move C after B. If C does
478 not have an outgoing fallthru, then it can be moved
479 immediately after B without introducing or modifying jumps. */
480 if (! c_has_outgoing_fallthru)
482 merge_blocks_move_successor_nojumps (b, c);
486 /* If B does not have an incoming fallthru, then it can be moved
487 immediately before C without introducing or modifying jumps.
488 C cannot be the first block, so we do not have to worry about
489 accessing a non-existent block. */
491 if (b_has_incoming_fallthru)
494 if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
496 bb = force_nonfallthru (b_fallthru_edge);
498 notice_new_block (bb);
500 BB_SET_FLAG (b_fallthru_edge->src, BB_UPDATE_LIFE);
502 merge_blocks_move_predecessor_nojumps (b, c);
508 /* Look through the insns at the end of BB1 and BB2 and find the longest
509 sequence that are equivalent. Store the first insns for that sequence
510 in *F1 and *F2 and return the sequence length.
512 To simplify callers of this function, if the blocks match exactly,
513 store the head of the blocks in *F1 and *F2. */
516 flow_find_cross_jump (mode, bb1, bb2, f1, f2)
517 int mode ATTRIBUTE_UNUSED;
518 basic_block bb1, bb2;
521 rtx i1, i2, p1, p2, last1, last2, afterlast1, afterlast2;
524 /* Skip simple jumps at the end of the blocks. Complex jumps still
525 need to be compared for equivalence, which we'll do below. */
529 || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
533 || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
536 last1 = afterlast1 = last2 = afterlast2 = NULL_RTX;
540 while ((GET_CODE (i1) == NOTE && i1 != bb1->head))
542 while ((GET_CODE (i2) == NOTE && i2 != bb2->head))
545 if (i1 == bb1->head || i2 == bb2->head)
548 /* Verify that I1 and I2 are equivalent. */
550 if (GET_CODE (i1) != GET_CODE (i2))
556 /* If this is a CALL_INSN, compare register usage information.
557 If we don't check this on stack register machines, the two
558 CALL_INSNs might be merged leaving reg-stack.c with mismatching
559 numbers of stack registers in the same basic block.
560 If we don't check this on machines with delay slots, a delay slot may
561 be filled that clobbers a parameter expected by the subroutine.
563 ??? We take the simple route for now and assume that if they're
564 equal, they were constructed identically. */
566 if (GET_CODE (i1) == CALL_INSN
567 && ! rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
568 CALL_INSN_FUNCTION_USAGE (i2)))
572 /* If cross_jump_death_matters is not 0, the insn's mode
573 indicates whether or not the insn contains any stack-like
576 if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
578 /* If register stack conversion has already been done, then
579 death notes must also be compared before it is certain that
580 the two instruction streams match. */
583 HARD_REG_SET i1_regset, i2_regset;
585 CLEAR_HARD_REG_SET (i1_regset);
586 CLEAR_HARD_REG_SET (i2_regset);
588 for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
589 if (REG_NOTE_KIND (note) == REG_DEAD
590 && STACK_REG_P (XEXP (note, 0)))
591 SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
593 for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
594 if (REG_NOTE_KIND (note) == REG_DEAD
595 && STACK_REG_P (XEXP (note, 0)))
596 SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
598 GO_IF_HARD_REG_EQUAL (i1_regset, i2_regset, done);
607 if (GET_CODE (p1) != GET_CODE (p2))
610 if (! rtx_renumbered_equal_p (p1, p2))
612 /* The following code helps take care of G++ cleanups. */
613 rtx equiv1 = find_reg_equal_equiv_note (i1);
614 rtx equiv2 = find_reg_equal_equiv_note (i2);
617 /* If the equivalences are not to a constant, they may
618 reference pseudos that no longer exist, so we can't
620 && CONSTANT_P (XEXP (equiv1, 0))
621 && rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
623 rtx s1 = single_set (i1);
624 rtx s2 = single_set (i2);
625 if (s1 != 0 && s2 != 0
626 && rtx_renumbered_equal_p (SET_DEST (s1), SET_DEST (s2)))
628 validate_change (i1, &SET_SRC (s1), XEXP (equiv1, 0), 1);
629 validate_change (i2, &SET_SRC (s2), XEXP (equiv2, 0), 1);
630 if (! rtx_renumbered_equal_p (p1, p2))
632 else if (apply_change_group ())
640 /* Don't begin a cross-jump with a USE or CLOBBER insn. */
641 if (GET_CODE (p1) != USE && GET_CODE (p1) != CLOBBER)
643 /* If the merged insns have different REG_EQUAL notes, then
645 rtx equiv1 = find_reg_equal_equiv_note (i1);
646 rtx equiv2 = find_reg_equal_equiv_note (i2);
648 if (equiv1 && !equiv2)
649 remove_note (i1, equiv1);
650 else if (!equiv1 && equiv2)
651 remove_note (i2, equiv2);
652 else if (equiv1 && equiv2
653 && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
655 remove_note (i1, equiv1);
656 remove_note (i2, equiv2);
659 afterlast1 = last1, afterlast2 = last2;
660 last1 = i1, last2 = i2;
670 /* Don't allow the insn after a compare to be shared by
671 cross-jumping unless the compare is also shared. */
672 if (reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1))
673 last1 = afterlast1, last2 = afterlast2, ninsns--;
677 /* Include preceeding notes and labels in the cross-jump. One,
678 this may bring us to the head of the blocks as requested above.
679 Two, it keeps line number notes as matched as may be. */
682 while (last1 != bb1->head && GET_CODE (PREV_INSN (last1)) == NOTE)
683 last1 = PREV_INSN (last1);
684 if (last1 != bb1->head && GET_CODE (PREV_INSN (last1)) == CODE_LABEL)
685 last1 = PREV_INSN (last1);
686 while (last2 != bb2->head && GET_CODE (PREV_INSN (last2)) == NOTE)
687 last2 = PREV_INSN (last2);
688 if (last2 != bb2->head && GET_CODE (PREV_INSN (last2)) == CODE_LABEL)
689 last2 = PREV_INSN (last2);
698 /* Return true iff outgoing edges of BB1 and BB2 match, together with
699 the branch instruction. This means that if we commonize the control
700 flow before end of the basic block, the semantic remains unchanged.
702 We may assume that there exists one edge with a common destination. */
705 outgoing_edges_match (bb1, bb2)
709 /* If BB1 has only one successor, we must be looking at an unconditional
710 jump. Which, by the assumption above, means that we only need to check
711 that BB2 has one successor. */
712 if (bb1->succ && !bb1->succ->succ_next)
713 return (bb2->succ && !bb2->succ->succ_next);
715 /* Match conditional jumps - this may get tricky when fallthru and branch
716 edges are crossed. */
718 && bb1->succ->succ_next
719 && !bb1->succ->succ_next->succ_next
720 && any_condjump_p (bb1->end))
724 rtx set1, set2, cond1, cond2;
725 enum rtx_code code1, code2;
728 || !bb2->succ->succ_next
729 || bb1->succ->succ_next->succ_next
730 || !any_condjump_p (bb2->end))
733 b1 = BRANCH_EDGE (bb1);
734 b2 = BRANCH_EDGE (bb2);
735 f1 = FALLTHRU_EDGE (bb1);
736 f2 = FALLTHRU_EDGE (bb2);
738 /* Get around possible forwarders on fallthru edges. Other cases
739 should be optimized out already. */
740 if (FORWARDER_BLOCK_P (f1->dest))
742 if (FORWARDER_BLOCK_P (f2->dest))
745 /* To simplify use of this function, return false if there are
746 unneeded forwarder blocks. These will get eliminated later
747 during cleanup_cfg. */
748 if (FORWARDER_BLOCK_P (f1->dest)
749 || FORWARDER_BLOCK_P (f2->dest)
750 || FORWARDER_BLOCK_P (b1->dest)
751 || FORWARDER_BLOCK_P (b2->dest))
754 if (f1->dest == f2->dest && b1->dest == b2->dest)
756 else if (f1->dest == b2->dest && b1->dest == f2->dest)
761 set1 = pc_set (bb1->end);
762 set2 = pc_set (bb2->end);
763 if ((XEXP (SET_SRC (set1), 1) == pc_rtx)
764 != (XEXP (SET_SRC (set2), 1) == pc_rtx))
767 cond1 = XEXP (SET_SRC (set1), 0);
768 cond2 = XEXP (SET_SRC (set2), 0);
769 code1 = GET_CODE (cond1);
771 code2 = reversed_comparison_code (cond2, bb2->end);
773 code2 = GET_CODE (cond2);
774 if (code2 == UNKNOWN)
777 /* Verify codes and operands match. */
778 match = ((code1 == code2
779 && rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
780 && rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
781 || (code1 == swap_condition (code2)
782 && rtx_renumbered_equal_p (XEXP (cond1, 1),
784 && rtx_renumbered_equal_p (XEXP (cond1, 0),
787 /* If we return true, we will join the blocks. Which means that
788 we will only have one branch prediction bit to work with. Thus
789 we require the existing branches to have probabilities that are
791 /* ??? We should use bb->frequency to allow merging in infrequently
792 executed blocks, but at the moment it is not available when
793 cleanup_cfg is run. */
794 if (match && !optimize_size)
798 note1 = find_reg_note (bb1->end, REG_BR_PROB, 0);
799 note2 = find_reg_note (bb2->end, REG_BR_PROB, 0);
803 prob1 = INTVAL (XEXP (note1, 0));
804 prob2 = INTVAL (XEXP (note2, 0));
806 prob2 = REG_BR_PROB_BASE - prob2;
808 /* Fail if the difference in probabilities is
810 if (abs (prob1 - prob2) > REG_BR_PROB_BASE / 20)
813 else if (note1 || note2)
817 if (rtl_dump_file && match)
818 fprintf (rtl_dump_file, "Conditionals in bb %i and %i match.\n",
819 bb1->index, bb2->index);
824 /* ??? We can handle computed jumps too. This may be important for
825 inlined functions containing switch statements. Also jumps w/o
826 fallthru edges can be handled by simply matching whole insn. */
830 /* E1 and E2 are edges with the same destination block. Search their
831 predecessors for common code. If found, redirect control flow from
832 (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC. */
835 try_crossjump_to_edge (mode, e1, e2)
840 basic_block src1 = e1->src, src2 = e2->src;
841 basic_block redirect_to;
842 rtx newpos1, newpos2;
848 /* Search backward through forwarder blocks. We don't need to worry
849 about multiple entry or chained forwarders, as they will be optimized
850 away. We do this to look past the unconditional jump following a
851 conditional jump that is required due to the current CFG shape. */
853 && !src1->pred->pred_next
854 && FORWARDER_BLOCK_P (src1))
860 && !src2->pred->pred_next
861 && FORWARDER_BLOCK_P (src2))
867 /* Nothing to do if we reach ENTRY, or a common source block. */
868 if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
873 /* Seeing more than 1 forwarder blocks would confuse us later... */
874 if (FORWARDER_BLOCK_P (e1->dest)
875 && FORWARDER_BLOCK_P (e1->dest->succ->dest))
877 if (FORWARDER_BLOCK_P (e2->dest)
878 && FORWARDER_BLOCK_P (e2->dest->succ->dest))
881 /* Likewise with dead code (possibly newly created by the other optimizations
883 if (!src1->pred || !src2->pred)
886 /* Likewise with complex edges.
887 ??? We should be able to handle most complex edges later with some
889 if (e1->flags & EDGE_COMPLEX)
892 /* Look for the common insn sequence, part the first ... */
893 if (!outgoing_edges_match (src1, src2))
896 /* ... and part the second. */
897 nmatch = flow_find_cross_jump (mode, src1, src2, &newpos1, &newpos2);
901 /* Avoid splitting if possible. */
902 if (newpos2 == src2->head)
907 fprintf (rtl_dump_file, "Splitting bb %i before %i insns\n",
908 src2->index, nmatch);
909 redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
913 fprintf (rtl_dump_file,
914 "Cross jumping from bb %i to bb %i; %i common insns\n",
915 src1->index, src2->index, nmatch);
917 redirect_to->count += src1->count;
918 redirect_to->frequency += src1->frequency;
920 /* Recompute the frequencies and counts of outgoing edges. */
921 for (s = redirect_to->succ; s; s = s->succ_next)
924 basic_block d = s->dest;
926 if (FORWARDER_BLOCK_P (d))
928 for (s2 = src1->succ; ; s2 = s2->succ_next)
930 basic_block d2 = s2->dest;
931 if (FORWARDER_BLOCK_P (d2))
936 s->count += s2->count;
938 /* Take care to update possible forwarder blocks. We verified
939 that there is no more than one in the chain, so we can't run
940 into infinite loop. */
941 if (FORWARDER_BLOCK_P (s->dest))
943 s->dest->succ->count += s2->count;
944 s->dest->count += s2->count;
945 s->dest->frequency += EDGE_FREQUENCY (s);
947 if (FORWARDER_BLOCK_P (s2->dest))
949 s2->dest->succ->count -= s2->count;
950 s2->dest->count -= s2->count;
951 s2->dest->frequency -= EDGE_FREQUENCY (s);
953 if (!redirect_to->frequency && !src1->frequency)
954 s->probability = (s->probability + s2->probability) / 2;
957 ((s->probability * redirect_to->frequency +
958 s2->probability * src1->frequency)
959 / (redirect_to->frequency + src1->frequency));
962 note = find_reg_note (redirect_to->end, REG_BR_PROB, 0);
964 XEXP (note, 0) = GEN_INT (BRANCH_EDGE (redirect_to)->probability);
966 /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1. */
968 /* Skip possible basic block header. */
969 if (GET_CODE (newpos1) == CODE_LABEL)
970 newpos1 = NEXT_INSN (newpos1);
971 if (GET_CODE (newpos1) == NOTE)
972 newpos1 = NEXT_INSN (newpos1);
975 /* Emit the jump insn. */
976 label = block_label (redirect_to);
977 emit_jump_insn_after (gen_jump (label), src1->end);
978 JUMP_LABEL (src1->end) = label;
979 LABEL_NUSES (label)++;
981 /* Delete the now unreachable instructions. */
982 delete_insn_chain (newpos1, last);
984 /* Make sure there is a barrier after the new jump. */
985 last = next_nonnote_insn (src1->end);
986 if (!last || GET_CODE (last) != BARRIER)
987 emit_barrier_after (src1->end);
991 remove_edge (src1->succ);
992 make_single_succ_edge (src1, redirect_to, 0);
994 BB_SET_FLAG (src1, BB_UPDATE_LIFE);
995 update_forwarder_flag (src1);
1000 /* Search the predecessors of BB for common insn sequences. When found,
1001 share code between them by redirecting control flow. Return true if
1002 any changes made. */
1005 try_crossjump_bb (mode, bb)
1009 edge e, e2, nexte2, nexte, fallthru;
1012 /* Nothing to do if there is not at least two incomming edges. */
1013 if (!bb->pred || !bb->pred->pred_next)
1016 /* It is always cheapest to redirect a block that ends in a branch to
1017 a block that falls through into BB, as that adds no branches to the
1018 program. We'll try that combination first. */
1019 for (fallthru = bb->pred; fallthru; fallthru = fallthru->pred_next)
1020 if (fallthru->flags & EDGE_FALLTHRU)
1024 for (e = bb->pred; e; e = nexte)
1026 nexte = e->pred_next;
1028 /* Elide complex edges now, as neither try_crossjump_to_edge
1029 nor outgoing_edges_match can handle them. */
1030 if (e->flags & EDGE_COMPLEX)
1033 /* As noted above, first try with the fallthru predecessor. */
1036 /* Don't combine the fallthru edge into anything else.
1037 If there is a match, we'll do it the other way around. */
1041 if (try_crossjump_to_edge (mode, e, fallthru))
1049 /* Non-obvious work limiting check: Recognize that we're going
1050 to call try_crossjump_bb on every basic block. So if we have
1051 two blocks with lots of outgoing edges (a switch) and they
1052 share lots of common destinations, then we would do the
1053 cross-jump check once for each common destination.
1055 Now, if the blocks actually are cross-jump candidates, then
1056 all of their destinations will be shared. Which means that
1057 we only need check them for cross-jump candidacy once. We
1058 can eliminate redundant checks of crossjump(A,B) by arbitrarily
1059 choosing to do the check from the block for which the edge
1060 in question is the first successor of A. */
1061 if (e->src->succ != e)
1064 for (e2 = bb->pred; e2; e2 = nexte2)
1066 nexte2 = e2->pred_next;
1071 /* We've already checked the fallthru edge above. */
1075 /* Again, neither try_crossjump_to_edge nor outgoing_edges_match
1076 can handle complex edges. */
1077 if (e2->flags & EDGE_COMPLEX)
1080 /* The "first successor" check above only prevents multiple
1081 checks of crossjump(A,B). In order to prevent redundant
1082 checks of crossjump(B,A), require that A be the block
1083 with the lowest index. */
1084 if (e->src->index > e2->src->index)
1087 if (try_crossjump_to_edge (mode, e, e2))
1099 /* Do simple CFG optimizations - basic block merging, simplifying of jump
1100 instructions etc. Return nonzero if changes were made. */
1103 try_optimize_cfg (mode)
1107 bool changed_overall = false;
1112 if (mode & CLEANUP_CROSSJUMP)
1113 add_noreturn_fake_exit_edges ();
1115 for (i = 0; i < n_basic_blocks; i++)
1116 update_forwarder_flag (BASIC_BLOCK (i));
1118 /* Attempt to merge blocks as made possible by edge removal. If a block
1119 has only one successor, and the successor has only one predecessor,
1120 they may be combined. */
1128 fprintf (rtl_dump_file, "\n\ntry_optimize_cfg iteration %i\n\n",
1131 for (i = 0; i < n_basic_blocks;)
1133 basic_block c, b = BASIC_BLOCK (i);
1135 bool changed_here = false;
1137 /* Delete trivially dead basic blocks. */
1138 while (b->pred == NULL)
1140 c = BASIC_BLOCK (b->index - 1);
1142 fprintf (rtl_dump_file, "Deleting block %i.\n", b->index);
1143 flow_delete_block (b);
1148 /* Remove code labels no longer used. Don't do this before
1149 CALL_PLACEHOLDER is removed, as some branches may be hidden
1151 if (b->pred->pred_next == NULL
1152 && (b->pred->flags & EDGE_FALLTHRU)
1153 && !(b->pred->flags & EDGE_COMPLEX)
1154 && GET_CODE (b->head) == CODE_LABEL
1155 && (!(mode & CLEANUP_PRE_SIBCALL)
1156 || !tail_recursion_label_p (b->head))
1157 /* If previous block ends with condjump jumping to next BB,
1158 we can't delete the label. */
1159 && (b->pred->src == ENTRY_BLOCK_PTR
1160 || !reg_mentioned_p (b->head, b->pred->src->end)))
1162 rtx label = b->head;
1163 b->head = NEXT_INSN (b->head);
1164 delete_insn_chain (label, label);
1166 fprintf (rtl_dump_file, "Deleted label in block %i.\n",
1170 /* If we fall through an empty block, we can remove it. */
1171 if (b->pred->pred_next == NULL
1172 && (b->pred->flags & EDGE_FALLTHRU)
1173 && GET_CODE (b->head) != CODE_LABEL
1174 && FORWARDER_BLOCK_P (b)
1175 /* Note that forwarder_block_p true ensures that there
1176 is a successor for this block. */
1177 && (b->succ->flags & EDGE_FALLTHRU)
1178 && n_basic_blocks > 1)
1181 fprintf (rtl_dump_file, "Deleting fallthru block %i.\n",
1183 c = BASIC_BLOCK (b->index ? b->index - 1 : 1);
1184 redirect_edge_succ_nodup (b->pred, b->succ->dest);
1185 flow_delete_block (b);
1190 /* Merge blocks. Loop because chains of blocks might be
1192 while ((s = b->succ) != NULL
1193 && s->succ_next == NULL
1194 && !(s->flags & EDGE_COMPLEX)
1195 && (c = s->dest) != EXIT_BLOCK_PTR
1196 && c->pred->pred_next == NULL
1197 /* If the jump insn has side effects,
1198 we can't kill the edge. */
1199 && (GET_CODE (b->end) != JUMP_INSN
1200 || onlyjump_p (b->end))
1201 && merge_blocks (s, b, c, mode))
1202 changed_here = true;
1204 /* Simplify branch over branch. */
1205 if ((mode & CLEANUP_EXPENSIVE) && try_simplify_condjump (b))
1206 changed_here = true;
1208 /* If B has a single outgoing edge, but uses a non-trivial jump
1209 instruction without side-effects, we can either delete the
1210 jump entirely, or replace it with a simple unconditional jump.
1211 Use redirect_edge_and_branch to do the dirty work. */
1213 && ! b->succ->succ_next
1214 && b->succ->dest != EXIT_BLOCK_PTR
1215 && onlyjump_p (b->end)
1216 && redirect_edge_and_branch (b->succ, b->succ->dest))
1218 BB_SET_FLAG (b, BB_UPDATE_LIFE);
1219 update_forwarder_flag (b);
1220 changed_here = true;
1223 /* Simplify branch to branch. */
1224 if (try_forward_edges (mode, b))
1225 changed_here = true;
1227 /* Look for shared code between blocks. */
1228 if ((mode & CLEANUP_CROSSJUMP)
1229 && try_crossjump_bb (mode, b))
1230 changed_here = true;
1232 /* Don't get confused by the index shift caused by deleting
1240 if ((mode & CLEANUP_CROSSJUMP)
1241 && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
1244 #ifdef ENABLE_CHECKING
1246 verify_flow_info ();
1249 changed_overall |= changed;
1253 if (mode & CLEANUP_CROSSJUMP)
1254 remove_fake_edges ();
1256 if ((mode & CLEANUP_UPDATE_LIFE) & changed_overall)
1259 blocks = sbitmap_alloc (n_basic_blocks);
1260 for (i = 0; i < n_basic_blocks; i++)
1261 if (BB_FLAGS (BASIC_BLOCK (i)) & BB_UPDATE_LIFE)
1264 SET_BIT (blocks, i);
1267 update_life_info (blocks, UPDATE_LIFE_GLOBAL,
1268 PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
1269 | PROP_KILL_DEAD_CODE);
1270 sbitmap_free (blocks);
1272 for (i = 0; i < n_basic_blocks; i++)
1273 BASIC_BLOCK (i)->aux = NULL;
1275 return changed_overall;
1278 /* Delete all unreachable basic blocks. */
1281 delete_unreachable_blocks ()
1284 bool changed = false;
1286 find_unreachable_blocks ();
1288 /* Delete all unreachable basic blocks. Count down so that we
1289 don't interfere with the block renumbering that happens in
1290 flow_delete_block. */
1292 for (i = n_basic_blocks - 1; i >= 0; --i)
1294 basic_block b = BASIC_BLOCK (i);
1296 if (!(b->flags & BB_REACHABLE))
1297 flow_delete_block (b), changed = true;
1301 tidy_fallthru_edges ();
1305 /* Tidy the CFG by deleting unreachable code and whatnot. */
1311 bool changed = false;
1313 timevar_push (TV_CLEANUP_CFG);
1314 changed = delete_unreachable_blocks ();
1315 if (try_optimize_cfg (mode))
1316 delete_unreachable_blocks (), changed = true;
1318 /* Kill the data we won't maintain. */
1319 free_EXPR_LIST_list (&label_value_list);
1320 free_EXPR_LIST_list (&tail_recursion_label_list);
1321 timevar_pop (TV_CLEANUP_CFG);