1 /* Hooks for cfg representation specific functions.
2 Copyright (C) 2003-2022 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <s.pop@laposte.net>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
28 #include "pretty-print.h"
29 #include "diagnostic-core.h"
37 /* Disable warnings about missing quoting in GCC diagnostics. */
39 # pragma GCC diagnostic push
40 # pragma GCC diagnostic ignored "-Wformat-diag"
43 /* A pointer to one of the hooks containers. */
44 static struct cfg_hooks
*cfg_hooks
;
46 /* Initialization of functions specific to the rtl IR. */
48 rtl_register_cfg_hooks (void)
50 cfg_hooks
= &rtl_cfg_hooks
;
53 /* Initialization of functions specific to the rtl IR. */
55 cfg_layout_rtl_register_cfg_hooks (void)
57 cfg_hooks
= &cfg_layout_rtl_cfg_hooks
;
60 /* Initialization of functions specific to the tree IR. */
63 gimple_register_cfg_hooks (void)
65 cfg_hooks
= &gimple_cfg_hooks
;
75 set_cfg_hooks (struct cfg_hooks new_cfg_hooks
)
77 *cfg_hooks
= new_cfg_hooks
;
80 /* Returns current ir type. */
83 current_ir_type (void)
85 if (cfg_hooks
== &gimple_cfg_hooks
)
87 else if (cfg_hooks
== &rtl_cfg_hooks
)
89 else if (cfg_hooks
== &cfg_layout_rtl_cfg_hooks
)
90 return IR_RTL_CFGLAYOUT
;
95 /* Verify the CFG consistency.
97 Currently it does following: checks edge and basic block list correctness
98 and calls into IL dependent checking then. */
101 verify_flow_info (void)
103 size_t *edge_checksum
;
105 basic_block bb
, last_bb_seen
;
106 basic_block
*last_visited
;
108 timevar_push (TV_CFG_VERIFY
);
109 last_visited
= XCNEWVEC (basic_block
, last_basic_block_for_fn (cfun
));
110 edge_checksum
= XCNEWVEC (size_t, last_basic_block_for_fn (cfun
));
112 /* Check bb chain & numbers. */
113 last_bb_seen
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
114 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
)->next_bb
, NULL
, next_bb
)
116 if (bb
!= EXIT_BLOCK_PTR_FOR_FN (cfun
)
117 && bb
!= BASIC_BLOCK_FOR_FN (cfun
, bb
->index
))
119 error ("bb %d on wrong place", bb
->index
);
123 if (bb
->prev_bb
!= last_bb_seen
)
125 error ("prev_bb of %d should be %d, not %d",
126 bb
->index
, last_bb_seen
->index
, bb
->prev_bb
->index
);
133 /* Now check the basic blocks (boundaries etc.) */
134 FOR_EACH_BB_REVERSE_FN (bb
, cfun
)
140 if (bb
->loop_father
!= NULL
&& current_loops
== NULL
)
142 error ("verify_flow_info: Block %i has loop_father, but there are no loops",
146 if (bb
->loop_father
== NULL
&& current_loops
!= NULL
)
148 error ("verify_flow_info: Block %i lacks loop_father", bb
->index
);
152 if (!bb
->count
.verify ())
154 error ("verify_flow_info: Wrong count of block %i", bb
->index
);
157 /* FIXME: Graphite and SLJL and target code still tends to produce
158 edges with no probability. */
159 if (profile_status_for_fn (cfun
) >= PROFILE_GUESSED
160 && !bb
->count
.initialized_p () && !flag_graphite
&& 0)
162 error ("verify_flow_info: Missing count of block %i", bb
->index
);
166 if (bb
->flags
& ~cfun
->cfg
->bb_flags_allocated
)
168 error ("verify_flow_info: unallocated flag set on BB %d", bb
->index
);
172 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
174 if (last_visited
[e
->dest
->index
] == bb
)
176 error ("verify_flow_info: Duplicate edge %i->%i",
177 e
->src
->index
, e
->dest
->index
);
180 /* FIXME: Graphite and SLJL and target code still tends to produce
181 edges with no probability. */
182 if (profile_status_for_fn (cfun
) >= PROFILE_GUESSED
183 && !e
->probability
.initialized_p () && !flag_graphite
&& 0)
185 error ("Uninitialized probability of edge %i->%i", e
->src
->index
,
189 if (!e
->probability
.verify ())
191 error ("verify_flow_info: Wrong probability of edge %i->%i",
192 e
->src
->index
, e
->dest
->index
);
196 last_visited
[e
->dest
->index
] = bb
;
198 if (e
->flags
& EDGE_FALLTHRU
)
203 error ("verify_flow_info: Basic block %d succ edge is corrupted",
205 fprintf (stderr
, "Predecessor: ");
206 dump_edge_info (stderr
, e
, TDF_DETAILS
, 0);
207 fprintf (stderr
, "\nSuccessor: ");
208 dump_edge_info (stderr
, e
, TDF_DETAILS
, 1);
209 fprintf (stderr
, "\n");
213 if (e
->flags
& ~cfun
->cfg
->edge_flags_allocated
)
215 error ("verify_flow_info: unallocated edge flag set on %d -> %d",
216 e
->src
->index
, e
->dest
->index
);
220 edge_checksum
[e
->dest
->index
] += (size_t) e
;
224 error ("wrong amount of branch edges after unconditional jump %i", bb
->index
);
228 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
232 error ("basic block %d pred edge is corrupted", bb
->index
);
233 fputs ("Predecessor: ", stderr
);
234 dump_edge_info (stderr
, e
, TDF_DETAILS
, 0);
235 fputs ("\nSuccessor: ", stderr
);
236 dump_edge_info (stderr
, e
, TDF_DETAILS
, 1);
237 fputc ('\n', stderr
);
241 if (ei
.index
!= e
->dest_idx
)
243 error ("basic block %d pred edge is corrupted", bb
->index
);
244 error ("its dest_idx should be %d, not %d",
245 ei
.index
, e
->dest_idx
);
246 fputs ("Predecessor: ", stderr
);
247 dump_edge_info (stderr
, e
, TDF_DETAILS
, 0);
248 fputs ("\nSuccessor: ", stderr
);
249 dump_edge_info (stderr
, e
, TDF_DETAILS
, 1);
250 fputc ('\n', stderr
);
254 edge_checksum
[e
->dest
->index
] -= (size_t) e
;
258 /* Complete edge checksumming for ENTRY and EXIT. */
263 FOR_EACH_EDGE (e
, ei
, ENTRY_BLOCK_PTR_FOR_FN (cfun
)->succs
)
264 edge_checksum
[e
->dest
->index
] += (size_t) e
;
266 FOR_EACH_EDGE (e
, ei
, EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
)
267 edge_checksum
[e
->dest
->index
] -= (size_t) e
;
270 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
271 if (edge_checksum
[bb
->index
])
273 error ("basic block %i edge lists are corrupted", bb
->index
);
279 free (edge_checksum
);
281 if (cfg_hooks
->verify_flow_info
)
282 err
|= cfg_hooks
->verify_flow_info ();
284 internal_error ("verify_flow_info failed");
285 timevar_pop (TV_CFG_VERIFY
);
288 /* Print out one basic block BB to file OUTF. INDENT is printed at the
289 start of each new line. FLAGS are the TDF_* flags in dumpfile.h.
291 This function takes care of the purely graph related information.
292 The cfg hook for the active representation should dump
293 representation-specific information. */
296 dump_bb (FILE *outf
, basic_block bb
, int indent
, dump_flags_t flags
)
298 if (flags
& TDF_BLOCKS
)
299 dump_bb_info (outf
, bb
, indent
, flags
, true, false);
300 if (cfg_hooks
->dump_bb
)
301 cfg_hooks
->dump_bb (outf
, bb
, indent
, flags
);
302 if (flags
& TDF_BLOCKS
)
303 dump_bb_info (outf
, bb
, indent
, flags
, false, true);
308 debug (basic_block_def
&ref
)
310 dump_bb (stderr
, &ref
, 0, TDF_NONE
);
314 debug (basic_block_def
*ptr
)
319 fprintf (stderr
, "<nil>\n");
323 debug_slim (basic_block ptr
)
325 fprintf (stderr
, "<basic_block %p (%d)>", (void *) ptr
, ptr
->index
);
328 DEFINE_DEBUG_VEC (basic_block_def
*)
329 DEFINE_DEBUG_HASH_SET (basic_block_def
*)
331 /* Dumps basic block BB to pretty-printer PP, for use as a label of
332 a DOT graph record-node. The implementation of this hook is
333 expected to write the label to the stream that is attached to PP.
334 Field separators between instructions are pipe characters printed
335 verbatim. Instructions should be written with some characters
336 escaped, using pp_write_text_as_dot_label_to_stream(). */
339 dump_bb_for_graph (pretty_printer
*pp
, basic_block bb
)
341 if (!cfg_hooks
->dump_bb_for_graph
)
342 internal_error ("%s does not support dump_bb_for_graph",
344 /* TODO: Add pretty printer for counter. */
345 if (bb
->count
.initialized_p ())
346 pp_printf (pp
, "COUNT:" "%" PRId64
, bb
->count
.to_gcov_type ());
347 pp_write_text_to_stream (pp
);
348 if (!(dump_flags
& TDF_SLIM
))
349 cfg_hooks
->dump_bb_for_graph (pp
, bb
);
352 /* Dump the complete CFG to FILE. FLAGS are the TDF_* flags in dumpfile.h. */
354 dump_flow_info (FILE *file
, dump_flags_t flags
)
358 fprintf (file
, "\n%d basic blocks, %d edges.\n", n_basic_blocks_for_fn (cfun
),
359 n_edges_for_fn (cfun
));
360 FOR_ALL_BB_FN (bb
, cfun
)
361 dump_bb (file
, bb
, 0, flags
);
366 /* Like above, but dump to stderr. To be called from debuggers. */
367 void debug_flow_info (void);
369 debug_flow_info (void)
371 dump_flow_info (stderr
, TDF_DETAILS
);
374 /* Redirect edge E to the given basic block DEST and update underlying program
375 representation. Returns edge representing redirected branch (that may not
376 be equivalent to E in the case of duplicate edges being removed) or NULL
377 if edge is not easily redirectable for whatever reason. */
380 redirect_edge_and_branch (edge e
, basic_block dest
)
384 if (!cfg_hooks
->redirect_edge_and_branch
)
385 internal_error ("%s does not support redirect_edge_and_branch",
388 ret
= cfg_hooks
->redirect_edge_and_branch (e
, dest
);
390 /* If RET != E, then either the redirection failed, or the edge E
391 was removed since RET already lead to the same destination. */
392 if (current_loops
!= NULL
&& ret
== e
)
393 rescan_loop_exit (e
, false, false);
398 /* Returns true if it is possible to remove the edge E by redirecting it
399 to the destination of the other edge going from its source. */
402 can_remove_branch_p (const_edge e
)
404 if (!cfg_hooks
->can_remove_branch_p
)
405 internal_error ("%s does not support can_remove_branch_p",
408 if (EDGE_COUNT (e
->src
->succs
) != 2)
411 return cfg_hooks
->can_remove_branch_p (e
);
414 /* Removes E, by redirecting it to the destination of the other edge going
415 from its source. Can_remove_branch_p must be true for E, hence this
416 operation cannot fail. */
419 remove_branch (edge e
)
422 basic_block src
= e
->src
;
425 gcc_assert (EDGE_COUNT (e
->src
->succs
) == 2);
427 other
= EDGE_SUCC (src
, EDGE_SUCC (src
, 0) == e
);
428 irr
= other
->flags
& EDGE_IRREDUCIBLE_LOOP
;
430 e
= redirect_edge_and_branch (e
, other
->dest
);
431 gcc_assert (e
!= NULL
);
433 e
->flags
&= ~EDGE_IRREDUCIBLE_LOOP
;
437 /* Removes edge E from cfg. Unlike remove_branch, it does not update IL. */
442 if (current_loops
!= NULL
)
444 rescan_loop_exit (e
, false, true);
446 /* Removal of an edge inside an irreducible region or which leads
447 to an irreducible region can turn the region into a natural loop.
448 In that case, ask for the loop structure fixups.
450 FIXME: Note that LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS is not always
451 set, so always ask for fixups when removing an edge in that case. */
452 if (!loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
)
453 || (e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
454 || (e
->dest
->flags
& BB_IRREDUCIBLE_LOOP
))
455 loops_state_set (LOOPS_NEED_FIXUP
);
458 /* This is probably not needed, but it doesn't hurt. */
459 /* FIXME: This should be called via a remove_edge hook. */
460 if (current_ir_type () == IR_GIMPLE
)
461 redirect_edge_var_map_clear (e
);
466 /* Like redirect_edge_succ but avoid possible duplicate edge. */
469 redirect_edge_succ_nodup (edge e
, basic_block new_succ
)
473 s
= find_edge (e
->src
, new_succ
);
476 s
->flags
|= e
->flags
;
477 s
->probability
+= e
->probability
;
478 /* FIXME: This should be called via a hook and only for IR_GIMPLE. */
479 redirect_edge_var_map_dup (s
, e
);
484 redirect_edge_succ (e
, new_succ
);
489 /* Redirect the edge E to basic block DEST even if it requires creating
490 of a new basic block; then it returns the newly created basic block.
491 Aborts when redirection is impossible. */
494 redirect_edge_and_branch_force (edge e
, basic_block dest
)
496 basic_block ret
, src
= e
->src
;
498 if (!cfg_hooks
->redirect_edge_and_branch_force
)
499 internal_error ("%s does not support redirect_edge_and_branch_force",
502 if (current_loops
!= NULL
)
503 rescan_loop_exit (e
, false, true);
505 ret
= cfg_hooks
->redirect_edge_and_branch_force (e
, dest
);
507 if (ret
!= NULL
&& dom_info_available_p (CDI_DOMINATORS
))
508 set_immediate_dominator (CDI_DOMINATORS
, ret
, src
);
510 if (current_loops
!= NULL
)
515 = find_common_loop (single_pred (ret
)->loop_father
,
516 single_succ (ret
)->loop_father
);
517 add_bb_to_loop (ret
, loop
);
519 else if (find_edge (src
, dest
) == e
)
520 rescan_loop_exit (e
, true, false);
526 /* Splits basic block BB after the specified instruction I (but at least after
527 the labels). If I is NULL, splits just after labels. The newly created edge
528 is returned. The new basic block is created just after the old one. */
531 split_block_1 (basic_block bb
, void *i
)
536 if (!cfg_hooks
->split_block
)
537 internal_error ("%s does not support split_block", cfg_hooks
->name
);
539 new_bb
= cfg_hooks
->split_block (bb
, i
);
543 new_bb
->count
= bb
->count
;
545 if (dom_info_available_p (CDI_DOMINATORS
))
547 redirect_immediate_dominators (CDI_DOMINATORS
, bb
, new_bb
);
548 set_immediate_dominator (CDI_DOMINATORS
, new_bb
, bb
);
551 if (current_loops
!= NULL
)
555 add_bb_to_loop (new_bb
, bb
->loop_father
);
556 /* Identify all loops bb may have been the latch of and adjust them. */
557 FOR_EACH_EDGE (e
, ei
, new_bb
->succs
)
558 if (e
->dest
->loop_father
->latch
== bb
)
559 e
->dest
->loop_father
->latch
= new_bb
;
562 res
= make_single_succ_edge (bb
, new_bb
, EDGE_FALLTHRU
);
564 if (bb
->flags
& BB_IRREDUCIBLE_LOOP
)
566 new_bb
->flags
|= BB_IRREDUCIBLE_LOOP
;
567 res
->flags
|= EDGE_IRREDUCIBLE_LOOP
;
574 split_block (basic_block bb
, gimple
*i
)
576 return split_block_1 (bb
, i
);
580 split_block (basic_block bb
, rtx i
)
582 return split_block_1 (bb
, i
);
585 /* Splits block BB just after labels. The newly created edge is returned. */
588 split_block_after_labels (basic_block bb
)
590 return split_block_1 (bb
, NULL
);
593 /* Moves block BB immediately after block AFTER. Returns false if the
594 movement was impossible. */
597 move_block_after (basic_block bb
, basic_block after
)
601 if (!cfg_hooks
->move_block_after
)
602 internal_error ("%s does not support move_block_after", cfg_hooks
->name
);
604 ret
= cfg_hooks
->move_block_after (bb
, after
);
609 /* Deletes the basic block BB. */
612 delete_basic_block (basic_block bb
)
614 if (!cfg_hooks
->delete_basic_block
)
615 internal_error ("%s does not support delete_basic_block", cfg_hooks
->name
);
617 cfg_hooks
->delete_basic_block (bb
);
619 if (current_loops
!= NULL
)
621 class loop
*loop
= bb
->loop_father
;
623 /* If we remove the header or the latch of a loop, mark the loop for
625 if (loop
->latch
== bb
626 || loop
->header
== bb
)
627 mark_loop_for_removal (loop
);
629 remove_bb_from_loops (bb
);
632 /* Remove the edges into and out of this block. Note that there may
633 indeed be edges in, if we are removing an unreachable loop. */
634 while (EDGE_COUNT (bb
->preds
) != 0)
635 remove_edge (EDGE_PRED (bb
, 0));
636 while (EDGE_COUNT (bb
->succs
) != 0)
637 remove_edge (EDGE_SUCC (bb
, 0));
639 if (dom_info_available_p (CDI_DOMINATORS
))
640 delete_from_dominance_info (CDI_DOMINATORS
, bb
);
641 if (dom_info_available_p (CDI_POST_DOMINATORS
))
642 delete_from_dominance_info (CDI_POST_DOMINATORS
, bb
);
644 /* Remove the basic block from the array. */
648 /* Splits edge E and returns the newly created basic block. */
654 profile_count count
= e
->count ();
656 bool irr
= (e
->flags
& EDGE_IRREDUCIBLE_LOOP
) != 0;
657 bool back
= (e
->flags
& EDGE_DFS_BACK
) != 0;
659 basic_block src
= e
->src
, dest
= e
->dest
;
661 if (!cfg_hooks
->split_edge
)
662 internal_error ("%s does not support split_edge", cfg_hooks
->name
);
664 if (current_loops
!= NULL
)
665 rescan_loop_exit (e
, false, true);
667 ret
= cfg_hooks
->split_edge (e
);
669 single_succ_edge (ret
)->probability
= profile_probability::always ();
673 ret
->flags
|= BB_IRREDUCIBLE_LOOP
;
674 single_pred_edge (ret
)->flags
|= EDGE_IRREDUCIBLE_LOOP
;
675 single_succ_edge (ret
)->flags
|= EDGE_IRREDUCIBLE_LOOP
;
679 single_pred_edge (ret
)->flags
&= ~EDGE_DFS_BACK
;
680 single_succ_edge (ret
)->flags
|= EDGE_DFS_BACK
;
683 if (dom_info_available_p (CDI_DOMINATORS
))
684 set_immediate_dominator (CDI_DOMINATORS
, ret
, single_pred (ret
));
686 if (dom_info_state (CDI_DOMINATORS
) >= DOM_NO_FAST_QUERY
)
688 /* There are two cases:
690 If the immediate dominator of e->dest is not e->src, it
693 If immediate dominator of e->dest is e->src, it may become
694 ret, provided that all other predecessors of e->dest are
695 dominated by e->dest. */
697 if (get_immediate_dominator (CDI_DOMINATORS
, single_succ (ret
))
698 == single_pred (ret
))
701 FOR_EACH_EDGE (f
, ei
, single_succ (ret
)->preds
)
703 if (f
== single_succ_edge (ret
))
706 if (!dominated_by_p (CDI_DOMINATORS
, f
->src
,
712 set_immediate_dominator (CDI_DOMINATORS
, single_succ (ret
), ret
);
716 if (current_loops
!= NULL
)
718 loop
= find_common_loop (src
->loop_father
, dest
->loop_father
);
719 add_bb_to_loop (ret
, loop
);
721 /* If we split the latch edge of loop adjust the latch block. */
722 if (loop
->latch
== src
723 && loop
->header
== dest
)
730 /* Creates a new basic block just after the basic block AFTER.
731 HEAD and END are the first and the last statement belonging
732 to the block. If both are NULL, an empty block is created. */
735 create_basic_block_1 (void *head
, void *end
, basic_block after
)
739 if (!cfg_hooks
->create_basic_block
)
740 internal_error ("%s does not support create_basic_block", cfg_hooks
->name
);
742 ret
= cfg_hooks
->create_basic_block (head
, end
, after
);
744 if (dom_info_available_p (CDI_DOMINATORS
))
745 add_to_dominance_info (CDI_DOMINATORS
, ret
);
746 if (dom_info_available_p (CDI_POST_DOMINATORS
))
747 add_to_dominance_info (CDI_POST_DOMINATORS
, ret
);
753 create_basic_block (gimple_seq seq
, basic_block after
)
755 return create_basic_block_1 (seq
, NULL
, after
);
759 create_basic_block (rtx head
, rtx end
, basic_block after
)
761 return create_basic_block_1 (head
, end
, after
);
765 /* Creates an empty basic block just after basic block AFTER. */
768 create_empty_bb (basic_block after
)
770 return create_basic_block_1 (NULL
, NULL
, after
);
773 /* Checks whether we may merge blocks BB1 and BB2. */
776 can_merge_blocks_p (basic_block bb1
, basic_block bb2
)
780 if (!cfg_hooks
->can_merge_blocks_p
)
781 internal_error ("%s does not support can_merge_blocks_p", cfg_hooks
->name
);
783 ret
= cfg_hooks
->can_merge_blocks_p (bb1
, bb2
);
789 predict_edge (edge e
, enum br_predictor predictor
, int probability
)
791 if (!cfg_hooks
->predict_edge
)
792 internal_error ("%s does not support predict_edge", cfg_hooks
->name
);
794 cfg_hooks
->predict_edge (e
, predictor
, probability
);
798 predicted_by_p (const_basic_block bb
, enum br_predictor predictor
)
800 if (!cfg_hooks
->predict_edge
)
801 internal_error ("%s does not support predicted_by_p", cfg_hooks
->name
);
803 return cfg_hooks
->predicted_by_p (bb
, predictor
);
806 /* Merges basic block B into basic block A. */
809 merge_blocks (basic_block a
, basic_block b
)
814 if (!cfg_hooks
->merge_blocks
)
815 internal_error ("%s does not support merge_blocks", cfg_hooks
->name
);
817 cfg_hooks
->merge_blocks (a
, b
);
819 if (current_loops
!= NULL
)
821 /* If the block we merge into is a loop header do nothing unless ... */
822 if (a
->loop_father
->header
== a
)
824 /* ... we merge two loop headers, in which case we kill
826 if (b
->loop_father
->header
== b
)
827 mark_loop_for_removal (b
->loop_father
);
829 /* If we merge a loop header into its predecessor, update the loop
831 else if (b
->loop_father
->header
== b
)
833 remove_bb_from_loops (a
);
834 add_bb_to_loop (a
, b
->loop_father
);
835 a
->loop_father
->header
= a
;
837 /* If we merge a loop latch into its predecessor, update the loop
839 if (b
->loop_father
->latch
840 && b
->loop_father
->latch
== b
)
841 b
->loop_father
->latch
= a
;
842 remove_bb_from_loops (b
);
845 /* Normally there should only be one successor of A and that is B, but
846 partway though the merge of blocks for conditional_execution we'll
847 be merging a TEST block with THEN and ELSE successors. Free the
848 whole lot of them and hope the caller knows what they're doing. */
850 while (EDGE_COUNT (a
->succs
) != 0)
851 remove_edge (EDGE_SUCC (a
, 0));
853 /* Adjust the edges out of B for the new owner. */
854 FOR_EACH_EDGE (e
, ei
, b
->succs
)
857 if (current_loops
!= NULL
)
859 /* If b was a latch, a now is. */
860 if (e
->dest
->loop_father
->latch
== b
)
861 e
->dest
->loop_father
->latch
= a
;
862 rescan_loop_exit (e
, true, false);
866 a
->flags
|= b
->flags
;
868 /* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
869 b
->preds
= b
->succs
= NULL
;
871 if (dom_info_available_p (CDI_DOMINATORS
))
872 redirect_immediate_dominators (CDI_DOMINATORS
, b
, a
);
874 if (dom_info_available_p (CDI_DOMINATORS
))
875 delete_from_dominance_info (CDI_DOMINATORS
, b
);
876 if (dom_info_available_p (CDI_POST_DOMINATORS
))
877 delete_from_dominance_info (CDI_POST_DOMINATORS
, b
);
882 /* Split BB into entry part and the rest (the rest is the newly created block).
883 Redirect those edges for that REDIRECT_EDGE_P returns true to the entry
884 part. Returns the edge connecting the entry part to the rest. */
887 make_forwarder_block (basic_block bb
, bool (*redirect_edge_p
) (edge
),
888 void (*new_bb_cbk
) (basic_block
))
892 basic_block dummy
, jump
;
893 class loop
*loop
, *ploop
, *cloop
;
895 if (!cfg_hooks
->make_forwarder_block
)
896 internal_error ("%s does not support make_forwarder_block",
899 fallthru
= split_block_after_labels (bb
);
900 dummy
= fallthru
->src
;
901 dummy
->count
= profile_count::zero ();
904 /* Redirect back edges we want to keep. */
905 for (ei
= ei_start (dummy
->preds
); (e
= ei_safe_edge (ei
)); )
909 if (redirect_edge_p (e
))
911 dummy
->count
+= e
->count ();
917 jump
= redirect_edge_and_branch_force (e
, bb
);
920 /* If we redirected the loop latch edge, the JUMP block now acts like
921 the new latch of the loop. */
922 if (current_loops
!= NULL
923 && dummy
->loop_father
!= NULL
924 && dummy
->loop_father
->header
== dummy
925 && dummy
->loop_father
->latch
== e_src
)
926 dummy
->loop_father
->latch
= jump
;
928 if (new_bb_cbk
!= NULL
)
933 if (dom_info_available_p (CDI_DOMINATORS
))
935 vec
<basic_block
> doms_to_fix
;
936 doms_to_fix
.create (2);
937 doms_to_fix
.quick_push (dummy
);
938 doms_to_fix
.quick_push (bb
);
939 iterate_fix_dominators (CDI_DOMINATORS
, doms_to_fix
, false);
940 doms_to_fix
.release ();
943 if (current_loops
!= NULL
)
945 /* If we do not split a loop header, then both blocks belong to the
946 same loop. In case we split loop header and do not redirect the
947 latch edge to DUMMY, then DUMMY belongs to the outer loop, and
948 BB becomes the new header. If latch is not recorded for the loop,
949 we leave this updating on the caller (this may only happen during
951 loop
= dummy
->loop_father
;
952 if (loop
->header
== dummy
953 && loop
->latch
!= NULL
954 && find_edge (loop
->latch
, dummy
) == NULL
)
956 remove_bb_from_loops (dummy
);
960 FOR_EACH_EDGE (e
, ei
, dummy
->preds
)
962 cloop
= find_common_loop (cloop
, e
->src
->loop_father
);
964 add_bb_to_loop (dummy
, cloop
);
967 /* In case we split loop latch, update it. */
968 for (ploop
= loop
; ploop
; ploop
= loop_outer (ploop
))
969 if (ploop
->latch
== dummy
)
973 cfg_hooks
->make_forwarder_block (fallthru
);
978 /* Try to make the edge fallthru. */
981 tidy_fallthru_edge (edge e
)
983 if (cfg_hooks
->tidy_fallthru_edge
)
984 cfg_hooks
->tidy_fallthru_edge (e
);
987 /* Fix up edges that now fall through, or rather should now fall through
988 but previously required a jump around now deleted blocks. Simplify
989 the search by only examining blocks numerically adjacent, since this
990 is how they were created.
992 ??? This routine is currently RTL specific. */
995 tidy_fallthru_edges (void)
999 if (!cfg_hooks
->tidy_fallthru_edge
)
1002 if (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->next_bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
1005 FOR_BB_BETWEEN (b
, ENTRY_BLOCK_PTR_FOR_FN (cfun
)->next_bb
,
1006 EXIT_BLOCK_PTR_FOR_FN (cfun
)->prev_bb
, next_bb
)
1012 /* We care about simple conditional or unconditional jumps with
1015 If we had a conditional branch to the next instruction when
1016 CFG was built, then there will only be one out edge for the
1017 block which ended with the conditional branch (since we do
1018 not create duplicate edges).
1020 Furthermore, the edge will be marked as a fallthru because we
1021 merge the flags for the duplicate edges. So we do not want to
1022 check that the edge is not a FALLTHRU edge. */
1024 if (single_succ_p (b
))
1026 s
= single_succ_edge (b
);
1027 if (! (s
->flags
& EDGE_COMPLEX
)
1029 && !(JUMP_P (BB_END (b
)) && CROSSING_JUMP_P (BB_END (b
))))
1030 tidy_fallthru_edge (s
);
1035 /* Edge E is assumed to be fallthru edge. Emit needed jump instruction
1036 (and possibly create new basic block) to make edge non-fallthru.
1037 Return newly created BB or NULL if none. */
1040 force_nonfallthru (edge e
)
1042 basic_block ret
, src
= e
->src
;
1044 if (!cfg_hooks
->force_nonfallthru
)
1045 internal_error ("%s does not support force_nonfallthru",
1048 ret
= cfg_hooks
->force_nonfallthru (e
);
1051 if (dom_info_available_p (CDI_DOMINATORS
))
1052 set_immediate_dominator (CDI_DOMINATORS
, ret
, src
);
1054 if (current_loops
!= NULL
)
1056 basic_block pred
= single_pred (ret
);
1057 basic_block succ
= single_succ (ret
);
1059 = find_common_loop (pred
->loop_father
, succ
->loop_father
);
1060 rescan_loop_exit (e
, false, true);
1061 add_bb_to_loop (ret
, loop
);
1063 /* If we split the latch edge of loop adjust the latch block. */
1064 if (loop
->latch
== pred
1065 && loop
->header
== succ
)
1073 /* Returns true if we can duplicate basic block BB. */
1076 can_duplicate_block_p (const_basic_block bb
)
1078 if (!cfg_hooks
->can_duplicate_block_p
)
1079 internal_error ("%s does not support can_duplicate_block_p",
1082 if (bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
) || bb
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
1085 return cfg_hooks
->can_duplicate_block_p (bb
);
1088 /* Duplicate basic block BB, place it after AFTER (if non-null) and redirect
1089 edge E to it (if non-null). Return the new basic block.
1091 If BB contains a returns_twice call, the caller is responsible for recreating
1092 incoming abnormal edges corresponding to the "second return" for the copy.
1093 gimple_can_duplicate_bb_p rejects such blocks, while RTL likes to live
1096 If BB has incoming abnormal edges for some other reason, their destinations
1097 should be tied to label(s) of the original BB and not the copy. */
1100 duplicate_block (basic_block bb
, edge e
, basic_block after
, copy_bb_data
*id
)
1104 profile_count new_count
= e
? e
->count (): profile_count::uninitialized ();
1107 if (!cfg_hooks
->duplicate_block
)
1108 internal_error ("%s does not support duplicate_block",
1111 if (bb
->count
< new_count
)
1112 new_count
= bb
->count
;
1114 gcc_checking_assert (can_duplicate_block_p (bb
));
1116 new_bb
= cfg_hooks
->duplicate_block (bb
, id
);
1118 move_block_after (new_bb
, after
);
1120 new_bb
->flags
= (bb
->flags
& ~BB_DUPLICATED
);
1121 FOR_EACH_EDGE (s
, ei
, bb
->succs
)
1123 /* Since we are creating edges from a new block to successors
1124 of another block (which therefore are known to be disjoint), there
1125 is no need to actually check for duplicated edges. */
1126 n
= unchecked_make_edge (new_bb
, s
->dest
, s
->flags
);
1127 n
->probability
= s
->probability
;
1133 new_bb
->count
= new_count
;
1134 bb
->count
-= new_count
;
1136 redirect_edge_and_branch_force (e
, new_bb
);
1139 new_bb
->count
= bb
->count
;
1141 set_bb_original (new_bb
, bb
);
1142 set_bb_copy (bb
, new_bb
);
1144 /* Add the new block to the copy of the loop of BB, or directly to the loop
1145 of BB if the loop is not being copied. */
1146 if (current_loops
!= NULL
)
1148 class loop
*cloop
= bb
->loop_father
;
1149 class loop
*copy
= get_loop_copy (cloop
);
1150 /* If we copied the loop header block but not the loop
1151 we have created a loop with multiple entries. Ditch the loop,
1152 add the new block to the outer loop and arrange for a fixup. */
1154 && cloop
->header
== bb
)
1156 add_bb_to_loop (new_bb
, loop_outer (cloop
));
1157 mark_loop_for_removal (cloop
);
1161 add_bb_to_loop (new_bb
, copy
? copy
: cloop
);
1162 /* If we copied the loop latch block but not the loop, adjust
1165 && cloop
->latch
== bb
)
1167 cloop
->latch
= NULL
;
1168 loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES
);
1176 /* Return 1 if BB ends with a call, possibly followed by some
1177 instructions that must stay with the call, 0 otherwise. */
1180 block_ends_with_call_p (basic_block bb
)
1182 if (!cfg_hooks
->block_ends_with_call_p
)
1183 internal_error ("%s does not support block_ends_with_call_p", cfg_hooks
->name
);
1185 return (cfg_hooks
->block_ends_with_call_p
) (bb
);
1188 /* Return 1 if BB ends with a conditional branch, 0 otherwise. */
1191 block_ends_with_condjump_p (const_basic_block bb
)
1193 if (!cfg_hooks
->block_ends_with_condjump_p
)
1194 internal_error ("%s does not support block_ends_with_condjump_p",
1197 return (cfg_hooks
->block_ends_with_condjump_p
) (bb
);
1200 /* Add fake edges to the function exit for any non constant and non noreturn
1201 calls, volatile inline assembly in the bitmap of blocks specified by
1202 BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
1205 The goal is to expose cases in which entering a basic block does not imply
1206 that all subsequent instructions must be executed. */
1209 flow_call_edges_add (sbitmap blocks
)
1211 if (!cfg_hooks
->flow_call_edges_add
)
1212 internal_error ("%s does not support flow_call_edges_add",
1215 return (cfg_hooks
->flow_call_edges_add
) (blocks
);
1218 /* This function is called immediately after edge E is added to the
1219 edge vector E->dest->preds. */
1222 execute_on_growing_pred (edge e
)
1224 if (! (e
->dest
->flags
& BB_DUPLICATED
)
1225 && cfg_hooks
->execute_on_growing_pred
)
1226 cfg_hooks
->execute_on_growing_pred (e
);
1229 /* This function is called immediately before edge E is removed from
1230 the edge vector E->dest->preds. */
1233 execute_on_shrinking_pred (edge e
)
1235 if (! (e
->dest
->flags
& BB_DUPLICATED
)
1236 && cfg_hooks
->execute_on_shrinking_pred
)
1237 cfg_hooks
->execute_on_shrinking_pred (e
);
1240 /* This is used inside loop versioning when we want to insert
1241 stmts/insns on the edges, which have a different behavior
1242 in tree's and in RTL, so we made a CFG hook. */
1244 lv_flush_pending_stmts (edge e
)
1246 if (cfg_hooks
->flush_pending_stmts
)
1247 cfg_hooks
->flush_pending_stmts (e
);
1250 /* Loop versioning uses the duplicate_loop_body_to_header_edge to create
1251 a new version of the loop basic-blocks, the parameters here are
1252 exactly the same as in duplicate_loop_body_to_header_edge or
1253 tree_duplicate_loop_body_to_header_edge; while in tree-ssa there is
1254 additional work to maintain ssa information that's why there is
1255 a need to call the tree_duplicate_loop_body_to_header_edge rather
1256 than duplicate_loop_body_to_header_edge when we are in tree mode. */
1258 cfg_hook_duplicate_loop_body_to_header_edge (class loop
*loop
, edge e
,
1260 sbitmap wont_exit
, edge orig
,
1261 vec
<edge
> *to_remove
, int flags
)
1263 gcc_assert (cfg_hooks
->cfg_hook_duplicate_loop_body_to_header_edge
);
1264 return cfg_hooks
->cfg_hook_duplicate_loop_body_to_header_edge (
1265 loop
, e
, ndupl
, wont_exit
, orig
, to_remove
, flags
);
1268 /* Conditional jumps are represented differently in trees and RTL,
1269 this hook takes a basic block that is known to have a cond jump
1270 at its end and extracts the taken and not taken edges out of it
1271 and store it in E1 and E2 respectively. */
1273 extract_cond_bb_edges (basic_block b
, edge
*e1
, edge
*e2
)
1275 gcc_assert (cfg_hooks
->extract_cond_bb_edges
);
1276 cfg_hooks
->extract_cond_bb_edges (b
, e1
, e2
);
1279 /* Responsible for updating the ssa info (PHI nodes) on the
1280 new condition basic block that guards the versioned loop. */
1282 lv_adjust_loop_header_phi (basic_block first
, basic_block second
,
1283 basic_block new_block
, edge e
)
1285 if (cfg_hooks
->lv_adjust_loop_header_phi
)
1286 cfg_hooks
->lv_adjust_loop_header_phi (first
, second
, new_block
, e
);
1289 /* Conditions in trees and RTL are different so we need
1290 a different handling when we add the condition to the
1293 lv_add_condition_to_bb (basic_block first
, basic_block second
,
1294 basic_block new_block
, void *cond
)
1296 gcc_assert (cfg_hooks
->lv_add_condition_to_bb
);
1297 cfg_hooks
->lv_add_condition_to_bb (first
, second
, new_block
, cond
);
1300 /* Checks whether all N blocks in BBS array can be copied. */
1302 can_copy_bbs_p (basic_block
*bbs
, unsigned n
)
1308 for (i
= 0; i
< n
; i
++)
1309 bbs
[i
]->flags
|= BB_DUPLICATED
;
1311 for (i
= 0; i
< n
; i
++)
1313 /* In case we should redirect abnormal edge during duplication, fail. */
1315 FOR_EACH_EDGE (e
, ei
, bbs
[i
]->succs
)
1316 if ((e
->flags
& EDGE_ABNORMAL
)
1317 && (e
->dest
->flags
& BB_DUPLICATED
))
1323 if (!can_duplicate_block_p (bbs
[i
]))
1331 for (i
= 0; i
< n
; i
++)
1332 bbs
[i
]->flags
&= ~BB_DUPLICATED
;
1337 /* Duplicates N basic blocks stored in array BBS. Newly created basic blocks
1338 are placed into array NEW_BBS in the same order. Edges from basic blocks
1339 in BBS are also duplicated and copies of those that lead into BBS are
1340 redirected to appropriate newly created block. The function assigns bbs
1341 into loops (copy of basic block bb is assigned to bb->loop_father->copy
1342 loop, so this must be set up correctly in advance)
1344 If UPDATE_DOMINANCE is true then this function updates dominators locally
1345 (LOOPS structure that contains the information about dominators is passed
1346 to enable this), otherwise it does not update the dominator information
1347 and it assumed that the caller will do this, perhaps by destroying and
1348 recreating it instead of trying to do an incremental update like this
1349 function does when update_dominance is true.
1351 BASE is the superloop to that basic block belongs; if its header or latch
1352 is copied, we do not set the new blocks as header or latch.
1354 Created copies of N_EDGES edges in array EDGES are stored in array NEW_EDGES,
1355 also in the same order.
1357 Newly created basic blocks are put after the basic block AFTER in the
1358 instruction stream, and the order of the blocks in BBS array is preserved. */
1361 copy_bbs (basic_block
*bbs
, unsigned n
, basic_block
*new_bbs
,
1362 edge
*edges
, unsigned num_edges
, edge
*new_edges
,
1363 class loop
*base
, basic_block after
, bool update_dominance
)
1366 basic_block bb
, new_bb
, dom_bb
;
1370 /* Mark the blocks to be copied. This is used by edge creation hooks
1371 to decide whether to reallocate PHI nodes capacity to avoid reallocating
1372 PHIs in the set of source BBs. */
1373 for (i
= 0; i
< n
; i
++)
1374 bbs
[i
]->flags
|= BB_DUPLICATED
;
1376 /* Duplicate bbs, update dominators, assign bbs to loops. */
1377 for (i
= 0; i
< n
; i
++)
1381 new_bb
= new_bbs
[i
] = duplicate_block (bb
, NULL
, after
, &id
);
1383 if (bb
->loop_father
)
1385 /* Possibly set loop header. */
1386 if (bb
->loop_father
->header
== bb
&& bb
->loop_father
!= base
)
1387 new_bb
->loop_father
->header
= new_bb
;
1389 if (bb
->loop_father
->latch
== bb
&& bb
->loop_father
!= base
)
1390 new_bb
->loop_father
->latch
= new_bb
;
1394 /* Set dominators. */
1395 if (update_dominance
)
1397 for (i
= 0; i
< n
; i
++)
1400 new_bb
= new_bbs
[i
];
1402 dom_bb
= get_immediate_dominator (CDI_DOMINATORS
, bb
);
1403 if (dom_bb
->flags
& BB_DUPLICATED
)
1405 dom_bb
= get_bb_copy (dom_bb
);
1406 set_immediate_dominator (CDI_DOMINATORS
, new_bb
, dom_bb
);
1411 /* Redirect edges. */
1412 for (i
= 0; i
< n
; i
++)
1415 new_bb
= new_bbs
[i
];
1418 FOR_EACH_EDGE (e
, ei
, new_bb
->succs
)
1420 if (!(e
->dest
->flags
& BB_DUPLICATED
))
1422 redirect_edge_and_branch_force (e
, get_bb_copy (e
->dest
));
1425 for (j
= 0; j
< num_edges
; j
++)
1428 new_edges
[j
] = NULL
;
1431 basic_block src
= edges
[j
]->src
;
1432 basic_block dest
= edges
[j
]->dest
;
1433 if (src
->flags
& BB_DUPLICATED
)
1434 src
= get_bb_copy (src
);
1435 if (dest
->flags
& BB_DUPLICATED
)
1436 dest
= get_bb_copy (dest
);
1437 new_edges
[j
] = find_edge (src
, dest
);
1441 /* Clear information about duplicates. */
1442 for (i
= 0; i
< n
; i
++)
1443 bbs
[i
]->flags
&= ~BB_DUPLICATED
;
1446 /* Return true if BB contains only labels or non-executable
1449 empty_block_p (basic_block bb
)
1451 gcc_assert (cfg_hooks
->empty_block_p
);
1452 return cfg_hooks
->empty_block_p (bb
);
1455 /* Split a basic block if it ends with a conditional branch and if
1456 the other part of the block is not empty. */
1458 split_block_before_cond_jump (basic_block bb
)
1460 gcc_assert (cfg_hooks
->split_block_before_cond_jump
);
1461 return cfg_hooks
->split_block_before_cond_jump (bb
);
1464 /* Work-horse for passes.cc:check_profile_consistency.
1465 Do book-keeping of the CFG for the profile consistency checker.
1466 Store the counting in RECORD. */
1469 profile_record_check_consistency (profile_record
*record
)
1475 FOR_ALL_BB_FN (bb
, cfun
)
1477 if (bb
!= EXIT_BLOCK_PTR_FOR_FN (cfun
)
1478 && profile_status_for_fn (cfun
) != PROFILE_ABSENT
1479 && EDGE_COUNT (bb
->succs
))
1483 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1485 if (!(e
->flags
& (EDGE_EH
| EDGE_FAKE
)))
1487 if (e
->probability
.initialized_p ())
1488 sum
+= e
->probability
.to_sreal ();
1490 double dsum
= sum
.to_double ();
1491 if (found
&& (dsum
< 0.9 || dsum
> 1.1)
1492 && !(bb
->count
== profile_count::zero ()))
1494 record
->num_mismatched_prob_out
++;
1495 dsum
= dsum
> 1 ? dsum
- 1 : 1 - dsum
;
1498 if (ENTRY_BLOCK_PTR_FOR_FN
1499 (cfun
)->count
.ipa ().initialized_p ()
1500 && ENTRY_BLOCK_PTR_FOR_FN
1501 (cfun
)->count
.ipa ().nonzero_p ()
1502 && bb
->count
.ipa ().initialized_p ())
1503 record
->dyn_mismatched_prob_out
1504 += dsum
* bb
->count
.ipa ().to_gcov_type ();
1506 else if (bb
->count
.initialized_p ())
1507 record
->dyn_mismatched_prob_out
1508 += dsum
* bb
->count
.to_sreal_scale
1509 (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
).to_double ();
1512 if (bb
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
)
1513 && profile_status_for_fn (cfun
) != PROFILE_ABSENT
)
1515 profile_count lsum
= profile_count::zero ();
1516 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1517 lsum
+= e
->count ();
1518 if (lsum
.differs_from_p (bb
->count
))
1520 record
->num_mismatched_count_in
++;
1522 if (lsum
< bb
->count
)
1528 if (ENTRY_BLOCK_PTR_FOR_FN
1529 (cfun
)->count
.ipa ().initialized_p ()
1530 && ENTRY_BLOCK_PTR_FOR_FN
1531 (cfun
)->count
.ipa ().nonzero_p ()
1532 && max
.ipa ().initialized_p ())
1533 record
->dyn_mismatched_count_in
1534 += max
.ipa ().to_gcov_type ();
1536 else if (bb
->count
.initialized_p ())
1537 record
->dyn_mismatched_prob_out
1538 += max
.to_sreal_scale
1539 (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
).to_double ();
1542 if (bb
== ENTRY_BLOCK_PTR_FOR_FN (cfun
)
1543 || bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
1548 /* Work-horse for passes.cc:acount_profile.
1549 Do book-keeping of the CFG for the profile accounting.
1550 Store the counting in RECORD. */
1553 profile_record_account_profile (profile_record
*record
)
1557 FOR_ALL_BB_FN (bb
, cfun
)
1559 gcc_assert (cfg_hooks
->account_profile_record
);
1560 cfg_hooks
->account_profile_record (bb
, record
);
1565 # pragma GCC diagnostic pop