OSDN Git Service

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