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