OSDN Git Service

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