OSDN Git Service

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