OSDN Git Service

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