basic-block.h (try_redirect_by_replacing_jump): Declare.
[gcc.git] / gcc / cfgcleanup.c
1 /* Control flow optimization code for GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
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
10 version.
11
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
15 for more details.
16
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
20 02111-1307, USA. */
21
22 /* This file contains optimizer of the control flow. The main entrypoint is
23 cleanup_cfg. Following optimizations are performed:
24
25 - Unreachable blocks removal
26 - Edge forwarding (edge to the forwarder block is forwarded to it's
27 successor. Simplification of the branch instruction is performed by
28 underlying infrastructure so branch can be converted to simplejump or
29 eliminated).
30 - Cross jumping (tail merging)
31 - Conditional jump-around-simplejump simplification
32 - Basic block merging. */
33
34 #include "config.h"
35 #include "system.h"
36 #include "coretypes.h"
37 #include "tm.h"
38 #include "rtl.h"
39 #include "hard-reg-set.h"
40 #include "basic-block.h"
41 #include "timevar.h"
42 #include "output.h"
43 #include "insn-config.h"
44 #include "flags.h"
45 #include "recog.h"
46 #include "toplev.h"
47 #include "cselib.h"
48 #include "params.h"
49 #include "tm_p.h"
50 #include "target.h"
51
52 /* cleanup_cfg maintains following flags for each basic block. */
53
54 enum bb_flags
55 {
56 /* Set if BB is the forwarder block to avoid too many
57 forwarder_block_p calls. */
58 BB_FORWARDER_BLOCK = 1,
59 BB_NONTHREADABLE_BLOCK = 2
60 };
61
62 #define BB_FLAGS(BB) (enum bb_flags) (BB)->aux
63 #define BB_SET_FLAG(BB, FLAG) \
64 (BB)->aux = (void *) (long) ((enum bb_flags) (BB)->aux | (FLAG))
65 #define BB_CLEAR_FLAG(BB, FLAG) \
66 (BB)->aux = (void *) (long) ((enum bb_flags) (BB)->aux & ~(FLAG))
67
68 #define FORWARDER_BLOCK_P(BB) (BB_FLAGS (BB) & BB_FORWARDER_BLOCK)
69
70 static bool try_crossjump_to_edge (int, edge, edge);
71 static bool try_crossjump_bb (int, basic_block);
72 static bool outgoing_edges_match (int, basic_block, basic_block);
73 static int flow_find_cross_jump (int, basic_block, basic_block, rtx *, rtx *);
74 static bool insns_match_p (int, rtx, rtx);
75
76 static bool tail_recursion_label_p (rtx);
77 static void merge_blocks_move_predecessor_nojumps (basic_block, basic_block);
78 static void merge_blocks_move_successor_nojumps (basic_block, basic_block);
79 static bool try_optimize_cfg (int);
80 static bool try_simplify_condjump (basic_block);
81 static bool try_forward_edges (int, basic_block);
82 static edge thread_jump (int, edge, basic_block);
83 static bool mark_effect (rtx, bitmap);
84 static void notice_new_block (basic_block);
85 static void update_forwarder_flag (basic_block);
86 static int mentions_nonequal_regs (rtx *, void *);
87 \f
88 /* Set flags for newly created block. */
89
90 static void
91 notice_new_block (basic_block bb)
92 {
93 if (!bb)
94 return;
95
96 if (forwarder_block_p (bb))
97 BB_SET_FLAG (bb, BB_FORWARDER_BLOCK);
98 }
99
100 /* Recompute forwarder flag after block has been modified. */
101
102 static void
103 update_forwarder_flag (basic_block bb)
104 {
105 if (forwarder_block_p (bb))
106 BB_SET_FLAG (bb, BB_FORWARDER_BLOCK);
107 else
108 BB_CLEAR_FLAG (bb, BB_FORWARDER_BLOCK);
109 }
110 \f
111 /* Simplify a conditional jump around an unconditional jump.
112 Return true if something changed. */
113
114 static bool
115 try_simplify_condjump (basic_block cbranch_block)
116 {
117 basic_block jump_block, jump_dest_block, cbranch_dest_block;
118 edge cbranch_jump_edge, cbranch_fallthru_edge;
119 rtx cbranch_insn;
120 rtx insn, next;
121 rtx end;
122
123 /* Verify that there are exactly two successors. */
124 if (!cbranch_block->succ
125 || !cbranch_block->succ->succ_next
126 || cbranch_block->succ->succ_next->succ_next)
127 return false;
128
129 /* Verify that we've got a normal conditional branch at the end
130 of the block. */
131 cbranch_insn = BB_END (cbranch_block);
132 if (!any_condjump_p (cbranch_insn))
133 return false;
134
135 cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block);
136 cbranch_jump_edge = BRANCH_EDGE (cbranch_block);
137
138 /* The next block must not have multiple predecessors, must not
139 be the last block in the function, and must contain just the
140 unconditional jump. */
141 jump_block = cbranch_fallthru_edge->dest;
142 if (jump_block->pred->pred_next
143 || jump_block->next_bb == EXIT_BLOCK_PTR
144 || !FORWARDER_BLOCK_P (jump_block))
145 return false;
146 jump_dest_block = jump_block->succ->dest;
147
148 /* The conditional branch must target the block after the
149 unconditional branch. */
150 cbranch_dest_block = cbranch_jump_edge->dest;
151
152 if (!can_fallthru (jump_block, cbranch_dest_block))
153 return false;
154
155 /* Invert the conditional branch. */
156 if (!invert_jump (cbranch_insn, block_label (jump_dest_block), 0))
157 return false;
158
159 if (rtl_dump_file)
160 fprintf (rtl_dump_file, "Simplifying condjump %i around jump %i\n",
161 INSN_UID (cbranch_insn), INSN_UID (BB_END (jump_block)));
162
163 /* Success. Update the CFG to match. Note that after this point
164 the edge variable names appear backwards; the redirection is done
165 this way to preserve edge profile data. */
166 cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge,
167 cbranch_dest_block);
168 cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge,
169 jump_dest_block);
170 cbranch_jump_edge->flags |= EDGE_FALLTHRU;
171 cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
172 update_br_prob_note (cbranch_block);
173
174 end = BB_END (jump_block);
175 /* Deleting a block may produce unreachable code warning even when we are
176 not deleting anything live. Suppress it by moving all the line number
177 notes out of the block. */
178 for (insn = BB_HEAD (jump_block); insn != NEXT_INSN (BB_END (jump_block));
179 insn = next)
180 {
181 next = NEXT_INSN (insn);
182 if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
183 {
184 if (insn == BB_END (jump_block))
185 {
186 BB_END (jump_block) = PREV_INSN (insn);
187 if (insn == end)
188 break;
189 }
190 reorder_insns_nobb (insn, insn, end);
191 end = insn;
192 }
193 }
194 /* Delete the block with the unconditional jump, and clean up the mess. */
195 delete_block (jump_block);
196 tidy_fallthru_edge (cbranch_jump_edge, cbranch_block, cbranch_dest_block);
197
198 return true;
199 }
200 \f
201 /* Attempt to prove that operation is NOOP using CSElib or mark the effect
202 on register. Used by jump threading. */
203
204 static bool
205 mark_effect (rtx exp, regset nonequal)
206 {
207 int regno;
208 rtx dest;
209 switch (GET_CODE (exp))
210 {
211 /* In case we do clobber the register, mark it as equal, as we know the
212 value is dead so it don't have to match. */
213 case CLOBBER:
214 if (REG_P (XEXP (exp, 0)))
215 {
216 dest = XEXP (exp, 0);
217 regno = REGNO (dest);
218 CLEAR_REGNO_REG_SET (nonequal, regno);
219 if (regno < FIRST_PSEUDO_REGISTER)
220 {
221 int n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
222 while (--n > 0)
223 CLEAR_REGNO_REG_SET (nonequal, regno + n);
224 }
225 }
226 return false;
227
228 case SET:
229 if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp)))
230 return false;
231 dest = SET_DEST (exp);
232 if (dest == pc_rtx)
233 return false;
234 if (!REG_P (dest))
235 return true;
236 regno = REGNO (dest);
237 SET_REGNO_REG_SET (nonequal, regno);
238 if (regno < FIRST_PSEUDO_REGISTER)
239 {
240 int n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
241 while (--n > 0)
242 SET_REGNO_REG_SET (nonequal, regno + n);
243 }
244 return false;
245
246 default:
247 return false;
248 }
249 }
250
251 /* Return nonzero if X is a register set in regset DATA.
252 Called via for_each_rtx. */
253 static int
254 mentions_nonequal_regs (rtx *x, void *data)
255 {
256 regset nonequal = (regset) data;
257 if (REG_P (*x))
258 {
259 int regno;
260
261 regno = REGNO (*x);
262 if (REGNO_REG_SET_P (nonequal, regno))
263 return 1;
264 if (regno < FIRST_PSEUDO_REGISTER)
265 {
266 int n = HARD_REGNO_NREGS (regno, GET_MODE (*x));
267 while (--n > 0)
268 if (REGNO_REG_SET_P (nonequal, regno + n))
269 return 1;
270 }
271 }
272 return 0;
273 }
274 /* Attempt to prove that the basic block B will have no side effects and
275 always continues in the same edge if reached via E. Return the edge
276 if exist, NULL otherwise. */
277
278 static edge
279 thread_jump (int mode, edge e, basic_block b)
280 {
281 rtx set1, set2, cond1, cond2, insn;
282 enum rtx_code code1, code2, reversed_code2;
283 bool reverse1 = false;
284 int i;
285 regset nonequal;
286 bool failed = false;
287
288 if (BB_FLAGS (b) & BB_NONTHREADABLE_BLOCK)
289 return NULL;
290
291 /* At the moment, we do handle only conditional jumps, but later we may
292 want to extend this code to tablejumps and others. */
293 if (!e->src->succ->succ_next || e->src->succ->succ_next->succ_next)
294 return NULL;
295 if (!b->succ || !b->succ->succ_next || b->succ->succ_next->succ_next)
296 {
297 BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
298 return NULL;
299 }
300
301 /* Second branch must end with onlyjump, as we will eliminate the jump. */
302 if (!any_condjump_p (BB_END (e->src)))
303 return NULL;
304
305 if (!any_condjump_p (BB_END (b)) || !onlyjump_p (BB_END (b)))
306 {
307 BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
308 return NULL;
309 }
310
311 set1 = pc_set (BB_END (e->src));
312 set2 = pc_set (BB_END (b));
313 if (((e->flags & EDGE_FALLTHRU) != 0)
314 != (XEXP (SET_SRC (set1), 1) == pc_rtx))
315 reverse1 = true;
316
317 cond1 = XEXP (SET_SRC (set1), 0);
318 cond2 = XEXP (SET_SRC (set2), 0);
319 if (reverse1)
320 code1 = reversed_comparison_code (cond1, BB_END (e->src));
321 else
322 code1 = GET_CODE (cond1);
323
324 code2 = GET_CODE (cond2);
325 reversed_code2 = reversed_comparison_code (cond2, BB_END (b));
326
327 if (!comparison_dominates_p (code1, code2)
328 && !comparison_dominates_p (code1, reversed_code2))
329 return NULL;
330
331 /* Ensure that the comparison operators are equivalent.
332 ??? This is far too pessimistic. We should allow swapped operands,
333 different CCmodes, or for example comparisons for interval, that
334 dominate even when operands are not equivalent. */
335 if (!rtx_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
336 || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
337 return NULL;
338
339 /* Short circuit cases where block B contains some side effects, as we can't
340 safely bypass it. */
341 for (insn = NEXT_INSN (BB_HEAD (b)); insn != NEXT_INSN (BB_END (b));
342 insn = NEXT_INSN (insn))
343 if (INSN_P (insn) && side_effects_p (PATTERN (insn)))
344 {
345 BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
346 return NULL;
347 }
348
349 cselib_init ();
350
351 /* First process all values computed in the source basic block. */
352 for (insn = NEXT_INSN (BB_HEAD (e->src)); insn != NEXT_INSN (BB_END (e->src));
353 insn = NEXT_INSN (insn))
354 if (INSN_P (insn))
355 cselib_process_insn (insn);
356
357 nonequal = BITMAP_XMALLOC();
358 CLEAR_REG_SET (nonequal);
359
360 /* Now assume that we've continued by the edge E to B and continue
361 processing as if it were same basic block.
362 Our goal is to prove that whole block is an NOOP. */
363
364 for (insn = NEXT_INSN (BB_HEAD (b)); insn != NEXT_INSN (BB_END (b)) && !failed;
365 insn = NEXT_INSN (insn))
366 {
367 if (INSN_P (insn))
368 {
369 rtx pat = PATTERN (insn);
370
371 if (GET_CODE (pat) == PARALLEL)
372 {
373 for (i = 0; i < XVECLEN (pat, 0); i++)
374 failed |= mark_effect (XVECEXP (pat, 0, i), nonequal);
375 }
376 else
377 failed |= mark_effect (pat, nonequal);
378 }
379
380 cselib_process_insn (insn);
381 }
382
383 /* Later we should clear nonequal of dead registers. So far we don't
384 have life information in cfg_cleanup. */
385 if (failed)
386 {
387 BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
388 goto failed_exit;
389 }
390
391 /* cond2 must not mention any register that is not equal to the
392 former block. */
393 if (for_each_rtx (&cond2, mentions_nonequal_regs, nonequal))
394 goto failed_exit;
395
396 /* In case liveness information is available, we need to prove equivalence
397 only of the live values. */
398 if (mode & CLEANUP_UPDATE_LIFE)
399 AND_REG_SET (nonequal, b->global_live_at_end);
400
401 EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, goto failed_exit;);
402
403 BITMAP_XFREE (nonequal);
404 cselib_finish ();
405 if ((comparison_dominates_p (code1, code2) != 0)
406 != (XEXP (SET_SRC (set2), 1) == pc_rtx))
407 return BRANCH_EDGE (b);
408 else
409 return FALLTHRU_EDGE (b);
410
411 failed_exit:
412 BITMAP_XFREE (nonequal);
413 cselib_finish ();
414 return NULL;
415 }
416 \f
417 /* Attempt to forward edges leaving basic block B.
418 Return true if successful. */
419
420 static bool
421 try_forward_edges (int mode, basic_block b)
422 {
423 bool changed = false;
424 edge e, next, *threaded_edges = NULL;
425
426 for (e = b->succ; e; e = next)
427 {
428 basic_block target, first;
429 int counter;
430 bool threaded = false;
431 int nthreaded_edges = 0;
432
433 next = e->succ_next;
434
435 /* Skip complex edges because we don't know how to update them.
436
437 Still handle fallthru edges, as we can succeed to forward fallthru
438 edge to the same place as the branch edge of conditional branch
439 and turn conditional branch to an unconditional branch. */
440 if (e->flags & EDGE_COMPLEX)
441 continue;
442
443 target = first = e->dest;
444 counter = 0;
445
446 while (counter < n_basic_blocks)
447 {
448 basic_block new_target = NULL;
449 bool new_target_threaded = false;
450
451 if (FORWARDER_BLOCK_P (target)
452 && target->succ->dest != EXIT_BLOCK_PTR)
453 {
454 /* Bypass trivial infinite loops. */
455 if (target == target->succ->dest)
456 counter = n_basic_blocks;
457 new_target = target->succ->dest;
458 }
459
460 /* Allow to thread only over one edge at time to simplify updating
461 of probabilities. */
462 else if (mode & CLEANUP_THREADING)
463 {
464 edge t = thread_jump (mode, e, target);
465 if (t)
466 {
467 if (!threaded_edges)
468 threaded_edges = xmalloc (sizeof (*threaded_edges)
469 * n_basic_blocks);
470 else
471 {
472 int i;
473
474 /* Detect an infinite loop across blocks not
475 including the start block. */
476 for (i = 0; i < nthreaded_edges; ++i)
477 if (threaded_edges[i] == t)
478 break;
479 if (i < nthreaded_edges)
480 {
481 counter = n_basic_blocks;
482 break;
483 }
484 }
485
486 /* Detect an infinite loop across the start block. */
487 if (t->dest == b)
488 break;
489
490 if (nthreaded_edges >= n_basic_blocks)
491 abort ();
492 threaded_edges[nthreaded_edges++] = t;
493
494 new_target = t->dest;
495 new_target_threaded = true;
496 }
497 }
498
499 if (!new_target)
500 break;
501
502 /* Avoid killing of loop pre-headers, as it is the place loop
503 optimizer wants to hoist code to.
504
505 For fallthru forwarders, the LOOP_BEG note must appear between
506 the header of block and CODE_LABEL of the loop, for non forwarders
507 it must appear before the JUMP_INSN. */
508 if ((mode & CLEANUP_PRE_LOOP) && optimize)
509 {
510 rtx insn = (target->succ->flags & EDGE_FALLTHRU
511 ? BB_HEAD (target) : prev_nonnote_insn (BB_END (target)));
512
513 if (GET_CODE (insn) != NOTE)
514 insn = NEXT_INSN (insn);
515
516 for (; insn && GET_CODE (insn) != CODE_LABEL && !INSN_P (insn);
517 insn = NEXT_INSN (insn))
518 if (GET_CODE (insn) == NOTE
519 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
520 break;
521
522 if (GET_CODE (insn) == NOTE)
523 break;
524
525 /* Do not clean up branches to just past the end of a loop
526 at this time; it can mess up the loop optimizer's
527 recognition of some patterns. */
528
529 insn = PREV_INSN (BB_HEAD (target));
530 if (insn && GET_CODE (insn) == NOTE
531 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
532 break;
533 }
534
535 counter++;
536 target = new_target;
537 threaded |= new_target_threaded;
538 }
539
540 if (counter >= n_basic_blocks)
541 {
542 if (rtl_dump_file)
543 fprintf (rtl_dump_file, "Infinite loop in BB %i.\n",
544 target->index);
545 }
546 else if (target == first)
547 ; /* We didn't do anything. */
548 else
549 {
550 /* Save the values now, as the edge may get removed. */
551 gcov_type edge_count = e->count;
552 int edge_probability = e->probability;
553 int edge_frequency;
554 int n = 0;
555
556 /* Don't force if target is exit block. */
557 if (threaded && target != EXIT_BLOCK_PTR)
558 {
559 notice_new_block (redirect_edge_and_branch_force (e, target));
560 if (rtl_dump_file)
561 fprintf (rtl_dump_file, "Conditionals threaded.\n");
562 }
563 else if (!redirect_edge_and_branch (e, target))
564 {
565 if (rtl_dump_file)
566 fprintf (rtl_dump_file,
567 "Forwarding edge %i->%i to %i failed.\n",
568 b->index, e->dest->index, target->index);
569 continue;
570 }
571
572 /* We successfully forwarded the edge. Now update profile
573 data: for each edge we traversed in the chain, remove
574 the original edge's execution count. */
575 edge_frequency = ((edge_probability * b->frequency
576 + REG_BR_PROB_BASE / 2)
577 / REG_BR_PROB_BASE);
578
579 if (!FORWARDER_BLOCK_P (b) && forwarder_block_p (b))
580 BB_SET_FLAG (b, BB_FORWARDER_BLOCK);
581
582 do
583 {
584 edge t;
585
586 first->count -= edge_count;
587 if (first->count < 0)
588 first->count = 0;
589 first->frequency -= edge_frequency;
590 if (first->frequency < 0)
591 first->frequency = 0;
592 if (first->succ->succ_next)
593 {
594 edge e;
595 int prob;
596 if (n >= nthreaded_edges)
597 abort ();
598 t = threaded_edges [n++];
599 if (t->src != first)
600 abort ();
601 if (first->frequency)
602 prob = edge_frequency * REG_BR_PROB_BASE / first->frequency;
603 else
604 prob = 0;
605 if (prob > t->probability)
606 prob = t->probability;
607 t->probability -= prob;
608 prob = REG_BR_PROB_BASE - prob;
609 if (prob <= 0)
610 {
611 first->succ->probability = REG_BR_PROB_BASE;
612 first->succ->succ_next->probability = 0;
613 }
614 else
615 for (e = first->succ; e; e = e->succ_next)
616 e->probability = ((e->probability * REG_BR_PROB_BASE)
617 / (double) prob);
618 update_br_prob_note (first);
619 }
620 else
621 {
622 /* It is possible that as the result of
623 threading we've removed edge as it is
624 threaded to the fallthru edge. Avoid
625 getting out of sync. */
626 if (n < nthreaded_edges
627 && first == threaded_edges [n]->src)
628 n++;
629 t = first->succ;
630 }
631
632 t->count -= edge_count;
633 if (t->count < 0)
634 t->count = 0;
635 first = t->dest;
636 }
637 while (first != target);
638
639 changed = true;
640 }
641 }
642
643 if (threaded_edges)
644 free (threaded_edges);
645 return changed;
646 }
647 \f
648 /* Return true if LABEL is used for tail recursion. */
649
650 static bool
651 tail_recursion_label_p (rtx label)
652 {
653 rtx x;
654
655 for (x = tail_recursion_label_list; x; x = XEXP (x, 1))
656 if (label == XEXP (x, 0))
657 return true;
658
659 return false;
660 }
661
662 /* Blocks A and B are to be merged into a single block. A has no incoming
663 fallthru edge, so it can be moved before B without adding or modifying
664 any jumps (aside from the jump from A to B). */
665
666 static void
667 merge_blocks_move_predecessor_nojumps (basic_block a, basic_block b)
668 {
669 rtx barrier;
670
671 barrier = next_nonnote_insn (BB_END (a));
672 if (GET_CODE (barrier) != BARRIER)
673 abort ();
674 delete_insn (barrier);
675
676 /* Move block and loop notes out of the chain so that we do not
677 disturb their order.
678
679 ??? A better solution would be to squeeze out all the non-nested notes
680 and adjust the block trees appropriately. Even better would be to have
681 a tighter connection between block trees and rtl so that this is not
682 necessary. */
683 if (squeeze_notes (&BB_HEAD (a), &BB_END (a)))
684 abort ();
685
686 /* Scramble the insn chain. */
687 if (BB_END (a) != PREV_INSN (BB_HEAD (b)))
688 reorder_insns_nobb (BB_HEAD (a), BB_END (a), PREV_INSN (BB_HEAD (b)));
689 a->flags |= BB_DIRTY;
690
691 if (rtl_dump_file)
692 fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n",
693 a->index, b->index);
694
695 /* Swap the records for the two blocks around. */
696
697 unlink_block (a);
698 link_block (a, b->prev_bb);
699
700 /* Now blocks A and B are contiguous. Merge them. */
701 merge_blocks (a, b);
702 }
703
704 /* Blocks A and B are to be merged into a single block. B has no outgoing
705 fallthru edge, so it can be moved after A without adding or modifying
706 any jumps (aside from the jump from A to B). */
707
708 static void
709 merge_blocks_move_successor_nojumps (basic_block a, basic_block b)
710 {
711 rtx barrier, real_b_end;
712 rtx label, table;
713
714 real_b_end = BB_END (b);
715
716 /* If there is a jump table following block B temporarily add the jump table
717 to block B so that it will also be moved to the correct location. */
718 if (tablejump_p (BB_END (b), &label, &table)
719 && prev_active_insn (label) == BB_END (b))
720 {
721 BB_END (b) = table;
722 }
723
724 /* There had better have been a barrier there. Delete it. */
725 barrier = NEXT_INSN (BB_END (b));
726 if (barrier && GET_CODE (barrier) == BARRIER)
727 delete_insn (barrier);
728
729 /* Move block and loop notes out of the chain so that we do not
730 disturb their order.
731
732 ??? A better solution would be to squeeze out all the non-nested notes
733 and adjust the block trees appropriately. Even better would be to have
734 a tighter connection between block trees and rtl so that this is not
735 necessary. */
736 if (squeeze_notes (&BB_HEAD (b), &BB_END (b)))
737 abort ();
738
739 /* Scramble the insn chain. */
740 reorder_insns_nobb (BB_HEAD (b), BB_END (b), BB_END (a));
741
742 /* Restore the real end of b. */
743 BB_END (b) = real_b_end;
744
745 if (rtl_dump_file)
746 fprintf (rtl_dump_file, "Moved block %d after %d and merged.\n",
747 b->index, a->index);
748
749 /* Now blocks A and B are contiguous. Merge them. */
750 merge_blocks (a, b);
751 }
752
753 /* Attempt to merge basic blocks that are potentially non-adjacent.
754 Return NULL iff the attempt failed, otherwise return basic block
755 where cleanup_cfg should continue. Because the merging commonly
756 moves basic block away or introduces another optimization
757 possibility, return basic block just before B so cleanup_cfg don't
758 need to iterate.
759
760 It may be good idea to return basic block before C in the case
761 C has been moved after B and originally appeared earlier in the
762 insn sequence, but we have no information available about the
763 relative ordering of these two. Hopefully it is not too common. */
764
765 static basic_block
766 merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
767 {
768 basic_block next;
769 /* If C has a tail recursion label, do not merge. There is no
770 edge recorded from the call_placeholder back to this label, as
771 that would make optimize_sibling_and_tail_recursive_calls more
772 complex for no gain. */
773 if ((mode & CLEANUP_PRE_SIBCALL)
774 && GET_CODE (BB_HEAD (c)) == CODE_LABEL
775 && tail_recursion_label_p (BB_HEAD (c)))
776 return NULL;
777
778 /* If B has a fallthru edge to C, no need to move anything. */
779 if (e->flags & EDGE_FALLTHRU)
780 {
781 int b_index = b->index, c_index = c->index;
782 merge_blocks (b, c);
783 update_forwarder_flag (b);
784
785 if (rtl_dump_file)
786 fprintf (rtl_dump_file, "Merged %d and %d without moving.\n",
787 b_index, c_index);
788
789 return b->prev_bb == ENTRY_BLOCK_PTR ? b : b->prev_bb;
790 }
791
792 /* Otherwise we will need to move code around. Do that only if expensive
793 transformations are allowed. */
794 else if (mode & CLEANUP_EXPENSIVE)
795 {
796 edge tmp_edge, b_fallthru_edge;
797 bool c_has_outgoing_fallthru;
798 bool b_has_incoming_fallthru;
799
800 /* Avoid overactive code motion, as the forwarder blocks should be
801 eliminated by edge redirection instead. One exception might have
802 been if B is a forwarder block and C has no fallthru edge, but
803 that should be cleaned up by bb-reorder instead. */
804 if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
805 return NULL;
806
807 /* We must make sure to not munge nesting of lexical blocks,
808 and loop notes. This is done by squeezing out all the notes
809 and leaving them there to lie. Not ideal, but functional. */
810
811 for (tmp_edge = c->succ; tmp_edge; tmp_edge = tmp_edge->succ_next)
812 if (tmp_edge->flags & EDGE_FALLTHRU)
813 break;
814
815 c_has_outgoing_fallthru = (tmp_edge != NULL);
816
817 for (tmp_edge = b->pred; tmp_edge; tmp_edge = tmp_edge->pred_next)
818 if (tmp_edge->flags & EDGE_FALLTHRU)
819 break;
820
821 b_has_incoming_fallthru = (tmp_edge != NULL);
822 b_fallthru_edge = tmp_edge;
823 next = b->prev_bb;
824 if (next == c)
825 next = next->prev_bb;
826
827 /* Otherwise, we're going to try to move C after B. If C does
828 not have an outgoing fallthru, then it can be moved
829 immediately after B without introducing or modifying jumps. */
830 if (! c_has_outgoing_fallthru)
831 {
832 merge_blocks_move_successor_nojumps (b, c);
833 return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
834 }
835
836 /* If B does not have an incoming fallthru, then it can be moved
837 immediately before C without introducing or modifying jumps.
838 C cannot be the first block, so we do not have to worry about
839 accessing a non-existent block. */
840
841 if (b_has_incoming_fallthru)
842 {
843 basic_block bb;
844
845 if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
846 return NULL;
847 bb = force_nonfallthru (b_fallthru_edge);
848 if (bb)
849 notice_new_block (bb);
850 }
851
852 merge_blocks_move_predecessor_nojumps (b, c);
853 return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
854 }
855
856 return NULL;
857 }
858 \f
859
860 /* Return true if I1 and I2 are equivalent and thus can be crossjumped. */
861
862 static bool
863 insns_match_p (int mode ATTRIBUTE_UNUSED, rtx i1, rtx i2)
864 {
865 rtx p1, p2;
866
867 /* Verify that I1 and I2 are equivalent. */
868 if (GET_CODE (i1) != GET_CODE (i2))
869 return false;
870
871 p1 = PATTERN (i1);
872 p2 = PATTERN (i2);
873
874 if (GET_CODE (p1) != GET_CODE (p2))
875 return false;
876
877 /* If this is a CALL_INSN, compare register usage information.
878 If we don't check this on stack register machines, the two
879 CALL_INSNs might be merged leaving reg-stack.c with mismatching
880 numbers of stack registers in the same basic block.
881 If we don't check this on machines with delay slots, a delay slot may
882 be filled that clobbers a parameter expected by the subroutine.
883
884 ??? We take the simple route for now and assume that if they're
885 equal, they were constructed identically. */
886
887 if (GET_CODE (i1) == CALL_INSN
888 && (!rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
889 CALL_INSN_FUNCTION_USAGE (i2))
890 || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2)))
891 return false;
892
893 #ifdef STACK_REGS
894 /* If cross_jump_death_matters is not 0, the insn's mode
895 indicates whether or not the insn contains any stack-like
896 regs. */
897
898 if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
899 {
900 /* If register stack conversion has already been done, then
901 death notes must also be compared before it is certain that
902 the two instruction streams match. */
903
904 rtx note;
905 HARD_REG_SET i1_regset, i2_regset;
906
907 CLEAR_HARD_REG_SET (i1_regset);
908 CLEAR_HARD_REG_SET (i2_regset);
909
910 for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
911 if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
912 SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
913
914 for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
915 if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
916 SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
917
918 GO_IF_HARD_REG_EQUAL (i1_regset, i2_regset, done);
919
920 return false;
921
922 done:
923 ;
924 }
925 #endif
926
927 if (reload_completed
928 ? rtx_renumbered_equal_p (p1, p2) : rtx_equal_p (p1, p2))
929 return true;
930
931 /* Do not do EQUIV substitution after reload. First, we're undoing the
932 work of reload_cse. Second, we may be undoing the work of the post-
933 reload splitting pass. */
934 /* ??? Possibly add a new phase switch variable that can be used by
935 targets to disallow the troublesome insns after splitting. */
936 if (!reload_completed)
937 {
938 /* The following code helps take care of G++ cleanups. */
939 rtx equiv1 = find_reg_equal_equiv_note (i1);
940 rtx equiv2 = find_reg_equal_equiv_note (i2);
941
942 if (equiv1 && equiv2
943 /* If the equivalences are not to a constant, they may
944 reference pseudos that no longer exist, so we can't
945 use them. */
946 && (! reload_completed
947 || (CONSTANT_P (XEXP (equiv1, 0))
948 && rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))))
949 {
950 rtx s1 = single_set (i1);
951 rtx s2 = single_set (i2);
952 if (s1 != 0 && s2 != 0
953 && rtx_renumbered_equal_p (SET_DEST (s1), SET_DEST (s2)))
954 {
955 validate_change (i1, &SET_SRC (s1), XEXP (equiv1, 0), 1);
956 validate_change (i2, &SET_SRC (s2), XEXP (equiv2, 0), 1);
957 if (! rtx_renumbered_equal_p (p1, p2))
958 cancel_changes (0);
959 else if (apply_change_group ())
960 return true;
961 }
962 }
963 }
964
965 return false;
966 }
967 \f
968 /* Look through the insns at the end of BB1 and BB2 and find the longest
969 sequence that are equivalent. Store the first insns for that sequence
970 in *F1 and *F2 and return the sequence length.
971
972 To simplify callers of this function, if the blocks match exactly,
973 store the head of the blocks in *F1 and *F2. */
974
975 static int
976 flow_find_cross_jump (int mode ATTRIBUTE_UNUSED, basic_block bb1,
977 basic_block bb2, rtx *f1, rtx *f2)
978 {
979 rtx i1, i2, last1, last2, afterlast1, afterlast2;
980 int ninsns = 0;
981
982 /* Skip simple jumps at the end of the blocks. Complex jumps still
983 need to be compared for equivalence, which we'll do below. */
984
985 i1 = BB_END (bb1);
986 last1 = afterlast1 = last2 = afterlast2 = NULL_RTX;
987 if (onlyjump_p (i1)
988 || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
989 {
990 last1 = i1;
991 i1 = PREV_INSN (i1);
992 }
993
994 i2 = BB_END (bb2);
995 if (onlyjump_p (i2)
996 || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
997 {
998 last2 = i2;
999 /* Count everything except for unconditional jump as insn. */
1000 if (!simplejump_p (i2) && !returnjump_p (i2) && last1)
1001 ninsns++;
1002 i2 = PREV_INSN (i2);
1003 }
1004
1005 while (true)
1006 {
1007 /* Ignore notes. */
1008 while (!INSN_P (i1) && i1 != BB_HEAD (bb1))
1009 i1 = PREV_INSN (i1);
1010
1011 while (!INSN_P (i2) && i2 != BB_HEAD (bb2))
1012 i2 = PREV_INSN (i2);
1013
1014 if (i1 == BB_HEAD (bb1) || i2 == BB_HEAD (bb2))
1015 break;
1016
1017 if (!insns_match_p (mode, i1, i2))
1018 break;
1019
1020 /* Don't begin a cross-jump with a NOTE insn. */
1021 if (INSN_P (i1))
1022 {
1023 /* If the merged insns have different REG_EQUAL notes, then
1024 remove them. */
1025 rtx equiv1 = find_reg_equal_equiv_note (i1);
1026 rtx equiv2 = find_reg_equal_equiv_note (i2);
1027
1028 if (equiv1 && !equiv2)
1029 remove_note (i1, equiv1);
1030 else if (!equiv1 && equiv2)
1031 remove_note (i2, equiv2);
1032 else if (equiv1 && equiv2
1033 && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
1034 {
1035 remove_note (i1, equiv1);
1036 remove_note (i2, equiv2);
1037 }
1038
1039 afterlast1 = last1, afterlast2 = last2;
1040 last1 = i1, last2 = i2;
1041 ninsns++;
1042 }
1043
1044 i1 = PREV_INSN (i1);
1045 i2 = PREV_INSN (i2);
1046 }
1047
1048 #ifdef HAVE_cc0
1049 /* Don't allow the insn after a compare to be shared by
1050 cross-jumping unless the compare is also shared. */
1051 if (ninsns && reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1))
1052 last1 = afterlast1, last2 = afterlast2, ninsns--;
1053 #endif
1054
1055 /* Include preceding notes and labels in the cross-jump. One,
1056 this may bring us to the head of the blocks as requested above.
1057 Two, it keeps line number notes as matched as may be. */
1058 if (ninsns)
1059 {
1060 while (last1 != BB_HEAD (bb1) && !INSN_P (PREV_INSN (last1)))
1061 last1 = PREV_INSN (last1);
1062
1063 if (last1 != BB_HEAD (bb1) && GET_CODE (PREV_INSN (last1)) == CODE_LABEL)
1064 last1 = PREV_INSN (last1);
1065
1066 while (last2 != BB_HEAD (bb2) && !INSN_P (PREV_INSN (last2)))
1067 last2 = PREV_INSN (last2);
1068
1069 if (last2 != BB_HEAD (bb2) && GET_CODE (PREV_INSN (last2)) == CODE_LABEL)
1070 last2 = PREV_INSN (last2);
1071
1072 *f1 = last1;
1073 *f2 = last2;
1074 }
1075
1076 return ninsns;
1077 }
1078
1079 /* Return true iff outgoing edges of BB1 and BB2 match, together with
1080 the branch instruction. This means that if we commonize the control
1081 flow before end of the basic block, the semantic remains unchanged.
1082
1083 We may assume that there exists one edge with a common destination. */
1084
1085 static bool
1086 outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
1087 {
1088 int nehedges1 = 0, nehedges2 = 0;
1089 edge fallthru1 = 0, fallthru2 = 0;
1090 edge e1, e2;
1091
1092 /* If BB1 has only one successor, we may be looking at either an
1093 unconditional jump, or a fake edge to exit. */
1094 if (bb1->succ && !bb1->succ->succ_next
1095 && (bb1->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
1096 && (GET_CODE (BB_END (bb1)) != JUMP_INSN || simplejump_p (BB_END (bb1))))
1097 return (bb2->succ && !bb2->succ->succ_next
1098 && (bb2->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
1099 && (GET_CODE (BB_END (bb2)) != JUMP_INSN || simplejump_p (BB_END (bb2))));
1100
1101 /* Match conditional jumps - this may get tricky when fallthru and branch
1102 edges are crossed. */
1103 if (bb1->succ
1104 && bb1->succ->succ_next
1105 && !bb1->succ->succ_next->succ_next
1106 && any_condjump_p (BB_END (bb1))
1107 && onlyjump_p (BB_END (bb1)))
1108 {
1109 edge b1, f1, b2, f2;
1110 bool reverse, match;
1111 rtx set1, set2, cond1, cond2;
1112 enum rtx_code code1, code2;
1113
1114 if (!bb2->succ
1115 || !bb2->succ->succ_next
1116 || bb2->succ->succ_next->succ_next
1117 || !any_condjump_p (BB_END (bb2))
1118 || !onlyjump_p (BB_END (bb2)))
1119 return false;
1120
1121 b1 = BRANCH_EDGE (bb1);
1122 b2 = BRANCH_EDGE (bb2);
1123 f1 = FALLTHRU_EDGE (bb1);
1124 f2 = FALLTHRU_EDGE (bb2);
1125
1126 /* Get around possible forwarders on fallthru edges. Other cases
1127 should be optimized out already. */
1128 if (FORWARDER_BLOCK_P (f1->dest))
1129 f1 = f1->dest->succ;
1130
1131 if (FORWARDER_BLOCK_P (f2->dest))
1132 f2 = f2->dest->succ;
1133
1134 /* To simplify use of this function, return false if there are
1135 unneeded forwarder blocks. These will get eliminated later
1136 during cleanup_cfg. */
1137 if (FORWARDER_BLOCK_P (f1->dest)
1138 || FORWARDER_BLOCK_P (f2->dest)
1139 || FORWARDER_BLOCK_P (b1->dest)
1140 || FORWARDER_BLOCK_P (b2->dest))
1141 return false;
1142
1143 if (f1->dest == f2->dest && b1->dest == b2->dest)
1144 reverse = false;
1145 else if (f1->dest == b2->dest && b1->dest == f2->dest)
1146 reverse = true;
1147 else
1148 return false;
1149
1150 set1 = pc_set (BB_END (bb1));
1151 set2 = pc_set (BB_END (bb2));
1152 if ((XEXP (SET_SRC (set1), 1) == pc_rtx)
1153 != (XEXP (SET_SRC (set2), 1) == pc_rtx))
1154 reverse = !reverse;
1155
1156 cond1 = XEXP (SET_SRC (set1), 0);
1157 cond2 = XEXP (SET_SRC (set2), 0);
1158 code1 = GET_CODE (cond1);
1159 if (reverse)
1160 code2 = reversed_comparison_code (cond2, BB_END (bb2));
1161 else
1162 code2 = GET_CODE (cond2);
1163
1164 if (code2 == UNKNOWN)
1165 return false;
1166
1167 /* Verify codes and operands match. */
1168 match = ((code1 == code2
1169 && rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
1170 && rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
1171 || (code1 == swap_condition (code2)
1172 && rtx_renumbered_equal_p (XEXP (cond1, 1),
1173 XEXP (cond2, 0))
1174 && rtx_renumbered_equal_p (XEXP (cond1, 0),
1175 XEXP (cond2, 1))));
1176
1177 /* If we return true, we will join the blocks. Which means that
1178 we will only have one branch prediction bit to work with. Thus
1179 we require the existing branches to have probabilities that are
1180 roughly similar. */
1181 if (match
1182 && !optimize_size
1183 && maybe_hot_bb_p (bb1)
1184 && maybe_hot_bb_p (bb2))
1185 {
1186 int prob2;
1187
1188 if (b1->dest == b2->dest)
1189 prob2 = b2->probability;
1190 else
1191 /* Do not use f2 probability as f2 may be forwarded. */
1192 prob2 = REG_BR_PROB_BASE - b2->probability;
1193
1194 /* Fail if the difference in probabilities is greater than 50%.
1195 This rules out two well-predicted branches with opposite
1196 outcomes. */
1197 if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2)
1198 {
1199 if (rtl_dump_file)
1200 fprintf (rtl_dump_file,
1201 "Outcomes of branch in bb %i and %i differs to much (%i %i)\n",
1202 bb1->index, bb2->index, b1->probability, prob2);
1203
1204 return false;
1205 }
1206 }
1207
1208 if (rtl_dump_file && match)
1209 fprintf (rtl_dump_file, "Conditionals in bb %i and %i match.\n",
1210 bb1->index, bb2->index);
1211
1212 return match;
1213 }
1214
1215 /* Generic case - we are seeing a computed jump, table jump or trapping
1216 instruction. */
1217
1218 #ifndef CASE_DROPS_THROUGH
1219 /* Check whether there are tablejumps in the end of BB1 and BB2.
1220 Return true if they are identical. */
1221 {
1222 rtx label1, label2;
1223 rtx table1, table2;
1224
1225 if (tablejump_p (BB_END (bb1), &label1, &table1)
1226 && tablejump_p (BB_END (bb2), &label2, &table2)
1227 && GET_CODE (PATTERN (table1)) == GET_CODE (PATTERN (table2)))
1228 {
1229 /* The labels should never be the same rtx. If they really are same
1230 the jump tables are same too. So disable crossjumping of blocks BB1
1231 and BB2 because when deleting the common insns in the end of BB1
1232 by delete_block () the jump table would be deleted too. */
1233 /* If LABEL2 is referenced in BB1->END do not do anything
1234 because we would loose information when replacing
1235 LABEL1 by LABEL2 and then LABEL2 by LABEL1 in BB1->END. */
1236 if (label1 != label2 && !rtx_referenced_p (label2, BB_END (bb1)))
1237 {
1238 /* Set IDENTICAL to true when the tables are identical. */
1239 bool identical = false;
1240 rtx p1, p2;
1241
1242 p1 = PATTERN (table1);
1243 p2 = PATTERN (table2);
1244 if (GET_CODE (p1) == ADDR_VEC && rtx_equal_p (p1, p2))
1245 {
1246 identical = true;
1247 }
1248 else if (GET_CODE (p1) == ADDR_DIFF_VEC
1249 && (XVECLEN (p1, 1) == XVECLEN (p2, 1))
1250 && rtx_equal_p (XEXP (p1, 2), XEXP (p2, 2))
1251 && rtx_equal_p (XEXP (p1, 3), XEXP (p2, 3)))
1252 {
1253 int i;
1254
1255 identical = true;
1256 for (i = XVECLEN (p1, 1) - 1; i >= 0 && identical; i--)
1257 if (!rtx_equal_p (XVECEXP (p1, 1, i), XVECEXP (p2, 1, i)))
1258 identical = false;
1259 }
1260
1261 if (identical)
1262 {
1263 replace_label_data rr;
1264 bool match;
1265
1266 /* Temporarily replace references to LABEL1 with LABEL2
1267 in BB1->END so that we could compare the instructions. */
1268 rr.r1 = label1;
1269 rr.r2 = label2;
1270 rr.update_label_nuses = false;
1271 for_each_rtx (&BB_END (bb1), replace_label, &rr);
1272
1273 match = insns_match_p (mode, BB_END (bb1), BB_END (bb2));
1274 if (rtl_dump_file && match)
1275 fprintf (rtl_dump_file,
1276 "Tablejumps in bb %i and %i match.\n",
1277 bb1->index, bb2->index);
1278
1279 /* Set the original label in BB1->END because when deleting
1280 a block whose end is a tablejump, the tablejump referenced
1281 from the instruction is deleted too. */
1282 rr.r1 = label2;
1283 rr.r2 = label1;
1284 for_each_rtx (&BB_END (bb1), replace_label, &rr);
1285
1286 return match;
1287 }
1288 }
1289 return false;
1290 }
1291 }
1292 #endif
1293
1294 /* First ensure that the instructions match. There may be many outgoing
1295 edges so this test is generally cheaper. */
1296 if (!insns_match_p (mode, BB_END (bb1), BB_END (bb2)))
1297 return false;
1298
1299 /* Search the outgoing edges, ensure that the counts do match, find possible
1300 fallthru and exception handling edges since these needs more
1301 validation. */
1302 for (e1 = bb1->succ, e2 = bb2->succ; e1 && e2;
1303 e1 = e1->succ_next, e2 = e2->succ_next)
1304 {
1305 if (e1->flags & EDGE_EH)
1306 nehedges1++;
1307
1308 if (e2->flags & EDGE_EH)
1309 nehedges2++;
1310
1311 if (e1->flags & EDGE_FALLTHRU)
1312 fallthru1 = e1;
1313 if (e2->flags & EDGE_FALLTHRU)
1314 fallthru2 = e2;
1315 }
1316
1317 /* If number of edges of various types does not match, fail. */
1318 if (e1 || e2
1319 || nehedges1 != nehedges2
1320 || (fallthru1 != 0) != (fallthru2 != 0))
1321 return false;
1322
1323 /* fallthru edges must be forwarded to the same destination. */
1324 if (fallthru1)
1325 {
1326 basic_block d1 = (forwarder_block_p (fallthru1->dest)
1327 ? fallthru1->dest->succ->dest: fallthru1->dest);
1328 basic_block d2 = (forwarder_block_p (fallthru2->dest)
1329 ? fallthru2->dest->succ->dest: fallthru2->dest);
1330
1331 if (d1 != d2)
1332 return false;
1333 }
1334
1335 /* Ensure the same EH region. */
1336 {
1337 rtx n1 = find_reg_note (BB_END (bb1), REG_EH_REGION, 0);
1338 rtx n2 = find_reg_note (BB_END (bb2), REG_EH_REGION, 0);
1339
1340 if (!n1 && n2)
1341 return false;
1342
1343 if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
1344 return false;
1345 }
1346
1347 /* We don't need to match the rest of edges as above checks should be enough
1348 to ensure that they are equivalent. */
1349 return true;
1350 }
1351
1352 /* E1 and E2 are edges with the same destination block. Search their
1353 predecessors for common code. If found, redirect control flow from
1354 (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC. */
1355
1356 static bool
1357 try_crossjump_to_edge (int mode, edge e1, edge e2)
1358 {
1359 int nmatch;
1360 basic_block src1 = e1->src, src2 = e2->src;
1361 basic_block redirect_to, redirect_from, to_remove;
1362 rtx newpos1, newpos2;
1363 edge s;
1364
1365 /* Search backward through forwarder blocks. We don't need to worry
1366 about multiple entry or chained forwarders, as they will be optimized
1367 away. We do this to look past the unconditional jump following a
1368 conditional jump that is required due to the current CFG shape. */
1369 if (src1->pred
1370 && !src1->pred->pred_next
1371 && FORWARDER_BLOCK_P (src1))
1372 e1 = src1->pred, src1 = e1->src;
1373
1374 if (src2->pred
1375 && !src2->pred->pred_next
1376 && FORWARDER_BLOCK_P (src2))
1377 e2 = src2->pred, src2 = e2->src;
1378
1379 /* Nothing to do if we reach ENTRY, or a common source block. */
1380 if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
1381 return false;
1382 if (src1 == src2)
1383 return false;
1384
1385 /* Seeing more than 1 forwarder blocks would confuse us later... */
1386 if (FORWARDER_BLOCK_P (e1->dest)
1387 && FORWARDER_BLOCK_P (e1->dest->succ->dest))
1388 return false;
1389
1390 if (FORWARDER_BLOCK_P (e2->dest)
1391 && FORWARDER_BLOCK_P (e2->dest->succ->dest))
1392 return false;
1393
1394 /* Likewise with dead code (possibly newly created by the other optimizations
1395 of cfg_cleanup). */
1396 if (!src1->pred || !src2->pred)
1397 return false;
1398
1399 /* Look for the common insn sequence, part the first ... */
1400 if (!outgoing_edges_match (mode, src1, src2))
1401 return false;
1402
1403 /* ... and part the second. */
1404 nmatch = flow_find_cross_jump (mode, src1, src2, &newpos1, &newpos2);
1405 if (!nmatch)
1406 return false;
1407
1408 #ifndef CASE_DROPS_THROUGH
1409 /* Here we know that the insns in the end of SRC1 which are common with SRC2
1410 will be deleted.
1411 If we have tablejumps in the end of SRC1 and SRC2
1412 they have been already compared for equivalence in outgoing_edges_match ()
1413 so replace the references to TABLE1 by references to TABLE2. */
1414 {
1415 rtx label1, label2;
1416 rtx table1, table2;
1417
1418 if (tablejump_p (BB_END (src1), &label1, &table1)
1419 && tablejump_p (BB_END (src2), &label2, &table2)
1420 && label1 != label2)
1421 {
1422 replace_label_data rr;
1423 rtx insn;
1424
1425 /* Replace references to LABEL1 with LABEL2. */
1426 rr.r1 = label1;
1427 rr.r2 = label2;
1428 rr.update_label_nuses = true;
1429 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1430 {
1431 /* Do not replace the label in SRC1->END because when deleting
1432 a block whose end is a tablejump, the tablejump referenced
1433 from the instruction is deleted too. */
1434 if (insn != BB_END (src1))
1435 for_each_rtx (&insn, replace_label, &rr);
1436 }
1437 }
1438 }
1439 #endif
1440
1441 /* Avoid splitting if possible. */
1442 if (newpos2 == BB_HEAD (src2))
1443 redirect_to = src2;
1444 else
1445 {
1446 if (rtl_dump_file)
1447 fprintf (rtl_dump_file, "Splitting bb %i before %i insns\n",
1448 src2->index, nmatch);
1449 redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
1450 }
1451
1452 if (rtl_dump_file)
1453 fprintf (rtl_dump_file,
1454 "Cross jumping from bb %i to bb %i; %i common insns\n",
1455 src1->index, src2->index, nmatch);
1456
1457 redirect_to->count += src1->count;
1458 redirect_to->frequency += src1->frequency;
1459 /* We may have some registers visible trought the block. */
1460 redirect_to->flags |= BB_DIRTY;
1461
1462 /* Recompute the frequencies and counts of outgoing edges. */
1463 for (s = redirect_to->succ; s; s = s->succ_next)
1464 {
1465 edge s2;
1466 basic_block d = s->dest;
1467
1468 if (FORWARDER_BLOCK_P (d))
1469 d = d->succ->dest;
1470
1471 for (s2 = src1->succ; ; s2 = s2->succ_next)
1472 {
1473 basic_block d2 = s2->dest;
1474 if (FORWARDER_BLOCK_P (d2))
1475 d2 = d2->succ->dest;
1476 if (d == d2)
1477 break;
1478 }
1479
1480 s->count += s2->count;
1481
1482 /* Take care to update possible forwarder blocks. We verified
1483 that there is no more than one in the chain, so we can't run
1484 into infinite loop. */
1485 if (FORWARDER_BLOCK_P (s->dest))
1486 {
1487 s->dest->succ->count += s2->count;
1488 s->dest->count += s2->count;
1489 s->dest->frequency += EDGE_FREQUENCY (s);
1490 }
1491
1492 if (FORWARDER_BLOCK_P (s2->dest))
1493 {
1494 s2->dest->succ->count -= s2->count;
1495 if (s2->dest->succ->count < 0)
1496 s2->dest->succ->count = 0;
1497 s2->dest->count -= s2->count;
1498 s2->dest->frequency -= EDGE_FREQUENCY (s);
1499 if (s2->dest->frequency < 0)
1500 s2->dest->frequency = 0;
1501 if (s2->dest->count < 0)
1502 s2->dest->count = 0;
1503 }
1504
1505 if (!redirect_to->frequency && !src1->frequency)
1506 s->probability = (s->probability + s2->probability) / 2;
1507 else
1508 s->probability
1509 = ((s->probability * redirect_to->frequency +
1510 s2->probability * src1->frequency)
1511 / (redirect_to->frequency + src1->frequency));
1512 }
1513
1514 update_br_prob_note (redirect_to);
1515
1516 /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1. */
1517
1518 /* Skip possible basic block header. */
1519 if (GET_CODE (newpos1) == CODE_LABEL)
1520 newpos1 = NEXT_INSN (newpos1);
1521
1522 if (GET_CODE (newpos1) == NOTE)
1523 newpos1 = NEXT_INSN (newpos1);
1524
1525 redirect_from = split_block (src1, PREV_INSN (newpos1))->src;
1526 to_remove = redirect_from->succ->dest;
1527
1528 redirect_edge_and_branch_force (redirect_from->succ, redirect_to);
1529 delete_block (to_remove);
1530
1531 update_forwarder_flag (redirect_from);
1532
1533 return true;
1534 }
1535
1536 /* Search the predecessors of BB for common insn sequences. When found,
1537 share code between them by redirecting control flow. Return true if
1538 any changes made. */
1539
1540 static bool
1541 try_crossjump_bb (int mode, basic_block bb)
1542 {
1543 edge e, e2, nexte2, nexte, fallthru;
1544 bool changed;
1545 int n = 0, max;
1546
1547 /* Nothing to do if there is not at least two incoming edges. */
1548 if (!bb->pred || !bb->pred->pred_next)
1549 return false;
1550
1551 /* It is always cheapest to redirect a block that ends in a branch to
1552 a block that falls through into BB, as that adds no branches to the
1553 program. We'll try that combination first. */
1554 fallthru = NULL;
1555 max = PARAM_VALUE (PARAM_MAX_CROSSJUMP_EDGES);
1556 for (e = bb->pred; e ; e = e->pred_next, n++)
1557 {
1558 if (e->flags & EDGE_FALLTHRU)
1559 fallthru = e;
1560 if (n > max)
1561 return false;
1562 }
1563
1564 changed = false;
1565 for (e = bb->pred; e; e = nexte)
1566 {
1567 nexte = e->pred_next;
1568
1569 /* As noted above, first try with the fallthru predecessor. */
1570 if (fallthru)
1571 {
1572 /* Don't combine the fallthru edge into anything else.
1573 If there is a match, we'll do it the other way around. */
1574 if (e == fallthru)
1575 continue;
1576
1577 if (try_crossjump_to_edge (mode, e, fallthru))
1578 {
1579 changed = true;
1580 nexte = bb->pred;
1581 continue;
1582 }
1583 }
1584
1585 /* Non-obvious work limiting check: Recognize that we're going
1586 to call try_crossjump_bb on every basic block. So if we have
1587 two blocks with lots of outgoing edges (a switch) and they
1588 share lots of common destinations, then we would do the
1589 cross-jump check once for each common destination.
1590
1591 Now, if the blocks actually are cross-jump candidates, then
1592 all of their destinations will be shared. Which means that
1593 we only need check them for cross-jump candidacy once. We
1594 can eliminate redundant checks of crossjump(A,B) by arbitrarily
1595 choosing to do the check from the block for which the edge
1596 in question is the first successor of A. */
1597 if (e->src->succ != e)
1598 continue;
1599
1600 for (e2 = bb->pred; e2; e2 = nexte2)
1601 {
1602 nexte2 = e2->pred_next;
1603
1604 if (e2 == e)
1605 continue;
1606
1607 /* We've already checked the fallthru edge above. */
1608 if (e2 == fallthru)
1609 continue;
1610
1611 /* The "first successor" check above only prevents multiple
1612 checks of crossjump(A,B). In order to prevent redundant
1613 checks of crossjump(B,A), require that A be the block
1614 with the lowest index. */
1615 if (e->src->index > e2->src->index)
1616 continue;
1617
1618 if (try_crossjump_to_edge (mode, e, e2))
1619 {
1620 changed = true;
1621 nexte = bb->pred;
1622 break;
1623 }
1624 }
1625 }
1626
1627 return changed;
1628 }
1629
1630 /* Do simple CFG optimizations - basic block merging, simplifying of jump
1631 instructions etc. Return nonzero if changes were made. */
1632
1633 static bool
1634 try_optimize_cfg (int mode)
1635 {
1636 bool changed_overall = false;
1637 bool changed;
1638 int iterations = 0;
1639 basic_block bb, b, next;
1640
1641 if (mode & CLEANUP_CROSSJUMP)
1642 add_noreturn_fake_exit_edges ();
1643
1644 FOR_EACH_BB (bb)
1645 update_forwarder_flag (bb);
1646
1647 if (mode & CLEANUP_UPDATE_LIFE)
1648 clear_bb_flags ();
1649
1650 if (! (* targetm.cannot_modify_jumps_p) ())
1651 {
1652 /* Attempt to merge blocks as made possible by edge removal. If
1653 a block has only one successor, and the successor has only
1654 one predecessor, they may be combined. */
1655 do
1656 {
1657 changed = false;
1658 iterations++;
1659
1660 if (rtl_dump_file)
1661 fprintf (rtl_dump_file,
1662 "\n\ntry_optimize_cfg iteration %i\n\n",
1663 iterations);
1664
1665 for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR;)
1666 {
1667 basic_block c;
1668 edge s;
1669 bool changed_here = false;
1670
1671 /* Delete trivially dead basic blocks. */
1672 while (b->pred == NULL)
1673 {
1674 c = b->prev_bb;
1675 if (rtl_dump_file)
1676 fprintf (rtl_dump_file, "Deleting block %i.\n",
1677 b->index);
1678
1679 delete_block (b);
1680 if (!(mode & CLEANUP_CFGLAYOUT))
1681 changed = true;
1682 b = c;
1683 }
1684
1685 /* Remove code labels no longer used. Don't do this
1686 before CALL_PLACEHOLDER is removed, as some branches
1687 may be hidden within. */
1688 if (b->pred->pred_next == NULL
1689 && (b->pred->flags & EDGE_FALLTHRU)
1690 && !(b->pred->flags & EDGE_COMPLEX)
1691 && GET_CODE (BB_HEAD (b)) == CODE_LABEL
1692 && (!(mode & CLEANUP_PRE_SIBCALL)
1693 || !tail_recursion_label_p (BB_HEAD (b)))
1694 /* If the previous block ends with a branch to this
1695 block, we can't delete the label. Normally this
1696 is a condjump that is yet to be simplified, but
1697 if CASE_DROPS_THRU, this can be a tablejump with
1698 some element going to the same place as the
1699 default (fallthru). */
1700 && (b->pred->src == ENTRY_BLOCK_PTR
1701 || GET_CODE (BB_END (b->pred->src)) != JUMP_INSN
1702 || ! label_is_jump_target_p (BB_HEAD (b),
1703 BB_END (b->pred->src))))
1704 {
1705 rtx label = BB_HEAD (b);
1706
1707 delete_insn_chain (label, label);
1708 /* In the case label is undeletable, move it after the
1709 BASIC_BLOCK note. */
1710 if (NOTE_LINE_NUMBER (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL)
1711 {
1712 rtx bb_note = NEXT_INSN (BB_HEAD (b));
1713
1714 reorder_insns_nobb (label, label, bb_note);
1715 BB_HEAD (b) = bb_note;
1716 }
1717 if (rtl_dump_file)
1718 fprintf (rtl_dump_file, "Deleted label in block %i.\n",
1719 b->index);
1720 }
1721
1722 /* If we fall through an empty block, we can remove it. */
1723 if (!(mode & CLEANUP_CFGLAYOUT)
1724 && b->pred->pred_next == NULL
1725 && (b->pred->flags & EDGE_FALLTHRU)
1726 && GET_CODE (BB_HEAD (b)) != CODE_LABEL
1727 && FORWARDER_BLOCK_P (b)
1728 /* Note that forwarder_block_p true ensures that
1729 there is a successor for this block. */
1730 && (b->succ->flags & EDGE_FALLTHRU)
1731 && n_basic_blocks > 1)
1732 {
1733 if (rtl_dump_file)
1734 fprintf (rtl_dump_file,
1735 "Deleting fallthru block %i.\n",
1736 b->index);
1737
1738 c = b->prev_bb == ENTRY_BLOCK_PTR ? b->next_bb : b->prev_bb;
1739 redirect_edge_succ_nodup (b->pred, b->succ->dest);
1740 delete_block (b);
1741 changed = true;
1742 b = c;
1743 }
1744
1745 if ((s = b->succ) != NULL
1746 && s->succ_next == NULL
1747 && !(s->flags & EDGE_COMPLEX)
1748 && (c = s->dest) != EXIT_BLOCK_PTR
1749 && c->pred->pred_next == NULL
1750 && b != c)
1751 {
1752 /* When not in cfg_layout mode use code aware of reordering
1753 INSN. This code possibly creates new basic blocks so it
1754 does not fit merge_blocks interface and is kept here in
1755 hope that it will become useless once more of compiler
1756 is transformed to use cfg_layout mode. */
1757
1758 if ((mode & CLEANUP_CFGLAYOUT)
1759 && can_merge_blocks_p (b, c))
1760 {
1761 merge_blocks (b, c);
1762 update_forwarder_flag (b);
1763 changed_here = true;
1764 }
1765 else if (!(mode & CLEANUP_CFGLAYOUT)
1766 /* If the jump insn has side effects,
1767 we can't kill the edge. */
1768 && (GET_CODE (BB_END (b)) != JUMP_INSN
1769 || (reload_completed
1770 ? simplejump_p (BB_END (b))
1771 : onlyjump_p (BB_END (b))))
1772 && (next = merge_blocks_move (s, b, c, mode)))
1773 {
1774 b = next;
1775 changed_here = true;
1776 }
1777 }
1778
1779 /* Simplify branch over branch. */
1780 if ((mode & CLEANUP_EXPENSIVE)
1781 && !(mode & CLEANUP_CFGLAYOUT)
1782 && try_simplify_condjump (b))
1783 changed_here = true;
1784
1785 /* If B has a single outgoing edge, but uses a
1786 non-trivial jump instruction without side-effects, we
1787 can either delete the jump entirely, or replace it
1788 with a simple unconditional jump. */
1789 if (b->succ
1790 && ! b->succ->succ_next
1791 && b->succ->dest != EXIT_BLOCK_PTR
1792 && onlyjump_p (BB_END (b))
1793 && try_redirect_by_replacing_jump (b->succ, b->succ->dest,
1794 (mode & CLEANUP_CFGLAYOUT)))
1795 {
1796 update_forwarder_flag (b);
1797 changed_here = true;
1798 }
1799
1800 /* Simplify branch to branch. */
1801 if (try_forward_edges (mode, b))
1802 changed_here = true;
1803
1804 /* Look for shared code between blocks. */
1805 if ((mode & CLEANUP_CROSSJUMP)
1806 && try_crossjump_bb (mode, b))
1807 changed_here = true;
1808
1809 /* Don't get confused by the index shift caused by
1810 deleting blocks. */
1811 if (!changed_here)
1812 b = b->next_bb;
1813 else
1814 changed = true;
1815 }
1816
1817 if ((mode & CLEANUP_CROSSJUMP)
1818 && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
1819 changed = true;
1820
1821 #ifdef ENABLE_CHECKING
1822 if (changed)
1823 verify_flow_info ();
1824 #endif
1825
1826 changed_overall |= changed;
1827 }
1828 while (changed);
1829 }
1830
1831 if (mode & CLEANUP_CROSSJUMP)
1832 remove_fake_edges ();
1833
1834 clear_aux_for_blocks ();
1835
1836 return changed_overall;
1837 }
1838 \f
1839 /* Delete all unreachable basic blocks. */
1840
1841 bool
1842 delete_unreachable_blocks (void)
1843 {
1844 bool changed = false;
1845 basic_block b, next_bb;
1846
1847 find_unreachable_blocks ();
1848
1849 /* Delete all unreachable basic blocks. */
1850
1851 for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR; b = next_bb)
1852 {
1853 next_bb = b->next_bb;
1854
1855 if (!(b->flags & BB_REACHABLE))
1856 {
1857 delete_block (b);
1858 changed = true;
1859 }
1860 }
1861
1862 if (changed)
1863 tidy_fallthru_edges ();
1864 return changed;
1865 }
1866 \f
1867 /* Tidy the CFG by deleting unreachable code and whatnot. */
1868
1869 bool
1870 cleanup_cfg (int mode)
1871 {
1872 bool changed = false;
1873
1874 timevar_push (TV_CLEANUP_CFG);
1875 if (delete_unreachable_blocks ())
1876 {
1877 changed = true;
1878 /* We've possibly created trivially dead code. Cleanup it right
1879 now to introduce more opportunities for try_optimize_cfg. */
1880 if (!(mode & (CLEANUP_NO_INSN_DEL
1881 | CLEANUP_UPDATE_LIFE | CLEANUP_PRE_SIBCALL))
1882 && !reload_completed)
1883 delete_trivially_dead_insns (get_insns(), max_reg_num ());
1884 }
1885
1886 compact_blocks ();
1887
1888 while (try_optimize_cfg (mode))
1889 {
1890 delete_unreachable_blocks (), changed = true;
1891 if (mode & CLEANUP_UPDATE_LIFE)
1892 {
1893 /* Cleaning up CFG introduces more opportunities for dead code
1894 removal that in turn may introduce more opportunities for
1895 cleaning up the CFG. */
1896 if (!update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
1897 PROP_DEATH_NOTES
1898 | PROP_SCAN_DEAD_CODE
1899 | PROP_KILL_DEAD_CODE
1900 | PROP_LOG_LINKS))
1901 break;
1902 }
1903 else if (!(mode & (CLEANUP_NO_INSN_DEL | CLEANUP_PRE_SIBCALL))
1904 && (mode & CLEANUP_EXPENSIVE)
1905 && !reload_completed)
1906 {
1907 if (!delete_trivially_dead_insns (get_insns(), max_reg_num ()))
1908 break;
1909 }
1910 else
1911 break;
1912 delete_dead_jumptables ();
1913 }
1914
1915 /* Kill the data we won't maintain. */
1916 free_EXPR_LIST_list (&label_value_list);
1917 timevar_pop (TV_CLEANUP_CFG);
1918
1919 return changed;
1920 }