OSDN Git Service

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