PR target/68729
[official-gcc.git] / gcc / cfgrtl.c
blobb8cfd5c5b89c080af126b1135ace54551d54e626
1 /* Control flow graph manipulation code for GNU compiler.
2 Copyright (C) 1987-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
20 /* This file contains low level functions to manipulate the CFG and analyze it
21 that are aware of the RTL intermediate language.
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
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 */
40 #include "config.h"
41 #include "system.h"
42 #include "coretypes.h"
43 #include "backend.h"
44 #include "target.h"
45 #include "rtl.h"
46 #include "tree.h"
47 #include "cfghooks.h"
48 #include "df.h"
49 #include "insn-config.h"
50 #include "emit-rtl.h"
51 #include "cfgrtl.h"
52 #include "cfganal.h"
53 #include "cfgbuild.h"
54 #include "cfgcleanup.h"
55 #include "bb-reorder.h"
56 #include "rtl-error.h"
57 #include "insn-attr.h"
58 #include "dojump.h"
59 #include "expr.h"
60 #include "cfgloop.h"
61 #include "tree-pass.h"
62 #include "print-rtl.h"
64 /* Holds the interesting leading and trailing notes for the function.
65 Only applicable if the CFG is in cfglayout mode. */
66 static GTY(()) rtx_insn *cfg_layout_function_footer;
67 static GTY(()) rtx_insn *cfg_layout_function_header;
69 static rtx_insn *skip_insns_after_block (basic_block);
70 static void record_effective_endpoints (void);
71 static void fixup_reorder_chain (void);
73 void verify_insn_chain (void);
74 static void fixup_fallthru_exit_predecessor (void);
75 static int can_delete_note_p (const rtx_note *);
76 static int can_delete_label_p (const rtx_code_label *);
77 static basic_block rtl_split_edge (edge);
78 static bool rtl_move_block_after (basic_block, basic_block);
79 static int rtl_verify_flow_info (void);
80 static basic_block cfg_layout_split_block (basic_block, void *);
81 static edge cfg_layout_redirect_edge_and_branch (edge, basic_block);
82 static basic_block cfg_layout_redirect_edge_and_branch_force (edge, basic_block);
83 static void cfg_layout_delete_block (basic_block);
84 static void rtl_delete_block (basic_block);
85 static basic_block rtl_redirect_edge_and_branch_force (edge, basic_block);
86 static edge rtl_redirect_edge_and_branch (edge, basic_block);
87 static basic_block rtl_split_block (basic_block, void *);
88 static void rtl_dump_bb (FILE *, basic_block, int, int);
89 static int rtl_verify_flow_info_1 (void);
90 static void rtl_make_forwarder_block (edge);
92 /* Return true if NOTE is not one of the ones that must be kept paired,
93 so that we may simply delete it. */
95 static int
96 can_delete_note_p (const rtx_note *note)
98 switch (NOTE_KIND (note))
100 case NOTE_INSN_DELETED:
101 case NOTE_INSN_BASIC_BLOCK:
102 case NOTE_INSN_EPILOGUE_BEG:
103 return true;
105 default:
106 return false;
110 /* True if a given label can be deleted. */
112 static int
113 can_delete_label_p (const rtx_code_label *label)
115 return (!LABEL_PRESERVE_P (label)
116 /* User declared labels must be preserved. */
117 && LABEL_NAME (label) == 0
118 && !in_insn_list_p (forced_labels, label));
121 /* Delete INSN by patching it out. */
123 void
124 delete_insn (rtx uncast_insn)
126 rtx_insn *insn = as_a <rtx_insn *> (uncast_insn);
127 rtx note;
128 bool really_delete = true;
130 if (LABEL_P (insn))
132 /* Some labels can't be directly removed from the INSN chain, as they
133 might be references via variables, constant pool etc.
134 Convert them to the special NOTE_INSN_DELETED_LABEL note. */
135 if (! can_delete_label_p (as_a <rtx_code_label *> (insn)))
137 const char *name = LABEL_NAME (insn);
138 basic_block bb = BLOCK_FOR_INSN (insn);
139 rtx_insn *bb_note = NEXT_INSN (insn);
141 really_delete = false;
142 PUT_CODE (insn, NOTE);
143 NOTE_KIND (insn) = NOTE_INSN_DELETED_LABEL;
144 NOTE_DELETED_LABEL_NAME (insn) = name;
146 /* If the note following the label starts a basic block, and the
147 label is a member of the same basic block, interchange the two. */
148 if (bb_note != NULL_RTX
149 && NOTE_INSN_BASIC_BLOCK_P (bb_note)
150 && bb != NULL
151 && bb == BLOCK_FOR_INSN (bb_note))
153 reorder_insns_nobb (insn, insn, bb_note);
154 BB_HEAD (bb) = bb_note;
155 if (BB_END (bb) == bb_note)
156 BB_END (bb) = insn;
160 remove_node_from_insn_list (insn, &nonlocal_goto_handler_labels);
163 if (really_delete)
165 /* If this insn has already been deleted, something is very wrong. */
166 gcc_assert (!insn->deleted ());
167 if (INSN_P (insn))
168 df_insn_delete (insn);
169 remove_insn (insn);
170 insn->set_deleted ();
173 /* If deleting a jump, decrement the use count of the label. Deleting
174 the label itself should happen in the normal course of block merging. */
175 if (JUMP_P (insn))
177 if (JUMP_LABEL (insn)
178 && LABEL_P (JUMP_LABEL (insn)))
179 LABEL_NUSES (JUMP_LABEL (insn))--;
181 /* If there are more targets, remove them too. */
182 while ((note
183 = find_reg_note (insn, REG_LABEL_TARGET, NULL_RTX)) != NULL_RTX
184 && LABEL_P (XEXP (note, 0)))
186 LABEL_NUSES (XEXP (note, 0))--;
187 remove_note (insn, note);
191 /* Also if deleting any insn that references a label as an operand. */
192 while ((note = find_reg_note (insn, REG_LABEL_OPERAND, NULL_RTX)) != NULL_RTX
193 && LABEL_P (XEXP (note, 0)))
195 LABEL_NUSES (XEXP (note, 0))--;
196 remove_note (insn, note);
199 if (rtx_jump_table_data *table = dyn_cast <rtx_jump_table_data *> (insn))
201 rtvec vec = table->get_labels ();
202 int len = GET_NUM_ELEM (vec);
203 int i;
205 for (i = 0; i < len; i++)
207 rtx label = XEXP (RTVEC_ELT (vec, i), 0);
209 /* When deleting code in bulk (e.g. removing many unreachable
210 blocks) we can delete a label that's a target of the vector
211 before deleting the vector itself. */
212 if (!NOTE_P (label))
213 LABEL_NUSES (label)--;
218 /* Like delete_insn but also purge dead edges from BB. */
220 void
221 delete_insn_and_edges (rtx_insn *insn)
223 bool purge = false;
225 if (INSN_P (insn)
226 && BLOCK_FOR_INSN (insn)
227 && BB_END (BLOCK_FOR_INSN (insn)) == insn)
228 purge = true;
229 delete_insn (insn);
230 if (purge)
231 purge_dead_edges (BLOCK_FOR_INSN (insn));
234 /* Unlink a chain of insns between START and FINISH, leaving notes
235 that must be paired. If CLEAR_BB is true, we set bb field for
236 insns that cannot be removed to NULL. */
238 void
239 delete_insn_chain (rtx start, rtx finish, bool clear_bb)
241 rtx_insn *prev, *current;
243 /* Unchain the insns one by one. It would be quicker to delete all of these
244 with a single unchaining, rather than one at a time, but we need to keep
245 the NOTE's. */
246 current = safe_as_a <rtx_insn *> (finish);
247 while (1)
249 prev = PREV_INSN (current);
250 if (NOTE_P (current) && !can_delete_note_p (as_a <rtx_note *> (current)))
252 else
253 delete_insn (current);
255 if (clear_bb && !current->deleted ())
256 set_block_for_insn (current, NULL);
258 if (current == start)
259 break;
260 current = prev;
264 /* Create a new basic block consisting of the instructions between HEAD and END
265 inclusive. This function is designed to allow fast BB construction - reuses
266 the note and basic block struct in BB_NOTE, if any and do not grow
267 BASIC_BLOCK chain and should be used directly only by CFG construction code.
268 END can be NULL in to create new empty basic block before HEAD. Both END
269 and HEAD can be NULL to create basic block at the end of INSN chain.
270 AFTER is the basic block we should be put after. */
272 basic_block
273 create_basic_block_structure (rtx_insn *head, rtx_insn *end, rtx_note *bb_note,
274 basic_block after)
276 basic_block bb;
278 if (bb_note
279 && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
280 && bb->aux == NULL)
282 /* If we found an existing note, thread it back onto the chain. */
284 rtx_insn *after;
286 if (LABEL_P (head))
287 after = head;
288 else
290 after = PREV_INSN (head);
291 head = bb_note;
294 if (after != bb_note && NEXT_INSN (after) != bb_note)
295 reorder_insns_nobb (bb_note, bb_note, after);
297 else
299 /* Otherwise we must create a note and a basic block structure. */
301 bb = alloc_block ();
303 init_rtl_bb_info (bb);
304 if (!head && !end)
305 head = end = bb_note
306 = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
307 else if (LABEL_P (head) && end)
309 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
310 if (head == end)
311 end = bb_note;
313 else
315 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
316 head = bb_note;
317 if (!end)
318 end = head;
321 NOTE_BASIC_BLOCK (bb_note) = bb;
324 /* Always include the bb note in the block. */
325 if (NEXT_INSN (end) == bb_note)
326 end = bb_note;
328 BB_HEAD (bb) = head;
329 BB_END (bb) = end;
330 bb->index = last_basic_block_for_fn (cfun)++;
331 bb->flags = BB_NEW | BB_RTL;
332 link_block (bb, after);
333 SET_BASIC_BLOCK_FOR_FN (cfun, bb->index, bb);
334 df_bb_refs_record (bb->index, false);
335 update_bb_for_insn (bb);
336 BB_SET_PARTITION (bb, BB_UNPARTITIONED);
338 /* Tag the block so that we know it has been used when considering
339 other basic block notes. */
340 bb->aux = bb;
342 return bb;
345 /* Create new basic block consisting of instructions in between HEAD and END
346 and place it to the BB chain after block AFTER. END can be NULL to
347 create a new empty basic block before HEAD. Both END and HEAD can be
348 NULL to create basic block at the end of INSN chain. */
350 static basic_block
351 rtl_create_basic_block (void *headp, void *endp, basic_block after)
353 rtx_insn *head = (rtx_insn *) headp;
354 rtx_insn *end = (rtx_insn *) endp;
355 basic_block bb;
357 /* Grow the basic block array if needed. */
358 if ((size_t) last_basic_block_for_fn (cfun)
359 >= basic_block_info_for_fn (cfun)->length ())
361 size_t new_size =
362 (last_basic_block_for_fn (cfun)
363 + (last_basic_block_for_fn (cfun) + 3) / 4);
364 vec_safe_grow_cleared (basic_block_info_for_fn (cfun), new_size);
367 n_basic_blocks_for_fn (cfun)++;
369 bb = create_basic_block_structure (head, end, NULL, after);
370 bb->aux = NULL;
371 return bb;
374 static basic_block
375 cfg_layout_create_basic_block (void *head, void *end, basic_block after)
377 basic_block newbb = rtl_create_basic_block (head, end, after);
379 return newbb;
382 /* Delete the insns in a (non-live) block. We physically delete every
383 non-deleted-note insn, and update the flow graph appropriately.
385 Return nonzero if we deleted an exception handler. */
387 /* ??? Preserving all such notes strikes me as wrong. It would be nice
388 to post-process the stream to remove empty blocks, loops, ranges, etc. */
390 static void
391 rtl_delete_block (basic_block b)
393 rtx_insn *insn, *end;
395 /* If the head of this block is a CODE_LABEL, then it might be the
396 label for an exception handler which can't be reached. We need
397 to remove the label from the exception_handler_label list. */
398 insn = BB_HEAD (b);
400 end = get_last_bb_insn (b);
402 /* Selectively delete the entire chain. */
403 BB_HEAD (b) = NULL;
404 delete_insn_chain (insn, end, true);
407 if (dump_file)
408 fprintf (dump_file, "deleting block %d\n", b->index);
409 df_bb_delete (b->index);
412 /* Records the basic block struct in BLOCK_FOR_INSN for every insn. */
414 void
415 compute_bb_for_insn (void)
417 basic_block bb;
419 FOR_EACH_BB_FN (bb, cfun)
421 rtx_insn *end = BB_END (bb);
422 rtx_insn *insn;
424 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
426 BLOCK_FOR_INSN (insn) = bb;
427 if (insn == end)
428 break;
433 /* Release the basic_block_for_insn array. */
435 unsigned int
436 free_bb_for_insn (void)
438 rtx_insn *insn;
439 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
440 if (!BARRIER_P (insn))
441 BLOCK_FOR_INSN (insn) = NULL;
442 return 0;
445 namespace {
447 const pass_data pass_data_free_cfg =
449 RTL_PASS, /* type */
450 "*free_cfg", /* name */
451 OPTGROUP_NONE, /* optinfo_flags */
452 TV_NONE, /* tv_id */
453 0, /* properties_required */
454 0, /* properties_provided */
455 PROP_cfg, /* properties_destroyed */
456 0, /* todo_flags_start */
457 0, /* todo_flags_finish */
460 class pass_free_cfg : public rtl_opt_pass
462 public:
463 pass_free_cfg (gcc::context *ctxt)
464 : rtl_opt_pass (pass_data_free_cfg, ctxt)
467 /* opt_pass methods: */
468 virtual unsigned int execute (function *);
470 }; // class pass_free_cfg
472 unsigned int
473 pass_free_cfg::execute (function *)
475 /* The resource.c machinery uses DF but the CFG isn't guaranteed to be
476 valid at that point so it would be too late to call df_analyze. */
477 if (DELAY_SLOTS && optimize > 0 && flag_delayed_branch)
479 df_note_add_problem ();
480 df_analyze ();
483 if (crtl->has_bb_partition)
484 insert_section_boundary_note ();
486 free_bb_for_insn ();
487 return 0;
490 } // anon namespace
492 rtl_opt_pass *
493 make_pass_free_cfg (gcc::context *ctxt)
495 return new pass_free_cfg (ctxt);
498 /* Return RTX to emit after when we want to emit code on the entry of function. */
499 rtx_insn *
500 entry_of_function (void)
502 return (n_basic_blocks_for_fn (cfun) > NUM_FIXED_BLOCKS ?
503 BB_HEAD (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb) : get_insns ());
506 /* Emit INSN at the entry point of the function, ensuring that it is only
507 executed once per function. */
508 void
509 emit_insn_at_entry (rtx insn)
511 edge_iterator ei = ei_start (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs);
512 edge e = ei_safe_edge (ei);
513 gcc_assert (e->flags & EDGE_FALLTHRU);
515 insert_insn_on_edge (insn, e);
516 commit_edge_insertions ();
519 /* Update BLOCK_FOR_INSN of insns between BEGIN and END
520 (or BARRIER if found) and notify df of the bb change.
521 The insn chain range is inclusive
522 (i.e. both BEGIN and END will be updated. */
524 static void
525 update_bb_for_insn_chain (rtx_insn *begin, rtx_insn *end, basic_block bb)
527 rtx_insn *insn;
529 end = NEXT_INSN (end);
530 for (insn = begin; insn != end; insn = NEXT_INSN (insn))
531 if (!BARRIER_P (insn))
532 df_insn_change_bb (insn, bb);
535 /* Update BLOCK_FOR_INSN of insns in BB to BB,
536 and notify df of the change. */
538 void
539 update_bb_for_insn (basic_block bb)
541 update_bb_for_insn_chain (BB_HEAD (bb), BB_END (bb), bb);
545 /* Like active_insn_p, except keep the return value clobber around
546 even after reload. */
548 static bool
549 flow_active_insn_p (const rtx_insn *insn)
551 if (active_insn_p (insn))
552 return true;
554 /* A clobber of the function return value exists for buggy
555 programs that fail to return a value. Its effect is to
556 keep the return value from being live across the entire
557 function. If we allow it to be skipped, we introduce the
558 possibility for register lifetime confusion. */
559 if (GET_CODE (PATTERN (insn)) == CLOBBER
560 && REG_P (XEXP (PATTERN (insn), 0))
561 && REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))
562 return true;
564 return false;
567 /* Return true if the block has no effect and only forwards control flow to
568 its single destination. */
570 bool
571 contains_no_active_insn_p (const_basic_block bb)
573 rtx_insn *insn;
575 if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
576 || !single_succ_p (bb))
577 return false;
579 for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = NEXT_INSN (insn))
580 if (INSN_P (insn) && flow_active_insn_p (insn))
581 return false;
583 return (!INSN_P (insn)
584 || (JUMP_P (insn) && simplejump_p (insn))
585 || !flow_active_insn_p (insn));
588 /* Likewise, but protect loop latches, headers and preheaders. */
589 /* FIXME: Make this a cfg hook. */
591 bool
592 forwarder_block_p (const_basic_block bb)
594 if (!contains_no_active_insn_p (bb))
595 return false;
597 /* Protect loop latches, headers and preheaders. */
598 if (current_loops)
600 basic_block dest;
601 if (bb->loop_father->header == bb)
602 return false;
603 dest = EDGE_SUCC (bb, 0)->dest;
604 if (dest->loop_father->header == dest)
605 return false;
608 return true;
611 /* Return nonzero if we can reach target from src by falling through. */
612 /* FIXME: Make this a cfg hook, the result is only valid in cfgrtl mode. */
614 bool
615 can_fallthru (basic_block src, basic_block target)
617 rtx_insn *insn = BB_END (src);
618 rtx_insn *insn2;
619 edge e;
620 edge_iterator ei;
622 if (target == EXIT_BLOCK_PTR_FOR_FN (cfun))
623 return true;
624 if (src->next_bb != target)
625 return false;
627 /* ??? Later we may add code to move jump tables offline. */
628 if (tablejump_p (insn, NULL, NULL))
629 return false;
631 FOR_EACH_EDGE (e, ei, src->succs)
632 if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
633 && e->flags & EDGE_FALLTHRU)
634 return false;
636 insn2 = BB_HEAD (target);
637 if (!active_insn_p (insn2))
638 insn2 = next_active_insn (insn2);
640 return next_active_insn (insn) == insn2;
643 /* Return nonzero if we could reach target from src by falling through,
644 if the target was made adjacent. If we already have a fall-through
645 edge to the exit block, we can't do that. */
646 static bool
647 could_fall_through (basic_block src, basic_block target)
649 edge e;
650 edge_iterator ei;
652 if (target == EXIT_BLOCK_PTR_FOR_FN (cfun))
653 return true;
654 FOR_EACH_EDGE (e, ei, src->succs)
655 if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
656 && e->flags & EDGE_FALLTHRU)
657 return 0;
658 return true;
661 /* Return the NOTE_INSN_BASIC_BLOCK of BB. */
662 rtx_note *
663 bb_note (basic_block bb)
665 rtx_insn *note;
667 note = BB_HEAD (bb);
668 if (LABEL_P (note))
669 note = NEXT_INSN (note);
671 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
672 return as_a <rtx_note *> (note);
675 /* Return the INSN immediately following the NOTE_INSN_BASIC_BLOCK
676 note associated with the BLOCK. */
678 static rtx_insn *
679 first_insn_after_basic_block_note (basic_block block)
681 rtx_insn *insn;
683 /* Get the first instruction in the block. */
684 insn = BB_HEAD (block);
686 if (insn == NULL_RTX)
687 return NULL;
688 if (LABEL_P (insn))
689 insn = NEXT_INSN (insn);
690 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
692 return NEXT_INSN (insn);
695 /* Creates a new basic block just after basic block BB by splitting
696 everything after specified instruction INSNP. */
698 static basic_block
699 rtl_split_block (basic_block bb, void *insnp)
701 basic_block new_bb;
702 rtx_insn *insn = (rtx_insn *) insnp;
703 edge e;
704 edge_iterator ei;
706 if (!insn)
708 insn = first_insn_after_basic_block_note (bb);
710 if (insn)
712 rtx_insn *next = insn;
714 insn = PREV_INSN (insn);
716 /* If the block contains only debug insns, insn would have
717 been NULL in a non-debug compilation, and then we'd end
718 up emitting a DELETED note. For -fcompare-debug
719 stability, emit the note too. */
720 if (insn != BB_END (bb)
721 && DEBUG_INSN_P (next)
722 && DEBUG_INSN_P (BB_END (bb)))
724 while (next != BB_END (bb) && DEBUG_INSN_P (next))
725 next = NEXT_INSN (next);
727 if (next == BB_END (bb))
728 emit_note_after (NOTE_INSN_DELETED, next);
731 else
732 insn = get_last_insn ();
735 /* We probably should check type of the insn so that we do not create
736 inconsistent cfg. It is checked in verify_flow_info anyway, so do not
737 bother. */
738 if (insn == BB_END (bb))
739 emit_note_after (NOTE_INSN_DELETED, insn);
741 /* Create the new basic block. */
742 new_bb = create_basic_block (NEXT_INSN (insn), BB_END (bb), bb);
743 BB_COPY_PARTITION (new_bb, bb);
744 BB_END (bb) = insn;
746 /* Redirect the outgoing edges. */
747 new_bb->succs = bb->succs;
748 bb->succs = NULL;
749 FOR_EACH_EDGE (e, ei, new_bb->succs)
750 e->src = new_bb;
752 /* The new block starts off being dirty. */
753 df_set_bb_dirty (bb);
754 return new_bb;
757 /* Return true if the single edge between blocks A and B is the only place
758 in RTL which holds some unique locus. */
760 static bool
761 unique_locus_on_edge_between_p (basic_block a, basic_block b)
763 const location_t goto_locus = EDGE_SUCC (a, 0)->goto_locus;
764 rtx_insn *insn, *end;
766 if (LOCATION_LOCUS (goto_locus) == UNKNOWN_LOCATION)
767 return false;
769 /* First scan block A backward. */
770 insn = BB_END (a);
771 end = PREV_INSN (BB_HEAD (a));
772 while (insn != end && (!NONDEBUG_INSN_P (insn) || !INSN_HAS_LOCATION (insn)))
773 insn = PREV_INSN (insn);
775 if (insn != end && INSN_LOCATION (insn) == goto_locus)
776 return false;
778 /* Then scan block B forward. */
779 insn = BB_HEAD (b);
780 if (insn)
782 end = NEXT_INSN (BB_END (b));
783 while (insn != end && !NONDEBUG_INSN_P (insn))
784 insn = NEXT_INSN (insn);
786 if (insn != end && INSN_HAS_LOCATION (insn)
787 && INSN_LOCATION (insn) == goto_locus)
788 return false;
791 return true;
794 /* If the single edge between blocks A and B is the only place in RTL which
795 holds some unique locus, emit a nop with that locus between the blocks. */
797 static void
798 emit_nop_for_unique_locus_between (basic_block a, basic_block b)
800 if (!unique_locus_on_edge_between_p (a, b))
801 return;
803 BB_END (a) = emit_insn_after_noloc (gen_nop (), BB_END (a), a);
804 INSN_LOCATION (BB_END (a)) = EDGE_SUCC (a, 0)->goto_locus;
807 /* Blocks A and B are to be merged into a single block A. The insns
808 are already contiguous. */
810 static void
811 rtl_merge_blocks (basic_block a, basic_block b)
813 rtx_insn *b_head = BB_HEAD (b), *b_end = BB_END (b), *a_end = BB_END (a);
814 rtx_insn *del_first = NULL, *del_last = NULL;
815 rtx_insn *b_debug_start = b_end, *b_debug_end = b_end;
816 bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0;
817 int b_empty = 0;
819 if (dump_file)
820 fprintf (dump_file, "Merging block %d into block %d...\n", b->index,
821 a->index);
823 while (DEBUG_INSN_P (b_end))
824 b_end = PREV_INSN (b_debug_start = b_end);
826 /* If there was a CODE_LABEL beginning B, delete it. */
827 if (LABEL_P (b_head))
829 /* Detect basic blocks with nothing but a label. This can happen
830 in particular at the end of a function. */
831 if (b_head == b_end)
832 b_empty = 1;
834 del_first = del_last = b_head;
835 b_head = NEXT_INSN (b_head);
838 /* Delete the basic block note and handle blocks containing just that
839 note. */
840 if (NOTE_INSN_BASIC_BLOCK_P (b_head))
842 if (b_head == b_end)
843 b_empty = 1;
844 if (! del_last)
845 del_first = b_head;
847 del_last = b_head;
848 b_head = NEXT_INSN (b_head);
851 /* If there was a jump out of A, delete it. */
852 if (JUMP_P (a_end))
854 rtx_insn *prev;
856 for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
857 if (!NOTE_P (prev)
858 || NOTE_INSN_BASIC_BLOCK_P (prev)
859 || prev == BB_HEAD (a))
860 break;
862 del_first = a_end;
864 /* If this was a conditional jump, we need to also delete
865 the insn that set cc0. */
866 if (HAVE_cc0 && only_sets_cc0_p (prev))
868 rtx_insn *tmp = prev;
870 prev = prev_nonnote_insn (prev);
871 if (!prev)
872 prev = BB_HEAD (a);
873 del_first = tmp;
876 a_end = PREV_INSN (del_first);
878 else if (BARRIER_P (NEXT_INSN (a_end)))
879 del_first = NEXT_INSN (a_end);
881 /* Delete everything marked above as well as crap that might be
882 hanging out between the two blocks. */
883 BB_END (a) = a_end;
884 BB_HEAD (b) = b_empty ? NULL : b_head;
885 delete_insn_chain (del_first, del_last, true);
887 /* When not optimizing and the edge is the only place in RTL which holds
888 some unique locus, emit a nop with that locus in between. */
889 if (!optimize)
891 emit_nop_for_unique_locus_between (a, b);
892 a_end = BB_END (a);
895 /* Reassociate the insns of B with A. */
896 if (!b_empty)
898 update_bb_for_insn_chain (a_end, b_debug_end, a);
900 BB_END (a) = b_debug_end;
901 BB_HEAD (b) = NULL;
903 else if (b_end != b_debug_end)
905 /* Move any deleted labels and other notes between the end of A
906 and the debug insns that make up B after the debug insns,
907 bringing the debug insns into A while keeping the notes after
908 the end of A. */
909 if (NEXT_INSN (a_end) != b_debug_start)
910 reorder_insns_nobb (NEXT_INSN (a_end), PREV_INSN (b_debug_start),
911 b_debug_end);
912 update_bb_for_insn_chain (b_debug_start, b_debug_end, a);
913 BB_END (a) = b_debug_end;
916 df_bb_delete (b->index);
918 /* If B was a forwarder block, propagate the locus on the edge. */
919 if (forwarder_p
920 && LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) == UNKNOWN_LOCATION)
921 EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
923 if (dump_file)
924 fprintf (dump_file, "Merged blocks %d and %d.\n", a->index, b->index);
928 /* Return true when block A and B can be merged. */
930 static bool
931 rtl_can_merge_blocks (basic_block a, basic_block b)
933 /* If we are partitioning hot/cold basic blocks, we don't want to
934 mess up unconditional or indirect jumps that cross between hot
935 and cold sections.
937 Basic block partitioning may result in some jumps that appear to
938 be optimizable (or blocks that appear to be mergeable), but which really
939 must be left untouched (they are required to make it safely across
940 partition boundaries). See the comments at the top of
941 bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */
943 if (BB_PARTITION (a) != BB_PARTITION (b))
944 return false;
946 /* Protect the loop latches. */
947 if (current_loops && b->loop_father->latch == b)
948 return false;
950 /* There must be exactly one edge in between the blocks. */
951 return (single_succ_p (a)
952 && single_succ (a) == b
953 && single_pred_p (b)
954 && a != b
955 /* Must be simple edge. */
956 && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
957 && a->next_bb == b
958 && a != ENTRY_BLOCK_PTR_FOR_FN (cfun)
959 && b != EXIT_BLOCK_PTR_FOR_FN (cfun)
960 /* If the jump insn has side effects,
961 we can't kill the edge. */
962 && (!JUMP_P (BB_END (a))
963 || (reload_completed
964 ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
967 /* Return the label in the head of basic block BLOCK. Create one if it doesn't
968 exist. */
970 rtx_code_label *
971 block_label (basic_block block)
973 if (block == EXIT_BLOCK_PTR_FOR_FN (cfun))
974 return NULL;
976 if (!LABEL_P (BB_HEAD (block)))
978 BB_HEAD (block) = emit_label_before (gen_label_rtx (), BB_HEAD (block));
981 return as_a <rtx_code_label *> (BB_HEAD (block));
984 /* Attempt to perform edge redirection by replacing possibly complex jump
985 instruction by unconditional jump or removing jump completely. This can
986 apply only if all edges now point to the same block. The parameters and
987 return values are equivalent to redirect_edge_and_branch. */
989 edge
990 try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
992 basic_block src = e->src;
993 rtx_insn *insn = BB_END (src), *kill_from;
994 rtx set;
995 int fallthru = 0;
997 /* If we are partitioning hot/cold basic blocks, we don't want to
998 mess up unconditional or indirect jumps that cross between hot
999 and cold sections.
1001 Basic block partitioning may result in some jumps that appear to
1002 be optimizable (or blocks that appear to be mergeable), but which really
1003 must be left untouched (they are required to make it safely across
1004 partition boundaries). See the comments at the top of
1005 bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */
1007 if (BB_PARTITION (src) != BB_PARTITION (target))
1008 return NULL;
1010 /* We can replace or remove a complex jump only when we have exactly
1011 two edges. Also, if we have exactly one outgoing edge, we can
1012 redirect that. */
1013 if (EDGE_COUNT (src->succs) >= 3
1014 /* Verify that all targets will be TARGET. Specifically, the
1015 edge that is not E must also go to TARGET. */
1016 || (EDGE_COUNT (src->succs) == 2
1017 && EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target))
1018 return NULL;
1020 if (!onlyjump_p (insn))
1021 return NULL;
1022 if ((!optimize || reload_completed) && tablejump_p (insn, NULL, NULL))
1023 return NULL;
1025 /* Avoid removing branch with side effects. */
1026 set = single_set (insn);
1027 if (!set || side_effects_p (set))
1028 return NULL;
1030 /* In case we zap a conditional jump, we'll need to kill
1031 the cc0 setter too. */
1032 kill_from = insn;
1033 if (HAVE_cc0 && reg_mentioned_p (cc0_rtx, PATTERN (insn))
1034 && only_sets_cc0_p (PREV_INSN (insn)))
1035 kill_from = PREV_INSN (insn);
1037 /* See if we can create the fallthru edge. */
1038 if (in_cfglayout || can_fallthru (src, target))
1040 if (dump_file)
1041 fprintf (dump_file, "Removing jump %i.\n", INSN_UID (insn));
1042 fallthru = 1;
1044 /* Selectively unlink whole insn chain. */
1045 if (in_cfglayout)
1047 rtx_insn *insn = BB_FOOTER (src);
1049 delete_insn_chain (kill_from, BB_END (src), false);
1051 /* Remove barriers but keep jumptables. */
1052 while (insn)
1054 if (BARRIER_P (insn))
1056 if (PREV_INSN (insn))
1057 SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
1058 else
1059 BB_FOOTER (src) = NEXT_INSN (insn);
1060 if (NEXT_INSN (insn))
1061 SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
1063 if (LABEL_P (insn))
1064 break;
1065 insn = NEXT_INSN (insn);
1068 else
1069 delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)),
1070 false);
1073 /* If this already is simplejump, redirect it. */
1074 else if (simplejump_p (insn))
1076 if (e->dest == target)
1077 return NULL;
1078 if (dump_file)
1079 fprintf (dump_file, "Redirecting jump %i from %i to %i.\n",
1080 INSN_UID (insn), e->dest->index, target->index);
1081 if (!redirect_jump (as_a <rtx_jump_insn *> (insn),
1082 block_label (target), 0))
1084 gcc_assert (target == EXIT_BLOCK_PTR_FOR_FN (cfun));
1085 return NULL;
1089 /* Cannot do anything for target exit block. */
1090 else if (target == EXIT_BLOCK_PTR_FOR_FN (cfun))
1091 return NULL;
1093 /* Or replace possibly complicated jump insn by simple jump insn. */
1094 else
1096 rtx_code_label *target_label = block_label (target);
1097 rtx_insn *barrier;
1098 rtx label;
1099 rtx_jump_table_data *table;
1101 emit_jump_insn_after_noloc (targetm.gen_jump (target_label), insn);
1102 JUMP_LABEL (BB_END (src)) = target_label;
1103 LABEL_NUSES (target_label)++;
1104 if (dump_file)
1105 fprintf (dump_file, "Replacing insn %i by jump %i\n",
1106 INSN_UID (insn), INSN_UID (BB_END (src)));
1109 delete_insn_chain (kill_from, insn, false);
1111 /* Recognize a tablejump that we are converting to a
1112 simple jump and remove its associated CODE_LABEL
1113 and ADDR_VEC or ADDR_DIFF_VEC. */
1114 if (tablejump_p (insn, &label, &table))
1115 delete_insn_chain (label, table, false);
1117 barrier = next_nonnote_insn (BB_END (src));
1118 if (!barrier || !BARRIER_P (barrier))
1119 emit_barrier_after (BB_END (src));
1120 else
1122 if (barrier != NEXT_INSN (BB_END (src)))
1124 /* Move the jump before barrier so that the notes
1125 which originally were or were created before jump table are
1126 inside the basic block. */
1127 rtx_insn *new_insn = BB_END (src);
1129 update_bb_for_insn_chain (NEXT_INSN (BB_END (src)),
1130 PREV_INSN (barrier), src);
1132 SET_NEXT_INSN (PREV_INSN (new_insn)) = NEXT_INSN (new_insn);
1133 SET_PREV_INSN (NEXT_INSN (new_insn)) = PREV_INSN (new_insn);
1135 SET_NEXT_INSN (new_insn) = barrier;
1136 SET_NEXT_INSN (PREV_INSN (barrier)) = new_insn;
1138 SET_PREV_INSN (new_insn) = PREV_INSN (barrier);
1139 SET_PREV_INSN (barrier) = new_insn;
1144 /* Keep only one edge out and set proper flags. */
1145 if (!single_succ_p (src))
1146 remove_edge (e);
1147 gcc_assert (single_succ_p (src));
1149 e = single_succ_edge (src);
1150 if (fallthru)
1151 e->flags = EDGE_FALLTHRU;
1152 else
1153 e->flags = 0;
1155 e->probability = REG_BR_PROB_BASE;
1156 e->count = src->count;
1158 if (e->dest != target)
1159 redirect_edge_succ (e, target);
1160 return e;
1163 /* Subroutine of redirect_branch_edge that tries to patch the jump
1164 instruction INSN so that it reaches block NEW. Do this
1165 only when it originally reached block OLD. Return true if this
1166 worked or the original target wasn't OLD, return false if redirection
1167 doesn't work. */
1169 static bool
1170 patch_jump_insn (rtx_insn *insn, rtx_insn *old_label, basic_block new_bb)
1172 rtx_jump_table_data *table;
1173 rtx tmp;
1174 /* Recognize a tablejump and adjust all matching cases. */
1175 if (tablejump_p (insn, NULL, &table))
1177 rtvec vec;
1178 int j;
1179 rtx_code_label *new_label = block_label (new_bb);
1181 if (new_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
1182 return false;
1183 vec = table->get_labels ();
1185 for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
1186 if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
1188 RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
1189 --LABEL_NUSES (old_label);
1190 ++LABEL_NUSES (new_label);
1193 /* Handle casesi dispatch insns. */
1194 if ((tmp = single_set (insn)) != NULL
1195 && SET_DEST (tmp) == pc_rtx
1196 && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
1197 && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
1198 && LABEL_REF_LABEL (XEXP (SET_SRC (tmp), 2)) == old_label)
1200 XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (Pmode,
1201 new_label);
1202 --LABEL_NUSES (old_label);
1203 ++LABEL_NUSES (new_label);
1206 else if ((tmp = extract_asm_operands (PATTERN (insn))) != NULL)
1208 int i, n = ASM_OPERANDS_LABEL_LENGTH (tmp);
1209 rtx note;
1211 if (new_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
1212 return false;
1213 rtx_code_label *new_label = block_label (new_bb);
1215 for (i = 0; i < n; ++i)
1217 rtx old_ref = ASM_OPERANDS_LABEL (tmp, i);
1218 gcc_assert (GET_CODE (old_ref) == LABEL_REF);
1219 if (XEXP (old_ref, 0) == old_label)
1221 ASM_OPERANDS_LABEL (tmp, i)
1222 = gen_rtx_LABEL_REF (Pmode, new_label);
1223 --LABEL_NUSES (old_label);
1224 ++LABEL_NUSES (new_label);
1228 if (JUMP_LABEL (insn) == old_label)
1230 JUMP_LABEL (insn) = new_label;
1231 note = find_reg_note (insn, REG_LABEL_TARGET, new_label);
1232 if (note)
1233 remove_note (insn, note);
1235 else
1237 note = find_reg_note (insn, REG_LABEL_TARGET, old_label);
1238 if (note)
1239 remove_note (insn, note);
1240 if (JUMP_LABEL (insn) != new_label
1241 && !find_reg_note (insn, REG_LABEL_TARGET, new_label))
1242 add_reg_note (insn, REG_LABEL_TARGET, new_label);
1244 while ((note = find_reg_note (insn, REG_LABEL_OPERAND, old_label))
1245 != NULL_RTX)
1246 XEXP (note, 0) = new_label;
1248 else
1250 /* ?? We may play the games with moving the named labels from
1251 one basic block to the other in case only one computed_jump is
1252 available. */
1253 if (computed_jump_p (insn)
1254 /* A return instruction can't be redirected. */
1255 || returnjump_p (insn))
1256 return false;
1258 if (!currently_expanding_to_rtl || JUMP_LABEL (insn) == old_label)
1260 /* If the insn doesn't go where we think, we're confused. */
1261 gcc_assert (JUMP_LABEL (insn) == old_label);
1263 /* If the substitution doesn't succeed, die. This can happen
1264 if the back end emitted unrecognizable instructions or if
1265 target is exit block on some arches. */
1266 if (!redirect_jump (as_a <rtx_jump_insn *> (insn),
1267 block_label (new_bb), 0))
1269 gcc_assert (new_bb == EXIT_BLOCK_PTR_FOR_FN (cfun));
1270 return false;
1274 return true;
1278 /* Redirect edge representing branch of (un)conditional jump or tablejump,
1279 NULL on failure */
1280 static edge
1281 redirect_branch_edge (edge e, basic_block target)
1283 rtx_insn *old_label = BB_HEAD (e->dest);
1284 basic_block src = e->src;
1285 rtx_insn *insn = BB_END (src);
1287 /* We can only redirect non-fallthru edges of jump insn. */
1288 if (e->flags & EDGE_FALLTHRU)
1289 return NULL;
1290 else if (!JUMP_P (insn) && !currently_expanding_to_rtl)
1291 return NULL;
1293 if (!currently_expanding_to_rtl)
1295 if (!patch_jump_insn (as_a <rtx_jump_insn *> (insn), old_label, target))
1296 return NULL;
1298 else
1299 /* When expanding this BB might actually contain multiple
1300 jumps (i.e. not yet split by find_many_sub_basic_blocks).
1301 Redirect all of those that match our label. */
1302 FOR_BB_INSNS (src, insn)
1303 if (JUMP_P (insn) && !patch_jump_insn (as_a <rtx_jump_insn *> (insn),
1304 old_label, target))
1305 return NULL;
1307 if (dump_file)
1308 fprintf (dump_file, "Edge %i->%i redirected to %i\n",
1309 e->src->index, e->dest->index, target->index);
1311 if (e->dest != target)
1312 e = redirect_edge_succ_nodup (e, target);
1314 return e;
1317 /* Called when edge E has been redirected to a new destination,
1318 in order to update the region crossing flag on the edge and
1319 jump. */
1321 static void
1322 fixup_partition_crossing (edge e)
1324 if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun) || e->dest
1325 == EXIT_BLOCK_PTR_FOR_FN (cfun))
1326 return;
1327 /* If we redirected an existing edge, it may already be marked
1328 crossing, even though the new src is missing a reg crossing note.
1329 But make sure reg crossing note doesn't already exist before
1330 inserting. */
1331 if (BB_PARTITION (e->src) != BB_PARTITION (e->dest))
1333 e->flags |= EDGE_CROSSING;
1334 if (JUMP_P (BB_END (e->src))
1335 && !CROSSING_JUMP_P (BB_END (e->src)))
1336 CROSSING_JUMP_P (BB_END (e->src)) = 1;
1338 else if (BB_PARTITION (e->src) == BB_PARTITION (e->dest))
1340 e->flags &= ~EDGE_CROSSING;
1341 /* Remove the section crossing note from jump at end of
1342 src if it exists, and if no other successors are
1343 still crossing. */
1344 if (JUMP_P (BB_END (e->src)) && CROSSING_JUMP_P (BB_END (e->src)))
1346 bool has_crossing_succ = false;
1347 edge e2;
1348 edge_iterator ei;
1349 FOR_EACH_EDGE (e2, ei, e->src->succs)
1351 has_crossing_succ |= (e2->flags & EDGE_CROSSING);
1352 if (has_crossing_succ)
1353 break;
1355 if (!has_crossing_succ)
1356 CROSSING_JUMP_P (BB_END (e->src)) = 0;
1361 /* Called when block BB has been reassigned to the cold partition,
1362 because it is now dominated by another cold block,
1363 to ensure that the region crossing attributes are updated. */
1365 static void
1366 fixup_new_cold_bb (basic_block bb)
1368 edge e;
1369 edge_iterator ei;
1371 /* This is called when a hot bb is found to now be dominated
1372 by a cold bb and therefore needs to become cold. Therefore,
1373 its preds will no longer be region crossing. Any non-dominating
1374 preds that were previously hot would also have become cold
1375 in the caller for the same region. Any preds that were previously
1376 region-crossing will be adjusted in fixup_partition_crossing. */
1377 FOR_EACH_EDGE (e, ei, bb->preds)
1379 fixup_partition_crossing (e);
1382 /* Possibly need to make bb's successor edges region crossing,
1383 or remove stale region crossing. */
1384 FOR_EACH_EDGE (e, ei, bb->succs)
1386 /* We can't have fall-through edges across partition boundaries.
1387 Note that force_nonfallthru will do any necessary partition
1388 boundary fixup by calling fixup_partition_crossing itself. */
1389 if ((e->flags & EDGE_FALLTHRU)
1390 && BB_PARTITION (bb) != BB_PARTITION (e->dest)
1391 && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
1392 force_nonfallthru (e);
1393 else
1394 fixup_partition_crossing (e);
1398 /* Attempt to change code to redirect edge E to TARGET. Don't do that on
1399 expense of adding new instructions or reordering basic blocks.
1401 Function can be also called with edge destination equivalent to the TARGET.
1402 Then it should try the simplifications and do nothing if none is possible.
1404 Return edge representing the branch if transformation succeeded. Return NULL
1405 on failure.
1406 We still return NULL in case E already destinated TARGET and we didn't
1407 managed to simplify instruction stream. */
1409 static edge
1410 rtl_redirect_edge_and_branch (edge e, basic_block target)
1412 edge ret;
1413 basic_block src = e->src;
1414 basic_block dest = e->dest;
1416 if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
1417 return NULL;
1419 if (dest == target)
1420 return e;
1422 if ((ret = try_redirect_by_replacing_jump (e, target, false)) != NULL)
1424 df_set_bb_dirty (src);
1425 fixup_partition_crossing (ret);
1426 return ret;
1429 ret = redirect_branch_edge (e, target);
1430 if (!ret)
1431 return NULL;
1433 df_set_bb_dirty (src);
1434 fixup_partition_crossing (ret);
1435 return ret;
1438 /* Emit a barrier after BB, into the footer if we are in CFGLAYOUT mode. */
1440 void
1441 emit_barrier_after_bb (basic_block bb)
1443 rtx_barrier *barrier = emit_barrier_after (BB_END (bb));
1444 gcc_assert (current_ir_type () == IR_RTL_CFGRTL
1445 || current_ir_type () == IR_RTL_CFGLAYOUT);
1446 if (current_ir_type () == IR_RTL_CFGLAYOUT)
1448 rtx_insn *insn = unlink_insn_chain (barrier, barrier);
1450 if (BB_FOOTER (bb))
1452 rtx_insn *footer_tail = BB_FOOTER (bb);
1454 while (NEXT_INSN (footer_tail))
1455 footer_tail = NEXT_INSN (footer_tail);
1456 if (!BARRIER_P (footer_tail))
1458 SET_NEXT_INSN (footer_tail) = insn;
1459 SET_PREV_INSN (insn) = footer_tail;
1462 else
1463 BB_FOOTER (bb) = insn;
1467 /* Like force_nonfallthru below, but additionally performs redirection
1468 Used by redirect_edge_and_branch_force. JUMP_LABEL is used only
1469 when redirecting to the EXIT_BLOCK, it is either ret_rtx or
1470 simple_return_rtx, indicating which kind of returnjump to create.
1471 It should be NULL otherwise. */
1473 basic_block
1474 force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label)
1476 basic_block jump_block, new_bb = NULL, src = e->src;
1477 rtx note;
1478 edge new_edge;
1479 int abnormal_edge_flags = 0;
1480 bool asm_goto_edge = false;
1481 int loc;
1483 /* In the case the last instruction is conditional jump to the next
1484 instruction, first redirect the jump itself and then continue
1485 by creating a basic block afterwards to redirect fallthru edge. */
1486 if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
1487 && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
1488 && any_condjump_p (BB_END (e->src))
1489 && JUMP_LABEL (BB_END (e->src)) == BB_HEAD (e->dest))
1491 rtx note;
1492 edge b = unchecked_make_edge (e->src, target, 0);
1493 bool redirected;
1495 redirected = redirect_jump (as_a <rtx_jump_insn *> (BB_END (e->src)),
1496 block_label (target), 0);
1497 gcc_assert (redirected);
1499 note = find_reg_note (BB_END (e->src), REG_BR_PROB, NULL_RTX);
1500 if (note)
1502 int prob = XINT (note, 0);
1504 b->probability = prob;
1505 /* Update this to use GCOV_COMPUTE_SCALE. */
1506 b->count = e->count * prob / REG_BR_PROB_BASE;
1507 e->probability -= e->probability;
1508 e->count -= b->count;
1509 if (e->probability < 0)
1510 e->probability = 0;
1511 if (e->count < 0)
1512 e->count = 0;
1516 if (e->flags & EDGE_ABNORMAL)
1518 /* Irritating special case - fallthru edge to the same block as abnormal
1519 edge.
1520 We can't redirect abnormal edge, but we still can split the fallthru
1521 one and create separate abnormal edge to original destination.
1522 This allows bb-reorder to make such edge non-fallthru. */
1523 gcc_assert (e->dest == target);
1524 abnormal_edge_flags = e->flags & ~EDGE_FALLTHRU;
1525 e->flags &= EDGE_FALLTHRU;
1527 else
1529 gcc_assert (e->flags & EDGE_FALLTHRU);
1530 if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1532 /* We can't redirect the entry block. Create an empty block
1533 at the start of the function which we use to add the new
1534 jump. */
1535 edge tmp;
1536 edge_iterator ei;
1537 bool found = false;
1539 basic_block bb = create_basic_block (BB_HEAD (e->dest), NULL,
1540 ENTRY_BLOCK_PTR_FOR_FN (cfun));
1542 /* Change the existing edge's source to be the new block, and add
1543 a new edge from the entry block to the new block. */
1544 e->src = bb;
1545 for (ei = ei_start (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs);
1546 (tmp = ei_safe_edge (ei)); )
1548 if (tmp == e)
1550 ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs->unordered_remove (ei.index);
1551 found = true;
1552 break;
1554 else
1555 ei_next (&ei);
1558 gcc_assert (found);
1560 vec_safe_push (bb->succs, e);
1561 make_single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), bb,
1562 EDGE_FALLTHRU);
1566 /* If e->src ends with asm goto, see if any of the ASM_OPERANDS_LABELs
1567 don't point to the target or fallthru label. */
1568 if (JUMP_P (BB_END (e->src))
1569 && target != EXIT_BLOCK_PTR_FOR_FN (cfun)
1570 && (e->flags & EDGE_FALLTHRU)
1571 && (note = extract_asm_operands (PATTERN (BB_END (e->src)))))
1573 int i, n = ASM_OPERANDS_LABEL_LENGTH (note);
1574 bool adjust_jump_target = false;
1576 for (i = 0; i < n; ++i)
1578 if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (e->dest))
1580 LABEL_NUSES (XEXP (ASM_OPERANDS_LABEL (note, i), 0))--;
1581 XEXP (ASM_OPERANDS_LABEL (note, i), 0) = block_label (target);
1582 LABEL_NUSES (XEXP (ASM_OPERANDS_LABEL (note, i), 0))++;
1583 adjust_jump_target = true;
1585 if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (target))
1586 asm_goto_edge = true;
1588 if (adjust_jump_target)
1590 rtx_insn *insn = BB_END (e->src);
1591 rtx note;
1592 rtx_insn *old_label = BB_HEAD (e->dest);
1593 rtx_insn *new_label = BB_HEAD (target);
1595 if (JUMP_LABEL (insn) == old_label)
1597 JUMP_LABEL (insn) = new_label;
1598 note = find_reg_note (insn, REG_LABEL_TARGET, new_label);
1599 if (note)
1600 remove_note (insn, note);
1602 else
1604 note = find_reg_note (insn, REG_LABEL_TARGET, old_label);
1605 if (note)
1606 remove_note (insn, note);
1607 if (JUMP_LABEL (insn) != new_label
1608 && !find_reg_note (insn, REG_LABEL_TARGET, new_label))
1609 add_reg_note (insn, REG_LABEL_TARGET, new_label);
1611 while ((note = find_reg_note (insn, REG_LABEL_OPERAND, old_label))
1612 != NULL_RTX)
1613 XEXP (note, 0) = new_label;
1617 if (EDGE_COUNT (e->src->succs) >= 2 || abnormal_edge_flags || asm_goto_edge)
1619 rtx_insn *new_head;
1620 gcov_type count = e->count;
1621 int probability = e->probability;
1622 /* Create the new structures. */
1624 /* If the old block ended with a tablejump, skip its table
1625 by searching forward from there. Otherwise start searching
1626 forward from the last instruction of the old block. */
1627 rtx_jump_table_data *table;
1628 if (tablejump_p (BB_END (e->src), NULL, &table))
1629 new_head = table;
1630 else
1631 new_head = BB_END (e->src);
1632 new_head = NEXT_INSN (new_head);
1634 jump_block = create_basic_block (new_head, NULL, e->src);
1635 jump_block->count = count;
1636 jump_block->frequency = EDGE_FREQUENCY (e);
1638 /* Make sure new block ends up in correct hot/cold section. */
1640 BB_COPY_PARTITION (jump_block, e->src);
1642 /* Wire edge in. */
1643 new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1644 new_edge->probability = probability;
1645 new_edge->count = count;
1647 /* Redirect old edge. */
1648 redirect_edge_pred (e, jump_block);
1649 e->probability = REG_BR_PROB_BASE;
1651 /* If e->src was previously region crossing, it no longer is
1652 and the reg crossing note should be removed. */
1653 fixup_partition_crossing (new_edge);
1655 /* If asm goto has any label refs to target's label,
1656 add also edge from asm goto bb to target. */
1657 if (asm_goto_edge)
1659 new_edge->probability /= 2;
1660 new_edge->count /= 2;
1661 jump_block->count /= 2;
1662 jump_block->frequency /= 2;
1663 new_edge = make_edge (new_edge->src, target,
1664 e->flags & ~EDGE_FALLTHRU);
1665 new_edge->probability = probability - probability / 2;
1666 new_edge->count = count - count / 2;
1669 new_bb = jump_block;
1671 else
1672 jump_block = e->src;
1674 loc = e->goto_locus;
1675 e->flags &= ~EDGE_FALLTHRU;
1676 if (target == EXIT_BLOCK_PTR_FOR_FN (cfun))
1678 if (jump_label == ret_rtx)
1679 emit_jump_insn_after_setloc (targetm.gen_return (),
1680 BB_END (jump_block), loc);
1681 else
1683 gcc_assert (jump_label == simple_return_rtx);
1684 emit_jump_insn_after_setloc (targetm.gen_simple_return (),
1685 BB_END (jump_block), loc);
1687 set_return_jump_label (BB_END (jump_block));
1689 else
1691 rtx_code_label *label = block_label (target);
1692 emit_jump_insn_after_setloc (targetm.gen_jump (label),
1693 BB_END (jump_block), loc);
1694 JUMP_LABEL (BB_END (jump_block)) = label;
1695 LABEL_NUSES (label)++;
1698 /* We might be in cfg layout mode, and if so, the following routine will
1699 insert the barrier correctly. */
1700 emit_barrier_after_bb (jump_block);
1701 redirect_edge_succ_nodup (e, target);
1703 if (abnormal_edge_flags)
1704 make_edge (src, target, abnormal_edge_flags);
1706 df_mark_solutions_dirty ();
1707 fixup_partition_crossing (e);
1708 return new_bb;
1711 /* Edge E is assumed to be fallthru edge. Emit needed jump instruction
1712 (and possibly create new basic block) to make edge non-fallthru.
1713 Return newly created BB or NULL if none. */
1715 static basic_block
1716 rtl_force_nonfallthru (edge e)
1718 return force_nonfallthru_and_redirect (e, e->dest, NULL_RTX);
1721 /* Redirect edge even at the expense of creating new jump insn or
1722 basic block. Return new basic block if created, NULL otherwise.
1723 Conversion must be possible. */
1725 static basic_block
1726 rtl_redirect_edge_and_branch_force (edge e, basic_block target)
1728 if (redirect_edge_and_branch (e, target)
1729 || e->dest == target)
1730 return NULL;
1732 /* In case the edge redirection failed, try to force it to be non-fallthru
1733 and redirect newly created simplejump. */
1734 df_set_bb_dirty (e->src);
1735 return force_nonfallthru_and_redirect (e, target, NULL_RTX);
1738 /* The given edge should potentially be a fallthru edge. If that is in
1739 fact true, delete the jump and barriers that are in the way. */
1741 static void
1742 rtl_tidy_fallthru_edge (edge e)
1744 rtx_insn *q;
1745 basic_block b = e->src, c = b->next_bb;
1747 /* ??? In a late-running flow pass, other folks may have deleted basic
1748 blocks by nopping out blocks, leaving multiple BARRIERs between here
1749 and the target label. They ought to be chastised and fixed.
1751 We can also wind up with a sequence of undeletable labels between
1752 one block and the next.
1754 So search through a sequence of barriers, labels, and notes for
1755 the head of block C and assert that we really do fall through. */
1757 for (q = NEXT_INSN (BB_END (b)); q != BB_HEAD (c); q = NEXT_INSN (q))
1758 if (INSN_P (q))
1759 return;
1761 /* Remove what will soon cease being the jump insn from the source block.
1762 If block B consisted only of this single jump, turn it into a deleted
1763 note. */
1764 q = BB_END (b);
1765 if (JUMP_P (q)
1766 && onlyjump_p (q)
1767 && (any_uncondjump_p (q)
1768 || single_succ_p (b)))
1770 rtx label;
1771 rtx_jump_table_data *table;
1773 if (tablejump_p (q, &label, &table))
1775 /* The label is likely mentioned in some instruction before
1776 the tablejump and might not be DCEd, so turn it into
1777 a note instead and move before the tablejump that is going to
1778 be deleted. */
1779 const char *name = LABEL_NAME (label);
1780 PUT_CODE (label, NOTE);
1781 NOTE_KIND (label) = NOTE_INSN_DELETED_LABEL;
1782 NOTE_DELETED_LABEL_NAME (label) = name;
1783 rtx_insn *lab = safe_as_a <rtx_insn *> (label);
1784 reorder_insns (lab, lab, PREV_INSN (q));
1785 delete_insn (table);
1788 /* If this was a conditional jump, we need to also delete
1789 the insn that set cc0. */
1790 if (HAVE_cc0 && any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1791 q = PREV_INSN (q);
1793 q = PREV_INSN (q);
1796 /* Selectively unlink the sequence. */
1797 if (q != PREV_INSN (BB_HEAD (c)))
1798 delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c)), false);
1800 e->flags |= EDGE_FALLTHRU;
1803 /* Should move basic block BB after basic block AFTER. NIY. */
1805 static bool
1806 rtl_move_block_after (basic_block bb ATTRIBUTE_UNUSED,
1807 basic_block after ATTRIBUTE_UNUSED)
1809 return false;
1812 /* Locate the last bb in the same partition as START_BB. */
1814 static basic_block
1815 last_bb_in_partition (basic_block start_bb)
1817 basic_block bb;
1818 FOR_BB_BETWEEN (bb, start_bb, EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
1820 if (BB_PARTITION (start_bb) != BB_PARTITION (bb->next_bb))
1821 return bb;
1823 /* Return bb before the exit block. */
1824 return bb->prev_bb;
1827 /* Split a (typically critical) edge. Return the new block.
1828 The edge must not be abnormal.
1830 ??? The code generally expects to be called on critical edges.
1831 The case of a block ending in an unconditional jump to a
1832 block with multiple predecessors is not handled optimally. */
1834 static basic_block
1835 rtl_split_edge (edge edge_in)
1837 basic_block bb, new_bb;
1838 rtx_insn *before;
1840 /* Abnormal edges cannot be split. */
1841 gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
1843 /* We are going to place the new block in front of edge destination.
1844 Avoid existence of fallthru predecessors. */
1845 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1847 edge e = find_fallthru_edge (edge_in->dest->preds);
1849 if (e)
1850 force_nonfallthru (e);
1853 /* Create the basic block note. */
1854 if (edge_in->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
1855 before = BB_HEAD (edge_in->dest);
1856 else
1857 before = NULL;
1859 /* If this is a fall through edge to the exit block, the blocks might be
1860 not adjacent, and the right place is after the source. */
1861 if ((edge_in->flags & EDGE_FALLTHRU)
1862 && edge_in->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
1864 before = NEXT_INSN (BB_END (edge_in->src));
1865 bb = create_basic_block (before, NULL, edge_in->src);
1866 BB_COPY_PARTITION (bb, edge_in->src);
1868 else
1870 if (edge_in->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1872 bb = create_basic_block (before, NULL, edge_in->dest->prev_bb);
1873 BB_COPY_PARTITION (bb, edge_in->dest);
1875 else
1877 basic_block after = edge_in->dest->prev_bb;
1878 /* If this is post-bb reordering, and the edge crosses a partition
1879 boundary, the new block needs to be inserted in the bb chain
1880 at the end of the src partition (since we put the new bb into
1881 that partition, see below). Otherwise we may end up creating
1882 an extra partition crossing in the chain, which is illegal.
1883 It can't go after the src, because src may have a fall-through
1884 to a different block. */
1885 if (crtl->bb_reorder_complete
1886 && (edge_in->flags & EDGE_CROSSING))
1888 after = last_bb_in_partition (edge_in->src);
1889 before = get_last_bb_insn (after);
1890 /* The instruction following the last bb in partition should
1891 be a barrier, since it cannot end in a fall-through. */
1892 gcc_checking_assert (BARRIER_P (before));
1893 before = NEXT_INSN (before);
1895 bb = create_basic_block (before, NULL, after);
1896 /* Put the split bb into the src partition, to avoid creating
1897 a situation where a cold bb dominates a hot bb, in the case
1898 where src is cold and dest is hot. The src will dominate
1899 the new bb (whereas it might not have dominated dest). */
1900 BB_COPY_PARTITION (bb, edge_in->src);
1904 make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1906 /* Can't allow a region crossing edge to be fallthrough. */
1907 if (BB_PARTITION (bb) != BB_PARTITION (edge_in->dest)
1908 && edge_in->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
1910 new_bb = force_nonfallthru (single_succ_edge (bb));
1911 gcc_assert (!new_bb);
1914 /* For non-fallthru edges, we must adjust the predecessor's
1915 jump instruction to target our new block. */
1916 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1918 edge redirected = redirect_edge_and_branch (edge_in, bb);
1919 gcc_assert (redirected);
1921 else
1923 if (edge_in->src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
1925 /* For asm goto even splitting of fallthru edge might
1926 need insn patching, as other labels might point to the
1927 old label. */
1928 rtx_insn *last = BB_END (edge_in->src);
1929 if (last
1930 && JUMP_P (last)
1931 && edge_in->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
1932 && extract_asm_operands (PATTERN (last)) != NULL_RTX
1933 && patch_jump_insn (last, before, bb))
1934 df_set_bb_dirty (edge_in->src);
1936 redirect_edge_succ (edge_in, bb);
1939 return bb;
1942 /* Queue instructions for insertion on an edge between two basic blocks.
1943 The new instructions and basic blocks (if any) will not appear in the
1944 CFG until commit_edge_insertions is called. */
1946 void
1947 insert_insn_on_edge (rtx pattern, edge e)
1949 /* We cannot insert instructions on an abnormal critical edge.
1950 It will be easier to find the culprit if we die now. */
1951 gcc_assert (!((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)));
1953 if (e->insns.r == NULL_RTX)
1954 start_sequence ();
1955 else
1956 push_to_sequence (e->insns.r);
1958 emit_insn (pattern);
1960 e->insns.r = get_insns ();
1961 end_sequence ();
1964 /* Update the CFG for the instructions queued on edge E. */
1966 void
1967 commit_one_edge_insertion (edge e)
1969 rtx_insn *before = NULL, *after = NULL, *insns, *tmp, *last;
1970 basic_block bb;
1972 /* Pull the insns off the edge now since the edge might go away. */
1973 insns = e->insns.r;
1974 e->insns.r = NULL;
1976 /* Figure out where to put these insns. If the destination has
1977 one predecessor, insert there. Except for the exit block. */
1978 if (single_pred_p (e->dest) && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
1980 bb = e->dest;
1982 /* Get the location correct wrt a code label, and "nice" wrt
1983 a basic block note, and before everything else. */
1984 tmp = BB_HEAD (bb);
1985 if (LABEL_P (tmp))
1986 tmp = NEXT_INSN (tmp);
1987 if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1988 tmp = NEXT_INSN (tmp);
1989 if (tmp == BB_HEAD (bb))
1990 before = tmp;
1991 else if (tmp)
1992 after = PREV_INSN (tmp);
1993 else
1994 after = get_last_insn ();
1997 /* If the source has one successor and the edge is not abnormal,
1998 insert there. Except for the entry block.
1999 Don't do this if the predecessor ends in a jump other than
2000 unconditional simple jump. E.g. for asm goto that points all
2001 its labels at the fallthru basic block, we can't insert instructions
2002 before the asm goto, as the asm goto can have various of side effects,
2003 and can't emit instructions after the asm goto, as it must end
2004 the basic block. */
2005 else if ((e->flags & EDGE_ABNORMAL) == 0
2006 && single_succ_p (e->src)
2007 && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
2008 && (!JUMP_P (BB_END (e->src))
2009 || simplejump_p (BB_END (e->src))))
2011 bb = e->src;
2013 /* It is possible to have a non-simple jump here. Consider a target
2014 where some forms of unconditional jumps clobber a register. This
2015 happens on the fr30 for example.
2017 We know this block has a single successor, so we can just emit
2018 the queued insns before the jump. */
2019 if (JUMP_P (BB_END (bb)))
2020 before = BB_END (bb);
2021 else
2023 /* We'd better be fallthru, or we've lost track of what's what. */
2024 gcc_assert (e->flags & EDGE_FALLTHRU);
2026 after = BB_END (bb);
2030 /* Otherwise we must split the edge. */
2031 else
2033 bb = split_edge (e);
2035 /* If E crossed a partition boundary, we needed to make bb end in
2036 a region-crossing jump, even though it was originally fallthru. */
2037 if (JUMP_P (BB_END (bb)))
2038 before = BB_END (bb);
2039 else
2040 after = BB_END (bb);
2043 /* Now that we've found the spot, do the insertion. */
2044 if (before)
2046 emit_insn_before_noloc (insns, before, bb);
2047 last = prev_nonnote_insn (before);
2049 else
2050 last = emit_insn_after_noloc (insns, after, bb);
2052 if (returnjump_p (last))
2054 /* ??? Remove all outgoing edges from BB and add one for EXIT.
2055 This is not currently a problem because this only happens
2056 for the (single) epilogue, which already has a fallthru edge
2057 to EXIT. */
2059 e = single_succ_edge (bb);
2060 gcc_assert (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
2061 && single_succ_p (bb) && (e->flags & EDGE_FALLTHRU));
2063 e->flags &= ~EDGE_FALLTHRU;
2064 emit_barrier_after (last);
2066 if (before)
2067 delete_insn (before);
2069 else
2070 gcc_assert (!JUMP_P (last));
2073 /* Update the CFG for all queued instructions. */
2075 void
2076 commit_edge_insertions (void)
2078 basic_block bb;
2080 /* Optimization passes that invoke this routine can cause hot blocks
2081 previously reached by both hot and cold blocks to become dominated only
2082 by cold blocks. This will cause the verification below to fail,
2083 and lead to now cold code in the hot section. In some cases this
2084 may only be visible after newly unreachable blocks are deleted,
2085 which will be done by fixup_partitions. */
2086 fixup_partitions ();
2088 checking_verify_flow_info ();
2090 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
2091 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
2093 edge e;
2094 edge_iterator ei;
2096 FOR_EACH_EDGE (e, ei, bb->succs)
2097 if (e->insns.r)
2098 commit_one_edge_insertion (e);
2103 /* Print out RTL-specific basic block information (live information
2104 at start and end with TDF_DETAILS). FLAGS are the TDF_* masks
2105 documented in dumpfile.h. */
2107 static void
2108 rtl_dump_bb (FILE *outf, basic_block bb, int indent, int flags)
2110 rtx_insn *insn;
2111 rtx_insn *last;
2112 char *s_indent;
2114 s_indent = (char *) alloca ((size_t) indent + 1);
2115 memset (s_indent, ' ', (size_t) indent);
2116 s_indent[indent] = '\0';
2118 if (df && (flags & TDF_DETAILS))
2120 df_dump_top (bb, outf);
2121 putc ('\n', outf);
2124 if (bb->index != ENTRY_BLOCK && bb->index != EXIT_BLOCK)
2125 for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
2126 insn = NEXT_INSN (insn))
2128 if (flags & TDF_DETAILS)
2129 df_dump_insn_top (insn, outf);
2130 if (! (flags & TDF_SLIM))
2131 print_rtl_single (outf, insn);
2132 else
2133 dump_insn_slim (outf, insn);
2134 if (flags & TDF_DETAILS)
2135 df_dump_insn_bottom (insn, outf);
2138 if (df && (flags & TDF_DETAILS))
2140 df_dump_bottom (bb, outf);
2141 putc ('\n', outf);
2146 /* Like dump_function_to_file, but for RTL. Print out dataflow information
2147 for the start of each basic block. FLAGS are the TDF_* masks documented
2148 in dumpfile.h. */
2150 void
2151 print_rtl_with_bb (FILE *outf, const rtx_insn *rtx_first, int flags)
2153 const rtx_insn *tmp_rtx;
2154 if (rtx_first == 0)
2155 fprintf (outf, "(nil)\n");
2156 else
2158 enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
2159 int max_uid = get_max_uid ();
2160 basic_block *start = XCNEWVEC (basic_block, max_uid);
2161 basic_block *end = XCNEWVEC (basic_block, max_uid);
2162 enum bb_state *in_bb_p = XCNEWVEC (enum bb_state, max_uid);
2163 basic_block bb;
2165 /* After freeing the CFG, we still have BLOCK_FOR_INSN set on most
2166 insns, but the CFG is not maintained so the basic block info
2167 is not reliable. Therefore it's omitted from the dumps. */
2168 if (! (cfun->curr_properties & PROP_cfg))
2169 flags &= ~TDF_BLOCKS;
2171 if (df)
2172 df_dump_start (outf);
2174 if (flags & TDF_BLOCKS)
2176 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2178 rtx_insn *x;
2180 start[INSN_UID (BB_HEAD (bb))] = bb;
2181 end[INSN_UID (BB_END (bb))] = bb;
2182 for (x = BB_HEAD (bb); x != NULL_RTX; x = NEXT_INSN (x))
2184 enum bb_state state = IN_MULTIPLE_BB;
2186 if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
2187 state = IN_ONE_BB;
2188 in_bb_p[INSN_UID (x)] = state;
2190 if (x == BB_END (bb))
2191 break;
2196 for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
2198 if (flags & TDF_BLOCKS)
2200 bb = start[INSN_UID (tmp_rtx)];
2201 if (bb != NULL)
2203 dump_bb_info (outf, bb, 0, dump_flags | TDF_COMMENT, true, false);
2204 if (df && (flags & TDF_DETAILS))
2205 df_dump_top (bb, outf);
2208 if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
2209 && !NOTE_P (tmp_rtx)
2210 && !BARRIER_P (tmp_rtx))
2211 fprintf (outf, ";; Insn is not within a basic block\n");
2212 else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
2213 fprintf (outf, ";; Insn is in multiple basic blocks\n");
2216 if (flags & TDF_DETAILS)
2217 df_dump_insn_top (tmp_rtx, outf);
2218 if (! (flags & TDF_SLIM))
2219 print_rtl_single (outf, tmp_rtx);
2220 else
2221 dump_insn_slim (outf, tmp_rtx);
2222 if (flags & TDF_DETAILS)
2223 df_dump_insn_bottom (tmp_rtx, outf);
2225 if (flags & TDF_BLOCKS)
2227 bb = end[INSN_UID (tmp_rtx)];
2228 if (bb != NULL)
2230 dump_bb_info (outf, bb, 0, dump_flags | TDF_COMMENT, false, true);
2231 if (df && (flags & TDF_DETAILS))
2232 df_dump_bottom (bb, outf);
2233 putc ('\n', outf);
2238 free (start);
2239 free (end);
2240 free (in_bb_p);
2244 /* Update the branch probability of BB if a REG_BR_PROB is present. */
2246 void
2247 update_br_prob_note (basic_block bb)
2249 rtx note;
2250 if (!JUMP_P (BB_END (bb)))
2251 return;
2252 note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX);
2253 if (!note || XINT (note, 0) == BRANCH_EDGE (bb)->probability)
2254 return;
2255 XINT (note, 0) = BRANCH_EDGE (bb)->probability;
2258 /* Get the last insn associated with block BB (that includes barriers and
2259 tablejumps after BB). */
2260 rtx_insn *
2261 get_last_bb_insn (basic_block bb)
2263 rtx_jump_table_data *table;
2264 rtx_insn *tmp;
2265 rtx_insn *end = BB_END (bb);
2267 /* Include any jump table following the basic block. */
2268 if (tablejump_p (end, NULL, &table))
2269 end = table;
2271 /* Include any barriers that may follow the basic block. */
2272 tmp = next_nonnote_insn_bb (end);
2273 while (tmp && BARRIER_P (tmp))
2275 end = tmp;
2276 tmp = next_nonnote_insn_bb (end);
2279 return end;
2282 /* Sanity check partition hotness to ensure that basic blocks in
2283   the cold partition don't dominate basic blocks in the hot partition.
2284 If FLAG_ONLY is true, report violations as errors. Otherwise
2285 re-mark the dominated blocks as cold, since this is run after
2286 cfg optimizations that may make hot blocks previously reached
2287 by both hot and cold blocks now only reachable along cold paths. */
2289 static vec<basic_block>
2290 find_partition_fixes (bool flag_only)
2292 basic_block bb;
2293 vec<basic_block> bbs_in_cold_partition = vNULL;
2294 vec<basic_block> bbs_to_fix = vNULL;
2296 /* Callers check this. */
2297 gcc_checking_assert (crtl->has_bb_partition);
2299 FOR_EACH_BB_FN (bb, cfun)
2300 if ((BB_PARTITION (bb) == BB_COLD_PARTITION))
2301 bbs_in_cold_partition.safe_push (bb);
2303 if (bbs_in_cold_partition.is_empty ())
2304 return vNULL;
2306 bool dom_calculated_here = !dom_info_available_p (CDI_DOMINATORS);
2308 if (dom_calculated_here)
2309 calculate_dominance_info (CDI_DOMINATORS);
2311 while (! bbs_in_cold_partition.is_empty ())
2313 bb = bbs_in_cold_partition.pop ();
2314 /* Any blocks dominated by a block in the cold section
2315 must also be cold. */
2316 basic_block son;
2317 for (son = first_dom_son (CDI_DOMINATORS, bb);
2318 son;
2319 son = next_dom_son (CDI_DOMINATORS, son))
2321 /* If son is not yet cold, then mark it cold here and
2322 enqueue it for further processing. */
2323 if ((BB_PARTITION (son) != BB_COLD_PARTITION))
2325 if (flag_only)
2326 error ("non-cold basic block %d dominated "
2327 "by a block in the cold partition (%d)", son->index, bb->index);
2328 else
2329 BB_SET_PARTITION (son, BB_COLD_PARTITION);
2330 bbs_to_fix.safe_push (son);
2331 bbs_in_cold_partition.safe_push (son);
2336 if (dom_calculated_here)
2337 free_dominance_info (CDI_DOMINATORS);
2339 return bbs_to_fix;
2342 /* Perform cleanup on the hot/cold bb partitioning after optimization
2343 passes that modify the cfg. */
2345 void
2346 fixup_partitions (void)
2348 basic_block bb;
2350 if (!crtl->has_bb_partition)
2351 return;
2353 /* Delete any blocks that became unreachable and weren't
2354 already cleaned up, for example during edge forwarding
2355 and convert_jumps_to_returns. This will expose more
2356 opportunities for fixing the partition boundaries here.
2357 Also, the calculation of the dominance graph during verification
2358 will assert if there are unreachable nodes. */
2359 delete_unreachable_blocks ();
2361 /* If there are partitions, do a sanity check on them: A basic block in
2362   a cold partition cannot dominate a basic block in a hot partition.
2363 Fixup any that now violate this requirement, as a result of edge
2364 forwarding and unreachable block deletion.  */
2365 vec<basic_block> bbs_to_fix = find_partition_fixes (false);
2367 /* Do the partition fixup after all necessary blocks have been converted to
2368 cold, so that we only update the region crossings the minimum number of
2369 places, which can require forcing edges to be non fallthru. */
2370 while (! bbs_to_fix.is_empty ())
2372 bb = bbs_to_fix.pop ();
2373 fixup_new_cold_bb (bb);
2377 /* Verify, in the basic block chain, that there is at most one switch
2378 between hot/cold partitions. This condition will not be true until
2379 after reorder_basic_blocks is called. */
2381 static int
2382 verify_hot_cold_block_grouping (void)
2384 basic_block bb;
2385 int err = 0;
2386 bool switched_sections = false;
2387 int current_partition = BB_UNPARTITIONED;
2389 /* Even after bb reordering is complete, we go into cfglayout mode
2390 again (in compgoto). Ensure we don't call this before going back
2391 into linearized RTL when any layout fixes would have been committed. */
2392 if (!crtl->bb_reorder_complete
2393 || current_ir_type () != IR_RTL_CFGRTL)
2394 return err;
2396 FOR_EACH_BB_FN (bb, cfun)
2398 if (current_partition != BB_UNPARTITIONED
2399 && BB_PARTITION (bb) != current_partition)
2401 if (switched_sections)
2403 error ("multiple hot/cold transitions found (bb %i)",
2404 bb->index);
2405 err = 1;
2407 else
2408 switched_sections = true;
2410 if (!crtl->has_bb_partition)
2411 error ("partition found but function partition flag not set");
2413 current_partition = BB_PARTITION (bb);
2416 return err;
2420 /* Perform several checks on the edges out of each block, such as
2421 the consistency of the branch probabilities, the correctness
2422 of hot/cold partition crossing edges, and the number of expected
2423 successor edges. Also verify that the dominance relationship
2424 between hot/cold blocks is sane. */
2426 static int
2427 rtl_verify_edges (void)
2429 int err = 0;
2430 basic_block bb;
2432 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2434 int n_fallthru = 0, n_branch = 0, n_abnormal_call = 0, n_sibcall = 0;
2435 int n_eh = 0, n_abnormal = 0;
2436 edge e, fallthru = NULL;
2437 edge_iterator ei;
2438 rtx note;
2439 bool has_crossing_edge = false;
2441 if (JUMP_P (BB_END (bb))
2442 && (note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX))
2443 && EDGE_COUNT (bb->succs) >= 2
2444 && any_condjump_p (BB_END (bb)))
2446 if (XINT (note, 0) != BRANCH_EDGE (bb)->probability
2447 && profile_status_for_fn (cfun) != PROFILE_ABSENT)
2449 error ("verify_flow_info: REG_BR_PROB does not match cfg %i %i",
2450 XINT (note, 0), BRANCH_EDGE (bb)->probability);
2451 err = 1;
2455 FOR_EACH_EDGE (e, ei, bb->succs)
2457 bool is_crossing;
2459 if (e->flags & EDGE_FALLTHRU)
2460 n_fallthru++, fallthru = e;
2462 is_crossing = (BB_PARTITION (e->src) != BB_PARTITION (e->dest)
2463 && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
2464 && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun));
2465 has_crossing_edge |= is_crossing;
2466 if (e->flags & EDGE_CROSSING)
2468 if (!is_crossing)
2470 error ("EDGE_CROSSING incorrectly set across same section");
2471 err = 1;
2473 if (e->flags & EDGE_FALLTHRU)
2475 error ("fallthru edge crosses section boundary in bb %i",
2476 e->src->index);
2477 err = 1;
2479 if (e->flags & EDGE_EH)
2481 error ("EH edge crosses section boundary in bb %i",
2482 e->src->index);
2483 err = 1;
2485 if (JUMP_P (BB_END (bb)) && !CROSSING_JUMP_P (BB_END (bb)))
2487 error ("No region crossing jump at section boundary in bb %i",
2488 bb->index);
2489 err = 1;
2492 else if (is_crossing)
2494 error ("EDGE_CROSSING missing across section boundary");
2495 err = 1;
2498 if ((e->flags & ~(EDGE_DFS_BACK
2499 | EDGE_CAN_FALLTHRU
2500 | EDGE_IRREDUCIBLE_LOOP
2501 | EDGE_LOOP_EXIT
2502 | EDGE_CROSSING
2503 | EDGE_PRESERVE)) == 0)
2504 n_branch++;
2506 if (e->flags & EDGE_ABNORMAL_CALL)
2507 n_abnormal_call++;
2509 if (e->flags & EDGE_SIBCALL)
2510 n_sibcall++;
2512 if (e->flags & EDGE_EH)
2513 n_eh++;
2515 if (e->flags & EDGE_ABNORMAL)
2516 n_abnormal++;
2519 if (!has_crossing_edge
2520 && JUMP_P (BB_END (bb))
2521 && CROSSING_JUMP_P (BB_END (bb)))
2523 print_rtl_with_bb (stderr, get_insns (), TDF_RTL | TDF_BLOCKS | TDF_DETAILS);
2524 error ("Region crossing jump across same section in bb %i",
2525 bb->index);
2526 err = 1;
2529 if (n_eh && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
2531 error ("missing REG_EH_REGION note at the end of bb %i", bb->index);
2532 err = 1;
2534 if (n_eh > 1)
2536 error ("too many exception handling edges in bb %i", bb->index);
2537 err = 1;
2539 if (n_branch
2540 && (!JUMP_P (BB_END (bb))
2541 || (n_branch > 1 && (any_uncondjump_p (BB_END (bb))
2542 || any_condjump_p (BB_END (bb))))))
2544 error ("too many outgoing branch edges from bb %i", bb->index);
2545 err = 1;
2547 if (n_fallthru && any_uncondjump_p (BB_END (bb)))
2549 error ("fallthru edge after unconditional jump in bb %i", bb->index);
2550 err = 1;
2552 if (n_branch != 1 && any_uncondjump_p (BB_END (bb)))
2554 error ("wrong number of branch edges after unconditional jump"
2555 " in bb %i", bb->index);
2556 err = 1;
2558 if (n_branch != 1 && any_condjump_p (BB_END (bb))
2559 && JUMP_LABEL (BB_END (bb)) != BB_HEAD (fallthru->dest))
2561 error ("wrong amount of branch edges after conditional jump"
2562 " in bb %i", bb->index);
2563 err = 1;
2565 if (n_abnormal_call && !CALL_P (BB_END (bb)))
2567 error ("abnormal call edges for non-call insn in bb %i", bb->index);
2568 err = 1;
2570 if (n_sibcall && !CALL_P (BB_END (bb)))
2572 error ("sibcall edges for non-call insn in bb %i", bb->index);
2573 err = 1;
2575 if (n_abnormal > n_eh
2576 && !(CALL_P (BB_END (bb))
2577 && n_abnormal == n_abnormal_call + n_sibcall)
2578 && (!JUMP_P (BB_END (bb))
2579 || any_condjump_p (BB_END (bb))
2580 || any_uncondjump_p (BB_END (bb))))
2582 error ("abnormal edges for no purpose in bb %i", bb->index);
2583 err = 1;
2587 /* If there are partitions, do a sanity check on them: A basic block in
2588   a cold partition cannot dominate a basic block in a hot partition.  */
2589 if (crtl->has_bb_partition && !err)
2591 vec<basic_block> bbs_to_fix = find_partition_fixes (true);
2592 err = !bbs_to_fix.is_empty ();
2595 /* Clean up. */
2596 return err;
2599 /* Checks on the instructions within blocks. Currently checks that each
2600 block starts with a basic block note, and that basic block notes and
2601 control flow jumps are not found in the middle of the block. */
2603 static int
2604 rtl_verify_bb_insns (void)
2606 rtx_insn *x;
2607 int err = 0;
2608 basic_block bb;
2610 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2612 /* Now check the header of basic
2613 block. It ought to contain optional CODE_LABEL followed
2614 by NOTE_BASIC_BLOCK. */
2615 x = BB_HEAD (bb);
2616 if (LABEL_P (x))
2618 if (BB_END (bb) == x)
2620 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2621 bb->index);
2622 err = 1;
2625 x = NEXT_INSN (x);
2628 if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2630 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2631 bb->index);
2632 err = 1;
2635 if (BB_END (bb) == x)
2636 /* Do checks for empty blocks here. */
2638 else
2639 for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
2641 if (NOTE_INSN_BASIC_BLOCK_P (x))
2643 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
2644 INSN_UID (x), bb->index);
2645 err = 1;
2648 if (x == BB_END (bb))
2649 break;
2651 if (control_flow_insn_p (x))
2653 error ("in basic block %d:", bb->index);
2654 fatal_insn ("flow control insn inside a basic block", x);
2659 /* Clean up. */
2660 return err;
2663 /* Verify that block pointers for instructions in basic blocks, headers and
2664 footers are set appropriately. */
2666 static int
2667 rtl_verify_bb_pointers (void)
2669 int err = 0;
2670 basic_block bb;
2672 /* Check the general integrity of the basic blocks. */
2673 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2675 rtx_insn *insn;
2677 if (!(bb->flags & BB_RTL))
2679 error ("BB_RTL flag not set for block %d", bb->index);
2680 err = 1;
2683 FOR_BB_INSNS (bb, insn)
2684 if (BLOCK_FOR_INSN (insn) != bb)
2686 error ("insn %d basic block pointer is %d, should be %d",
2687 INSN_UID (insn),
2688 BLOCK_FOR_INSN (insn) ? BLOCK_FOR_INSN (insn)->index : 0,
2689 bb->index);
2690 err = 1;
2693 for (insn = BB_HEADER (bb); insn; insn = NEXT_INSN (insn))
2694 if (!BARRIER_P (insn)
2695 && BLOCK_FOR_INSN (insn) != NULL)
2697 error ("insn %d in header of bb %d has non-NULL basic block",
2698 INSN_UID (insn), bb->index);
2699 err = 1;
2701 for (insn = BB_FOOTER (bb); insn; insn = NEXT_INSN (insn))
2702 if (!BARRIER_P (insn)
2703 && BLOCK_FOR_INSN (insn) != NULL)
2705 error ("insn %d in footer of bb %d has non-NULL basic block",
2706 INSN_UID (insn), bb->index);
2707 err = 1;
2711 /* Clean up. */
2712 return err;
2715 /* Verify the CFG and RTL consistency common for both underlying RTL and
2716 cfglayout RTL.
2718 Currently it does following checks:
2720 - overlapping of basic blocks
2721 - insns with wrong BLOCK_FOR_INSN pointers
2722 - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
2723 - tails of basic blocks (ensure that boundary is necessary)
2724 - scans body of the basic block for JUMP_INSN, CODE_LABEL
2725 and NOTE_INSN_BASIC_BLOCK
2726 - verify that no fall_thru edge crosses hot/cold partition boundaries
2727 - verify that there are no pending RTL branch predictions
2728 - verify that hot blocks are not dominated by cold blocks
2730 In future it can be extended check a lot of other stuff as well
2731 (reachability of basic blocks, life information, etc. etc.). */
2733 static int
2734 rtl_verify_flow_info_1 (void)
2736 int err = 0;
2738 err |= rtl_verify_bb_pointers ();
2740 err |= rtl_verify_bb_insns ();
2742 err |= rtl_verify_edges ();
2744 return err;
2747 /* Walk the instruction chain and verify that bb head/end pointers
2748 are correct, and that instructions are in exactly one bb and have
2749 correct block pointers. */
2751 static int
2752 rtl_verify_bb_insn_chain (void)
2754 basic_block bb;
2755 int err = 0;
2756 rtx_insn *x;
2757 rtx_insn *last_head = get_last_insn ();
2758 basic_block *bb_info;
2759 const int max_uid = get_max_uid ();
2761 bb_info = XCNEWVEC (basic_block, max_uid);
2763 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2765 rtx_insn *head = BB_HEAD (bb);
2766 rtx_insn *end = BB_END (bb);
2768 for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2770 /* Verify the end of the basic block is in the INSN chain. */
2771 if (x == end)
2772 break;
2774 /* And that the code outside of basic blocks has NULL bb field. */
2775 if (!BARRIER_P (x)
2776 && BLOCK_FOR_INSN (x) != NULL)
2778 error ("insn %d outside of basic blocks has non-NULL bb field",
2779 INSN_UID (x));
2780 err = 1;
2784 if (!x)
2786 error ("end insn %d for block %d not found in the insn stream",
2787 INSN_UID (end), bb->index);
2788 err = 1;
2791 /* Work backwards from the end to the head of the basic block
2792 to verify the head is in the RTL chain. */
2793 for (; x != NULL_RTX; x = PREV_INSN (x))
2795 /* While walking over the insn chain, verify insns appear
2796 in only one basic block. */
2797 if (bb_info[INSN_UID (x)] != NULL)
2799 error ("insn %d is in multiple basic blocks (%d and %d)",
2800 INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
2801 err = 1;
2804 bb_info[INSN_UID (x)] = bb;
2806 if (x == head)
2807 break;
2809 if (!x)
2811 error ("head insn %d for block %d not found in the insn stream",
2812 INSN_UID (head), bb->index);
2813 err = 1;
2816 last_head = PREV_INSN (x);
2819 for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2821 /* Check that the code before the first basic block has NULL
2822 bb field. */
2823 if (!BARRIER_P (x)
2824 && BLOCK_FOR_INSN (x) != NULL)
2826 error ("insn %d outside of basic blocks has non-NULL bb field",
2827 INSN_UID (x));
2828 err = 1;
2831 free (bb_info);
2833 return err;
2836 /* Verify that fallthru edges point to adjacent blocks in layout order and
2837 that barriers exist after non-fallthru blocks. */
2839 static int
2840 rtl_verify_fallthru (void)
2842 basic_block bb;
2843 int err = 0;
2845 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2847 edge e;
2849 e = find_fallthru_edge (bb->succs);
2850 if (!e)
2852 rtx_insn *insn;
2854 /* Ensure existence of barrier in BB with no fallthru edges. */
2855 for (insn = NEXT_INSN (BB_END (bb)); ; insn = NEXT_INSN (insn))
2857 if (!insn || NOTE_INSN_BASIC_BLOCK_P (insn))
2859 error ("missing barrier after block %i", bb->index);
2860 err = 1;
2861 break;
2863 if (BARRIER_P (insn))
2864 break;
2867 else if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
2868 && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
2870 rtx_insn *insn;
2872 if (e->src->next_bb != e->dest)
2874 error
2875 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2876 e->src->index, e->dest->index);
2877 err = 1;
2879 else
2880 for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD (e->dest);
2881 insn = NEXT_INSN (insn))
2882 if (BARRIER_P (insn) || INSN_P (insn))
2884 error ("verify_flow_info: Incorrect fallthru %i->%i",
2885 e->src->index, e->dest->index);
2886 fatal_insn ("wrong insn in the fallthru edge", insn);
2887 err = 1;
2892 return err;
2895 /* Verify that blocks are laid out in consecutive order. While walking the
2896 instructions, verify that all expected instructions are inside the basic
2897 blocks, and that all returns are followed by barriers. */
2899 static int
2900 rtl_verify_bb_layout (void)
2902 basic_block bb;
2903 int err = 0;
2904 rtx_insn *x;
2905 int num_bb_notes;
2906 rtx_insn * const rtx_first = get_insns ();
2907 basic_block last_bb_seen = ENTRY_BLOCK_PTR_FOR_FN (cfun), curr_bb = NULL;
2909 num_bb_notes = 0;
2910 last_bb_seen = ENTRY_BLOCK_PTR_FOR_FN (cfun);
2912 for (x = rtx_first; x; x = NEXT_INSN (x))
2914 if (NOTE_INSN_BASIC_BLOCK_P (x))
2916 bb = NOTE_BASIC_BLOCK (x);
2918 num_bb_notes++;
2919 if (bb != last_bb_seen->next_bb)
2920 internal_error ("basic blocks not laid down consecutively");
2922 curr_bb = last_bb_seen = bb;
2925 if (!curr_bb)
2927 switch (GET_CODE (x))
2929 case BARRIER:
2930 case NOTE:
2931 break;
2933 case CODE_LABEL:
2934 /* An ADDR_VEC is placed outside any basic block. */
2935 if (NEXT_INSN (x)
2936 && JUMP_TABLE_DATA_P (NEXT_INSN (x)))
2937 x = NEXT_INSN (x);
2939 /* But in any case, non-deletable labels can appear anywhere. */
2940 break;
2942 default:
2943 fatal_insn ("insn outside basic block", x);
2947 if (JUMP_P (x)
2948 && returnjump_p (x) && ! condjump_p (x)
2949 && ! (next_nonnote_insn (x) && BARRIER_P (next_nonnote_insn (x))))
2950 fatal_insn ("return not followed by barrier", x);
2952 if (curr_bb && x == BB_END (curr_bb))
2953 curr_bb = NULL;
2956 if (num_bb_notes != n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS)
2957 internal_error
2958 ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2959 num_bb_notes, n_basic_blocks_for_fn (cfun));
2961 return err;
2964 /* Verify the CFG and RTL consistency common for both underlying RTL and
2965 cfglayout RTL, plus consistency checks specific to linearized RTL mode.
2967 Currently it does following checks:
2968 - all checks of rtl_verify_flow_info_1
2969 - test head/end pointers
2970 - check that blocks are laid out in consecutive order
2971 - check that all insns are in the basic blocks
2972 (except the switch handling code, barriers and notes)
2973 - check that all returns are followed by barriers
2974 - check that all fallthru edge points to the adjacent blocks
2975 - verify that there is a single hot/cold partition boundary after bbro */
2977 static int
2978 rtl_verify_flow_info (void)
2980 int err = 0;
2982 err |= rtl_verify_flow_info_1 ();
2984 err |= rtl_verify_bb_insn_chain ();
2986 err |= rtl_verify_fallthru ();
2988 err |= rtl_verify_bb_layout ();
2990 err |= verify_hot_cold_block_grouping ();
2992 return err;
2995 /* Assume that the preceding pass has possibly eliminated jump instructions
2996 or converted the unconditional jumps. Eliminate the edges from CFG.
2997 Return true if any edges are eliminated. */
2999 bool
3000 purge_dead_edges (basic_block bb)
3002 edge e;
3003 rtx_insn *insn = BB_END (bb);
3004 rtx note;
3005 bool purged = false;
3006 bool found;
3007 edge_iterator ei;
3009 if (DEBUG_INSN_P (insn) && insn != BB_HEAD (bb))
3011 insn = PREV_INSN (insn);
3012 while ((DEBUG_INSN_P (insn) || NOTE_P (insn)) && insn != BB_HEAD (bb));
3014 /* If this instruction cannot trap, remove REG_EH_REGION notes. */
3015 if (NONJUMP_INSN_P (insn)
3016 && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
3018 rtx eqnote;
3020 if (! may_trap_p (PATTERN (insn))
3021 || ((eqnote = find_reg_equal_equiv_note (insn))
3022 && ! may_trap_p (XEXP (eqnote, 0))))
3023 remove_note (insn, note);
3026 /* Cleanup abnormal edges caused by exceptions or non-local gotos. */
3027 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
3029 bool remove = false;
3031 /* There are three types of edges we need to handle correctly here: EH
3032 edges, abnormal call EH edges, and abnormal call non-EH edges. The
3033 latter can appear when nonlocal gotos are used. */
3034 if (e->flags & EDGE_ABNORMAL_CALL)
3036 if (!CALL_P (insn))
3037 remove = true;
3038 else if (can_nonlocal_goto (insn))
3040 else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
3042 else if (flag_tm && find_reg_note (insn, REG_TM, NULL))
3044 else
3045 remove = true;
3047 else if (e->flags & EDGE_EH)
3048 remove = !can_throw_internal (insn);
3050 if (remove)
3052 remove_edge (e);
3053 df_set_bb_dirty (bb);
3054 purged = true;
3056 else
3057 ei_next (&ei);
3060 if (JUMP_P (insn))
3062 rtx note;
3063 edge b,f;
3064 edge_iterator ei;
3066 /* We do care only about conditional jumps and simplejumps. */
3067 if (!any_condjump_p (insn)
3068 && !returnjump_p (insn)
3069 && !simplejump_p (insn))
3070 return purged;
3072 /* Branch probability/prediction notes are defined only for
3073 condjumps. We've possibly turned condjump into simplejump. */
3074 if (simplejump_p (insn))
3076 note = find_reg_note (insn, REG_BR_PROB, NULL);
3077 if (note)
3078 remove_note (insn, note);
3079 while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
3080 remove_note (insn, note);
3083 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
3085 /* Avoid abnormal flags to leak from computed jumps turned
3086 into simplejumps. */
3088 e->flags &= ~EDGE_ABNORMAL;
3090 /* See if this edge is one we should keep. */
3091 if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
3092 /* A conditional jump can fall through into the next
3093 block, so we should keep the edge. */
3095 ei_next (&ei);
3096 continue;
3098 else if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
3099 && BB_HEAD (e->dest) == JUMP_LABEL (insn))
3100 /* If the destination block is the target of the jump,
3101 keep the edge. */
3103 ei_next (&ei);
3104 continue;
3106 else if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
3107 && returnjump_p (insn))
3108 /* If the destination block is the exit block, and this
3109 instruction is a return, then keep the edge. */
3111 ei_next (&ei);
3112 continue;
3114 else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
3115 /* Keep the edges that correspond to exceptions thrown by
3116 this instruction and rematerialize the EDGE_ABNORMAL
3117 flag we just cleared above. */
3119 e->flags |= EDGE_ABNORMAL;
3120 ei_next (&ei);
3121 continue;
3124 /* We do not need this edge. */
3125 df_set_bb_dirty (bb);
3126 purged = true;
3127 remove_edge (e);
3130 if (EDGE_COUNT (bb->succs) == 0 || !purged)
3131 return purged;
3133 if (dump_file)
3134 fprintf (dump_file, "Purged edges from bb %i\n", bb->index);
3136 if (!optimize)
3137 return purged;
3139 /* Redistribute probabilities. */
3140 if (single_succ_p (bb))
3142 single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
3143 single_succ_edge (bb)->count = bb->count;
3145 else
3147 note = find_reg_note (insn, REG_BR_PROB, NULL);
3148 if (!note)
3149 return purged;
3151 b = BRANCH_EDGE (bb);
3152 f = FALLTHRU_EDGE (bb);
3153 b->probability = XINT (note, 0);
3154 f->probability = REG_BR_PROB_BASE - b->probability;
3155 /* Update these to use GCOV_COMPUTE_SCALE. */
3156 b->count = bb->count * b->probability / REG_BR_PROB_BASE;
3157 f->count = bb->count * f->probability / REG_BR_PROB_BASE;
3160 return purged;
3162 else if (CALL_P (insn) && SIBLING_CALL_P (insn))
3164 /* First, there should not be any EH or ABCALL edges resulting
3165 from non-local gotos and the like. If there were, we shouldn't
3166 have created the sibcall in the first place. Second, there
3167 should of course never have been a fallthru edge. */
3168 gcc_assert (single_succ_p (bb));
3169 gcc_assert (single_succ_edge (bb)->flags
3170 == (EDGE_SIBCALL | EDGE_ABNORMAL));
3172 return 0;
3175 /* If we don't see a jump insn, we don't know exactly why the block would
3176 have been broken at this point. Look for a simple, non-fallthru edge,
3177 as these are only created by conditional branches. If we find such an
3178 edge we know that there used to be a jump here and can then safely
3179 remove all non-fallthru edges. */
3180 found = false;
3181 FOR_EACH_EDGE (e, ei, bb->succs)
3182 if (! (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU)))
3184 found = true;
3185 break;
3188 if (!found)
3189 return purged;
3191 /* Remove all but the fake and fallthru edges. The fake edge may be
3192 the only successor for this block in the case of noreturn
3193 calls. */
3194 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
3196 if (!(e->flags & (EDGE_FALLTHRU | EDGE_FAKE)))
3198 df_set_bb_dirty (bb);
3199 remove_edge (e);
3200 purged = true;
3202 else
3203 ei_next (&ei);
3206 gcc_assert (single_succ_p (bb));
3208 single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
3209 single_succ_edge (bb)->count = bb->count;
3211 if (dump_file)
3212 fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
3213 bb->index);
3214 return purged;
3217 /* Search all basic blocks for potentially dead edges and purge them. Return
3218 true if some edge has been eliminated. */
3220 bool
3221 purge_all_dead_edges (void)
3223 int purged = false;
3224 basic_block bb;
3226 FOR_EACH_BB_FN (bb, cfun)
3228 bool purged_here = purge_dead_edges (bb);
3230 purged |= purged_here;
3233 return purged;
3236 /* This is used by a few passes that emit some instructions after abnormal
3237 calls, moving the basic block's end, while they in fact do want to emit
3238 them on the fallthru edge. Look for abnormal call edges, find backward
3239 the call in the block and insert the instructions on the edge instead.
3241 Similarly, handle instructions throwing exceptions internally.
3243 Return true when instructions have been found and inserted on edges. */
3245 bool
3246 fixup_abnormal_edges (void)
3248 bool inserted = false;
3249 basic_block bb;
3251 FOR_EACH_BB_FN (bb, cfun)
3253 edge e;
3254 edge_iterator ei;
3256 /* Look for cases we are interested in - calls or instructions causing
3257 exceptions. */
3258 FOR_EACH_EDGE (e, ei, bb->succs)
3259 if ((e->flags & EDGE_ABNORMAL_CALL)
3260 || ((e->flags & (EDGE_ABNORMAL | EDGE_EH))
3261 == (EDGE_ABNORMAL | EDGE_EH)))
3262 break;
3264 if (e && !CALL_P (BB_END (bb)) && !can_throw_internal (BB_END (bb)))
3266 rtx_insn *insn;
3268 /* Get past the new insns generated. Allow notes, as the insns
3269 may be already deleted. */
3270 insn = BB_END (bb);
3271 while ((NONJUMP_INSN_P (insn) || NOTE_P (insn))
3272 && !can_throw_internal (insn)
3273 && insn != BB_HEAD (bb))
3274 insn = PREV_INSN (insn);
3276 if (CALL_P (insn) || can_throw_internal (insn))
3278 rtx_insn *stop, *next;
3280 e = find_fallthru_edge (bb->succs);
3282 stop = NEXT_INSN (BB_END (bb));
3283 BB_END (bb) = insn;
3285 for (insn = NEXT_INSN (insn); insn != stop; insn = next)
3287 next = NEXT_INSN (insn);
3288 if (INSN_P (insn))
3290 delete_insn (insn);
3292 /* Sometimes there's still the return value USE.
3293 If it's placed after a trapping call (i.e. that
3294 call is the last insn anyway), we have no fallthru
3295 edge. Simply delete this use and don't try to insert
3296 on the non-existent edge. */
3297 if (GET_CODE (PATTERN (insn)) != USE)
3299 /* We're not deleting it, we're moving it. */
3300 insn->set_undeleted ();
3301 SET_PREV_INSN (insn) = NULL_RTX;
3302 SET_NEXT_INSN (insn) = NULL_RTX;
3304 insert_insn_on_edge (insn, e);
3305 inserted = true;
3308 else if (!BARRIER_P (insn))
3309 set_block_for_insn (insn, NULL);
3313 /* It may be that we don't find any trapping insn. In this
3314 case we discovered quite late that the insn that had been
3315 marked as can_throw_internal in fact couldn't trap at all.
3316 So we should in fact delete the EH edges out of the block. */
3317 else
3318 purge_dead_edges (bb);
3322 return inserted;
3325 /* Cut the insns from FIRST to LAST out of the insns stream. */
3327 rtx_insn *
3328 unlink_insn_chain (rtx_insn *first, rtx_insn *last)
3330 rtx_insn *prevfirst = PREV_INSN (first);
3331 rtx_insn *nextlast = NEXT_INSN (last);
3333 SET_PREV_INSN (first) = NULL;
3334 SET_NEXT_INSN (last) = NULL;
3335 if (prevfirst)
3336 SET_NEXT_INSN (prevfirst) = nextlast;
3337 if (nextlast)
3338 SET_PREV_INSN (nextlast) = prevfirst;
3339 else
3340 set_last_insn (prevfirst);
3341 if (!prevfirst)
3342 set_first_insn (nextlast);
3343 return first;
3346 /* Skip over inter-block insns occurring after BB which are typically
3347 associated with BB (e.g., barriers). If there are any such insns,
3348 we return the last one. Otherwise, we return the end of BB. */
3350 static rtx_insn *
3351 skip_insns_after_block (basic_block bb)
3353 rtx_insn *insn, *last_insn, *next_head, *prev;
3355 next_head = NULL;
3356 if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
3357 next_head = BB_HEAD (bb->next_bb);
3359 for (last_insn = insn = BB_END (bb); (insn = NEXT_INSN (insn)) != 0; )
3361 if (insn == next_head)
3362 break;
3364 switch (GET_CODE (insn))
3366 case BARRIER:
3367 last_insn = insn;
3368 continue;
3370 case NOTE:
3371 switch (NOTE_KIND (insn))
3373 case NOTE_INSN_BLOCK_END:
3374 gcc_unreachable ();
3375 continue;
3376 default:
3377 continue;
3378 break;
3380 break;
3382 case CODE_LABEL:
3383 if (NEXT_INSN (insn)
3384 && JUMP_TABLE_DATA_P (NEXT_INSN (insn)))
3386 insn = NEXT_INSN (insn);
3387 last_insn = insn;
3388 continue;
3390 break;
3392 default:
3393 break;
3396 break;
3399 /* It is possible to hit contradictory sequence. For instance:
3401 jump_insn
3402 NOTE_INSN_BLOCK_BEG
3403 barrier
3405 Where barrier belongs to jump_insn, but the note does not. This can be
3406 created by removing the basic block originally following
3407 NOTE_INSN_BLOCK_BEG. In such case reorder the notes. */
3409 for (insn = last_insn; insn != BB_END (bb); insn = prev)
3411 prev = PREV_INSN (insn);
3412 if (NOTE_P (insn))
3413 switch (NOTE_KIND (insn))
3415 case NOTE_INSN_BLOCK_END:
3416 gcc_unreachable ();
3417 break;
3418 case NOTE_INSN_DELETED:
3419 case NOTE_INSN_DELETED_LABEL:
3420 case NOTE_INSN_DELETED_DEBUG_LABEL:
3421 continue;
3422 default:
3423 reorder_insns (insn, insn, last_insn);
3427 return last_insn;
3430 /* Locate or create a label for a given basic block. */
3432 static rtx_insn *
3433 label_for_bb (basic_block bb)
3435 rtx_insn *label = BB_HEAD (bb);
3437 if (!LABEL_P (label))
3439 if (dump_file)
3440 fprintf (dump_file, "Emitting label for block %d\n", bb->index);
3442 label = block_label (bb);
3445 return label;
3448 /* Locate the effective beginning and end of the insn chain for each
3449 block, as defined by skip_insns_after_block above. */
3451 static void
3452 record_effective_endpoints (void)
3454 rtx_insn *next_insn;
3455 basic_block bb;
3456 rtx_insn *insn;
3458 for (insn = get_insns ();
3459 insn
3460 && NOTE_P (insn)
3461 && NOTE_KIND (insn) != NOTE_INSN_BASIC_BLOCK;
3462 insn = NEXT_INSN (insn))
3463 continue;
3464 /* No basic blocks at all? */
3465 gcc_assert (insn);
3467 if (PREV_INSN (insn))
3468 cfg_layout_function_header =
3469 unlink_insn_chain (get_insns (), PREV_INSN (insn));
3470 else
3471 cfg_layout_function_header = NULL;
3473 next_insn = get_insns ();
3474 FOR_EACH_BB_FN (bb, cfun)
3476 rtx_insn *end;
3478 if (PREV_INSN (BB_HEAD (bb)) && next_insn != BB_HEAD (bb))
3479 BB_HEADER (bb) = unlink_insn_chain (next_insn,
3480 PREV_INSN (BB_HEAD (bb)));
3481 end = skip_insns_after_block (bb);
3482 if (NEXT_INSN (BB_END (bb)) && BB_END (bb) != end)
3483 BB_FOOTER (bb) = unlink_insn_chain (NEXT_INSN (BB_END (bb)), end);
3484 next_insn = NEXT_INSN (BB_END (bb));
3487 cfg_layout_function_footer = next_insn;
3488 if (cfg_layout_function_footer)
3489 cfg_layout_function_footer = unlink_insn_chain (cfg_layout_function_footer, get_last_insn ());
3492 namespace {
3494 const pass_data pass_data_into_cfg_layout_mode =
3496 RTL_PASS, /* type */
3497 "into_cfglayout", /* name */
3498 OPTGROUP_NONE, /* optinfo_flags */
3499 TV_CFG, /* tv_id */
3500 0, /* properties_required */
3501 PROP_cfglayout, /* properties_provided */
3502 0, /* properties_destroyed */
3503 0, /* todo_flags_start */
3504 0, /* todo_flags_finish */
3507 class pass_into_cfg_layout_mode : public rtl_opt_pass
3509 public:
3510 pass_into_cfg_layout_mode (gcc::context *ctxt)
3511 : rtl_opt_pass (pass_data_into_cfg_layout_mode, ctxt)
3514 /* opt_pass methods: */
3515 virtual unsigned int execute (function *)
3517 cfg_layout_initialize (0);
3518 return 0;
3521 }; // class pass_into_cfg_layout_mode
3523 } // anon namespace
3525 rtl_opt_pass *
3526 make_pass_into_cfg_layout_mode (gcc::context *ctxt)
3528 return new pass_into_cfg_layout_mode (ctxt);
3531 namespace {
3533 const pass_data pass_data_outof_cfg_layout_mode =
3535 RTL_PASS, /* type */
3536 "outof_cfglayout", /* name */
3537 OPTGROUP_NONE, /* optinfo_flags */
3538 TV_CFG, /* tv_id */
3539 0, /* properties_required */
3540 0, /* properties_provided */
3541 PROP_cfglayout, /* properties_destroyed */
3542 0, /* todo_flags_start */
3543 0, /* todo_flags_finish */
3546 class pass_outof_cfg_layout_mode : public rtl_opt_pass
3548 public:
3549 pass_outof_cfg_layout_mode (gcc::context *ctxt)
3550 : rtl_opt_pass (pass_data_outof_cfg_layout_mode, ctxt)
3553 /* opt_pass methods: */
3554 virtual unsigned int execute (function *);
3556 }; // class pass_outof_cfg_layout_mode
3558 unsigned int
3559 pass_outof_cfg_layout_mode::execute (function *fun)
3561 basic_block bb;
3563 FOR_EACH_BB_FN (bb, fun)
3564 if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (fun))
3565 bb->aux = bb->next_bb;
3567 cfg_layout_finalize ();
3569 return 0;
3572 } // anon namespace
3574 rtl_opt_pass *
3575 make_pass_outof_cfg_layout_mode (gcc::context *ctxt)
3577 return new pass_outof_cfg_layout_mode (ctxt);
3581 /* Link the basic blocks in the correct order, compacting the basic
3582 block queue while at it. If STAY_IN_CFGLAYOUT_MODE is false, this
3583 function also clears the basic block header and footer fields.
3585 This function is usually called after a pass (e.g. tracer) finishes
3586 some transformations while in cfglayout mode. The required sequence
3587 of the basic blocks is in a linked list along the bb->aux field.
3588 This functions re-links the basic block prev_bb and next_bb pointers
3589 accordingly, and it compacts and renumbers the blocks.
3591 FIXME: This currently works only for RTL, but the only RTL-specific
3592 bits are the STAY_IN_CFGLAYOUT_MODE bits. The tracer pass was moved
3593 to GIMPLE a long time ago, but it doesn't relink the basic block
3594 chain. It could do that (to give better initial RTL) if this function
3595 is made IR-agnostic (and moved to cfganal.c or cfg.c while at it). */
3597 void
3598 relink_block_chain (bool stay_in_cfglayout_mode)
3600 basic_block bb, prev_bb;
3601 int index;
3603 /* Maybe dump the re-ordered sequence. */
3604 if (dump_file)
3606 fprintf (dump_file, "Reordered sequence:\n");
3607 for (bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, index =
3608 NUM_FIXED_BLOCKS;
3610 bb = (basic_block) bb->aux, index++)
3612 fprintf (dump_file, " %i ", index);
3613 if (get_bb_original (bb))
3614 fprintf (dump_file, "duplicate of %i ",
3615 get_bb_original (bb)->index);
3616 else if (forwarder_block_p (bb)
3617 && !LABEL_P (BB_HEAD (bb)))
3618 fprintf (dump_file, "compensation ");
3619 else
3620 fprintf (dump_file, "bb %i ", bb->index);
3621 fprintf (dump_file, " [%i]\n", bb->frequency);
3625 /* Now reorder the blocks. */
3626 prev_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
3627 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
3628 for (; bb; prev_bb = bb, bb = (basic_block) bb->aux)
3630 bb->prev_bb = prev_bb;
3631 prev_bb->next_bb = bb;
3633 prev_bb->next_bb = EXIT_BLOCK_PTR_FOR_FN (cfun);
3634 EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb = prev_bb;
3636 /* Then, clean up the aux fields. */
3637 FOR_ALL_BB_FN (bb, cfun)
3639 bb->aux = NULL;
3640 if (!stay_in_cfglayout_mode)
3641 BB_HEADER (bb) = BB_FOOTER (bb) = NULL;
3644 /* Maybe reset the original copy tables, they are not valid anymore
3645 when we renumber the basic blocks in compact_blocks. If we are
3646 are going out of cfglayout mode, don't re-allocate the tables. */
3647 free_original_copy_tables ();
3648 if (stay_in_cfglayout_mode)
3649 initialize_original_copy_tables ();
3651 /* Finally, put basic_block_info in the new order. */
3652 compact_blocks ();
3656 /* Given a reorder chain, rearrange the code to match. */
3658 static void
3659 fixup_reorder_chain (void)
3661 basic_block bb;
3662 rtx_insn *insn = NULL;
3664 if (cfg_layout_function_header)
3666 set_first_insn (cfg_layout_function_header);
3667 insn = cfg_layout_function_header;
3668 while (NEXT_INSN (insn))
3669 insn = NEXT_INSN (insn);
3672 /* First do the bulk reordering -- rechain the blocks without regard to
3673 the needed changes to jumps and labels. */
3675 for (bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; bb; bb = (basic_block)
3676 bb->aux)
3678 if (BB_HEADER (bb))
3680 if (insn)
3681 SET_NEXT_INSN (insn) = BB_HEADER (bb);
3682 else
3683 set_first_insn (BB_HEADER (bb));
3684 SET_PREV_INSN (BB_HEADER (bb)) = insn;
3685 insn = BB_HEADER (bb);
3686 while (NEXT_INSN (insn))
3687 insn = NEXT_INSN (insn);
3689 if (insn)
3690 SET_NEXT_INSN (insn) = BB_HEAD (bb);
3691 else
3692 set_first_insn (BB_HEAD (bb));
3693 SET_PREV_INSN (BB_HEAD (bb)) = insn;
3694 insn = BB_END (bb);
3695 if (BB_FOOTER (bb))
3697 SET_NEXT_INSN (insn) = BB_FOOTER (bb);
3698 SET_PREV_INSN (BB_FOOTER (bb)) = insn;
3699 while (NEXT_INSN (insn))
3700 insn = NEXT_INSN (insn);
3704 SET_NEXT_INSN (insn) = cfg_layout_function_footer;
3705 if (cfg_layout_function_footer)
3706 SET_PREV_INSN (cfg_layout_function_footer) = insn;
3708 while (NEXT_INSN (insn))
3709 insn = NEXT_INSN (insn);
3711 set_last_insn (insn);
3712 if (flag_checking)
3713 verify_insn_chain ();
3715 /* Now add jumps and labels as needed to match the blocks new
3716 outgoing edges. */
3718 for (bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; bb ; bb = (basic_block)
3719 bb->aux)
3721 edge e_fall, e_taken, e;
3722 rtx_insn *bb_end_insn;
3723 rtx ret_label = NULL_RTX;
3724 basic_block nb;
3725 edge_iterator ei;
3727 if (EDGE_COUNT (bb->succs) == 0)
3728 continue;
3730 /* Find the old fallthru edge, and another non-EH edge for
3731 a taken jump. */
3732 e_taken = e_fall = NULL;
3734 FOR_EACH_EDGE (e, ei, bb->succs)
3735 if (e->flags & EDGE_FALLTHRU)
3736 e_fall = e;
3737 else if (! (e->flags & EDGE_EH))
3738 e_taken = e;
3740 bb_end_insn = BB_END (bb);
3741 if (rtx_jump_insn *bb_end_jump = dyn_cast <rtx_jump_insn *> (bb_end_insn))
3743 ret_label = JUMP_LABEL (bb_end_jump);
3744 if (any_condjump_p (bb_end_jump))
3746 /* This might happen if the conditional jump has side
3747 effects and could therefore not be optimized away.
3748 Make the basic block to end with a barrier in order
3749 to prevent rtl_verify_flow_info from complaining. */
3750 if (!e_fall)
3752 gcc_assert (!onlyjump_p (bb_end_jump)
3753 || returnjump_p (bb_end_jump)
3754 || (e_taken->flags & EDGE_CROSSING));
3755 emit_barrier_after (bb_end_jump);
3756 continue;
3759 /* If the old fallthru is still next, nothing to do. */
3760 if (bb->aux == e_fall->dest
3761 || e_fall->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
3762 continue;
3764 /* The degenerated case of conditional jump jumping to the next
3765 instruction can happen for jumps with side effects. We need
3766 to construct a forwarder block and this will be done just
3767 fine by force_nonfallthru below. */
3768 if (!e_taken)
3771 /* There is another special case: if *neither* block is next,
3772 such as happens at the very end of a function, then we'll
3773 need to add a new unconditional jump. Choose the taken
3774 edge based on known or assumed probability. */
3775 else if (bb->aux != e_taken->dest)
3777 rtx note = find_reg_note (bb_end_jump, REG_BR_PROB, 0);
3779 if (note
3780 && XINT (note, 0) < REG_BR_PROB_BASE / 2
3781 && invert_jump (bb_end_jump,
3782 (e_fall->dest
3783 == EXIT_BLOCK_PTR_FOR_FN (cfun)
3784 ? NULL_RTX
3785 : label_for_bb (e_fall->dest)), 0))
3787 e_fall->flags &= ~EDGE_FALLTHRU;
3788 gcc_checking_assert (could_fall_through
3789 (e_taken->src, e_taken->dest));
3790 e_taken->flags |= EDGE_FALLTHRU;
3791 update_br_prob_note (bb);
3792 e = e_fall, e_fall = e_taken, e_taken = e;
3796 /* If the "jumping" edge is a crossing edge, and the fall
3797 through edge is non-crossing, leave things as they are. */
3798 else if ((e_taken->flags & EDGE_CROSSING)
3799 && !(e_fall->flags & EDGE_CROSSING))
3800 continue;
3802 /* Otherwise we can try to invert the jump. This will
3803 basically never fail, however, keep up the pretense. */
3804 else if (invert_jump (bb_end_jump,
3805 (e_fall->dest
3806 == EXIT_BLOCK_PTR_FOR_FN (cfun)
3807 ? NULL_RTX
3808 : label_for_bb (e_fall->dest)), 0))
3810 e_fall->flags &= ~EDGE_FALLTHRU;
3811 gcc_checking_assert (could_fall_through
3812 (e_taken->src, e_taken->dest));
3813 e_taken->flags |= EDGE_FALLTHRU;
3814 update_br_prob_note (bb);
3815 if (LABEL_NUSES (ret_label) == 0
3816 && single_pred_p (e_taken->dest))
3817 delete_insn (ret_label);
3818 continue;
3821 else if (extract_asm_operands (PATTERN (bb_end_insn)) != NULL)
3823 /* If the old fallthru is still next or if
3824 asm goto doesn't have a fallthru (e.g. when followed by
3825 __builtin_unreachable ()), nothing to do. */
3826 if (! e_fall
3827 || bb->aux == e_fall->dest
3828 || e_fall->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
3829 continue;
3831 /* Otherwise we'll have to use the fallthru fixup below. */
3833 else
3835 /* Otherwise we have some return, switch or computed
3836 jump. In the 99% case, there should not have been a
3837 fallthru edge. */
3838 gcc_assert (returnjump_p (bb_end_insn) || !e_fall);
3839 continue;
3842 else
3844 /* No fallthru implies a noreturn function with EH edges, or
3845 something similarly bizarre. In any case, we don't need to
3846 do anything. */
3847 if (! e_fall)
3848 continue;
3850 /* If the fallthru block is still next, nothing to do. */
3851 if (bb->aux == e_fall->dest)
3852 continue;
3854 /* A fallthru to exit block. */
3855 if (e_fall->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
3856 continue;
3859 /* We got here if we need to add a new jump insn.
3860 Note force_nonfallthru can delete E_FALL and thus we have to
3861 save E_FALL->src prior to the call to force_nonfallthru. */
3862 nb = force_nonfallthru_and_redirect (e_fall, e_fall->dest, ret_label);
3863 if (nb)
3865 nb->aux = bb->aux;
3866 bb->aux = nb;
3867 /* Don't process this new block. */
3868 bb = nb;
3872 relink_block_chain (/*stay_in_cfglayout_mode=*/false);
3874 /* Annoying special case - jump around dead jumptables left in the code. */
3875 FOR_EACH_BB_FN (bb, cfun)
3877 edge e = find_fallthru_edge (bb->succs);
3879 if (e && !can_fallthru (e->src, e->dest))
3880 force_nonfallthru (e);
3883 /* Ensure goto_locus from edges has some instructions with that locus
3884 in RTL. */
3885 if (!optimize)
3886 FOR_EACH_BB_FN (bb, cfun)
3888 edge e;
3889 edge_iterator ei;
3891 FOR_EACH_EDGE (e, ei, bb->succs)
3892 if (LOCATION_LOCUS (e->goto_locus) != UNKNOWN_LOCATION
3893 && !(e->flags & EDGE_ABNORMAL))
3895 edge e2;
3896 edge_iterator ei2;
3897 basic_block dest, nb;
3898 rtx_insn *end;
3900 insn = BB_END (e->src);
3901 end = PREV_INSN (BB_HEAD (e->src));
3902 while (insn != end
3903 && (!NONDEBUG_INSN_P (insn) || !INSN_HAS_LOCATION (insn)))
3904 insn = PREV_INSN (insn);
3905 if (insn != end
3906 && INSN_LOCATION (insn) == e->goto_locus)
3907 continue;
3908 if (simplejump_p (BB_END (e->src))
3909 && !INSN_HAS_LOCATION (BB_END (e->src)))
3911 INSN_LOCATION (BB_END (e->src)) = e->goto_locus;
3912 continue;
3914 dest = e->dest;
3915 if (dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
3917 /* Non-fallthru edges to the exit block cannot be split. */
3918 if (!(e->flags & EDGE_FALLTHRU))
3919 continue;
3921 else
3923 insn = BB_HEAD (dest);
3924 end = NEXT_INSN (BB_END (dest));
3925 while (insn != end && !NONDEBUG_INSN_P (insn))
3926 insn = NEXT_INSN (insn);
3927 if (insn != end && INSN_HAS_LOCATION (insn)
3928 && INSN_LOCATION (insn) == e->goto_locus)
3929 continue;
3931 nb = split_edge (e);
3932 if (!INSN_P (BB_END (nb)))
3933 BB_END (nb) = emit_insn_after_noloc (gen_nop (), BB_END (nb),
3934 nb);
3935 INSN_LOCATION (BB_END (nb)) = e->goto_locus;
3937 /* If there are other incoming edges to the destination block
3938 with the same goto locus, redirect them to the new block as
3939 well, this can prevent other such blocks from being created
3940 in subsequent iterations of the loop. */
3941 for (ei2 = ei_start (dest->preds); (e2 = ei_safe_edge (ei2)); )
3942 if (LOCATION_LOCUS (e2->goto_locus) != UNKNOWN_LOCATION
3943 && !(e2->flags & (EDGE_ABNORMAL | EDGE_FALLTHRU))
3944 && e->goto_locus == e2->goto_locus)
3945 redirect_edge_and_branch (e2, nb);
3946 else
3947 ei_next (&ei2);
3952 /* Perform sanity checks on the insn chain.
3953 1. Check that next/prev pointers are consistent in both the forward and
3954 reverse direction.
3955 2. Count insns in chain, going both directions, and check if equal.
3956 3. Check that get_last_insn () returns the actual end of chain. */
3958 DEBUG_FUNCTION void
3959 verify_insn_chain (void)
3961 rtx_insn *x, *prevx, *nextx;
3962 int insn_cnt1, insn_cnt2;
3964 for (prevx = NULL, insn_cnt1 = 1, x = get_insns ();
3965 x != 0;
3966 prevx = x, insn_cnt1++, x = NEXT_INSN (x))
3967 gcc_assert (PREV_INSN (x) == prevx);
3969 gcc_assert (prevx == get_last_insn ());
3971 for (nextx = NULL, insn_cnt2 = 1, x = get_last_insn ();
3972 x != 0;
3973 nextx = x, insn_cnt2++, x = PREV_INSN (x))
3974 gcc_assert (NEXT_INSN (x) == nextx);
3976 gcc_assert (insn_cnt1 == insn_cnt2);
3979 /* If we have assembler epilogues, the block falling through to exit must
3980 be the last one in the reordered chain when we reach final. Ensure
3981 that this condition is met. */
3982 static void
3983 fixup_fallthru_exit_predecessor (void)
3985 edge e;
3986 basic_block bb = NULL;
3988 /* This transformation is not valid before reload, because we might
3989 separate a call from the instruction that copies the return
3990 value. */
3991 gcc_assert (reload_completed);
3993 e = find_fallthru_edge (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds);
3994 if (e)
3995 bb = e->src;
3997 if (bb && bb->aux)
3999 basic_block c = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
4001 /* If the very first block is the one with the fall-through exit
4002 edge, we have to split that block. */
4003 if (c == bb)
4005 bb = split_block_after_labels (bb)->dest;
4006 bb->aux = c->aux;
4007 c->aux = bb;
4008 BB_FOOTER (bb) = BB_FOOTER (c);
4009 BB_FOOTER (c) = NULL;
4012 while (c->aux != bb)
4013 c = (basic_block) c->aux;
4015 c->aux = bb->aux;
4016 while (c->aux)
4017 c = (basic_block) c->aux;
4019 c->aux = bb;
4020 bb->aux = NULL;
4024 /* In case there are more than one fallthru predecessors of exit, force that
4025 there is only one. */
4027 static void
4028 force_one_exit_fallthru (void)
4030 edge e, predecessor = NULL;
4031 bool more = false;
4032 edge_iterator ei;
4033 basic_block forwarder, bb;
4035 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
4036 if (e->flags & EDGE_FALLTHRU)
4038 if (predecessor == NULL)
4039 predecessor = e;
4040 else
4042 more = true;
4043 break;
4047 if (!more)
4048 return;
4050 /* Exit has several fallthru predecessors. Create a forwarder block for
4051 them. */
4052 forwarder = split_edge (predecessor);
4053 for (ei = ei_start (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds);
4054 (e = ei_safe_edge (ei)); )
4056 if (e->src == forwarder
4057 || !(e->flags & EDGE_FALLTHRU))
4058 ei_next (&ei);
4059 else
4060 redirect_edge_and_branch_force (e, forwarder);
4063 /* Fix up the chain of blocks -- make FORWARDER immediately precede the
4064 exit block. */
4065 FOR_EACH_BB_FN (bb, cfun)
4067 if (bb->aux == NULL && bb != forwarder)
4069 bb->aux = forwarder;
4070 break;
4075 /* Return true in case it is possible to duplicate the basic block BB. */
4077 static bool
4078 cfg_layout_can_duplicate_bb_p (const_basic_block bb)
4080 /* Do not attempt to duplicate tablejumps, as we need to unshare
4081 the dispatch table. This is difficult to do, as the instructions
4082 computing jump destination may be hoisted outside the basic block. */
4083 if (tablejump_p (BB_END (bb), NULL, NULL))
4084 return false;
4086 /* Do not duplicate blocks containing insns that can't be copied. */
4087 if (targetm.cannot_copy_insn_p)
4089 rtx_insn *insn = BB_HEAD (bb);
4090 while (1)
4092 if (INSN_P (insn) && targetm.cannot_copy_insn_p (insn))
4093 return false;
4094 if (insn == BB_END (bb))
4095 break;
4096 insn = NEXT_INSN (insn);
4100 return true;
4103 rtx_insn *
4104 duplicate_insn_chain (rtx_insn *from, rtx_insn *to)
4106 rtx_insn *insn, *next, *copy;
4107 rtx_note *last;
4109 /* Avoid updating of boundaries of previous basic block. The
4110 note will get removed from insn stream in fixup. */
4111 last = emit_note (NOTE_INSN_DELETED);
4113 /* Create copy at the end of INSN chain. The chain will
4114 be reordered later. */
4115 for (insn = from; insn != NEXT_INSN (to); insn = NEXT_INSN (insn))
4117 switch (GET_CODE (insn))
4119 case DEBUG_INSN:
4120 /* Don't duplicate label debug insns. */
4121 if (TREE_CODE (INSN_VAR_LOCATION_DECL (insn)) == LABEL_DECL)
4122 break;
4123 /* FALLTHRU */
4124 case INSN:
4125 case CALL_INSN:
4126 case JUMP_INSN:
4127 copy = emit_copy_of_insn_after (insn, get_last_insn ());
4128 if (JUMP_P (insn) && JUMP_LABEL (insn) != NULL_RTX
4129 && ANY_RETURN_P (JUMP_LABEL (insn)))
4130 JUMP_LABEL (copy) = JUMP_LABEL (insn);
4131 maybe_copy_prologue_epilogue_insn (insn, copy);
4132 break;
4134 case JUMP_TABLE_DATA:
4135 /* Avoid copying of dispatch tables. We never duplicate
4136 tablejumps, so this can hit only in case the table got
4137 moved far from original jump.
4138 Avoid copying following barrier as well if any
4139 (and debug insns in between). */
4140 for (next = NEXT_INSN (insn);
4141 next != NEXT_INSN (to);
4142 next = NEXT_INSN (next))
4143 if (!DEBUG_INSN_P (next))
4144 break;
4145 if (next != NEXT_INSN (to) && BARRIER_P (next))
4146 insn = next;
4147 break;
4149 case CODE_LABEL:
4150 break;
4152 case BARRIER:
4153 emit_barrier ();
4154 break;
4156 case NOTE:
4157 switch (NOTE_KIND (insn))
4159 /* In case prologue is empty and function contain label
4160 in first BB, we may want to copy the block. */
4161 case NOTE_INSN_PROLOGUE_END:
4163 case NOTE_INSN_DELETED:
4164 case NOTE_INSN_DELETED_LABEL:
4165 case NOTE_INSN_DELETED_DEBUG_LABEL:
4166 /* No problem to strip these. */
4167 case NOTE_INSN_FUNCTION_BEG:
4168 /* There is always just single entry to function. */
4169 case NOTE_INSN_BASIC_BLOCK:
4170 /* We should only switch text sections once. */
4171 case NOTE_INSN_SWITCH_TEXT_SECTIONS:
4172 break;
4174 case NOTE_INSN_EPILOGUE_BEG:
4175 case NOTE_INSN_UPDATE_SJLJ_CONTEXT:
4176 emit_note_copy (as_a <rtx_note *> (insn));
4177 break;
4179 default:
4180 /* All other notes should have already been eliminated. */
4181 gcc_unreachable ();
4183 break;
4184 default:
4185 gcc_unreachable ();
4188 insn = NEXT_INSN (last);
4189 delete_insn (last);
4190 return insn;
4193 /* Create a duplicate of the basic block BB. */
4195 static basic_block
4196 cfg_layout_duplicate_bb (basic_block bb)
4198 rtx_insn *insn;
4199 basic_block new_bb;
4201 insn = duplicate_insn_chain (BB_HEAD (bb), BB_END (bb));
4202 new_bb = create_basic_block (insn,
4203 insn ? get_last_insn () : NULL,
4204 EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb);
4206 BB_COPY_PARTITION (new_bb, bb);
4207 if (BB_HEADER (bb))
4209 insn = BB_HEADER (bb);
4210 while (NEXT_INSN (insn))
4211 insn = NEXT_INSN (insn);
4212 insn = duplicate_insn_chain (BB_HEADER (bb), insn);
4213 if (insn)
4214 BB_HEADER (new_bb) = unlink_insn_chain (insn, get_last_insn ());
4217 if (BB_FOOTER (bb))
4219 insn = BB_FOOTER (bb);
4220 while (NEXT_INSN (insn))
4221 insn = NEXT_INSN (insn);
4222 insn = duplicate_insn_chain (BB_FOOTER (bb), insn);
4223 if (insn)
4224 BB_FOOTER (new_bb) = unlink_insn_chain (insn, get_last_insn ());
4227 return new_bb;
4231 /* Main entry point to this module - initialize the datastructures for
4232 CFG layout changes. It keeps LOOPS up-to-date if not null.
4234 FLAGS is a set of additional flags to pass to cleanup_cfg(). */
4236 void
4237 cfg_layout_initialize (unsigned int flags)
4239 rtx_insn_list *x;
4240 basic_block bb;
4242 /* Once bb partitioning is complete, cfg layout mode should not be
4243 re-entered. Entering cfg layout mode may require fixups. As an
4244 example, if edge forwarding performed when optimizing the cfg
4245 layout required moving a block from the hot to the cold
4246 section. This would create an illegal partitioning unless some
4247 manual fixup was performed. */
4248 gcc_assert (!(crtl->bb_reorder_complete
4249 && flag_reorder_blocks_and_partition));
4251 initialize_original_copy_tables ();
4253 cfg_layout_rtl_register_cfg_hooks ();
4255 record_effective_endpoints ();
4257 /* Make sure that the targets of non local gotos are marked. */
4258 for (x = nonlocal_goto_handler_labels; x; x = x->next ())
4260 bb = BLOCK_FOR_INSN (x->insn ());
4261 bb->flags |= BB_NON_LOCAL_GOTO_TARGET;
4264 cleanup_cfg (CLEANUP_CFGLAYOUT | flags);
4267 /* Splits superblocks. */
4268 void
4269 break_superblocks (void)
4271 sbitmap superblocks;
4272 bool need = false;
4273 basic_block bb;
4275 superblocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
4276 bitmap_clear (superblocks);
4278 FOR_EACH_BB_FN (bb, cfun)
4279 if (bb->flags & BB_SUPERBLOCK)
4281 bb->flags &= ~BB_SUPERBLOCK;
4282 bitmap_set_bit (superblocks, bb->index);
4283 need = true;
4286 if (need)
4288 rebuild_jump_labels (get_insns ());
4289 find_many_sub_basic_blocks (superblocks);
4292 free (superblocks);
4295 /* Finalize the changes: reorder insn list according to the sequence specified
4296 by aux pointers, enter compensation code, rebuild scope forest. */
4298 void
4299 cfg_layout_finalize (void)
4301 checking_verify_flow_info ();
4302 force_one_exit_fallthru ();
4303 rtl_register_cfg_hooks ();
4304 if (reload_completed && !targetm.have_epilogue ())
4305 fixup_fallthru_exit_predecessor ();
4306 fixup_reorder_chain ();
4308 rebuild_jump_labels (get_insns ());
4309 delete_dead_jumptables ();
4311 if (flag_checking)
4312 verify_insn_chain ();
4313 checking_verify_flow_info ();
4317 /* Same as split_block but update cfg_layout structures. */
4319 static basic_block
4320 cfg_layout_split_block (basic_block bb, void *insnp)
4322 rtx insn = (rtx) insnp;
4323 basic_block new_bb = rtl_split_block (bb, insn);
4325 BB_FOOTER (new_bb) = BB_FOOTER (bb);
4326 BB_FOOTER (bb) = NULL;
4328 return new_bb;
4331 /* Redirect Edge to DEST. */
4332 static edge
4333 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
4335 basic_block src = e->src;
4336 edge ret;
4338 if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4339 return NULL;
4341 if (e->dest == dest)
4342 return e;
4344 if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
4345 && (ret = try_redirect_by_replacing_jump (e, dest, true)))
4347 df_set_bb_dirty (src);
4348 return ret;
4351 if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
4352 && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
4354 if (dump_file)
4355 fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
4356 e->src->index, dest->index);
4358 df_set_bb_dirty (e->src);
4359 redirect_edge_succ (e, dest);
4360 return e;
4363 /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
4364 in the case the basic block appears to be in sequence. Avoid this
4365 transformation. */
4367 if (e->flags & EDGE_FALLTHRU)
4369 /* Redirect any branch edges unified with the fallthru one. */
4370 if (JUMP_P (BB_END (src))
4371 && label_is_jump_target_p (BB_HEAD (e->dest),
4372 BB_END (src)))
4374 edge redirected;
4376 if (dump_file)
4377 fprintf (dump_file, "Fallthru edge unified with branch "
4378 "%i->%i redirected to %i\n",
4379 e->src->index, e->dest->index, dest->index);
4380 e->flags &= ~EDGE_FALLTHRU;
4381 redirected = redirect_branch_edge (e, dest);
4382 gcc_assert (redirected);
4383 redirected->flags |= EDGE_FALLTHRU;
4384 df_set_bb_dirty (redirected->src);
4385 return redirected;
4387 /* In case we are redirecting fallthru edge to the branch edge
4388 of conditional jump, remove it. */
4389 if (EDGE_COUNT (src->succs) == 2)
4391 /* Find the edge that is different from E. */
4392 edge s = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
4394 if (s->dest == dest
4395 && any_condjump_p (BB_END (src))
4396 && onlyjump_p (BB_END (src)))
4397 delete_insn (BB_END (src));
4399 if (dump_file)
4400 fprintf (dump_file, "Redirecting fallthru edge %i->%i to %i\n",
4401 e->src->index, e->dest->index, dest->index);
4402 ret = redirect_edge_succ_nodup (e, dest);
4404 else
4405 ret = redirect_branch_edge (e, dest);
4407 /* We don't want simplejumps in the insn stream during cfglayout. */
4408 gcc_assert (!simplejump_p (BB_END (src)));
4410 df_set_bb_dirty (src);
4411 return ret;
4414 /* Simple wrapper as we always can redirect fallthru edges. */
4415 static basic_block
4416 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
4418 edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
4420 gcc_assert (redirected);
4421 return NULL;
4424 /* Same as delete_basic_block but update cfg_layout structures. */
4426 static void
4427 cfg_layout_delete_block (basic_block bb)
4429 rtx_insn *insn, *next, *prev = PREV_INSN (BB_HEAD (bb)), *remaints;
4430 rtx_insn **to;
4432 if (BB_HEADER (bb))
4434 next = BB_HEAD (bb);
4435 if (prev)
4436 SET_NEXT_INSN (prev) = BB_HEADER (bb);
4437 else
4438 set_first_insn (BB_HEADER (bb));
4439 SET_PREV_INSN (BB_HEADER (bb)) = prev;
4440 insn = BB_HEADER (bb);
4441 while (NEXT_INSN (insn))
4442 insn = NEXT_INSN (insn);
4443 SET_NEXT_INSN (insn) = next;
4444 SET_PREV_INSN (next) = insn;
4446 next = NEXT_INSN (BB_END (bb));
4447 if (BB_FOOTER (bb))
4449 insn = BB_FOOTER (bb);
4450 while (insn)
4452 if (BARRIER_P (insn))
4454 if (PREV_INSN (insn))
4455 SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
4456 else
4457 BB_FOOTER (bb) = NEXT_INSN (insn);
4458 if (NEXT_INSN (insn))
4459 SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
4461 if (LABEL_P (insn))
4462 break;
4463 insn = NEXT_INSN (insn);
4465 if (BB_FOOTER (bb))
4467 insn = BB_END (bb);
4468 SET_NEXT_INSN (insn) = BB_FOOTER (bb);
4469 SET_PREV_INSN (BB_FOOTER (bb)) = insn;
4470 while (NEXT_INSN (insn))
4471 insn = NEXT_INSN (insn);
4472 SET_NEXT_INSN (insn) = next;
4473 if (next)
4474 SET_PREV_INSN (next) = insn;
4475 else
4476 set_last_insn (insn);
4479 if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
4480 to = &BB_HEADER (bb->next_bb);
4481 else
4482 to = &cfg_layout_function_footer;
4484 rtl_delete_block (bb);
4486 if (prev)
4487 prev = NEXT_INSN (prev);
4488 else
4489 prev = get_insns ();
4490 if (next)
4491 next = PREV_INSN (next);
4492 else
4493 next = get_last_insn ();
4495 if (next && NEXT_INSN (next) != prev)
4497 remaints = unlink_insn_chain (prev, next);
4498 insn = remaints;
4499 while (NEXT_INSN (insn))
4500 insn = NEXT_INSN (insn);
4501 SET_NEXT_INSN (insn) = *to;
4502 if (*to)
4503 SET_PREV_INSN (*to) = insn;
4504 *to = remaints;
4508 /* Return true when blocks A and B can be safely merged. */
4510 static bool
4511 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
4513 /* If we are partitioning hot/cold basic blocks, we don't want to
4514 mess up unconditional or indirect jumps that cross between hot
4515 and cold sections.
4517 Basic block partitioning may result in some jumps that appear to
4518 be optimizable (or blocks that appear to be mergeable), but which really
4519 must be left untouched (they are required to make it safely across
4520 partition boundaries). See the comments at the top of
4521 bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */
4523 if (BB_PARTITION (a) != BB_PARTITION (b))
4524 return false;
4526 /* Protect the loop latches. */
4527 if (current_loops && b->loop_father->latch == b)
4528 return false;
4530 /* If we would end up moving B's instructions, make sure it doesn't fall
4531 through into the exit block, since we cannot recover from a fallthrough
4532 edge into the exit block occurring in the middle of a function. */
4533 if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
4535 edge e = find_fallthru_edge (b->succs);
4536 if (e && e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
4537 return false;
4540 /* There must be exactly one edge in between the blocks. */
4541 return (single_succ_p (a)
4542 && single_succ (a) == b
4543 && single_pred_p (b) == 1
4544 && a != b
4545 /* Must be simple edge. */
4546 && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
4547 && a != ENTRY_BLOCK_PTR_FOR_FN (cfun)
4548 && b != EXIT_BLOCK_PTR_FOR_FN (cfun)
4549 /* If the jump insn has side effects, we can't kill the edge.
4550 When not optimizing, try_redirect_by_replacing_jump will
4551 not allow us to redirect an edge by replacing a table jump. */
4552 && (!JUMP_P (BB_END (a))
4553 || ((!optimize || reload_completed)
4554 ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
4557 /* Merge block A and B. The blocks must be mergeable. */
4559 static void
4560 cfg_layout_merge_blocks (basic_block a, basic_block b)
4562 bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0;
4563 rtx_insn *insn;
4565 gcc_checking_assert (cfg_layout_can_merge_blocks_p (a, b));
4567 if (dump_file)
4568 fprintf (dump_file, "Merging block %d into block %d...\n", b->index,
4569 a->index);
4571 /* If there was a CODE_LABEL beginning B, delete it. */
4572 if (LABEL_P (BB_HEAD (b)))
4574 delete_insn (BB_HEAD (b));
4577 /* We should have fallthru edge in a, or we can do dummy redirection to get
4578 it cleaned up. */
4579 if (JUMP_P (BB_END (a)))
4580 try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
4581 gcc_assert (!JUMP_P (BB_END (a)));
4583 /* When not optimizing and the edge is the only place in RTL which holds
4584 some unique locus, emit a nop with that locus in between. */
4585 if (!optimize)
4586 emit_nop_for_unique_locus_between (a, b);
4588 /* Move things from b->footer after a->footer. */
4589 if (BB_FOOTER (b))
4591 if (!BB_FOOTER (a))
4592 BB_FOOTER (a) = BB_FOOTER (b);
4593 else
4595 rtx_insn *last = BB_FOOTER (a);
4597 while (NEXT_INSN (last))
4598 last = NEXT_INSN (last);
4599 SET_NEXT_INSN (last) = BB_FOOTER (b);
4600 SET_PREV_INSN (BB_FOOTER (b)) = last;
4602 BB_FOOTER (b) = NULL;
4605 /* Move things from b->header before a->footer.
4606 Note that this may include dead tablejump data, but we don't clean
4607 those up until we go out of cfglayout mode. */
4608 if (BB_HEADER (b))
4610 if (! BB_FOOTER (a))
4611 BB_FOOTER (a) = BB_HEADER (b);
4612 else
4614 rtx_insn *last = BB_HEADER (b);
4616 while (NEXT_INSN (last))
4617 last = NEXT_INSN (last);
4618 SET_NEXT_INSN (last) = BB_FOOTER (a);
4619 SET_PREV_INSN (BB_FOOTER (a)) = last;
4620 BB_FOOTER (a) = BB_HEADER (b);
4622 BB_HEADER (b) = NULL;
4625 /* In the case basic blocks are not adjacent, move them around. */
4626 if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
4628 insn = unlink_insn_chain (BB_HEAD (b), BB_END (b));
4630 emit_insn_after_noloc (insn, BB_END (a), a);
4632 /* Otherwise just re-associate the instructions. */
4633 else
4635 insn = BB_HEAD (b);
4636 BB_END (a) = BB_END (b);
4639 /* emit_insn_after_noloc doesn't call df_insn_change_bb.
4640 We need to explicitly call. */
4641 update_bb_for_insn_chain (insn, BB_END (b), a);
4643 /* Skip possible DELETED_LABEL insn. */
4644 if (!NOTE_INSN_BASIC_BLOCK_P (insn))
4645 insn = NEXT_INSN (insn);
4646 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
4647 BB_HEAD (b) = BB_END (b) = NULL;
4648 delete_insn (insn);
4650 df_bb_delete (b->index);
4652 /* If B was a forwarder block, propagate the locus on the edge. */
4653 if (forwarder_p
4654 && LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) == UNKNOWN_LOCATION)
4655 EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
4657 if (dump_file)
4658 fprintf (dump_file, "Merged blocks %d and %d.\n", a->index, b->index);
4661 /* Split edge E. */
4663 static basic_block
4664 cfg_layout_split_edge (edge e)
4666 basic_block new_bb =
4667 create_basic_block (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
4668 ? NEXT_INSN (BB_END (e->src)) : get_insns (),
4669 NULL_RTX, e->src);
4671 if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
4672 BB_COPY_PARTITION (new_bb, e->src);
4673 else
4674 BB_COPY_PARTITION (new_bb, e->dest);
4675 make_edge (new_bb, e->dest, EDGE_FALLTHRU);
4676 redirect_edge_and_branch_force (e, new_bb);
4678 return new_bb;
4681 /* Do postprocessing after making a forwarder block joined by edge FALLTHRU. */
4683 static void
4684 rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
4688 /* Return true if BB contains only labels or non-executable
4689 instructions. */
4691 static bool
4692 rtl_block_empty_p (basic_block bb)
4694 rtx_insn *insn;
4696 if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
4697 || bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
4698 return true;
4700 FOR_BB_INSNS (bb, insn)
4701 if (NONDEBUG_INSN_P (insn) && !any_uncondjump_p (insn))
4702 return false;
4704 return true;
4707 /* Split a basic block if it ends with a conditional branch and if
4708 the other part of the block is not empty. */
4710 static basic_block
4711 rtl_split_block_before_cond_jump (basic_block bb)
4713 rtx_insn *insn;
4714 rtx_insn *split_point = NULL;
4715 rtx_insn *last = NULL;
4716 bool found_code = false;
4718 FOR_BB_INSNS (bb, insn)
4720 if (any_condjump_p (insn))
4721 split_point = last;
4722 else if (NONDEBUG_INSN_P (insn))
4723 found_code = true;
4724 last = insn;
4727 /* Did not find everything. */
4728 if (found_code && split_point)
4729 return split_block (bb, split_point)->dest;
4730 else
4731 return NULL;
4734 /* Return 1 if BB ends with a call, possibly followed by some
4735 instructions that must stay with the call, 0 otherwise. */
4737 static bool
4738 rtl_block_ends_with_call_p (basic_block bb)
4740 rtx_insn *insn = BB_END (bb);
4742 while (!CALL_P (insn)
4743 && insn != BB_HEAD (bb)
4744 && (keep_with_call_p (insn)
4745 || NOTE_P (insn)
4746 || DEBUG_INSN_P (insn)))
4747 insn = PREV_INSN (insn);
4748 return (CALL_P (insn));
4751 /* Return 1 if BB ends with a conditional branch, 0 otherwise. */
4753 static bool
4754 rtl_block_ends_with_condjump_p (const_basic_block bb)
4756 return any_condjump_p (BB_END (bb));
4759 /* Return true if we need to add fake edge to exit.
4760 Helper function for rtl_flow_call_edges_add. */
4762 static bool
4763 need_fake_edge_p (const rtx_insn *insn)
4765 if (!INSN_P (insn))
4766 return false;
4768 if ((CALL_P (insn)
4769 && !SIBLING_CALL_P (insn)
4770 && !find_reg_note (insn, REG_NORETURN, NULL)
4771 && !(RTL_CONST_OR_PURE_CALL_P (insn))))
4772 return true;
4774 return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
4775 && MEM_VOLATILE_P (PATTERN (insn)))
4776 || (GET_CODE (PATTERN (insn)) == PARALLEL
4777 && asm_noperands (insn) != -1
4778 && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
4779 || GET_CODE (PATTERN (insn)) == ASM_INPUT);
4782 /* Add fake edges to the function exit for any non constant and non noreturn
4783 calls, volatile inline assembly in the bitmap of blocks specified by
4784 BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
4785 that were split.
4787 The goal is to expose cases in which entering a basic block does not imply
4788 that all subsequent instructions must be executed. */
4790 static int
4791 rtl_flow_call_edges_add (sbitmap blocks)
4793 int i;
4794 int blocks_split = 0;
4795 int last_bb = last_basic_block_for_fn (cfun);
4796 bool check_last_block = false;
4798 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
4799 return 0;
4801 if (! blocks)
4802 check_last_block = true;
4803 else
4804 check_last_block = bitmap_bit_p (blocks,
4805 EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb->index);
4807 /* In the last basic block, before epilogue generation, there will be
4808 a fallthru edge to EXIT. Special care is required if the last insn
4809 of the last basic block is a call because make_edge folds duplicate
4810 edges, which would result in the fallthru edge also being marked
4811 fake, which would result in the fallthru edge being removed by
4812 remove_fake_edges, which would result in an invalid CFG.
4814 Moreover, we can't elide the outgoing fake edge, since the block
4815 profiler needs to take this into account in order to solve the minimal
4816 spanning tree in the case that the call doesn't return.
4818 Handle this by adding a dummy instruction in a new last basic block. */
4819 if (check_last_block)
4821 basic_block bb = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
4822 rtx_insn *insn = BB_END (bb);
4824 /* Back up past insns that must be kept in the same block as a call. */
4825 while (insn != BB_HEAD (bb)
4826 && keep_with_call_p (insn))
4827 insn = PREV_INSN (insn);
4829 if (need_fake_edge_p (insn))
4831 edge e;
4833 e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
4834 if (e)
4836 insert_insn_on_edge (gen_use (const0_rtx), e);
4837 commit_edge_insertions ();
4842 /* Now add fake edges to the function exit for any non constant
4843 calls since there is no way that we can determine if they will
4844 return or not... */
4846 for (i = NUM_FIXED_BLOCKS; i < last_bb; i++)
4848 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
4849 rtx_insn *insn;
4850 rtx_insn *prev_insn;
4852 if (!bb)
4853 continue;
4855 if (blocks && !bitmap_bit_p (blocks, i))
4856 continue;
4858 for (insn = BB_END (bb); ; insn = prev_insn)
4860 prev_insn = PREV_INSN (insn);
4861 if (need_fake_edge_p (insn))
4863 edge e;
4864 rtx_insn *split_at_insn = insn;
4866 /* Don't split the block between a call and an insn that should
4867 remain in the same block as the call. */
4868 if (CALL_P (insn))
4869 while (split_at_insn != BB_END (bb)
4870 && keep_with_call_p (NEXT_INSN (split_at_insn)))
4871 split_at_insn = NEXT_INSN (split_at_insn);
4873 /* The handling above of the final block before the epilogue
4874 should be enough to verify that there is no edge to the exit
4875 block in CFG already. Calling make_edge in such case would
4876 cause us to mark that edge as fake and remove it later. */
4878 if (flag_checking && split_at_insn == BB_END (bb))
4880 e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
4881 gcc_assert (e == NULL);
4884 /* Note that the following may create a new basic block
4885 and renumber the existing basic blocks. */
4886 if (split_at_insn != BB_END (bb))
4888 e = split_block (bb, split_at_insn);
4889 if (e)
4890 blocks_split++;
4893 make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE);
4896 if (insn == BB_HEAD (bb))
4897 break;
4901 if (blocks_split)
4902 verify_flow_info ();
4904 return blocks_split;
4907 /* Add COMP_RTX as a condition at end of COND_BB. FIRST_HEAD is
4908 the conditional branch target, SECOND_HEAD should be the fall-thru
4909 there is no need to handle this here the loop versioning code handles
4910 this. the reason for SECON_HEAD is that it is needed for condition
4911 in trees, and this should be of the same type since it is a hook. */
4912 static void
4913 rtl_lv_add_condition_to_bb (basic_block first_head ,
4914 basic_block second_head ATTRIBUTE_UNUSED,
4915 basic_block cond_bb, void *comp_rtx)
4917 rtx_code_label *label;
4918 rtx_insn *seq, *jump;
4919 rtx op0 = XEXP ((rtx)comp_rtx, 0);
4920 rtx op1 = XEXP ((rtx)comp_rtx, 1);
4921 enum rtx_code comp = GET_CODE ((rtx)comp_rtx);
4922 machine_mode mode;
4925 label = block_label (first_head);
4926 mode = GET_MODE (op0);
4927 if (mode == VOIDmode)
4928 mode = GET_MODE (op1);
4930 start_sequence ();
4931 op0 = force_operand (op0, NULL_RTX);
4932 op1 = force_operand (op1, NULL_RTX);
4933 do_compare_rtx_and_jump (op0, op1, comp, 0, mode, NULL_RTX, NULL, label, -1);
4934 jump = get_last_insn ();
4935 JUMP_LABEL (jump) = label;
4936 LABEL_NUSES (label)++;
4937 seq = get_insns ();
4938 end_sequence ();
4940 /* Add the new cond, in the new head. */
4941 emit_insn_after (seq, BB_END (cond_bb));
4945 /* Given a block B with unconditional branch at its end, get the
4946 store the return the branch edge and the fall-thru edge in
4947 BRANCH_EDGE and FALLTHRU_EDGE respectively. */
4948 static void
4949 rtl_extract_cond_bb_edges (basic_block b, edge *branch_edge,
4950 edge *fallthru_edge)
4952 edge e = EDGE_SUCC (b, 0);
4954 if (e->flags & EDGE_FALLTHRU)
4956 *fallthru_edge = e;
4957 *branch_edge = EDGE_SUCC (b, 1);
4959 else
4961 *branch_edge = e;
4962 *fallthru_edge = EDGE_SUCC (b, 1);
4966 void
4967 init_rtl_bb_info (basic_block bb)
4969 gcc_assert (!bb->il.x.rtl);
4970 bb->il.x.head_ = NULL;
4971 bb->il.x.rtl = ggc_cleared_alloc<rtl_bb_info> ();
4974 /* Returns true if it is possible to remove edge E by redirecting
4975 it to the destination of the other edge from E->src. */
4977 static bool
4978 rtl_can_remove_branch_p (const_edge e)
4980 const_basic_block src = e->src;
4981 const_basic_block target = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest;
4982 const rtx_insn *insn = BB_END (src);
4983 rtx set;
4985 /* The conditions are taken from try_redirect_by_replacing_jump. */
4986 if (target == EXIT_BLOCK_PTR_FOR_FN (cfun))
4987 return false;
4989 if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4990 return false;
4992 if (BB_PARTITION (src) != BB_PARTITION (target))
4993 return false;
4995 if (!onlyjump_p (insn)
4996 || tablejump_p (insn, NULL, NULL))
4997 return false;
4999 set = single_set (insn);
5000 if (!set || side_effects_p (set))
5001 return false;
5003 return true;
5006 static basic_block
5007 rtl_duplicate_bb (basic_block bb)
5009 bb = cfg_layout_duplicate_bb (bb);
5010 bb->aux = NULL;
5011 return bb;
5014 /* Do book-keeping of basic block BB for the profile consistency checker.
5015 If AFTER_PASS is 0, do pre-pass accounting, or if AFTER_PASS is 1
5016 then do post-pass accounting. Store the counting in RECORD. */
5017 static void
5018 rtl_account_profile_record (basic_block bb, int after_pass,
5019 struct profile_record *record)
5021 rtx_insn *insn;
5022 FOR_BB_INSNS (bb, insn)
5023 if (INSN_P (insn))
5025 record->size[after_pass]
5026 += insn_rtx_cost (PATTERN (insn), false);
5027 if (profile_status_for_fn (cfun) == PROFILE_READ)
5028 record->time[after_pass]
5029 += insn_rtx_cost (PATTERN (insn), true) * bb->count;
5030 else if (profile_status_for_fn (cfun) == PROFILE_GUESSED)
5031 record->time[after_pass]
5032 += insn_rtx_cost (PATTERN (insn), true) * bb->frequency;
5036 /* Implementation of CFG manipulation for linearized RTL. */
5037 struct cfg_hooks rtl_cfg_hooks = {
5038 "rtl",
5039 rtl_verify_flow_info,
5040 rtl_dump_bb,
5041 rtl_dump_bb_for_graph,
5042 rtl_create_basic_block,
5043 rtl_redirect_edge_and_branch,
5044 rtl_redirect_edge_and_branch_force,
5045 rtl_can_remove_branch_p,
5046 rtl_delete_block,
5047 rtl_split_block,
5048 rtl_move_block_after,
5049 rtl_can_merge_blocks, /* can_merge_blocks_p */
5050 rtl_merge_blocks,
5051 rtl_predict_edge,
5052 rtl_predicted_by_p,
5053 cfg_layout_can_duplicate_bb_p,
5054 rtl_duplicate_bb,
5055 rtl_split_edge,
5056 rtl_make_forwarder_block,
5057 rtl_tidy_fallthru_edge,
5058 rtl_force_nonfallthru,
5059 rtl_block_ends_with_call_p,
5060 rtl_block_ends_with_condjump_p,
5061 rtl_flow_call_edges_add,
5062 NULL, /* execute_on_growing_pred */
5063 NULL, /* execute_on_shrinking_pred */
5064 NULL, /* duplicate loop for trees */
5065 NULL, /* lv_add_condition_to_bb */
5066 NULL, /* lv_adjust_loop_header_phi*/
5067 NULL, /* extract_cond_bb_edges */
5068 NULL, /* flush_pending_stmts */
5069 rtl_block_empty_p, /* block_empty_p */
5070 rtl_split_block_before_cond_jump, /* split_block_before_cond_jump */
5071 rtl_account_profile_record,
5074 /* Implementation of CFG manipulation for cfg layout RTL, where
5075 basic block connected via fallthru edges does not have to be adjacent.
5076 This representation will hopefully become the default one in future
5077 version of the compiler. */
5079 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
5080 "cfglayout mode",
5081 rtl_verify_flow_info_1,
5082 rtl_dump_bb,
5083 rtl_dump_bb_for_graph,
5084 cfg_layout_create_basic_block,
5085 cfg_layout_redirect_edge_and_branch,
5086 cfg_layout_redirect_edge_and_branch_force,
5087 rtl_can_remove_branch_p,
5088 cfg_layout_delete_block,
5089 cfg_layout_split_block,
5090 rtl_move_block_after,
5091 cfg_layout_can_merge_blocks_p,
5092 cfg_layout_merge_blocks,
5093 rtl_predict_edge,
5094 rtl_predicted_by_p,
5095 cfg_layout_can_duplicate_bb_p,
5096 cfg_layout_duplicate_bb,
5097 cfg_layout_split_edge,
5098 rtl_make_forwarder_block,
5099 NULL, /* tidy_fallthru_edge */
5100 rtl_force_nonfallthru,
5101 rtl_block_ends_with_call_p,
5102 rtl_block_ends_with_condjump_p,
5103 rtl_flow_call_edges_add,
5104 NULL, /* execute_on_growing_pred */
5105 NULL, /* execute_on_shrinking_pred */
5106 duplicate_loop_to_header_edge, /* duplicate loop for trees */
5107 rtl_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
5108 NULL, /* lv_adjust_loop_header_phi*/
5109 rtl_extract_cond_bb_edges, /* extract_cond_bb_edges */
5110 NULL, /* flush_pending_stmts */
5111 rtl_block_empty_p, /* block_empty_p */
5112 rtl_split_block_before_cond_jump, /* split_block_before_cond_jump */
5113 rtl_account_profile_record,
5116 #include "gt-cfgrtl.h"