OSDN Git Service

PR target/12070
[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 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 /* This file contains optimizer of the control flow.  The main entrypoint is
23    cleanup_cfg.  Following optimizations are performed:
24
25    - Unreachable blocks removal
26    - Edge forwarding (edge to the forwarder block is forwarded to it's
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 "basic-block.h"
41 #include "timevar.h"
42 #include "output.h"
43 #include "insn-config.h"
44 #include "flags.h"
45 #include "recog.h"
46 #include "toplev.h"
47 #include "cselib.h"
48 #include "params.h"
49 #include "tm_p.h"
50 #include "target.h"
51
52 /* cleanup_cfg maintains following flags for each basic block.  */
53
54 enum bb_flags
55 {
56     /* Set if BB is the forwarder block to avoid too many
57        forwarder_block_p calls.  */
58     BB_FORWARDER_BLOCK = 1,
59     BB_NONTHREADABLE_BLOCK = 2
60 };
61
62 #define BB_FLAGS(BB) (enum bb_flags) (BB)->aux
63 #define BB_SET_FLAG(BB, FLAG) \
64   (BB)->aux = (void *) (long) ((enum bb_flags) (BB)->aux | (FLAG))
65 #define BB_CLEAR_FLAG(BB, FLAG) \
66   (BB)->aux = (void *) (long) ((enum bb_flags) (BB)->aux & ~(FLAG))
67
68 #define FORWARDER_BLOCK_P(BB) (BB_FLAGS (BB) & BB_FORWARDER_BLOCK)
69
70 static bool try_crossjump_to_edge (int, edge, edge);
71 static bool try_crossjump_bb (int, basic_block);
72 static bool outgoing_edges_match (int, basic_block, basic_block);
73 static int flow_find_cross_jump (int, basic_block, basic_block, rtx *, rtx *);
74 static bool insns_match_p (int, rtx, rtx);
75
76 static bool label_is_jump_target_p (rtx, rtx);
77 static bool tail_recursion_label_p (rtx);
78 static void merge_blocks_move_predecessor_nojumps (basic_block, basic_block);
79 static void merge_blocks_move_successor_nojumps (basic_block, basic_block);
80 static bool try_optimize_cfg (int);
81 static bool try_simplify_condjump (basic_block);
82 static bool try_forward_edges (int, basic_block);
83 static edge thread_jump (int, edge, basic_block);
84 static bool mark_effect (rtx, bitmap);
85 static void notice_new_block (basic_block);
86 static void update_forwarder_flag (basic_block);
87 static int mentions_nonequal_regs (rtx *, void *);
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_SET_FLAG (bb, 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_SET_FLAG (bb, BB_FORWARDER_BLOCK);
108   else
109     BB_CLEAR_FLAG (bb, 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   rtx insn, next;
122   rtx end;
123
124   /* Verify that there are exactly two successors.  */
125   if (!cbranch_block->succ
126       || !cbranch_block->succ->succ_next
127       || cbranch_block->succ->succ_next->succ_next)
128     return false;
129
130   /* Verify that we've got a normal conditional branch at the end
131      of the block.  */
132   cbranch_insn = cbranch_block->end;
133   if (!any_condjump_p (cbranch_insn))
134     return false;
135
136   cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block);
137   cbranch_jump_edge = BRANCH_EDGE (cbranch_block);
138
139   /* The next block must not have multiple predecessors, must not
140      be the last block in the function, and must contain just the
141      unconditional jump.  */
142   jump_block = cbranch_fallthru_edge->dest;
143   if (jump_block->pred->pred_next
144       || jump_block->next_bb == EXIT_BLOCK_PTR
145       || !FORWARDER_BLOCK_P (jump_block))
146     return false;
147   jump_dest_block = jump_block->succ->dest;
148
149   /* The conditional branch must target the block after the
150      unconditional branch.  */
151   cbranch_dest_block = cbranch_jump_edge->dest;
152
153   if (!can_fallthru (jump_block, cbranch_dest_block))
154     return false;
155
156   /* Invert the conditional branch.  */
157   if (!invert_jump (cbranch_insn, block_label (jump_dest_block), 0))
158     return false;
159
160   if (rtl_dump_file)
161     fprintf (rtl_dump_file, "Simplifying condjump %i around jump %i\n",
162              INSN_UID (cbranch_insn), INSN_UID (jump_block->end));
163
164   /* Success.  Update the CFG to match.  Note that after this point
165      the edge variable names appear backwards; the redirection is done
166      this way to preserve edge profile data.  */
167   cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge,
168                                                 cbranch_dest_block);
169   cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge,
170                                                     jump_dest_block);
171   cbranch_jump_edge->flags |= EDGE_FALLTHRU;
172   cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
173   update_br_prob_note (cbranch_block);
174
175   end = jump_block->end;
176   /* Deleting a block may produce unreachable code warning even when we are
177      not deleting anything live.  Supress it by moving all the line number
178      notes out of the block.  */
179   for (insn = jump_block->head; insn != NEXT_INSN (jump_block->end);
180        insn = next)
181     {
182       next = NEXT_INSN (insn);
183       if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
184         {
185           reorder_insns (insn, insn, end);
186           end = insn;
187         }
188     }
189   /* Delete the block with the unconditional jump, and clean up the mess.  */
190   delete_block (jump_block);
191   tidy_fallthru_edge (cbranch_jump_edge, cbranch_block, cbranch_dest_block);
192
193   return true;
194 }
195 \f
196 /* Attempt to prove that operation is NOOP using CSElib or mark the effect
197    on register.  Used by jump threading.  */
198
199 static bool
200 mark_effect (rtx exp, regset nonequal)
201 {
202   int regno;
203   rtx dest;
204   switch (GET_CODE (exp))
205     {
206       /* In case we do clobber the register, mark it as equal, as we know the
207          value is dead so it don't have to match.  */
208     case CLOBBER:
209       if (REG_P (XEXP (exp, 0)))
210         {
211           dest = XEXP (exp, 0);
212           regno = REGNO (dest);
213           CLEAR_REGNO_REG_SET (nonequal, regno);
214           if (regno < FIRST_PSEUDO_REGISTER)
215             {
216               int n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
217               while (--n > 0)
218                 CLEAR_REGNO_REG_SET (nonequal, regno + n);
219             }
220         }
221       return false;
222
223     case SET:
224       if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp)))
225         return false;
226       dest = SET_DEST (exp);
227       if (dest == pc_rtx)
228         return false;
229       if (!REG_P (dest))
230         return true;
231       regno = REGNO (dest);
232       SET_REGNO_REG_SET (nonequal, regno);
233       if (regno < FIRST_PSEUDO_REGISTER)
234         {
235           int n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
236           while (--n > 0)
237             SET_REGNO_REG_SET (nonequal, regno + n);
238         }
239       return false;
240
241     default:
242       return false;
243     }
244 }
245
246 /* Return nonzero if X is a register set in regset DATA.
247    Called via for_each_rtx.  */
248 static int
249 mentions_nonequal_regs (rtx *x, void *data)
250 {
251   regset nonequal = (regset) data;
252   if (REG_P (*x))
253     {
254       int regno;
255
256       regno = REGNO (*x);
257       if (REGNO_REG_SET_P (nonequal, regno))
258         return 1;
259       if (regno < FIRST_PSEUDO_REGISTER)
260         {
261           int n = HARD_REGNO_NREGS (regno, GET_MODE (*x));
262           while (--n > 0)
263             if (REGNO_REG_SET_P (nonequal, regno + n))
264               return 1;
265         }
266     }
267   return 0;
268 }
269 /* Attempt to prove that the basic block B will have no side effects and
270    always continues in the same edge if reached via E.  Return the edge
271    if exist, NULL otherwise.  */
272
273 static edge
274 thread_jump (int mode, edge e, basic_block b)
275 {
276   rtx set1, set2, cond1, cond2, insn;
277   enum rtx_code code1, code2, reversed_code2;
278   bool reverse1 = false;
279   int i;
280   regset nonequal;
281   bool failed = false;
282
283   if (BB_FLAGS (b) & BB_NONTHREADABLE_BLOCK)
284     return NULL;
285
286   /* At the moment, we do handle only conditional jumps, but later we may
287      want to extend this code to tablejumps and others.  */
288   if (!e->src->succ->succ_next || e->src->succ->succ_next->succ_next)
289     return NULL;
290   if (!b->succ || !b->succ->succ_next || b->succ->succ_next->succ_next)
291     {
292       BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
293       return NULL;
294     }
295
296   /* Second branch must end with onlyjump, as we will eliminate the jump.  */
297   if (!any_condjump_p (e->src->end))
298     return NULL;
299
300   if (!any_condjump_p (b->end) || !onlyjump_p (b->end))
301     {
302       BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
303       return NULL;
304     }
305
306   set1 = pc_set (e->src->end);
307   set2 = pc_set (b->end);
308   if (((e->flags & EDGE_FALLTHRU) != 0)
309       != (XEXP (SET_SRC (set1), 1) == pc_rtx))
310     reverse1 = true;
311
312   cond1 = XEXP (SET_SRC (set1), 0);
313   cond2 = XEXP (SET_SRC (set2), 0);
314   if (reverse1)
315     code1 = reversed_comparison_code (cond1, e->src->end);
316   else
317     code1 = GET_CODE (cond1);
318
319   code2 = GET_CODE (cond2);
320   reversed_code2 = reversed_comparison_code (cond2, b->end);
321
322   if (!comparison_dominates_p (code1, code2)
323       && !comparison_dominates_p (code1, reversed_code2))
324     return NULL;
325
326   /* Ensure that the comparison operators are equivalent.
327      ??? This is far too pessimistic.  We should allow swapped operands,
328      different CCmodes, or for example comparisons for interval, that
329      dominate even when operands are not equivalent.  */
330   if (!rtx_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
331       || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
332     return NULL;
333
334   /* Short circuit cases where block B contains some side effects, as we can't
335      safely bypass it.  */
336   for (insn = NEXT_INSN (b->head); insn != NEXT_INSN (b->end);
337        insn = NEXT_INSN (insn))
338     if (INSN_P (insn) && side_effects_p (PATTERN (insn)))
339       {
340         BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
341         return NULL;
342       }
343
344   cselib_init ();
345
346   /* First process all values computed in the source basic block.  */
347   for (insn = NEXT_INSN (e->src->head); insn != NEXT_INSN (e->src->end);
348        insn = NEXT_INSN (insn))
349     if (INSN_P (insn))
350       cselib_process_insn (insn);
351
352   nonequal = BITMAP_XMALLOC();
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 (b->head); insn != NEXT_INSN (b->end) && !failed;
360        insn = NEXT_INSN (insn))
361     {
362       if (INSN_P (insn))
363         {
364           rtx pat = PATTERN (insn);
365
366           if (GET_CODE (pat) == PARALLEL)
367             {
368               for (i = 0; i < XVECLEN (pat, 0); i++)
369                 failed |= mark_effect (XVECEXP (pat, 0, i), nonequal);
370             }
371           else
372             failed |= mark_effect (pat, nonequal);
373         }
374
375       cselib_process_insn (insn);
376     }
377
378   /* Later we should clear nonequal of dead registers.  So far we don't
379      have life information in cfg_cleanup.  */
380   if (failed)
381     {
382       BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
383       goto failed_exit;
384     }
385
386   /* cond2 must not mention any register that is not equal to the
387      former block.  */
388   if (for_each_rtx (&cond2, mentions_nonequal_regs, nonequal))
389     goto failed_exit;
390
391   /* In case liveness information is available, we need to prove equivalence
392      only of the live values.  */
393   if (mode & CLEANUP_UPDATE_LIFE)
394     AND_REG_SET (nonequal, b->global_live_at_end);
395
396   EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, goto failed_exit;);
397
398   BITMAP_XFREE (nonequal);
399   cselib_finish ();
400   if ((comparison_dominates_p (code1, code2) != 0)
401       != (XEXP (SET_SRC (set2), 1) == pc_rtx))
402     return BRANCH_EDGE (b);
403   else
404     return FALLTHRU_EDGE (b);
405
406 failed_exit:
407   BITMAP_XFREE (nonequal);
408   cselib_finish ();
409   return NULL;
410 }
411 \f
412 /* Attempt to forward edges leaving basic block B.
413    Return true if successful.  */
414
415 static bool
416 try_forward_edges (int mode, basic_block b)
417 {
418   bool changed = false;
419   edge e, next, *threaded_edges = NULL;
420
421   for (e = b->succ; e; e = next)
422     {
423       basic_block target, first;
424       int counter;
425       bool threaded = false;
426       int nthreaded_edges = 0;
427
428       next = e->succ_next;
429
430       /* Skip complex edges because we don't know how to update them.
431
432          Still handle fallthru edges, as we can succeed to forward fallthru
433          edge to the same place as the branch edge of conditional branch
434          and turn conditional branch to an unconditional branch.  */
435       if (e->flags & EDGE_COMPLEX)
436         continue;
437
438       target = first = e->dest;
439       counter = 0;
440
441       while (counter < n_basic_blocks)
442         {
443           basic_block new_target = NULL;
444           bool new_target_threaded = false;
445
446           if (FORWARDER_BLOCK_P (target)
447               && target->succ->dest != EXIT_BLOCK_PTR)
448             {
449               /* Bypass trivial infinite loops.  */
450               if (target == target->succ->dest)
451                 counter = n_basic_blocks;
452               new_target = target->succ->dest;
453             }
454
455           /* Allow to thread only over one edge at time to simplify updating
456              of probabilities.  */
457           else if (mode & CLEANUP_THREADING)
458             {
459               edge t = thread_jump (mode, e, target);
460               if (t)
461                 {
462                   if (!threaded_edges)
463                     threaded_edges = xmalloc (sizeof (*threaded_edges)
464                                               * n_basic_blocks);
465                   else
466                     {
467                       int i;
468
469                       /* Detect an infinite loop across blocks not
470                          including the start block.  */
471                       for (i = 0; i < nthreaded_edges; ++i)
472                         if (threaded_edges[i] == t)
473                           break;
474                       if (i < nthreaded_edges)
475                         {
476                           counter = n_basic_blocks;
477                           break;
478                         }
479                     }
480
481                   /* Detect an infinite loop across the start block.  */
482                   if (t->dest == b)
483                     break;
484
485                   if (nthreaded_edges >= n_basic_blocks)
486                     abort ();
487                   threaded_edges[nthreaded_edges++] = t;
488
489                   new_target = t->dest;
490                   new_target_threaded = true;
491                 }
492             }
493
494           if (!new_target)
495             break;
496
497           /* Avoid killing of loop pre-headers, as it is the place loop
498              optimizer wants to hoist code to.
499
500              For fallthru forwarders, the LOOP_BEG note must appear between
501              the header of block and CODE_LABEL of the loop, for non forwarders
502              it must appear before the JUMP_INSN.  */
503           if ((mode & CLEANUP_PRE_LOOP) && optimize)
504             {
505               rtx insn = (target->succ->flags & EDGE_FALLTHRU
506                           ? target->head : prev_nonnote_insn (target->end));
507
508               if (GET_CODE (insn) != NOTE)
509                 insn = NEXT_INSN (insn);
510
511               for (; insn && GET_CODE (insn) != CODE_LABEL && !INSN_P (insn);
512                    insn = NEXT_INSN (insn))
513                 if (GET_CODE (insn) == NOTE
514                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
515                   break;
516
517               if (GET_CODE (insn) == NOTE)
518                 break;
519
520               /* Do not clean up branches to just past the end of a loop
521                  at this time; it can mess up the loop optimizer's
522                  recognition of some patterns.  */
523
524               insn = PREV_INSN (target->head);
525               if (insn && GET_CODE (insn) == NOTE
526                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
527                 break;
528             }
529
530           counter++;
531           target = new_target;
532           threaded |= new_target_threaded;
533         }
534
535       if (counter >= n_basic_blocks)
536         {
537           if (rtl_dump_file)
538             fprintf (rtl_dump_file, "Infinite loop in BB %i.\n",
539                      target->index);
540         }
541       else if (target == first)
542         ; /* We didn't do anything.  */
543       else
544         {
545           /* Save the values now, as the edge may get removed.  */
546           gcov_type edge_count = e->count;
547           int edge_probability = e->probability;
548           int edge_frequency;
549           int n = 0;
550
551           /* Don't force if target is exit block.  */
552           if (threaded && target != EXIT_BLOCK_PTR)
553             {
554               notice_new_block (redirect_edge_and_branch_force (e, target));
555               if (rtl_dump_file)
556                 fprintf (rtl_dump_file, "Conditionals threaded.\n");
557             }
558           else if (!redirect_edge_and_branch (e, target))
559             {
560               if (rtl_dump_file)
561                 fprintf (rtl_dump_file,
562                          "Forwarding edge %i->%i to %i failed.\n",
563                          b->index, e->dest->index, target->index);
564               continue;
565             }
566
567           /* We successfully forwarded the edge.  Now update profile
568              data: for each edge we traversed in the chain, remove
569              the original edge's execution count.  */
570           edge_frequency = ((edge_probability * b->frequency
571                              + REG_BR_PROB_BASE / 2)
572                             / REG_BR_PROB_BASE);
573
574           if (!FORWARDER_BLOCK_P (b) && forwarder_block_p (b))
575             BB_SET_FLAG (b, BB_FORWARDER_BLOCK);
576
577           do
578             {
579               edge t;
580
581               first->count -= edge_count;
582               if (first->count < 0)
583                 first->count = 0;
584               first->frequency -= edge_frequency;
585               if (first->frequency < 0)
586                 first->frequency = 0;
587               if (first->succ->succ_next)
588                 {
589                   edge e;
590                   int prob;
591                   if (n >= nthreaded_edges)
592                     abort ();
593                   t = threaded_edges [n++];
594                   if (t->src != first)
595                     abort ();
596                   if (first->frequency)
597                     prob = edge_frequency * REG_BR_PROB_BASE / first->frequency;
598                   else
599                     prob = 0;
600                   if (prob > t->probability)
601                     prob = t->probability;
602                   t->probability -= prob;
603                   prob = REG_BR_PROB_BASE - prob;
604                   if (prob <= 0)
605                     {
606                       first->succ->probability = REG_BR_PROB_BASE;
607                       first->succ->succ_next->probability = 0;
608                     }
609                   else
610                     for (e = first->succ; e; e = e->succ_next)
611                       e->probability = ((e->probability * REG_BR_PROB_BASE)
612                                         / (double) prob);
613                   update_br_prob_note (first);
614                 }
615               else
616                 {
617                   /* It is possible that as the result of
618                      threading we've removed edge as it is
619                      threaded to the fallthru edge.  Avoid
620                      getting out of sync.  */
621                   if (n < nthreaded_edges
622                       && first == threaded_edges [n]->src)
623                     n++;
624                   t = first->succ;
625                 }
626
627               t->count -= edge_count;
628               if (t->count < 0)
629                 t->count = 0;
630               first = t->dest;
631             }
632           while (first != target);
633
634           changed = true;
635         }
636     }
637
638   if (threaded_edges)
639     free (threaded_edges);
640   return changed;
641 }
642 \f
643 /* Return true if LABEL is a target of JUMP_INSN.  This applies only
644    to non-complex jumps.  That is, direct unconditional, conditional,
645    and tablejumps, but not computed jumps or returns.  It also does
646    not apply to the fallthru case of a conditional jump.  */
647
648 static bool
649 label_is_jump_target_p (rtx label, rtx jump_insn)
650 {
651   rtx tmp = JUMP_LABEL (jump_insn);
652
653   if (label == tmp)
654     return true;
655
656   if (tablejump_p (jump_insn, NULL, &tmp))
657     {
658       rtvec vec = XVEC (tmp, GET_CODE (tmp) == ADDR_DIFF_VEC);
659       int i, veclen = GET_NUM_ELEM (vec);
660
661       for (i = 0; i < veclen; ++i)
662         if (XEXP (RTVEC_ELT (vec, i), 0) == label)
663           return true;
664     }
665
666   return false;
667 }
668
669 /* Return true if LABEL is used for tail recursion.  */
670
671 static bool
672 tail_recursion_label_p (rtx label)
673 {
674   rtx x;
675
676   for (x = tail_recursion_label_list; x; x = XEXP (x, 1))
677     if (label == XEXP (x, 0))
678       return true;
679
680   return false;
681 }
682
683 /* Blocks A and B are to be merged into a single block.  A has no incoming
684    fallthru edge, so it can be moved before B without adding or modifying
685    any jumps (aside from the jump from A to B).  */
686
687 static void
688 merge_blocks_move_predecessor_nojumps (basic_block a, basic_block b)
689 {
690   rtx barrier;
691
692   barrier = next_nonnote_insn (a->end);
693   if (GET_CODE (barrier) != BARRIER)
694     abort ();
695   delete_insn (barrier);
696
697   /* Move block and loop notes out of the chain so that we do not
698      disturb their order.
699
700      ??? A better solution would be to squeeze out all the non-nested notes
701      and adjust the block trees appropriately.   Even better would be to have
702      a tighter connection between block trees and rtl so that this is not
703      necessary.  */
704   if (squeeze_notes (&a->head, &a->end))
705     abort ();
706
707   /* Scramble the insn chain.  */
708   if (a->end != PREV_INSN (b->head))
709     reorder_insns_nobb (a->head, a->end, PREV_INSN (b->head));
710   a->flags |= BB_DIRTY;
711
712   if (rtl_dump_file)
713     fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n",
714              a->index, b->index);
715
716   /* Swap the records for the two blocks around.  */
717
718   unlink_block (a);
719   link_block (a, b->prev_bb);
720
721   /* Now blocks A and B are contiguous.  Merge them.  */
722   merge_blocks (a, b);
723 }
724
725 /* Blocks A and B are to be merged into a single block.  B has no outgoing
726    fallthru edge, so it can be moved after A without adding or modifying
727    any jumps (aside from the jump from A to B).  */
728
729 static void
730 merge_blocks_move_successor_nojumps (basic_block a, basic_block b)
731 {
732   rtx barrier, real_b_end;
733   rtx label, table;
734
735   real_b_end = b->end;
736
737   /* If there is a jump table following block B temporarily add the jump table
738      to block B so that it will also be moved to the correct location.  */
739   if (tablejump_p (b->end, &label, &table)
740       && prev_active_insn (label) == b->end)
741     {
742       b->end = table;
743     }
744
745   /* There had better have been a barrier there.  Delete it.  */
746   barrier = NEXT_INSN (b->end);
747   if (barrier && GET_CODE (barrier) == BARRIER)
748     delete_insn (barrier);
749
750   /* Move block and loop notes out of the chain so that we do not
751      disturb their order.
752
753      ??? A better solution would be to squeeze out all the non-nested notes
754      and adjust the block trees appropriately.   Even better would be to have
755      a tighter connection between block trees and rtl so that this is not
756      necessary.  */
757   if (squeeze_notes (&b->head, &b->end))
758     abort ();
759
760   /* Scramble the insn chain.  */
761   reorder_insns_nobb (b->head, b->end, a->end);
762
763   /* Restore the real end of b.  */
764   b->end = real_b_end;
765
766   if (rtl_dump_file)
767     fprintf (rtl_dump_file, "Moved block %d after %d and merged.\n",
768              b->index, a->index);
769
770   /* Now blocks A and B are contiguous.  Merge them.  */
771   merge_blocks (a, b);
772 }
773
774 /* Attempt to merge basic blocks that are potentially non-adjacent.
775    Return NULL iff the attempt failed, otherwise return basic block
776    where cleanup_cfg should continue.  Because the merging commonly
777    moves basic block away or introduces another optimization
778    possibility, return basic block just before B so cleanup_cfg don't
779    need to iterate.
780
781    It may be good idea to return basic block before C in the case
782    C has been moved after B and originally appeared earlier in the
783    insn sequence, but we have no information available about the
784    relative ordering of these two.  Hopefully it is not too common.  */
785
786 static basic_block
787 merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
788 {
789   basic_block next;
790   /* If C has a tail recursion label, do not merge.  There is no
791      edge recorded from the call_placeholder back to this label, as
792      that would make optimize_sibling_and_tail_recursive_calls more
793      complex for no gain.  */
794   if ((mode & CLEANUP_PRE_SIBCALL)
795       && GET_CODE (c->head) == CODE_LABEL
796       && tail_recursion_label_p (c->head))
797     return NULL;
798
799   /* If B has a fallthru edge to C, no need to move anything.  */
800   if (e->flags & EDGE_FALLTHRU)
801     {
802       int b_index = b->index, c_index = c->index;
803       merge_blocks (b, c);
804       update_forwarder_flag (b);
805
806       if (rtl_dump_file)
807         fprintf (rtl_dump_file, "Merged %d and %d without moving.\n",
808                  b_index, c_index);
809
810       return b->prev_bb == ENTRY_BLOCK_PTR ? b : b->prev_bb;
811     }
812
813   /* Otherwise we will need to move code around.  Do that only if expensive
814      transformations are allowed.  */
815   else if (mode & CLEANUP_EXPENSIVE)
816     {
817       edge tmp_edge, b_fallthru_edge;
818       bool c_has_outgoing_fallthru;
819       bool b_has_incoming_fallthru;
820
821       /* Avoid overactive code motion, as the forwarder blocks should be
822          eliminated by edge redirection instead.  One exception might have
823          been if B is a forwarder block and C has no fallthru edge, but
824          that should be cleaned up by bb-reorder instead.  */
825       if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c))
826         return NULL;
827
828       /* We must make sure to not munge nesting of lexical blocks,
829          and loop notes.  This is done by squeezing out all the notes
830          and leaving them there to lie.  Not ideal, but functional.  */
831
832       for (tmp_edge = c->succ; tmp_edge; tmp_edge = tmp_edge->succ_next)
833         if (tmp_edge->flags & EDGE_FALLTHRU)
834           break;
835
836       c_has_outgoing_fallthru = (tmp_edge != NULL);
837
838       for (tmp_edge = b->pred; tmp_edge; tmp_edge = tmp_edge->pred_next)
839         if (tmp_edge->flags & EDGE_FALLTHRU)
840           break;
841
842       b_has_incoming_fallthru = (tmp_edge != NULL);
843       b_fallthru_edge = tmp_edge;
844       next = b->prev_bb;
845       if (next == c)
846         next = next->prev_bb;
847
848       /* Otherwise, we're going to try to move C after B.  If C does
849          not have an outgoing fallthru, then it can be moved
850          immediately after B without introducing or modifying jumps.  */
851       if (! c_has_outgoing_fallthru)
852         {
853           merge_blocks_move_successor_nojumps (b, c);
854           return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
855         }
856
857       /* If B does not have an incoming fallthru, then it can be moved
858          immediately before C without introducing or modifying jumps.
859          C cannot be the first block, so we do not have to worry about
860          accessing a non-existent block.  */
861
862       if (b_has_incoming_fallthru)
863         {
864           basic_block bb;
865
866           if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
867             return NULL;
868           bb = force_nonfallthru (b_fallthru_edge);
869           if (bb)
870             notice_new_block (bb);
871         }
872
873       merge_blocks_move_predecessor_nojumps (b, c);
874       return next == ENTRY_BLOCK_PTR ? next->next_bb : next;
875     }
876
877   return NULL;
878 }
879 \f
880
881 /* Return true if I1 and I2 are equivalent and thus can be crossjumped.  */
882
883 static bool
884 insns_match_p (int mode ATTRIBUTE_UNUSED, rtx i1, rtx i2)
885 {
886   rtx p1, p2;
887
888   /* Verify that I1 and I2 are equivalent.  */
889   if (GET_CODE (i1) != GET_CODE (i2))
890     return false;
891
892   p1 = PATTERN (i1);
893   p2 = PATTERN (i2);
894
895   if (GET_CODE (p1) != GET_CODE (p2))
896     return false;
897
898   /* If this is a CALL_INSN, compare register usage information.
899      If we don't check this on stack register machines, the two
900      CALL_INSNs might be merged leaving reg-stack.c with mismatching
901      numbers of stack registers in the same basic block.
902      If we don't check this on machines with delay slots, a delay slot may
903      be filled that clobbers a parameter expected by the subroutine.
904
905      ??? We take the simple route for now and assume that if they're
906      equal, they were constructed identically.  */
907
908   if (GET_CODE (i1) == CALL_INSN
909       && (!rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
910                         CALL_INSN_FUNCTION_USAGE (i2))
911           || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2)))
912     return false;
913
914 #ifdef STACK_REGS
915   /* If cross_jump_death_matters is not 0, the insn's mode
916      indicates whether or not the insn contains any stack-like
917      regs.  */
918
919   if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
920     {
921       /* If register stack conversion has already been done, then
922          death notes must also be compared before it is certain that
923          the two instruction streams match.  */
924
925       rtx note;
926       HARD_REG_SET i1_regset, i2_regset;
927
928       CLEAR_HARD_REG_SET (i1_regset);
929       CLEAR_HARD_REG_SET (i2_regset);
930
931       for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
932         if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
933           SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
934
935       for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
936         if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0)))
937           SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
938
939       GO_IF_HARD_REG_EQUAL (i1_regset, i2_regset, done);
940
941       return false;
942
943     done:
944       ;
945     }
946 #endif
947
948   if (reload_completed
949       ? rtx_renumbered_equal_p (p1, p2) : rtx_equal_p (p1, p2))
950     return true;
951
952   /* Do not do EQUIV substitution after reload.  First, we're undoing the
953      work of reload_cse.  Second, we may be undoing the work of the post-
954      reload splitting pass.  */
955   /* ??? Possibly add a new phase switch variable that can be used by
956      targets to disallow the troublesome insns after splitting.  */
957   if (!reload_completed)
958     {
959       /* The following code helps take care of G++ cleanups.  */
960       rtx equiv1 = find_reg_equal_equiv_note (i1);
961       rtx equiv2 = find_reg_equal_equiv_note (i2);
962
963       if (equiv1 && equiv2
964           /* If the equivalences are not to a constant, they may
965              reference pseudos that no longer exist, so we can't
966              use them.  */
967           && (! reload_completed
968               || (CONSTANT_P (XEXP (equiv1, 0))
969                   && rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))))
970         {
971           rtx s1 = single_set (i1);
972           rtx s2 = single_set (i2);
973           if (s1 != 0 && s2 != 0
974               && rtx_renumbered_equal_p (SET_DEST (s1), SET_DEST (s2)))
975             {
976               validate_change (i1, &SET_SRC (s1), XEXP (equiv1, 0), 1);
977               validate_change (i2, &SET_SRC (s2), XEXP (equiv2, 0), 1);
978               if (! rtx_renumbered_equal_p (p1, p2))
979                 cancel_changes (0);
980               else if (apply_change_group ())
981                 return true;
982             }
983         }
984     }
985
986   return false;
987 }
988 \f
989 /* Look through the insns at the end of BB1 and BB2 and find the longest
990    sequence that are equivalent.  Store the first insns for that sequence
991    in *F1 and *F2 and return the sequence length.
992
993    To simplify callers of this function, if the blocks match exactly,
994    store the head of the blocks in *F1 and *F2.  */
995
996 static int
997 flow_find_cross_jump (int mode ATTRIBUTE_UNUSED, basic_block bb1,
998                       basic_block bb2, rtx *f1, rtx *f2)
999 {
1000   rtx i1, i2, last1, last2, afterlast1, afterlast2;
1001   int ninsns = 0;
1002
1003   /* Skip simple jumps at the end of the blocks.  Complex jumps still
1004      need to be compared for equivalence, which we'll do below.  */
1005
1006   i1 = bb1->end;
1007   last1 = afterlast1 = last2 = afterlast2 = NULL_RTX;
1008   if (onlyjump_p (i1)
1009       || (returnjump_p (i1) && !side_effects_p (PATTERN (i1))))
1010     {
1011       last1 = i1;
1012       i1 = PREV_INSN (i1);
1013     }
1014
1015   i2 = bb2->end;
1016   if (onlyjump_p (i2)
1017       || (returnjump_p (i2) && !side_effects_p (PATTERN (i2))))
1018     {
1019       last2 = i2;
1020       /* Count everything except for unconditional jump as insn.  */
1021       if (!simplejump_p (i2) && !returnjump_p (i2) && last1)
1022         ninsns++;
1023       i2 = PREV_INSN (i2);
1024     }
1025
1026   while (true)
1027     {
1028       /* Ignore notes.  */
1029       while (!INSN_P (i1) && i1 != bb1->head)
1030         i1 = PREV_INSN (i1);
1031
1032       while (!INSN_P (i2) && i2 != bb2->head)
1033         i2 = PREV_INSN (i2);
1034
1035       if (i1 == bb1->head || i2 == bb2->head)
1036         break;
1037
1038       if (!insns_match_p (mode, i1, i2))
1039         break;
1040
1041       /* Don't begin a cross-jump with a NOTE insn.  */
1042       if (INSN_P (i1))
1043         {
1044           /* If the merged insns have different REG_EQUAL notes, then
1045              remove them.  */
1046           rtx equiv1 = find_reg_equal_equiv_note (i1);
1047           rtx equiv2 = find_reg_equal_equiv_note (i2);
1048
1049           if (equiv1 && !equiv2)
1050             remove_note (i1, equiv1);
1051           else if (!equiv1 && equiv2)
1052             remove_note (i2, equiv2);
1053           else if (equiv1 && equiv2
1054                    && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
1055             {
1056               remove_note (i1, equiv1);
1057               remove_note (i2, equiv2);
1058             }
1059
1060           afterlast1 = last1, afterlast2 = last2;
1061           last1 = i1, last2 = i2;
1062           ninsns++;
1063         }
1064
1065       i1 = PREV_INSN (i1);
1066       i2 = PREV_INSN (i2);
1067     }
1068
1069 #ifdef HAVE_cc0
1070   /* Don't allow the insn after a compare to be shared by
1071      cross-jumping unless the compare is also shared.  */
1072   if (ninsns && reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1))
1073     last1 = afterlast1, last2 = afterlast2, ninsns--;
1074 #endif
1075
1076   /* Include preceding notes and labels in the cross-jump.  One,
1077      this may bring us to the head of the blocks as requested above.
1078      Two, it keeps line number notes as matched as may be.  */
1079   if (ninsns)
1080     {
1081       while (last1 != bb1->head && !INSN_P (PREV_INSN (last1)))
1082         last1 = PREV_INSN (last1);
1083
1084       if (last1 != bb1->head && GET_CODE (PREV_INSN (last1)) == CODE_LABEL)
1085         last1 = PREV_INSN (last1);
1086
1087       while (last2 != bb2->head && !INSN_P (PREV_INSN (last2)))
1088         last2 = PREV_INSN (last2);
1089
1090       if (last2 != bb2->head && GET_CODE (PREV_INSN (last2)) == CODE_LABEL)
1091         last2 = PREV_INSN (last2);
1092
1093       *f1 = last1;
1094       *f2 = last2;
1095     }
1096
1097   return ninsns;
1098 }
1099
1100 /* Return true iff outgoing edges of BB1 and BB2 match, together with
1101    the branch instruction.  This means that if we commonize the control
1102    flow before end of the basic block, the semantic remains unchanged.
1103
1104    We may assume that there exists one edge with a common destination.  */
1105
1106 static bool
1107 outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
1108 {
1109   int nehedges1 = 0, nehedges2 = 0;
1110   edge fallthru1 = 0, fallthru2 = 0;
1111   edge e1, e2;
1112
1113   /* If BB1 has only one successor, we may be looking at either an
1114      unconditional jump, or a fake edge to exit.  */
1115   if (bb1->succ && !bb1->succ->succ_next
1116       && (bb1->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
1117       && (GET_CODE (bb1->end) != JUMP_INSN || simplejump_p (bb1->end)))
1118     return (bb2->succ &&  !bb2->succ->succ_next
1119             && (bb2->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
1120             && (GET_CODE (bb2->end) != JUMP_INSN || simplejump_p (bb2->end)));
1121
1122   /* Match conditional jumps - this may get tricky when fallthru and branch
1123      edges are crossed.  */
1124   if (bb1->succ
1125       && bb1->succ->succ_next
1126       && !bb1->succ->succ_next->succ_next
1127       && any_condjump_p (bb1->end)
1128       && onlyjump_p (bb1->end))
1129     {
1130       edge b1, f1, b2, f2;
1131       bool reverse, match;
1132       rtx set1, set2, cond1, cond2;
1133       enum rtx_code code1, code2;
1134
1135       if (!bb2->succ
1136           || !bb2->succ->succ_next
1137           || bb2->succ->succ_next->succ_next
1138           || !any_condjump_p (bb2->end)
1139           || !onlyjump_p (bb2->end))
1140         return false;
1141
1142       b1 = BRANCH_EDGE (bb1);
1143       b2 = BRANCH_EDGE (bb2);
1144       f1 = FALLTHRU_EDGE (bb1);
1145       f2 = FALLTHRU_EDGE (bb2);
1146
1147       /* Get around possible forwarders on fallthru edges.  Other cases
1148          should be optimized out already.  */
1149       if (FORWARDER_BLOCK_P (f1->dest))
1150         f1 = f1->dest->succ;
1151
1152       if (FORWARDER_BLOCK_P (f2->dest))
1153         f2 = f2->dest->succ;
1154
1155       /* To simplify use of this function, return false if there are
1156          unneeded forwarder blocks.  These will get eliminated later
1157          during cleanup_cfg.  */
1158       if (FORWARDER_BLOCK_P (f1->dest)
1159           || FORWARDER_BLOCK_P (f2->dest)
1160           || FORWARDER_BLOCK_P (b1->dest)
1161           || FORWARDER_BLOCK_P (b2->dest))
1162         return false;
1163
1164       if (f1->dest == f2->dest && b1->dest == b2->dest)
1165         reverse = false;
1166       else if (f1->dest == b2->dest && b1->dest == f2->dest)
1167         reverse = true;
1168       else
1169         return false;
1170
1171       set1 = pc_set (bb1->end);
1172       set2 = pc_set (bb2->end);
1173       if ((XEXP (SET_SRC (set1), 1) == pc_rtx)
1174           != (XEXP (SET_SRC (set2), 1) == pc_rtx))
1175         reverse = !reverse;
1176
1177       cond1 = XEXP (SET_SRC (set1), 0);
1178       cond2 = XEXP (SET_SRC (set2), 0);
1179       code1 = GET_CODE (cond1);
1180       if (reverse)
1181         code2 = reversed_comparison_code (cond2, bb2->end);
1182       else
1183         code2 = GET_CODE (cond2);
1184
1185       if (code2 == UNKNOWN)
1186         return false;
1187
1188       /* Verify codes and operands match.  */
1189       match = ((code1 == code2
1190                 && rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0))
1191                 && rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
1192                || (code1 == swap_condition (code2)
1193                    && rtx_renumbered_equal_p (XEXP (cond1, 1),
1194                                               XEXP (cond2, 0))
1195                    && rtx_renumbered_equal_p (XEXP (cond1, 0),
1196                                               XEXP (cond2, 1))));
1197
1198       /* If we return true, we will join the blocks.  Which means that
1199          we will only have one branch prediction bit to work with.  Thus
1200          we require the existing branches to have probabilities that are
1201          roughly similar.  */
1202       if (match
1203           && !optimize_size
1204           && maybe_hot_bb_p (bb1)
1205           && maybe_hot_bb_p (bb2))
1206         {
1207           int prob2;
1208
1209           if (b1->dest == b2->dest)
1210             prob2 = b2->probability;
1211           else
1212             /* Do not use f2 probability as f2 may be forwarded.  */
1213             prob2 = REG_BR_PROB_BASE - b2->probability;
1214
1215           /* Fail if the difference in probabilities is greater than 50%.
1216              This rules out two well-predicted branches with opposite
1217              outcomes.  */
1218           if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2)
1219             {
1220               if (rtl_dump_file)
1221                 fprintf (rtl_dump_file,
1222                          "Outcomes of branch in bb %i and %i differs to much (%i %i)\n",
1223                          bb1->index, bb2->index, b1->probability, prob2);
1224
1225               return false;
1226             }
1227         }
1228
1229       if (rtl_dump_file && match)
1230         fprintf (rtl_dump_file, "Conditionals in bb %i and %i match.\n",
1231                  bb1->index, bb2->index);
1232
1233       return match;
1234     }
1235
1236   /* Generic case - we are seeing a computed jump, table jump or trapping
1237      instruction.  */
1238
1239 #ifndef CASE_DROPS_THROUGH
1240   /* Check whether there are tablejumps in the end of BB1 and BB2.
1241      Return true if they are identical.  */
1242     {
1243       rtx label1, label2;
1244       rtx table1, table2;
1245
1246       if (tablejump_p (bb1->end, &label1, &table1)
1247           && tablejump_p (bb2->end, &label2, &table2)
1248           && GET_CODE (PATTERN (table1)) == GET_CODE (PATTERN (table2)))
1249         {
1250           /* The labels should never be the same rtx.  If they really are same
1251              the jump tables are same too. So disable crossjumping of blocks BB1
1252              and BB2 because when deleting the common insns in the end of BB1
1253              by delete_block () the jump table would be deleted too.  */
1254           /* If LABEL2 is referenced in BB1->END do not do anything
1255              because we would loose information when replacing
1256              LABEL1 by LABEL2 and then LABEL2 by LABEL1 in BB1->END.  */
1257           if (label1 != label2 && !rtx_referenced_p (label2, bb1->end))
1258             {
1259               /* Set IDENTICAL to true when the tables are identical.  */
1260               bool identical = false;
1261               rtx p1, p2;
1262
1263               p1 = PATTERN (table1);
1264               p2 = PATTERN (table2);
1265               if (GET_CODE (p1) == ADDR_VEC && rtx_equal_p (p1, p2))
1266                 {
1267                   identical = true;
1268                 }
1269               else if (GET_CODE (p1) == ADDR_DIFF_VEC
1270                        && (XVECLEN (p1, 1) == XVECLEN (p2, 1))
1271                        && rtx_equal_p (XEXP (p1, 2), XEXP (p2, 2))
1272                        && rtx_equal_p (XEXP (p1, 3), XEXP (p2, 3)))
1273                 {
1274                   int i;
1275
1276                   identical = true;
1277                   for (i = XVECLEN (p1, 1) - 1; i >= 0 && identical; i--)
1278                     if (!rtx_equal_p (XVECEXP (p1, 1, i), XVECEXP (p2, 1, i)))
1279                       identical = false;
1280                 }
1281
1282               if (identical)
1283                 {
1284                   replace_label_data rr;
1285                   bool match;
1286
1287                   /* Temporarily replace references to LABEL1 with LABEL2
1288                      in BB1->END so that we could compare the instructions.  */
1289                   rr.r1 = label1;
1290                   rr.r2 = label2;
1291                   rr.update_label_nuses = false;
1292                   for_each_rtx (&bb1->end, replace_label, &rr);
1293
1294                   match = insns_match_p (mode, bb1->end, bb2->end);
1295                   if (rtl_dump_file && match)
1296                     fprintf (rtl_dump_file,
1297                              "Tablejumps in bb %i and %i match.\n",
1298                              bb1->index, bb2->index);
1299
1300                   /* Set the original label in BB1->END because when deleting
1301                      a block whose end is a tablejump, the tablejump referenced
1302                      from the instruction is deleted too.  */
1303                   rr.r1 = label2;
1304                   rr.r2 = label1;
1305                   for_each_rtx (&bb1->end, replace_label, &rr);
1306
1307                   return match;
1308                 }
1309             }
1310           return false;
1311         }
1312     }
1313 #endif
1314
1315   /* First ensure that the instructions match.  There may be many outgoing
1316      edges so this test is generally cheaper.  */
1317   if (!insns_match_p (mode, bb1->end, bb2->end))
1318     return false;
1319
1320   /* Search the outgoing edges, ensure that the counts do match, find possible
1321      fallthru and exception handling edges since these needs more
1322      validation.  */
1323   for (e1 = bb1->succ, e2 = bb2->succ; e1 && e2;
1324        e1 = e1->succ_next, e2 = e2->succ_next)
1325     {
1326       if (e1->flags & EDGE_EH)
1327         nehedges1++;
1328
1329       if (e2->flags & EDGE_EH)
1330         nehedges2++;
1331
1332       if (e1->flags & EDGE_FALLTHRU)
1333         fallthru1 = e1;
1334       if (e2->flags & EDGE_FALLTHRU)
1335         fallthru2 = e2;
1336     }
1337
1338   /* If number of edges of various types does not match, fail.  */
1339   if (e1 || e2
1340       || nehedges1 != nehedges2
1341       || (fallthru1 != 0) != (fallthru2 != 0))
1342     return false;
1343
1344   /* fallthru edges must be forwarded to the same destination.  */
1345   if (fallthru1)
1346     {
1347       basic_block d1 = (forwarder_block_p (fallthru1->dest)
1348                         ? fallthru1->dest->succ->dest: fallthru1->dest);
1349       basic_block d2 = (forwarder_block_p (fallthru2->dest)
1350                         ? fallthru2->dest->succ->dest: fallthru2->dest);
1351
1352       if (d1 != d2)
1353         return false;
1354     }
1355
1356   /* Ensure the same EH region.  */
1357   {
1358     rtx n1 = find_reg_note (bb1->end, REG_EH_REGION, 0);
1359     rtx n2 = find_reg_note (bb2->end, REG_EH_REGION, 0);
1360
1361     if (!n1 && n2)
1362       return false;
1363
1364     if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
1365       return false;
1366   }
1367
1368   /* We don't need to match the rest of edges as above checks should be enough
1369      to ensure that they are equivalent.  */
1370   return true;
1371 }
1372
1373 /* E1 and E2 are edges with the same destination block.  Search their
1374    predecessors for common code.  If found, redirect control flow from
1375    (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC.  */
1376
1377 static bool
1378 try_crossjump_to_edge (int mode, edge e1, edge e2)
1379 {
1380   int nmatch;
1381   basic_block src1 = e1->src, src2 = e2->src;
1382   basic_block redirect_to, redirect_from, to_remove;
1383   rtx newpos1, newpos2;
1384   edge s;
1385
1386   /* Search backward through forwarder blocks.  We don't need to worry
1387      about multiple entry or chained forwarders, as they will be optimized
1388      away.  We do this to look past the unconditional jump following a
1389      conditional jump that is required due to the current CFG shape.  */
1390   if (src1->pred
1391       && !src1->pred->pred_next
1392       && FORWARDER_BLOCK_P (src1))
1393     e1 = src1->pred, src1 = e1->src;
1394
1395   if (src2->pred
1396       && !src2->pred->pred_next
1397       && FORWARDER_BLOCK_P (src2))
1398     e2 = src2->pred, src2 = e2->src;
1399
1400   /* Nothing to do if we reach ENTRY, or a common source block.  */
1401   if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
1402     return false;
1403   if (src1 == src2)
1404     return false;
1405
1406   /* Seeing more than 1 forwarder blocks would confuse us later...  */
1407   if (FORWARDER_BLOCK_P (e1->dest)
1408       && FORWARDER_BLOCK_P (e1->dest->succ->dest))
1409     return false;
1410
1411   if (FORWARDER_BLOCK_P (e2->dest)
1412       && FORWARDER_BLOCK_P (e2->dest->succ->dest))
1413     return false;
1414
1415   /* Likewise with dead code (possibly newly created by the other optimizations
1416      of cfg_cleanup).  */
1417   if (!src1->pred || !src2->pred)
1418     return false;
1419
1420   /* Look for the common insn sequence, part the first ...  */
1421   if (!outgoing_edges_match (mode, src1, src2))
1422     return false;
1423
1424   /* ... and part the second.  */
1425   nmatch = flow_find_cross_jump (mode, src1, src2, &newpos1, &newpos2);
1426   if (!nmatch)
1427     return false;
1428
1429 #ifndef CASE_DROPS_THROUGH
1430   /* Here we know that the insns in the end of SRC1 which are common with SRC2
1431      will be deleted.
1432      If we have tablejumps in the end of SRC1 and SRC2
1433      they have been already compared for equivalence in outgoing_edges_match ()
1434      so replace the references to TABLE1 by references to TABLE2.  */
1435     {
1436       rtx label1, label2;
1437       rtx table1, table2;
1438
1439       if (tablejump_p (src1->end, &label1, &table1)
1440           && tablejump_p (src2->end, &label2, &table2)
1441           && label1 != label2)
1442         {
1443           replace_label_data rr;
1444           rtx insn;
1445
1446           /* Replace references to LABEL1 with LABEL2.  */
1447           rr.r1 = label1;
1448           rr.r2 = label2;
1449           rr.update_label_nuses = true;
1450           for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1451             {
1452               /* Do not replace the label in SRC1->END because when deleting
1453                  a block whose end is a tablejump, the tablejump referenced
1454                  from the instruction is deleted too.  */
1455               if (insn != src1->end)
1456                 for_each_rtx (&insn, replace_label, &rr);
1457             }
1458         }
1459     }
1460 #endif
1461
1462   /* Avoid splitting if possible.  */
1463   if (newpos2 == src2->head)
1464     redirect_to = src2;
1465   else
1466     {
1467       if (rtl_dump_file)
1468         fprintf (rtl_dump_file, "Splitting bb %i before %i insns\n",
1469                  src2->index, nmatch);
1470       redirect_to = split_block (src2, PREV_INSN (newpos2))->dest;
1471     }
1472
1473   if (rtl_dump_file)
1474     fprintf (rtl_dump_file,
1475              "Cross jumping from bb %i to bb %i; %i common insns\n",
1476              src1->index, src2->index, nmatch);
1477
1478   redirect_to->count += src1->count;
1479   redirect_to->frequency += src1->frequency;
1480   /* We may have some registers visible trought the block.  */
1481   redirect_to->flags |= BB_DIRTY;
1482
1483   /* Recompute the frequencies and counts of outgoing edges.  */
1484   for (s = redirect_to->succ; s; s = s->succ_next)
1485     {
1486       edge s2;
1487       basic_block d = s->dest;
1488
1489       if (FORWARDER_BLOCK_P (d))
1490         d = d->succ->dest;
1491
1492       for (s2 = src1->succ; ; s2 = s2->succ_next)
1493         {
1494           basic_block d2 = s2->dest;
1495           if (FORWARDER_BLOCK_P (d2))
1496             d2 = d2->succ->dest;
1497           if (d == d2)
1498             break;
1499         }
1500
1501       s->count += s2->count;
1502
1503       /* Take care to update possible forwarder blocks.  We verified
1504          that there is no more than one in the chain, so we can't run
1505          into infinite loop.  */
1506       if (FORWARDER_BLOCK_P (s->dest))
1507         {
1508           s->dest->succ->count += s2->count;
1509           s->dest->count += s2->count;
1510           s->dest->frequency += EDGE_FREQUENCY (s);
1511         }
1512
1513       if (FORWARDER_BLOCK_P (s2->dest))
1514         {
1515           s2->dest->succ->count -= s2->count;
1516           if (s2->dest->succ->count < 0)
1517             s2->dest->succ->count = 0;
1518           s2->dest->count -= s2->count;
1519           s2->dest->frequency -= EDGE_FREQUENCY (s);
1520           if (s2->dest->frequency < 0)
1521             s2->dest->frequency = 0;
1522           if (s2->dest->count < 0)
1523             s2->dest->count = 0;
1524         }
1525
1526       if (!redirect_to->frequency && !src1->frequency)
1527         s->probability = (s->probability + s2->probability) / 2;
1528       else
1529         s->probability
1530           = ((s->probability * redirect_to->frequency +
1531               s2->probability * src1->frequency)
1532              / (redirect_to->frequency + src1->frequency));
1533     }
1534
1535   update_br_prob_note (redirect_to);
1536
1537   /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1.  */
1538
1539   /* Skip possible basic block header.  */
1540   if (GET_CODE (newpos1) == CODE_LABEL)
1541     newpos1 = NEXT_INSN (newpos1);
1542
1543   if (GET_CODE (newpos1) == NOTE)
1544     newpos1 = NEXT_INSN (newpos1);
1545
1546   redirect_from = split_block (src1, PREV_INSN (newpos1))->src;
1547   to_remove = redirect_from->succ->dest;
1548
1549   redirect_edge_and_branch_force (redirect_from->succ, redirect_to);
1550   delete_block (to_remove);
1551
1552   update_forwarder_flag (redirect_from);
1553
1554   return true;
1555 }
1556
1557 /* Search the predecessors of BB for common insn sequences.  When found,
1558    share code between them by redirecting control flow.  Return true if
1559    any changes made.  */
1560
1561 static bool
1562 try_crossjump_bb (int mode, basic_block bb)
1563 {
1564   edge e, e2, nexte2, nexte, fallthru;
1565   bool changed;
1566   int n = 0, max;
1567
1568   /* Nothing to do if there is not at least two incoming edges.  */
1569   if (!bb->pred || !bb->pred->pred_next)
1570     return false;
1571
1572   /* It is always cheapest to redirect a block that ends in a branch to
1573      a block that falls through into BB, as that adds no branches to the
1574      program.  We'll try that combination first.  */
1575   fallthru = NULL;
1576   max = PARAM_VALUE (PARAM_MAX_CROSSJUMP_EDGES);
1577   for (e = bb->pred; e ; e = e->pred_next, n++)
1578     {
1579       if (e->flags & EDGE_FALLTHRU)
1580         fallthru = e;
1581       if (n > max)
1582         return false;
1583     }
1584
1585   changed = false;
1586   for (e = bb->pred; e; e = nexte)
1587     {
1588       nexte = e->pred_next;
1589
1590       /* As noted above, first try with the fallthru predecessor.  */
1591       if (fallthru)
1592         {
1593           /* Don't combine the fallthru edge into anything else.
1594              If there is a match, we'll do it the other way around.  */
1595           if (e == fallthru)
1596             continue;
1597
1598           if (try_crossjump_to_edge (mode, e, fallthru))
1599             {
1600               changed = true;
1601               nexte = bb->pred;
1602               continue;
1603             }
1604         }
1605
1606       /* Non-obvious work limiting check: Recognize that we're going
1607          to call try_crossjump_bb on every basic block.  So if we have
1608          two blocks with lots of outgoing edges (a switch) and they
1609          share lots of common destinations, then we would do the
1610          cross-jump check once for each common destination.
1611
1612          Now, if the blocks actually are cross-jump candidates, then
1613          all of their destinations will be shared.  Which means that
1614          we only need check them for cross-jump candidacy once.  We
1615          can eliminate redundant checks of crossjump(A,B) by arbitrarily
1616          choosing to do the check from the block for which the edge
1617          in question is the first successor of A.  */
1618       if (e->src->succ != e)
1619         continue;
1620
1621       for (e2 = bb->pred; e2; e2 = nexte2)
1622         {
1623           nexte2 = e2->pred_next;
1624
1625           if (e2 == e)
1626             continue;
1627
1628           /* We've already checked the fallthru edge above.  */
1629           if (e2 == fallthru)
1630             continue;
1631
1632           /* The "first successor" check above only prevents multiple
1633              checks of crossjump(A,B).  In order to prevent redundant
1634              checks of crossjump(B,A), require that A be the block
1635              with the lowest index.  */
1636           if (e->src->index > e2->src->index)
1637             continue;
1638
1639           if (try_crossjump_to_edge (mode, e, e2))
1640             {
1641               changed = true;
1642               nexte = bb->pred;
1643               break;
1644             }
1645         }
1646     }
1647
1648   return changed;
1649 }
1650
1651 /* Do simple CFG optimizations - basic block merging, simplifying of jump
1652    instructions etc.  Return nonzero if changes were made.  */
1653
1654 static bool
1655 try_optimize_cfg (int mode)
1656 {
1657   bool changed_overall = false;
1658   bool changed;
1659   int iterations = 0;
1660   basic_block bb, b, next;
1661
1662   if (mode & CLEANUP_CROSSJUMP)
1663     add_noreturn_fake_exit_edges ();
1664
1665   FOR_EACH_BB (bb)
1666     update_forwarder_flag (bb);
1667
1668   if (mode & CLEANUP_UPDATE_LIFE)
1669     clear_bb_flags ();
1670
1671   if (! (* targetm.cannot_modify_jumps_p) ())
1672     {
1673       /* Attempt to merge blocks as made possible by edge removal.  If
1674          a block has only one successor, and the successor has only
1675          one predecessor, they may be combined.  */
1676       do
1677         {
1678           changed = false;
1679           iterations++;
1680
1681           if (rtl_dump_file)
1682             fprintf (rtl_dump_file,
1683                      "\n\ntry_optimize_cfg iteration %i\n\n",
1684                      iterations);
1685
1686           for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR;)
1687             {
1688               basic_block c;
1689               edge s;
1690               bool changed_here = false;
1691
1692               /* Delete trivially dead basic blocks.  */
1693               while (b->pred == NULL)
1694                 {
1695                   c = b->prev_bb;
1696                   if (rtl_dump_file)
1697                     fprintf (rtl_dump_file, "Deleting block %i.\n",
1698                              b->index);
1699
1700                   delete_block (b);
1701                   if (!(mode & CLEANUP_CFGLAYOUT))
1702                     changed = true;
1703                   b = c;
1704                 }
1705
1706               /* Remove code labels no longer used.  Don't do this
1707                  before CALL_PLACEHOLDER is removed, as some branches
1708                  may be hidden within.  */
1709               if (b->pred->pred_next == NULL
1710                   && (b->pred->flags & EDGE_FALLTHRU)
1711                   && !(b->pred->flags & EDGE_COMPLEX)
1712                   && GET_CODE (b->head) == CODE_LABEL
1713                   && (!(mode & CLEANUP_PRE_SIBCALL)
1714                       || !tail_recursion_label_p (b->head))
1715                   /* If the previous block ends with a branch to this
1716                      block, we can't delete the label.  Normally this
1717                      is a condjump that is yet to be simplified, but
1718                      if CASE_DROPS_THRU, this can be a tablejump with
1719                      some element going to the same place as the
1720                      default (fallthru).  */
1721                   && (b->pred->src == ENTRY_BLOCK_PTR
1722                       || GET_CODE (b->pred->src->end) != JUMP_INSN
1723                       || ! label_is_jump_target_p (b->head,
1724                                                    b->pred->src->end)))
1725                 {
1726                   rtx label = b->head;
1727
1728                   delete_insn_chain (label, label);
1729                   /* In the case label is undeletable, move it after the
1730                      BASIC_BLOCK note.  */
1731                   if (NOTE_LINE_NUMBER (b->head) == NOTE_INSN_DELETED_LABEL)
1732                     {
1733                       rtx bb_note = NEXT_INSN (b->head);
1734
1735                       reorder_insns_nobb (label, label, bb_note);
1736                       b->head = bb_note;
1737                     }
1738                   if (rtl_dump_file)
1739                     fprintf (rtl_dump_file, "Deleted label in block %i.\n",
1740                              b->index);
1741                 }
1742
1743               /* If we fall through an empty block, we can remove it.  */
1744               if (!(mode & CLEANUP_CFGLAYOUT)
1745                   && b->pred->pred_next == NULL
1746                   && (b->pred->flags & EDGE_FALLTHRU)
1747                   && GET_CODE (b->head) != CODE_LABEL
1748                   && FORWARDER_BLOCK_P (b)
1749                   /* Note that forwarder_block_p true ensures that
1750                      there is a successor for this block.  */
1751                   && (b->succ->flags & EDGE_FALLTHRU)
1752                   && n_basic_blocks > 1)
1753                 {
1754                   if (rtl_dump_file)
1755                     fprintf (rtl_dump_file,
1756                              "Deleting fallthru block %i.\n",
1757                              b->index);
1758
1759                   c = b->prev_bb == ENTRY_BLOCK_PTR ? b->next_bb : b->prev_bb;
1760                   redirect_edge_succ_nodup (b->pred, b->succ->dest);
1761                   delete_block (b);
1762                   changed = true;
1763                   b = c;
1764                 }
1765
1766               if ((s = b->succ) != NULL
1767                   && s->succ_next == NULL
1768                   && !(s->flags & EDGE_COMPLEX)
1769                   && (c = s->dest) != EXIT_BLOCK_PTR
1770                   && c->pred->pred_next == NULL
1771                   && b != c)
1772                 {
1773                   /* When not in cfg_layout mode use code aware of reordering
1774                      INSN.  This code possibly creates new basic blocks so it
1775                      does not fit merge_blocks interface and is kept here in
1776                      hope that it will become useless once more of compiler
1777                      is transformed to use cfg_layout mode.  */
1778                      
1779                   if ((mode & CLEANUP_CFGLAYOUT)
1780                       && can_merge_blocks_p (b, c))
1781                     {
1782                       merge_blocks (b, c);
1783                       update_forwarder_flag (b);
1784                       changed_here = true;
1785                     }
1786                   else if (!(mode & CLEANUP_CFGLAYOUT)
1787                            /* If the jump insn has side effects,
1788                               we can't kill the edge.  */
1789                            && (GET_CODE (b->end) != JUMP_INSN
1790                                || (flow2_completed
1791                                    ? simplejump_p (b->end)
1792                                    : onlyjump_p (b->end)))
1793                            && (next = merge_blocks_move (s, b, c, mode)))
1794                       {
1795                         b = next;
1796                         changed_here = true;
1797                       }
1798                 }
1799
1800               /* Simplify branch over branch.  */
1801               if ((mode & CLEANUP_EXPENSIVE)
1802                    && !(mode & CLEANUP_CFGLAYOUT)
1803                    && try_simplify_condjump (b))
1804                 changed_here = true;
1805
1806               /* If B has a single outgoing edge, but uses a
1807                  non-trivial jump instruction without side-effects, we
1808                  can either delete the jump entirely, or replace it
1809                  with a simple unconditional jump.  Use
1810                  redirect_edge_and_branch to do the dirty work.  */
1811               if (b->succ
1812                   && ! b->succ->succ_next
1813                   && b->succ->dest != EXIT_BLOCK_PTR
1814                   && onlyjump_p (b->end)
1815                   && redirect_edge_and_branch (b->succ, b->succ->dest))
1816                 {
1817                   update_forwarder_flag (b);
1818                   changed_here = true;
1819                 }
1820
1821               /* Simplify branch to branch.  */
1822               if (try_forward_edges (mode, b))
1823                 changed_here = true;
1824
1825               /* Look for shared code between blocks.  */
1826               if ((mode & CLEANUP_CROSSJUMP)
1827                   && try_crossjump_bb (mode, b))
1828                 changed_here = true;
1829
1830               /* Don't get confused by the index shift caused by
1831                  deleting blocks.  */
1832               if (!changed_here)
1833                 b = b->next_bb;
1834               else
1835                 changed = true;
1836             }
1837
1838           if ((mode & CLEANUP_CROSSJUMP)
1839               && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
1840             changed = true;
1841
1842 #ifdef ENABLE_CHECKING
1843           if (changed)
1844             verify_flow_info ();
1845 #endif
1846
1847           changed_overall |= changed;
1848         }
1849       while (changed);
1850     }
1851
1852   if (mode & CLEANUP_CROSSJUMP)
1853     remove_fake_edges ();
1854
1855   clear_aux_for_blocks ();
1856
1857   return changed_overall;
1858 }
1859 \f
1860 /* Delete all unreachable basic blocks.  */
1861
1862 bool
1863 delete_unreachable_blocks (void)
1864 {
1865   bool changed = false;
1866   basic_block b, next_bb;
1867
1868   find_unreachable_blocks ();
1869
1870   /* Delete all unreachable basic blocks.  */
1871
1872   for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR; b = next_bb)
1873     {
1874       next_bb = b->next_bb;
1875
1876       if (!(b->flags & BB_REACHABLE))
1877         {
1878           delete_block (b);
1879           changed = true;
1880         }
1881     }
1882
1883   if (changed)
1884     tidy_fallthru_edges ();
1885   return changed;
1886 }
1887 \f
1888 /* Tidy the CFG by deleting unreachable code and whatnot.  */
1889
1890 bool
1891 cleanup_cfg (int mode)
1892 {
1893   bool changed = false;
1894
1895   timevar_push (TV_CLEANUP_CFG);
1896   if (delete_unreachable_blocks ())
1897     {
1898       changed = true;
1899       /* We've possibly created trivially dead code.  Cleanup it right
1900          now to introduce more opportunities for try_optimize_cfg.  */
1901       if (!(mode & (CLEANUP_NO_INSN_DEL
1902                     | CLEANUP_UPDATE_LIFE | CLEANUP_PRE_SIBCALL))
1903           && !reload_completed)
1904         delete_trivially_dead_insns (get_insns(), max_reg_num ());
1905     }
1906
1907   compact_blocks ();
1908
1909   while (try_optimize_cfg (mode))
1910     {
1911       delete_unreachable_blocks (), changed = true;
1912       if (mode & CLEANUP_UPDATE_LIFE)
1913         {
1914           /* Cleaning up CFG introduces more opportunities for dead code
1915              removal that in turn may introduce more opportunities for
1916              cleaning up the CFG.  */
1917           if (!update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
1918                                                  PROP_DEATH_NOTES
1919                                                  | PROP_SCAN_DEAD_CODE
1920                                                  | PROP_KILL_DEAD_CODE
1921                                                  | PROP_LOG_LINKS))
1922             break;
1923         }
1924       else if (!(mode & (CLEANUP_NO_INSN_DEL | CLEANUP_PRE_SIBCALL))
1925                && (mode & CLEANUP_EXPENSIVE)
1926                && !reload_completed)
1927         {
1928           if (!delete_trivially_dead_insns (get_insns(), max_reg_num ()))
1929             break;
1930         }
1931       else
1932         break;
1933       delete_dead_jumptables ();
1934     }
1935
1936   /* Kill the data we won't maintain.  */
1937   free_EXPR_LIST_list (&label_value_list);
1938   timevar_pop (TV_CLEANUP_CFG);
1939
1940   return changed;
1941 }