OSDN Git Service

2010-09-09 Tobias Burnus <burnus@net-b.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, 2003, 2004, 2005, 2006, 2007, 2008, 2010
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This file contains optimizer of the control flow.  The main entry point is
23    cleanup_cfg.  Following optimizations are performed:
24
25    - Unreachable blocks removal
26    - Edge forwarding (edge to the forwarder block is forwarded to its
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 "regs.h"
41 #include "timevar.h"
42 #include "output.h"
43 #include "insn-config.h"
44 #include "flags.h"
45 #include "recog.h"
46 #include "diagnostic-core.h"
47 #include "toplev.h"
48 #include "cselib.h"
49 #include "params.h"
50 #include "tm_p.h"
51 #include "target.h"
52 #include "cfglayout.h"
53 #include "emit-rtl.h"
54 #include "tree-pass.h"
55 #include "cfgloop.h"
56 #include "expr.h"
57 #include "df.h"
58 #include "dce.h"
59 #include "dbgcnt.h"
60
61 #define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK)
62
63 /* Set to true when we are running first pass of try_optimize_cfg loop.  */
64 static bool first_pass;
65
66 /* Set to true if crossjumps occured in the latest run of try_optimize_cfg.  */
67 static bool crossjumps_occured;
68
69 static bool try_crossjump_to_edge (int, edge, edge);
70 static bool try_crossjump_bb (int, basic_block);
71 static bool outgoing_edges_match (int, basic_block, basic_block);
72 static bool old_insns_match_p (int, rtx, rtx);
73
74 static void merge_blocks_move_predecessor_nojumps (basic_block, basic_block);
75 static void merge_blocks_move_successor_nojumps (basic_block, basic_block);
76 static bool try_optimize_cfg (int);
77 static bool try_simplify_condjump (basic_block);
78 static bool try_forward_edges (int, basic_block);
79 static edge thread_jump (edge, basic_block);
80 static bool mark_effect (rtx, bitmap);
81 static void notice_new_block (basic_block);
82 static void update_forwarder_flag (basic_block);
83 static int mentions_nonequal_regs (rtx *, void *);
84 static void merge_memattrs (rtx, rtx);
85 \f
86 /* Set flags for newly created block.  */
87
88 static void
89 notice_new_block (basic_block bb)
90 {
91   if (!bb)
92     return;
93
94   if (forwarder_block_p (bb))
95     bb->flags |= BB_FORWARDER_BLOCK;
96 }
97
98 /* Recompute forwarder flag after block has been modified.  */
99
100 static void
101 update_forwarder_flag (basic_block bb)
102 {
103   if (forwarder_block_p (bb))
104     bb->flags |= BB_FORWARDER_BLOCK;
105   else
106     bb->flags &= ~BB_FORWARDER_BLOCK;
107 }
108 \f
109 /* Simplify a conditional jump around an unconditional jump.
110    Return true if something changed.  */
111
112 static bool
113 try_simplify_condjump (basic_block cbranch_block)
114 {
115   basic_block jump_block, jump_dest_block, cbranch_dest_block;
116   edge cbranch_jump_edge, cbranch_fallthru_edge;
117   rtx cbranch_insn;
118
119   /* Verify that there are exactly two successors.  */
120   if (EDGE_COUNT (cbranch_block->succs) != 2)
121     return false;
122
123   /* Verify that we've got a normal conditional branch at the end
124      of the block.  */
125   cbranch_insn = BB_END (cbranch_block);
126   if (!any_condjump_p (cbranch_insn))
127     return false;
128
129   cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block);
130   cbranch_jump_edge = BRANCH_EDGE (cbranch_block);
131
132   /* The next block must not have multiple predecessors, must not
133      be the last block in the function, and must contain just the
134      unconditional jump.  */
135   jump_block = cbranch_fallthru_edge->dest;
136   if (!single_pred_p (jump_block)
137       || jump_block->next_bb == EXIT_BLOCK_PTR
138       || !FORWARDER_BLOCK_P (jump_block))
139     return false;
140   jump_dest_block = single_succ (jump_block);
141
142   /* If we are partitioning hot/cold basic blocks, we don't want to
143      mess up unconditional or indirect jumps that cross between hot
144      and cold sections.
145
146      Basic block partitioning may result in some jumps that appear to
147      be optimizable (or blocks that appear to be mergeable), but which really
148      must be left untouched (they are required to make it safely across
149      partition boundaries).  See the comments at the top of
150      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
151
152   if (BB_PARTITION (jump_block) != BB_PARTITION (jump_dest_block)
153       || (cbranch_jump_edge->flags & EDGE_CROSSING))
154     return false;
155
156   /* The conditional branch must target the block after the
157      unconditional branch.  */
158   cbranch_dest_block = cbranch_jump_edge->dest;
159
160   if (cbranch_dest_block == EXIT_BLOCK_PTR
161       || !can_fallthru (jump_block, cbranch_dest_block))
162     return false;
163
164   /* Invert the conditional branch.  */
165   if (!invert_jump (cbranch_insn, block_label (jump_dest_block), 0))
166     return false;
167
168   if (dump_file)
169     fprintf (dump_file, "Simplifying condjump %i around jump %i\n",
170              INSN_UID (cbranch_insn), INSN_UID (BB_END (jump_block)));
171
172   /* Success.  Update the CFG to match.  Note that after this point
173      the edge variable names appear backwards; the redirection is done
174      this way to preserve edge profile data.  */
175   cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge,
176                                                 cbranch_dest_block);
177   cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge,
178                                                     jump_dest_block);
179   cbranch_jump_edge->flags |= EDGE_FALLTHRU;
180   cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
181   update_br_prob_note (cbranch_block);
182
183   /* Delete the block with the unconditional jump, and clean up the mess.  */
184   delete_basic_block (jump_block);
185   tidy_fallthru_edge (cbranch_jump_edge);
186   update_forwarder_flag (cbranch_block);
187
188   return true;
189 }
190 \f
191 /* Attempt to prove that operation is NOOP using CSElib or mark the effect
192    on register.  Used by jump threading.  */
193
194 static bool
195 mark_effect (rtx exp, regset nonequal)
196 {
197   int regno;
198   rtx dest;
199   switch (GET_CODE (exp))
200     {
201       /* In case we do clobber the register, mark it as equal, as we know the
202          value is dead so it don't have to match.  */
203     case CLOBBER:
204       if (REG_P (XEXP (exp, 0)))
205         {
206           dest = XEXP (exp, 0);
207           regno = REGNO (dest);
208           CLEAR_REGNO_REG_SET (nonequal, regno);
209           if (regno < FIRST_PSEUDO_REGISTER)
210             {
211               int n = hard_regno_nregs[regno][GET_MODE (dest)];
212               while (--n > 0)
213                 CLEAR_REGNO_REG_SET (nonequal, regno + n);
214             }
215         }
216       return false;
217
218     case SET:
219       if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp)))
220         return false;
221       dest = SET_DEST (exp);
222       if (dest == pc_rtx)
223         return false;
224       if (!REG_P (dest))
225         return true;
226       regno = REGNO (dest);
227       SET_REGNO_REG_SET (nonequal, regno);
228       if (regno < FIRST_PSEUDO_REGISTER)
229         {
230           int n = hard_regno_nregs[regno][GET_MODE (dest)];
231           while (--n > 0)
232             SET_REGNO_REG_SET (nonequal, regno + n);
233         }
234       return false;
235
236     default:
237       return false;
238     }
239 }
240
241 /* Return nonzero if X is a register set in regset DATA.
242    Called via for_each_rtx.  */
243 static int
244 mentions_nonequal_regs (rtx *x, void *data)
245 {
246   regset nonequal = (regset) data;
247   if (REG_P (*x))
248     {
249       int regno;
250
251       regno = REGNO (*x);
252       if (REGNO_REG_SET_P (nonequal, regno))
253         return 1;
254       if (regno < FIRST_PSEUDO_REGISTER)
255         {
256           int n = hard_regno_nregs[regno][GET_MODE (*x)];
257           while (--n > 0)
258             if (REGNO_REG_SET_P (nonequal, regno + n))
259               return 1;
260         }
261     }
262   return 0;
263 }
264 /* Attempt to prove that the basic block B will have no side effects and
265    always continues in the same edge if reached via E.  Return the edge
266    if exist, NULL otherwise.  */
267
268 static edge
269 thread_jump (edge e, basic_block b)
270 {
271   rtx set1, set2, cond1, cond2, insn;
272   enum rtx_code code1, code2, reversed_code2;
273   bool reverse1 = false;
274   unsigned i;
275   regset nonequal;
276   bool failed = false;
277   reg_set_iterator rsi;
278
279   if (b->flags & BB_NONTHREADABLE_BLOCK)
280     return NULL;
281
282   /* At the moment, we do handle only conditional jumps, but later we may
283      want to extend this code to tablejumps and others.  */
284   if (EDGE_COUNT (e->src->succs) != 2)
285     return NULL;
286   if (EDGE_COUNT (b->succs) != 2)
287     {
288       b->flags |= BB_NONTHREADABLE_BLOCK;
289       return NULL;
290     }
291
292   /* Second branch must end with onlyjump, as we will eliminate the jump.  */
293   if (!any_condjump_p (BB_END (e->src)))
294     return NULL;
295
296   if (!any_condjump_p (BB_END (b)) || !onlyjump_p (BB_END (b)))
297     {
298       b->flags |= BB_NONTHREADABLE_BLOCK;
299       return NULL;
300     }
301
302   set1 = pc_set (BB_END (e->src));
303   set2 = pc_set (BB_END (b));
304   if (((e->flags & EDGE_FALLTHRU) != 0)
305       != (XEXP (SET_SRC (set1), 1) == pc_rtx))
306     reverse1 = true;
307
308   cond1 = XEXP (SET_SRC (set1), 0);
309   cond2 = XEXP (SET_SRC (set2), 0);
310   if (reverse1)
311     code1 = reversed_comparison_code (cond1, BB_END (e->src));
312   else
313     code1 = GET_CODE (cond1);
314
315   code2 = GET_CODE (cond2);
316   reversed_code2 = reversed_comparison_code (cond2, BB_END (b));
317
318   if (!comparison_dominates_p (code1, code2)
319       && !comparison_dominates_p (code1, reversed_code2))
320     return NULL;
321
322   /* Ensure that the comparison operators are equivalent.
323      ??? This is far too pessimistic.  We should allow swapped operands,
324      different CCmodes, or for example comparisons for interval, that
325      dominate even when operands are not equivalent.  */
326   if (!rtx_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
327       || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
328     return NULL;
329
330   /* Short circuit cases where block B contains some side effects, as we can't
331      safely bypass it.  */
332   for (insn = NEXT_INSN (BB_HEAD (b)); insn != NEXT_INSN (BB_END (b));
333        insn = NEXT_INSN (insn))
334     if (INSN_P (insn) && side_effects_p (PATTERN (insn)))
335       {
336         b->flags |= BB_NONTHREADABLE_BLOCK;
337         return NULL;
338       }
339
340   cselib_init (0);
341
342   /* First process all values computed in the source basic block.  */
343   for (insn = NEXT_INSN (BB_HEAD (e->src));
344        insn != NEXT_INSN (BB_END (e->src));
345        insn = NEXT_INSN (insn))
346     if (INSN_P (insn))
347       cselib_process_insn (insn);
348
349   nonequal = BITMAP_ALLOC (NULL);
350   CLEAR_REG_SET (nonequal);
351
352   /* Now assume that we've continued by the edge E to B and continue
353      processing as if it were same basic block.
354      Our goal is to prove that whole block is an NOOP.  */
355
356   for (insn = NEXT_INSN (BB_HEAD (b));
357        insn != NEXT_INSN (BB_END (b)) && !failed;
358        insn = NEXT_INSN (insn))
359     {
360       if (INSN_P (insn))
361         {
362           rtx pat = PATTERN (insn);
363
364           if (GET_CODE (pat) == PARALLEL)
365             {
366               for (i = 0; i < (unsigned)XVECLEN (pat, 0); i++)
367                 failed |= mark_effect (XVECEXP (pat, 0, i), nonequal);
368             }
369           else
370             failed |= mark_effect (pat, nonequal);
371         }
372
373       cselib_process_insn (insn);
374     }
375
376   /* Later we should clear nonequal of dead registers.  So far we don't
377      have life information in cfg_cleanup.  */
378   if (failed)
379     {
380       b->flags |= BB_NONTHREADABLE_BLOCK;
381       goto failed_exit;
382     }
383
384   /* cond2 must not mention any register that is not equal to the
385      former block.  */
386   if (for_each_rtx (&cond2, mentions_nonequal_regs, nonequal))
387     goto failed_exit;
388
389   EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi)
390     goto failed_exit;
391
392   BITMAP_FREE (nonequal);
393   cselib_finish ();
394   if ((comparison_dominates_p (code1, code2) != 0)
395       != (XEXP (SET_SRC (set2), 1) == pc_rtx))
396     return BRANCH_EDGE (b);
397   else
398     return FALLTHRU_EDGE (b);
399
400 failed_exit:
401   BITMAP_FREE (nonequal);
402   cselib_finish ();
403   return NULL;
404 }
405 \f
406 /* Attempt to forward edges leaving basic block B.
407    Return true if successful.  */
408
409 static bool
410 try_forward_edges (int mode, basic_block b)
411 {
412   bool changed = false;
413   edge_iterator ei;
414   edge e, *threaded_edges = NULL;
415
416   /* If we are partitioning hot/cold basic blocks, we don't want to
417      mess up unconditional or indirect jumps that cross between hot
418      and cold sections.
419
420      Basic block partitioning may result in some jumps that appear to
421      be optimizable (or blocks that appear to be mergeable), but which really
422      must be left untouched (they are required to make it safely across
423      partition boundaries).  See the comments at the top of
424      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
425
426   if (find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
427     return false;
428
429   for (ei = ei_start (b->succs); (e = ei_safe_edge (ei)); )
430     {
431       basic_block target, first;
432       int counter, goto_locus;
433       bool threaded = false;
434       int nthreaded_edges = 0;
435       bool may_thread = first_pass | df_get_bb_dirty (b);
436
437       /* Skip complex edges because we don't know how to update them.
438
439          Still handle fallthru edges, as we can succeed to forward fallthru
440          edge to the same place as the branch edge of conditional branch
441          and turn conditional branch to an unconditional branch.  */
442       if (e->flags & EDGE_COMPLEX)
443         {
444           ei_next (&ei);
445           continue;
446         }
447
448       target = first = e->dest;
449       counter = NUM_FIXED_BLOCKS;
450       goto_locus = e->goto_locus;
451
452       /* If we are partitioning hot/cold basic_blocks, we don't want to mess
453          up jumps that cross between hot/cold sections.
454
455          Basic block partitioning may result in some jumps that appear
456          to be optimizable (or blocks that appear to be mergeable), but which
457          really must be left untouched (they are required to make it safely
458          across partition boundaries).  See the comments at the top of
459          bb-reorder.c:partition_hot_cold_basic_blocks for complete
460          details.  */
461
462       if (first != EXIT_BLOCK_PTR
463           && find_reg_note (BB_END (first), REG_CROSSING_JUMP, NULL_RTX))
464         return false;
465
466       while (counter < n_basic_blocks)
467         {
468           basic_block new_target = NULL;
469           bool new_target_threaded = false;
470           may_thread |= df_get_bb_dirty (target);
471
472           if (FORWARDER_BLOCK_P (target)
473               && !(single_succ_edge (target)->flags & EDGE_CROSSING)
474               && single_succ (target) != EXIT_BLOCK_PTR)
475             {
476               /* Bypass trivial infinite loops.  */
477               new_target = single_succ (target);
478               if (target == new_target)
479                 counter = n_basic_blocks;
480               else if (!optimize)
481                 {
482                   /* When not optimizing, ensure that edges or forwarder
483                      blocks with different locus are not optimized out.  */
484                   int locus = single_succ_edge (target)->goto_locus;
485
486                   if (locus && goto_locus && !locator_eq (locus, goto_locus))
487                     counter = n_basic_blocks;
488                   else if (locus)
489                     goto_locus = locus;
490
491                   if (INSN_P (BB_END (target)))
492                     {
493                       locus = INSN_LOCATOR (BB_END (target));
494
495                       if (locus && goto_locus
496                           && !locator_eq (locus, goto_locus))
497                         counter = n_basic_blocks;
498                       else if (locus)
499                         goto_locus = locus;
500                     }
501                 }
502             }
503
504           /* Allow to thread only over one edge at time to simplify updating
505              of probabilities.  */
506           else if ((mode & CLEANUP_THREADING) && may_thread)
507             {
508               edge t = thread_jump (e, target);
509               if (t)
510                 {
511                   if (!threaded_edges)
512                     threaded_edges = XNEWVEC (edge, n_basic_blocks);
513                   else
514                     {
515                       int i;
516
517                       /* Detect an infinite loop across blocks not
518                          including the start block.  */
519                       for (i = 0; i < nthreaded_edges; ++i)
520                         if (threaded_edges[i] == t)
521                           break;
522                       if (i < nthreaded_edges)
523                         {
524                           counter = n_basic_blocks;
525                           break;
526                         }
527                     }
528
529                   /* Detect an infinite loop across the start block.  */
530                   if (t->dest == b)
531                     break;
532
533                   gcc_assert (nthreaded_edges < n_basic_blocks - NUM_FIXED_BLOCKS);
534                   threaded_edges[nthreaded_edges++] = t;
535
536                   new_target = t->dest;
537                   new_target_threaded = true;
538                 }
539             }
540
541           if (!new_target)
542             break;
543
544           counter++;
545           target = new_target;
546           threaded |= new_target_threaded;
547         }
548
549       if (counter >= n_basic_blocks)
550         {
551           if (dump_file)
552             fprintf (dump_file, "Infinite loop in BB %i.\n",
553                      target->index);
554         }
555       else if (target == first)
556         ; /* We didn't do anything.  */
557       else
558         {
559           /* Save the values now, as the edge may get removed.  */
560           gcov_type edge_count = e->count;
561           int edge_probability = e->probability;
562           int edge_frequency;
563           int n = 0;
564
565           e->goto_locus = goto_locus;
566
567           /* Don't force if target is exit block.  */
568           if (threaded && target != EXIT_BLOCK_PTR)
569             {
570               notice_new_block (redirect_edge_and_branch_force (e, target));
571               if (dump_file)
572                 fprintf (dump_file, "Conditionals threaded.\n");
573             }
574           else if (!redirect_edge_and_branch (e, target))
575             {
576               if (dump_file)
577                 fprintf (dump_file,
578                          "Forwarding edge %i->%i to %i failed.\n",
579                          b->index, e->dest->index, target->index);
580               ei_next (&ei);
581               continue;
582             }
583
584           /* We successfully forwarded the edge.  Now update profile
585              data: for each edge we traversed in the chain, remove
586              the original edge's execution count.  */
587           edge_frequency = ((edge_probability * b->frequency
588                              + REG_BR_PROB_BASE / 2)
589                             / REG_BR_PROB_BASE);
590
591           if (!FORWARDER_BLOCK_P (b) && forwarder_block_p (b))
592             b->flags |= BB_FORWARDER_BLOCK;
593
594           do
595             {
596               edge t;
597
598               if (!single_succ_p (first))
599                 {
600                   gcc_assert (n < nthreaded_edges);
601                   t = threaded_edges [n++];
602                   gcc_assert (t->src == first);
603                   update_bb_profile_for_threading (first, edge_frequency,
604                                                    edge_count, t);
605                   update_br_prob_note (first);
606                 }
607               else
608                 {
609                   first->count -= edge_count;
610                   if (first->count < 0)
611                     first->count = 0;
612                   first->frequency -= edge_frequency;
613                   if (first->frequency < 0)
614                     first->frequency = 0;
615                   /* It is possible that as the result of
616                      threading we've removed edge as it is
617                      threaded to the fallthru edge.  Avoid
618                      getting out of sync.  */
619                   if (n < nthreaded_edges
620                       && first == threaded_edges [n]->src)
621                     n++;
622                   t = single_succ_edge (first);
623                 }
624
625               t->count -= edge_count;
626               if (t->count < 0)
627                 t->count = 0;
628               first = t->dest;
629             }
630           while (first != target);
631
632           changed = true;
633           continue;
634         }
635       ei_next (&ei);
636     }
637
638   if (threaded_edges)
639     free (threaded_edges);
640   return changed;
641 }
642 \f
643
644 /* Blocks A and B are to be merged into a single block.  A has no incoming
645    fallthru edge, so it can be moved before B without adding or modifying
646    any jumps (aside from the jump from A to B).  */
647
648 static void
649 merge_blocks_move_predecessor_nojumps (basic_block a, basic_block b)
650 {
651   rtx barrier;
652
653   /* If we are partitioning hot/cold basic blocks, we don't want to
654      mess up unconditional or indirect jumps that cross between hot
655      and cold sections.
656
657      Basic block partitioning may result in some jumps that appear to
658      be optimizable (or blocks that appear to be mergeable), but which really
659      must be left untouched (they are required to make it safely across
660      partition boundaries).  See the comments at the top of
661      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
662
663   if (BB_PARTITION (a) != BB_PARTITION (b))
664     return;
665
666   barrier = next_nonnote_insn (BB_END (a));
667   gcc_assert (BARRIER_P (barrier));
668   delete_insn (barrier);
669
670   /* Scramble the insn chain.  */
671   if (BB_END (a) != PREV_INSN (BB_HEAD (b)))
672     reorder_insns_nobb (BB_HEAD (a), BB_END (a), PREV_INSN (BB_HEAD (b)));
673   df_set_bb_dirty (a);
674
675   if (dump_file)
676     fprintf (dump_file, "Moved block %d before %d and merged.\n",
677              a->index, b->index);
678
679   /* Swap the records for the two blocks around.  */
680
681   unlink_block (a);
682   link_block (a, b->prev_bb);
683
684   /* Now blocks A and B are contiguous.  Merge them.  */
685   merge_blocks (a, b);
686 }
687
688 /* Blocks A and B are to be merged into a single block.  B has no outgoing
689    fallthru edge, so it can be moved after A without adding or modifying
690    any jumps (aside from the jump from A to B).  */
691
692 static void
693 merge_blocks_move_successor_nojumps (basic_block a, basic_block b)
694 {
695   rtx barrier, real_b_end;
696   rtx label, table;
697
698   /* If we are partitioning hot/cold basic blocks, we don't want to
699      mess up unconditional or indirect jumps that cross between hot
700      and cold sections.
701
702      Basic block partitioning may result in some jumps that appear to
703      be optimizable (or blocks that appear to be mergeable), but which really
704      must be left untouched (they are required to make it safely across
705      partition boundaries).  See the comments at the top of
706      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
707
708   if (BB_PARTITION (a) != BB_PARTITION (b))
709     return;
710
711   real_b_end = BB_END (b);
712
713   /* If there is a jump table following block B temporarily add the jump table
714      to block B so that it will also be moved to the correct location.  */
715   if (tablejump_p (BB_END (b), &label, &table)
716       && prev_active_insn (label) == BB_END (b))
717     {
718       BB_END (b) = table;
719     }
720
721   /* There had better have been a barrier there.  Delete it.  */
722   barrier = NEXT_INSN (BB_END (b));
723   if (barrier && BARRIER_P (barrier))
724     delete_insn (barrier);
725
726
727   /* Scramble the insn chain.  */
728   reorder_insns_nobb (BB_HEAD (b), BB_END (b), BB_END (a));
729
730   /* Restore the real end of b.  */
731   BB_END (b) = real_b_end;
732
733   if (dump_file)
734     fprintf (dump_file, "Moved block %d after %d and merged.\n",
735              b->index, a->index);
736
737   /* Now blocks A and B are contiguous.  Merge them.  */
738   merge_blocks (a, b);
739 }
740
741 /* Attempt to merge basic blocks that are potentially non-adjacent.
742    Return NULL iff the attempt failed, otherwise return basic block
743    where cleanup_cfg should continue.  Because the merging commonly
744    moves basic block away or introduces another optimization
745    possibility, return basic block just before B so cleanup_cfg don't
746    need to iterate.
747
748    It may be good idea to return basic block before C in the case
749    C has been moved after B and originally appeared earlier in the
750    insn sequence, but we have no information available about the
751    relative ordering of these two.  Hopefully it is not too common.  */
752
753 static basic_block
754 merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
755 {
756   basic_block next;
757
758   /* If we are partitioning hot/cold basic blocks, we don't want to
759      mess up unconditional or indirect jumps that cross between hot
760      and cold sections.
761
762      Basic block partitioning may result in some jumps that appear to
763      be optimizable (or blocks that appear to be mergeable), but which really
764      must be left untouched (they are required to make it safely across
765      partition boundaries).  See the comments at the top of
766      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
767
768   if (BB_PARTITION (b) != BB_PARTITION (c))
769     return NULL;
770
771   /* If B has a fallthru edge to C, no need to move anything.  */
772   if (e->flags & EDGE_FALLTHRU)
773     {
774       int b_index = b->index, c_index = c->index;
775       merge_blocks (b, c);
776       update_forwarder_flag (b);
777
778       if (dump_file)
779         fprintf (dump_file, "Merged %d and %d without moving.\n",
780                  b_index, c_index);
781
782       return b->prev_bb == ENTRY_BLOCK_PTR ? b : b->prev_bb;
783     }
784
785   /* Otherwise we will need to move code around.  Do that only if expensive
786      transformations are allowed.  */
787   else if (mode & CLEANUP_EXPENSIVE)
788     {
789       edge tmp_edge, b_fallthru_edge;
790       bool c_has_outgoing_fallthru;
791       bool b_has_incoming_fallthru;
792       edge_iterator ei;
793
794       /* Avoid overactive code motion, as the forwarder blocks should be
795          eliminated by edge redirection instead.  One exception might have
796          been if B is a forwarder block and C has no fallthru edge, but
797          that should be cleaned up by bb-reorder instead.  */
798       if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
799         return NULL;
800
801       /* We must make sure to not munge nesting of lexical blocks,
802          and loop notes.  This is done by squeezing out all the notes
803          and leaving them there to lie.  Not ideal, but functional.  */
804
805       FOR_EACH_EDGE (tmp_edge, ei, c->succs)
806         if (tmp_edge->flags & EDGE_FALLTHRU)
807           break;
808
809       c_has_outgoing_fallthru = (tmp_edge != NULL);
810
811       FOR_EACH_EDGE (tmp_edge, ei, b->preds)
812         if (tmp_edge->flags & EDGE_FALLTHRU)
813           break;
814
815       b_has_incoming_fallthru = (tmp_edge != NULL);
816       b_fallthru_edge = tmp_edge;
817       next = b->prev_bb;
818       if (next == c)
819         next = next->prev_bb;
820
821       /* Otherwise, we're going to try to move C after B.  If C does
822          not have an outgoing fallthru, then it can be moved
823          immediately after B without introducing or modifying jumps.  */
824       if (! c_has_outgoing_fallthru)
825         {
826           merge_blocks_move_successor_nojumps (b, c);
827           return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
828         }
829
830       /* If B does not have an incoming fallthru, then it can be moved
831          immediately before C without introducing or modifying jumps.
832          C cannot be the first block, so we do not have to worry about
833          accessing a non-existent block.  */
834
835       if (b_has_incoming_fallthru)
836         {
837           basic_block bb;
838
839           if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
840             return NULL;
841           bb = force_nonfallthru (b_fallthru_edge);
842           if (bb)
843             notice_new_block (bb);
844         }
845
846       merge_blocks_move_predecessor_nojumps (b, c);
847       return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
848     }
849
850   return NULL;
851 }
852 \f
853
854 /* Removes the memory attributes of MEM expression
855    if they are not equal.  */
856
857 void
858 merge_memattrs (rtx x, rtx y)
859 {
860   int i;
861   int j;
862   enum rtx_code code;
863   const char *fmt;
864
865   if (x == y)
866     return;
867   if (x == 0 || y == 0)
868     return;
869
870   code = GET_CODE (x);
871
872   if (code != GET_CODE (y))
873     return;
874
875   if (GET_MODE (x) != GET_MODE (y))
876     return;
877
878   if (code == MEM && MEM_ATTRS (x) != MEM_ATTRS (y))
879     {
880       if (! MEM_ATTRS (x))
881         MEM_ATTRS (y) = 0;
882       else if (! MEM_ATTRS (y))
883         MEM_ATTRS (x) = 0;
884       else
885         {
886           rtx mem_size;
887
888           if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y))
889             {
890               set_mem_alias_set (x, 0);
891               set_mem_alias_set (y, 0);
892             }
893
894           if (! mem_expr_equal_p (MEM_EXPR (x), MEM_EXPR (y)))
895             {
896               set_mem_expr (x, 0);
897               set_mem_expr (y, 0);
898               set_mem_offset (x, 0);
899               set_mem_offset (y, 0);
900             }
901           else if (MEM_OFFSET (x) != MEM_OFFSET (y))
902             {
903               set_mem_offset (x, 0);
904               set_mem_offset (y, 0);
905             }
906
907           if (!MEM_SIZE (x))
908             mem_size = NULL_RTX;
909           else if (!MEM_SIZE (y))
910             mem_size = NULL_RTX;
911           else
912             mem_size = GEN_INT (MAX (INTVAL (MEM_SIZE (x)),
913                                      INTVAL (MEM_SIZE (y))));
914           set_mem_size (x, mem_size);
915           set_mem_size (y, mem_size);
916
917           set_mem_align (x, MIN (MEM_ALIGN (x), MEM_ALIGN (y)));
918           set_mem_align (y, MEM_ALIGN (x));
919         }
920     }
921
922   fmt = GET_RTX_FORMAT (code);
923   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
924     {
925       switch (fmt[i])
926         {
927         case 'E':
928           /* Two vectors must have the same length.  */
929           if (XVECLEN (x, i) != XVECLEN (y, i))
930             return;
931
932           for (j = 0; j < XVECLEN (x, i); j++)
933             merge_memattrs (XVECEXP (x, i, j), XVECEXP (y, i, j));
934
935           break;
936
937         case 'e':
938           merge_memattrs (XEXP (x, i), XEXP (y, i));
939         }
940     }
941   return;
942 }
943
944
945 /* Return true if I1 and I2 are equivalent and thus can be crossjumped.  */
946
947 static bool
948 old_insns_match_p (int mode ATTRIBUTE_UNUSED, rtx i1, rtx i2)
949 {
950   rtx p1, p2;
951
952   /* Verify that I1 and I2 are equivalent.  */
953   if (GET_CODE (i1) != GET_CODE (i2))
954     return false;
955
956   /* __builtin_unreachable() may lead to empty blocks (ending with
957      NOTE_INSN_BASIC_BLOCK).  They may be crossjumped. */
958   if (NOTE_INSN_BASIC_BLOCK_P (i1) && NOTE_INSN_BASIC_BLOCK_P (i2))
959     return true;
960
961   p1 = PATTERN (i1);
962   p2 = PATTERN (i2);
963
964   if (GET_CODE (p1) != GET_CODE (p2))
965     return false;
966
967   /* If this is a CALL_INSN, compare register usage information.
968      If we don't check this on stack register machines, the two
969      CALL_INSNs might be merged leaving reg-stack.c with mismatching
970      numbers of stack registers in the same basic block.
971      If we don't check this on machines with delay slots, a delay slot may
972      be filled that clobbers a parameter expected by the subroutine.
973
974      ??? We take the simple route for now and assume that if they're
975      equal, they were constructed identically.
976
977      Also check for identical exception regions.  */
978
979   if (CALL_P (i1))
980     {
981       /* Ensure the same EH region.  */
982       rtx n1 = find_reg_note (i1, REG_EH_REGION, 0);
983       rtx n2 = find_reg_note (i2, REG_EH_REGION, 0);
984
985       if (!n1 && n2)
986         return false;
987
988       if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
989         return false;
990
991       if (!rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
992                         CALL_INSN_FUNCTION_USAGE (i2))
993           || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2))
994         return false;
995     }
996
997 #ifdef STACK_REGS
998   /* If cross_jump_death_matters is not 0, the insn's mode
999      indicates whether or not the insn contains any stack-like
1000      regs.  */
1001
1002   if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
1003     {
1004       /* If register stack conversion has already been done, then
1005          death notes must also be compared before it is certain that
1006          the two instruction streams match.  */
1007
1008       rtx note;
1009       HARD_REG_SET i1_regset, i2_regset;
1010
1011       CLEAR_HARD_REG_SET (i1_regset);
1012       CLEAR_HARD_REG_SET (i2_regset);
1013
1014       for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
1015         if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
1016           SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
1017
1018       for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
1019         if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
1020           SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
1021
1022       if (!hard_reg_set_equal_p (i1_regset, i2_regset))
1023         return false;
1024     }
1025 #endif
1026
1027   if (reload_completed
1028       ? rtx_renumbered_equal_p (p1, p2) : rtx_equal_p (p1, p2))
1029     return true;
1030
1031   return false;
1032 }
1033 \f
1034 /* When comparing insns I1 and I2 in flow_find_cross_jump or
1035    flow_find_head_matching_sequence, ensure the notes match.  */
1036
1037 static void
1038 merge_notes (rtx i1, rtx i2)
1039 {
1040   /* If the merged insns have different REG_EQUAL notes, then
1041      remove them.  */
1042   rtx equiv1 = find_reg_equal_equiv_note (i1);
1043   rtx equiv2 = find_reg_equal_equiv_note (i2);
1044
1045   if (equiv1 && !equiv2)
1046     remove_note (i1, equiv1);
1047   else if (!equiv1 && equiv2)
1048     remove_note (i2, equiv2);
1049   else if (equiv1 && equiv2
1050            && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
1051     {
1052       remove_note (i1, equiv1);
1053       remove_note (i2, equiv2);
1054     }
1055 }
1056
1057 /* Look through the insns at the end of BB1 and BB2 and find the longest
1058    sequence that are equivalent.  Store the first insns for that sequence
1059    in *F1 and *F2 and return the sequence length.
1060
1061    To simplify callers of this function, if the blocks match exactly,
1062    store the head of the blocks in *F1 and *F2.  */
1063
1064 int
1065 flow_find_cross_jump (basic_block bb1, basic_block bb2, rtx *f1, rtx *f2)
1066 {
1067   rtx i1, i2, last1, last2, afterlast1, afterlast2;
1068   int ninsns = 0;
1069
1070   /* Skip simple jumps at the end of the blocks.  Complex jumps still
1071      need to be compared for equivalence, which we'll do below.  */
1072
1073   i1 = BB_END (bb1);
1074   last1 = afterlast1 = last2 = afterlast2 = NULL_RTX;
1075   if (onlyjump_p (i1)
1076       || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
1077     {
1078       last1 = i1;
1079       i1 = PREV_INSN (i1);
1080     }
1081
1082   i2 = BB_END (bb2);
1083   if (onlyjump_p (i2)
1084       || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
1085     {
1086       last2 = i2;
1087       /* Count everything except for unconditional jump as insn.  */
1088       if (!simplejump_p (i2) && !returnjump_p (i2) && last1)
1089         ninsns++;
1090       i2 = PREV_INSN (i2);
1091     }
1092
1093   while (true)
1094     {
1095       /* Ignore notes.  */
1096       while (!NONDEBUG_INSN_P (i1) && i1 != BB_HEAD (bb1))
1097         i1 = PREV_INSN (i1);
1098
1099       while (!NONDEBUG_INSN_P (i2) && i2 != BB_HEAD (bb2))
1100         i2 = PREV_INSN (i2);
1101
1102       if (i1 == BB_HEAD (bb1) || i2 == BB_HEAD (bb2))
1103         break;
1104
1105       if (!old_insns_match_p (0, i1, i2))
1106         break;
1107
1108       merge_memattrs (i1, i2);
1109
1110       /* Don't begin a cross-jump with a NOTE insn.  */
1111       if (INSN_P (i1))
1112         {
1113           merge_notes (i1, i2);
1114
1115           afterlast1 = last1, afterlast2 = last2;
1116           last1 = i1, last2 = i2;
1117           ninsns++;
1118         }
1119
1120       i1 = PREV_INSN (i1);
1121       i2 = PREV_INSN (i2);
1122     }
1123
1124 #ifdef HAVE_cc0
1125   /* Don't allow the insn after a compare to be shared by
1126      cross-jumping unless the compare is also shared.  */
1127   if (ninsns && reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1))
1128     last1 = afterlast1, last2 = afterlast2, ninsns--;
1129 #endif
1130
1131   /* Include preceding notes and labels in the cross-jump.  One,
1132      this may bring us to the head of the blocks as requested above.
1133      Two, it keeps line number notes as matched as may be.  */
1134   if (ninsns)
1135     {
1136       while (last1 != BB_HEAD (bb1) && !NONDEBUG_INSN_P (PREV_INSN (last1)))
1137         last1 = PREV_INSN (last1);
1138
1139       if (last1 != BB_HEAD (bb1) && LABEL_P (PREV_INSN (last1)))
1140         last1 = PREV_INSN (last1);
1141
1142       while (last2 != BB_HEAD (bb2) && !NONDEBUG_INSN_P (PREV_INSN (last2)))
1143         last2 = PREV_INSN (last2);
1144
1145       if (last2 != BB_HEAD (bb2) && LABEL_P (PREV_INSN (last2)))
1146         last2 = PREV_INSN (last2);
1147
1148       *f1 = last1;
1149       *f2 = last2;
1150     }
1151
1152   return ninsns;
1153 }
1154
1155 /* Like flow_find_cross_jump, except start looking for a matching sequence from
1156    the head of the two blocks.  Do not include jumps at the end.
1157    If STOP_AFTER is nonzero, stop after finding that many matching
1158    instructions.  */
1159
1160 int
1161 flow_find_head_matching_sequence (basic_block bb1, basic_block bb2, rtx *f1,
1162                                   rtx *f2, int stop_after)
1163 {
1164   rtx i1, i2, last1, last2, beforelast1, beforelast2;
1165   int ninsns = 0;
1166   edge e;
1167   edge_iterator ei;
1168   int nehedges1 = 0, nehedges2 = 0;
1169
1170   FOR_EACH_EDGE (e, ei, bb1->succs)
1171     if (e->flags & EDGE_EH)
1172       nehedges1++;
1173   FOR_EACH_EDGE (e, ei, bb2->succs)
1174     if (e->flags & EDGE_EH)
1175       nehedges2++;
1176
1177   i1 = BB_HEAD (bb1);
1178   i2 = BB_HEAD (bb2);
1179   last1 = beforelast1 = last2 = beforelast2 = NULL_RTX;
1180
1181   while (true)
1182     {
1183
1184       /* Ignore notes.  */
1185       while (!NONDEBUG_INSN_P (i1) && i1 != BB_END (bb1))
1186         i1 = NEXT_INSN (i1);
1187
1188       while (!NONDEBUG_INSN_P (i2) && i2 != BB_END (bb2))
1189         i2 = NEXT_INSN (i2);
1190
1191       if (NOTE_P (i1) || NOTE_P (i2)
1192           || JUMP_P (i1) || JUMP_P (i2))
1193         break;
1194
1195       /* A sanity check to make sure we're not merging insns with different
1196          effects on EH.  If only one of them ends a basic block, it shouldn't
1197          have an EH edge; if both end a basic block, there should be the same
1198          number of EH edges.  */
1199       if ((i1 == BB_END (bb1) && i2 != BB_END (bb2)
1200            && nehedges1 > 0)
1201           || (i2 == BB_END (bb2) && i1 != BB_END (bb1)
1202               && nehedges2 > 0)
1203           || (i1 == BB_END (bb1) && i2 == BB_END (bb2)
1204               && nehedges1 != nehedges2))
1205         break;
1206
1207       if (!old_insns_match_p (0, i1, i2))
1208         break;
1209
1210       merge_memattrs (i1, i2);
1211
1212       /* Don't begin a cross-jump with a NOTE insn.  */
1213       if (INSN_P (i1))
1214         {
1215           merge_notes (i1, i2);
1216
1217           beforelast1 = last1, beforelast2 = last2;
1218           last1 = i1, last2 = i2;
1219           ninsns++;
1220         }
1221
1222       if (i1 == BB_END (bb1) || i2 == BB_END (bb2)
1223           || (stop_after > 0 && ninsns == stop_after))
1224         break;
1225
1226       i1 = NEXT_INSN (i1);
1227       i2 = NEXT_INSN (i2);
1228     }
1229
1230 #ifdef HAVE_cc0
1231   /* Don't allow a compare to be shared by cross-jumping unless the insn
1232      after the compare is also shared.  */
1233   if (ninsns && reg_mentioned_p (cc0_rtx, last1) && sets_cc0_p (last1))
1234     last1 = beforelast1, last2 = beforelast2, ninsns--;
1235 #endif
1236
1237   if (ninsns)
1238     {
1239       *f1 = last1;
1240       *f2 = last2;
1241     }
1242
1243   return ninsns;
1244 }
1245
1246 /* Return true iff outgoing edges of BB1 and BB2 match, together with
1247    the branch instruction.  This means that if we commonize the control
1248    flow before end of the basic block, the semantic remains unchanged.
1249
1250    We may assume that there exists one edge with a common destination.  */
1251
1252 static bool
1253 outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
1254 {
1255   int nehedges1 = 0, nehedges2 = 0;
1256   edge fallthru1 = 0, fallthru2 = 0;
1257   edge e1, e2;
1258   edge_iterator ei;
1259
1260   /* If BB1 has only one successor, we may be looking at either an
1261      unconditional jump, or a fake edge to exit.  */
1262   if (single_succ_p (bb1)
1263       && (single_succ_edge (bb1)->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
1264       && (!JUMP_P (BB_END (bb1)) || simplejump_p (BB_END (bb1))))
1265     return (single_succ_p (bb2)
1266             && (single_succ_edge (bb2)->flags
1267                 & (EDGE_COMPLEX | EDGE_FAKE)) == 0
1268             && (!JUMP_P (BB_END (bb2)) || simplejump_p (BB_END (bb2))));
1269
1270   /* Match conditional jumps - this may get tricky when fallthru and branch
1271      edges are crossed.  */
1272   if (EDGE_COUNT (bb1->succs) == 2
1273       && any_condjump_p (BB_END (bb1))
1274       && onlyjump_p (BB_END (bb1)))
1275     {
1276       edge b1, f1, b2, f2;
1277       bool reverse, match;
1278       rtx set1, set2, cond1, cond2;
1279       enum rtx_code code1, code2;
1280
1281       if (EDGE_COUNT (bb2->succs) != 2
1282           || !any_condjump_p (BB_END (bb2))
1283           || !onlyjump_p (BB_END (bb2)))
1284         return false;
1285
1286       b1 = BRANCH_EDGE (bb1);
1287       b2 = BRANCH_EDGE (bb2);
1288       f1 = FALLTHRU_EDGE (bb1);
1289       f2 = FALLTHRU_EDGE (bb2);
1290
1291       /* Get around possible forwarders on fallthru edges.  Other cases
1292          should be optimized out already.  */
1293       if (FORWARDER_BLOCK_P (f1->dest))
1294         f1 = single_succ_edge (f1->dest);
1295
1296       if (FORWARDER_BLOCK_P (f2->dest))
1297         f2 = single_succ_edge (f2->dest);
1298
1299       /* To simplify use of this function, return false if there are
1300          unneeded forwarder blocks.  These will get eliminated later
1301          during cleanup_cfg.  */
1302       if (FORWARDER_BLOCK_P (f1->dest)
1303           || FORWARDER_BLOCK_P (f2->dest)
1304           || FORWARDER_BLOCK_P (b1->dest)
1305           || FORWARDER_BLOCK_P (b2->dest))
1306         return false;
1307
1308       if (f1->dest == f2->dest && b1->dest == b2->dest)
1309         reverse = false;
1310       else if (f1->dest == b2->dest && b1->dest == f2->dest)
1311         reverse = true;
1312       else
1313         return false;
1314
1315       set1 = pc_set (BB_END (bb1));
1316       set2 = pc_set (BB_END (bb2));
1317       if ((XEXP (SET_SRC (set1), 1) == pc_rtx)
1318           != (XEXP (SET_SRC (set2), 1) == pc_rtx))
1319         reverse = !reverse;
1320
1321       cond1 = XEXP (SET_SRC (set1), 0);
1322       cond2 = XEXP (SET_SRC (set2), 0);
1323       code1 = GET_CODE (cond1);
1324       if (reverse)
1325         code2 = reversed_comparison_code (cond2, BB_END (bb2));
1326       else
1327         code2 = GET_CODE (cond2);
1328
1329       if (code2 == UNKNOWN)
1330         return false;
1331
1332       /* Verify codes and operands match.  */
1333       match = ((code1 == code2
1334                 && rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
1335                 && rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
1336                || (code1 == swap_condition (code2)
1337                    && rtx_renumbered_equal_p (XEXP (cond1, 1),
1338                                               XEXP (cond2, 0))
1339                    && rtx_renumbered_equal_p (XEXP (cond1, 0),
1340                                               XEXP (cond2, 1))));
1341
1342       /* If we return true, we will join the blocks.  Which means that
1343          we will only have one branch prediction bit to work with.  Thus
1344          we require the existing branches to have probabilities that are
1345          roughly similar.  */
1346       if (match
1347           && optimize_bb_for_speed_p (bb1)
1348           && optimize_bb_for_speed_p (bb2))
1349         {
1350           int prob2;
1351
1352           if (b1->dest == b2->dest)
1353             prob2 = b2->probability;
1354           else
1355             /* Do not use f2 probability as f2 may be forwarded.  */
1356             prob2 = REG_BR_PROB_BASE - b2->probability;
1357
1358           /* Fail if the difference in probabilities is greater than 50%.
1359              This rules out two well-predicted branches with opposite
1360              outcomes.  */
1361           if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2)
1362             {
1363               if (dump_file)
1364                 fprintf (dump_file,
1365                          "Outcomes of branch in bb %i and %i differ too much (%i %i)\n",
1366                          bb1->index, bb2->index, b1->probability, prob2);
1367
1368               return false;
1369             }
1370         }
1371
1372       if (dump_file && match)
1373         fprintf (dump_file, "Conditionals in bb %i and %i match.\n",
1374                  bb1->index, bb2->index);
1375
1376       return match;
1377     }
1378
1379   /* Generic case - we are seeing a computed jump, table jump or trapping
1380      instruction.  */
1381
1382   /* Check whether there are tablejumps in the end of BB1 and BB2.
1383      Return true if they are identical.  */
1384     {
1385       rtx label1, label2;
1386       rtx table1, table2;
1387
1388       if (tablejump_p (BB_END (bb1), &label1, &table1)
1389           && tablejump_p (BB_END (bb2), &label2, &table2)
1390           && GET_CODE (PATTERN (table1)) == GET_CODE (PATTERN (table2)))
1391         {
1392           /* The labels should never be the same rtx.  If they really are same
1393              the jump tables are same too. So disable crossjumping of blocks BB1
1394              and BB2 because when deleting the common insns in the end of BB1
1395              by delete_basic_block () the jump table would be deleted too.  */
1396           /* If LABEL2 is referenced in BB1->END do not do anything
1397              because we would loose information when replacing
1398              LABEL1 by LABEL2 and then LABEL2 by LABEL1 in BB1->END.  */
1399           if (label1 != label2 && !rtx_referenced_p (label2, BB_END (bb1)))
1400             {
1401               /* Set IDENTICAL to true when the tables are identical.  */
1402               bool identical = false;
1403               rtx p1, p2;
1404
1405               p1 = PATTERN (table1);
1406               p2 = PATTERN (table2);
1407               if (GET_CODE (p1) == ADDR_VEC && rtx_equal_p (p1, p2))
1408                 {
1409                   identical = true;
1410                 }
1411               else if (GET_CODE (p1) == ADDR_DIFF_VEC
1412                        && (XVECLEN (p1, 1) == XVECLEN (p2, 1))
1413                        && rtx_equal_p (XEXP (p1, 2), XEXP (p2, 2))
1414                        && rtx_equal_p (XEXP (p1, 3), XEXP (p2, 3)))
1415                 {
1416                   int i;
1417
1418                   identical = true;
1419                   for (i = XVECLEN (p1, 1) - 1; i >= 0 && identical; i--)
1420                     if (!rtx_equal_p (XVECEXP (p1, 1, i), XVECEXP (p2, 1, i)))
1421                       identical = false;
1422                 }
1423
1424               if (identical)
1425                 {
1426                   replace_label_data rr;
1427                   bool match;
1428
1429                   /* Temporarily replace references to LABEL1 with LABEL2
1430                      in BB1->END so that we could compare the instructions.  */
1431                   rr.r1 = label1;
1432                   rr.r2 = label2;
1433                   rr.update_label_nuses = false;
1434                   for_each_rtx (&BB_END (bb1), replace_label, &rr);
1435
1436                   match = old_insns_match_p (mode, BB_END (bb1), BB_END (bb2));
1437                   if (dump_file && match)
1438                     fprintf (dump_file,
1439                              "Tablejumps in bb %i and %i match.\n",
1440                              bb1->index, bb2->index);
1441
1442                   /* Set the original label in BB1->END because when deleting
1443                      a block whose end is a tablejump, the tablejump referenced
1444                      from the instruction is deleted too.  */
1445                   rr.r1 = label2;
1446                   rr.r2 = label1;
1447                   for_each_rtx (&BB_END (bb1), replace_label, &rr);
1448
1449                   return match;
1450                 }
1451             }
1452           return false;
1453         }
1454     }
1455
1456   /* First ensure that the instructions match.  There may be many outgoing
1457      edges so this test is generally cheaper.  */
1458   if (!old_insns_match_p (mode, BB_END (bb1), BB_END (bb2)))
1459     return false;
1460
1461   /* Search the outgoing edges, ensure that the counts do match, find possible
1462      fallthru and exception handling edges since these needs more
1463      validation.  */
1464   if (EDGE_COUNT (bb1->succs) != EDGE_COUNT (bb2->succs))
1465     return false;
1466
1467   FOR_EACH_EDGE (e1, ei, bb1->succs)
1468     {
1469       e2 = EDGE_SUCC (bb2, ei.index);
1470
1471       if (e1->flags & EDGE_EH)
1472         nehedges1++;
1473
1474       if (e2->flags & EDGE_EH)
1475         nehedges2++;
1476
1477       if (e1->flags & EDGE_FALLTHRU)
1478         fallthru1 = e1;
1479       if (e2->flags & EDGE_FALLTHRU)
1480         fallthru2 = e2;
1481     }
1482
1483   /* If number of edges of various types does not match, fail.  */
1484   if (nehedges1 != nehedges2
1485       || (fallthru1 != 0) != (fallthru2 != 0))
1486     return false;
1487
1488   /* fallthru edges must be forwarded to the same destination.  */
1489   if (fallthru1)
1490     {
1491       basic_block d1 = (forwarder_block_p (fallthru1->dest)
1492                         ? single_succ (fallthru1->dest): fallthru1->dest);
1493       basic_block d2 = (forwarder_block_p (fallthru2->dest)
1494                         ? single_succ (fallthru2->dest): fallthru2->dest);
1495
1496       if (d1 != d2)
1497         return false;
1498     }
1499
1500   /* Ensure the same EH region.  */
1501   {
1502     rtx n1 = find_reg_note (BB_END (bb1), REG_EH_REGION, 0);
1503     rtx n2 = find_reg_note (BB_END (bb2), REG_EH_REGION, 0);
1504
1505     if (!n1 && n2)
1506       return false;
1507
1508     if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
1509       return false;
1510   }
1511
1512   /* The same checks as in try_crossjump_to_edge. It is required for RTL
1513      version of sequence abstraction.  */
1514   FOR_EACH_EDGE (e1, ei, bb2->succs)
1515     {
1516       edge e2;
1517       edge_iterator ei;
1518       basic_block d1 = e1->dest;
1519
1520       if (FORWARDER_BLOCK_P (d1))
1521         d1 = EDGE_SUCC (d1, 0)->dest;
1522
1523       FOR_EACH_EDGE (e2, ei, bb1->succs)
1524         {
1525           basic_block d2 = e2->dest;
1526           if (FORWARDER_BLOCK_P (d2))
1527             d2 = EDGE_SUCC (d2, 0)->dest;
1528           if (d1 == d2)
1529             break;
1530         }
1531
1532       if (!e2)
1533         return false;
1534     }
1535
1536   return true;
1537 }
1538
1539 /* Returns true if BB basic block has a preserve label.  */
1540
1541 static bool
1542 block_has_preserve_label (basic_block bb)
1543 {
1544   return (bb
1545           && block_label (bb)
1546           && LABEL_PRESERVE_P (block_label (bb)));
1547 }
1548
1549 /* E1 and E2 are edges with the same destination block.  Search their
1550    predecessors for common code.  If found, redirect control flow from
1551    (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC.  */
1552
1553 static bool
1554 try_crossjump_to_edge (int mode, edge e1, edge e2)
1555 {
1556   int nmatch;
1557   basic_block src1 = e1->src, src2 = e2->src;
1558   basic_block redirect_to, redirect_from, to_remove;
1559   rtx newpos1, newpos2;
1560   edge s;
1561   edge_iterator ei;
1562
1563   newpos1 = newpos2 = NULL_RTX;
1564
1565   /* If we have partitioned hot/cold basic blocks, it is a bad idea
1566      to try this optimization.
1567
1568      Basic block partitioning may result in some jumps that appear to
1569      be optimizable (or blocks that appear to be mergeable), but which really
1570      must be left untouched (they are required to make it safely across
1571      partition boundaries).  See the comments at the top of
1572      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
1573
1574   if (flag_reorder_blocks_and_partition && reload_completed)
1575     return false;
1576
1577   /* Search backward through forwarder blocks.  We don't need to worry
1578      about multiple entry or chained forwarders, as they will be optimized
1579      away.  We do this to look past the unconditional jump following a
1580      conditional jump that is required due to the current CFG shape.  */
1581   if (single_pred_p (src1)
1582       && FORWARDER_BLOCK_P (src1))
1583     e1 = single_pred_edge (src1), src1 = e1->src;
1584
1585   if (single_pred_p (src2)
1586       && FORWARDER_BLOCK_P (src2))
1587     e2 = single_pred_edge (src2), src2 = e2->src;
1588
1589   /* Nothing to do if we reach ENTRY, or a common source block.  */
1590   if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
1591     return false;
1592   if (src1 == src2)
1593     return false;
1594
1595   /* Seeing more than 1 forwarder blocks would confuse us later...  */
1596   if (FORWARDER_BLOCK_P (e1->dest)
1597       && FORWARDER_BLOCK_P (single_succ (e1->dest)))
1598     return false;
1599
1600   if (FORWARDER_BLOCK_P (e2->dest)
1601       && FORWARDER_BLOCK_P (single_succ (e2->dest)))
1602     return false;
1603
1604   /* Likewise with dead code (possibly newly created by the other optimizations
1605      of cfg_cleanup).  */
1606   if (EDGE_COUNT (src1->preds) == 0 || EDGE_COUNT (src2->preds) == 0)
1607     return false;
1608
1609   /* Look for the common insn sequence, part the first ...  */
1610   if (!outgoing_edges_match (mode, src1, src2))
1611     return false;
1612
1613   /* ... and part the second.  */
1614   nmatch = flow_find_cross_jump (src1, src2, &newpos1, &newpos2);
1615
1616   /* Don't proceed with the crossjump unless we found a sufficient number
1617      of matching instructions or the 'from' block was totally matched
1618      (such that its predecessors will hopefully be redirected and the
1619      block removed).  */
1620   if ((nmatch < PARAM_VALUE (PARAM_MIN_CROSSJUMP_INSNS))
1621       && (newpos1 != BB_HEAD (src1)))
1622     return false;
1623
1624   /* Avoid deleting preserve label when redirecting ABNORMAL edges.  */
1625   if (block_has_preserve_label (e1->dest)
1626       && (e1->flags & EDGE_ABNORMAL))
1627     return false;
1628
1629   /* Here we know that the insns in the end of SRC1 which are common with SRC2
1630      will be deleted.
1631      If we have tablejumps in the end of SRC1 and SRC2
1632      they have been already compared for equivalence in outgoing_edges_match ()
1633      so replace the references to TABLE1 by references to TABLE2.  */
1634     {
1635       rtx label1, label2;
1636       rtx table1, table2;
1637
1638       if (tablejump_p (BB_END (src1), &label1, &table1)
1639           && tablejump_p (BB_END (src2), &label2, &table2)
1640           && label1 != label2)
1641         {
1642           replace_label_data rr;
1643           rtx insn;
1644
1645           /* Replace references to LABEL1 with LABEL2.  */
1646           rr.r1 = label1;
1647           rr.r2 = label2;
1648           rr.update_label_nuses = true;
1649           for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1650             {
1651               /* Do not replace the label in SRC1->END because when deleting
1652                  a block whose end is a tablejump, the tablejump referenced
1653                  from the instruction is deleted too.  */
1654               if (insn != BB_END (src1))
1655                 for_each_rtx (&insn, replace_label, &rr);
1656             }
1657         }
1658     }
1659
1660   /* Avoid splitting if possible.  We must always split when SRC2 has
1661      EH predecessor edges, or we may end up with basic blocks with both
1662      normal and EH predecessor edges.  */
1663   if (newpos2 == BB_HEAD (src2)
1664       && !(EDGE_PRED (src2, 0)->flags & EDGE_EH))
1665     redirect_to = src2;
1666   else
1667     {
1668       if (newpos2 == BB_HEAD (src2))
1669         {
1670           /* Skip possible basic block header.  */
1671           if (LABEL_P (newpos2))
1672             newpos2 = NEXT_INSN (newpos2);
1673           while (DEBUG_INSN_P (newpos2))
1674             newpos2 = NEXT_INSN (newpos2);
1675           if (NOTE_P (newpos2))
1676             newpos2 = NEXT_INSN (newpos2);
1677           while (DEBUG_INSN_P (newpos2))
1678             newpos2 = NEXT_INSN (newpos2);
1679         }
1680
1681       if (dump_file)
1682         fprintf (dump_file, "Splitting bb %i before %i insns\n",
1683                  src2->index, nmatch);
1684       redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
1685     }
1686
1687   if (dump_file)
1688     fprintf (dump_file,
1689              "Cross jumping from bb %i to bb %i; %i common insns\n",
1690              src1->index, src2->index, nmatch);
1691
1692   /* We may have some registers visible through the block.  */
1693   df_set_bb_dirty (redirect_to);
1694
1695   /* Recompute the frequencies and counts of outgoing edges.  */
1696   FOR_EACH_EDGE (s, ei, redirect_to->succs)
1697     {
1698       edge s2;
1699       edge_iterator ei;
1700       basic_block d = s->dest;
1701
1702       if (FORWARDER_BLOCK_P (d))
1703         d = single_succ (d);
1704
1705       FOR_EACH_EDGE (s2, ei, src1->succs)
1706         {
1707           basic_block d2 = s2->dest;
1708           if (FORWARDER_BLOCK_P (d2))
1709             d2 = single_succ (d2);
1710           if (d == d2)
1711             break;
1712         }
1713
1714       s->count += s2->count;
1715
1716       /* Take care to update possible forwarder blocks.  We verified
1717          that there is no more than one in the chain, so we can't run
1718          into infinite loop.  */
1719       if (FORWARDER_BLOCK_P (s->dest))
1720         {
1721           single_succ_edge (s->dest)->count += s2->count;
1722           s->dest->count += s2->count;
1723           s->dest->frequency += EDGE_FREQUENCY (s);
1724         }
1725
1726       if (FORWARDER_BLOCK_P (s2->dest))
1727         {
1728           single_succ_edge (s2->dest)->count -= s2->count;
1729           if (single_succ_edge (s2->dest)->count < 0)
1730             single_succ_edge (s2->dest)->count = 0;
1731           s2->dest->count -= s2->count;
1732           s2->dest->frequency -= EDGE_FREQUENCY (s);
1733           if (s2->dest->frequency < 0)
1734             s2->dest->frequency = 0;
1735           if (s2->dest->count < 0)
1736             s2->dest->count = 0;
1737         }
1738
1739       if (!redirect_to->frequency && !src1->frequency)
1740         s->probability = (s->probability + s2->probability) / 2;
1741       else
1742         s->probability
1743           = ((s->probability * redirect_to->frequency +
1744               s2->probability * src1->frequency)
1745              / (redirect_to->frequency + src1->frequency));
1746     }
1747
1748   /* Adjust count and frequency for the block.  An earlier jump
1749      threading pass may have left the profile in an inconsistent
1750      state (see update_bb_profile_for_threading) so we must be
1751      prepared for overflows.  */
1752   redirect_to->count += src1->count;
1753   redirect_to->frequency += src1->frequency;
1754   if (redirect_to->frequency > BB_FREQ_MAX)
1755     redirect_to->frequency = BB_FREQ_MAX;
1756   update_br_prob_note (redirect_to);
1757
1758   /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1.  */
1759
1760   /* Skip possible basic block header.  */
1761   if (LABEL_P (newpos1))
1762     newpos1 = NEXT_INSN (newpos1);
1763
1764   while (DEBUG_INSN_P (newpos1))
1765     newpos1 = NEXT_INSN (newpos1);
1766
1767   if (NOTE_INSN_BASIC_BLOCK_P (newpos1))
1768     newpos1 = NEXT_INSN (newpos1);
1769
1770   while (DEBUG_INSN_P (newpos1))
1771     newpos1 = NEXT_INSN (newpos1);
1772
1773   redirect_from = split_block (src1, PREV_INSN (newpos1))->src;
1774   to_remove = single_succ (redirect_from);
1775
1776   redirect_edge_and_branch_force (single_succ_edge (redirect_from), redirect_to);
1777   delete_basic_block (to_remove);
1778
1779   update_forwarder_flag (redirect_from);
1780   if (redirect_to != src2)
1781     update_forwarder_flag (src2);
1782
1783   return true;
1784 }
1785
1786 /* Search the predecessors of BB for common insn sequences.  When found,
1787    share code between them by redirecting control flow.  Return true if
1788    any changes made.  */
1789
1790 static bool
1791 try_crossjump_bb (int mode, basic_block bb)
1792 {
1793   edge e, e2, fallthru;
1794   bool changed;
1795   unsigned max, ix, ix2;
1796   basic_block ev, ev2;
1797   edge_iterator ei;
1798
1799   /* Nothing to do if there is not at least two incoming edges.  */
1800   if (EDGE_COUNT (bb->preds) < 2)
1801     return false;
1802
1803   /* Don't crossjump if this block ends in a computed jump,
1804      unless we are optimizing for size.  */
1805   if (optimize_bb_for_size_p (bb)
1806       && bb != EXIT_BLOCK_PTR
1807       && computed_jump_p (BB_END (bb)))
1808     return false;
1809
1810   /* If we are partitioning hot/cold basic blocks, we don't want to
1811      mess up unconditional or indirect jumps that cross between hot
1812      and cold sections.
1813
1814      Basic block partitioning may result in some jumps that appear to
1815      be optimizable (or blocks that appear to be mergeable), but which really
1816      must be left untouched (they are required to make it safely across
1817      partition boundaries).  See the comments at the top of
1818      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
1819
1820   if (BB_PARTITION (EDGE_PRED (bb, 0)->src) !=
1821                                         BB_PARTITION (EDGE_PRED (bb, 1)->src)
1822       || (EDGE_PRED (bb, 0)->flags & EDGE_CROSSING))
1823     return false;
1824
1825   /* It is always cheapest to redirect a block that ends in a branch to
1826      a block that falls through into BB, as that adds no branches to the
1827      program.  We'll try that combination first.  */
1828   fallthru = NULL;
1829   max = PARAM_VALUE (PARAM_MAX_CROSSJUMP_EDGES);
1830
1831   if (EDGE_COUNT (bb->preds) > max)
1832     return false;
1833
1834   FOR_EACH_EDGE (e, ei, bb->preds)
1835     {
1836       if (e->flags & EDGE_FALLTHRU)
1837         {
1838           fallthru = e;
1839           break;
1840         }
1841     }
1842
1843   changed = false;
1844   for (ix = 0, ev = bb; ix < EDGE_COUNT (ev->preds); )
1845     {
1846       e = EDGE_PRED (ev, ix);
1847       ix++;
1848
1849       /* As noted above, first try with the fallthru predecessor (or, a
1850          fallthru predecessor if we are in cfglayout mode).  */
1851       if (fallthru)
1852         {
1853           /* Don't combine the fallthru edge into anything else.
1854              If there is a match, we'll do it the other way around.  */
1855           if (e == fallthru)
1856             continue;
1857           /* If nothing changed since the last attempt, there is nothing
1858              we can do.  */
1859           if (!first_pass
1860               && (!(df_get_bb_dirty (e->src))
1861                   && !(df_get_bb_dirty (fallthru->src))))
1862             continue;
1863
1864           if (try_crossjump_to_edge (mode, e, fallthru))
1865             {
1866               changed = true;
1867               ix = 0;
1868               ev = bb;
1869               continue;
1870             }
1871         }
1872
1873       /* Non-obvious work limiting check: Recognize that we're going
1874          to call try_crossjump_bb on every basic block.  So if we have
1875          two blocks with lots of outgoing edges (a switch) and they
1876          share lots of common destinations, then we would do the
1877          cross-jump check once for each common destination.
1878
1879          Now, if the blocks actually are cross-jump candidates, then
1880          all of their destinations will be shared.  Which means that
1881          we only need check them for cross-jump candidacy once.  We
1882          can eliminate redundant checks of crossjump(A,B) by arbitrarily
1883          choosing to do the check from the block for which the edge
1884          in question is the first successor of A.  */
1885       if (EDGE_SUCC (e->src, 0) != e)
1886         continue;
1887
1888       for (ix2 = 0, ev2 = bb; ix2 < EDGE_COUNT (ev2->preds); )
1889         {
1890           e2 = EDGE_PRED (ev2, ix2);
1891           ix2++;
1892
1893           if (e2 == e)
1894             continue;
1895
1896           /* We've already checked the fallthru edge above.  */
1897           if (e2 == fallthru)
1898             continue;
1899
1900           /* The "first successor" check above only prevents multiple
1901              checks of crossjump(A,B).  In order to prevent redundant
1902              checks of crossjump(B,A), require that A be the block
1903              with the lowest index.  */
1904           if (e->src->index > e2->src->index)
1905             continue;
1906
1907           /* If nothing changed since the last attempt, there is nothing
1908              we can do.  */
1909           if (!first_pass
1910               && (!(df_get_bb_dirty (e->src))
1911                   && !(df_get_bb_dirty (e2->src))))
1912             continue;
1913
1914           if (try_crossjump_to_edge (mode, e, e2))
1915             {
1916               changed = true;
1917               ev2 = bb;
1918               ix = 0;
1919               break;
1920             }
1921         }
1922     }
1923
1924   if (changed)
1925     crossjumps_occured = true;
1926
1927   return changed;
1928 }
1929
1930 /* Return true if BB contains just bb note, or bb note followed
1931    by only DEBUG_INSNs.  */
1932
1933 static bool
1934 trivially_empty_bb_p (basic_block bb)
1935 {
1936   rtx insn = BB_END (bb);
1937
1938   while (1)
1939     {
1940       if (insn == BB_HEAD (bb))
1941         return true;
1942       if (!DEBUG_INSN_P (insn))
1943         return false;
1944       insn = PREV_INSN (insn);
1945     }
1946 }
1947
1948 /* Do simple CFG optimizations - basic block merging, simplifying of jump
1949    instructions etc.  Return nonzero if changes were made.  */
1950
1951 static bool
1952 try_optimize_cfg (int mode)
1953 {
1954   bool changed_overall = false;
1955   bool changed;
1956   int iterations = 0;
1957   basic_block bb, b, next;
1958
1959   if (mode & (CLEANUP_CROSSJUMP | CLEANUP_THREADING))
1960     clear_bb_flags ();
1961
1962   crossjumps_occured = false;
1963
1964   FOR_EACH_BB (bb)
1965     update_forwarder_flag (bb);
1966
1967   if (! targetm.cannot_modify_jumps_p ())
1968     {
1969       first_pass = true;
1970       /* Attempt to merge blocks as made possible by edge removal.  If
1971          a block has only one successor, and the successor has only
1972          one predecessor, they may be combined.  */
1973       do
1974         {
1975           changed = false;
1976           iterations++;
1977
1978           if (dump_file)
1979             fprintf (dump_file,
1980                      "\n\ntry_optimize_cfg iteration %i\n\n",
1981                      iterations);
1982
1983           for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR;)
1984             {
1985               basic_block c;
1986               edge s;
1987               bool changed_here = false;
1988
1989               /* Delete trivially dead basic blocks.  This is either
1990                  blocks with no predecessors, or empty blocks with no
1991                  successors.  However if the empty block with no
1992                  successors is the successor of the ENTRY_BLOCK, it is
1993                  kept.  This ensures that the ENTRY_BLOCK will have a
1994                  successor which is a precondition for many RTL
1995                  passes.  Empty blocks may result from expanding
1996                  __builtin_unreachable ().  */
1997               if (EDGE_COUNT (b->preds) == 0
1998                   || (EDGE_COUNT (b->succs) == 0
1999                       && trivially_empty_bb_p (b)
2000                       && single_succ_edge (ENTRY_BLOCK_PTR)->dest != b))
2001                 {
2002                   c = b->prev_bb;
2003                   if (EDGE_COUNT (b->preds) > 0)
2004                     {
2005                       edge e;
2006                       edge_iterator ei;
2007
2008                       if (current_ir_type () == IR_RTL_CFGLAYOUT)
2009                         {
2010                           if (b->il.rtl->footer
2011                               && BARRIER_P (b->il.rtl->footer))
2012                             FOR_EACH_EDGE (e, ei, b->preds)
2013                               if ((e->flags & EDGE_FALLTHRU)
2014                                   && e->src->il.rtl->footer == NULL)
2015                                 {
2016                                   if (b->il.rtl->footer)
2017                                     {
2018                                       e->src->il.rtl->footer = b->il.rtl->footer;
2019                                       b->il.rtl->footer = NULL;
2020                                     }
2021                                   else
2022                                     {
2023                                       start_sequence ();
2024                                       e->src->il.rtl->footer = emit_barrier ();
2025                                       end_sequence ();
2026                                     }
2027                                 }
2028                         }
2029                       else
2030                         {
2031                           rtx last = get_last_bb_insn (b);
2032                           if (last && BARRIER_P (last))
2033                             FOR_EACH_EDGE (e, ei, b->preds)
2034                               if ((e->flags & EDGE_FALLTHRU))
2035                                 emit_barrier_after (BB_END (e->src));
2036                         }
2037                     }
2038                   delete_basic_block (b);
2039                   if (!(mode & CLEANUP_CFGLAYOUT))
2040                     changed = true;
2041                   /* Avoid trying to remove ENTRY_BLOCK_PTR.  */
2042                   b = (c == ENTRY_BLOCK_PTR ? c->next_bb : c);
2043                   continue;
2044                 }
2045
2046               /* Remove code labels no longer used.  */
2047               if (single_pred_p (b)
2048                   && (single_pred_edge (b)->flags & EDGE_FALLTHRU)
2049                   && !(single_pred_edge (b)->flags & EDGE_COMPLEX)
2050                   && LABEL_P (BB_HEAD (b))
2051                   /* If the previous block ends with a branch to this
2052                      block, we can't delete the label.  Normally this
2053                      is a condjump that is yet to be simplified, but
2054                      if CASE_DROPS_THRU, this can be a tablejump with
2055                      some element going to the same place as the
2056                      default (fallthru).  */
2057                   && (single_pred (b) == ENTRY_BLOCK_PTR
2058                       || !JUMP_P (BB_END (single_pred (b)))
2059                       || ! label_is_jump_target_p (BB_HEAD (b),
2060                                                    BB_END (single_pred (b)))))
2061                 {
2062                   rtx label = BB_HEAD (b);
2063
2064                   delete_insn_chain (label, label, false);
2065                   /* If the case label is undeletable, move it after the
2066                      BASIC_BLOCK note.  */
2067                   if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL)
2068                     {
2069                       rtx bb_note = NEXT_INSN (BB_HEAD (b));
2070
2071                       reorder_insns_nobb (label, label, bb_note);
2072                       BB_HEAD (b) = bb_note;
2073                       if (BB_END (b) == bb_note)
2074                         BB_END (b) = label;
2075                     }
2076                   if (dump_file)
2077                     fprintf (dump_file, "Deleted label in block %i.\n",
2078                              b->index);
2079                 }
2080
2081               /* If we fall through an empty block, we can remove it.  */
2082               if (!(mode & CLEANUP_CFGLAYOUT)
2083                   && single_pred_p (b)
2084                   && (single_pred_edge (b)->flags & EDGE_FALLTHRU)
2085                   && !LABEL_P (BB_HEAD (b))
2086                   && FORWARDER_BLOCK_P (b)
2087                   /* Note that forwarder_block_p true ensures that
2088                      there is a successor for this block.  */
2089                   && (single_succ_edge (b)->flags & EDGE_FALLTHRU)
2090                   && n_basic_blocks > NUM_FIXED_BLOCKS + 1)
2091                 {
2092                   if (dump_file)
2093                     fprintf (dump_file,
2094                              "Deleting fallthru block %i.\n",
2095                              b->index);
2096
2097                   c = b->prev_bb == ENTRY_BLOCK_PTR ? b->next_bb : b->prev_bb;
2098                   redirect_edge_succ_nodup (single_pred_edge (b),
2099                                             single_succ (b));
2100                   delete_basic_block (b);
2101                   changed = true;
2102                   b = c;
2103                   continue;
2104                 }
2105
2106               if (single_succ_p (b)
2107                   && (s = single_succ_edge (b))
2108                   && !(s->flags & EDGE_COMPLEX)
2109                   && (c = s->dest) != EXIT_BLOCK_PTR
2110                   && single_pred_p (c)
2111                   && b != c)
2112                 {
2113                   /* When not in cfg_layout mode use code aware of reordering
2114                      INSN.  This code possibly creates new basic blocks so it
2115                      does not fit merge_blocks interface and is kept here in
2116                      hope that it will become useless once more of compiler
2117                      is transformed to use cfg_layout mode.  */
2118
2119                   if ((mode & CLEANUP_CFGLAYOUT)
2120                       && can_merge_blocks_p (b, c))
2121                     {
2122                       merge_blocks (b, c);
2123                       update_forwarder_flag (b);
2124                       changed_here = true;
2125                     }
2126                   else if (!(mode & CLEANUP_CFGLAYOUT)
2127                            /* If the jump insn has side effects,
2128                               we can't kill the edge.  */
2129                            && (!JUMP_P (BB_END (b))
2130                                || (reload_completed
2131                                    ? simplejump_p (BB_END (b))
2132                                    : (onlyjump_p (BB_END (b))
2133                                       && !tablejump_p (BB_END (b),
2134                                                        NULL, NULL))))
2135                            && (next = merge_blocks_move (s, b, c, mode)))
2136                       {
2137                         b = next;
2138                         changed_here = true;
2139                       }
2140                 }
2141
2142               /* Simplify branch over branch.  */
2143               if ((mode & CLEANUP_EXPENSIVE)
2144                    && !(mode & CLEANUP_CFGLAYOUT)
2145                    && try_simplify_condjump (b))
2146                 changed_here = true;
2147
2148               /* If B has a single outgoing edge, but uses a
2149                  non-trivial jump instruction without side-effects, we
2150                  can either delete the jump entirely, or replace it
2151                  with a simple unconditional jump.  */
2152               if (single_succ_p (b)
2153                   && single_succ (b) != EXIT_BLOCK_PTR
2154                   && onlyjump_p (BB_END (b))
2155                   && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX)
2156                   && try_redirect_by_replacing_jump (single_succ_edge (b),
2157                                                      single_succ (b),
2158                                                      (mode & CLEANUP_CFGLAYOUT) != 0))
2159                 {
2160                   update_forwarder_flag (b);
2161                   changed_here = true;
2162                 }
2163
2164               /* Simplify branch to branch.  */
2165               if (try_forward_edges (mode, b))
2166                 changed_here = true;
2167
2168               /* Look for shared code between blocks.  */
2169               if ((mode & CLEANUP_CROSSJUMP)
2170                   && try_crossjump_bb (mode, b))
2171                 changed_here = true;
2172
2173               /* Don't get confused by the index shift caused by
2174                  deleting blocks.  */
2175               if (!changed_here)
2176                 b = b->next_bb;
2177               else
2178                 changed = true;
2179             }
2180
2181           if ((mode & CLEANUP_CROSSJUMP)
2182               && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
2183             changed = true;
2184
2185 #ifdef ENABLE_CHECKING
2186           if (changed)
2187             verify_flow_info ();
2188 #endif
2189
2190           changed_overall |= changed;
2191           first_pass = false;
2192         }
2193       while (changed);
2194     }
2195
2196   FOR_ALL_BB (b)
2197     b->flags &= ~(BB_FORWARDER_BLOCK | BB_NONTHREADABLE_BLOCK);
2198
2199   return changed_overall;
2200 }
2201 \f
2202 /* Delete all unreachable basic blocks.  */
2203
2204 bool
2205 delete_unreachable_blocks (void)
2206 {
2207   bool changed = false;
2208   basic_block b, prev_bb;
2209
2210   find_unreachable_blocks ();
2211
2212   /* When we're in GIMPLE mode and there may be debug insns, we should
2213      delete blocks in reverse dominator order, so as to get a chance
2214      to substitute all released DEFs into debug stmts.  If we don't
2215      have dominators information, walking blocks backward gets us a
2216      better chance of retaining most debug information than
2217      otherwise.  */
2218   if (MAY_HAVE_DEBUG_STMTS && current_ir_type () == IR_GIMPLE
2219       && dom_info_available_p (CDI_DOMINATORS))
2220     {
2221       for (b = EXIT_BLOCK_PTR->prev_bb; b != ENTRY_BLOCK_PTR; b = prev_bb)
2222         {
2223           prev_bb = b->prev_bb;
2224
2225           if (!(b->flags & BB_REACHABLE))
2226             {
2227               /* Speed up the removal of blocks that don't dominate
2228                  others.  Walking backwards, this should be the common
2229                  case.  */
2230               if (!first_dom_son (CDI_DOMINATORS, b))
2231                 delete_basic_block (b);
2232               else
2233                 {
2234                   VEC (basic_block, heap) *h
2235                     = get_all_dominated_blocks (CDI_DOMINATORS, b);
2236
2237                   while (VEC_length (basic_block, h))
2238                     {
2239                       b = VEC_pop (basic_block, h);
2240
2241                       prev_bb = b->prev_bb;
2242
2243                       gcc_assert (!(b->flags & BB_REACHABLE));
2244
2245                       delete_basic_block (b);
2246                     }
2247
2248                   VEC_free (basic_block, heap, h);
2249                 }
2250
2251               changed = true;
2252             }
2253         }
2254     }
2255   else
2256     {
2257       for (b = EXIT_BLOCK_PTR->prev_bb; b != ENTRY_BLOCK_PTR; b = prev_bb)
2258         {
2259           prev_bb = b->prev_bb;
2260
2261           if (!(b->flags & BB_REACHABLE))
2262             {
2263               delete_basic_block (b);
2264               changed = true;
2265             }
2266         }
2267     }
2268
2269   if (changed)
2270     tidy_fallthru_edges ();
2271   return changed;
2272 }
2273
2274 /* Delete any jump tables never referenced.  We can't delete them at the
2275    time of removing tablejump insn as they are referenced by the preceding
2276    insns computing the destination, so we delay deleting and garbagecollect
2277    them once life information is computed.  */
2278 void
2279 delete_dead_jumptables (void)
2280 {
2281   basic_block bb;
2282
2283   /* A dead jump table does not belong to any basic block.  Scan insns
2284      between two adjacent basic blocks.  */
2285   FOR_EACH_BB (bb)
2286     {
2287       rtx insn, next;
2288
2289       for (insn = NEXT_INSN (BB_END (bb));
2290            insn && !NOTE_INSN_BASIC_BLOCK_P (insn);
2291            insn = next)
2292         {
2293           next = NEXT_INSN (insn);
2294           if (LABEL_P (insn)
2295               && LABEL_NUSES (insn) == LABEL_PRESERVE_P (insn)
2296               && JUMP_TABLE_DATA_P (next))
2297             {
2298               rtx label = insn, jump = next;
2299
2300               if (dump_file)
2301                 fprintf (dump_file, "Dead jumptable %i removed\n",
2302                          INSN_UID (insn));
2303
2304               next = NEXT_INSN (next);
2305               delete_insn (jump);
2306               delete_insn (label);
2307             }
2308         }
2309     }
2310 }
2311
2312 \f
2313 /* Tidy the CFG by deleting unreachable code and whatnot.  */
2314
2315 bool
2316 cleanup_cfg (int mode)
2317 {
2318   bool changed = false;
2319
2320   /* Set the cfglayout mode flag here.  We could update all the callers
2321      but that is just inconvenient, especially given that we eventually
2322      want to have cfglayout mode as the default.  */
2323   if (current_ir_type () == IR_RTL_CFGLAYOUT)
2324     mode |= CLEANUP_CFGLAYOUT;
2325
2326   timevar_push (TV_CLEANUP_CFG);
2327   if (delete_unreachable_blocks ())
2328     {
2329       changed = true;
2330       /* We've possibly created trivially dead code.  Cleanup it right
2331          now to introduce more opportunities for try_optimize_cfg.  */
2332       if (!(mode & (CLEANUP_NO_INSN_DEL))
2333           && !reload_completed)
2334         delete_trivially_dead_insns (get_insns (), max_reg_num ());
2335     }
2336
2337   compact_blocks ();
2338
2339   /* To tail-merge blocks ending in the same noreturn function (e.g.
2340      a call to abort) we have to insert fake edges to exit.  Do this
2341      here once.  The fake edges do not interfere with any other CFG
2342      cleanups.  */
2343   if (mode & CLEANUP_CROSSJUMP)
2344     add_noreturn_fake_exit_edges ();
2345
2346   if (!dbg_cnt (cfg_cleanup))
2347     return changed;
2348
2349   while (try_optimize_cfg (mode))
2350     {
2351       delete_unreachable_blocks (), changed = true;
2352       if (!(mode & CLEANUP_NO_INSN_DEL))
2353         {
2354           /* Try to remove some trivially dead insns when doing an expensive
2355              cleanup.  But delete_trivially_dead_insns doesn't work after
2356              reload (it only handles pseudos) and run_fast_dce is too costly
2357              to run in every iteration.
2358
2359              For effective cross jumping, we really want to run a fast DCE to
2360              clean up any dead conditions, or they get in the way of performing
2361              useful tail merges.
2362
2363              Other transformations in cleanup_cfg are not so sensitive to dead
2364              code, so delete_trivially_dead_insns or even doing nothing at all
2365              is good enough.  */
2366           if ((mode & CLEANUP_EXPENSIVE) && !reload_completed
2367               && !delete_trivially_dead_insns (get_insns (), max_reg_num ()))
2368             break;
2369           else if ((mode & CLEANUP_CROSSJUMP)
2370                    && crossjumps_occured)
2371             run_fast_dce ();
2372         }
2373       else
2374         break;
2375     }
2376
2377   if (mode & CLEANUP_CROSSJUMP)
2378     remove_fake_exit_edges ();
2379
2380   /* Don't call delete_dead_jumptables in cfglayout mode, because
2381      that function assumes that jump tables are in the insns stream.
2382      But we also don't _have_ to delete dead jumptables in cfglayout
2383      mode because we shouldn't even be looking at things that are
2384      not in a basic block.  Dead jumptables are cleaned up when
2385      going out of cfglayout mode.  */
2386   if (!(mode & CLEANUP_CFGLAYOUT))
2387     delete_dead_jumptables ();
2388
2389   timevar_pop (TV_CLEANUP_CFG);
2390
2391   return changed;
2392 }
2393 \f
2394 static unsigned int
2395 rest_of_handle_jump (void)
2396 {
2397   if (crtl->tail_call_emit)
2398     fixup_tail_calls ();
2399   return 0;
2400 }
2401
2402 struct rtl_opt_pass pass_jump =
2403 {
2404  {
2405   RTL_PASS,
2406   "sibling",                            /* name */
2407   NULL,                                 /* gate */
2408   rest_of_handle_jump,                  /* execute */
2409   NULL,                                 /* sub */
2410   NULL,                                 /* next */
2411   0,                                    /* static_pass_number */
2412   TV_JUMP,                              /* tv_id */
2413   0,                                    /* properties_required */
2414   0,                                    /* properties_provided */
2415   0,                                    /* properties_destroyed */
2416   TODO_ggc_collect,                     /* todo_flags_start */
2417   TODO_verify_flow,                     /* todo_flags_finish */
2418  }
2419 };
2420
2421
2422 static unsigned int
2423 rest_of_handle_jump2 (void)
2424 {
2425   delete_trivially_dead_insns (get_insns (), max_reg_num ());
2426   if (dump_file)
2427     dump_flow_info (dump_file, dump_flags);
2428   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
2429                | (flag_thread_jumps ? CLEANUP_THREADING : 0));
2430   return 0;
2431 }
2432
2433
2434 struct rtl_opt_pass pass_jump2 =
2435 {
2436  {
2437   RTL_PASS,
2438   "jump",                               /* name */
2439   NULL,                                 /* gate */
2440   rest_of_handle_jump2,                 /* execute */
2441   NULL,                                 /* sub */
2442   NULL,                                 /* next */
2443   0,                                    /* static_pass_number */
2444   TV_JUMP,                              /* tv_id */
2445   0,                                    /* properties_required */
2446   0,                                    /* properties_provided */
2447   0,                                    /* properties_destroyed */
2448   TODO_ggc_collect,                     /* todo_flags_start */
2449   TODO_dump_func | TODO_verify_rtl_sharing,/* todo_flags_finish */
2450  }
2451 };
2452
2453