OSDN Git Service

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