OSDN Git Service

Basic block renumbering removal.
[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 "rtl.h"
37 #include "hard-reg-set.h"
38 #include "basic-block.h"
39 #include "timevar.h"
40 #include "output.h"
41 #include "insn-config.h"
42 #include "flags.h"
43 #include "recog.h"
44 #include "toplev.h"
45 #include "cselib.h"
46 #include "tm_p.h"
47 #include "target.h"
48
49 #include "obstack.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    allways 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 pesimistic.  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 < num_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 = num_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                                               * num_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 = num_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 >= num_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
522           counter++;
523           target = new_target;
524           threaded |= new_target_threaded;
525         }
526
527       if (counter >= num_basic_blocks)
528         {
529           if (rtl_dump_file)
530             fprintf (rtl_dump_file, "Infinite loop in BB %i.\n",
531                      target->sindex);
532         }
533       else if (target == first)
534         ; /* We didn't do anything.  */
535       else
536         {
537           /* Save the values now, as the edge may get removed.  */
538           gcov_type edge_count = e->count;
539           int edge_probability = e->probability;
540           int edge_frequency;
541           int n = 0;
542
543           /* Don't force if target is exit block.  */
544           if (threaded && target != EXIT_BLOCK_PTR)
545             {
546               notice_new_block (redirect_edge_and_branch_force (e, target));
547               if (rtl_dump_file)
548                 fprintf (rtl_dump_file, "Conditionals threaded.\n");
549             }
550           else if (!redirect_edge_and_branch (e, target))
551             {
552               if (rtl_dump_file)
553                 fprintf (rtl_dump_file,
554                          "Forwarding edge %i->%i to %i failed.\n",
555                          b->sindex, e->dest->sindex, target->sindex);
556               continue;
557             }
558
559           /* We successfully forwarded the edge.  Now update profile
560              data: for each edge we traversed in the chain, remove
561              the original edge's execution count.  */
562           edge_frequency = ((edge_probability * b->frequency
563                              + REG_BR_PROB_BASE / 2)
564                             / REG_BR_PROB_BASE);
565
566           if (!FORWARDER_BLOCK_P (b) && forwarder_block_p (b))
567             BB_SET_FLAG (b, BB_FORWARDER_BLOCK);
568
569           do
570             {
571               edge t;
572
573               first->count -= edge_count;
574               if (first->count < 0)
575                 first->count = 0;
576               first->frequency -= edge_frequency;
577               if (first->frequency < 0)
578                 first->frequency = 0;
579               if (first->succ->succ_next)
580                 {
581                   edge e;
582                   int prob;
583                   if (n >= nthreaded_edges)
584                     abort ();
585                   t = threaded_edges [n++];
586                   if (t->src != first)
587                     abort ();
588                   if (first->frequency)
589                     prob = edge_frequency * REG_BR_PROB_BASE / first->frequency;
590                   else
591                     prob = 0;
592                   if (prob > t->probability)
593                     prob = t->probability;
594                   t->probability -= prob;
595                   prob = REG_BR_PROB_BASE - prob;
596                   if (prob <= 0)
597                     {
598                       first->succ->probability = REG_BR_PROB_BASE;
599                       first->succ->succ_next->probability = 0;
600                     }
601                   else
602                     for (e = first->succ; e; e = e->succ_next)
603                       e->probability = ((e->probability * REG_BR_PROB_BASE)
604                                         / (double) prob);
605                   update_br_prob_note (first);
606                 }
607               else
608                 {
609                   /* It is possible that as the result of
610                      threading we've removed edge as it is
611                      threaded to the fallthru edge.  Avoid
612                      getting out of sync.  */
613                   if (n < nthreaded_edges
614                       && first == threaded_edges [n]->src)
615                     n++;
616                   t = first->succ;
617                  }
618
619               t->count -= edge_count;
620               if (t->count < 0)
621                 t->count = 0;
622               first = t->dest;
623             }
624           while (first != target);
625
626           changed = true;
627         }
628     }
629
630   if (threaded_edges)
631     free (threaded_edges);
632   return changed;
633 }
634 \f
635 /* Return true if LABEL is a target of JUMP_INSN.  This applies only
636    to non-complex jumps.  That is, direct unconditional, conditional,
637    and tablejumps, but not computed jumps or returns.  It also does
638    not apply to the fallthru case of a conditional jump.  */
639
640 static bool
641 label_is_jump_target_p (label, jump_insn)
642      rtx label, jump_insn;
643 {
644   rtx tmp = JUMP_LABEL (jump_insn);
645
646   if (label == tmp)
647     return true;
648
649   if (tmp != NULL_RTX
650       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
651       && GET_CODE (tmp) == JUMP_INSN
652       && (tmp = PATTERN (tmp),
653           GET_CODE (tmp) == ADDR_VEC
654           || GET_CODE (tmp) == ADDR_DIFF_VEC))
655     {
656       rtvec vec = XVEC (tmp, GET_CODE (tmp) == ADDR_DIFF_VEC);
657       int i, veclen = GET_NUM_ELEM (vec);
658
659       for (i = 0; i < veclen; ++i)
660         if (XEXP (RTVEC_ELT (vec, i), 0) == label)
661           return true;
662     }
663
664   return false;
665 }
666
667 /* Return true if LABEL is used for tail recursion.  */
668
669 static bool
670 tail_recursion_label_p (label)
671      rtx label;
672 {
673   rtx x;
674
675   for (x = tail_recursion_label_list; x; x = XEXP (x, 1))
676     if (label == XEXP (x, 0))
677       return true;
678
679   return false;
680 }
681
682 /* Blocks A and B are to be merged into a single block.  A has no incoming
683    fallthru edge, so it can be moved before B without adding or modifying
684    any jumps (aside from the jump from A to B).  */
685
686 static void
687 merge_blocks_move_predecessor_nojumps (a, b)
688      basic_block a, b;
689 {
690   rtx barrier;
691
692   barrier = next_nonnote_insn (a->end);
693   if (GET_CODE (barrier) != BARRIER)
694     abort ();
695   delete_insn (barrier);
696
697   /* Move block and loop notes out of the chain so that we do not
698      disturb their order.
699
700      ??? A better solution would be to squeeze out all the non-nested notes
701      and adjust the block trees appropriately.   Even better would be to have
702      a tighter connection between block trees and rtl so that this is not
703      necessary.  */
704   if (squeeze_notes (&a->head, &a->end))
705     abort ();
706
707   /* Scramble the insn chain.  */
708   if (a->end != PREV_INSN (b->head))
709     reorder_insns_nobb (a->head, a->end, PREV_INSN (b->head));
710   a->flags |= BB_DIRTY;
711
712   if (rtl_dump_file)
713     fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n",
714              a->sindex, b->sindex);
715
716   /* Swap the records for the two blocks around.  */
717   unlink_block (a);
718   link_block (a, b->prev_bb);
719
720   /* Now blocks A and B are contiguous.  Merge them.  */
721   merge_blocks_nomove (a, b);
722 }
723
724 /* Blocks A and B are to be merged into a single block.  B has no outgoing
725    fallthru edge, so it can be moved after A without adding or modifying
726    any jumps (aside from the jump from A to B).  */
727
728 static void
729 merge_blocks_move_successor_nojumps (a, b)
730      basic_block a, b;
731 {
732   rtx barrier, real_b_end;
733
734   real_b_end = b->end;
735   barrier = NEXT_INSN (b->end);
736
737   /* Recognize a jump table following block B.  */
738   if (barrier
739       && GET_CODE (barrier) == CODE_LABEL
740       && NEXT_INSN (barrier)
741       && GET_CODE (NEXT_INSN (barrier)) == JUMP_INSN
742       && (GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_VEC
743           || GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_DIFF_VEC))
744     {
745       /* Temporarily add the table jump insn to b, so that it will also
746          be moved to the correct location.  */
747       b->end = NEXT_INSN (barrier);
748       barrier = NEXT_INSN (b->end);
749     }
750
751   /* There had better have been a barrier there.  Delete it.  */
752   if (barrier && GET_CODE (barrier) == BARRIER)
753     delete_insn (barrier);
754
755   /* Move block and loop notes out of the chain so that we do not
756      disturb their order.
757
758      ??? A better solution would be to squeeze out all the non-nested notes
759      and adjust the block trees appropriately.   Even better would be to have
760      a tighter connection between block trees and rtl so that this is not
761      necessary.  */
762   if (squeeze_notes (&b->head, &b->end))
763     abort ();
764
765   /* Scramble the insn chain.  */
766   reorder_insns_nobb (b->head, b->end, a->end);
767
768   /* Restore the real end of b.  */
769   b->end = real_b_end;
770
771   if (rtl_dump_file)
772     fprintf (rtl_dump_file, "Moved block %d after %d and merged.\n",
773              b->sindex, a->sindex);
774
775   /* Now blocks A and B are contiguous.  Merge them.  */
776   merge_blocks_nomove (a, b);
777 }
778
779 /* Attempt to merge basic blocks that are potentially non-adjacent.
780    Return true iff the attempt succeeded.  */
781
782 static bool
783 merge_blocks (e, b, c, mode)
784      edge e;
785      basic_block b, c;
786      int mode;
787 {
788   /* If C has a tail recursion label, do not merge.  There is no
789      edge recorded from the call_placeholder back to this label, as
790      that would make optimize_sibling_and_tail_recursive_calls more
791      complex for no gain.  */
792   if ((mode & CLEANUP_PRE_SIBCALL)
793       && GET_CODE (c->head) == CODE_LABEL
794       && tail_recursion_label_p (c->head))
795     return false;
796
797   /* If B has a fallthru edge to C, no need to move anything.  */
798   if (e->flags & EDGE_FALLTHRU)
799     {
800       int b_index = b->sindex, c_index = c->sindex;
801       merge_blocks_nomove (b, c);
802       update_forwarder_flag (b);
803
804       if (rtl_dump_file)
805         fprintf (rtl_dump_file, "Merged %d and %d without moving.\n",
806                  b_index, c_index);
807
808       return true;
809     }
810
811   /* Otherwise we will need to move code around.  Do that only if expensive
812      transformations are allowed.  */
813   else if (mode & CLEANUP_EXPENSIVE)
814     {
815       edge tmp_edge, b_fallthru_edge;
816       bool c_has_outgoing_fallthru;
817       bool b_has_incoming_fallthru;
818
819       /* Avoid overactive code motion, as the forwarder blocks should be
820          eliminated by edge redirection instead.  One exception might have
821          been if B is a forwarder block and C has no fallthru edge, but
822          that should be cleaned up by bb-reorder instead.  */
823       if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
824         return false;
825
826       /* We must make sure to not munge nesting of lexical blocks,
827          and loop notes.  This is done by squeezing out all the notes
828          and leaving them there to lie.  Not ideal, but functional.  */
829
830       for (tmp_edge = c->succ; tmp_edge; tmp_edge = tmp_edge->succ_next)
831         if (tmp_edge->flags & EDGE_FALLTHRU)
832           break;
833
834       c_has_outgoing_fallthru = (tmp_edge != NULL);
835
836       for (tmp_edge = b->pred; tmp_edge; tmp_edge = tmp_edge->pred_next)
837         if (tmp_edge->flags & EDGE_FALLTHRU)
838           break;
839
840       b_has_incoming_fallthru = (tmp_edge != NULL);
841       b_fallthru_edge = tmp_edge;
842
843       /* Otherwise, we're going to try to move C after B.  If C does
844          not have an outgoing fallthru, then it can be moved
845          immediately after B without introducing or modifying jumps.  */
846       if (! c_has_outgoing_fallthru)
847         {
848           merge_blocks_move_successor_nojumps (b, c);
849           return true;
850         }
851
852       /* If B does not have an incoming fallthru, then it can be moved
853          immediately before C without introducing or modifying jumps.
854          C cannot be the first block, so we do not have to worry about
855          accessing a non-existent block.  */
856
857       if (b_has_incoming_fallthru)
858         {
859           basic_block bb;
860
861           if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
862             return false;
863           bb = force_nonfallthru (b_fallthru_edge);
864           if (bb)
865             notice_new_block (bb);
866         }
867
868       merge_blocks_move_predecessor_nojumps (b, c);
869       return true;
870     }
871
872   return false;
873 }
874 \f
875
876 /* Return true if I1 and I2 are equivalent and thus can be crossjumped.  */
877
878 static bool
879 insns_match_p (mode, i1, i2)
880         int mode ATTRIBUTE_UNUSED;
881         rtx i1, i2;
882 {
883   rtx p1, p2;
884
885   /* Verify that I1 and I2 are equivalent.  */
886   if (GET_CODE (i1) != GET_CODE (i2))
887     return false;
888
889   p1 = PATTERN (i1);
890   p2 = PATTERN (i2);
891
892   if (GET_CODE (p1) != GET_CODE (p2))
893     return false;
894
895   /* If this is a CALL_INSN, compare register usage information.
896      If we don't check this on stack register machines, the two
897      CALL_INSNs might be merged leaving reg-stack.c with mismatching
898      numbers of stack registers in the same basic block.
899      If we don't check this on machines with delay slots, a delay slot may
900      be filled that clobbers a parameter expected by the subroutine.
901
902      ??? We take the simple route for now and assume that if they're
903      equal, they were constructed identically.  */
904
905   if (GET_CODE (i1) == CALL_INSN
906       && !rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
907                        CALL_INSN_FUNCTION_USAGE (i2)))
908     return false;
909
910 #ifdef STACK_REGS
911   /* If cross_jump_death_matters is not 0, the insn's mode
912      indicates whether or not the insn contains any stack-like
913      regs.  */
914
915   if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
916     {
917       /* If register stack conversion has already been done, then
918          death notes must also be compared before it is certain that
919          the two instruction streams match.  */
920
921       rtx note;
922       HARD_REG_SET i1_regset, i2_regset;
923
924       CLEAR_HARD_REG_SET (i1_regset);
925       CLEAR_HARD_REG_SET (i2_regset);
926
927       for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
928         if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
929           SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
930
931       for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
932         if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
933           SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
934
935       GO_IF_HARD_REG_EQUAL (i1_regset, i2_regset, done);
936
937       return false;
938
939     done:
940       ;
941     }
942 #endif
943
944   if (reload_completed
945       ? ! rtx_renumbered_equal_p (p1, p2) : ! rtx_equal_p (p1, p2))
946     {
947       /* The following code helps take care of G++ cleanups.  */
948       rtx equiv1 = find_reg_equal_equiv_note (i1);
949       rtx equiv2 = find_reg_equal_equiv_note (i2);
950
951       if (equiv1 && equiv2
952           /* If the equivalences are not to a constant, they may
953              reference pseudos that no longer exist, so we can't
954              use them.  */
955           && (! reload_completed
956               || (CONSTANT_P (XEXP (equiv1, 0))
957                   && rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))))
958         {
959           rtx s1 = single_set (i1);
960           rtx s2 = single_set (i2);
961           if (s1 != 0 && s2 != 0
962               && rtx_renumbered_equal_p (SET_DEST (s1), SET_DEST (s2)))
963             {
964               validate_change (i1, &SET_SRC (s1), XEXP (equiv1, 0), 1);
965               validate_change (i2, &SET_SRC (s2), XEXP (equiv2, 0), 1);
966               if (! rtx_renumbered_equal_p (p1, p2))
967                 cancel_changes (0);
968               else if (apply_change_group ())
969                 return true;
970             }
971         }
972
973       return false;
974     }
975
976   return true;
977 }
978 \f
979 /* Look through the insns at the end of BB1 and BB2 and find the longest
980    sequence that are equivalent.  Store the first insns for that sequence
981    in *F1 and *F2 and return the sequence length.
982
983    To simplify callers of this function, if the blocks match exactly,
984    store the head of the blocks in *F1 and *F2.  */
985
986 static int
987 flow_find_cross_jump (mode, bb1, bb2, f1, f2)
988      int mode ATTRIBUTE_UNUSED;
989      basic_block bb1, bb2;
990      rtx *f1, *f2;
991 {
992   rtx i1, i2, last1, last2, afterlast1, afterlast2;
993   int ninsns = 0;
994
995   /* Skip simple jumps at the end of the blocks.  Complex jumps still
996      need to be compared for equivalence, which we'll do below.  */
997
998   i1 = bb1->end;
999   last1 = afterlast1 = last2 = afterlast2 = NULL_RTX;
1000   if (onlyjump_p (i1)
1001       || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
1002     {
1003       last1 = i1;
1004       i1 = PREV_INSN (i1);
1005     }
1006
1007   i2 = bb2->end;
1008   if (onlyjump_p (i2)
1009       || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
1010     {
1011       last2 = i2;
1012       /* Count everything except for unconditional jump as insn.  */
1013       if (!simplejump_p (i2) && !returnjump_p (i2) && last1)
1014         ninsns++;
1015       i2 = PREV_INSN (i2);
1016     }
1017
1018   while (true)
1019     {
1020       /* Ignore notes.  */
1021       while (!active_insn_p (i1) && i1 != bb1->head)
1022         i1 = PREV_INSN (i1);
1023
1024       while (!active_insn_p (i2) && i2 != bb2->head)
1025         i2 = PREV_INSN (i2);
1026
1027       if (i1 == bb1->head || i2 == bb2->head)
1028         break;
1029
1030       if (!insns_match_p (mode, i1, i2))
1031         break;
1032
1033       /* Don't begin a cross-jump with a USE or CLOBBER insn.  */
1034       if (active_insn_p (i1))
1035         {
1036           /* If the merged insns have different REG_EQUAL notes, then
1037              remove them.  */
1038           rtx equiv1 = find_reg_equal_equiv_note (i1);
1039           rtx equiv2 = find_reg_equal_equiv_note (i2);
1040
1041           if (equiv1 && !equiv2)
1042             remove_note (i1, equiv1);
1043           else if (!equiv1 && equiv2)
1044             remove_note (i2, equiv2);
1045           else if (equiv1 && equiv2
1046                    && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
1047             {
1048               remove_note (i1, equiv1);
1049               remove_note (i2, equiv2);
1050             }
1051              
1052           afterlast1 = last1, afterlast2 = last2;
1053           last1 = i1, last2 = i2;
1054           ninsns++;
1055         }
1056
1057       i1 = PREV_INSN (i1);
1058       i2 = PREV_INSN (i2);
1059     }
1060
1061 #ifdef HAVE_cc0
1062   /* Don't allow the insn after a compare to be shared by
1063      cross-jumping unless the compare is also shared.  */
1064   if (ninsns && reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1))
1065     last1 = afterlast1, last2 = afterlast2, ninsns--;
1066 #endif
1067
1068   /* Include preceding notes and labels in the cross-jump.  One,
1069      this may bring us to the head of the blocks as requested above.
1070      Two, it keeps line number notes as matched as may be.  */
1071   if (ninsns)
1072     {
1073       while (last1 != bb1->head && !active_insn_p (PREV_INSN (last1)))
1074         last1 = PREV_INSN (last1);
1075
1076       if (last1 != bb1->head && GET_CODE (PREV_INSN (last1)) == CODE_LABEL)
1077         last1 = PREV_INSN (last1);
1078
1079       while (last2 != bb2->head && !active_insn_p (PREV_INSN (last2)))
1080         last2 = PREV_INSN (last2);
1081
1082       if (last2 != bb2->head && GET_CODE (PREV_INSN (last2)) == CODE_LABEL)
1083         last2 = PREV_INSN (last2);
1084
1085       *f1 = last1;
1086       *f2 = last2;
1087     }
1088
1089   return ninsns;
1090 }
1091
1092 /* Return true iff outgoing edges of BB1 and BB2 match, together with
1093    the branch instruction.  This means that if we commonize the control
1094    flow before end of the basic block, the semantic remains unchanged.
1095
1096    We may assume that there exists one edge with a common destination.  */
1097
1098 static bool
1099 outgoing_edges_match (mode, bb1, bb2)
1100      int mode;
1101      basic_block bb1;
1102      basic_block bb2;
1103 {
1104   int nehedges1 = 0, nehedges2 = 0;
1105   edge fallthru1 = 0, fallthru2 = 0;
1106   edge e1, e2;
1107
1108   /* If BB1 has only one successor, we may be looking at either an
1109      unconditional jump, or a fake edge to exit.  */
1110   if (bb1->succ && !bb1->succ->succ_next
1111       && !(bb1->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)))
1112     return (bb2->succ &&  !bb2->succ->succ_next
1113             && (bb2->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0);
1114
1115   /* Match conditional jumps - this may get tricky when fallthru and branch
1116      edges are crossed.  */
1117   if (bb1->succ
1118       && bb1->succ->succ_next
1119       && !bb1->succ->succ_next->succ_next
1120       && any_condjump_p (bb1->end)
1121       && onlyjump_p (bb1->end))
1122     {
1123       edge b1, f1, b2, f2;
1124       bool reverse, match;
1125       rtx set1, set2, cond1, cond2;
1126       enum rtx_code code1, code2;
1127
1128       if (!bb2->succ
1129           || !bb2->succ->succ_next
1130           || bb2->succ->succ_next->succ_next
1131           || !any_condjump_p (bb2->end)
1132           || !onlyjump_p (bb2->end))
1133         return false;
1134
1135       /* Do not crossjump across loop boundaries.  This is a temporary
1136          workaround for the common scenario in which crossjumping results
1137          in killing the duplicated loop condition, making bb-reorder rotate
1138          the loop incorectly, leaving an extra unconditional jump inside
1139          the loop.
1140
1141          This check should go away once bb-reorder knows how to duplicate
1142          code in this case or rotate the loops to avoid this scenario.  */
1143       if (bb1->loop_depth != bb2->loop_depth)
1144         return false;
1145
1146       b1 = BRANCH_EDGE (bb1);
1147       b2 = BRANCH_EDGE (bb2);
1148       f1 = FALLTHRU_EDGE (bb1);
1149       f2 = FALLTHRU_EDGE (bb2);
1150
1151       /* Get around possible forwarders on fallthru edges.  Other cases
1152          should be optimized out already.  */
1153       if (FORWARDER_BLOCK_P (f1->dest))
1154         f1 = f1->dest->succ;
1155
1156       if (FORWARDER_BLOCK_P (f2->dest))
1157         f2 = f2->dest->succ;
1158
1159       /* To simplify use of this function, return false if there are
1160          unneeded forwarder blocks.  These will get eliminated later
1161          during cleanup_cfg.  */
1162       if (FORWARDER_BLOCK_P (f1->dest)
1163           || FORWARDER_BLOCK_P (f2->dest)
1164           || FORWARDER_BLOCK_P (b1->dest)
1165           || FORWARDER_BLOCK_P (b2->dest))
1166         return false;
1167
1168       if (f1->dest == f2->dest && b1->dest == b2->dest)
1169         reverse = false;
1170       else if (f1->dest == b2->dest && b1->dest == f2->dest)
1171         reverse = true;
1172       else
1173         return false;
1174
1175       set1 = pc_set (bb1->end);
1176       set2 = pc_set (bb2->end);
1177       if ((XEXP (SET_SRC (set1), 1) == pc_rtx)
1178           != (XEXP (SET_SRC (set2), 1) == pc_rtx))
1179         reverse = !reverse;
1180
1181       cond1 = XEXP (SET_SRC (set1), 0);
1182       cond2 = XEXP (SET_SRC (set2), 0);
1183       code1 = GET_CODE (cond1);
1184       if (reverse)
1185         code2 = reversed_comparison_code (cond2, bb2->end);
1186       else
1187         code2 = GET_CODE (cond2);
1188
1189       if (code2 == UNKNOWN)
1190         return false;
1191
1192       /* Verify codes and operands match.  */
1193       match = ((code1 == code2
1194                 && rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
1195                 && rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
1196                || (code1 == swap_condition (code2)
1197                    && rtx_renumbered_equal_p (XEXP (cond1, 1),
1198                                               XEXP (cond2, 0))
1199                    && rtx_renumbered_equal_p (XEXP (cond1, 0),
1200                                               XEXP (cond2, 1))));
1201
1202       /* If we return true, we will join the blocks.  Which means that
1203          we will only have one branch prediction bit to work with.  Thus
1204          we require the existing branches to have probabilities that are
1205          roughly similar.  */
1206       if (match
1207           && !optimize_size
1208           && maybe_hot_bb_p (bb1)
1209           && maybe_hot_bb_p (bb2))
1210         {
1211           int prob2;
1212
1213           if (b1->dest == b2->dest)
1214             prob2 = b2->probability;
1215           else
1216             /* Do not use f2 probability as f2 may be forwarded.  */
1217             prob2 = REG_BR_PROB_BASE - b2->probability;
1218
1219           /* Fail if the difference in probabilities is greater than 50%.
1220              This rules out two well-predicted branches with opposite
1221              outcomes.  */
1222           if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2)
1223             {
1224               if (rtl_dump_file)
1225                 fprintf (rtl_dump_file,
1226                          "Outcomes of branch in bb %i and %i differs to much (%i %i)\n",
1227                          bb1->sindex, bb2->sindex, b1->probability, prob2);
1228
1229               return false;
1230             }
1231         }
1232
1233       if (rtl_dump_file && match)
1234         fprintf (rtl_dump_file, "Conditionals in bb %i and %i match.\n",
1235                  bb1->sindex, bb2->sindex);
1236
1237       return match;
1238     }
1239
1240   /* Generic case - we are seeing an computed jump, table jump or trapping
1241      instruction.  */
1242
1243   /* First ensure that the instructions match.  There may be many outgoing
1244      edges so this test is generally cheaper.
1245      ??? Currently the tablejumps will never match, as they do have
1246      different tables.  */
1247   if (!insns_match_p (mode, bb1->end, bb2->end))
1248     return false;
1249
1250   /* Search the outgoing edges, ensure that the counts do match, find possible
1251      fallthru and exception handling edges since these needs more
1252      validation.  */
1253   for (e1 = bb1->succ, e2 = bb2->succ; e1 && e2;
1254        e1 = e1->succ_next, e2 = e2->succ_next)
1255     {
1256       if (e1->flags & EDGE_EH)
1257         nehedges1++;
1258
1259       if (e2->flags & EDGE_EH)
1260         nehedges2++;
1261
1262       if (e1->flags & EDGE_FALLTHRU)
1263         fallthru1 = e1;
1264       if (e2->flags & EDGE_FALLTHRU)
1265         fallthru2 = e2;
1266     }
1267
1268   /* If number of edges of various types does not match, fail.  */
1269   if (e1 || e2
1270       || nehedges1 != nehedges2
1271       || (fallthru1 != 0) != (fallthru2 != 0))
1272     return false;
1273
1274   /* fallthru edges must be forwarded to the same destination.  */
1275   if (fallthru1)
1276     {
1277       basic_block d1 = (forwarder_block_p (fallthru1->dest)
1278                         ? fallthru1->dest->succ->dest: fallthru1->dest);
1279       basic_block d2 = (forwarder_block_p (fallthru2->dest)
1280                         ? fallthru2->dest->succ->dest: fallthru2->dest);
1281
1282       if (d1 != d2)
1283         return false;
1284     }
1285
1286   /* In case we do have EH edges, ensure we are in the same region.  */
1287   if (nehedges1)
1288     {
1289       rtx n1 = find_reg_note (bb1->end, REG_EH_REGION, 0);
1290       rtx n2 = find_reg_note (bb2->end, REG_EH_REGION, 0);
1291
1292       if (XEXP (n1, 0) != XEXP (n2, 0))
1293         return false;
1294     }
1295
1296   /* We don't need to match the rest of edges as above checks should be enought
1297      to ensure that they are equivalent.  */
1298   return true;
1299 }
1300
1301 /* E1 and E2 are edges with the same destination block.  Search their
1302    predecessors for common code.  If found, redirect control flow from
1303    (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC.  */
1304
1305 static bool
1306 try_crossjump_to_edge (mode, e1, e2)
1307      int mode;
1308      edge e1, e2;
1309 {
1310   int nmatch;
1311   basic_block src1 = e1->src, src2 = e2->src;
1312   basic_block redirect_to;
1313   rtx newpos1, newpos2;
1314   edge s;
1315   rtx last;
1316   rtx label;
1317
1318   /* Search backward through forwarder blocks.  We don't need to worry
1319      about multiple entry or chained forwarders, as they will be optimized
1320      away.  We do this to look past the unconditional jump following a
1321      conditional jump that is required due to the current CFG shape.  */
1322   if (src1->pred
1323       && !src1->pred->pred_next
1324       && FORWARDER_BLOCK_P (src1))
1325     e1 = src1->pred, src1 = e1->src;
1326
1327   if (src2->pred
1328       && !src2->pred->pred_next
1329       && FORWARDER_BLOCK_P (src2))
1330     e2 = src2->pred, src2 = e2->src;
1331
1332   /* Nothing to do if we reach ENTRY, or a common source block.  */
1333   if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
1334     return false;
1335   if (src1 == src2)
1336     return false;
1337
1338   /* Seeing more than 1 forwarder blocks would confuse us later...  */
1339   if (FORWARDER_BLOCK_P (e1->dest)
1340       && FORWARDER_BLOCK_P (e1->dest->succ->dest))
1341     return false;
1342
1343   if (FORWARDER_BLOCK_P (e2->dest)
1344       && FORWARDER_BLOCK_P (e2->dest->succ->dest))
1345     return false;
1346
1347   /* Likewise with dead code (possibly newly created by the other optimizations
1348      of cfg_cleanup).  */
1349   if (!src1->pred || !src2->pred)
1350     return false;
1351
1352   /* Look for the common insn sequence, part the first ...  */
1353   if (!outgoing_edges_match (mode, src1, src2))
1354     return false;
1355
1356   /* ... and part the second.  */
1357   nmatch = flow_find_cross_jump (mode, src1, src2, &newpos1, &newpos2);
1358   if (!nmatch)
1359     return false;
1360
1361   /* Avoid splitting if possible.  */
1362   if (newpos2 == src2->head)
1363     redirect_to = src2;
1364   else
1365     {
1366       if (rtl_dump_file)
1367         fprintf (rtl_dump_file, "Splitting bb %i before %i insns\n",
1368                  src2->sindex, nmatch);
1369       redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
1370     }
1371
1372   if (rtl_dump_file)
1373     fprintf (rtl_dump_file,
1374              "Cross jumping from bb %i to bb %i; %i common insns\n",
1375              src1->sindex, src2->sindex, nmatch);
1376
1377   redirect_to->count += src1->count;
1378   redirect_to->frequency += src1->frequency;
1379   /* We may have some registers visible trought the block.  */
1380   redirect_to->flags |= BB_DIRTY;
1381
1382   /* Recompute the frequencies and counts of outgoing edges.  */
1383   for (s = redirect_to->succ; s; s = s->succ_next)
1384     {
1385       edge s2;
1386       basic_block d = s->dest;
1387
1388       if (FORWARDER_BLOCK_P (d))
1389         d = d->succ->dest;
1390
1391       for (s2 = src1->succ; ; s2 = s2->succ_next)
1392         {
1393           basic_block d2 = s2->dest;
1394           if (FORWARDER_BLOCK_P (d2))
1395             d2 = d2->succ->dest;
1396           if (d == d2)
1397             break;
1398         }
1399
1400       s->count += s2->count;
1401
1402       /* Take care to update possible forwarder blocks.  We verified
1403          that there is no more than one in the chain, so we can't run
1404          into infinite loop.  */
1405       if (FORWARDER_BLOCK_P (s->dest))
1406         {
1407           s->dest->succ->count += s2->count;
1408           s->dest->count += s2->count;
1409           s->dest->frequency += EDGE_FREQUENCY (s);
1410         }
1411
1412       if (FORWARDER_BLOCK_P (s2->dest))
1413         {
1414           s2->dest->succ->count -= s2->count;
1415           if (s2->dest->succ->count < 0)
1416             s2->dest->succ->count = 0;
1417           s2->dest->count -= s2->count;
1418           s2->dest->frequency -= EDGE_FREQUENCY (s);
1419           if (s2->dest->frequency < 0)
1420             s2->dest->frequency = 0;
1421           if (s2->dest->count < 0)
1422             s2->dest->count = 0;
1423         }
1424
1425       if (!redirect_to->frequency && !src1->frequency)
1426         s->probability = (s->probability + s2->probability) / 2;
1427       else
1428         s->probability
1429           = ((s->probability * redirect_to->frequency +
1430               s2->probability * src1->frequency)
1431              / (redirect_to->frequency + src1->frequency));
1432     }
1433
1434   update_br_prob_note (redirect_to);
1435
1436   /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1.  */
1437
1438   /* Skip possible basic block header.  */
1439   if (GET_CODE (newpos1) == CODE_LABEL)
1440     newpos1 = NEXT_INSN (newpos1);
1441
1442   if (GET_CODE (newpos1) == NOTE)
1443     newpos1 = NEXT_INSN (newpos1);
1444   last = src1->end;
1445
1446   /* Emit the jump insn.  */
1447   label = block_label (redirect_to);
1448   emit_jump_insn_after (gen_jump (label), src1->end);
1449   JUMP_LABEL (src1->end) = label;
1450   LABEL_NUSES (label)++;
1451
1452   /* Delete the now unreachable instructions.  */
1453   delete_insn_chain (newpos1, last);
1454
1455   /* Make sure there is a barrier after the new jump.  */
1456   last = next_nonnote_insn (src1->end);
1457   if (!last || GET_CODE (last) != BARRIER)
1458     emit_barrier_after (src1->end);
1459
1460   /* Update CFG.  */
1461   while (src1->succ)
1462     remove_edge (src1->succ);
1463   make_single_succ_edge (src1, redirect_to, 0);
1464
1465   update_forwarder_flag (src1);
1466
1467   return true;
1468 }
1469
1470 /* Search the predecessors of BB for common insn sequences.  When found,
1471    share code between them by redirecting control flow.  Return true if
1472    any changes made.  */
1473
1474 static bool
1475 try_crossjump_bb (mode, bb)
1476      int mode;
1477      basic_block bb;
1478 {
1479   edge e, e2, nexte2, nexte, fallthru;
1480   bool changed;
1481   int n = 0;
1482
1483   /* Nothing to do if there is not at least two incoming edges.  */
1484   if (!bb->pred || !bb->pred->pred_next)
1485     return false;
1486
1487   /* It is always cheapest to redirect a block that ends in a branch to
1488      a block that falls through into BB, as that adds no branches to the
1489      program.  We'll try that combination first.  */
1490   for (fallthru = bb->pred; fallthru; fallthru = fallthru->pred_next, n++)
1491     {
1492       if (fallthru->flags & EDGE_FALLTHRU)
1493         break;
1494       if (n > 100)
1495         return false;
1496     }
1497
1498   changed = false;
1499   for (e = bb->pred; e; e = nexte)
1500     {
1501       nexte = e->pred_next;
1502
1503       /* As noted above, first try with the fallthru predecessor.  */
1504       if (fallthru)
1505         {
1506           /* Don't combine the fallthru edge into anything else.
1507              If there is a match, we'll do it the other way around.  */
1508           if (e == fallthru)
1509             continue;
1510
1511           if (try_crossjump_to_edge (mode, e, fallthru))
1512             {
1513               changed = true;
1514               nexte = bb->pred;
1515               continue;
1516             }
1517         }
1518
1519       /* Non-obvious work limiting check: Recognize that we're going
1520          to call try_crossjump_bb on every basic block.  So if we have
1521          two blocks with lots of outgoing edges (a switch) and they
1522          share lots of common destinations, then we would do the
1523          cross-jump check once for each common destination.
1524
1525          Now, if the blocks actually are cross-jump candidates, then
1526          all of their destinations will be shared.  Which means that
1527          we only need check them for cross-jump candidacy once.  We
1528          can eliminate redundant checks of crossjump(A,B) by arbitrarily
1529          choosing to do the check from the block for which the edge
1530          in question is the first successor of A.  */
1531       if (e->src->succ != e)
1532         continue;
1533
1534       for (e2 = bb->pred; e2; e2 = nexte2)
1535         {
1536           basic_block foll;
1537           nexte2 = e2->pred_next;
1538
1539           if (e2 == e)
1540             continue;
1541
1542           /* We've already checked the fallthru edge above.  */
1543           if (e2 == fallthru)
1544             continue;
1545
1546           /* The "first successor" check above only prevents multiple
1547              checks of crossjump(A,B).  In order to prevent redundant
1548              checks of crossjump(B,A), require that A be the block
1549              with the lowest index.  */
1550           for (foll = e->src; foll && foll != e2->src; foll = foll->next_bb)
1551             {
1552             }
1553           if (!foll)
1554             continue;
1555
1556           if (try_crossjump_to_edge (mode, e, e2))
1557             {
1558               changed = true;
1559               nexte = bb->pred;
1560               break;
1561             }
1562         }
1563     }
1564
1565   return changed;
1566 }
1567
1568 /* Do simple CFG optimizations - basic block merging, simplifying of jump
1569    instructions etc.  Return nonzero if changes were made.  */
1570
1571 static bool
1572 try_optimize_cfg (mode)
1573      int mode;
1574 {
1575   bool changed_overall = false;
1576   bool changed;
1577   int iterations = 0;
1578   basic_block bb, b;
1579
1580   if (mode & CLEANUP_CROSSJUMP)
1581     add_noreturn_fake_exit_edges ();
1582
1583   FOR_ALL_BB (bb)
1584     update_forwarder_flag (bb);
1585
1586   if (mode & CLEANUP_UPDATE_LIFE)
1587     clear_bb_flags ();
1588
1589   if (! (* targetm.cannot_modify_jumps_p) ())
1590     {
1591       /* Attempt to merge blocks as made possible by edge removal.  If
1592          a block has only one successor, and the successor has only
1593          one predecessor, they may be combined.  */
1594       do
1595         {
1596           changed = false;
1597           iterations++;
1598
1599           if (rtl_dump_file)
1600             fprintf (rtl_dump_file,
1601                      "\n\ntry_optimize_cfg iteration %i\n\n",
1602                      iterations);
1603
1604           for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR;)
1605             {
1606               basic_block c;
1607               edge s;
1608               bool changed_here = false;
1609
1610               /* Delete trivially dead basic blocks.  */
1611               while (b->pred == NULL)
1612                 {
1613                   c = b->prev_bb;
1614                   if (rtl_dump_file)
1615                     fprintf (rtl_dump_file, "Deleting block %i.\n",
1616                              b->sindex);
1617
1618                   flow_delete_block (b);
1619                   changed = true;
1620                   b = c;
1621                 }
1622
1623               /* Remove code labels no longer used.  Don't do this
1624                  before CALL_PLACEHOLDER is removed, as some branches
1625                  may be hidden within.  */
1626               if (b->pred->pred_next == NULL
1627                   && (b->pred->flags & EDGE_FALLTHRU)
1628                   && !(b->pred->flags & EDGE_COMPLEX)
1629                   && GET_CODE (b->head) == CODE_LABEL
1630                   && (!(mode & CLEANUP_PRE_SIBCALL)
1631                       || !tail_recursion_label_p (b->head))
1632                   /* If the previous block ends with a branch to this
1633                      block, we can't delete the label.  Normally this
1634                      is a condjump that is yet to be simplified, but
1635                      if CASE_DROPS_THRU, this can be a tablejump with
1636                      some element going to the same place as the
1637                      default (fallthru).  */
1638                   && (b->pred->src == ENTRY_BLOCK_PTR
1639                       || GET_CODE (b->pred->src->end) != JUMP_INSN
1640                       || ! label_is_jump_target_p (b->head,
1641                                                    b->pred->src->end)))
1642                 {
1643                   rtx label = b->head;
1644
1645                   b->head = NEXT_INSN (b->head);
1646                   delete_insn_chain (label, label);
1647                   if (rtl_dump_file)
1648                     fprintf (rtl_dump_file, "Deleted label in block %i.\n",
1649                              b->sindex);
1650                 }
1651
1652               /* If we fall through an empty block, we can remove it.  */
1653               if (b->pred->pred_next == NULL
1654                   && (b->pred->flags & EDGE_FALLTHRU)
1655                   && GET_CODE (b->head) != CODE_LABEL
1656                   && FORWARDER_BLOCK_P (b)
1657                   /* Note that forwarder_block_p true ensures that
1658                      there is a successor for this block.  */
1659                   && (b->succ->flags & EDGE_FALLTHRU)
1660                   && num_basic_blocks > 1)
1661                 {
1662                   if (rtl_dump_file)
1663                     fprintf (rtl_dump_file,
1664                              "Deleting fallthru block %i.\n",
1665                              b->sindex);
1666
1667                   c = b->prev_bb == ENTRY_BLOCK_PTR ? b->next_bb : b->prev_bb;
1668                   redirect_edge_succ_nodup (b->pred, b->succ->dest);
1669                   flow_delete_block (b);
1670                   changed = true;
1671                   b = c;
1672                 }
1673
1674               /* Merge blocks.  Loop because chains of blocks might be
1675                  combineable.  */
1676               while ((s = b->succ) != NULL
1677                      && s->succ_next == NULL
1678                      && !(s->flags & EDGE_COMPLEX)
1679                      && (c = s->dest) != EXIT_BLOCK_PTR
1680                      && c->pred->pred_next == NULL
1681                      /* If the jump insn has side effects,
1682                         we can't kill the edge.  */
1683                      && (GET_CODE (b->end) != JUMP_INSN
1684                          || simplejump_p (b->end))
1685                      && merge_blocks (s, b, c, mode))
1686                 changed_here = true;
1687
1688               /* Simplify branch over branch.  */
1689               if ((mode & CLEANUP_EXPENSIVE) && try_simplify_condjump (b))
1690                 changed_here = true;
1691
1692               /* If B has a single outgoing edge, but uses a
1693                  non-trivial jump instruction without side-effects, we
1694                  can either delete the jump entirely, or replace it
1695                  with a simple unconditional jump.  Use
1696                  redirect_edge_and_branch to do the dirty work.  */
1697               if (b->succ
1698                   && ! b->succ->succ_next
1699                   && b->succ->dest != EXIT_BLOCK_PTR
1700                   && onlyjump_p (b->end)
1701                   && redirect_edge_and_branch (b->succ, b->succ->dest))
1702                 {
1703                   update_forwarder_flag (b);
1704                   changed_here = true;
1705                 }
1706
1707               /* Simplify branch to branch.  */
1708               if (try_forward_edges (mode, b))
1709                 changed_here = true;
1710
1711               /* Look for shared code between blocks.  */
1712               if ((mode & CLEANUP_CROSSJUMP)
1713                   && try_crossjump_bb (mode, b))
1714                 changed_here = true;
1715
1716               /* Don't get confused by the index shift caused by
1717                  deleting blocks.  */
1718               if (!changed_here)
1719                 b = b->next_bb;
1720               else
1721                 changed = true;
1722             }
1723
1724           if ((mode & CLEANUP_CROSSJUMP)
1725               && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
1726             changed = true;
1727
1728 #ifdef ENABLE_CHECKING
1729           if (changed)
1730             verify_flow_info ();
1731 #endif
1732
1733           changed_overall |= changed;
1734         }
1735       while (changed);
1736     }
1737
1738   if (mode & CLEANUP_CROSSJUMP)
1739     remove_fake_edges ();
1740
1741   clear_aux_for_blocks ();
1742
1743   return changed_overall;
1744 }
1745 \f
1746 /* Delete all unreachable basic blocks.  */
1747
1748 bool
1749 delete_unreachable_blocks ()
1750 {
1751   bool changed = false;
1752   basic_block b, next_bb;
1753
1754   find_unreachable_blocks ();
1755
1756   /* Delete all unreachable basic blocks.  */
1757
1758   for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR; b = next_bb)
1759     {
1760       next_bb = b->next_bb;
1761       if (!(b->flags & BB_REACHABLE))
1762         {
1763           flow_delete_block (b);
1764           changed = true;
1765         }
1766     }
1767
1768   if (changed)
1769     tidy_fallthru_edges ();
1770   return changed;
1771 }
1772 \f
1773 /* Tidy the CFG by deleting unreachable code and whatnot.  */
1774
1775 bool
1776 cleanup_cfg (mode)
1777      int mode;
1778 {
1779   bool changed = false;
1780
1781   timevar_push (TV_CLEANUP_CFG);
1782   if (delete_unreachable_blocks ())
1783     {
1784       changed = true;
1785       /* We've possibly created trivially dead code.  Cleanup it right
1786          now to introduce more oppurtunities for try_optimize_cfg.  */
1787       if (!(mode & (CLEANUP_UPDATE_LIFE | CLEANUP_PRE_SIBCALL))
1788           && !reload_completed)
1789         delete_trivially_dead_insns (get_insns(), max_reg_num ());
1790     }
1791
1792   compact_blocks ();
1793   
1794   while (try_optimize_cfg (mode))
1795     {
1796       delete_unreachable_blocks (), changed = true;
1797       if (mode & CLEANUP_UPDATE_LIFE)
1798         {
1799           /* Cleaning up CFG introduces more oppurtunities for dead code
1800              removal that in turn may introduce more oppurtunities for
1801              cleaning up the CFG.  */
1802           if (!update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
1803                                                  PROP_DEATH_NOTES
1804                                                  | PROP_SCAN_DEAD_CODE
1805                                                  | PROP_KILL_DEAD_CODE
1806                                                  | PROP_LOG_LINKS))
1807             break;
1808         }
1809       else if (!(mode & CLEANUP_PRE_SIBCALL) && !reload_completed)
1810         {
1811           if (!delete_trivially_dead_insns (get_insns(), max_reg_num ()))
1812             break;
1813         }
1814       else
1815         break;
1816       delete_dead_jumptables ();
1817     }
1818
1819   /* Kill the data we won't maintain.  */
1820   free_EXPR_LIST_list (&label_value_list);
1821   timevar_pop (TV_CLEANUP_CFG);
1822
1823   return changed;
1824 }