OSDN Git Service

3e68cbe3a173d170fe71abb11542d46ee2e879a4
[pf3gnuchains/gcc-fork.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                                || (flow2_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.  Use
1789                  redirect_edge_and_branch to do the dirty work.  */
1790               if (b->succ
1791                   && ! b->succ->succ_next
1792                   && b->succ->dest != EXIT_BLOCK_PTR
1793                   && onlyjump_p (BB_END (b))
1794                   && redirect_edge_and_branch (b->succ, b->succ->dest))
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 }