OSDN Git Service

PR c++/51662
[pf3gnuchains/gcc-fork.git] / gcc / cfgcleanup.c
1 /* Control flow optimization code for GNU compiler.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This file contains optimizer of the control flow.  The main entry point is
23    cleanup_cfg.  Following optimizations are performed:
24
25    - Unreachable blocks removal
26    - Edge forwarding (edge to the forwarder block is forwarded to its
27      successor.  Simplification of the branch instruction is performed by
28      underlying infrastructure so branch can be converted to simplejump or
29      eliminated).
30    - Cross jumping (tail merging)
31    - Conditional jump-around-simplejump simplification
32    - Basic block merging.  */
33
34 #include "config.h"
35 #include "system.h"
36 #include "coretypes.h"
37 #include "tm.h"
38 #include "rtl.h"
39 #include "hard-reg-set.h"
40 #include "regs.h"
41 #include "timevar.h"
42 #include "output.h"
43 #include "insn-config.h"
44 #include "flags.h"
45 #include "recog.h"
46 #include "diagnostic-core.h"
47 #include "cselib.h"
48 #include "params.h"
49 #include "tm_p.h"
50 #include "target.h"
51 #include "cfglayout.h"
52 #include "emit-rtl.h"
53 #include "tree-pass.h"
54 #include "cfgloop.h"
55 #include "expr.h"
56 #include "df.h"
57 #include "dce.h"
58 #include "dbgcnt.h"
59
60 #define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK)
61
62 /* Set to true when we are running first pass of try_optimize_cfg loop.  */
63 static bool first_pass;
64
65 /* Set to true if crossjumps occured in the latest run of try_optimize_cfg.  */
66 static bool crossjumps_occured;
67
68 /* Set to true if we couldn't run an optimization due to stale liveness
69    information; we should run df_analyze to enable more opportunities.  */
70 static bool block_was_dirty;
71
72 static bool try_crossjump_to_edge (int, edge, edge);
73 static bool try_crossjump_bb (int, basic_block);
74 static bool outgoing_edges_match (int, basic_block, basic_block);
75 static bool old_insns_match_p (int, rtx, rtx);
76
77 static void merge_blocks_move_predecessor_nojumps (basic_block, basic_block);
78 static void merge_blocks_move_successor_nojumps (basic_block, basic_block);
79 static bool try_optimize_cfg (int);
80 static bool try_simplify_condjump (basic_block);
81 static bool try_forward_edges (int, basic_block);
82 static edge thread_jump (edge, basic_block);
83 static bool mark_effect (rtx, bitmap);
84 static void notice_new_block (basic_block);
85 static void update_forwarder_flag (basic_block);
86 static int mentions_nonequal_regs (rtx *, void *);
87 static void merge_memattrs (rtx, rtx);
88 \f
89 /* Set flags for newly created block.  */
90
91 static void
92 notice_new_block (basic_block bb)
93 {
94   if (!bb)
95     return;
96
97   if (forwarder_block_p (bb))
98     bb->flags |= BB_FORWARDER_BLOCK;
99 }
100
101 /* Recompute forwarder flag after block has been modified.  */
102
103 static void
104 update_forwarder_flag (basic_block bb)
105 {
106   if (forwarder_block_p (bb))
107     bb->flags |= BB_FORWARDER_BLOCK;
108   else
109     bb->flags &= ~BB_FORWARDER_BLOCK;
110 }
111 \f
112 /* Simplify a conditional jump around an unconditional jump.
113    Return true if something changed.  */
114
115 static bool
116 try_simplify_condjump (basic_block cbranch_block)
117 {
118   basic_block jump_block, jump_dest_block, cbranch_dest_block;
119   edge cbranch_jump_edge, cbranch_fallthru_edge;
120   rtx cbranch_insn;
121
122   /* Verify that there are exactly two successors.  */
123   if (EDGE_COUNT (cbranch_block->succs) != 2)
124     return false;
125
126   /* Verify that we've got a normal conditional branch at the end
127      of the block.  */
128   cbranch_insn = BB_END (cbranch_block);
129   if (!any_condjump_p (cbranch_insn))
130     return false;
131
132   cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block);
133   cbranch_jump_edge = BRANCH_EDGE (cbranch_block);
134
135   /* The next block must not have multiple predecessors, must not
136      be the last block in the function, and must contain just the
137      unconditional jump.  */
138   jump_block = cbranch_fallthru_edge->dest;
139   if (!single_pred_p (jump_block)
140       || jump_block->next_bb == EXIT_BLOCK_PTR
141       || !FORWARDER_BLOCK_P (jump_block))
142     return false;
143   jump_dest_block = single_succ (jump_block);
144
145   /* If we are partitioning hot/cold basic blocks, we don't want to
146      mess up unconditional or indirect jumps that cross between hot
147      and cold sections.
148
149      Basic block partitioning may result in some jumps that appear to
150      be optimizable (or blocks that appear to be mergeable), but which really
151      must be left untouched (they are required to make it safely across
152      partition boundaries).  See the comments at the top of
153      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
154
155   if (BB_PARTITION (jump_block) != BB_PARTITION (jump_dest_block)
156       || (cbranch_jump_edge->flags & EDGE_CROSSING))
157     return false;
158
159   /* The conditional branch must target the block after the
160      unconditional branch.  */
161   cbranch_dest_block = cbranch_jump_edge->dest;
162
163   if (cbranch_dest_block == EXIT_BLOCK_PTR
164       || !can_fallthru (jump_block, cbranch_dest_block))
165     return false;
166
167   /* Invert the conditional branch.  */
168   if (!invert_jump (cbranch_insn, block_label (jump_dest_block), 0))
169     return false;
170
171   if (dump_file)
172     fprintf (dump_file, "Simplifying condjump %i around jump %i\n",
173              INSN_UID (cbranch_insn), INSN_UID (BB_END (jump_block)));
174
175   /* Success.  Update the CFG to match.  Note that after this point
176      the edge variable names appear backwards; the redirection is done
177      this way to preserve edge profile data.  */
178   cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge,
179                                                 cbranch_dest_block);
180   cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge,
181                                                     jump_dest_block);
182   cbranch_jump_edge->flags |= EDGE_FALLTHRU;
183   cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
184   update_br_prob_note (cbranch_block);
185
186   /* Delete the block with the unconditional jump, and clean up the mess.  */
187   delete_basic_block (jump_block);
188   tidy_fallthru_edge (cbranch_jump_edge);
189   update_forwarder_flag (cbranch_block);
190
191   return true;
192 }
193 \f
194 /* Attempt to prove that operation is NOOP using CSElib or mark the effect
195    on register.  Used by jump threading.  */
196
197 static bool
198 mark_effect (rtx exp, regset nonequal)
199 {
200   int regno;
201   rtx dest;
202   switch (GET_CODE (exp))
203     {
204       /* In case we do clobber the register, mark it as equal, as we know the
205          value is dead so it don't have to match.  */
206     case CLOBBER:
207       if (REG_P (XEXP (exp, 0)))
208         {
209           dest = XEXP (exp, 0);
210           regno = REGNO (dest);
211           CLEAR_REGNO_REG_SET (nonequal, regno);
212           if (regno < FIRST_PSEUDO_REGISTER)
213             {
214               int n = hard_regno_nregs[regno][GET_MODE (dest)];
215               while (--n > 0)
216                 CLEAR_REGNO_REG_SET (nonequal, regno + n);
217             }
218         }
219       return false;
220
221     case SET:
222       if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp)))
223         return false;
224       dest = SET_DEST (exp);
225       if (dest == pc_rtx)
226         return false;
227       if (!REG_P (dest))
228         return true;
229       regno = REGNO (dest);
230       SET_REGNO_REG_SET (nonequal, regno);
231       if (regno < FIRST_PSEUDO_REGISTER)
232         {
233           int n = hard_regno_nregs[regno][GET_MODE (dest)];
234           while (--n > 0)
235             SET_REGNO_REG_SET (nonequal, regno + n);
236         }
237       return false;
238
239     default:
240       return false;
241     }
242 }
243
244 /* Return nonzero if X is a register set in regset DATA.
245    Called via for_each_rtx.  */
246 static int
247 mentions_nonequal_regs (rtx *x, void *data)
248 {
249   regset nonequal = (regset) data;
250   if (REG_P (*x))
251     {
252       int regno;
253
254       regno = REGNO (*x);
255       if (REGNO_REG_SET_P (nonequal, regno))
256         return 1;
257       if (regno < FIRST_PSEUDO_REGISTER)
258         {
259           int n = hard_regno_nregs[regno][GET_MODE (*x)];
260           while (--n > 0)
261             if (REGNO_REG_SET_P (nonequal, regno + n))
262               return 1;
263         }
264     }
265   return 0;
266 }
267 /* Attempt to prove that the basic block B will have no side effects and
268    always continues in the same edge if reached via E.  Return the edge
269    if exist, NULL otherwise.  */
270
271 static edge
272 thread_jump (edge e, basic_block b)
273 {
274   rtx set1, set2, cond1, cond2, insn;
275   enum rtx_code code1, code2, reversed_code2;
276   bool reverse1 = false;
277   unsigned i;
278   regset nonequal;
279   bool failed = false;
280   reg_set_iterator rsi;
281
282   if (b->flags & BB_NONTHREADABLE_BLOCK)
283     return NULL;
284
285   /* At the moment, we do handle only conditional jumps, but later we may
286      want to extend this code to tablejumps and others.  */
287   if (EDGE_COUNT (e->src->succs) != 2)
288     return NULL;
289   if (EDGE_COUNT (b->succs) != 2)
290     {
291       b->flags |= BB_NONTHREADABLE_BLOCK;
292       return NULL;
293     }
294
295   /* Second branch must end with onlyjump, as we will eliminate the jump.  */
296   if (!any_condjump_p (BB_END (e->src)))
297     return NULL;
298
299   if (!any_condjump_p (BB_END (b)) || !onlyjump_p (BB_END (b)))
300     {
301       b->flags |= BB_NONTHREADABLE_BLOCK;
302       return NULL;
303     }
304
305   set1 = pc_set (BB_END (e->src));
306   set2 = pc_set (BB_END (b));
307   if (((e->flags & EDGE_FALLTHRU) != 0)
308       != (XEXP (SET_SRC (set1), 1) == pc_rtx))
309     reverse1 = true;
310
311   cond1 = XEXP (SET_SRC (set1), 0);
312   cond2 = XEXP (SET_SRC (set2), 0);
313   if (reverse1)
314     code1 = reversed_comparison_code (cond1, BB_END (e->src));
315   else
316     code1 = GET_CODE (cond1);
317
318   code2 = GET_CODE (cond2);
319   reversed_code2 = reversed_comparison_code (cond2, BB_END (b));
320
321   if (!comparison_dominates_p (code1, code2)
322       && !comparison_dominates_p (code1, reversed_code2))
323     return NULL;
324
325   /* Ensure that the comparison operators are equivalent.
326      ??? This is far too pessimistic.  We should allow swapped operands,
327      different CCmodes, or for example comparisons for interval, that
328      dominate even when operands are not equivalent.  */
329   if (!rtx_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
330       || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
331     return NULL;
332
333   /* Short circuit cases where block B contains some side effects, as we can't
334      safely bypass it.  */
335   for (insn = NEXT_INSN (BB_HEAD (b)); insn != NEXT_INSN (BB_END (b));
336        insn = NEXT_INSN (insn))
337     if (INSN_P (insn) && side_effects_p (PATTERN (insn)))
338       {
339         b->flags |= BB_NONTHREADABLE_BLOCK;
340         return NULL;
341       }
342
343   cselib_init (0);
344
345   /* First process all values computed in the source basic block.  */
346   for (insn = NEXT_INSN (BB_HEAD (e->src));
347        insn != NEXT_INSN (BB_END (e->src));
348        insn = NEXT_INSN (insn))
349     if (INSN_P (insn))
350       cselib_process_insn (insn);
351
352   nonequal = BITMAP_ALLOC (NULL);
353   CLEAR_REG_SET (nonequal);
354
355   /* Now assume that we've continued by the edge E to B and continue
356      processing as if it were same basic block.
357      Our goal is to prove that whole block is an NOOP.  */
358
359   for (insn = NEXT_INSN (BB_HEAD (b));
360        insn != NEXT_INSN (BB_END (b)) && !failed;
361        insn = NEXT_INSN (insn))
362     {
363       if (INSN_P (insn))
364         {
365           rtx pat = PATTERN (insn);
366
367           if (GET_CODE (pat) == PARALLEL)
368             {
369               for (i = 0; i < (unsigned)XVECLEN (pat, 0); i++)
370                 failed |= mark_effect (XVECEXP (pat, 0, i), nonequal);
371             }
372           else
373             failed |= mark_effect (pat, nonequal);
374         }
375
376       cselib_process_insn (insn);
377     }
378
379   /* Later we should clear nonequal of dead registers.  So far we don't
380      have life information in cfg_cleanup.  */
381   if (failed)
382     {
383       b->flags |= BB_NONTHREADABLE_BLOCK;
384       goto failed_exit;
385     }
386
387   /* cond2 must not mention any register that is not equal to the
388      former block.  */
389   if (for_each_rtx (&cond2, mentions_nonequal_regs, nonequal))
390     goto failed_exit;
391
392   EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi)
393     goto failed_exit;
394
395   BITMAP_FREE (nonequal);
396   cselib_finish ();
397   if ((comparison_dominates_p (code1, code2) != 0)
398       != (XEXP (SET_SRC (set2), 1) == pc_rtx))
399     return BRANCH_EDGE (b);
400   else
401     return FALLTHRU_EDGE (b);
402
403 failed_exit:
404   BITMAP_FREE (nonequal);
405   cselib_finish ();
406   return NULL;
407 }
408 \f
409 /* Attempt to forward edges leaving basic block B.
410    Return true if successful.  */
411
412 static bool
413 try_forward_edges (int mode, basic_block b)
414 {
415   bool changed = false;
416   edge_iterator ei;
417   edge e, *threaded_edges = NULL;
418
419   /* If we are partitioning hot/cold basic blocks, we don't want to
420      mess up unconditional or indirect jumps that cross between hot
421      and cold sections.
422
423      Basic block partitioning may result in some jumps that appear to
424      be optimizable (or blocks that appear to be mergeable), but which really
425      must be left untouched (they are required to make it safely across
426      partition boundaries).  See the comments at the top of
427      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
428
429   if (find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
430     return false;
431
432   for (ei = ei_start (b->succs); (e = ei_safe_edge (ei)); )
433     {
434       basic_block target, first;
435       int counter, goto_locus;
436       bool threaded = false;
437       int nthreaded_edges = 0;
438       bool may_thread = first_pass || (b->flags & BB_MODIFIED) != 0;
439
440       /* Skip complex edges because we don't know how to update them.
441
442          Still handle fallthru edges, as we can succeed to forward fallthru
443          edge to the same place as the branch edge of conditional branch
444          and turn conditional branch to an unconditional branch.  */
445       if (e->flags & EDGE_COMPLEX)
446         {
447           ei_next (&ei);
448           continue;
449         }
450
451       target = first = e->dest;
452       counter = NUM_FIXED_BLOCKS;
453       goto_locus = e->goto_locus;
454
455       /* If we are partitioning hot/cold basic_blocks, we don't want to mess
456          up jumps that cross between hot/cold sections.
457
458          Basic block partitioning may result in some jumps that appear
459          to be optimizable (or blocks that appear to be mergeable), but which
460          really must be left untouched (they are required to make it safely
461          across partition boundaries).  See the comments at the top of
462          bb-reorder.c:partition_hot_cold_basic_blocks for complete
463          details.  */
464
465       if (first != EXIT_BLOCK_PTR
466           && find_reg_note (BB_END (first), REG_CROSSING_JUMP, NULL_RTX))
467         return false;
468
469       while (counter < n_basic_blocks)
470         {
471           basic_block new_target = NULL;
472           bool new_target_threaded = false;
473           may_thread |= (target->flags & BB_MODIFIED) != 0;
474
475           if (FORWARDER_BLOCK_P (target)
476               && !(single_succ_edge (target)->flags & EDGE_CROSSING)
477               && single_succ (target) != EXIT_BLOCK_PTR)
478             {
479               /* Bypass trivial infinite loops.  */
480               new_target = single_succ (target);
481               if (target == new_target)
482                 counter = n_basic_blocks;
483               else if (!optimize)
484                 {
485                   /* When not optimizing, ensure that edges or forwarder
486                      blocks with different locus are not optimized out.  */
487                   int new_locus = single_succ_edge (target)->goto_locus;
488                   int locus = goto_locus;
489
490                   if (new_locus && locus && !locator_eq (new_locus, locus))
491                     new_target = NULL;
492                   else
493                     {
494                       rtx last;
495
496                       if (new_locus)
497                         locus = new_locus;
498
499                       last = BB_END (target);
500                       if (DEBUG_INSN_P (last))
501                         last = prev_nondebug_insn (last);
502
503                       new_locus = last && INSN_P (last)
504                                   ? INSN_LOCATOR (last) : 0;
505
506                       if (new_locus && locus && !locator_eq (new_locus, locus))
507                         new_target = NULL;
508                       else
509                         {
510                           if (new_locus)
511                             locus = new_locus;
512
513                           goto_locus = locus;
514                         }
515                     }
516                 }
517             }
518
519           /* Allow to thread only over one edge at time to simplify updating
520              of probabilities.  */
521           else if ((mode & CLEANUP_THREADING) && may_thread)
522             {
523               edge t = thread_jump (e, target);
524               if (t)
525                 {
526                   if (!threaded_edges)
527                     threaded_edges = XNEWVEC (edge, n_basic_blocks);
528                   else
529                     {
530                       int i;
531
532                       /* Detect an infinite loop across blocks not
533                          including the start block.  */
534                       for (i = 0; i < nthreaded_edges; ++i)
535                         if (threaded_edges[i] == t)
536                           break;
537                       if (i < nthreaded_edges)
538                         {
539                           counter = n_basic_blocks;
540                           break;
541                         }
542                     }
543
544                   /* Detect an infinite loop across the start block.  */
545                   if (t->dest == b)
546                     break;
547
548                   gcc_assert (nthreaded_edges < n_basic_blocks - NUM_FIXED_BLOCKS);
549                   threaded_edges[nthreaded_edges++] = t;
550
551                   new_target = t->dest;
552                   new_target_threaded = true;
553                 }
554             }
555
556           if (!new_target)
557             break;
558
559           counter++;
560           target = new_target;
561           threaded |= new_target_threaded;
562         }
563
564       if (counter >= n_basic_blocks)
565         {
566           if (dump_file)
567             fprintf (dump_file, "Infinite loop in BB %i.\n",
568                      target->index);
569         }
570       else if (target == first)
571         ; /* We didn't do anything.  */
572       else
573         {
574           /* Save the values now, as the edge may get removed.  */
575           gcov_type edge_count = e->count;
576           int edge_probability = e->probability;
577           int edge_frequency;
578           int n = 0;
579
580           e->goto_locus = goto_locus;
581
582           /* Don't force if target is exit block.  */
583           if (threaded && target != EXIT_BLOCK_PTR)
584             {
585               notice_new_block (redirect_edge_and_branch_force (e, target));
586               if (dump_file)
587                 fprintf (dump_file, "Conditionals threaded.\n");
588             }
589           else if (!redirect_edge_and_branch (e, target))
590             {
591               if (dump_file)
592                 fprintf (dump_file,
593                          "Forwarding edge %i->%i to %i failed.\n",
594                          b->index, e->dest->index, target->index);
595               ei_next (&ei);
596               continue;
597             }
598
599           /* We successfully forwarded the edge.  Now update profile
600              data: for each edge we traversed in the chain, remove
601              the original edge's execution count.  */
602           edge_frequency = ((edge_probability * b->frequency
603                              + REG_BR_PROB_BASE / 2)
604                             / REG_BR_PROB_BASE);
605
606           if (!FORWARDER_BLOCK_P (b) && forwarder_block_p (b))
607             b->flags |= BB_FORWARDER_BLOCK;
608
609           do
610             {
611               edge t;
612
613               if (!single_succ_p (first))
614                 {
615                   gcc_assert (n < nthreaded_edges);
616                   t = threaded_edges [n++];
617                   gcc_assert (t->src == first);
618                   update_bb_profile_for_threading (first, edge_frequency,
619                                                    edge_count, t);
620                   update_br_prob_note (first);
621                 }
622               else
623                 {
624                   first->count -= edge_count;
625                   if (first->count < 0)
626                     first->count = 0;
627                   first->frequency -= edge_frequency;
628                   if (first->frequency < 0)
629                     first->frequency = 0;
630                   /* It is possible that as the result of
631                      threading we've removed edge as it is
632                      threaded to the fallthru edge.  Avoid
633                      getting out of sync.  */
634                   if (n < nthreaded_edges
635                       && first == threaded_edges [n]->src)
636                     n++;
637                   t = single_succ_edge (first);
638                 }
639
640               t->count -= edge_count;
641               if (t->count < 0)
642                 t->count = 0;
643               first = t->dest;
644             }
645           while (first != target);
646
647           changed = true;
648           continue;
649         }
650       ei_next (&ei);
651     }
652
653   if (threaded_edges)
654     free (threaded_edges);
655   return changed;
656 }
657 \f
658
659 /* Blocks A and B are to be merged into a single block.  A has no incoming
660    fallthru edge, so it can be moved before B without adding or modifying
661    any jumps (aside from the jump from A to B).  */
662
663 static void
664 merge_blocks_move_predecessor_nojumps (basic_block a, basic_block b)
665 {
666   rtx barrier;
667
668   /* If we are partitioning hot/cold basic blocks, we don't want to
669      mess up unconditional or indirect jumps that cross between hot
670      and cold sections.
671
672      Basic block partitioning may result in some jumps that appear to
673      be optimizable (or blocks that appear to be mergeable), but which really
674      must be left untouched (they are required to make it safely across
675      partition boundaries).  See the comments at the top of
676      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
677
678   if (BB_PARTITION (a) != BB_PARTITION (b))
679     return;
680
681   barrier = next_nonnote_insn (BB_END (a));
682   gcc_assert (BARRIER_P (barrier));
683   delete_insn (barrier);
684
685   /* Scramble the insn chain.  */
686   if (BB_END (a) != PREV_INSN (BB_HEAD (b)))
687     reorder_insns_nobb (BB_HEAD (a), BB_END (a), PREV_INSN (BB_HEAD (b)));
688   df_set_bb_dirty (a);
689
690   if (dump_file)
691     fprintf (dump_file, "Moved block %d before %d and merged.\n",
692              a->index, b->index);
693
694   /* Swap the records for the two blocks around.  */
695
696   unlink_block (a);
697   link_block (a, b->prev_bb);
698
699   /* Now blocks A and B are contiguous.  Merge them.  */
700   merge_blocks (a, b);
701 }
702
703 /* Blocks A and B are to be merged into a single block.  B has no outgoing
704    fallthru edge, so it can be moved after A without adding or modifying
705    any jumps (aside from the jump from A to B).  */
706
707 static void
708 merge_blocks_move_successor_nojumps (basic_block a, basic_block b)
709 {
710   rtx barrier, real_b_end;
711   rtx label, table;
712
713   /* If we are partitioning hot/cold basic blocks, we don't want to
714      mess up unconditional or indirect jumps that cross between hot
715      and cold sections.
716
717      Basic block partitioning may result in some jumps that appear to
718      be optimizable (or blocks that appear to be mergeable), but which really
719      must be left untouched (they are required to make it safely across
720      partition boundaries).  See the comments at the top of
721      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
722
723   if (BB_PARTITION (a) != BB_PARTITION (b))
724     return;
725
726   real_b_end = BB_END (b);
727
728   /* If there is a jump table following block B temporarily add the jump table
729      to block B so that it will also be moved to the correct location.  */
730   if (tablejump_p (BB_END (b), &label, &table)
731       && prev_active_insn (label) == BB_END (b))
732     {
733       BB_END (b) = table;
734     }
735
736   /* There had better have been a barrier there.  Delete it.  */
737   barrier = NEXT_INSN (BB_END (b));
738   if (barrier && BARRIER_P (barrier))
739     delete_insn (barrier);
740
741
742   /* Scramble the insn chain.  */
743   reorder_insns_nobb (BB_HEAD (b), BB_END (b), BB_END (a));
744
745   /* Restore the real end of b.  */
746   BB_END (b) = real_b_end;
747
748   if (dump_file)
749     fprintf (dump_file, "Moved block %d after %d and merged.\n",
750              b->index, a->index);
751
752   /* Now blocks A and B are contiguous.  Merge them.  */
753   merge_blocks (a, b);
754 }
755
756 /* Attempt to merge basic blocks that are potentially non-adjacent.
757    Return NULL iff the attempt failed, otherwise return basic block
758    where cleanup_cfg should continue.  Because the merging commonly
759    moves basic block away or introduces another optimization
760    possibility, return basic block just before B so cleanup_cfg don't
761    need to iterate.
762
763    It may be good idea to return basic block before C in the case
764    C has been moved after B and originally appeared earlier in the
765    insn sequence, but we have no information available about the
766    relative ordering of these two.  Hopefully it is not too common.  */
767
768 static basic_block
769 merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
770 {
771   basic_block next;
772
773   /* If we are partitioning hot/cold basic blocks, we don't want to
774      mess up unconditional or indirect jumps that cross between hot
775      and cold sections.
776
777      Basic block partitioning may result in some jumps that appear to
778      be optimizable (or blocks that appear to be mergeable), but which really
779      must be left untouched (they are required to make it safely across
780      partition boundaries).  See the comments at the top of
781      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
782
783   if (BB_PARTITION (b) != BB_PARTITION (c))
784     return NULL;
785
786   /* If B has a fallthru edge to C, no need to move anything.  */
787   if (e->flags & EDGE_FALLTHRU)
788     {
789       int b_index = b->index, c_index = c->index;
790       merge_blocks (b, c);
791       update_forwarder_flag (b);
792
793       if (dump_file)
794         fprintf (dump_file, "Merged %d and %d without moving.\n",
795                  b_index, c_index);
796
797       return b->prev_bb == ENTRY_BLOCK_PTR ? b : b->prev_bb;
798     }
799
800   /* Otherwise we will need to move code around.  Do that only if expensive
801      transformations are allowed.  */
802   else if (mode & CLEANUP_EXPENSIVE)
803     {
804       edge tmp_edge, b_fallthru_edge;
805       bool c_has_outgoing_fallthru;
806       bool b_has_incoming_fallthru;
807
808       /* Avoid overactive code motion, as the forwarder blocks should be
809          eliminated by edge redirection instead.  One exception might have
810          been if B is a forwarder block and C has no fallthru edge, but
811          that should be cleaned up by bb-reorder instead.  */
812       if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
813         return NULL;
814
815       /* We must make sure to not munge nesting of lexical blocks,
816          and loop notes.  This is done by squeezing out all the notes
817          and leaving them there to lie.  Not ideal, but functional.  */
818
819       tmp_edge = find_fallthru_edge (c->succs);
820       c_has_outgoing_fallthru = (tmp_edge != NULL);
821
822       tmp_edge = find_fallthru_edge (b->preds);
823       b_has_incoming_fallthru = (tmp_edge != NULL);
824       b_fallthru_edge = tmp_edge;
825       next = b->prev_bb;
826       if (next == c)
827         next = next->prev_bb;
828
829       /* Otherwise, we're going to try to move C after B.  If C does
830          not have an outgoing fallthru, then it can be moved
831          immediately after B without introducing or modifying jumps.  */
832       if (! c_has_outgoing_fallthru)
833         {
834           merge_blocks_move_successor_nojumps (b, c);
835           return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
836         }
837
838       /* If B does not have an incoming fallthru, then it can be moved
839          immediately before C without introducing or modifying jumps.
840          C cannot be the first block, so we do not have to worry about
841          accessing a non-existent block.  */
842
843       if (b_has_incoming_fallthru)
844         {
845           basic_block bb;
846
847           if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
848             return NULL;
849           bb = force_nonfallthru (b_fallthru_edge);
850           if (bb)
851             notice_new_block (bb);
852         }
853
854       merge_blocks_move_predecessor_nojumps (b, c);
855       return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
856     }
857
858   return NULL;
859 }
860 \f
861
862 /* Removes the memory attributes of MEM expression
863    if they are not equal.  */
864
865 void
866 merge_memattrs (rtx x, rtx y)
867 {
868   int i;
869   int j;
870   enum rtx_code code;
871   const char *fmt;
872
873   if (x == y)
874     return;
875   if (x == 0 || y == 0)
876     return;
877
878   code = GET_CODE (x);
879
880   if (code != GET_CODE (y))
881     return;
882
883   if (GET_MODE (x) != GET_MODE (y))
884     return;
885
886   if (code == MEM && MEM_ATTRS (x) != MEM_ATTRS (y))
887     {
888       if (! MEM_ATTRS (x))
889         MEM_ATTRS (y) = 0;
890       else if (! MEM_ATTRS (y))
891         MEM_ATTRS (x) = 0;
892       else
893         {
894           rtx mem_size;
895
896           if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y))
897             {
898               set_mem_alias_set (x, 0);
899               set_mem_alias_set (y, 0);
900             }
901
902           if (! mem_expr_equal_p (MEM_EXPR (x), MEM_EXPR (y)))
903             {
904               set_mem_expr (x, 0);
905               set_mem_expr (y, 0);
906               set_mem_offset (x, 0);
907               set_mem_offset (y, 0);
908             }
909           else if (MEM_OFFSET (x) != MEM_OFFSET (y))
910             {
911               set_mem_offset (x, 0);
912               set_mem_offset (y, 0);
913             }
914
915           if (!MEM_SIZE (x))
916             mem_size = NULL_RTX;
917           else if (!MEM_SIZE (y))
918             mem_size = NULL_RTX;
919           else
920             mem_size = GEN_INT (MAX (INTVAL (MEM_SIZE (x)),
921                                      INTVAL (MEM_SIZE (y))));
922           set_mem_size (x, mem_size);
923           set_mem_size (y, mem_size);
924
925           set_mem_align (x, MIN (MEM_ALIGN (x), MEM_ALIGN (y)));
926           set_mem_align (y, MEM_ALIGN (x));
927         }
928     }
929
930   fmt = GET_RTX_FORMAT (code);
931   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
932     {
933       switch (fmt[i])
934         {
935         case 'E':
936           /* Two vectors must have the same length.  */
937           if (XVECLEN (x, i) != XVECLEN (y, i))
938             return;
939
940           for (j = 0; j < XVECLEN (x, i); j++)
941             merge_memattrs (XVECEXP (x, i, j), XVECEXP (y, i, j));
942
943           break;
944
945         case 'e':
946           merge_memattrs (XEXP (x, i), XEXP (y, i));
947         }
948     }
949   return;
950 }
951
952
953 /* Return true if I1 and I2 are equivalent and thus can be crossjumped.  */
954
955 static bool
956 old_insns_match_p (int mode ATTRIBUTE_UNUSED, rtx i1, rtx i2)
957 {
958   rtx p1, p2;
959
960   /* Verify that I1 and I2 are equivalent.  */
961   if (GET_CODE (i1) != GET_CODE (i2))
962     return false;
963
964   /* __builtin_unreachable() may lead to empty blocks (ending with
965      NOTE_INSN_BASIC_BLOCK).  They may be crossjumped. */
966   if (NOTE_INSN_BASIC_BLOCK_P (i1) && NOTE_INSN_BASIC_BLOCK_P (i2))
967     return true;
968
969   p1 = PATTERN (i1);
970   p2 = PATTERN (i2);
971
972   if (GET_CODE (p1) != GET_CODE (p2))
973     return false;
974
975   /* If this is a CALL_INSN, compare register usage information.
976      If we don't check this on stack register machines, the two
977      CALL_INSNs might be merged leaving reg-stack.c with mismatching
978      numbers of stack registers in the same basic block.
979      If we don't check this on machines with delay slots, a delay slot may
980      be filled that clobbers a parameter expected by the subroutine.
981
982      ??? We take the simple route for now and assume that if they're
983      equal, they were constructed identically.
984
985      Also check for identical exception regions.  */
986
987   if (CALL_P (i1))
988     {
989       /* Ensure the same EH region.  */
990       rtx n1 = find_reg_note (i1, REG_EH_REGION, 0);
991       rtx n2 = find_reg_note (i2, REG_EH_REGION, 0);
992
993       if (!n1 && n2)
994         return false;
995
996       if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
997         return false;
998
999       if (!rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
1000                         CALL_INSN_FUNCTION_USAGE (i2))
1001           || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2))
1002         return false;
1003     }
1004
1005 #ifdef STACK_REGS
1006   /* If cross_jump_death_matters is not 0, the insn's mode
1007      indicates whether or not the insn contains any stack-like
1008      regs.  */
1009
1010   if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
1011     {
1012       /* If register stack conversion has already been done, then
1013          death notes must also be compared before it is certain that
1014          the two instruction streams match.  */
1015
1016       rtx note;
1017       HARD_REG_SET i1_regset, i2_regset;
1018
1019       CLEAR_HARD_REG_SET (i1_regset);
1020       CLEAR_HARD_REG_SET (i2_regset);
1021
1022       for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
1023         if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
1024           SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
1025
1026       for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
1027         if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
1028           SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
1029
1030       if (!hard_reg_set_equal_p (i1_regset, i2_regset))
1031         return false;
1032     }
1033 #endif
1034
1035   if (reload_completed
1036       ? rtx_renumbered_equal_p (p1, p2) : rtx_equal_p (p1, p2))
1037     return true;
1038
1039   return false;
1040 }
1041 \f
1042 /* When comparing insns I1 and I2 in flow_find_cross_jump or
1043    flow_find_head_matching_sequence, ensure the notes match.  */
1044
1045 static void
1046 merge_notes (rtx i1, rtx i2)
1047 {
1048   /* If the merged insns have different REG_EQUAL notes, then
1049      remove them.  */
1050   rtx equiv1 = find_reg_equal_equiv_note (i1);
1051   rtx equiv2 = find_reg_equal_equiv_note (i2);
1052
1053   if (equiv1 && !equiv2)
1054     remove_note (i1, equiv1);
1055   else if (!equiv1 && equiv2)
1056     remove_note (i2, equiv2);
1057   else if (equiv1 && equiv2
1058            && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
1059     {
1060       remove_note (i1, equiv1);
1061       remove_note (i2, equiv2);
1062     }
1063 }
1064
1065 /* Look through the insns at the end of BB1 and BB2 and find the longest
1066    sequence that are equivalent.  Store the first insns for that sequence
1067    in *F1 and *F2 and return the sequence length.
1068
1069    To simplify callers of this function, if the blocks match exactly,
1070    store the head of the blocks in *F1 and *F2.  */
1071
1072 int
1073 flow_find_cross_jump (basic_block bb1, basic_block bb2, rtx *f1, rtx *f2)
1074 {
1075   rtx i1, i2, last1, last2, afterlast1, afterlast2;
1076   int ninsns = 0;
1077
1078   /* Skip simple jumps at the end of the blocks.  Complex jumps still
1079      need to be compared for equivalence, which we'll do below.  */
1080
1081   i1 = BB_END (bb1);
1082   last1 = afterlast1 = last2 = afterlast2 = NULL_RTX;
1083   if (onlyjump_p (i1)
1084       || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
1085     {
1086       last1 = i1;
1087       i1 = PREV_INSN (i1);
1088     }
1089
1090   i2 = BB_END (bb2);
1091   if (onlyjump_p (i2)
1092       || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
1093     {
1094       last2 = i2;
1095       /* Count everything except for unconditional jump as insn.  */
1096       if (!simplejump_p (i2) && !returnjump_p (i2) && last1)
1097         ninsns++;
1098       i2 = PREV_INSN (i2);
1099     }
1100
1101   while (true)
1102     {
1103       /* Ignore notes.  */
1104       while (!NONDEBUG_INSN_P (i1) && i1 != BB_HEAD (bb1))
1105         i1 = PREV_INSN (i1);
1106
1107       while (!NONDEBUG_INSN_P (i2) && i2 != BB_HEAD (bb2))
1108         i2 = PREV_INSN (i2);
1109
1110       if (i1 == BB_HEAD (bb1) || i2 == BB_HEAD (bb2))
1111         break;
1112
1113       if (!old_insns_match_p (0, i1, i2))
1114         break;
1115
1116       merge_memattrs (i1, i2);
1117
1118       /* Don't begin a cross-jump with a NOTE insn.  */
1119       if (INSN_P (i1))
1120         {
1121           merge_notes (i1, i2);
1122
1123           afterlast1 = last1, afterlast2 = last2;
1124           last1 = i1, last2 = i2;
1125           ninsns++;
1126         }
1127
1128       i1 = PREV_INSN (i1);
1129       i2 = PREV_INSN (i2);
1130     }
1131
1132 #ifdef HAVE_cc0
1133   /* Don't allow the insn after a compare to be shared by
1134      cross-jumping unless the compare is also shared.  */
1135   if (ninsns && reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1))
1136     last1 = afterlast1, last2 = afterlast2, ninsns--;
1137 #endif
1138
1139   /* Include preceding notes and labels in the cross-jump.  One,
1140      this may bring us to the head of the blocks as requested above.
1141      Two, it keeps line number notes as matched as may be.  */
1142   if (ninsns)
1143     {
1144       while (last1 != BB_HEAD (bb1) && !NONDEBUG_INSN_P (PREV_INSN (last1)))
1145         last1 = PREV_INSN (last1);
1146
1147       if (last1 != BB_HEAD (bb1) && LABEL_P (PREV_INSN (last1)))
1148         last1 = PREV_INSN (last1);
1149
1150       while (last2 != BB_HEAD (bb2) && !NONDEBUG_INSN_P (PREV_INSN (last2)))
1151         last2 = PREV_INSN (last2);
1152
1153       if (last2 != BB_HEAD (bb2) && LABEL_P (PREV_INSN (last2)))
1154         last2 = PREV_INSN (last2);
1155
1156       *f1 = last1;
1157       *f2 = last2;
1158     }
1159
1160   return ninsns;
1161 }
1162
1163 /* Like flow_find_cross_jump, except start looking for a matching sequence from
1164    the head of the two blocks.  Do not include jumps at the end.
1165    If STOP_AFTER is nonzero, stop after finding that many matching
1166    instructions.  */
1167
1168 int
1169 flow_find_head_matching_sequence (basic_block bb1, basic_block bb2, rtx *f1,
1170                                   rtx *f2, int stop_after)
1171 {
1172   rtx i1, i2, last1, last2, beforelast1, beforelast2;
1173   int ninsns = 0;
1174   edge e;
1175   edge_iterator ei;
1176   int nehedges1 = 0, nehedges2 = 0;
1177
1178   FOR_EACH_EDGE (e, ei, bb1->succs)
1179     if (e->flags & EDGE_EH)
1180       nehedges1++;
1181   FOR_EACH_EDGE (e, ei, bb2->succs)
1182     if (e->flags & EDGE_EH)
1183       nehedges2++;
1184
1185   i1 = BB_HEAD (bb1);
1186   i2 = BB_HEAD (bb2);
1187   last1 = beforelast1 = last2 = beforelast2 = NULL_RTX;
1188
1189   while (true)
1190     {
1191       /* Ignore notes, except NOTE_INSN_EPILOGUE_BEG.  */
1192       while (!NONDEBUG_INSN_P (i1) && i1 != BB_END (bb1))
1193         {
1194           if (NOTE_P (i1) && NOTE_KIND (i1) == NOTE_INSN_EPILOGUE_BEG)
1195             break;
1196           i1 = NEXT_INSN (i1);
1197         }
1198
1199       while (!NONDEBUG_INSN_P (i2) && i2 != BB_END (bb2))
1200         {
1201           if (NOTE_P (i2) && NOTE_KIND (i2) == NOTE_INSN_EPILOGUE_BEG)
1202             break;
1203           i2 = NEXT_INSN (i2);
1204         }
1205
1206       if ((i1 == BB_END (bb1) && !NONDEBUG_INSN_P (i1))
1207           || (i2 == BB_END (bb2) && !NONDEBUG_INSN_P (i2)))
1208         break;
1209
1210       if (NOTE_P (i1) || NOTE_P (i2)
1211           || JUMP_P (i1) || JUMP_P (i2))
1212         break;
1213
1214       /* A sanity check to make sure we're not merging insns with different
1215          effects on EH.  If only one of them ends a basic block, it shouldn't
1216          have an EH edge; if both end a basic block, there should be the same
1217          number of EH edges.  */
1218       if ((i1 == BB_END (bb1) && i2 != BB_END (bb2)
1219            && nehedges1 > 0)
1220           || (i2 == BB_END (bb2) && i1 != BB_END (bb1)
1221               && nehedges2 > 0)
1222           || (i1 == BB_END (bb1) && i2 == BB_END (bb2)
1223               && nehedges1 != nehedges2))
1224         break;
1225
1226       if (!old_insns_match_p (0, i1, i2))
1227         break;
1228
1229       merge_memattrs (i1, i2);
1230
1231       /* Don't begin a cross-jump with a NOTE insn.  */
1232       if (INSN_P (i1))
1233         {
1234           merge_notes (i1, i2);
1235
1236           beforelast1 = last1, beforelast2 = last2;
1237           last1 = i1, last2 = i2;
1238           ninsns++;
1239         }
1240
1241       if (i1 == BB_END (bb1) || i2 == BB_END (bb2)
1242           || (stop_after > 0 && ninsns == stop_after))
1243         break;
1244
1245       i1 = NEXT_INSN (i1);
1246       i2 = NEXT_INSN (i2);
1247     }
1248
1249 #ifdef HAVE_cc0
1250   /* Don't allow a compare to be shared by cross-jumping unless the insn
1251      after the compare is also shared.  */
1252   if (ninsns && reg_mentioned_p (cc0_rtx, last1) && sets_cc0_p (last1))
1253     last1 = beforelast1, last2 = beforelast2, ninsns--;
1254 #endif
1255
1256   if (ninsns)
1257     {
1258       *f1 = last1;
1259       *f2 = last2;
1260     }
1261
1262   return ninsns;
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_bb_for_speed_p (bb1)
1367           && optimize_bb_for_speed_p (bb2))
1368         {
1369           int prob2;
1370
1371           if (b1->dest == b2->dest)
1372             prob2 = b2->probability;
1373           else
1374             /* Do not use f2 probability as f2 may be forwarded.  */
1375             prob2 = REG_BR_PROB_BASE - b2->probability;
1376
1377           /* Fail if the difference in probabilities is greater than 50%.
1378              This rules out two well-predicted branches with opposite
1379              outcomes.  */
1380           if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2)
1381             {
1382               if (dump_file)
1383                 fprintf (dump_file,
1384                          "Outcomes of branch in bb %i and %i differ too much (%i %i)\n",
1385                          bb1->index, bb2->index, b1->probability, prob2);
1386
1387               return false;
1388             }
1389         }
1390
1391       if (dump_file && match)
1392         fprintf (dump_file, "Conditionals in bb %i and %i match.\n",
1393                  bb1->index, bb2->index);
1394
1395       return match;
1396     }
1397
1398   /* Generic case - we are seeing a computed jump, table jump or trapping
1399      instruction.  */
1400
1401   /* Check whether there are tablejumps in the end of BB1 and BB2.
1402      Return true if they are identical.  */
1403     {
1404       rtx label1, label2;
1405       rtx table1, table2;
1406
1407       if (tablejump_p (BB_END (bb1), &label1, &table1)
1408           && tablejump_p (BB_END (bb2), &label2, &table2)
1409           && GET_CODE (PATTERN (table1)) == GET_CODE (PATTERN (table2)))
1410         {
1411           /* The labels should never be the same rtx.  If they really are same
1412              the jump tables are same too. So disable crossjumping of blocks BB1
1413              and BB2 because when deleting the common insns in the end of BB1
1414              by delete_basic_block () the jump table would be deleted too.  */
1415           /* If LABEL2 is referenced in BB1->END do not do anything
1416              because we would loose information when replacing
1417              LABEL1 by LABEL2 and then LABEL2 by LABEL1 in BB1->END.  */
1418           if (label1 != label2 && !rtx_referenced_p (label2, BB_END (bb1)))
1419             {
1420               /* Set IDENTICAL to true when the tables are identical.  */
1421               bool identical = false;
1422               rtx p1, p2;
1423
1424               p1 = PATTERN (table1);
1425               p2 = PATTERN (table2);
1426               if (GET_CODE (p1) == ADDR_VEC && rtx_equal_p (p1, p2))
1427                 {
1428                   identical = true;
1429                 }
1430               else if (GET_CODE (p1) == ADDR_DIFF_VEC
1431                        && (XVECLEN (p1, 1) == XVECLEN (p2, 1))
1432                        && rtx_equal_p (XEXP (p1, 2), XEXP (p2, 2))
1433                        && rtx_equal_p (XEXP (p1, 3), XEXP (p2, 3)))
1434                 {
1435                   int i;
1436
1437                   identical = true;
1438                   for (i = XVECLEN (p1, 1) - 1; i >= 0 && identical; i--)
1439                     if (!rtx_equal_p (XVECEXP (p1, 1, i), XVECEXP (p2, 1, i)))
1440                       identical = false;
1441                 }
1442
1443               if (identical)
1444                 {
1445                   replace_label_data rr;
1446                   bool match;
1447
1448                   /* Temporarily replace references to LABEL1 with LABEL2
1449                      in BB1->END so that we could compare the instructions.  */
1450                   rr.r1 = label1;
1451                   rr.r2 = label2;
1452                   rr.update_label_nuses = false;
1453                   for_each_rtx (&BB_END (bb1), replace_label, &rr);
1454
1455                   match = old_insns_match_p (mode, BB_END (bb1), BB_END (bb2));
1456                   if (dump_file && match)
1457                     fprintf (dump_file,
1458                              "Tablejumps in bb %i and %i match.\n",
1459                              bb1->index, bb2->index);
1460
1461                   /* Set the original label in BB1->END because when deleting
1462                      a block whose end is a tablejump, the tablejump referenced
1463                      from the instruction is deleted too.  */
1464                   rr.r1 = label2;
1465                   rr.r2 = label1;
1466                   for_each_rtx (&BB_END (bb1), replace_label, &rr);
1467
1468                   return match;
1469                 }
1470             }
1471           return false;
1472         }
1473     }
1474
1475   /* First ensure that the instructions match.  There may be many outgoing
1476      edges so this test is generally cheaper.  */
1477   if (!old_insns_match_p (mode, BB_END (bb1), BB_END (bb2)))
1478     return false;
1479
1480   /* Search the outgoing edges, ensure that the counts do match, find possible
1481      fallthru and exception handling edges since these needs more
1482      validation.  */
1483   if (EDGE_COUNT (bb1->succs) != EDGE_COUNT (bb2->succs))
1484     return false;
1485
1486   FOR_EACH_EDGE (e1, ei, bb1->succs)
1487     {
1488       e2 = EDGE_SUCC (bb2, ei.index);
1489
1490       if (e1->flags & EDGE_EH)
1491         nehedges1++;
1492
1493       if (e2->flags & EDGE_EH)
1494         nehedges2++;
1495
1496       if (e1->flags & EDGE_FALLTHRU)
1497         fallthru1 = e1;
1498       if (e2->flags & EDGE_FALLTHRU)
1499         fallthru2 = e2;
1500     }
1501
1502   /* If number of edges of various types does not match, fail.  */
1503   if (nehedges1 != nehedges2
1504       || (fallthru1 != 0) != (fallthru2 != 0))
1505     return false;
1506
1507   /* fallthru edges must be forwarded to the same destination.  */
1508   if (fallthru1)
1509     {
1510       basic_block d1 = (forwarder_block_p (fallthru1->dest)
1511                         ? single_succ (fallthru1->dest): fallthru1->dest);
1512       basic_block d2 = (forwarder_block_p (fallthru2->dest)
1513                         ? single_succ (fallthru2->dest): fallthru2->dest);
1514
1515       if (d1 != d2)
1516         return false;
1517     }
1518
1519   /* Ensure the same EH region.  */
1520   {
1521     rtx n1 = find_reg_note (BB_END (bb1), REG_EH_REGION, 0);
1522     rtx n2 = find_reg_note (BB_END (bb2), REG_EH_REGION, 0);
1523
1524     if (!n1 && n2)
1525       return false;
1526
1527     if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
1528       return false;
1529   }
1530
1531   /* The same checks as in try_crossjump_to_edge. It is required for RTL
1532      version of sequence abstraction.  */
1533   FOR_EACH_EDGE (e1, ei, bb2->succs)
1534     {
1535       edge e2;
1536       edge_iterator ei;
1537       basic_block d1 = e1->dest;
1538
1539       if (FORWARDER_BLOCK_P (d1))
1540         d1 = EDGE_SUCC (d1, 0)->dest;
1541
1542       FOR_EACH_EDGE (e2, ei, bb1->succs)
1543         {
1544           basic_block d2 = e2->dest;
1545           if (FORWARDER_BLOCK_P (d2))
1546             d2 = EDGE_SUCC (d2, 0)->dest;
1547           if (d1 == d2)
1548             break;
1549         }
1550
1551       if (!e2)
1552         return false;
1553     }
1554
1555   return true;
1556 }
1557
1558 /* Returns true if BB basic block has a preserve label.  */
1559
1560 static bool
1561 block_has_preserve_label (basic_block bb)
1562 {
1563   return (bb
1564           && block_label (bb)
1565           && LABEL_PRESERVE_P (block_label (bb)));
1566 }
1567
1568 /* E1 and E2 are edges with the same destination block.  Search their
1569    predecessors for common code.  If found, redirect control flow from
1570    (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC.  */
1571
1572 static bool
1573 try_crossjump_to_edge (int mode, edge e1, edge e2)
1574 {
1575   int nmatch;
1576   basic_block src1 = e1->src, src2 = e2->src;
1577   basic_block redirect_to, redirect_from, to_remove;
1578   rtx newpos1, newpos2;
1579   edge s;
1580   edge_iterator ei;
1581
1582   newpos1 = newpos2 = NULL_RTX;
1583
1584   /* If we have partitioned hot/cold basic blocks, it is a bad idea
1585      to try this optimization.
1586
1587      Basic block partitioning may result in some jumps that appear to
1588      be optimizable (or blocks that appear to be mergeable), but which really
1589      must be left untouched (they are required to make it safely across
1590      partition boundaries).  See the comments at the top of
1591      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
1592
1593   if (flag_reorder_blocks_and_partition && reload_completed)
1594     return false;
1595
1596   /* Search backward through forwarder blocks.  We don't need to worry
1597      about multiple entry or chained forwarders, as they will be optimized
1598      away.  We do this to look past the unconditional jump following a
1599      conditional jump that is required due to the current CFG shape.  */
1600   if (single_pred_p (src1)
1601       && FORWARDER_BLOCK_P (src1))
1602     e1 = single_pred_edge (src1), src1 = e1->src;
1603
1604   if (single_pred_p (src2)
1605       && FORWARDER_BLOCK_P (src2))
1606     e2 = single_pred_edge (src2), src2 = e2->src;
1607
1608   /* Nothing to do if we reach ENTRY, or a common source block.  */
1609   if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
1610     return false;
1611   if (src1 == src2)
1612     return false;
1613
1614   /* Seeing more than 1 forwarder blocks would confuse us later...  */
1615   if (FORWARDER_BLOCK_P (e1->dest)
1616       && FORWARDER_BLOCK_P (single_succ (e1->dest)))
1617     return false;
1618
1619   if (FORWARDER_BLOCK_P (e2->dest)
1620       && FORWARDER_BLOCK_P (single_succ (e2->dest)))
1621     return false;
1622
1623   /* Likewise with dead code (possibly newly created by the other optimizations
1624      of cfg_cleanup).  */
1625   if (EDGE_COUNT (src1->preds) == 0 || EDGE_COUNT (src2->preds) == 0)
1626     return false;
1627
1628   /* Look for the common insn sequence, part the first ...  */
1629   if (!outgoing_edges_match (mode, src1, src2))
1630     return false;
1631
1632   /* ... and part the second.  */
1633   nmatch = flow_find_cross_jump (src1, src2, &newpos1, &newpos2);
1634
1635   /* Don't proceed with the crossjump unless we found a sufficient number
1636      of matching instructions or the 'from' block was totally matched
1637      (such that its predecessors will hopefully be redirected and the
1638      block removed).  */
1639   if ((nmatch < PARAM_VALUE (PARAM_MIN_CROSSJUMP_INSNS))
1640       && (newpos1 != BB_HEAD (src1)))
1641     return false;
1642
1643   /* Avoid deleting preserve label when redirecting ABNORMAL edges.  */
1644   if (block_has_preserve_label (e1->dest)
1645       && (e1->flags & EDGE_ABNORMAL))
1646     return false;
1647
1648   /* Here we know that the insns in the end of SRC1 which are common with SRC2
1649      will be deleted.
1650      If we have tablejumps in the end of SRC1 and SRC2
1651      they have been already compared for equivalence in outgoing_edges_match ()
1652      so replace the references to TABLE1 by references to TABLE2.  */
1653     {
1654       rtx label1, label2;
1655       rtx table1, table2;
1656
1657       if (tablejump_p (BB_END (src1), &label1, &table1)
1658           && tablejump_p (BB_END (src2), &label2, &table2)
1659           && label1 != label2)
1660         {
1661           replace_label_data rr;
1662           rtx insn;
1663
1664           /* Replace references to LABEL1 with LABEL2.  */
1665           rr.r1 = label1;
1666           rr.r2 = label2;
1667           rr.update_label_nuses = true;
1668           for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1669             {
1670               /* Do not replace the label in SRC1->END because when deleting
1671                  a block whose end is a tablejump, the tablejump referenced
1672                  from the instruction is deleted too.  */
1673               if (insn != BB_END (src1))
1674                 for_each_rtx (&insn, replace_label, &rr);
1675             }
1676         }
1677     }
1678
1679   /* Avoid splitting if possible.  We must always split when SRC2 has
1680      EH predecessor edges, or we may end up with basic blocks with both
1681      normal and EH predecessor edges.  */
1682   if (newpos2 == BB_HEAD (src2)
1683       && !(EDGE_PRED (src2, 0)->flags & EDGE_EH))
1684     redirect_to = src2;
1685   else
1686     {
1687       if (newpos2 == BB_HEAD (src2))
1688         {
1689           /* Skip possible basic block header.  */
1690           if (LABEL_P (newpos2))
1691             newpos2 = NEXT_INSN (newpos2);
1692           while (DEBUG_INSN_P (newpos2))
1693             newpos2 = NEXT_INSN (newpos2);
1694           if (NOTE_P (newpos2))
1695             newpos2 = NEXT_INSN (newpos2);
1696           while (DEBUG_INSN_P (newpos2))
1697             newpos2 = NEXT_INSN (newpos2);
1698         }
1699
1700       if (dump_file)
1701         fprintf (dump_file, "Splitting bb %i before %i insns\n",
1702                  src2->index, nmatch);
1703       redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
1704     }
1705
1706   if (dump_file)
1707     fprintf (dump_file,
1708              "Cross jumping from bb %i to bb %i; %i common insns\n",
1709              src1->index, src2->index, nmatch);
1710
1711   /* We may have some registers visible through the block.  */
1712   df_set_bb_dirty (redirect_to);
1713
1714   /* Recompute the frequencies and counts of outgoing edges.  */
1715   FOR_EACH_EDGE (s, ei, redirect_to->succs)
1716     {
1717       edge s2;
1718       edge_iterator ei;
1719       basic_block d = s->dest;
1720
1721       if (FORWARDER_BLOCK_P (d))
1722         d = single_succ (d);
1723
1724       FOR_EACH_EDGE (s2, ei, src1->succs)
1725         {
1726           basic_block d2 = s2->dest;
1727           if (FORWARDER_BLOCK_P (d2))
1728             d2 = single_succ (d2);
1729           if (d == d2)
1730             break;
1731         }
1732
1733       s->count += s2->count;
1734
1735       /* Take care to update possible forwarder blocks.  We verified
1736          that there is no more than one in the chain, so we can't run
1737          into infinite loop.  */
1738       if (FORWARDER_BLOCK_P (s->dest))
1739         {
1740           single_succ_edge (s->dest)->count += s2->count;
1741           s->dest->count += s2->count;
1742           s->dest->frequency += EDGE_FREQUENCY (s);
1743         }
1744
1745       if (FORWARDER_BLOCK_P (s2->dest))
1746         {
1747           single_succ_edge (s2->dest)->count -= s2->count;
1748           if (single_succ_edge (s2->dest)->count < 0)
1749             single_succ_edge (s2->dest)->count = 0;
1750           s2->dest->count -= s2->count;
1751           s2->dest->frequency -= EDGE_FREQUENCY (s);
1752           if (s2->dest->frequency < 0)
1753             s2->dest->frequency = 0;
1754           if (s2->dest->count < 0)
1755             s2->dest->count = 0;
1756         }
1757
1758       if (!redirect_to->frequency && !src1->frequency)
1759         s->probability = (s->probability + s2->probability) / 2;
1760       else
1761         s->probability
1762           = ((s->probability * redirect_to->frequency +
1763               s2->probability * src1->frequency)
1764              / (redirect_to->frequency + src1->frequency));
1765     }
1766
1767   /* Adjust count and frequency for the block.  An earlier jump
1768      threading pass may have left the profile in an inconsistent
1769      state (see update_bb_profile_for_threading) so we must be
1770      prepared for overflows.  */
1771   redirect_to->count += src1->count;
1772   redirect_to->frequency += src1->frequency;
1773   if (redirect_to->frequency > BB_FREQ_MAX)
1774     redirect_to->frequency = BB_FREQ_MAX;
1775   update_br_prob_note (redirect_to);
1776
1777   /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1.  */
1778
1779   /* Skip possible basic block header.  */
1780   if (LABEL_P (newpos1))
1781     newpos1 = NEXT_INSN (newpos1);
1782
1783   while (DEBUG_INSN_P (newpos1))
1784     newpos1 = NEXT_INSN (newpos1);
1785
1786   if (NOTE_INSN_BASIC_BLOCK_P (newpos1))
1787     newpos1 = NEXT_INSN (newpos1);
1788
1789   while (DEBUG_INSN_P (newpos1))
1790     newpos1 = NEXT_INSN (newpos1);
1791
1792   redirect_from = split_block (src1, PREV_INSN (newpos1))->src;
1793   to_remove = single_succ (redirect_from);
1794
1795   redirect_edge_and_branch_force (single_succ_edge (redirect_from), redirect_to);
1796   delete_basic_block (to_remove);
1797
1798   update_forwarder_flag (redirect_from);
1799   if (redirect_to != src2)
1800     update_forwarder_flag (src2);
1801
1802   return true;
1803 }
1804
1805 /* Search the predecessors of BB for common insn sequences.  When found,
1806    share code between them by redirecting control flow.  Return true if
1807    any changes made.  */
1808
1809 static bool
1810 try_crossjump_bb (int mode, basic_block bb)
1811 {
1812   edge e, e2, fallthru;
1813   bool changed;
1814   unsigned max, ix, ix2;
1815   basic_block ev, ev2;
1816
1817   /* Nothing to do if there is not at least two incoming edges.  */
1818   if (EDGE_COUNT (bb->preds) < 2)
1819     return false;
1820
1821   /* Don't crossjump if this block ends in a computed jump,
1822      unless we are optimizing for size.  */
1823   if (optimize_bb_for_size_p (bb)
1824       && bb != EXIT_BLOCK_PTR
1825       && computed_jump_p (BB_END (bb)))
1826     return false;
1827
1828   /* If we are partitioning hot/cold basic blocks, we don't want to
1829      mess up unconditional or indirect jumps that cross between hot
1830      and cold sections.
1831
1832      Basic block partitioning may result in some jumps that appear to
1833      be optimizable (or blocks that appear to be mergeable), but which really
1834      must be left untouched (they are required to make it safely across
1835      partition boundaries).  See the comments at the top of
1836      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
1837
1838   if (BB_PARTITION (EDGE_PRED (bb, 0)->src) !=
1839                                         BB_PARTITION (EDGE_PRED (bb, 1)->src)
1840       || (EDGE_PRED (bb, 0)->flags & EDGE_CROSSING))
1841     return false;
1842
1843   /* It is always cheapest to redirect a block that ends in a branch to
1844      a block that falls through into BB, as that adds no branches to the
1845      program.  We'll try that combination first.  */
1846   fallthru = NULL;
1847   max = PARAM_VALUE (PARAM_MAX_CROSSJUMP_EDGES);
1848
1849   if (EDGE_COUNT (bb->preds) > max)
1850     return false;
1851
1852   fallthru = find_fallthru_edge (bb->preds);
1853
1854   changed = false;
1855   for (ix = 0, ev = bb; ix < EDGE_COUNT (ev->preds); )
1856     {
1857       e = EDGE_PRED (ev, ix);
1858       ix++;
1859
1860       /* As noted above, first try with the fallthru predecessor (or, a
1861          fallthru predecessor if we are in cfglayout mode).  */
1862       if (fallthru)
1863         {
1864           /* Don't combine the fallthru edge into anything else.
1865              If there is a match, we'll do it the other way around.  */
1866           if (e == fallthru)
1867             continue;
1868           /* If nothing changed since the last attempt, there is nothing
1869              we can do.  */
1870           if (!first_pass
1871               && !((e->src->flags & BB_MODIFIED)
1872                    || (fallthru->src->flags & BB_MODIFIED)))
1873             continue;
1874
1875           if (try_crossjump_to_edge (mode, e, fallthru))
1876             {
1877               changed = true;
1878               ix = 0;
1879               ev = bb;
1880               continue;
1881             }
1882         }
1883
1884       /* Non-obvious work limiting check: Recognize that we're going
1885          to call try_crossjump_bb on every basic block.  So if we have
1886          two blocks with lots of outgoing edges (a switch) and they
1887          share lots of common destinations, then we would do the
1888          cross-jump check once for each common destination.
1889
1890          Now, if the blocks actually are cross-jump candidates, then
1891          all of their destinations will be shared.  Which means that
1892          we only need check them for cross-jump candidacy once.  We
1893          can eliminate redundant checks of crossjump(A,B) by arbitrarily
1894          choosing to do the check from the block for which the edge
1895          in question is the first successor of A.  */
1896       if (EDGE_SUCC (e->src, 0) != e)
1897         continue;
1898
1899       for (ix2 = 0, ev2 = bb; ix2 < EDGE_COUNT (ev2->preds); )
1900         {
1901           e2 = EDGE_PRED (ev2, ix2);
1902           ix2++;
1903
1904           if (e2 == e)
1905             continue;
1906
1907           /* We've already checked the fallthru edge above.  */
1908           if (e2 == fallthru)
1909             continue;
1910
1911           /* The "first successor" check above only prevents multiple
1912              checks of crossjump(A,B).  In order to prevent redundant
1913              checks of crossjump(B,A), require that A be the block
1914              with the lowest index.  */
1915           if (e->src->index > e2->src->index)
1916             continue;
1917
1918           /* If nothing changed since the last attempt, there is nothing
1919              we can do.  */
1920           if (!first_pass
1921               && !((e->src->flags & BB_MODIFIED)
1922                    || (e2->src->flags & BB_MODIFIED)))
1923             continue;
1924
1925           if (try_crossjump_to_edge (mode, e, e2))
1926             {
1927               changed = true;
1928               ev2 = bb;
1929               ix = 0;
1930               break;
1931             }
1932         }
1933     }
1934
1935   if (changed)
1936     crossjumps_occured = true;
1937
1938   return changed;
1939 }
1940
1941 /* Search the successors of BB for common insn sequences.  When found,
1942    share code between them by moving it across the basic block
1943    boundary.  Return true if any changes made.  */
1944
1945 static bool
1946 try_head_merge_bb (basic_block bb)
1947 {
1948   basic_block final_dest_bb = NULL;
1949   int max_match = INT_MAX;
1950   edge e0;
1951   rtx *headptr, *currptr, *nextptr;
1952   bool changed, moveall;
1953   unsigned ix;
1954   rtx e0_last_head, cond, move_before;
1955   unsigned nedges = EDGE_COUNT (bb->succs);
1956   rtx jump = BB_END (bb);
1957   regset live, live_union;
1958
1959   /* Nothing to do if there is not at least two outgoing edges.  */
1960   if (nedges < 2)
1961     return false;
1962
1963   /* Don't crossjump if this block ends in a computed jump,
1964      unless we are optimizing for size.  */
1965   if (optimize_bb_for_size_p (bb)
1966       && bb != EXIT_BLOCK_PTR
1967       && computed_jump_p (BB_END (bb)))
1968     return false;
1969
1970   cond = get_condition (jump, &move_before, true, false);
1971   if (cond == NULL_RTX)
1972     {
1973 #ifdef HAVE_cc0
1974       if (reg_mentioned_p (cc0_rtx, jump))
1975         move_before = prev_nonnote_nondebug_insn (jump);
1976       else
1977 #endif
1978         move_before = jump;
1979     }
1980
1981   for (ix = 0; ix < nedges; ix++)
1982     if (EDGE_SUCC (bb, ix)->dest == EXIT_BLOCK_PTR)
1983       return false;
1984
1985   for (ix = 0; ix < nedges; ix++)
1986     {
1987       edge e = EDGE_SUCC (bb, ix);
1988       basic_block other_bb = e->dest;
1989
1990       if (df_get_bb_dirty (other_bb))
1991         {
1992           block_was_dirty = true;
1993           return false;
1994         }
1995
1996       if (e->flags & EDGE_ABNORMAL)
1997         return false;
1998
1999       /* Normally, all destination blocks must only be reachable from this
2000          block, i.e. they must have one incoming edge.
2001
2002          There is one special case we can handle, that of multiple consecutive
2003          jumps where the first jumps to one of the targets of the second jump.
2004          This happens frequently in switch statements for default labels.
2005          The structure is as follows:
2006          FINAL_DEST_BB
2007          ....
2008          if (cond) jump A;
2009          fall through
2010          BB
2011          jump with targets A, B, C, D...
2012          A
2013          has two incoming edges, from FINAL_DEST_BB and BB
2014
2015          In this case, we can try to move the insns through BB and into
2016          FINAL_DEST_BB.  */
2017       if (EDGE_COUNT (other_bb->preds) != 1)
2018         {
2019           edge incoming_edge, incoming_bb_other_edge;
2020           edge_iterator ei;
2021
2022           if (final_dest_bb != NULL
2023               || EDGE_COUNT (other_bb->preds) != 2)
2024             return false;
2025
2026           /* We must be able to move the insns across the whole block.  */
2027           move_before = BB_HEAD (bb);
2028           while (!NONDEBUG_INSN_P (move_before))
2029             move_before = NEXT_INSN (move_before);
2030
2031           if (EDGE_COUNT (bb->preds) != 1)
2032             return false;
2033           incoming_edge = EDGE_PRED (bb, 0);
2034           final_dest_bb = incoming_edge->src;
2035           if (EDGE_COUNT (final_dest_bb->succs) != 2)
2036             return false;
2037           FOR_EACH_EDGE (incoming_bb_other_edge, ei, final_dest_bb->succs)
2038             if (incoming_bb_other_edge != incoming_edge)
2039               break;
2040           if (incoming_bb_other_edge->dest != other_bb)
2041             return false;
2042         }
2043     }
2044
2045   e0 = EDGE_SUCC (bb, 0);
2046   e0_last_head = NULL_RTX;
2047   changed = false;
2048
2049   for (ix = 1; ix < nedges; ix++)
2050     {
2051       edge e = EDGE_SUCC (bb, ix);
2052       rtx e0_last, e_last;
2053       int nmatch;
2054
2055       nmatch = flow_find_head_matching_sequence (e0->dest, e->dest,
2056                                                  &e0_last, &e_last, 0);
2057       if (nmatch == 0)
2058         return false;
2059
2060       if (nmatch < max_match)
2061         {
2062           max_match = nmatch;
2063           e0_last_head = e0_last;
2064         }
2065     }
2066
2067   /* If we matched an entire block, we probably have to avoid moving the
2068      last insn.  */
2069   if (max_match > 0
2070       && e0_last_head == BB_END (e0->dest)
2071       && (find_reg_note (e0_last_head, REG_EH_REGION, 0)
2072           || control_flow_insn_p (e0_last_head)))
2073     {
2074       max_match--;
2075       if (max_match == 0)
2076         return false;
2077       do
2078         e0_last_head = prev_real_insn (e0_last_head);
2079       while (DEBUG_INSN_P (e0_last_head));
2080     }
2081
2082   if (max_match == 0)
2083     return false;
2084
2085   /* We must find a union of the live registers at each of the end points.  */
2086   live = BITMAP_ALLOC (NULL);
2087   live_union = BITMAP_ALLOC (NULL);
2088
2089   currptr = XNEWVEC (rtx, nedges);
2090   headptr = XNEWVEC (rtx, nedges);
2091   nextptr = XNEWVEC (rtx, nedges);
2092
2093   for (ix = 0; ix < nedges; ix++)
2094     {
2095       int j;
2096       basic_block merge_bb = EDGE_SUCC (bb, ix)->dest;
2097       rtx head = BB_HEAD (merge_bb);
2098
2099       while (!NONDEBUG_INSN_P (head))
2100         head = NEXT_INSN (head);
2101       headptr[ix] = head;
2102       currptr[ix] = head;
2103
2104       /* Compute the end point and live information  */
2105       for (j = 1; j < max_match; j++)
2106         do
2107           head = NEXT_INSN (head);
2108         while (!NONDEBUG_INSN_P (head));
2109       simulate_backwards_to_point (merge_bb, live, head);
2110       IOR_REG_SET (live_union, live);
2111     }
2112
2113   /* If we're moving across two blocks, verify the validity of the
2114      first move, then adjust the target and let the loop below deal
2115      with the final move.  */
2116   if (final_dest_bb != NULL)
2117     {
2118       rtx move_upto;
2119
2120       moveall = can_move_insns_across (currptr[0], e0_last_head, move_before,
2121                                        jump, e0->dest, live_union,
2122                                        NULL, &move_upto);
2123       if (!moveall)
2124         {
2125           if (move_upto == NULL_RTX)
2126             goto out;
2127
2128           while (e0_last_head != move_upto)
2129             {
2130               df_simulate_one_insn_backwards (e0->dest, e0_last_head,
2131                                               live_union);
2132               e0_last_head = PREV_INSN (e0_last_head);
2133             }
2134         }
2135       if (e0_last_head == NULL_RTX)
2136         goto out;
2137
2138       jump = BB_END (final_dest_bb);
2139       cond = get_condition (jump, &move_before, true, false);
2140       if (cond == NULL_RTX)
2141         {
2142 #ifdef HAVE_cc0
2143           if (reg_mentioned_p (cc0_rtx, jump))
2144             move_before = prev_nonnote_nondebug_insn (jump);
2145           else
2146 #endif
2147             move_before = jump;
2148         }
2149     }
2150
2151   do
2152     {
2153       rtx move_upto;
2154       moveall = can_move_insns_across (currptr[0], e0_last_head,
2155                                        move_before, jump, e0->dest, live_union,
2156                                        NULL, &move_upto);
2157       if (!moveall && move_upto == NULL_RTX)
2158         {
2159           if (jump == move_before)
2160             break;
2161
2162           /* Try again, using a different insertion point.  */
2163           move_before = jump;
2164
2165 #ifdef HAVE_cc0
2166           /* Don't try moving before a cc0 user, as that may invalidate
2167              the cc0.  */
2168           if (reg_mentioned_p (cc0_rtx, jump))
2169             break;
2170 #endif
2171
2172           continue;
2173         }
2174
2175       if (final_dest_bb && !moveall)
2176         /* We haven't checked whether a partial move would be OK for the first
2177            move, so we have to fail this case.  */
2178         break;
2179
2180       changed = true;
2181       for (;;)
2182         {
2183           if (currptr[0] == move_upto)
2184             break;
2185           for (ix = 0; ix < nedges; ix++)
2186             {
2187               rtx curr = currptr[ix];
2188               do
2189                 curr = NEXT_INSN (curr);
2190               while (!NONDEBUG_INSN_P (curr));
2191               currptr[ix] = curr;
2192             }
2193         }
2194
2195       /* If we can't currently move all of the identical insns, remember
2196          each insn after the range that we'll merge.  */
2197       if (!moveall)
2198         for (ix = 0; ix < nedges; ix++)
2199           {
2200             rtx curr = currptr[ix];
2201             do
2202               curr = NEXT_INSN (curr);
2203             while (!NONDEBUG_INSN_P (curr));
2204             nextptr[ix] = curr;
2205           }
2206
2207       reorder_insns (headptr[0], currptr[0], PREV_INSN (move_before));
2208       df_set_bb_dirty (EDGE_SUCC (bb, 0)->dest);
2209       if (final_dest_bb != NULL)
2210         df_set_bb_dirty (final_dest_bb);
2211       df_set_bb_dirty (bb);
2212       for (ix = 1; ix < nedges; ix++)
2213         {
2214           df_set_bb_dirty (EDGE_SUCC (bb, ix)->dest);
2215           delete_insn_chain (headptr[ix], currptr[ix], false);
2216         }
2217       if (!moveall)
2218         {
2219           if (jump == move_before)
2220             break;
2221
2222           /* For the unmerged insns, try a different insertion point.  */
2223           move_before = jump;
2224
2225 #ifdef HAVE_cc0
2226           /* Don't try moving before a cc0 user, as that may invalidate
2227              the cc0.  */
2228           if (reg_mentioned_p (cc0_rtx, jump))
2229             break;
2230 #endif
2231
2232           for (ix = 0; ix < nedges; ix++)
2233             currptr[ix] = headptr[ix] = nextptr[ix];
2234         }
2235     }
2236   while (!moveall);
2237
2238  out:
2239   free (currptr);
2240   free (headptr);
2241   free (nextptr);
2242
2243   crossjumps_occured |= changed;
2244
2245   return changed;
2246 }
2247
2248 /* Return true if BB contains just bb note, or bb note followed
2249    by only DEBUG_INSNs.  */
2250
2251 static bool
2252 trivially_empty_bb_p (basic_block bb)
2253 {
2254   rtx insn = BB_END (bb);
2255
2256   while (1)
2257     {
2258       if (insn == BB_HEAD (bb))
2259         return true;
2260       if (!DEBUG_INSN_P (insn))
2261         return false;
2262       insn = PREV_INSN (insn);
2263     }
2264 }
2265
2266 /* Do simple CFG optimizations - basic block merging, simplifying of jump
2267    instructions etc.  Return nonzero if changes were made.  */
2268
2269 static bool
2270 try_optimize_cfg (int mode)
2271 {
2272   bool changed_overall = false;
2273   bool changed;
2274   int iterations = 0;
2275   basic_block bb, b, next;
2276
2277   if (mode & (CLEANUP_CROSSJUMP | CLEANUP_THREADING))
2278     clear_bb_flags ();
2279
2280   crossjumps_occured = false;
2281
2282   FOR_EACH_BB (bb)
2283     update_forwarder_flag (bb);
2284
2285   if (! targetm.cannot_modify_jumps_p ())
2286     {
2287       first_pass = true;
2288       /* Attempt to merge blocks as made possible by edge removal.  If
2289          a block has only one successor, and the successor has only
2290          one predecessor, they may be combined.  */
2291       do
2292         {
2293           block_was_dirty = false;
2294           changed = false;
2295           iterations++;
2296
2297           if (dump_file)
2298             fprintf (dump_file,
2299                      "\n\ntry_optimize_cfg iteration %i\n\n",
2300                      iterations);
2301
2302           for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR;)
2303             {
2304               basic_block c;
2305               edge s;
2306               bool changed_here = false;
2307
2308               /* Delete trivially dead basic blocks.  This is either
2309                  blocks with no predecessors, or empty blocks with no
2310                  successors.  However if the empty block with no
2311                  successors is the successor of the ENTRY_BLOCK, it is
2312                  kept.  This ensures that the ENTRY_BLOCK will have a
2313                  successor which is a precondition for many RTL
2314                  passes.  Empty blocks may result from expanding
2315                  __builtin_unreachable ().  */
2316               if (EDGE_COUNT (b->preds) == 0
2317                   || (EDGE_COUNT (b->succs) == 0
2318                       && trivially_empty_bb_p (b)
2319                       && single_succ_edge (ENTRY_BLOCK_PTR)->dest != b))
2320                 {
2321                   c = b->prev_bb;
2322                   if (EDGE_COUNT (b->preds) > 0)
2323                     {
2324                       edge e;
2325                       edge_iterator ei;
2326
2327                       if (current_ir_type () == IR_RTL_CFGLAYOUT)
2328                         {
2329                           if (b->il.rtl->footer
2330                               && BARRIER_P (b->il.rtl->footer))
2331                             FOR_EACH_EDGE (e, ei, b->preds)
2332                               if ((e->flags & EDGE_FALLTHRU)
2333                                   && e->src->il.rtl->footer == NULL)
2334                                 {
2335                                   if (b->il.rtl->footer)
2336                                     {
2337                                       e->src->il.rtl->footer = b->il.rtl->footer;
2338                                       b->il.rtl->footer = NULL;
2339                                     }
2340                                   else
2341                                     {
2342                                       start_sequence ();
2343                                       e->src->il.rtl->footer = emit_barrier ();
2344                                       end_sequence ();
2345                                     }
2346                                 }
2347                         }
2348                       else
2349                         {
2350                           rtx last = get_last_bb_insn (b);
2351                           if (last && BARRIER_P (last))
2352                             FOR_EACH_EDGE (e, ei, b->preds)
2353                               if ((e->flags & EDGE_FALLTHRU))
2354                                 emit_barrier_after (BB_END (e->src));
2355                         }
2356                     }
2357                   delete_basic_block (b);
2358                   changed = true;
2359                   /* Avoid trying to remove ENTRY_BLOCK_PTR.  */
2360                   b = (c == ENTRY_BLOCK_PTR ? c->next_bb : c);
2361                   continue;
2362                 }
2363
2364               /* Remove code labels no longer used.  */
2365               if (single_pred_p (b)
2366                   && (single_pred_edge (b)->flags & EDGE_FALLTHRU)
2367                   && !(single_pred_edge (b)->flags & EDGE_COMPLEX)
2368                   && LABEL_P (BB_HEAD (b))
2369                   /* If the previous block ends with a branch to this
2370                      block, we can't delete the label.  Normally this
2371                      is a condjump that is yet to be simplified, but
2372                      if CASE_DROPS_THRU, this can be a tablejump with
2373                      some element going to the same place as the
2374                      default (fallthru).  */
2375                   && (single_pred (b) == ENTRY_BLOCK_PTR
2376                       || !JUMP_P (BB_END (single_pred (b)))
2377                       || ! label_is_jump_target_p (BB_HEAD (b),
2378                                                    BB_END (single_pred (b)))))
2379                 {
2380                   rtx label = BB_HEAD (b);
2381
2382                   delete_insn_chain (label, label, false);
2383                   /* If the case label is undeletable, move it after the
2384                      BASIC_BLOCK note.  */
2385                   if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL)
2386                     {
2387                       rtx bb_note = NEXT_INSN (BB_HEAD (b));
2388
2389                       reorder_insns_nobb (label, label, bb_note);
2390                       BB_HEAD (b) = bb_note;
2391                       if (BB_END (b) == bb_note)
2392                         BB_END (b) = label;
2393                     }
2394                   if (dump_file)
2395                     fprintf (dump_file, "Deleted label in block %i.\n",
2396                              b->index);
2397                 }
2398
2399               /* If we fall through an empty block, we can remove it.  */
2400               if (!(mode & CLEANUP_CFGLAYOUT)
2401                   && single_pred_p (b)
2402                   && (single_pred_edge (b)->flags & EDGE_FALLTHRU)
2403                   && !LABEL_P (BB_HEAD (b))
2404                   && FORWARDER_BLOCK_P (b)
2405                   /* Note that forwarder_block_p true ensures that
2406                      there is a successor for this block.  */
2407                   && (single_succ_edge (b)->flags & EDGE_FALLTHRU)
2408                   && n_basic_blocks > NUM_FIXED_BLOCKS + 1)
2409                 {
2410                   if (dump_file)
2411                     fprintf (dump_file,
2412                              "Deleting fallthru block %i.\n",
2413                              b->index);
2414
2415                   c = b->prev_bb == ENTRY_BLOCK_PTR ? b->next_bb : b->prev_bb;
2416                   redirect_edge_succ_nodup (single_pred_edge (b),
2417                                             single_succ (b));
2418                   delete_basic_block (b);
2419                   changed = true;
2420                   b = c;
2421                   continue;
2422                 }
2423
2424               /* Merge B with its single successor, if any.  */
2425               if (single_succ_p (b)
2426                   && (s = single_succ_edge (b))
2427                   && !(s->flags & EDGE_COMPLEX)
2428                   && (c = s->dest) != EXIT_BLOCK_PTR
2429                   && single_pred_p (c)
2430                   && b != c)
2431                 {
2432                   /* When not in cfg_layout mode use code aware of reordering
2433                      INSN.  This code possibly creates new basic blocks so it
2434                      does not fit merge_blocks interface and is kept here in
2435                      hope that it will become useless once more of compiler
2436                      is transformed to use cfg_layout mode.  */
2437
2438                   if ((mode & CLEANUP_CFGLAYOUT)
2439                       && can_merge_blocks_p (b, c))
2440                     {
2441                       merge_blocks (b, c);
2442                       update_forwarder_flag (b);
2443                       changed_here = true;
2444                     }
2445                   else if (!(mode & CLEANUP_CFGLAYOUT)
2446                            /* If the jump insn has side effects,
2447                               we can't kill the edge.  */
2448                            && (!JUMP_P (BB_END (b))
2449                                || (reload_completed
2450                                    ? simplejump_p (BB_END (b))
2451                                    : (onlyjump_p (BB_END (b))
2452                                       && !tablejump_p (BB_END (b),
2453                                                        NULL, NULL))))
2454                            && (next = merge_blocks_move (s, b, c, mode)))
2455                       {
2456                         b = next;
2457                         changed_here = true;
2458                       }
2459                 }
2460
2461               /* Simplify branch over branch.  */
2462               if ((mode & CLEANUP_EXPENSIVE)
2463                    && !(mode & CLEANUP_CFGLAYOUT)
2464                    && try_simplify_condjump (b))
2465                 changed_here = true;
2466
2467               /* If B has a single outgoing edge, but uses a
2468                  non-trivial jump instruction without side-effects, we
2469                  can either delete the jump entirely, or replace it
2470                  with a simple unconditional jump.  */
2471               if (single_succ_p (b)
2472                   && single_succ (b) != EXIT_BLOCK_PTR
2473                   && onlyjump_p (BB_END (b))
2474                   && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX)
2475                   && try_redirect_by_replacing_jump (single_succ_edge (b),
2476                                                      single_succ (b),
2477                                                      (mode & CLEANUP_CFGLAYOUT) != 0))
2478                 {
2479                   update_forwarder_flag (b);
2480                   changed_here = true;
2481                 }
2482
2483               /* Simplify branch to branch.  */
2484               if (try_forward_edges (mode, b))
2485                 changed_here = true;
2486
2487               /* Look for shared code between blocks.  */
2488               if ((mode & CLEANUP_CROSSJUMP)
2489                   && try_crossjump_bb (mode, b))
2490                 changed_here = true;
2491
2492               if ((mode & CLEANUP_CROSSJUMP)
2493                   /* This can lengthen register lifetimes.  Do it only after
2494                      reload.  */
2495                   && reload_completed
2496                   && try_head_merge_bb (b))
2497                 changed_here = true;
2498
2499               /* Don't get confused by the index shift caused by
2500                  deleting blocks.  */
2501               if (!changed_here)
2502                 b = b->next_bb;
2503               else
2504                 changed = true;
2505             }
2506
2507           if ((mode & CLEANUP_CROSSJUMP)
2508               && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
2509             changed = true;
2510
2511           if (block_was_dirty)
2512             {
2513               /* This should only be set by head-merging.  */
2514               gcc_assert (mode & CLEANUP_CROSSJUMP);
2515               df_analyze ();
2516             }
2517
2518 #ifdef ENABLE_CHECKING
2519           if (changed)
2520             verify_flow_info ();
2521 #endif
2522
2523           changed_overall |= changed;
2524           first_pass = false;
2525         }
2526       while (changed);
2527     }
2528
2529   FOR_ALL_BB (b)
2530     b->flags &= ~(BB_FORWARDER_BLOCK | BB_NONTHREADABLE_BLOCK);
2531
2532   return changed_overall;
2533 }
2534 \f
2535 /* Delete all unreachable basic blocks.  */
2536
2537 bool
2538 delete_unreachable_blocks (void)
2539 {
2540   bool changed = false;
2541   basic_block b, prev_bb;
2542
2543   find_unreachable_blocks ();
2544
2545   /* When we're in GIMPLE mode and there may be debug insns, we should
2546      delete blocks in reverse dominator order, so as to get a chance
2547      to substitute all released DEFs into debug stmts.  If we don't
2548      have dominators information, walking blocks backward gets us a
2549      better chance of retaining most debug information than
2550      otherwise.  */
2551   if (MAY_HAVE_DEBUG_STMTS && current_ir_type () == IR_GIMPLE
2552       && dom_info_available_p (CDI_DOMINATORS))
2553     {
2554       for (b = EXIT_BLOCK_PTR->prev_bb; b != ENTRY_BLOCK_PTR; b = prev_bb)
2555         {
2556           prev_bb = b->prev_bb;
2557
2558           if (!(b->flags & BB_REACHABLE))
2559             {
2560               /* Speed up the removal of blocks that don't dominate
2561                  others.  Walking backwards, this should be the common
2562                  case.  */
2563               if (!first_dom_son (CDI_DOMINATORS, b))
2564                 delete_basic_block (b);
2565               else
2566                 {
2567                   VEC (basic_block, heap) *h
2568                     = get_all_dominated_blocks (CDI_DOMINATORS, b);
2569
2570                   while (VEC_length (basic_block, h))
2571                     {
2572                       b = VEC_pop (basic_block, h);
2573
2574                       prev_bb = b->prev_bb;
2575
2576                       gcc_assert (!(b->flags & BB_REACHABLE));
2577
2578                       delete_basic_block (b);
2579                     }
2580
2581                   VEC_free (basic_block, heap, h);
2582                 }
2583
2584               changed = true;
2585             }
2586         }
2587     }
2588   else
2589     {
2590       for (b = EXIT_BLOCK_PTR->prev_bb; b != ENTRY_BLOCK_PTR; b = prev_bb)
2591         {
2592           prev_bb = b->prev_bb;
2593
2594           if (!(b->flags & BB_REACHABLE))
2595             {
2596               delete_basic_block (b);
2597               changed = true;
2598             }
2599         }
2600     }
2601
2602   if (changed)
2603     tidy_fallthru_edges ();
2604   return changed;
2605 }
2606
2607 /* Delete any jump tables never referenced.  We can't delete them at the
2608    time of removing tablejump insn as they are referenced by the preceding
2609    insns computing the destination, so we delay deleting and garbagecollect
2610    them once life information is computed.  */
2611 void
2612 delete_dead_jumptables (void)
2613 {
2614   basic_block bb;
2615
2616   /* A dead jump table does not belong to any basic block.  Scan insns
2617      between two adjacent basic blocks.  */
2618   FOR_EACH_BB (bb)
2619     {
2620       rtx insn, next;
2621
2622       for (insn = NEXT_INSN (BB_END (bb));
2623            insn && !NOTE_INSN_BASIC_BLOCK_P (insn);
2624            insn = next)
2625         {
2626           next = NEXT_INSN (insn);
2627           if (LABEL_P (insn)
2628               && LABEL_NUSES (insn) == LABEL_PRESERVE_P (insn)
2629               && JUMP_TABLE_DATA_P (next))
2630             {
2631               rtx label = insn, jump = next;
2632
2633               if (dump_file)
2634                 fprintf (dump_file, "Dead jumptable %i removed\n",
2635                          INSN_UID (insn));
2636
2637               next = NEXT_INSN (next);
2638               delete_insn (jump);
2639               delete_insn (label);
2640             }
2641         }
2642     }
2643 }
2644
2645 \f
2646 /* Tidy the CFG by deleting unreachable code and whatnot.  */
2647
2648 bool
2649 cleanup_cfg (int mode)
2650 {
2651   bool changed = false;
2652
2653   /* Set the cfglayout mode flag here.  We could update all the callers
2654      but that is just inconvenient, especially given that we eventually
2655      want to have cfglayout mode as the default.  */
2656   if (current_ir_type () == IR_RTL_CFGLAYOUT)
2657     mode |= CLEANUP_CFGLAYOUT;
2658
2659   timevar_push (TV_CLEANUP_CFG);
2660   if (delete_unreachable_blocks ())
2661     {
2662       changed = true;
2663       /* We've possibly created trivially dead code.  Cleanup it right
2664          now to introduce more opportunities for try_optimize_cfg.  */
2665       if (!(mode & (CLEANUP_NO_INSN_DEL))
2666           && !reload_completed)
2667         delete_trivially_dead_insns (get_insns (), max_reg_num ());
2668     }
2669
2670   compact_blocks ();
2671
2672   /* To tail-merge blocks ending in the same noreturn function (e.g.
2673      a call to abort) we have to insert fake edges to exit.  Do this
2674      here once.  The fake edges do not interfere with any other CFG
2675      cleanups.  */
2676   if (mode & CLEANUP_CROSSJUMP)
2677     add_noreturn_fake_exit_edges ();
2678
2679   if (!dbg_cnt (cfg_cleanup))
2680     return changed;
2681
2682   while (try_optimize_cfg (mode))
2683     {
2684       delete_unreachable_blocks (), changed = true;
2685       if (!(mode & CLEANUP_NO_INSN_DEL))
2686         {
2687           /* Try to remove some trivially dead insns when doing an expensive
2688              cleanup.  But delete_trivially_dead_insns doesn't work after
2689              reload (it only handles pseudos) and run_fast_dce is too costly
2690              to run in every iteration.
2691
2692              For effective cross jumping, we really want to run a fast DCE to
2693              clean up any dead conditions, or they get in the way of performing
2694              useful tail merges.
2695
2696              Other transformations in cleanup_cfg are not so sensitive to dead
2697              code, so delete_trivially_dead_insns or even doing nothing at all
2698              is good enough.  */
2699           if ((mode & CLEANUP_EXPENSIVE) && !reload_completed
2700               && !delete_trivially_dead_insns (get_insns (), max_reg_num ()))
2701             break;
2702           if ((mode & CLEANUP_CROSSJUMP) && crossjumps_occured)
2703             run_fast_dce ();
2704         }
2705       else
2706         break;
2707     }
2708
2709   if (mode & CLEANUP_CROSSJUMP)
2710     remove_fake_exit_edges ();
2711
2712   /* Don't call delete_dead_jumptables in cfglayout mode, because
2713      that function assumes that jump tables are in the insns stream.
2714      But we also don't _have_ to delete dead jumptables in cfglayout
2715      mode because we shouldn't even be looking at things that are
2716      not in a basic block.  Dead jumptables are cleaned up when
2717      going out of cfglayout mode.  */
2718   if (!(mode & CLEANUP_CFGLAYOUT))
2719     delete_dead_jumptables ();
2720
2721   timevar_pop (TV_CLEANUP_CFG);
2722
2723   return changed;
2724 }
2725 \f
2726 static unsigned int
2727 rest_of_handle_jump (void)
2728 {
2729   if (crtl->tail_call_emit)
2730     fixup_tail_calls ();
2731   return 0;
2732 }
2733
2734 struct rtl_opt_pass pass_jump =
2735 {
2736  {
2737   RTL_PASS,
2738   "sibling",                            /* name */
2739   NULL,                                 /* gate */
2740   rest_of_handle_jump,                  /* execute */
2741   NULL,                                 /* sub */
2742   NULL,                                 /* next */
2743   0,                                    /* static_pass_number */
2744   TV_JUMP,                              /* tv_id */
2745   0,                                    /* properties_required */
2746   0,                                    /* properties_provided */
2747   0,                                    /* properties_destroyed */
2748   TODO_ggc_collect,                     /* todo_flags_start */
2749   TODO_verify_flow,                     /* todo_flags_finish */
2750  }
2751 };
2752
2753
2754 static unsigned int
2755 rest_of_handle_jump2 (void)
2756 {
2757   delete_trivially_dead_insns (get_insns (), max_reg_num ());
2758   if (dump_file)
2759     dump_flow_info (dump_file, dump_flags);
2760   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
2761                | (flag_thread_jumps ? CLEANUP_THREADING : 0));
2762   return 0;
2763 }
2764
2765
2766 struct rtl_opt_pass pass_jump2 =
2767 {
2768  {
2769   RTL_PASS,
2770   "jump",                               /* name */
2771   NULL,                                 /* gate */
2772   rest_of_handle_jump2,                 /* execute */
2773   NULL,                                 /* sub */
2774   NULL,                                 /* next */
2775   0,                                    /* static_pass_number */
2776   TV_JUMP,                              /* tv_id */
2777   0,                                    /* properties_required */
2778   0,                                    /* properties_provided */
2779   0,                                    /* properties_destroyed */
2780   TODO_ggc_collect,                     /* todo_flags_start */
2781   TODO_dump_func | TODO_verify_rtl_sharing,/* todo_flags_finish */
2782  }
2783 };
2784
2785