OSDN Git Service

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