tree.h (tree_constructor): Remove IS_UNKNOWN_LOCATION.
[platform/upstream/gcc.git] / gcc / cfgrtl.c
1 /* Control flow graph manipulation 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, 2009, 2010,
4    2011, 2012 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 low level functions to manipulate the CFG and analyze it
23    that are aware of the RTL intermediate language.
24
25    Available functionality:
26      - Basic CFG/RTL manipulation API documented in cfghooks.h
27      - CFG-aware instruction chain manipulation
28          delete_insn, delete_insn_chain
29      - Edge splitting and committing to edges
30          insert_insn_on_edge, commit_edge_insertions
31      - CFG updating after insn simplification
32          purge_dead_edges, purge_all_dead_edges
33      - CFG fixing after coarse manipulation
34         fixup_abnormal_edges
35
36    Functions not supposed for generic use:
37      - Infrastructure to determine quickly basic block for insn
38          compute_bb_for_insn, update_bb_for_insn, set_block_for_insn,
39      - Edge redirection with updating and optimizing of insn chain
40          block_label, tidy_fallthru_edge, force_nonfallthru  */
41 \f
42 #include "config.h"
43 #include "system.h"
44 #include "coretypes.h"
45 #include "tm.h"
46 #include "tree.h"
47 #include "hard-reg-set.h"
48 #include "basic-block.h"
49 #include "regs.h"
50 #include "flags.h"
51 #include "function.h"
52 #include "except.h"
53 #include "rtl-error.h"
54 #include "tm_p.h"
55 #include "obstack.h"
56 #include "insn-attr.h"
57 #include "insn-config.h"
58 #include "expr.h"
59 #include "target.h"
60 #include "common/common-target.h"
61 #include "cfgloop.h"
62 #include "ggc.h"
63 #include "tree-pass.h"
64 #include "df.h"
65
66 /* Holds the interesting leading and trailing notes for the function.
67    Only applicable if the CFG is in cfglayout mode.  */
68 static GTY(()) rtx cfg_layout_function_footer;
69 static GTY(()) rtx cfg_layout_function_header;
70
71 static rtx skip_insns_after_block (basic_block);
72 static void record_effective_endpoints (void);
73 static rtx label_for_bb (basic_block);
74 static void fixup_reorder_chain (void);
75
76 void verify_insn_chain (void);
77 static void fixup_fallthru_exit_predecessor (void);
78 static int can_delete_note_p (const_rtx);
79 static int can_delete_label_p (const_rtx);
80 static basic_block rtl_split_edge (edge);
81 static bool rtl_move_block_after (basic_block, basic_block);
82 static int rtl_verify_flow_info (void);
83 static basic_block cfg_layout_split_block (basic_block, void *);
84 static edge cfg_layout_redirect_edge_and_branch (edge, basic_block);
85 static basic_block cfg_layout_redirect_edge_and_branch_force (edge, basic_block);
86 static void cfg_layout_delete_block (basic_block);
87 static void rtl_delete_block (basic_block);
88 static basic_block rtl_redirect_edge_and_branch_force (edge, basic_block);
89 static edge rtl_redirect_edge_and_branch (edge, basic_block);
90 static basic_block rtl_split_block (basic_block, void *);
91 static void rtl_dump_bb (FILE *, basic_block, int, int);
92 static int rtl_verify_flow_info_1 (void);
93 static void rtl_make_forwarder_block (edge);
94 \f
95 /* Return true if NOTE is not one of the ones that must be kept paired,
96    so that we may simply delete it.  */
97
98 static int
99 can_delete_note_p (const_rtx note)
100 {
101   switch (NOTE_KIND (note))
102     {
103     case NOTE_INSN_DELETED:
104     case NOTE_INSN_BASIC_BLOCK:
105     case NOTE_INSN_EPILOGUE_BEG:
106       return true;
107
108     default:
109       return false;
110     }
111 }
112
113 /* True if a given label can be deleted.  */
114
115 static int
116 can_delete_label_p (const_rtx label)
117 {
118   return (!LABEL_PRESERVE_P (label)
119           /* User declared labels must be preserved.  */
120           && LABEL_NAME (label) == 0
121           && !in_expr_list_p (forced_labels, label));
122 }
123
124 /* Delete INSN by patching it out.  */
125
126 void
127 delete_insn (rtx insn)
128 {
129   rtx note;
130   bool really_delete = true;
131
132   if (LABEL_P (insn))
133     {
134       /* Some labels can't be directly removed from the INSN chain, as they
135          might be references via variables, constant pool etc.
136          Convert them to the special NOTE_INSN_DELETED_LABEL note.  */
137       if (! can_delete_label_p (insn))
138         {
139           const char *name = LABEL_NAME (insn);
140           basic_block bb = BLOCK_FOR_INSN (insn);
141           rtx bb_note = NEXT_INSN (insn);
142
143           really_delete = false;
144           PUT_CODE (insn, NOTE);
145           NOTE_KIND (insn) = NOTE_INSN_DELETED_LABEL;
146           NOTE_DELETED_LABEL_NAME (insn) = name;
147
148           if (bb_note != NULL_RTX && NOTE_INSN_BASIC_BLOCK_P (bb_note)
149               && BLOCK_FOR_INSN (bb_note) == bb)
150             {
151               reorder_insns_nobb (insn, insn, bb_note);
152               BB_HEAD (bb) = bb_note;
153               if (BB_END (bb) == bb_note)
154                 BB_END (bb) = insn;
155             }
156         }
157
158       remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
159     }
160
161   if (really_delete)
162     {
163       /* If this insn has already been deleted, something is very wrong.  */
164       gcc_assert (!INSN_DELETED_P (insn));
165       remove_insn (insn);
166       INSN_DELETED_P (insn) = 1;
167     }
168
169   /* If deleting a jump, decrement the use count of the label.  Deleting
170      the label itself should happen in the normal course of block merging.  */
171   if (JUMP_P (insn))
172     {
173       if (JUMP_LABEL (insn)
174           && LABEL_P (JUMP_LABEL (insn)))
175         LABEL_NUSES (JUMP_LABEL (insn))--;
176
177       /* If there are more targets, remove them too.  */
178       while ((note
179               = find_reg_note (insn, REG_LABEL_TARGET, NULL_RTX)) != NULL_RTX
180              && LABEL_P (XEXP (note, 0)))
181         {
182           LABEL_NUSES (XEXP (note, 0))--;
183           remove_note (insn, note);
184         }
185     }
186
187   /* Also if deleting any insn that references a label as an operand.  */
188   while ((note = find_reg_note (insn, REG_LABEL_OPERAND, NULL_RTX)) != NULL_RTX
189          && LABEL_P (XEXP (note, 0)))
190     {
191       LABEL_NUSES (XEXP (note, 0))--;
192       remove_note (insn, note);
193     }
194
195   if (JUMP_TABLE_DATA_P (insn))
196     {
197       rtx pat = PATTERN (insn);
198       int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
199       int len = XVECLEN (pat, diff_vec_p);
200       int i;
201
202       for (i = 0; i < len; i++)
203         {
204           rtx label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
205
206           /* When deleting code in bulk (e.g. removing many unreachable
207              blocks) we can delete a label that's a target of the vector
208              before deleting the vector itself.  */
209           if (!NOTE_P (label))
210             LABEL_NUSES (label)--;
211         }
212     }
213 }
214
215 /* Like delete_insn but also purge dead edges from BB.  */
216
217 void
218 delete_insn_and_edges (rtx insn)
219 {
220   bool purge = false;
221
222   if (INSN_P (insn)
223       && BLOCK_FOR_INSN (insn)
224       && BB_END (BLOCK_FOR_INSN (insn)) == insn)
225     purge = true;
226   delete_insn (insn);
227   if (purge)
228     purge_dead_edges (BLOCK_FOR_INSN (insn));
229 }
230
231 /* Unlink a chain of insns between START and FINISH, leaving notes
232    that must be paired.  If CLEAR_BB is true, we set bb field for
233    insns that cannot be removed to NULL.  */
234
235 void
236 delete_insn_chain (rtx start, rtx finish, bool clear_bb)
237 {
238   rtx prev, current;
239
240   /* Unchain the insns one by one.  It would be quicker to delete all of these
241      with a single unchaining, rather than one at a time, but we need to keep
242      the NOTE's.  */
243   current = finish;
244   while (1)
245     {
246       prev = PREV_INSN (current);
247       if (NOTE_P (current) && !can_delete_note_p (current))
248         ;
249       else
250         delete_insn (current);
251
252       if (clear_bb && !INSN_DELETED_P (current))
253         set_block_for_insn (current, NULL);
254
255       if (current == start)
256         break;
257       current = prev;
258     }
259 }
260 \f
261 /* Create a new basic block consisting of the instructions between HEAD and END
262    inclusive.  This function is designed to allow fast BB construction - reuses
263    the note and basic block struct in BB_NOTE, if any and do not grow
264    BASIC_BLOCK chain and should be used directly only by CFG construction code.
265    END can be NULL in to create new empty basic block before HEAD.  Both END
266    and HEAD can be NULL to create basic block at the end of INSN chain.
267    AFTER is the basic block we should be put after.  */
268
269 basic_block
270 create_basic_block_structure (rtx head, rtx end, rtx bb_note, basic_block after)
271 {
272   basic_block bb;
273
274   if (bb_note
275       && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
276       && bb->aux == NULL)
277     {
278       /* If we found an existing note, thread it back onto the chain.  */
279
280       rtx after;
281
282       if (LABEL_P (head))
283         after = head;
284       else
285         {
286           after = PREV_INSN (head);
287           head = bb_note;
288         }
289
290       if (after != bb_note && NEXT_INSN (after) != bb_note)
291         reorder_insns_nobb (bb_note, bb_note, after);
292     }
293   else
294     {
295       /* Otherwise we must create a note and a basic block structure.  */
296
297       bb = alloc_block ();
298
299       init_rtl_bb_info (bb);
300       if (!head && !end)
301         head = end = bb_note
302           = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
303       else if (LABEL_P (head) && end)
304         {
305           bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
306           if (head == end)
307             end = bb_note;
308         }
309       else
310         {
311           bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
312           head = bb_note;
313           if (!end)
314             end = head;
315         }
316
317       NOTE_BASIC_BLOCK (bb_note) = bb;
318     }
319
320   /* Always include the bb note in the block.  */
321   if (NEXT_INSN (end) == bb_note)
322     end = bb_note;
323
324   BB_HEAD (bb) = head;
325   BB_END (bb) = end;
326   bb->index = last_basic_block++;
327   bb->flags = BB_NEW | BB_RTL;
328   link_block (bb, after);
329   SET_BASIC_BLOCK (bb->index, bb);
330   df_bb_refs_record (bb->index, false);
331   update_bb_for_insn (bb);
332   BB_SET_PARTITION (bb, BB_UNPARTITIONED);
333
334   /* Tag the block so that we know it has been used when considering
335      other basic block notes.  */
336   bb->aux = bb;
337
338   return bb;
339 }
340
341 /* Create new basic block consisting of instructions in between HEAD and END
342    and place it to the BB chain after block AFTER.  END can be NULL to
343    create a new empty basic block before HEAD.  Both END and HEAD can be
344    NULL to create basic block at the end of INSN chain.  */
345
346 static basic_block
347 rtl_create_basic_block (void *headp, void *endp, basic_block after)
348 {
349   rtx head = (rtx) headp, end = (rtx) endp;
350   basic_block bb;
351
352   /* Grow the basic block array if needed.  */
353   if ((size_t) last_basic_block >= VEC_length (basic_block, basic_block_info))
354     {
355       size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
356       VEC_safe_grow_cleared (basic_block, gc, basic_block_info, new_size);
357     }
358
359   n_basic_blocks++;
360
361   bb = create_basic_block_structure (head, end, NULL, after);
362   bb->aux = NULL;
363   return bb;
364 }
365
366 static basic_block
367 cfg_layout_create_basic_block (void *head, void *end, basic_block after)
368 {
369   basic_block newbb = rtl_create_basic_block (head, end, after);
370
371   return newbb;
372 }
373 \f
374 /* Delete the insns in a (non-live) block.  We physically delete every
375    non-deleted-note insn, and update the flow graph appropriately.
376
377    Return nonzero if we deleted an exception handler.  */
378
379 /* ??? Preserving all such notes strikes me as wrong.  It would be nice
380    to post-process the stream to remove empty blocks, loops, ranges, etc.  */
381
382 static void
383 rtl_delete_block (basic_block b)
384 {
385   rtx insn, end;
386
387   /* If the head of this block is a CODE_LABEL, then it might be the
388      label for an exception handler which can't be reached.  We need
389      to remove the label from the exception_handler_label list.  */
390   insn = BB_HEAD (b);
391
392   end = get_last_bb_insn (b);
393
394   /* Selectively delete the entire chain.  */
395   BB_HEAD (b) = NULL;
396   delete_insn_chain (insn, end, true);
397
398
399   if (dump_file)
400     fprintf (dump_file, "deleting block %d\n", b->index);
401   df_bb_delete (b->index);
402 }
403 \f
404 /* Records the basic block struct in BLOCK_FOR_INSN for every insn.  */
405
406 void
407 compute_bb_for_insn (void)
408 {
409   basic_block bb;
410
411   FOR_EACH_BB (bb)
412     {
413       rtx end = BB_END (bb);
414       rtx insn;
415
416       for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
417         {
418           BLOCK_FOR_INSN (insn) = bb;
419           if (insn == end)
420             break;
421         }
422     }
423 }
424
425 /* Release the basic_block_for_insn array.  */
426
427 unsigned int
428 free_bb_for_insn (void)
429 {
430   rtx insn;
431   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
432     if (!BARRIER_P (insn))
433       BLOCK_FOR_INSN (insn) = NULL;
434   return 0;
435 }
436
437 static unsigned int
438 rest_of_pass_free_cfg (void)
439 {
440 #ifdef DELAY_SLOTS
441   /* The resource.c machinery uses DF but the CFG isn't guaranteed to be
442      valid at that point so it would be too late to call df_analyze.  */
443   if (optimize > 0 && flag_delayed_branch)
444     {
445       df_note_add_problem ();
446       df_analyze ();
447     }
448 #endif
449
450   free_bb_for_insn ();
451   return 0;
452 }
453
454 struct rtl_opt_pass pass_free_cfg =
455 {
456  {
457   RTL_PASS,
458   "*free_cfg",                          /* name */
459   NULL,                                 /* gate */
460   rest_of_pass_free_cfg,                /* execute */
461   NULL,                                 /* sub */
462   NULL,                                 /* next */
463   0,                                    /* static_pass_number */
464   TV_NONE,                              /* tv_id */
465   0,                                    /* properties_required */
466   0,                                    /* properties_provided */
467   PROP_cfg,                             /* properties_destroyed */
468   0,                                    /* todo_flags_start */
469   0,                                    /* todo_flags_finish */
470  }
471 };
472
473 /* Return RTX to emit after when we want to emit code on the entry of function.  */
474 rtx
475 entry_of_function (void)
476 {
477   return (n_basic_blocks > NUM_FIXED_BLOCKS ?
478           BB_HEAD (ENTRY_BLOCK_PTR->next_bb) : get_insns ());
479 }
480
481 /* Emit INSN at the entry point of the function, ensuring that it is only
482    executed once per function.  */
483 void
484 emit_insn_at_entry (rtx insn)
485 {
486   edge_iterator ei = ei_start (ENTRY_BLOCK_PTR->succs);
487   edge e = ei_safe_edge (ei);
488   gcc_assert (e->flags & EDGE_FALLTHRU);
489
490   insert_insn_on_edge (insn, e);
491   commit_edge_insertions ();
492 }
493
494 /* Update BLOCK_FOR_INSN of insns between BEGIN and END
495    (or BARRIER if found) and notify df of the bb change.
496    The insn chain range is inclusive
497    (i.e. both BEGIN and END will be updated. */
498
499 static void
500 update_bb_for_insn_chain (rtx begin, rtx end, basic_block bb)
501 {
502   rtx insn;
503
504   end = NEXT_INSN (end);
505   for (insn = begin; insn != end; insn = NEXT_INSN (insn))
506     if (!BARRIER_P (insn))
507       df_insn_change_bb (insn, bb);
508 }
509
510 /* Update BLOCK_FOR_INSN of insns in BB to BB,
511    and notify df of the change.  */
512
513 void
514 update_bb_for_insn (basic_block bb)
515 {
516   update_bb_for_insn_chain (BB_HEAD (bb), BB_END (bb), bb);
517 }
518
519 \f
520 /* Like active_insn_p, except keep the return value clobber around
521    even after reload.  */
522
523 static bool
524 flow_active_insn_p (const_rtx insn)
525 {
526   if (active_insn_p (insn))
527     return true;
528
529   /* A clobber of the function return value exists for buggy
530      programs that fail to return a value.  Its effect is to
531      keep the return value from being live across the entire
532      function.  If we allow it to be skipped, we introduce the
533      possibility for register lifetime confusion.  */
534   if (GET_CODE (PATTERN (insn)) == CLOBBER
535       && REG_P (XEXP (PATTERN (insn), 0))
536       && REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))
537     return true;
538
539   return false;
540 }
541
542 /* Return true if the block has no effect and only forwards control flow to
543    its single destination.  */
544 /* FIXME: Make this a cfg hook.  */
545
546 bool
547 forwarder_block_p (const_basic_block bb)
548 {
549   rtx insn;
550
551   if (bb == EXIT_BLOCK_PTR || bb == ENTRY_BLOCK_PTR
552       || !single_succ_p (bb))
553     return false;
554
555   /* Protect loop latches, headers and preheaders.  */
556   if (current_loops)
557     {
558       basic_block dest;
559       if (bb->loop_father->header == bb)
560         return false;
561       dest = EDGE_SUCC (bb, 0)->dest;
562       if (dest->loop_father->header == dest)
563         return false;
564     }
565
566   for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = NEXT_INSN (insn))
567     if (INSN_P (insn) && flow_active_insn_p (insn))
568       return false;
569
570   return (!INSN_P (insn)
571           || (JUMP_P (insn) && simplejump_p (insn))
572           || !flow_active_insn_p (insn));
573 }
574
575 /* Return nonzero if we can reach target from src by falling through.  */
576 /* FIXME: Make this a cfg hook.  */
577
578 bool
579 can_fallthru (basic_block src, basic_block target)
580 {
581   rtx insn = BB_END (src);
582   rtx insn2;
583   edge e;
584   edge_iterator ei;
585
586   if (target == EXIT_BLOCK_PTR)
587     return true;
588   if (src->next_bb != target)
589     return 0;
590   FOR_EACH_EDGE (e, ei, src->succs)
591     if (e->dest == EXIT_BLOCK_PTR
592         && e->flags & EDGE_FALLTHRU)
593       return 0;
594
595   insn2 = BB_HEAD (target);
596   if (insn2 && !active_insn_p (insn2))
597     insn2 = next_active_insn (insn2);
598
599   /* ??? Later we may add code to move jump tables offline.  */
600   return next_active_insn (insn) == insn2;
601 }
602
603 /* Return nonzero if we could reach target from src by falling through,
604    if the target was made adjacent.  If we already have a fall-through
605    edge to the exit block, we can't do that.  */
606 static bool
607 could_fall_through (basic_block src, basic_block target)
608 {
609   edge e;
610   edge_iterator ei;
611
612   if (target == EXIT_BLOCK_PTR)
613     return true;
614   FOR_EACH_EDGE (e, ei, src->succs)
615     if (e->dest == EXIT_BLOCK_PTR
616         && e->flags & EDGE_FALLTHRU)
617       return 0;
618   return true;
619 }
620 \f
621 /* Return the NOTE_INSN_BASIC_BLOCK of BB.  */
622 rtx
623 bb_note (basic_block bb)
624 {
625   rtx note;
626
627   note = BB_HEAD (bb);
628   if (LABEL_P (note))
629     note = NEXT_INSN (note);
630
631   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
632   return note;
633 }
634
635 /* Return the INSN immediately following the NOTE_INSN_BASIC_BLOCK
636    note associated with the BLOCK.  */
637
638 static rtx
639 first_insn_after_basic_block_note (basic_block block)
640 {
641   rtx insn;
642
643   /* Get the first instruction in the block.  */
644   insn = BB_HEAD (block);
645
646   if (insn == NULL_RTX)
647     return NULL_RTX;
648   if (LABEL_P (insn))
649     insn = NEXT_INSN (insn);
650   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
651
652   return NEXT_INSN (insn);
653 }
654
655 /* Creates a new basic block just after basic block B by splitting
656    everything after specified instruction I.  */
657
658 static basic_block
659 rtl_split_block (basic_block bb, void *insnp)
660 {
661   basic_block new_bb;
662   rtx insn = (rtx) insnp;
663   edge e;
664   edge_iterator ei;
665
666   if (!insn)
667     {
668       insn = first_insn_after_basic_block_note (bb);
669
670       if (insn)
671         {
672           rtx next = insn;
673
674           insn = PREV_INSN (insn);
675
676           /* If the block contains only debug insns, insn would have
677              been NULL in a non-debug compilation, and then we'd end
678              up emitting a DELETED note.  For -fcompare-debug
679              stability, emit the note too.  */
680           if (insn != BB_END (bb)
681               && DEBUG_INSN_P (next)
682               && DEBUG_INSN_P (BB_END (bb)))
683             {
684               while (next != BB_END (bb) && DEBUG_INSN_P (next))
685                 next = NEXT_INSN (next);
686
687               if (next == BB_END (bb))
688                 emit_note_after (NOTE_INSN_DELETED, next);
689             }
690         }
691       else
692         insn = get_last_insn ();
693     }
694
695   /* We probably should check type of the insn so that we do not create
696      inconsistent cfg.  It is checked in verify_flow_info anyway, so do not
697      bother.  */
698   if (insn == BB_END (bb))
699     emit_note_after (NOTE_INSN_DELETED, insn);
700
701   /* Create the new basic block.  */
702   new_bb = create_basic_block (NEXT_INSN (insn), BB_END (bb), bb);
703   BB_COPY_PARTITION (new_bb, bb);
704   BB_END (bb) = insn;
705
706   /* Redirect the outgoing edges.  */
707   new_bb->succs = bb->succs;
708   bb->succs = NULL;
709   FOR_EACH_EDGE (e, ei, new_bb->succs)
710     e->src = new_bb;
711
712   /* The new block starts off being dirty.  */
713   df_set_bb_dirty (bb);
714   return new_bb;
715 }
716
717 /* Return true if the single edge between blocks A and B is the only place
718    in RTL which holds some unique locus.  */
719
720 static bool
721 unique_locus_on_edge_between_p (basic_block a, basic_block b)
722 {
723   const location_t goto_locus = EDGE_SUCC (a, 0)->goto_locus;
724   rtx insn, end;
725
726   if (LOCATION_LOCUS (goto_locus) == UNKNOWN_LOCATION)
727     return false;
728
729   /* First scan block A backward.  */
730   insn = BB_END (a);
731   end = PREV_INSN (BB_HEAD (a));
732   while (insn != end && (!NONDEBUG_INSN_P (insn) || !INSN_HAS_LOCATION (insn)))
733     insn = PREV_INSN (insn);
734
735   if (insn != end && INSN_LOCATION (insn) == goto_locus)
736     return false;
737
738   /* Then scan block B forward.  */
739   insn = BB_HEAD (b);
740   if (insn)
741     {
742       end = NEXT_INSN (BB_END (b));
743       while (insn != end && !NONDEBUG_INSN_P (insn))
744         insn = NEXT_INSN (insn);
745
746       if (insn != end && INSN_HAS_LOCATION (insn)
747           && INSN_LOCATION (insn) == goto_locus)
748         return false;
749     }
750
751   return true;
752 }
753
754 /* If the single edge between blocks A and B is the only place in RTL which
755    holds some unique locus, emit a nop with that locus between the blocks.  */
756
757 static void
758 emit_nop_for_unique_locus_between (basic_block a, basic_block b)
759 {
760   if (!unique_locus_on_edge_between_p (a, b))
761     return;
762
763   BB_END (a) = emit_insn_after_noloc (gen_nop (), BB_END (a), a);
764   INSN_LOCATION (BB_END (a)) = EDGE_SUCC (a, 0)->goto_locus;
765 }
766
767 /* Blocks A and B are to be merged into a single block A.  The insns
768    are already contiguous.  */
769
770 static void
771 rtl_merge_blocks (basic_block a, basic_block b)
772 {
773   rtx b_head = BB_HEAD (b), b_end = BB_END (b), a_end = BB_END (a);
774   rtx del_first = NULL_RTX, del_last = NULL_RTX;
775   rtx b_debug_start = b_end, b_debug_end = b_end;
776   bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0;
777   int b_empty = 0;
778
779   if (dump_file)
780     fprintf (dump_file, "Merging block %d into block %d...\n", b->index,
781              a->index);
782
783   while (DEBUG_INSN_P (b_end))
784     b_end = PREV_INSN (b_debug_start = b_end);
785
786   /* If there was a CODE_LABEL beginning B, delete it.  */
787   if (LABEL_P (b_head))
788     {
789       /* Detect basic blocks with nothing but a label.  This can happen
790          in particular at the end of a function.  */
791       if (b_head == b_end)
792         b_empty = 1;
793
794       del_first = del_last = b_head;
795       b_head = NEXT_INSN (b_head);
796     }
797
798   /* Delete the basic block note and handle blocks containing just that
799      note.  */
800   if (NOTE_INSN_BASIC_BLOCK_P (b_head))
801     {
802       if (b_head == b_end)
803         b_empty = 1;
804       if (! del_last)
805         del_first = b_head;
806
807       del_last = b_head;
808       b_head = NEXT_INSN (b_head);
809     }
810
811   /* If there was a jump out of A, delete it.  */
812   if (JUMP_P (a_end))
813     {
814       rtx prev;
815
816       for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
817         if (!NOTE_P (prev)
818             || NOTE_INSN_BASIC_BLOCK_P (prev)
819             || prev == BB_HEAD (a))
820           break;
821
822       del_first = a_end;
823
824 #ifdef HAVE_cc0
825       /* If this was a conditional jump, we need to also delete
826          the insn that set cc0.  */
827       if (only_sets_cc0_p (prev))
828         {
829           rtx tmp = prev;
830
831           prev = prev_nonnote_insn (prev);
832           if (!prev)
833             prev = BB_HEAD (a);
834           del_first = tmp;
835         }
836 #endif
837
838       a_end = PREV_INSN (del_first);
839     }
840   else if (BARRIER_P (NEXT_INSN (a_end)))
841     del_first = NEXT_INSN (a_end);
842
843   /* Delete everything marked above as well as crap that might be
844      hanging out between the two blocks.  */
845   BB_END (a) = a_end;
846   BB_HEAD (b) = b_empty ? NULL_RTX : b_head;
847   delete_insn_chain (del_first, del_last, true);
848
849   /* When not optimizing CFG and the edge is the only place in RTL which holds
850      some unique locus, emit a nop with that locus in between.  */
851   if (!optimize)
852     {
853       emit_nop_for_unique_locus_between (a, b);
854       a_end = BB_END (a);
855     }
856
857   /* Reassociate the insns of B with A.  */
858   if (!b_empty)
859     {
860       update_bb_for_insn_chain (a_end, b_debug_end, a);
861
862       BB_END (a) = b_debug_end;
863       BB_HEAD (b) = NULL_RTX;
864     }
865   else if (b_end != b_debug_end)
866     {
867       /* Move any deleted labels and other notes between the end of A
868          and the debug insns that make up B after the debug insns,
869          bringing the debug insns into A while keeping the notes after
870          the end of A.  */
871       if (NEXT_INSN (a_end) != b_debug_start)
872         reorder_insns_nobb (NEXT_INSN (a_end), PREV_INSN (b_debug_start),
873                             b_debug_end);
874       update_bb_for_insn_chain (b_debug_start, b_debug_end, a);
875       BB_END (a) = b_debug_end;
876     }
877
878   df_bb_delete (b->index);
879
880   /* If B was a forwarder block, propagate the locus on the edge.  */
881   if (forwarder_p && !EDGE_SUCC (b, 0)->goto_locus)
882     EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
883
884   if (dump_file)
885     fprintf (dump_file, "Merged blocks %d and %d.\n", a->index, b->index);
886 }
887
888
889 /* Return true when block A and B can be merged.  */
890
891 static bool
892 rtl_can_merge_blocks (basic_block a, basic_block b)
893 {
894   /* If we are partitioning hot/cold basic blocks, we don't want to
895      mess up unconditional or indirect jumps that cross between hot
896      and cold sections.
897
898      Basic block partitioning may result in some jumps that appear to
899      be optimizable (or blocks that appear to be mergeable), but which really
900      must be left untouched (they are required to make it safely across
901      partition boundaries).  See  the comments at the top of
902      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
903
904   if (BB_PARTITION (a) != BB_PARTITION (b))
905     return false;
906
907   /* Protect the loop latches.  */
908   if (current_loops && b->loop_father->latch == b)
909     return false;
910
911   /* There must be exactly one edge in between the blocks.  */
912   return (single_succ_p (a)
913           && single_succ (a) == b
914           && single_pred_p (b)
915           && a != b
916           /* Must be simple edge.  */
917           && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
918           && a->next_bb == b
919           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
920           /* If the jump insn has side effects,
921              we can't kill the edge.  */
922           && (!JUMP_P (BB_END (a))
923               || (reload_completed
924                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
925 }
926 \f
927 /* Return the label in the head of basic block BLOCK.  Create one if it doesn't
928    exist.  */
929
930 rtx
931 block_label (basic_block block)
932 {
933   if (block == EXIT_BLOCK_PTR)
934     return NULL_RTX;
935
936   if (!LABEL_P (BB_HEAD (block)))
937     {
938       BB_HEAD (block) = emit_label_before (gen_label_rtx (), BB_HEAD (block));
939     }
940
941   return BB_HEAD (block);
942 }
943
944 /* Attempt to perform edge redirection by replacing possibly complex jump
945    instruction by unconditional jump or removing jump completely.  This can
946    apply only if all edges now point to the same block.  The parameters and
947    return values are equivalent to redirect_edge_and_branch.  */
948
949 edge
950 try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
951 {
952   basic_block src = e->src;
953   rtx insn = BB_END (src), kill_from;
954   rtx set;
955   int fallthru = 0;
956
957   /* If we are partitioning hot/cold basic blocks, we don't want to
958      mess up unconditional or indirect jumps that cross between hot
959      and cold sections.
960
961      Basic block partitioning may result in some jumps that appear to
962      be optimizable (or blocks that appear to be mergeable), but which really
963      must be left untouched (they are required to make it safely across
964      partition boundaries).  See  the comments at the top of
965      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
966
967   if (find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)
968       || BB_PARTITION (src) != BB_PARTITION (target))
969     return NULL;
970
971   /* We can replace or remove a complex jump only when we have exactly
972      two edges.  Also, if we have exactly one outgoing edge, we can
973      redirect that.  */
974   if (EDGE_COUNT (src->succs) >= 3
975       /* Verify that all targets will be TARGET.  Specifically, the
976          edge that is not E must also go to TARGET.  */
977       || (EDGE_COUNT (src->succs) == 2
978           && EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target))
979     return NULL;
980
981   if (!onlyjump_p (insn))
982     return NULL;
983   if ((!optimize || reload_completed) && tablejump_p (insn, NULL, NULL))
984     return NULL;
985
986   /* Avoid removing branch with side effects.  */
987   set = single_set (insn);
988   if (!set || side_effects_p (set))
989     return NULL;
990
991   /* In case we zap a conditional jump, we'll need to kill
992      the cc0 setter too.  */
993   kill_from = insn;
994 #ifdef HAVE_cc0
995   if (reg_mentioned_p (cc0_rtx, PATTERN (insn))
996       && only_sets_cc0_p (PREV_INSN (insn)))
997     kill_from = PREV_INSN (insn);
998 #endif
999
1000   /* See if we can create the fallthru edge.  */
1001   if (in_cfglayout || can_fallthru (src, target))
1002     {
1003       if (dump_file)
1004         fprintf (dump_file, "Removing jump %i.\n", INSN_UID (insn));
1005       fallthru = 1;
1006
1007       /* Selectively unlink whole insn chain.  */
1008       if (in_cfglayout)
1009         {
1010           rtx insn = BB_FOOTER (src);
1011
1012           delete_insn_chain (kill_from, BB_END (src), false);
1013
1014           /* Remove barriers but keep jumptables.  */
1015           while (insn)
1016             {
1017               if (BARRIER_P (insn))
1018                 {
1019                   if (PREV_INSN (insn))
1020                     NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
1021                   else
1022                     BB_FOOTER (src) = NEXT_INSN (insn);
1023                   if (NEXT_INSN (insn))
1024                     PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
1025                 }
1026               if (LABEL_P (insn))
1027                 break;
1028               insn = NEXT_INSN (insn);
1029             }
1030         }
1031       else
1032         delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)),
1033                            false);
1034     }
1035
1036   /* If this already is simplejump, redirect it.  */
1037   else if (simplejump_p (insn))
1038     {
1039       if (e->dest == target)
1040         return NULL;
1041       if (dump_file)
1042         fprintf (dump_file, "Redirecting jump %i from %i to %i.\n",
1043                  INSN_UID (insn), e->dest->index, target->index);
1044       if (!redirect_jump (insn, block_label (target), 0))
1045         {
1046           gcc_assert (target == EXIT_BLOCK_PTR);
1047           return NULL;
1048         }
1049     }
1050
1051   /* Cannot do anything for target exit block.  */
1052   else if (target == EXIT_BLOCK_PTR)
1053     return NULL;
1054
1055   /* Or replace possibly complicated jump insn by simple jump insn.  */
1056   else
1057     {
1058       rtx target_label = block_label (target);
1059       rtx barrier, label, table;
1060
1061       emit_jump_insn_after_noloc (gen_jump (target_label), insn);
1062       JUMP_LABEL (BB_END (src)) = target_label;
1063       LABEL_NUSES (target_label)++;
1064       if (dump_file)
1065         fprintf (dump_file, "Replacing insn %i by jump %i\n",
1066                  INSN_UID (insn), INSN_UID (BB_END (src)));
1067
1068
1069       delete_insn_chain (kill_from, insn, false);
1070
1071       /* Recognize a tablejump that we are converting to a
1072          simple jump and remove its associated CODE_LABEL
1073          and ADDR_VEC or ADDR_DIFF_VEC.  */
1074       if (tablejump_p (insn, &label, &table))
1075         delete_insn_chain (label, table, false);
1076
1077       barrier = next_nonnote_insn (BB_END (src));
1078       if (!barrier || !BARRIER_P (barrier))
1079         emit_barrier_after (BB_END (src));
1080       else
1081         {
1082           if (barrier != NEXT_INSN (BB_END (src)))
1083             {
1084               /* Move the jump before barrier so that the notes
1085                  which originally were or were created before jump table are
1086                  inside the basic block.  */
1087               rtx new_insn = BB_END (src);
1088
1089               update_bb_for_insn_chain (NEXT_INSN (BB_END (src)),
1090                                         PREV_INSN (barrier), src);
1091
1092               NEXT_INSN (PREV_INSN (new_insn)) = NEXT_INSN (new_insn);
1093               PREV_INSN (NEXT_INSN (new_insn)) = PREV_INSN (new_insn);
1094
1095               NEXT_INSN (new_insn) = barrier;
1096               NEXT_INSN (PREV_INSN (barrier)) = new_insn;
1097
1098               PREV_INSN (new_insn) = PREV_INSN (barrier);
1099               PREV_INSN (barrier) = new_insn;
1100             }
1101         }
1102     }
1103
1104   /* Keep only one edge out and set proper flags.  */
1105   if (!single_succ_p (src))
1106     remove_edge (e);
1107   gcc_assert (single_succ_p (src));
1108
1109   e = single_succ_edge (src);
1110   if (fallthru)
1111     e->flags = EDGE_FALLTHRU;
1112   else
1113     e->flags = 0;
1114
1115   e->probability = REG_BR_PROB_BASE;
1116   e->count = src->count;
1117
1118   if (e->dest != target)
1119     redirect_edge_succ (e, target);
1120   return e;
1121 }
1122
1123 /* Subroutine of redirect_branch_edge that tries to patch the jump
1124    instruction INSN so that it reaches block NEW.  Do this
1125    only when it originally reached block OLD.  Return true if this
1126    worked or the original target wasn't OLD, return false if redirection
1127    doesn't work.  */
1128
1129 static bool
1130 patch_jump_insn (rtx insn, rtx old_label, basic_block new_bb)
1131 {
1132   rtx tmp;
1133   /* Recognize a tablejump and adjust all matching cases.  */
1134   if (tablejump_p (insn, NULL, &tmp))
1135     {
1136       rtvec vec;
1137       int j;
1138       rtx new_label = block_label (new_bb);
1139
1140       if (new_bb == EXIT_BLOCK_PTR)
1141         return false;
1142       if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
1143         vec = XVEC (PATTERN (tmp), 0);
1144       else
1145         vec = XVEC (PATTERN (tmp), 1);
1146
1147       for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
1148         if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
1149           {
1150             RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
1151             --LABEL_NUSES (old_label);
1152             ++LABEL_NUSES (new_label);
1153           }
1154
1155       /* Handle casesi dispatch insns.  */
1156       if ((tmp = single_set (insn)) != NULL
1157           && SET_DEST (tmp) == pc_rtx
1158           && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
1159           && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
1160           && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
1161         {
1162           XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (Pmode,
1163                                                        new_label);
1164           --LABEL_NUSES (old_label);
1165           ++LABEL_NUSES (new_label);
1166         }
1167     }
1168   else if ((tmp = extract_asm_operands (PATTERN (insn))) != NULL)
1169     {
1170       int i, n = ASM_OPERANDS_LABEL_LENGTH (tmp);
1171       rtx new_label, note;
1172
1173       if (new_bb == EXIT_BLOCK_PTR)
1174         return false;
1175       new_label = block_label (new_bb);
1176
1177       for (i = 0; i < n; ++i)
1178         {
1179           rtx old_ref = ASM_OPERANDS_LABEL (tmp, i);
1180           gcc_assert (GET_CODE (old_ref) == LABEL_REF);
1181           if (XEXP (old_ref, 0) == old_label)
1182             {
1183               ASM_OPERANDS_LABEL (tmp, i)
1184                 = gen_rtx_LABEL_REF (Pmode, new_label);
1185               --LABEL_NUSES (old_label);
1186               ++LABEL_NUSES (new_label);
1187             }
1188         }
1189
1190       if (JUMP_LABEL (insn) == old_label)
1191         {
1192           JUMP_LABEL (insn) = new_label;
1193           note = find_reg_note (insn, REG_LABEL_TARGET, new_label);
1194           if (note)
1195             remove_note (insn, note);
1196         }
1197       else
1198         {
1199           note = find_reg_note (insn, REG_LABEL_TARGET, old_label);
1200           if (note)
1201             remove_note (insn, note);
1202           if (JUMP_LABEL (insn) != new_label
1203               && !find_reg_note (insn, REG_LABEL_TARGET, new_label))
1204             add_reg_note (insn, REG_LABEL_TARGET, new_label);
1205         }
1206       while ((note = find_reg_note (insn, REG_LABEL_OPERAND, old_label))
1207              != NULL_RTX)
1208         XEXP (note, 0) = new_label;
1209     }
1210   else
1211     {
1212       /* ?? We may play the games with moving the named labels from
1213          one basic block to the other in case only one computed_jump is
1214          available.  */
1215       if (computed_jump_p (insn)
1216           /* A return instruction can't be redirected.  */
1217           || returnjump_p (insn))
1218         return false;
1219
1220       if (!currently_expanding_to_rtl || JUMP_LABEL (insn) == old_label)
1221         {
1222           /* If the insn doesn't go where we think, we're confused.  */
1223           gcc_assert (JUMP_LABEL (insn) == old_label);
1224
1225           /* If the substitution doesn't succeed, die.  This can happen
1226              if the back end emitted unrecognizable instructions or if
1227              target is exit block on some arches.  */
1228           if (!redirect_jump (insn, block_label (new_bb), 0))
1229             {
1230               gcc_assert (new_bb == EXIT_BLOCK_PTR);
1231               return false;
1232             }
1233         }
1234     }
1235   return true;
1236 }
1237
1238
1239 /* Redirect edge representing branch of (un)conditional jump or tablejump,
1240    NULL on failure  */
1241 static edge
1242 redirect_branch_edge (edge e, basic_block target)
1243 {
1244   rtx old_label = BB_HEAD (e->dest);
1245   basic_block src = e->src;
1246   rtx insn = BB_END (src);
1247
1248   /* We can only redirect non-fallthru edges of jump insn.  */
1249   if (e->flags & EDGE_FALLTHRU)
1250     return NULL;
1251   else if (!JUMP_P (insn) && !currently_expanding_to_rtl)
1252     return NULL;
1253
1254   if (!currently_expanding_to_rtl)
1255     {
1256       if (!patch_jump_insn (insn, old_label, target))
1257         return NULL;
1258     }
1259   else
1260     /* When expanding this BB might actually contain multiple
1261        jumps (i.e. not yet split by find_many_sub_basic_blocks).
1262        Redirect all of those that match our label.  */
1263     FOR_BB_INSNS (src, insn)
1264       if (JUMP_P (insn) && !patch_jump_insn (insn, old_label, target))
1265         return NULL;
1266
1267   if (dump_file)
1268     fprintf (dump_file, "Edge %i->%i redirected to %i\n",
1269              e->src->index, e->dest->index, target->index);
1270
1271   if (e->dest != target)
1272     e = redirect_edge_succ_nodup (e, target);
1273
1274   return e;
1275 }
1276
1277 /* Attempt to change code to redirect edge E to TARGET.  Don't do that on
1278    expense of adding new instructions or reordering basic blocks.
1279
1280    Function can be also called with edge destination equivalent to the TARGET.
1281    Then it should try the simplifications and do nothing if none is possible.
1282
1283    Return edge representing the branch if transformation succeeded.  Return NULL
1284    on failure.
1285    We still return NULL in case E already destinated TARGET and we didn't
1286    managed to simplify instruction stream.  */
1287
1288 static edge
1289 rtl_redirect_edge_and_branch (edge e, basic_block target)
1290 {
1291   edge ret;
1292   basic_block src = e->src;
1293
1294   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
1295     return NULL;
1296
1297   if (e->dest == target)
1298     return e;
1299
1300   if ((ret = try_redirect_by_replacing_jump (e, target, false)) != NULL)
1301     {
1302       df_set_bb_dirty (src);
1303       return ret;
1304     }
1305
1306   ret = redirect_branch_edge (e, target);
1307   if (!ret)
1308     return NULL;
1309
1310   df_set_bb_dirty (src);
1311   return ret;
1312 }
1313
1314 /* Like force_nonfallthru below, but additionally performs redirection
1315    Used by redirect_edge_and_branch_force.  JUMP_LABEL is used only
1316    when redirecting to the EXIT_BLOCK, it is either ret_rtx or
1317    simple_return_rtx, indicating which kind of returnjump to create.
1318    It should be NULL otherwise.  */
1319
1320 basic_block
1321 force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label)
1322 {
1323   basic_block jump_block, new_bb = NULL, src = e->src;
1324   rtx note;
1325   edge new_edge;
1326   int abnormal_edge_flags = 0;
1327   bool asm_goto_edge = false;
1328   int loc;
1329
1330   /* In the case the last instruction is conditional jump to the next
1331      instruction, first redirect the jump itself and then continue
1332      by creating a basic block afterwards to redirect fallthru edge.  */
1333   if (e->src != ENTRY_BLOCK_PTR && e->dest != EXIT_BLOCK_PTR
1334       && any_condjump_p (BB_END (e->src))
1335       && JUMP_LABEL (BB_END (e->src)) == BB_HEAD (e->dest))
1336     {
1337       rtx note;
1338       edge b = unchecked_make_edge (e->src, target, 0);
1339       bool redirected;
1340
1341       redirected = redirect_jump (BB_END (e->src), block_label (target), 0);
1342       gcc_assert (redirected);
1343
1344       note = find_reg_note (BB_END (e->src), REG_BR_PROB, NULL_RTX);
1345       if (note)
1346         {
1347           int prob = INTVAL (XEXP (note, 0));
1348
1349           b->probability = prob;
1350           b->count = e->count * prob / REG_BR_PROB_BASE;
1351           e->probability -= e->probability;
1352           e->count -= b->count;
1353           if (e->probability < 0)
1354             e->probability = 0;
1355           if (e->count < 0)
1356             e->count = 0;
1357         }
1358     }
1359
1360   if (e->flags & EDGE_ABNORMAL)
1361     {
1362       /* Irritating special case - fallthru edge to the same block as abnormal
1363          edge.
1364          We can't redirect abnormal edge, but we still can split the fallthru
1365          one and create separate abnormal edge to original destination.
1366          This allows bb-reorder to make such edge non-fallthru.  */
1367       gcc_assert (e->dest == target);
1368       abnormal_edge_flags = e->flags & ~EDGE_FALLTHRU;
1369       e->flags &= EDGE_FALLTHRU;
1370     }
1371   else
1372     {
1373       gcc_assert (e->flags & EDGE_FALLTHRU);
1374       if (e->src == ENTRY_BLOCK_PTR)
1375         {
1376           /* We can't redirect the entry block.  Create an empty block
1377              at the start of the function which we use to add the new
1378              jump.  */
1379           edge tmp;
1380           edge_iterator ei;
1381           bool found = false;
1382
1383           basic_block bb = create_basic_block (BB_HEAD (e->dest), NULL, ENTRY_BLOCK_PTR);
1384
1385           /* Change the existing edge's source to be the new block, and add
1386              a new edge from the entry block to the new block.  */
1387           e->src = bb;
1388           for (ei = ei_start (ENTRY_BLOCK_PTR->succs); (tmp = ei_safe_edge (ei)); )
1389             {
1390               if (tmp == e)
1391                 {
1392                   VEC_unordered_remove (edge, ENTRY_BLOCK_PTR->succs, ei.index);
1393                   found = true;
1394                   break;
1395                 }
1396               else
1397                 ei_next (&ei);
1398             }
1399
1400           gcc_assert (found);
1401
1402           VEC_safe_push (edge, gc, bb->succs, e);
1403           make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
1404         }
1405     }
1406
1407   /* If e->src ends with asm goto, see if any of the ASM_OPERANDS_LABELs
1408      don't point to the target or fallthru label.  */
1409   if (JUMP_P (BB_END (e->src))
1410       && target != EXIT_BLOCK_PTR
1411       && (e->flags & EDGE_FALLTHRU)
1412       && (note = extract_asm_operands (PATTERN (BB_END (e->src)))))
1413     {
1414       int i, n = ASM_OPERANDS_LABEL_LENGTH (note);
1415
1416       for (i = 0; i < n; ++i)
1417         {
1418           if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (e->dest))
1419             XEXP (ASM_OPERANDS_LABEL (note, i), 0) = block_label (target);
1420           if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (target))
1421             asm_goto_edge = true;
1422         }
1423     }
1424
1425   if (EDGE_COUNT (e->src->succs) >= 2 || abnormal_edge_flags || asm_goto_edge)
1426     {
1427       gcov_type count = e->count;
1428       int probability = e->probability;
1429       /* Create the new structures.  */
1430
1431       /* If the old block ended with a tablejump, skip its table
1432          by searching forward from there.  Otherwise start searching
1433          forward from the last instruction of the old block.  */
1434       if (!tablejump_p (BB_END (e->src), NULL, &note))
1435         note = BB_END (e->src);
1436       note = NEXT_INSN (note);
1437
1438       jump_block = create_basic_block (note, NULL, e->src);
1439       jump_block->count = count;
1440       jump_block->frequency = EDGE_FREQUENCY (e);
1441
1442       /* Make sure new block ends up in correct hot/cold section.  */
1443
1444       BB_COPY_PARTITION (jump_block, e->src);
1445       if (flag_reorder_blocks_and_partition
1446           && targetm_common.have_named_sections
1447           && JUMP_P (BB_END (jump_block))
1448           && !any_condjump_p (BB_END (jump_block))
1449           && (EDGE_SUCC (jump_block, 0)->flags & EDGE_CROSSING))
1450         add_reg_note (BB_END (jump_block), REG_CROSSING_JUMP, NULL_RTX);
1451
1452       /* Wire edge in.  */
1453       new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1454       new_edge->probability = probability;
1455       new_edge->count = count;
1456
1457       /* Redirect old edge.  */
1458       redirect_edge_pred (e, jump_block);
1459       e->probability = REG_BR_PROB_BASE;
1460
1461       /* If asm goto has any label refs to target's label,
1462          add also edge from asm goto bb to target.  */
1463       if (asm_goto_edge)
1464         {
1465           new_edge->probability /= 2;
1466           new_edge->count /= 2;
1467           jump_block->count /= 2;
1468           jump_block->frequency /= 2;
1469           new_edge = make_edge (new_edge->src, target,
1470                                 e->flags & ~EDGE_FALLTHRU);
1471           new_edge->probability = probability - probability / 2;
1472           new_edge->count = count - count / 2;
1473         }
1474
1475       new_bb = jump_block;
1476     }
1477   else
1478     jump_block = e->src;
1479
1480   loc = e->goto_locus;
1481   e->flags &= ~EDGE_FALLTHRU;
1482   if (target == EXIT_BLOCK_PTR)
1483     {
1484       if (jump_label == ret_rtx)
1485         {
1486 #ifdef HAVE_return
1487           emit_jump_insn_after_setloc (gen_return (), BB_END (jump_block), loc);
1488 #else
1489           gcc_unreachable ();
1490 #endif
1491         }
1492       else
1493         {
1494           gcc_assert (jump_label == simple_return_rtx);
1495 #ifdef HAVE_simple_return
1496           emit_jump_insn_after_setloc (gen_simple_return (),
1497                                        BB_END (jump_block), loc);
1498 #else
1499           gcc_unreachable ();
1500 #endif
1501         }
1502       set_return_jump_label (BB_END (jump_block));
1503     }
1504   else
1505     {
1506       rtx label = block_label (target);
1507       emit_jump_insn_after_setloc (gen_jump (label), BB_END (jump_block), loc);
1508       JUMP_LABEL (BB_END (jump_block)) = label;
1509       LABEL_NUSES (label)++;
1510     }
1511
1512   emit_barrier_after (BB_END (jump_block));
1513   redirect_edge_succ_nodup (e, target);
1514
1515   if (abnormal_edge_flags)
1516     make_edge (src, target, abnormal_edge_flags);
1517
1518   df_mark_solutions_dirty ();
1519   return new_bb;
1520 }
1521
1522 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
1523    (and possibly create new basic block) to make edge non-fallthru.
1524    Return newly created BB or NULL if none.  */
1525
1526 static basic_block
1527 rtl_force_nonfallthru (edge e)
1528 {
1529   return force_nonfallthru_and_redirect (e, e->dest, NULL_RTX);
1530 }
1531
1532 /* Redirect edge even at the expense of creating new jump insn or
1533    basic block.  Return new basic block if created, NULL otherwise.
1534    Conversion must be possible.  */
1535
1536 static basic_block
1537 rtl_redirect_edge_and_branch_force (edge e, basic_block target)
1538 {
1539   if (redirect_edge_and_branch (e, target)
1540       || e->dest == target)
1541     return NULL;
1542
1543   /* In case the edge redirection failed, try to force it to be non-fallthru
1544      and redirect newly created simplejump.  */
1545   df_set_bb_dirty (e->src);
1546   return force_nonfallthru_and_redirect (e, target, NULL_RTX);
1547 }
1548
1549 /* The given edge should potentially be a fallthru edge.  If that is in
1550    fact true, delete the jump and barriers that are in the way.  */
1551
1552 static void
1553 rtl_tidy_fallthru_edge (edge e)
1554 {
1555   rtx q;
1556   basic_block b = e->src, c = b->next_bb;
1557
1558   /* ??? In a late-running flow pass, other folks may have deleted basic
1559      blocks by nopping out blocks, leaving multiple BARRIERs between here
1560      and the target label. They ought to be chastised and fixed.
1561
1562      We can also wind up with a sequence of undeletable labels between
1563      one block and the next.
1564
1565      So search through a sequence of barriers, labels, and notes for
1566      the head of block C and assert that we really do fall through.  */
1567
1568   for (q = NEXT_INSN (BB_END (b)); q != BB_HEAD (c); q = NEXT_INSN (q))
1569     if (INSN_P (q))
1570       return;
1571
1572   /* Remove what will soon cease being the jump insn from the source block.
1573      If block B consisted only of this single jump, turn it into a deleted
1574      note.  */
1575   q = BB_END (b);
1576   if (JUMP_P (q)
1577       && onlyjump_p (q)
1578       && (any_uncondjump_p (q)
1579           || single_succ_p (b)))
1580     {
1581 #ifdef HAVE_cc0
1582       /* If this was a conditional jump, we need to also delete
1583          the insn that set cc0.  */
1584       if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1585         q = PREV_INSN (q);
1586 #endif
1587
1588       q = PREV_INSN (q);
1589     }
1590
1591   /* Selectively unlink the sequence.  */
1592   if (q != PREV_INSN (BB_HEAD (c)))
1593     delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c)), false);
1594
1595   e->flags |= EDGE_FALLTHRU;
1596 }
1597 \f
1598 /* Should move basic block BB after basic block AFTER.  NIY.  */
1599
1600 static bool
1601 rtl_move_block_after (basic_block bb ATTRIBUTE_UNUSED,
1602                       basic_block after ATTRIBUTE_UNUSED)
1603 {
1604   return false;
1605 }
1606
1607 /* Split a (typically critical) edge.  Return the new block.
1608    The edge must not be abnormal.
1609
1610    ??? The code generally expects to be called on critical edges.
1611    The case of a block ending in an unconditional jump to a
1612    block with multiple predecessors is not handled optimally.  */
1613
1614 static basic_block
1615 rtl_split_edge (edge edge_in)
1616 {
1617   basic_block bb;
1618   rtx before;
1619
1620   /* Abnormal edges cannot be split.  */
1621   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
1622
1623   /* We are going to place the new block in front of edge destination.
1624      Avoid existence of fallthru predecessors.  */
1625   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1626     {
1627       edge e = find_fallthru_edge (edge_in->dest->preds);
1628
1629       if (e)
1630         force_nonfallthru (e);
1631     }
1632
1633   /* Create the basic block note.  */
1634   if (edge_in->dest != EXIT_BLOCK_PTR)
1635     before = BB_HEAD (edge_in->dest);
1636   else
1637     before = NULL_RTX;
1638
1639   /* If this is a fall through edge to the exit block, the blocks might be
1640      not adjacent, and the right place is after the source.  */
1641   if ((edge_in->flags & EDGE_FALLTHRU) && edge_in->dest == EXIT_BLOCK_PTR)
1642     {
1643       before = NEXT_INSN (BB_END (edge_in->src));
1644       bb = create_basic_block (before, NULL, edge_in->src);
1645       BB_COPY_PARTITION (bb, edge_in->src);
1646     }
1647   else
1648     {
1649       bb = create_basic_block (before, NULL, edge_in->dest->prev_bb);
1650       /* ??? Why not edge_in->dest->prev_bb here?  */
1651       BB_COPY_PARTITION (bb, edge_in->dest);
1652     }
1653
1654   make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1655
1656   /* For non-fallthru edges, we must adjust the predecessor's
1657      jump instruction to target our new block.  */
1658   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1659     {
1660       edge redirected = redirect_edge_and_branch (edge_in, bb);
1661       gcc_assert (redirected);
1662     }
1663   else
1664     {
1665       if (edge_in->src != ENTRY_BLOCK_PTR)
1666         {
1667           /* For asm goto even splitting of fallthru edge might
1668              need insn patching, as other labels might point to the
1669              old label.  */
1670           rtx last = BB_END (edge_in->src);
1671           if (last
1672               && JUMP_P (last)
1673               && edge_in->dest != EXIT_BLOCK_PTR
1674               && extract_asm_operands (PATTERN (last)) != NULL_RTX
1675               && patch_jump_insn (last, before, bb))
1676             df_set_bb_dirty (edge_in->src);
1677         }
1678       redirect_edge_succ (edge_in, bb);
1679     }
1680
1681   return bb;
1682 }
1683
1684 /* Queue instructions for insertion on an edge between two basic blocks.
1685    The new instructions and basic blocks (if any) will not appear in the
1686    CFG until commit_edge_insertions is called.  */
1687
1688 void
1689 insert_insn_on_edge (rtx pattern, edge e)
1690 {
1691   /* We cannot insert instructions on an abnormal critical edge.
1692      It will be easier to find the culprit if we die now.  */
1693   gcc_assert (!((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)));
1694
1695   if (e->insns.r == NULL_RTX)
1696     start_sequence ();
1697   else
1698     push_to_sequence (e->insns.r);
1699
1700   emit_insn (pattern);
1701
1702   e->insns.r = get_insns ();
1703   end_sequence ();
1704 }
1705
1706 /* Update the CFG for the instructions queued on edge E.  */
1707
1708 void
1709 commit_one_edge_insertion (edge e)
1710 {
1711   rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1712   basic_block bb;
1713
1714   /* Pull the insns off the edge now since the edge might go away.  */
1715   insns = e->insns.r;
1716   e->insns.r = NULL_RTX;
1717
1718   /* Figure out where to put these insns.  If the destination has
1719      one predecessor, insert there.  Except for the exit block.  */
1720   if (single_pred_p (e->dest) && e->dest != EXIT_BLOCK_PTR)
1721     {
1722       bb = e->dest;
1723
1724       /* Get the location correct wrt a code label, and "nice" wrt
1725          a basic block note, and before everything else.  */
1726       tmp = BB_HEAD (bb);
1727       if (LABEL_P (tmp))
1728         tmp = NEXT_INSN (tmp);
1729       if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1730         tmp = NEXT_INSN (tmp);
1731       if (tmp == BB_HEAD (bb))
1732         before = tmp;
1733       else if (tmp)
1734         after = PREV_INSN (tmp);
1735       else
1736         after = get_last_insn ();
1737     }
1738
1739   /* If the source has one successor and the edge is not abnormal,
1740      insert there.  Except for the entry block.  */
1741   else if ((e->flags & EDGE_ABNORMAL) == 0
1742            && single_succ_p (e->src)
1743            && e->src != ENTRY_BLOCK_PTR)
1744     {
1745       bb = e->src;
1746
1747       /* It is possible to have a non-simple jump here.  Consider a target
1748          where some forms of unconditional jumps clobber a register.  This
1749          happens on the fr30 for example.
1750
1751          We know this block has a single successor, so we can just emit
1752          the queued insns before the jump.  */
1753       if (JUMP_P (BB_END (bb)))
1754         before = BB_END (bb);
1755       else
1756         {
1757           /* We'd better be fallthru, or we've lost track of what's what.  */
1758           gcc_assert (e->flags & EDGE_FALLTHRU);
1759
1760           after = BB_END (bb);
1761         }
1762     }
1763
1764   /* Otherwise we must split the edge.  */
1765   else
1766     {
1767       bb = split_edge (e);
1768       after = BB_END (bb);
1769
1770       if (flag_reorder_blocks_and_partition
1771           && targetm_common.have_named_sections
1772           && e->src != ENTRY_BLOCK_PTR
1773           && BB_PARTITION (e->src) == BB_COLD_PARTITION
1774           && !(e->flags & EDGE_CROSSING)
1775           && JUMP_P (after)
1776           && !any_condjump_p (after)
1777           && (single_succ_edge (bb)->flags & EDGE_CROSSING))
1778         add_reg_note (after, REG_CROSSING_JUMP, NULL_RTX);
1779     }
1780
1781   /* Now that we've found the spot, do the insertion.  */
1782   if (before)
1783     {
1784       emit_insn_before_noloc (insns, before, bb);
1785       last = prev_nonnote_insn (before);
1786     }
1787   else
1788     last = emit_insn_after_noloc (insns, after, bb);
1789
1790   if (returnjump_p (last))
1791     {
1792       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1793          This is not currently a problem because this only happens
1794          for the (single) epilogue, which already has a fallthru edge
1795          to EXIT.  */
1796
1797       e = single_succ_edge (bb);
1798       gcc_assert (e->dest == EXIT_BLOCK_PTR
1799                   && single_succ_p (bb) && (e->flags & EDGE_FALLTHRU));
1800
1801       e->flags &= ~EDGE_FALLTHRU;
1802       emit_barrier_after (last);
1803
1804       if (before)
1805         delete_insn (before);
1806     }
1807   else
1808     gcc_assert (!JUMP_P (last));
1809 }
1810
1811 /* Update the CFG for all queued instructions.  */
1812
1813 void
1814 commit_edge_insertions (void)
1815 {
1816   basic_block bb;
1817
1818 #ifdef ENABLE_CHECKING
1819   verify_flow_info ();
1820 #endif
1821
1822   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1823     {
1824       edge e;
1825       edge_iterator ei;
1826
1827       FOR_EACH_EDGE (e, ei, bb->succs)
1828         if (e->insns.r)
1829           commit_one_edge_insertion (e);
1830     }
1831 }
1832 \f
1833
1834 /* Print out RTL-specific basic block information (live information
1835    at start and end with TDF_DETAILS).  FLAGS are the TDF_* masks
1836    documented in dumpfile.h.  */
1837
1838 static void
1839 rtl_dump_bb (FILE *outf, basic_block bb, int indent, int flags)
1840 {
1841   rtx insn;
1842   rtx last;
1843   char *s_indent;
1844
1845   s_indent = (char *) alloca ((size_t) indent + 1);
1846   memset (s_indent, ' ', (size_t) indent);
1847   s_indent[indent] = '\0';
1848
1849   if (df && (flags & TDF_DETAILS))
1850     {
1851       df_dump_top (bb, outf);
1852       putc ('\n', outf);
1853     }
1854
1855   if (bb->index != ENTRY_BLOCK && bb->index != EXIT_BLOCK)
1856     for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
1857          insn = NEXT_INSN (insn))
1858       {
1859         if (! (flags & TDF_SLIM))
1860           print_rtl_single (outf, insn);
1861         else
1862           dump_insn_slim (outf, insn);
1863
1864       }
1865
1866   if (df && (flags & TDF_DETAILS))
1867     {
1868       df_dump_bottom (bb, outf);
1869       putc ('\n', outf);
1870     }
1871
1872 }
1873 \f
1874 /* Like dump_function_to_file, but for RTL.  Print out dataflow information
1875    for the start of each basic block.  FLAGS are the TDF_* masks documented
1876    in dumpfile.h.  */
1877
1878 void
1879 print_rtl_with_bb (FILE *outf, const_rtx rtx_first, int flags)
1880 {
1881   const_rtx tmp_rtx;
1882   if (rtx_first == 0)
1883     fprintf (outf, "(nil)\n");
1884   else
1885     {
1886       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1887       int max_uid = get_max_uid ();
1888       basic_block *start = XCNEWVEC (basic_block, max_uid);
1889       basic_block *end = XCNEWVEC (basic_block, max_uid);
1890       enum bb_state *in_bb_p = XCNEWVEC (enum bb_state, max_uid);
1891       basic_block bb;
1892
1893       /* After freeing the CFG, we still have BLOCK_FOR_INSN set on most
1894          insns, but the CFG is not maintained so the basic block info
1895          is not reliable.  Therefore it's omitted from the dumps.  */
1896       if (! (cfun->curr_properties & PROP_cfg))
1897         flags &= ~TDF_BLOCKS;
1898
1899       if (df)
1900         df_dump_start (outf);
1901
1902       if (flags & TDF_BLOCKS)
1903         {
1904           FOR_EACH_BB_REVERSE (bb)
1905             {
1906               rtx x;
1907
1908               start[INSN_UID (BB_HEAD (bb))] = bb;
1909               end[INSN_UID (BB_END (bb))] = bb;
1910               for (x = BB_HEAD (bb); x != NULL_RTX; x = NEXT_INSN (x))
1911                 {
1912                   enum bb_state state = IN_MULTIPLE_BB;
1913
1914                   if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1915                     state = IN_ONE_BB;
1916                   in_bb_p[INSN_UID (x)] = state;
1917
1918                   if (x == BB_END (bb))
1919                     break;
1920                 }
1921             }
1922         }
1923
1924       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1925         {
1926           if (flags & TDF_BLOCKS)
1927             {
1928               bb = start[INSN_UID (tmp_rtx)];
1929               if (bb != NULL)
1930                 {
1931                   dump_bb_info (outf, bb, 0, dump_flags | TDF_COMMENT, true, false);
1932                   if (df && (flags & TDF_DETAILS))
1933                     df_dump_top (bb, outf);
1934                 }
1935
1936               if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1937                   && !NOTE_P (tmp_rtx)
1938                   && !BARRIER_P (tmp_rtx))
1939                 fprintf (outf, ";; Insn is not within a basic block\n");
1940               else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1941                 fprintf (outf, ";; Insn is in multiple basic blocks\n");
1942             }
1943
1944           if (! (flags & TDF_SLIM))
1945             print_rtl_single (outf, tmp_rtx);
1946           else
1947             dump_insn_slim (outf, tmp_rtx);
1948
1949           if (flags & TDF_BLOCKS)
1950             {
1951               bb = end[INSN_UID (tmp_rtx)];
1952               if (bb != NULL)
1953                 {
1954                   dump_bb_info (outf, bb, 0, dump_flags | TDF_COMMENT, false, true);
1955                   if (df && (flags & TDF_DETAILS))
1956                     df_dump_bottom (bb, outf);
1957                   putc ('\n', outf);
1958                 }
1959             }
1960         }
1961
1962       free (start);
1963       free (end);
1964       free (in_bb_p);
1965     }
1966
1967   if (crtl->epilogue_delay_list != 0)
1968     {
1969       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1970       for (tmp_rtx = crtl->epilogue_delay_list; tmp_rtx != 0;
1971            tmp_rtx = XEXP (tmp_rtx, 1))
1972         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1973     }
1974 }
1975 \f
1976 /* Update the branch probability of BB if a REG_BR_PROB is present.  */
1977
1978 void
1979 update_br_prob_note (basic_block bb)
1980 {
1981   rtx note;
1982   if (!JUMP_P (BB_END (bb)))
1983     return;
1984   note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX);
1985   if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1986     return;
1987   XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1988 }
1989
1990 /* Get the last insn associated with block BB (that includes barriers and
1991    tablejumps after BB).  */
1992 rtx
1993 get_last_bb_insn (basic_block bb)
1994 {
1995   rtx tmp;
1996   rtx end = BB_END (bb);
1997
1998   /* Include any jump table following the basic block.  */
1999   if (tablejump_p (end, NULL, &tmp))
2000     end = tmp;
2001
2002   /* Include any barriers that may follow the basic block.  */
2003   tmp = next_nonnote_insn_bb (end);
2004   while (tmp && BARRIER_P (tmp))
2005     {
2006       end = tmp;
2007       tmp = next_nonnote_insn_bb (end);
2008     }
2009
2010   return end;
2011 }
2012 \f
2013 /* Verify the CFG and RTL consistency common for both underlying RTL and
2014    cfglayout RTL.
2015
2016    Currently it does following checks:
2017
2018    - overlapping of basic blocks
2019    - insns with wrong BLOCK_FOR_INSN pointers
2020    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
2021    - tails of basic blocks (ensure that boundary is necessary)
2022    - scans body of the basic block for JUMP_INSN, CODE_LABEL
2023      and NOTE_INSN_BASIC_BLOCK
2024    - verify that no fall_thru edge crosses hot/cold partition boundaries
2025    - verify that there are no pending RTL branch predictions
2026
2027    In future it can be extended check a lot of other stuff as well
2028    (reachability of basic blocks, life information, etc. etc.).  */
2029
2030 static int
2031 rtl_verify_flow_info_1 (void)
2032 {
2033   rtx x;
2034   int err = 0;
2035   basic_block bb;
2036
2037   /* Check the general integrity of the basic blocks.  */
2038   FOR_EACH_BB_REVERSE (bb)
2039     {
2040       rtx insn;
2041
2042       if (!(bb->flags & BB_RTL))
2043         {
2044           error ("BB_RTL flag not set for block %d", bb->index);
2045           err = 1;
2046         }
2047
2048       FOR_BB_INSNS (bb, insn)
2049         if (BLOCK_FOR_INSN (insn) != bb)
2050           {
2051             error ("insn %d basic block pointer is %d, should be %d",
2052                    INSN_UID (insn),
2053                    BLOCK_FOR_INSN (insn) ? BLOCK_FOR_INSN (insn)->index : 0,
2054                    bb->index);
2055             err = 1;
2056           }
2057
2058       for (insn = BB_HEADER (bb); insn; insn = NEXT_INSN (insn))
2059         if (!BARRIER_P (insn)
2060             && BLOCK_FOR_INSN (insn) != NULL)
2061           {
2062             error ("insn %d in header of bb %d has non-NULL basic block",
2063                    INSN_UID (insn), bb->index);
2064             err = 1;
2065           }
2066       for (insn = BB_FOOTER (bb); insn; insn = NEXT_INSN (insn))
2067         if (!BARRIER_P (insn)
2068             && BLOCK_FOR_INSN (insn) != NULL)
2069           {
2070             error ("insn %d in footer of bb %d has non-NULL basic block",
2071                    INSN_UID (insn), bb->index);
2072             err = 1;
2073           }
2074     }
2075
2076   /* Now check the basic blocks (boundaries etc.) */
2077   FOR_EACH_BB_REVERSE (bb)
2078     {
2079       int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
2080       edge e, fallthru = NULL;
2081       rtx note;
2082       edge_iterator ei;
2083
2084       if (JUMP_P (BB_END (bb))
2085           && (note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX))
2086           && EDGE_COUNT (bb->succs) >= 2
2087           && any_condjump_p (BB_END (bb)))
2088         {
2089           if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability
2090               && profile_status != PROFILE_ABSENT)
2091             {
2092               error ("verify_flow_info: REG_BR_PROB does not match cfg %wi %i",
2093                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
2094               err = 1;
2095             }
2096         }
2097       FOR_EACH_EDGE (e, ei, bb->succs)
2098         {
2099           bool is_crossing;
2100
2101           if (e->flags & EDGE_FALLTHRU)
2102             n_fallthru++, fallthru = e;
2103
2104           is_crossing = (BB_PARTITION (e->src) != BB_PARTITION (e->dest)
2105                          && e->src != ENTRY_BLOCK_PTR
2106                          && e->dest != EXIT_BLOCK_PTR);
2107           if (e->flags & EDGE_CROSSING)
2108             {
2109               if (!is_crossing)
2110                 {
2111                   error ("EDGE_CROSSING incorrectly set across same section");
2112                   err = 1;
2113                 }
2114               if (e->flags & EDGE_FALLTHRU)
2115                 {
2116                   error ("fallthru edge crosses section boundary (bb %i)",
2117                          e->src->index);
2118                   err = 1;
2119                 }
2120               if (e->flags & EDGE_EH)
2121                 {
2122                   error ("EH edge crosses section boundary (bb %i)",
2123                          e->src->index);
2124                   err = 1;
2125                 }
2126             }
2127           else if (is_crossing)
2128             {
2129               error ("EDGE_CROSSING missing across section boundary");
2130               err = 1;
2131             }
2132
2133           if ((e->flags & ~(EDGE_DFS_BACK
2134                             | EDGE_CAN_FALLTHRU
2135                             | EDGE_IRREDUCIBLE_LOOP
2136                             | EDGE_LOOP_EXIT
2137                             | EDGE_CROSSING
2138                             | EDGE_PRESERVE)) == 0)
2139             n_branch++;
2140
2141           if (e->flags & EDGE_ABNORMAL_CALL)
2142             n_call++;
2143
2144           if (e->flags & EDGE_EH)
2145             n_eh++;
2146           else if (e->flags & EDGE_ABNORMAL)
2147             n_abnormal++;
2148         }
2149
2150       if (n_eh && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
2151         {
2152           error ("missing REG_EH_REGION note in the end of bb %i", bb->index);
2153           err = 1;
2154         }
2155       if (n_eh > 1)
2156         {
2157           error ("too many eh edges %i", bb->index);
2158           err = 1;
2159         }
2160       if (n_branch
2161           && (!JUMP_P (BB_END (bb))
2162               || (n_branch > 1 && (any_uncondjump_p (BB_END (bb))
2163                                    || any_condjump_p (BB_END (bb))))))
2164         {
2165           error ("too many outgoing branch edges from bb %i", bb->index);
2166           err = 1;
2167         }
2168       if (n_fallthru && any_uncondjump_p (BB_END (bb)))
2169         {
2170           error ("fallthru edge after unconditional jump %i", bb->index);
2171           err = 1;
2172         }
2173       if (n_branch != 1 && any_uncondjump_p (BB_END (bb)))
2174         {
2175           error ("wrong number of branch edges after unconditional jump %i",
2176                  bb->index);
2177           err = 1;
2178         }
2179       if (n_branch != 1 && any_condjump_p (BB_END (bb))
2180           && JUMP_LABEL (BB_END (bb)) != BB_HEAD (fallthru->dest))
2181         {
2182           error ("wrong amount of branch edges after conditional jump %i",
2183                  bb->index);
2184           err = 1;
2185         }
2186       if (n_call && !CALL_P (BB_END (bb)))
2187         {
2188           error ("call edges for non-call insn in bb %i", bb->index);
2189           err = 1;
2190         }
2191       if (n_abnormal
2192           && (!CALL_P (BB_END (bb)) && n_call != n_abnormal)
2193           && (!JUMP_P (BB_END (bb))
2194               || any_condjump_p (BB_END (bb))
2195               || any_uncondjump_p (BB_END (bb))))
2196         {
2197           error ("abnormal edges for no purpose in bb %i", bb->index);
2198           err = 1;
2199         }
2200
2201       for (x = BB_HEAD (bb); x != NEXT_INSN (BB_END (bb)); x = NEXT_INSN (x))
2202         /* We may have a barrier inside a basic block before dead code
2203            elimination.  There is no BLOCK_FOR_INSN field in a barrier.  */
2204         if (!BARRIER_P (x) && BLOCK_FOR_INSN (x) != bb)
2205           {
2206             debug_rtx (x);
2207             if (! BLOCK_FOR_INSN (x))
2208               error
2209                 ("insn %d inside basic block %d but block_for_insn is NULL",
2210                  INSN_UID (x), bb->index);
2211             else
2212               error
2213                 ("insn %d inside basic block %d but block_for_insn is %i",
2214                  INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
2215
2216             err = 1;
2217           }
2218
2219       /* OK pointers are correct.  Now check the header of basic
2220          block.  It ought to contain optional CODE_LABEL followed
2221          by NOTE_BASIC_BLOCK.  */
2222       x = BB_HEAD (bb);
2223       if (LABEL_P (x))
2224         {
2225           if (BB_END (bb) == x)
2226             {
2227               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2228                      bb->index);
2229               err = 1;
2230             }
2231
2232           x = NEXT_INSN (x);
2233         }
2234
2235       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2236         {
2237           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2238                  bb->index);
2239           err = 1;
2240         }
2241
2242       if (BB_END (bb) == x)
2243         /* Do checks for empty blocks here.  */
2244         ;
2245       else
2246         for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
2247           {
2248             if (NOTE_INSN_BASIC_BLOCK_P (x))
2249               {
2250                 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
2251                        INSN_UID (x), bb->index);
2252                 err = 1;
2253               }
2254
2255             if (x == BB_END (bb))
2256               break;
2257
2258             if (control_flow_insn_p (x))
2259               {
2260                 error ("in basic block %d:", bb->index);
2261                 fatal_insn ("flow control insn inside a basic block", x);
2262               }
2263           }
2264     }
2265
2266   /* Clean up.  */
2267   return err;
2268 }
2269
2270 /* Verify the CFG and RTL consistency common for both underlying RTL and
2271    cfglayout RTL.
2272
2273    Currently it does following checks:
2274    - all checks of rtl_verify_flow_info_1
2275    - test head/end pointers
2276    - check that all insns are in the basic blocks
2277      (except the switch handling code, barriers and notes)
2278    - check that all returns are followed by barriers
2279    - check that all fallthru edge points to the adjacent blocks.  */
2280
2281 static int
2282 rtl_verify_flow_info (void)
2283 {
2284   basic_block bb;
2285   int err = rtl_verify_flow_info_1 ();
2286   rtx x;
2287   rtx last_head = get_last_insn ();
2288   basic_block *bb_info;
2289   int num_bb_notes;
2290   const rtx rtx_first = get_insns ();
2291   basic_block last_bb_seen = ENTRY_BLOCK_PTR, curr_bb = NULL;
2292   const int max_uid = get_max_uid ();
2293
2294   bb_info = XCNEWVEC (basic_block, max_uid);
2295
2296   FOR_EACH_BB_REVERSE (bb)
2297     {
2298       edge e;
2299       rtx head = BB_HEAD (bb);
2300       rtx end = BB_END (bb);
2301
2302       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2303         {
2304           /* Verify the end of the basic block is in the INSN chain.  */
2305           if (x == end)
2306             break;
2307
2308           /* And that the code outside of basic blocks has NULL bb field.  */
2309         if (!BARRIER_P (x)
2310             && BLOCK_FOR_INSN (x) != NULL)
2311           {
2312             error ("insn %d outside of basic blocks has non-NULL bb field",
2313                    INSN_UID (x));
2314             err = 1;
2315           }
2316         }
2317
2318       if (!x)
2319         {
2320           error ("end insn %d for block %d not found in the insn stream",
2321                  INSN_UID (end), bb->index);
2322           err = 1;
2323         }
2324
2325       /* Work backwards from the end to the head of the basic block
2326          to verify the head is in the RTL chain.  */
2327       for (; x != NULL_RTX; x = PREV_INSN (x))
2328         {
2329           /* While walking over the insn chain, verify insns appear
2330              in only one basic block.  */
2331           if (bb_info[INSN_UID (x)] != NULL)
2332             {
2333               error ("insn %d is in multiple basic blocks (%d and %d)",
2334                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
2335               err = 1;
2336             }
2337
2338           bb_info[INSN_UID (x)] = bb;
2339
2340           if (x == head)
2341             break;
2342         }
2343       if (!x)
2344         {
2345           error ("head insn %d for block %d not found in the insn stream",
2346                  INSN_UID (head), bb->index);
2347           err = 1;
2348         }
2349
2350       last_head = PREV_INSN (x);
2351
2352       e = find_fallthru_edge (bb->succs);
2353       if (!e)
2354         {
2355           rtx insn;
2356
2357           /* Ensure existence of barrier in BB with no fallthru edges.  */
2358           for (insn = NEXT_INSN (BB_END (bb)); ; insn = NEXT_INSN (insn))
2359             {
2360               if (!insn || NOTE_INSN_BASIC_BLOCK_P (insn))
2361                 {
2362                   error ("missing barrier after block %i", bb->index);
2363                   err = 1;
2364                   break;
2365                 }
2366               if (BARRIER_P (insn))
2367                 break;
2368             }
2369         }
2370       else if (e->src != ENTRY_BLOCK_PTR
2371                && e->dest != EXIT_BLOCK_PTR)
2372         {
2373           rtx insn;
2374
2375           if (e->src->next_bb != e->dest)
2376             {
2377               error
2378                 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2379                  e->src->index, e->dest->index);
2380               err = 1;
2381             }
2382           else
2383             for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD (e->dest);
2384                  insn = NEXT_INSN (insn))
2385               if (BARRIER_P (insn) || INSN_P (insn))
2386                 {
2387                   error ("verify_flow_info: Incorrect fallthru %i->%i",
2388                          e->src->index, e->dest->index);
2389                   fatal_insn ("wrong insn in the fallthru edge", insn);
2390                   err = 1;
2391                 }
2392         }
2393     }
2394
2395   for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2396     {
2397       /* Check that the code before the first basic block has NULL
2398          bb field.  */
2399       if (!BARRIER_P (x)
2400           && BLOCK_FOR_INSN (x) != NULL)
2401         {
2402           error ("insn %d outside of basic blocks has non-NULL bb field",
2403                  INSN_UID (x));
2404           err = 1;
2405         }
2406     }
2407   free (bb_info);
2408
2409   num_bb_notes = 0;
2410   last_bb_seen = ENTRY_BLOCK_PTR;
2411
2412   for (x = rtx_first; x; x = NEXT_INSN (x))
2413     {
2414       if (NOTE_INSN_BASIC_BLOCK_P (x))
2415         {
2416           bb = NOTE_BASIC_BLOCK (x);
2417
2418           num_bb_notes++;
2419           if (bb != last_bb_seen->next_bb)
2420             internal_error ("basic blocks not laid down consecutively");
2421
2422           curr_bb = last_bb_seen = bb;
2423         }
2424
2425       if (!curr_bb)
2426         {
2427           switch (GET_CODE (x))
2428             {
2429             case BARRIER:
2430             case NOTE:
2431               break;
2432
2433             case CODE_LABEL:
2434               /* An addr_vec is placed outside any basic block.  */
2435               if (NEXT_INSN (x)
2436                   && JUMP_TABLE_DATA_P (NEXT_INSN (x)))
2437                 x = NEXT_INSN (x);
2438
2439               /* But in any case, non-deletable labels can appear anywhere.  */
2440               break;
2441
2442             default:
2443               fatal_insn ("insn outside basic block", x);
2444             }
2445         }
2446
2447       if (JUMP_P (x)
2448           && returnjump_p (x) && ! condjump_p (x)
2449           && ! (next_nonnote_insn (x) && BARRIER_P (next_nonnote_insn (x))))
2450             fatal_insn ("return not followed by barrier", x);
2451       if (curr_bb && x == BB_END (curr_bb))
2452         curr_bb = NULL;
2453     }
2454
2455   if (num_bb_notes != n_basic_blocks - NUM_FIXED_BLOCKS)
2456     internal_error
2457       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2458        num_bb_notes, n_basic_blocks);
2459
2460    return err;
2461 }
2462 \f
2463 /* Assume that the preceding pass has possibly eliminated jump instructions
2464    or converted the unconditional jumps.  Eliminate the edges from CFG.
2465    Return true if any edges are eliminated.  */
2466
2467 bool
2468 purge_dead_edges (basic_block bb)
2469 {
2470   edge e;
2471   rtx insn = BB_END (bb), note;
2472   bool purged = false;
2473   bool found;
2474   edge_iterator ei;
2475
2476   if (DEBUG_INSN_P (insn) && insn != BB_HEAD (bb))
2477     do
2478       insn = PREV_INSN (insn);
2479     while ((DEBUG_INSN_P (insn) || NOTE_P (insn)) && insn != BB_HEAD (bb));
2480
2481   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2482   if (NONJUMP_INSN_P (insn)
2483       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2484     {
2485       rtx eqnote;
2486
2487       if (! may_trap_p (PATTERN (insn))
2488           || ((eqnote = find_reg_equal_equiv_note (insn))
2489               && ! may_trap_p (XEXP (eqnote, 0))))
2490         remove_note (insn, note);
2491     }
2492
2493   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2494   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2495     {
2496       bool remove = false;
2497
2498       /* There are three types of edges we need to handle correctly here: EH
2499          edges, abnormal call EH edges, and abnormal call non-EH edges.  The
2500          latter can appear when nonlocal gotos are used.  */
2501       if (e->flags & EDGE_ABNORMAL_CALL)
2502         {
2503           if (!CALL_P (insn))
2504             remove = true;
2505           else if (can_nonlocal_goto (insn))
2506             ;
2507           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2508             ;
2509           else if (flag_tm && find_reg_note (insn, REG_TM, NULL))
2510             ;
2511           else
2512             remove = true;
2513         }
2514       else if (e->flags & EDGE_EH)
2515         remove = !can_throw_internal (insn);
2516
2517       if (remove)
2518         {
2519           remove_edge (e);
2520           df_set_bb_dirty (bb);
2521           purged = true;
2522         }
2523       else
2524         ei_next (&ei);
2525     }
2526
2527   if (JUMP_P (insn))
2528     {
2529       rtx note;
2530       edge b,f;
2531       edge_iterator ei;
2532
2533       /* We do care only about conditional jumps and simplejumps.  */
2534       if (!any_condjump_p (insn)
2535           && !returnjump_p (insn)
2536           && !simplejump_p (insn))
2537         return purged;
2538
2539       /* Branch probability/prediction notes are defined only for
2540          condjumps.  We've possibly turned condjump into simplejump.  */
2541       if (simplejump_p (insn))
2542         {
2543           note = find_reg_note (insn, REG_BR_PROB, NULL);
2544           if (note)
2545             remove_note (insn, note);
2546           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2547             remove_note (insn, note);
2548         }
2549
2550       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2551         {
2552           /* Avoid abnormal flags to leak from computed jumps turned
2553              into simplejumps.  */
2554
2555           e->flags &= ~EDGE_ABNORMAL;
2556
2557           /* See if this edge is one we should keep.  */
2558           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2559             /* A conditional jump can fall through into the next
2560                block, so we should keep the edge.  */
2561             {
2562               ei_next (&ei);
2563               continue;
2564             }
2565           else if (e->dest != EXIT_BLOCK_PTR
2566                    && BB_HEAD (e->dest) == JUMP_LABEL (insn))
2567             /* If the destination block is the target of the jump,
2568                keep the edge.  */
2569             {
2570               ei_next (&ei);
2571               continue;
2572             }
2573           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2574             /* If the destination block is the exit block, and this
2575                instruction is a return, then keep the edge.  */
2576             {
2577               ei_next (&ei);
2578               continue;
2579             }
2580           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2581             /* Keep the edges that correspond to exceptions thrown by
2582                this instruction and rematerialize the EDGE_ABNORMAL
2583                flag we just cleared above.  */
2584             {
2585               e->flags |= EDGE_ABNORMAL;
2586               ei_next (&ei);
2587               continue;
2588             }
2589
2590           /* We do not need this edge.  */
2591           df_set_bb_dirty (bb);
2592           purged = true;
2593           remove_edge (e);
2594         }
2595
2596       if (EDGE_COUNT (bb->succs) == 0 || !purged)
2597         return purged;
2598
2599       if (dump_file)
2600         fprintf (dump_file, "Purged edges from bb %i\n", bb->index);
2601
2602       if (!optimize)
2603         return purged;
2604
2605       /* Redistribute probabilities.  */
2606       if (single_succ_p (bb))
2607         {
2608           single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2609           single_succ_edge (bb)->count = bb->count;
2610         }
2611       else
2612         {
2613           note = find_reg_note (insn, REG_BR_PROB, NULL);
2614           if (!note)
2615             return purged;
2616
2617           b = BRANCH_EDGE (bb);
2618           f = FALLTHRU_EDGE (bb);
2619           b->probability = INTVAL (XEXP (note, 0));
2620           f->probability = REG_BR_PROB_BASE - b->probability;
2621           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2622           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2623         }
2624
2625       return purged;
2626     }
2627   else if (CALL_P (insn) && SIBLING_CALL_P (insn))
2628     {
2629       /* First, there should not be any EH or ABCALL edges resulting
2630          from non-local gotos and the like.  If there were, we shouldn't
2631          have created the sibcall in the first place.  Second, there
2632          should of course never have been a fallthru edge.  */
2633       gcc_assert (single_succ_p (bb));
2634       gcc_assert (single_succ_edge (bb)->flags
2635                   == (EDGE_SIBCALL | EDGE_ABNORMAL));
2636
2637       return 0;
2638     }
2639
2640   /* If we don't see a jump insn, we don't know exactly why the block would
2641      have been broken at this point.  Look for a simple, non-fallthru edge,
2642      as these are only created by conditional branches.  If we find such an
2643      edge we know that there used to be a jump here and can then safely
2644      remove all non-fallthru edges.  */
2645   found = false;
2646   FOR_EACH_EDGE (e, ei, bb->succs)
2647     if (! (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU)))
2648       {
2649         found = true;
2650         break;
2651       }
2652
2653   if (!found)
2654     return purged;
2655
2656   /* Remove all but the fake and fallthru edges.  The fake edge may be
2657      the only successor for this block in the case of noreturn
2658      calls.  */
2659   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2660     {
2661       if (!(e->flags & (EDGE_FALLTHRU | EDGE_FAKE)))
2662         {
2663           df_set_bb_dirty (bb);
2664           remove_edge (e);
2665           purged = true;
2666         }
2667       else
2668         ei_next (&ei);
2669     }
2670
2671   gcc_assert (single_succ_p (bb));
2672
2673   single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2674   single_succ_edge (bb)->count = bb->count;
2675
2676   if (dump_file)
2677     fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
2678              bb->index);
2679   return purged;
2680 }
2681
2682 /* Search all basic blocks for potentially dead edges and purge them.  Return
2683    true if some edge has been eliminated.  */
2684
2685 bool
2686 purge_all_dead_edges (void)
2687 {
2688   int purged = false;
2689   basic_block bb;
2690
2691   FOR_EACH_BB (bb)
2692     {
2693       bool purged_here = purge_dead_edges (bb);
2694
2695       purged |= purged_here;
2696     }
2697
2698   return purged;
2699 }
2700
2701 /* This is used by a few passes that emit some instructions after abnormal
2702    calls, moving the basic block's end, while they in fact do want to emit
2703    them on the fallthru edge.  Look for abnormal call edges, find backward
2704    the call in the block and insert the instructions on the edge instead.
2705
2706    Similarly, handle instructions throwing exceptions internally.
2707
2708    Return true when instructions have been found and inserted on edges.  */
2709
2710 bool
2711 fixup_abnormal_edges (void)
2712 {
2713   bool inserted = false;
2714   basic_block bb;
2715
2716   FOR_EACH_BB (bb)
2717     {
2718       edge e;
2719       edge_iterator ei;
2720
2721       /* Look for cases we are interested in - calls or instructions causing
2722          exceptions.  */
2723       FOR_EACH_EDGE (e, ei, bb->succs)
2724         if ((e->flags & EDGE_ABNORMAL_CALL)
2725             || ((e->flags & (EDGE_ABNORMAL | EDGE_EH))
2726                 == (EDGE_ABNORMAL | EDGE_EH)))
2727           break;
2728
2729       if (e && !CALL_P (BB_END (bb)) && !can_throw_internal (BB_END (bb)))
2730         {
2731           rtx insn;
2732
2733           /* Get past the new insns generated.  Allow notes, as the insns
2734              may be already deleted.  */
2735           insn = BB_END (bb);
2736           while ((NONJUMP_INSN_P (insn) || NOTE_P (insn))
2737                  && !can_throw_internal (insn)
2738                  && insn != BB_HEAD (bb))
2739             insn = PREV_INSN (insn);
2740
2741           if (CALL_P (insn) || can_throw_internal (insn))
2742             {
2743               rtx stop, next;
2744
2745               e = find_fallthru_edge (bb->succs);
2746
2747               stop = NEXT_INSN (BB_END (bb));
2748               BB_END (bb) = insn;
2749
2750               for (insn = NEXT_INSN (insn); insn != stop; insn = next)
2751                 {
2752                   next = NEXT_INSN (insn);
2753                   if (INSN_P (insn))
2754                     {
2755                       delete_insn (insn);
2756
2757                       /* Sometimes there's still the return value USE.
2758                          If it's placed after a trapping call (i.e. that
2759                          call is the last insn anyway), we have no fallthru
2760                          edge.  Simply delete this use and don't try to insert
2761                          on the non-existent edge.  */
2762                       if (GET_CODE (PATTERN (insn)) != USE)
2763                         {
2764                           /* We're not deleting it, we're moving it.  */
2765                           INSN_DELETED_P (insn) = 0;
2766                           PREV_INSN (insn) = NULL_RTX;
2767                           NEXT_INSN (insn) = NULL_RTX;
2768
2769                           insert_insn_on_edge (insn, e);
2770                           inserted = true;
2771                         }
2772                     }
2773                   else if (!BARRIER_P (insn))
2774                     set_block_for_insn (insn, NULL);
2775                 }
2776             }
2777
2778           /* It may be that we don't find any trapping insn.  In this
2779              case we discovered quite late that the insn that had been
2780              marked as can_throw_internal in fact couldn't trap at all.
2781              So we should in fact delete the EH edges out of the block.  */
2782           else
2783             purge_dead_edges (bb);
2784         }
2785     }
2786
2787   return inserted;
2788 }
2789 \f
2790 /* Cut the insns from FIRST to LAST out of the insns stream.  */
2791
2792 rtx
2793 unlink_insn_chain (rtx first, rtx last)
2794 {
2795   rtx prevfirst = PREV_INSN (first);
2796   rtx nextlast = NEXT_INSN (last);
2797
2798   PREV_INSN (first) = NULL;
2799   NEXT_INSN (last) = NULL;
2800   if (prevfirst)
2801     NEXT_INSN (prevfirst) = nextlast;
2802   if (nextlast)
2803     PREV_INSN (nextlast) = prevfirst;
2804   else
2805     set_last_insn (prevfirst);
2806   if (!prevfirst)
2807     set_first_insn (nextlast);
2808   return first;
2809 }
2810 \f
2811 /* Skip over inter-block insns occurring after BB which are typically
2812    associated with BB (e.g., barriers). If there are any such insns,
2813    we return the last one. Otherwise, we return the end of BB.  */
2814
2815 static rtx
2816 skip_insns_after_block (basic_block bb)
2817 {
2818   rtx insn, last_insn, next_head, prev;
2819
2820   next_head = NULL_RTX;
2821   if (bb->next_bb != EXIT_BLOCK_PTR)
2822     next_head = BB_HEAD (bb->next_bb);
2823
2824   for (last_insn = insn = BB_END (bb); (insn = NEXT_INSN (insn)) != 0; )
2825     {
2826       if (insn == next_head)
2827         break;
2828
2829       switch (GET_CODE (insn))
2830         {
2831         case BARRIER:
2832           last_insn = insn;
2833           continue;
2834
2835         case NOTE:
2836           switch (NOTE_KIND (insn))
2837             {
2838             case NOTE_INSN_BLOCK_END:
2839               gcc_unreachable ();
2840               continue;
2841             default:
2842               continue;
2843               break;
2844             }
2845           break;
2846
2847         case CODE_LABEL:
2848           if (NEXT_INSN (insn)
2849               && JUMP_TABLE_DATA_P (NEXT_INSN (insn)))
2850             {
2851               insn = NEXT_INSN (insn);
2852               last_insn = insn;
2853               continue;
2854             }
2855           break;
2856
2857         default:
2858           break;
2859         }
2860
2861       break;
2862     }
2863
2864   /* It is possible to hit contradictory sequence.  For instance:
2865
2866      jump_insn
2867      NOTE_INSN_BLOCK_BEG
2868      barrier
2869
2870      Where barrier belongs to jump_insn, but the note does not.  This can be
2871      created by removing the basic block originally following
2872      NOTE_INSN_BLOCK_BEG.  In such case reorder the notes.  */
2873
2874   for (insn = last_insn; insn != BB_END (bb); insn = prev)
2875     {
2876       prev = PREV_INSN (insn);
2877       if (NOTE_P (insn))
2878         switch (NOTE_KIND (insn))
2879           {
2880           case NOTE_INSN_BLOCK_END:
2881             gcc_unreachable ();
2882             break;
2883           case NOTE_INSN_DELETED:
2884           case NOTE_INSN_DELETED_LABEL:
2885           case NOTE_INSN_DELETED_DEBUG_LABEL:
2886             continue;
2887           default:
2888             reorder_insns (insn, insn, last_insn);
2889           }
2890     }
2891
2892   return last_insn;
2893 }
2894
2895 /* Locate or create a label for a given basic block.  */
2896
2897 static rtx
2898 label_for_bb (basic_block bb)
2899 {
2900   rtx label = BB_HEAD (bb);
2901
2902   if (!LABEL_P (label))
2903     {
2904       if (dump_file)
2905         fprintf (dump_file, "Emitting label for block %d\n", bb->index);
2906
2907       label = block_label (bb);
2908     }
2909
2910   return label;
2911 }
2912
2913 /* Locate the effective beginning and end of the insn chain for each
2914    block, as defined by skip_insns_after_block above.  */
2915
2916 static void
2917 record_effective_endpoints (void)
2918 {
2919   rtx next_insn;
2920   basic_block bb;
2921   rtx insn;
2922
2923   for (insn = get_insns ();
2924        insn
2925        && NOTE_P (insn)
2926        && NOTE_KIND (insn) != NOTE_INSN_BASIC_BLOCK;
2927        insn = NEXT_INSN (insn))
2928     continue;
2929   /* No basic blocks at all?  */
2930   gcc_assert (insn);
2931
2932   if (PREV_INSN (insn))
2933     cfg_layout_function_header =
2934             unlink_insn_chain (get_insns (), PREV_INSN (insn));
2935   else
2936     cfg_layout_function_header = NULL_RTX;
2937
2938   next_insn = get_insns ();
2939   FOR_EACH_BB (bb)
2940     {
2941       rtx end;
2942
2943       if (PREV_INSN (BB_HEAD (bb)) && next_insn != BB_HEAD (bb))
2944         BB_HEADER (bb) = unlink_insn_chain (next_insn,
2945                                               PREV_INSN (BB_HEAD (bb)));
2946       end = skip_insns_after_block (bb);
2947       if (NEXT_INSN (BB_END (bb)) && BB_END (bb) != end)
2948         BB_FOOTER (bb) = unlink_insn_chain (NEXT_INSN (BB_END (bb)), end);
2949       next_insn = NEXT_INSN (BB_END (bb));
2950     }
2951
2952   cfg_layout_function_footer = next_insn;
2953   if (cfg_layout_function_footer)
2954     cfg_layout_function_footer = unlink_insn_chain (cfg_layout_function_footer, get_last_insn ());
2955 }
2956 \f
2957 static unsigned int
2958 into_cfg_layout_mode (void)
2959 {
2960   cfg_layout_initialize (0);
2961   return 0;
2962 }
2963
2964 static unsigned int
2965 outof_cfg_layout_mode (void)
2966 {
2967   basic_block bb;
2968
2969   FOR_EACH_BB (bb)
2970     if (bb->next_bb != EXIT_BLOCK_PTR)
2971       bb->aux = bb->next_bb;
2972
2973   cfg_layout_finalize ();
2974
2975   return 0;
2976 }
2977
2978 struct rtl_opt_pass pass_into_cfg_layout_mode =
2979 {
2980  {
2981   RTL_PASS,
2982   "into_cfglayout",                     /* name */
2983   NULL,                                 /* gate */
2984   into_cfg_layout_mode,                 /* execute */
2985   NULL,                                 /* sub */
2986   NULL,                                 /* next */
2987   0,                                    /* static_pass_number */
2988   TV_CFG,                               /* tv_id */
2989   0,                                    /* properties_required */
2990   PROP_cfglayout,                       /* properties_provided */
2991   0,                                    /* properties_destroyed */
2992   0,                                    /* todo_flags_start */
2993   0                                     /* todo_flags_finish */
2994  }
2995 };
2996
2997 struct rtl_opt_pass pass_outof_cfg_layout_mode =
2998 {
2999  {
3000   RTL_PASS,
3001   "outof_cfglayout",                    /* name */
3002   NULL,                                 /* gate */
3003   outof_cfg_layout_mode,                /* execute */
3004   NULL,                                 /* sub */
3005   NULL,                                 /* next */
3006   0,                                    /* static_pass_number */
3007   TV_CFG,                               /* tv_id */
3008   0,                                    /* properties_required */
3009   0,                                    /* properties_provided */
3010   PROP_cfglayout,                       /* properties_destroyed */
3011   0,                                    /* todo_flags_start */
3012   0                                     /* todo_flags_finish */
3013  }
3014 };
3015 \f
3016
3017 /* Link the basic blocks in the correct order, compacting the basic
3018    block queue while at it.  If STAY_IN_CFGLAYOUT_MODE is false, this
3019    function also clears the basic block header and footer fields.
3020
3021    This function is usually called after a pass (e.g. tracer) finishes
3022    some transformations while in cfglayout mode.  The required sequence
3023    of the basic blocks is in a linked list along the bb->aux field.
3024    This functions re-links the basic block prev_bb and next_bb pointers
3025    accordingly, and it compacts and renumbers the blocks.
3026
3027    FIXME: This currently works only for RTL, but the only RTL-specific
3028    bits are the STAY_IN_CFGLAYOUT_MODE bits.  The tracer pass was moved
3029    to GIMPLE a long time ago, but it doesn't relink the basic block
3030    chain.  It could do that (to give better initial RTL) if this function
3031    is made IR-agnostic (and moved to cfganal.c or cfg.c while at it).  */
3032
3033 void
3034 relink_block_chain (bool stay_in_cfglayout_mode)
3035 {
3036   basic_block bb, prev_bb;
3037   int index;
3038
3039   /* Maybe dump the re-ordered sequence.  */
3040   if (dump_file)
3041     {
3042       fprintf (dump_file, "Reordered sequence:\n");
3043       for (bb = ENTRY_BLOCK_PTR->next_bb, index = NUM_FIXED_BLOCKS;
3044            bb;
3045            bb = (basic_block) bb->aux, index++)
3046         {
3047           fprintf (dump_file, " %i ", index);
3048           if (get_bb_original (bb))
3049             fprintf (dump_file, "duplicate of %i ",
3050                      get_bb_original (bb)->index);
3051           else if (forwarder_block_p (bb)
3052                    && !LABEL_P (BB_HEAD (bb)))
3053             fprintf (dump_file, "compensation ");
3054           else
3055             fprintf (dump_file, "bb %i ", bb->index);
3056           fprintf (dump_file, " [%i]\n", bb->frequency);
3057         }
3058     }
3059
3060   /* Now reorder the blocks.  */
3061   prev_bb = ENTRY_BLOCK_PTR;
3062   bb = ENTRY_BLOCK_PTR->next_bb;
3063   for (; bb; prev_bb = bb, bb = (basic_block) bb->aux)
3064     {
3065       bb->prev_bb = prev_bb;
3066       prev_bb->next_bb = bb;
3067     }
3068   prev_bb->next_bb = EXIT_BLOCK_PTR;
3069   EXIT_BLOCK_PTR->prev_bb = prev_bb;
3070
3071   /* Then, clean up the aux fields.  */
3072   FOR_ALL_BB (bb)
3073     {
3074       bb->aux = NULL;
3075       if (!stay_in_cfglayout_mode)
3076         BB_HEADER (bb) = BB_FOOTER (bb) = NULL;
3077     }
3078
3079   /* Maybe reset the original copy tables, they are not valid anymore
3080      when we renumber the basic blocks in compact_blocks.  If we are
3081      are going out of cfglayout mode, don't re-allocate the tables.  */
3082   free_original_copy_tables ();
3083   if (stay_in_cfglayout_mode)
3084     initialize_original_copy_tables ();
3085
3086   /* Finally, put basic_block_info in the new order.  */
3087   compact_blocks ();
3088 }
3089 \f
3090
3091 /* Given a reorder chain, rearrange the code to match.  */
3092
3093 static void
3094 fixup_reorder_chain (void)
3095 {
3096   basic_block bb;
3097   rtx insn = NULL;
3098
3099   if (cfg_layout_function_header)
3100     {
3101       set_first_insn (cfg_layout_function_header);
3102       insn = cfg_layout_function_header;
3103       while (NEXT_INSN (insn))
3104         insn = NEXT_INSN (insn);
3105     }
3106
3107   /* First do the bulk reordering -- rechain the blocks without regard to
3108      the needed changes to jumps and labels.  */
3109
3110   for (bb = ENTRY_BLOCK_PTR->next_bb; bb; bb = (basic_block) bb->aux)
3111     {
3112       if (BB_HEADER (bb))
3113         {
3114           if (insn)
3115             NEXT_INSN (insn) = BB_HEADER (bb);
3116           else
3117             set_first_insn (BB_HEADER (bb));
3118           PREV_INSN (BB_HEADER (bb)) = insn;
3119           insn = BB_HEADER (bb);
3120           while (NEXT_INSN (insn))
3121             insn = NEXT_INSN (insn);
3122         }
3123       if (insn)
3124         NEXT_INSN (insn) = BB_HEAD (bb);
3125       else
3126         set_first_insn (BB_HEAD (bb));
3127       PREV_INSN (BB_HEAD (bb)) = insn;
3128       insn = BB_END (bb);
3129       if (BB_FOOTER (bb))
3130         {
3131           NEXT_INSN (insn) = BB_FOOTER (bb);
3132           PREV_INSN (BB_FOOTER (bb)) = insn;
3133           while (NEXT_INSN (insn))
3134             insn = NEXT_INSN (insn);
3135         }
3136     }
3137
3138   NEXT_INSN (insn) = cfg_layout_function_footer;
3139   if (cfg_layout_function_footer)
3140     PREV_INSN (cfg_layout_function_footer) = insn;
3141
3142   while (NEXT_INSN (insn))
3143     insn = NEXT_INSN (insn);
3144
3145   set_last_insn (insn);
3146 #ifdef ENABLE_CHECKING
3147   verify_insn_chain ();
3148 #endif
3149
3150   /* Now add jumps and labels as needed to match the blocks new
3151      outgoing edges.  */
3152
3153   for (bb = ENTRY_BLOCK_PTR->next_bb; bb ; bb = (basic_block) bb->aux)
3154     {
3155       edge e_fall, e_taken, e;
3156       rtx bb_end_insn;
3157       rtx ret_label = NULL_RTX;
3158       basic_block nb, src_bb;
3159       edge_iterator ei;
3160
3161       if (EDGE_COUNT (bb->succs) == 0)
3162         continue;
3163
3164       /* Find the old fallthru edge, and another non-EH edge for
3165          a taken jump.  */
3166       e_taken = e_fall = NULL;
3167
3168       FOR_EACH_EDGE (e, ei, bb->succs)
3169         if (e->flags & EDGE_FALLTHRU)
3170           e_fall = e;
3171         else if (! (e->flags & EDGE_EH))
3172           e_taken = e;
3173
3174       bb_end_insn = BB_END (bb);
3175       if (JUMP_P (bb_end_insn))
3176         {
3177           ret_label = JUMP_LABEL (bb_end_insn);
3178           if (any_condjump_p (bb_end_insn))
3179             {
3180               /* This might happen if the conditional jump has side
3181                  effects and could therefore not be optimized away.
3182                  Make the basic block to end with a barrier in order
3183                  to prevent rtl_verify_flow_info from complaining.  */
3184               if (!e_fall)
3185                 {
3186                   gcc_assert (!onlyjump_p (bb_end_insn)
3187                               || returnjump_p (bb_end_insn));
3188                   BB_FOOTER (bb) = emit_barrier_after (bb_end_insn);
3189                   continue;
3190                 }
3191
3192               /* If the old fallthru is still next, nothing to do.  */
3193               if (bb->aux == e_fall->dest
3194                   || e_fall->dest == EXIT_BLOCK_PTR)
3195                 continue;
3196
3197               /* The degenerated case of conditional jump jumping to the next
3198                  instruction can happen for jumps with side effects.  We need
3199                  to construct a forwarder block and this will be done just
3200                  fine by force_nonfallthru below.  */
3201               if (!e_taken)
3202                 ;
3203
3204               /* There is another special case: if *neither* block is next,
3205                  such as happens at the very end of a function, then we'll
3206                  need to add a new unconditional jump.  Choose the taken
3207                  edge based on known or assumed probability.  */
3208               else if (bb->aux != e_taken->dest)
3209                 {
3210                   rtx note = find_reg_note (bb_end_insn, REG_BR_PROB, 0);
3211
3212                   if (note
3213                       && INTVAL (XEXP (note, 0)) < REG_BR_PROB_BASE / 2
3214                       && invert_jump (bb_end_insn,
3215                                       (e_fall->dest == EXIT_BLOCK_PTR
3216                                        ? NULL_RTX
3217                                        : label_for_bb (e_fall->dest)), 0))
3218                     {
3219                       e_fall->flags &= ~EDGE_FALLTHRU;
3220                       gcc_checking_assert (could_fall_through
3221                                            (e_taken->src, e_taken->dest));
3222                       e_taken->flags |= EDGE_FALLTHRU;
3223                       update_br_prob_note (bb);
3224                       e = e_fall, e_fall = e_taken, e_taken = e;
3225                     }
3226                 }
3227
3228               /* If the "jumping" edge is a crossing edge, and the fall
3229                  through edge is non-crossing, leave things as they are.  */
3230               else if ((e_taken->flags & EDGE_CROSSING)
3231                        && !(e_fall->flags & EDGE_CROSSING))
3232                 continue;
3233
3234               /* Otherwise we can try to invert the jump.  This will
3235                  basically never fail, however, keep up the pretense.  */
3236               else if (invert_jump (bb_end_insn,
3237                                     (e_fall->dest == EXIT_BLOCK_PTR
3238                                      ? NULL_RTX
3239                                      : label_for_bb (e_fall->dest)), 0))
3240                 {
3241                   e_fall->flags &= ~EDGE_FALLTHRU;
3242                   gcc_checking_assert (could_fall_through
3243                                        (e_taken->src, e_taken->dest));
3244                   e_taken->flags |= EDGE_FALLTHRU;
3245                   update_br_prob_note (bb);
3246                   if (LABEL_NUSES (ret_label) == 0
3247                       && single_pred_p (e_taken->dest))
3248                     delete_insn (ret_label);
3249                   continue;
3250                 }
3251             }
3252           else if (extract_asm_operands (PATTERN (bb_end_insn)) != NULL)
3253             {
3254               /* If the old fallthru is still next or if
3255                  asm goto doesn't have a fallthru (e.g. when followed by
3256                  __builtin_unreachable ()), nothing to do.  */
3257               if (! e_fall
3258                   || bb->aux == e_fall->dest
3259                   || e_fall->dest == EXIT_BLOCK_PTR)
3260                 continue;
3261
3262               /* Otherwise we'll have to use the fallthru fixup below.  */
3263             }
3264           else
3265             {
3266               /* Otherwise we have some return, switch or computed
3267                  jump.  In the 99% case, there should not have been a
3268                  fallthru edge.  */
3269               gcc_assert (returnjump_p (bb_end_insn) || !e_fall);
3270               continue;
3271             }
3272         }
3273       else
3274         {
3275           /* No fallthru implies a noreturn function with EH edges, or
3276              something similarly bizarre.  In any case, we don't need to
3277              do anything.  */
3278           if (! e_fall)
3279             continue;
3280
3281           /* If the fallthru block is still next, nothing to do.  */
3282           if (bb->aux == e_fall->dest)
3283             continue;
3284
3285           /* A fallthru to exit block.  */
3286           if (e_fall->dest == EXIT_BLOCK_PTR)
3287             continue;
3288         }
3289
3290       /* We got here if we need to add a new jump insn. 
3291          Note force_nonfallthru can delete E_FALL and thus we have to
3292          save E_FALL->src prior to the call to force_nonfallthru.  */
3293       src_bb = e_fall->src;
3294       nb = force_nonfallthru_and_redirect (e_fall, e_fall->dest, ret_label);
3295       if (nb)
3296         {
3297           nb->aux = bb->aux;
3298           bb->aux = nb;
3299           /* Don't process this new block.  */
3300           bb = nb;
3301
3302           /* Make sure new bb is tagged for correct section (same as
3303              fall-thru source, since you cannot fall-thru across
3304              section boundaries).  */
3305           BB_COPY_PARTITION (src_bb, single_pred (bb));
3306           if (flag_reorder_blocks_and_partition
3307               && targetm_common.have_named_sections
3308               && JUMP_P (BB_END (bb))
3309               && !any_condjump_p (BB_END (bb))
3310               && (EDGE_SUCC (bb, 0)->flags & EDGE_CROSSING))
3311             add_reg_note (BB_END (bb), REG_CROSSING_JUMP, NULL_RTX);
3312         }
3313     }
3314
3315   relink_block_chain (/*stay_in_cfglayout_mode=*/false);
3316
3317   /* Annoying special case - jump around dead jumptables left in the code.  */
3318   FOR_EACH_BB (bb)
3319     {
3320       edge e = find_fallthru_edge (bb->succs);
3321
3322       if (e && !can_fallthru (e->src, e->dest))
3323         force_nonfallthru (e);
3324     }
3325
3326   /* Ensure goto_locus from edges has some instructions with that locus
3327      in RTL.  */
3328   if (!optimize)
3329     FOR_EACH_BB (bb)
3330       {
3331         edge e;
3332         edge_iterator ei;
3333
3334         FOR_EACH_EDGE (e, ei, bb->succs)
3335           if (LOCATION_LOCUS (e->goto_locus) != UNKNOWN_LOCATION
3336               && !(e->flags & EDGE_ABNORMAL))
3337             {
3338               edge e2;
3339               edge_iterator ei2;
3340               basic_block dest, nb;
3341               rtx end;
3342
3343               insn = BB_END (e->src);
3344               end = PREV_INSN (BB_HEAD (e->src));
3345               while (insn != end
3346                      && (!NONDEBUG_INSN_P (insn) || !INSN_HAS_LOCATION (insn)))
3347                 insn = PREV_INSN (insn);
3348               if (insn != end
3349                   && INSN_LOCATION (insn) == e->goto_locus)
3350                 continue;
3351               if (simplejump_p (BB_END (e->src))
3352                   && !INSN_HAS_LOCATION (BB_END (e->src)))
3353                 {
3354                   INSN_LOCATION (BB_END (e->src)) = e->goto_locus;
3355                   continue;
3356                 }
3357               dest = e->dest;
3358               if (dest == EXIT_BLOCK_PTR)
3359                 {
3360                   /* Non-fallthru edges to the exit block cannot be split.  */
3361                   if (!(e->flags & EDGE_FALLTHRU))
3362                     continue;
3363                 }
3364               else
3365                 {
3366                   insn = BB_HEAD (dest);
3367                   end = NEXT_INSN (BB_END (dest));
3368                   while (insn != end && !NONDEBUG_INSN_P (insn))
3369                     insn = NEXT_INSN (insn);
3370                   if (insn != end && INSN_HAS_LOCATION (insn)
3371                       && INSN_LOCATION (insn) == e->goto_locus)
3372                     continue;
3373                 }
3374               nb = split_edge (e);
3375               if (!INSN_P (BB_END (nb)))
3376                 BB_END (nb) = emit_insn_after_noloc (gen_nop (), BB_END (nb),
3377                                                      nb);
3378               INSN_LOCATION (BB_END (nb)) = e->goto_locus;
3379
3380               /* If there are other incoming edges to the destination block
3381                  with the same goto locus, redirect them to the new block as
3382                  well, this can prevent other such blocks from being created
3383                  in subsequent iterations of the loop.  */
3384               for (ei2 = ei_start (dest->preds); (e2 = ei_safe_edge (ei2)); )
3385                 if (LOCATION_LOCUS (e2->goto_locus) != UNKNOWN_LOCATION
3386                     && !(e2->flags & (EDGE_ABNORMAL | EDGE_FALLTHRU))
3387                     && e->goto_locus == e2->goto_locus)
3388                   redirect_edge_and_branch (e2, nb);
3389                 else
3390                   ei_next (&ei2);
3391             }
3392       }
3393 }
3394 \f
3395 /* Perform sanity checks on the insn chain.
3396    1. Check that next/prev pointers are consistent in both the forward and
3397       reverse direction.
3398    2. Count insns in chain, going both directions, and check if equal.
3399    3. Check that get_last_insn () returns the actual end of chain.  */
3400
3401 DEBUG_FUNCTION void
3402 verify_insn_chain (void)
3403 {
3404   rtx x, prevx, nextx;
3405   int insn_cnt1, insn_cnt2;
3406
3407   for (prevx = NULL, insn_cnt1 = 1, x = get_insns ();
3408        x != 0;
3409        prevx = x, insn_cnt1++, x = NEXT_INSN (x))
3410     gcc_assert (PREV_INSN (x) == prevx);
3411
3412   gcc_assert (prevx == get_last_insn ());
3413
3414   for (nextx = NULL, insn_cnt2 = 1, x = get_last_insn ();
3415        x != 0;
3416        nextx = x, insn_cnt2++, x = PREV_INSN (x))
3417     gcc_assert (NEXT_INSN (x) == nextx);
3418
3419   gcc_assert (insn_cnt1 == insn_cnt2);
3420 }
3421 \f
3422 /* If we have assembler epilogues, the block falling through to exit must
3423    be the last one in the reordered chain when we reach final.  Ensure
3424    that this condition is met.  */
3425 static void
3426 fixup_fallthru_exit_predecessor (void)
3427 {
3428   edge e;
3429   basic_block bb = NULL;
3430
3431   /* This transformation is not valid before reload, because we might
3432      separate a call from the instruction that copies the return
3433      value.  */
3434   gcc_assert (reload_completed);
3435
3436   e = find_fallthru_edge (EXIT_BLOCK_PTR->preds);
3437   if (e)
3438     bb = e->src;
3439
3440   if (bb && bb->aux)
3441     {
3442       basic_block c = ENTRY_BLOCK_PTR->next_bb;
3443
3444       /* If the very first block is the one with the fall-through exit
3445          edge, we have to split that block.  */
3446       if (c == bb)
3447         {
3448           bb = split_block (bb, NULL)->dest;
3449           bb->aux = c->aux;
3450           c->aux = bb;
3451           BB_FOOTER (bb) = BB_FOOTER (c);
3452           BB_FOOTER (c) = NULL;
3453         }
3454
3455       while (c->aux != bb)
3456         c = (basic_block) c->aux;
3457
3458       c->aux = bb->aux;
3459       while (c->aux)
3460         c = (basic_block) c->aux;
3461
3462       c->aux = bb;
3463       bb->aux = NULL;
3464     }
3465 }
3466
3467 /* In case there are more than one fallthru predecessors of exit, force that
3468    there is only one.  */
3469
3470 static void
3471 force_one_exit_fallthru (void)
3472 {
3473   edge e, predecessor = NULL;
3474   bool more = false;
3475   edge_iterator ei;
3476   basic_block forwarder, bb;
3477
3478   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
3479     if (e->flags & EDGE_FALLTHRU)
3480       {
3481         if (predecessor == NULL)
3482           predecessor = e;
3483         else
3484           {
3485             more = true;
3486             break;
3487           }
3488       }
3489
3490   if (!more)
3491     return;
3492
3493   /* Exit has several fallthru predecessors.  Create a forwarder block for
3494      them.  */
3495   forwarder = split_edge (predecessor);
3496   for (ei = ei_start (EXIT_BLOCK_PTR->preds); (e = ei_safe_edge (ei)); )
3497     {
3498       if (e->src == forwarder
3499           || !(e->flags & EDGE_FALLTHRU))
3500         ei_next (&ei);
3501       else
3502         redirect_edge_and_branch_force (e, forwarder);
3503     }
3504
3505   /* Fix up the chain of blocks -- make FORWARDER immediately precede the
3506      exit block.  */
3507   FOR_EACH_BB (bb)
3508     {
3509       if (bb->aux == NULL && bb != forwarder)
3510         {
3511           bb->aux = forwarder;
3512           break;
3513         }
3514     }
3515 }
3516 \f
3517 /* Return true in case it is possible to duplicate the basic block BB.  */
3518
3519 static bool
3520 cfg_layout_can_duplicate_bb_p (const_basic_block bb)
3521 {
3522   /* Do not attempt to duplicate tablejumps, as we need to unshare
3523      the dispatch table.  This is difficult to do, as the instructions
3524      computing jump destination may be hoisted outside the basic block.  */
3525   if (tablejump_p (BB_END (bb), NULL, NULL))
3526     return false;
3527
3528   /* Do not duplicate blocks containing insns that can't be copied.  */
3529   if (targetm.cannot_copy_insn_p)
3530     {
3531       rtx insn = BB_HEAD (bb);
3532       while (1)
3533         {
3534           if (INSN_P (insn) && targetm.cannot_copy_insn_p (insn))
3535             return false;
3536           if (insn == BB_END (bb))
3537             break;
3538           insn = NEXT_INSN (insn);
3539         }
3540     }
3541
3542   return true;
3543 }
3544
3545 rtx
3546 duplicate_insn_chain (rtx from, rtx to)
3547 {
3548   rtx insn, last, copy;
3549
3550   /* Avoid updating of boundaries of previous basic block.  The
3551      note will get removed from insn stream in fixup.  */
3552   last = emit_note (NOTE_INSN_DELETED);
3553
3554   /* Create copy at the end of INSN chain.  The chain will
3555      be reordered later.  */
3556   for (insn = from; insn != NEXT_INSN (to); insn = NEXT_INSN (insn))
3557     {
3558       switch (GET_CODE (insn))
3559         {
3560         case DEBUG_INSN:
3561           /* Don't duplicate label debug insns.  */
3562           if (TREE_CODE (INSN_VAR_LOCATION_DECL (insn)) == LABEL_DECL)
3563             break;
3564           /* FALLTHRU */
3565         case INSN:
3566         case CALL_INSN:
3567         case JUMP_INSN:
3568           /* Avoid copying of dispatch tables.  We never duplicate
3569              tablejumps, so this can hit only in case the table got
3570              moved far from original jump.  */
3571           if (GET_CODE (PATTERN (insn)) == ADDR_VEC
3572               || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
3573             {
3574               /* Avoid copying following barrier as well if any
3575                  (and debug insns in between).  */
3576               rtx next;
3577
3578               for (next = NEXT_INSN (insn);
3579                    next != NEXT_INSN (to);
3580                    next = NEXT_INSN (next))
3581                 if (!DEBUG_INSN_P (next))
3582                   break;
3583               if (next != NEXT_INSN (to) && BARRIER_P (next))
3584                 insn = next;
3585               break;
3586             }
3587           copy = emit_copy_of_insn_after (insn, get_last_insn ());
3588           if (JUMP_P (insn) && JUMP_LABEL (insn) != NULL_RTX
3589               && ANY_RETURN_P (JUMP_LABEL (insn)))
3590             JUMP_LABEL (copy) = JUMP_LABEL (insn);
3591           maybe_copy_prologue_epilogue_insn (insn, copy);
3592           break;
3593
3594         case CODE_LABEL:
3595           break;
3596
3597         case BARRIER:
3598           emit_barrier ();
3599           break;
3600
3601         case NOTE:
3602           switch (NOTE_KIND (insn))
3603             {
3604               /* In case prologue is empty and function contain label
3605                  in first BB, we may want to copy the block.  */
3606             case NOTE_INSN_PROLOGUE_END:
3607
3608             case NOTE_INSN_DELETED:
3609             case NOTE_INSN_DELETED_LABEL:
3610             case NOTE_INSN_DELETED_DEBUG_LABEL:
3611               /* No problem to strip these.  */
3612             case NOTE_INSN_FUNCTION_BEG:
3613               /* There is always just single entry to function.  */
3614             case NOTE_INSN_BASIC_BLOCK:
3615               break;
3616
3617             case NOTE_INSN_EPILOGUE_BEG:
3618             case NOTE_INSN_SWITCH_TEXT_SECTIONS:
3619               emit_note_copy (insn);
3620               break;
3621
3622             default:
3623               /* All other notes should have already been eliminated.  */
3624               gcc_unreachable ();
3625             }
3626           break;
3627         default:
3628           gcc_unreachable ();
3629         }
3630     }
3631   insn = NEXT_INSN (last);
3632   delete_insn (last);
3633   return insn;
3634 }
3635
3636 /* Create a duplicate of the basic block BB.  */
3637
3638 static basic_block
3639 cfg_layout_duplicate_bb (basic_block bb)
3640 {
3641   rtx insn;
3642   basic_block new_bb;
3643
3644   insn = duplicate_insn_chain (BB_HEAD (bb), BB_END (bb));
3645   new_bb = create_basic_block (insn,
3646                                insn ? get_last_insn () : NULL,
3647                                EXIT_BLOCK_PTR->prev_bb);
3648
3649   BB_COPY_PARTITION (new_bb, bb);
3650   if (BB_HEADER (bb))
3651     {
3652       insn = BB_HEADER (bb);
3653       while (NEXT_INSN (insn))
3654         insn = NEXT_INSN (insn);
3655       insn = duplicate_insn_chain (BB_HEADER (bb), insn);
3656       if (insn)
3657         BB_HEADER (new_bb) = unlink_insn_chain (insn, get_last_insn ());
3658     }
3659
3660   if (BB_FOOTER (bb))
3661     {
3662       insn = BB_FOOTER (bb);
3663       while (NEXT_INSN (insn))
3664         insn = NEXT_INSN (insn);
3665       insn = duplicate_insn_chain (BB_FOOTER (bb), insn);
3666       if (insn)
3667         BB_FOOTER (new_bb) = unlink_insn_chain (insn, get_last_insn ());
3668     }
3669
3670   return new_bb;
3671 }
3672
3673 \f
3674 /* Main entry point to this module - initialize the datastructures for
3675    CFG layout changes.  It keeps LOOPS up-to-date if not null.
3676
3677    FLAGS is a set of additional flags to pass to cleanup_cfg().  */
3678
3679 void
3680 cfg_layout_initialize (unsigned int flags)
3681 {
3682   rtx x;
3683   basic_block bb;
3684
3685   initialize_original_copy_tables ();
3686
3687   cfg_layout_rtl_register_cfg_hooks ();
3688
3689   record_effective_endpoints ();
3690
3691   /* Make sure that the targets of non local gotos are marked.  */
3692   for (x = nonlocal_goto_handler_labels; x; x = XEXP (x, 1))
3693     {
3694       bb = BLOCK_FOR_INSN (XEXP (x, 0));
3695       bb->flags |= BB_NON_LOCAL_GOTO_TARGET;
3696     }
3697
3698   cleanup_cfg (CLEANUP_CFGLAYOUT | flags);
3699 }
3700
3701 /* Splits superblocks.  */
3702 void
3703 break_superblocks (void)
3704 {
3705   sbitmap superblocks;
3706   bool need = false;
3707   basic_block bb;
3708
3709   superblocks = sbitmap_alloc (last_basic_block);
3710   sbitmap_zero (superblocks);
3711
3712   FOR_EACH_BB (bb)
3713     if (bb->flags & BB_SUPERBLOCK)
3714       {
3715         bb->flags &= ~BB_SUPERBLOCK;
3716         SET_BIT (superblocks, bb->index);
3717         need = true;
3718       }
3719
3720   if (need)
3721     {
3722       rebuild_jump_labels (get_insns ());
3723       find_many_sub_basic_blocks (superblocks);
3724     }
3725
3726   free (superblocks);
3727 }
3728
3729 /* Finalize the changes: reorder insn list according to the sequence specified
3730    by aux pointers, enter compensation code, rebuild scope forest.  */
3731
3732 void
3733 cfg_layout_finalize (void)
3734 {
3735 #ifdef ENABLE_CHECKING
3736   verify_flow_info ();
3737 #endif
3738   force_one_exit_fallthru ();
3739   rtl_register_cfg_hooks ();
3740   if (reload_completed
3741 #ifdef HAVE_epilogue
3742       && !HAVE_epilogue
3743 #endif
3744       )
3745     fixup_fallthru_exit_predecessor ();
3746   fixup_reorder_chain ();
3747
3748   rebuild_jump_labels (get_insns ());
3749   delete_dead_jumptables ();
3750
3751 #ifdef ENABLE_CHECKING
3752   verify_insn_chain ();
3753   verify_flow_info ();
3754 #endif
3755 }
3756
3757
3758 /* Same as split_block but update cfg_layout structures.  */
3759
3760 static basic_block
3761 cfg_layout_split_block (basic_block bb, void *insnp)
3762 {
3763   rtx insn = (rtx) insnp;
3764   basic_block new_bb = rtl_split_block (bb, insn);
3765
3766   BB_FOOTER (new_bb) = BB_FOOTER (bb);
3767   BB_FOOTER (bb) = NULL;
3768
3769   return new_bb;
3770 }
3771
3772 /* Redirect Edge to DEST.  */
3773 static edge
3774 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
3775 {
3776   basic_block src = e->src;
3777   edge ret;
3778
3779   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
3780     return NULL;
3781
3782   if (e->dest == dest)
3783     return e;
3784
3785   if (e->src != ENTRY_BLOCK_PTR
3786       && (ret = try_redirect_by_replacing_jump (e, dest, true)))
3787     {
3788       df_set_bb_dirty (src);
3789       return ret;
3790     }
3791
3792   if (e->src == ENTRY_BLOCK_PTR
3793       && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
3794     {
3795       if (dump_file)
3796         fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
3797                  e->src->index, dest->index);
3798
3799       df_set_bb_dirty (e->src);
3800       redirect_edge_succ (e, dest);
3801       return e;
3802     }
3803
3804   /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
3805      in the case the basic block appears to be in sequence.  Avoid this
3806      transformation.  */
3807
3808   if (e->flags & EDGE_FALLTHRU)
3809     {
3810       /* Redirect any branch edges unified with the fallthru one.  */
3811       if (JUMP_P (BB_END (src))
3812           && label_is_jump_target_p (BB_HEAD (e->dest),
3813                                      BB_END (src)))
3814         {
3815           edge redirected;
3816
3817           if (dump_file)
3818             fprintf (dump_file, "Fallthru edge unified with branch "
3819                      "%i->%i redirected to %i\n",
3820                      e->src->index, e->dest->index, dest->index);
3821           e->flags &= ~EDGE_FALLTHRU;
3822           redirected = redirect_branch_edge (e, dest);
3823           gcc_assert (redirected);
3824           redirected->flags |= EDGE_FALLTHRU;
3825           df_set_bb_dirty (redirected->src);
3826           return redirected;
3827         }
3828       /* In case we are redirecting fallthru edge to the branch edge
3829          of conditional jump, remove it.  */
3830       if (EDGE_COUNT (src->succs) == 2)
3831         {
3832           /* Find the edge that is different from E.  */
3833           edge s = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
3834
3835           if (s->dest == dest
3836               && any_condjump_p (BB_END (src))
3837               && onlyjump_p (BB_END (src)))
3838             delete_insn (BB_END (src));
3839         }
3840       if (dump_file)
3841         fprintf (dump_file, "Redirecting fallthru edge %i->%i to %i\n",
3842                  e->src->index, e->dest->index, dest->index);
3843       ret = redirect_edge_succ_nodup (e, dest);
3844     }
3845   else
3846     ret = redirect_branch_edge (e, dest);
3847
3848   /* We don't want simplejumps in the insn stream during cfglayout.  */
3849   gcc_assert (!simplejump_p (BB_END (src)));
3850
3851   df_set_bb_dirty (src);
3852   return ret;
3853 }
3854
3855 /* Simple wrapper as we always can redirect fallthru edges.  */
3856 static basic_block
3857 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
3858 {
3859   edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
3860
3861   gcc_assert (redirected);
3862   return NULL;
3863 }
3864
3865 /* Same as delete_basic_block but update cfg_layout structures.  */
3866
3867 static void
3868 cfg_layout_delete_block (basic_block bb)
3869 {
3870   rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
3871
3872   if (BB_HEADER (bb))
3873     {
3874       next = BB_HEAD (bb);
3875       if (prev)
3876         NEXT_INSN (prev) = BB_HEADER (bb);
3877       else
3878         set_first_insn (BB_HEADER (bb));
3879       PREV_INSN (BB_HEADER (bb)) = prev;
3880       insn = BB_HEADER (bb);
3881       while (NEXT_INSN (insn))
3882         insn = NEXT_INSN (insn);
3883       NEXT_INSN (insn) = next;
3884       PREV_INSN (next) = insn;
3885     }
3886   next = NEXT_INSN (BB_END (bb));
3887   if (BB_FOOTER (bb))
3888     {
3889       insn = BB_FOOTER (bb);
3890       while (insn)
3891         {
3892           if (BARRIER_P (insn))
3893             {
3894               if (PREV_INSN (insn))
3895                 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
3896               else
3897                 BB_FOOTER (bb) = NEXT_INSN (insn);
3898               if (NEXT_INSN (insn))
3899                 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
3900             }
3901           if (LABEL_P (insn))
3902             break;
3903           insn = NEXT_INSN (insn);
3904         }
3905       if (BB_FOOTER (bb))
3906         {
3907           insn = BB_END (bb);
3908           NEXT_INSN (insn) = BB_FOOTER (bb);
3909           PREV_INSN (BB_FOOTER (bb)) = insn;
3910           while (NEXT_INSN (insn))
3911             insn = NEXT_INSN (insn);
3912           NEXT_INSN (insn) = next;
3913           if (next)
3914             PREV_INSN (next) = insn;
3915           else
3916             set_last_insn (insn);
3917         }
3918     }
3919   if (bb->next_bb != EXIT_BLOCK_PTR)
3920     to = &BB_HEADER (bb->next_bb);
3921   else
3922     to = &cfg_layout_function_footer;
3923
3924   rtl_delete_block (bb);
3925
3926   if (prev)
3927     prev = NEXT_INSN (prev);
3928   else
3929     prev = get_insns ();
3930   if (next)
3931     next = PREV_INSN (next);
3932   else
3933     next = get_last_insn ();
3934
3935   if (next && NEXT_INSN (next) != prev)
3936     {
3937       remaints = unlink_insn_chain (prev, next);
3938       insn = remaints;
3939       while (NEXT_INSN (insn))
3940         insn = NEXT_INSN (insn);
3941       NEXT_INSN (insn) = *to;
3942       if (*to)
3943         PREV_INSN (*to) = insn;
3944       *to = remaints;
3945     }
3946 }
3947
3948 /* Return true when blocks A and B can be safely merged.  */
3949
3950 static bool
3951 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
3952 {
3953   /* If we are partitioning hot/cold basic blocks, we don't want to
3954      mess up unconditional or indirect jumps that cross between hot
3955      and cold sections.
3956
3957      Basic block partitioning may result in some jumps that appear to
3958      be optimizable (or blocks that appear to be mergeable), but which really
3959      must be left untouched (they are required to make it safely across
3960      partition boundaries).  See  the comments at the top of
3961      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
3962
3963   if (BB_PARTITION (a) != BB_PARTITION (b))
3964     return false;
3965
3966   /* Protect the loop latches.  */
3967   if (current_loops && b->loop_father->latch == b)
3968     return false;
3969
3970   /* If we would end up moving B's instructions, make sure it doesn't fall
3971      through into the exit block, since we cannot recover from a fallthrough
3972      edge into the exit block occurring in the middle of a function.  */
3973   if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
3974     {
3975       edge e = find_fallthru_edge (b->succs);
3976       if (e && e->dest == EXIT_BLOCK_PTR)
3977         return false;
3978     }
3979
3980   /* There must be exactly one edge in between the blocks.  */
3981   return (single_succ_p (a)
3982           && single_succ (a) == b
3983           && single_pred_p (b) == 1
3984           && a != b
3985           /* Must be simple edge.  */
3986           && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
3987           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
3988           /* If the jump insn has side effects, we can't kill the edge.
3989              When not optimizing, try_redirect_by_replacing_jump will
3990              not allow us to redirect an edge by replacing a table jump.  */
3991           && (!JUMP_P (BB_END (a))
3992               || ((!optimize || reload_completed)
3993                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
3994 }
3995
3996 /* Merge block A and B.  The blocks must be mergeable.  */
3997
3998 static void
3999 cfg_layout_merge_blocks (basic_block a, basic_block b)
4000 {
4001   bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0;
4002   rtx insn;
4003
4004   gcc_checking_assert (cfg_layout_can_merge_blocks_p (a, b));
4005
4006   if (dump_file)
4007     fprintf (dump_file, "Merging block %d into block %d...\n", b->index,
4008                          a->index);
4009
4010   /* If there was a CODE_LABEL beginning B, delete it.  */
4011   if (LABEL_P (BB_HEAD (b)))
4012     {
4013       delete_insn (BB_HEAD (b));
4014     }
4015
4016   /* We should have fallthru edge in a, or we can do dummy redirection to get
4017      it cleaned up.  */
4018   if (JUMP_P (BB_END (a)))
4019     try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
4020   gcc_assert (!JUMP_P (BB_END (a)));
4021
4022   /* When not optimizing CFG and the edge is the only place in RTL which holds
4023      some unique locus, emit a nop with that locus in between.  */
4024   if (!optimize)
4025     emit_nop_for_unique_locus_between (a, b);
4026
4027   /* Possible line number notes should appear in between.  */
4028   if (BB_HEADER (b))
4029     {
4030       rtx first = BB_END (a), last;
4031
4032       last = emit_insn_after_noloc (BB_HEADER (b), BB_END (a), a);
4033       /* The above might add a BARRIER as BB_END, but as barriers
4034          aren't valid parts of a bb, remove_insn doesn't update
4035          BB_END if it is a barrier.  So adjust BB_END here.  */
4036       while (BB_END (a) != first && BARRIER_P (BB_END (a)))
4037         BB_END (a) = PREV_INSN (BB_END (a));
4038       delete_insn_chain (NEXT_INSN (first), last, false);
4039       BB_HEADER (b) = NULL;
4040     }
4041
4042   /* In the case basic blocks are not adjacent, move them around.  */
4043   if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
4044     {
4045       insn = unlink_insn_chain (BB_HEAD (b), BB_END (b));
4046
4047       emit_insn_after_noloc (insn, BB_END (a), a);
4048     }
4049   /* Otherwise just re-associate the instructions.  */
4050   else
4051     {
4052       insn = BB_HEAD (b);
4053       BB_END (a) = BB_END (b);
4054     }
4055
4056   /* emit_insn_after_noloc doesn't call df_insn_change_bb.
4057      We need to explicitly call. */
4058   update_bb_for_insn_chain (insn, BB_END (b), a);
4059
4060   /* Skip possible DELETED_LABEL insn.  */
4061   if (!NOTE_INSN_BASIC_BLOCK_P (insn))
4062     insn = NEXT_INSN (insn);
4063   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
4064   BB_HEAD (b) = NULL;
4065   delete_insn (insn);
4066
4067   df_bb_delete (b->index);
4068
4069   /* Possible tablejumps and barriers should appear after the block.  */
4070   if (BB_FOOTER (b))
4071     {
4072       if (!BB_FOOTER (a))
4073         BB_FOOTER (a) = BB_FOOTER (b);
4074       else
4075         {
4076           rtx last = BB_FOOTER (a);
4077
4078           while (NEXT_INSN (last))
4079             last = NEXT_INSN (last);
4080           NEXT_INSN (last) = BB_FOOTER (b);
4081           PREV_INSN (BB_FOOTER (b)) = last;
4082         }
4083       BB_FOOTER (b) = NULL;
4084     }
4085
4086   /* If B was a forwarder block, propagate the locus on the edge.  */
4087   if (forwarder_p
4088       && LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) != UNKNOWN_LOCATION)
4089     EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
4090
4091   if (dump_file)
4092     fprintf (dump_file, "Merged blocks %d and %d.\n", a->index, b->index);
4093 }
4094
4095 /* Split edge E.  */
4096
4097 static basic_block
4098 cfg_layout_split_edge (edge e)
4099 {
4100   basic_block new_bb =
4101     create_basic_block (e->src != ENTRY_BLOCK_PTR
4102                         ? NEXT_INSN (BB_END (e->src)) : get_insns (),
4103                         NULL_RTX, e->src);
4104
4105   if (e->dest == EXIT_BLOCK_PTR)
4106     BB_COPY_PARTITION (new_bb, e->src);
4107   else
4108     BB_COPY_PARTITION (new_bb, e->dest);
4109   make_edge (new_bb, e->dest, EDGE_FALLTHRU);
4110   redirect_edge_and_branch_force (e, new_bb);
4111
4112   return new_bb;
4113 }
4114
4115 /* Do postprocessing after making a forwarder block joined by edge FALLTHRU.  */
4116
4117 static void
4118 rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
4119 {
4120 }
4121
4122 /* Return true if BB contains only labels or non-executable
4123    instructions.  */
4124
4125 static bool
4126 rtl_block_empty_p (basic_block bb)
4127 {
4128   rtx insn;
4129
4130   if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
4131     return true;
4132
4133   FOR_BB_INSNS (bb, insn)
4134     if (NONDEBUG_INSN_P (insn) && !any_uncondjump_p (insn))
4135       return false;
4136
4137   return true;
4138 }
4139
4140 /* Split a basic block if it ends with a conditional branch and if
4141    the other part of the block is not empty.  */
4142
4143 static basic_block
4144 rtl_split_block_before_cond_jump (basic_block bb)
4145 {
4146   rtx insn;
4147   rtx split_point = NULL;
4148   rtx last = NULL;
4149   bool found_code = false;
4150
4151   FOR_BB_INSNS (bb, insn)
4152     {
4153       if (any_condjump_p (insn))
4154         split_point = last;
4155       else if (NONDEBUG_INSN_P (insn))
4156         found_code = true;
4157       last = insn;
4158     }
4159
4160   /* Did not find everything.  */ 
4161   if (found_code && split_point)
4162     return split_block (bb, split_point)->dest;
4163   else 
4164     return NULL;
4165 }
4166
4167 /* Return 1 if BB ends with a call, possibly followed by some
4168    instructions that must stay with the call, 0 otherwise.  */
4169
4170 static bool
4171 rtl_block_ends_with_call_p (basic_block bb)
4172 {
4173   rtx insn = BB_END (bb);
4174
4175   while (!CALL_P (insn)
4176          && insn != BB_HEAD (bb)
4177          && (keep_with_call_p (insn)
4178              || NOTE_P (insn)
4179              || DEBUG_INSN_P (insn)))
4180     insn = PREV_INSN (insn);
4181   return (CALL_P (insn));
4182 }
4183
4184 /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
4185
4186 static bool
4187 rtl_block_ends_with_condjump_p (const_basic_block bb)
4188 {
4189   return any_condjump_p (BB_END (bb));
4190 }
4191
4192 /* Return true if we need to add fake edge to exit.
4193    Helper function for rtl_flow_call_edges_add.  */
4194
4195 static bool
4196 need_fake_edge_p (const_rtx insn)
4197 {
4198   if (!INSN_P (insn))
4199     return false;
4200
4201   if ((CALL_P (insn)
4202        && !SIBLING_CALL_P (insn)
4203        && !find_reg_note (insn, REG_NORETURN, NULL)
4204        && !(RTL_CONST_OR_PURE_CALL_P (insn))))
4205     return true;
4206
4207   return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
4208            && MEM_VOLATILE_P (PATTERN (insn)))
4209           || (GET_CODE (PATTERN (insn)) == PARALLEL
4210               && asm_noperands (insn) != -1
4211               && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
4212           || GET_CODE (PATTERN (insn)) == ASM_INPUT);
4213 }
4214
4215 /* Add fake edges to the function exit for any non constant and non noreturn
4216    calls, volatile inline assembly in the bitmap of blocks specified by
4217    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
4218    that were split.
4219
4220    The goal is to expose cases in which entering a basic block does not imply
4221    that all subsequent instructions must be executed.  */
4222
4223 static int
4224 rtl_flow_call_edges_add (sbitmap blocks)
4225 {
4226   int i;
4227   int blocks_split = 0;
4228   int last_bb = last_basic_block;
4229   bool check_last_block = false;
4230
4231   if (n_basic_blocks == NUM_FIXED_BLOCKS)
4232     return 0;
4233
4234   if (! blocks)
4235     check_last_block = true;
4236   else
4237     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
4238
4239   /* In the last basic block, before epilogue generation, there will be
4240      a fallthru edge to EXIT.  Special care is required if the last insn
4241      of the last basic block is a call because make_edge folds duplicate
4242      edges, which would result in the fallthru edge also being marked
4243      fake, which would result in the fallthru edge being removed by
4244      remove_fake_edges, which would result in an invalid CFG.
4245
4246      Moreover, we can't elide the outgoing fake edge, since the block
4247      profiler needs to take this into account in order to solve the minimal
4248      spanning tree in the case that the call doesn't return.
4249
4250      Handle this by adding a dummy instruction in a new last basic block.  */
4251   if (check_last_block)
4252     {
4253       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
4254       rtx insn = BB_END (bb);
4255
4256       /* Back up past insns that must be kept in the same block as a call.  */
4257       while (insn != BB_HEAD (bb)
4258              && keep_with_call_p (insn))
4259         insn = PREV_INSN (insn);
4260
4261       if (need_fake_edge_p (insn))
4262         {
4263           edge e;
4264
4265           e = find_edge (bb, EXIT_BLOCK_PTR);
4266           if (e)
4267             {
4268               insert_insn_on_edge (gen_use (const0_rtx), e);
4269               commit_edge_insertions ();
4270             }
4271         }
4272     }
4273
4274   /* Now add fake edges to the function exit for any non constant
4275      calls since there is no way that we can determine if they will
4276      return or not...  */
4277
4278   for (i = NUM_FIXED_BLOCKS; i < last_bb; i++)
4279     {
4280       basic_block bb = BASIC_BLOCK (i);
4281       rtx insn;
4282       rtx prev_insn;
4283
4284       if (!bb)
4285         continue;
4286
4287       if (blocks && !TEST_BIT (blocks, i))
4288         continue;
4289
4290       for (insn = BB_END (bb); ; insn = prev_insn)
4291         {
4292           prev_insn = PREV_INSN (insn);
4293           if (need_fake_edge_p (insn))
4294             {
4295               edge e;
4296               rtx split_at_insn = insn;
4297
4298               /* Don't split the block between a call and an insn that should
4299                  remain in the same block as the call.  */
4300               if (CALL_P (insn))
4301                 while (split_at_insn != BB_END (bb)
4302                        && keep_with_call_p (NEXT_INSN (split_at_insn)))
4303                   split_at_insn = NEXT_INSN (split_at_insn);
4304
4305               /* The handling above of the final block before the epilogue
4306                  should be enough to verify that there is no edge to the exit
4307                  block in CFG already.  Calling make_edge in such case would
4308                  cause us to mark that edge as fake and remove it later.  */
4309
4310 #ifdef ENABLE_CHECKING
4311               if (split_at_insn == BB_END (bb))
4312                 {
4313                   e = find_edge (bb, EXIT_BLOCK_PTR);
4314                   gcc_assert (e == NULL);
4315                 }
4316 #endif
4317
4318               /* Note that the following may create a new basic block
4319                  and renumber the existing basic blocks.  */
4320               if (split_at_insn != BB_END (bb))
4321                 {
4322                   e = split_block (bb, split_at_insn);
4323                   if (e)
4324                     blocks_split++;
4325                 }
4326
4327               make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
4328             }
4329
4330           if (insn == BB_HEAD (bb))
4331             break;
4332         }
4333     }
4334
4335   if (blocks_split)
4336     verify_flow_info ();
4337
4338   return blocks_split;
4339 }
4340
4341 /* Add COMP_RTX as a condition at end of COND_BB.  FIRST_HEAD is
4342    the conditional branch target, SECOND_HEAD should be the fall-thru
4343    there is no need to handle this here the loop versioning code handles
4344    this.  the reason for SECON_HEAD is that it is needed for condition
4345    in trees, and this should be of the same type since it is a hook.  */
4346 static void
4347 rtl_lv_add_condition_to_bb (basic_block first_head ,
4348                             basic_block second_head ATTRIBUTE_UNUSED,
4349                             basic_block cond_bb, void *comp_rtx)
4350 {
4351   rtx label, seq, jump;
4352   rtx op0 = XEXP ((rtx)comp_rtx, 0);
4353   rtx op1 = XEXP ((rtx)comp_rtx, 1);
4354   enum rtx_code comp = GET_CODE ((rtx)comp_rtx);
4355   enum machine_mode mode;
4356
4357
4358   label = block_label (first_head);
4359   mode = GET_MODE (op0);
4360   if (mode == VOIDmode)
4361     mode = GET_MODE (op1);
4362
4363   start_sequence ();
4364   op0 = force_operand (op0, NULL_RTX);
4365   op1 = force_operand (op1, NULL_RTX);
4366   do_compare_rtx_and_jump (op0, op1, comp, 0,
4367                            mode, NULL_RTX, NULL_RTX, label, -1);
4368   jump = get_last_insn ();
4369   JUMP_LABEL (jump) = label;
4370   LABEL_NUSES (label)++;
4371   seq = get_insns ();
4372   end_sequence ();
4373
4374   /* Add the new cond , in the new head.  */
4375   emit_insn_after(seq, BB_END(cond_bb));
4376 }
4377
4378
4379 /* Given a block B with unconditional branch at its end, get the
4380    store the return the branch edge and the fall-thru edge in
4381    BRANCH_EDGE and FALLTHRU_EDGE respectively.  */
4382 static void
4383 rtl_extract_cond_bb_edges (basic_block b, edge *branch_edge,
4384                            edge *fallthru_edge)
4385 {
4386   edge e = EDGE_SUCC (b, 0);
4387
4388   if (e->flags & EDGE_FALLTHRU)
4389     {
4390       *fallthru_edge = e;
4391       *branch_edge = EDGE_SUCC (b, 1);
4392     }
4393   else
4394     {
4395       *branch_edge = e;
4396       *fallthru_edge = EDGE_SUCC (b, 1);
4397     }
4398 }
4399
4400 void
4401 init_rtl_bb_info (basic_block bb)
4402 {
4403   gcc_assert (!bb->il.x.rtl);
4404   bb->il.x.head_ = NULL;
4405   bb->il.x.rtl = ggc_alloc_cleared_rtl_bb_info ();
4406 }
4407
4408 /* Returns true if it is possible to remove edge E by redirecting
4409    it to the destination of the other edge from E->src.  */
4410
4411 static bool
4412 rtl_can_remove_branch_p (const_edge e)
4413 {
4414   const_basic_block src = e->src;
4415   const_basic_block target = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest;
4416   const_rtx insn = BB_END (src), set;
4417
4418   /* The conditions are taken from try_redirect_by_replacing_jump.  */
4419   if (target == EXIT_BLOCK_PTR)
4420     return false;
4421
4422   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4423     return false;
4424
4425   if (find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)
4426       || BB_PARTITION (src) != BB_PARTITION (target))
4427     return false;
4428
4429   if (!onlyjump_p (insn)
4430       || tablejump_p (insn, NULL, NULL))
4431     return false;
4432
4433   set = single_set (insn);
4434   if (!set || side_effects_p (set))
4435     return false;
4436
4437   return true;
4438 }
4439
4440 static basic_block
4441 rtl_duplicate_bb (basic_block bb)
4442 {
4443   bb = cfg_layout_duplicate_bb (bb);
4444   bb->aux = NULL;
4445   return bb;
4446 }
4447
4448 /* Implementation of CFG manipulation for linearized RTL.  */
4449 struct cfg_hooks rtl_cfg_hooks = {
4450   "rtl",
4451   rtl_verify_flow_info,
4452   rtl_dump_bb,
4453   rtl_create_basic_block,
4454   rtl_redirect_edge_and_branch,
4455   rtl_redirect_edge_and_branch_force,
4456   rtl_can_remove_branch_p,
4457   rtl_delete_block,
4458   rtl_split_block,
4459   rtl_move_block_after,
4460   rtl_can_merge_blocks,  /* can_merge_blocks_p */
4461   rtl_merge_blocks,
4462   rtl_predict_edge,
4463   rtl_predicted_by_p,
4464   cfg_layout_can_duplicate_bb_p,
4465   rtl_duplicate_bb,
4466   rtl_split_edge,
4467   rtl_make_forwarder_block,
4468   rtl_tidy_fallthru_edge,
4469   rtl_force_nonfallthru,
4470   rtl_block_ends_with_call_p,
4471   rtl_block_ends_with_condjump_p,
4472   rtl_flow_call_edges_add,
4473   NULL, /* execute_on_growing_pred */
4474   NULL, /* execute_on_shrinking_pred */
4475   NULL, /* duplicate loop for trees */
4476   NULL, /* lv_add_condition_to_bb */
4477   NULL, /* lv_adjust_loop_header_phi*/
4478   NULL, /* extract_cond_bb_edges */
4479   NULL, /* flush_pending_stmts */
4480   rtl_block_empty_p, /* block_empty_p */
4481   rtl_split_block_before_cond_jump, /* split_block_before_cond_jump */
4482 };
4483
4484 /* Implementation of CFG manipulation for cfg layout RTL, where
4485    basic block connected via fallthru edges does not have to be adjacent.
4486    This representation will hopefully become the default one in future
4487    version of the compiler.  */
4488
4489 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
4490   "cfglayout mode",
4491   rtl_verify_flow_info_1,
4492   rtl_dump_bb,
4493   cfg_layout_create_basic_block,
4494   cfg_layout_redirect_edge_and_branch,
4495   cfg_layout_redirect_edge_and_branch_force,
4496   rtl_can_remove_branch_p,
4497   cfg_layout_delete_block,
4498   cfg_layout_split_block,
4499   rtl_move_block_after,
4500   cfg_layout_can_merge_blocks_p,
4501   cfg_layout_merge_blocks,
4502   rtl_predict_edge,
4503   rtl_predicted_by_p,
4504   cfg_layout_can_duplicate_bb_p,
4505   cfg_layout_duplicate_bb,
4506   cfg_layout_split_edge,
4507   rtl_make_forwarder_block,
4508   NULL, /* tidy_fallthru_edge */
4509   rtl_force_nonfallthru,
4510   rtl_block_ends_with_call_p,
4511   rtl_block_ends_with_condjump_p,
4512   rtl_flow_call_edges_add,
4513   NULL, /* execute_on_growing_pred */
4514   NULL, /* execute_on_shrinking_pred */
4515   duplicate_loop_to_header_edge, /* duplicate loop for trees */
4516   rtl_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
4517   NULL, /* lv_adjust_loop_header_phi*/
4518   rtl_extract_cond_bb_edges, /* extract_cond_bb_edges */
4519   NULL, /* flush_pending_stmts */  
4520   rtl_block_empty_p, /* block_empty_p */
4521   rtl_split_block_before_cond_jump, /* split_block_before_cond_jump */
4522 };
4523
4524 #include "gt-cfgrtl.h"