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