OSDN Git Service

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