GCC Middle and Back End API Reference
cfg.h File Reference
#include "dominance.h"
Include dependency graph for cfg.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  control_flow_graph
 
class  auto_flag< T >
 
class  auto_edge_flag
 
class  auto_bb_flag
 

Enumerations

enum  profile_status_d { PROFILE_ABSENT , PROFILE_GUESSED , PROFILE_READ , PROFILE_LAST }
 

Functions

void init_flow (function *)
 
void free_cfg (function *)
 
basic_block alloc_block (void)
 
void link_block (basic_block, basic_block)
 
void unlink_block (basic_block)
 
void compact_blocks (void)
 
void expunge_block (basic_block)
 
edge unchecked_make_edge (basic_block, basic_block, int)
 
edge cached_make_edge (sbitmap, basic_block, basic_block, int)
 
edge make_edge (basic_block, basic_block, int)
 
edge make_single_succ_edge (basic_block, basic_block, int)
 
void remove_edge_raw (edge)
 
void redirect_edge_succ (edge, basic_block)
 
void redirect_edge_pred (edge, basic_block)
 
void clear_bb_flags (void)
 
void dump_edge_info (FILE *, edge, dump_flags_t, int)
 
void debug (edge_def &ref)
 
void debug (edge_def *ptr)
 
void alloc_aux_for_blocks (int)
 
void clear_aux_for_blocks (void)
 
void free_aux_for_blocks (void)
 
void alloc_aux_for_edge (edge, int)
 
void alloc_aux_for_edges (int)
 
void clear_aux_for_edges (void)
 
void free_aux_for_edges (void)
 
void debug_bb (basic_block)
 
basic_block debug_bb_n (int)
 
void debug_bb (basic_block, dump_flags_t)
 
basic_block debug_bb_n (int, dump_flags_t)
 
void dump_bb_info (FILE *, basic_block, int, dump_flags_t, bool, bool)
 
void brief_dump_cfg (FILE *, dump_flags_t)
 
void set_edge_probability_and_rescale_others (edge, profile_probability)
 
void update_bb_profile_for_threading (basic_block, profile_count, edge)
 
void scale_bbs_frequencies_profile_count (basic_block *, int, profile_count, profile_count)
 
void scale_bbs_frequencies (basic_block *, int, profile_probability)
 
void initialize_original_copy_tables (void)
 
void reset_original_copy_tables (void)
 
void free_original_copy_tables (void)
 
bool original_copy_tables_initialized_p (void)
 
void set_bb_original (basic_block, basic_block)
 
basic_block get_bb_original (basic_block)
 
void set_bb_copy (basic_block, basic_block)
 
basic_block get_bb_copy (basic_block)
 
void set_loop_copy (class loop *, class loop *)
 
class loopget_loop_copy (class loop *)
 
void scale_strictly_dominated_blocks (basic_block, profile_count, profile_count)
 

Enumeration Type Documentation

◆ profile_status_d

Control flow graph manipulation code header file.
   Copyright (C) 2014-2024 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.   
What sort of profiling information we have.   
Enumerator
PROFILE_ABSENT 
PROFILE_GUESSED 
PROFILE_READ 
PROFILE_LAST 

Function Documentation

◆ alloc_aux_for_blocks()

void alloc_aux_for_blocks ( int size)
extern
Initialize the block_aux_obstack and if SIZE is nonzero, call
alloc_aux_for_block for each basic block.   

References alloc_aux_for_block(), block_aux_obstack, cfun, first_block_aux_obj, FOR_ALL_BB_FN, gcc_assert, gcc_obstack_init, and initialized.

Referenced by compute_branch_probabilities(), estimate_bb_frequencies(), init_pre(), init_worklist(), one_code_hoisting_pass(), sanopt_optimize(), and vt_initialize().

◆ alloc_aux_for_edge()

void alloc_aux_for_edge ( edge e,
int size )
extern
Allocate a memory edge of SIZE as E->aux.  The obstack must
be first initialized by alloc_aux_for_edges.   

References edge_aux_obstack, first_edge_aux_obj, and gcc_assert.

Referenced by alloc_aux_for_edges().

◆ alloc_aux_for_edges()

void alloc_aux_for_edges ( int size)
extern
Initialize the edge_aux_obstack and if SIZE is nonzero, call
alloc_aux_for_edge for each basic edge.   

References alloc_aux_for_edge(), cfun, edge_aux_obstack, ENTRY_BLOCK_PTR_FOR_FN, EXIT_BLOCK_PTR_FOR_FN, first_edge_aux_obj, FOR_BB_BETWEEN, FOR_EACH_EDGE, gcc_assert, gcc_obstack_init, initialized, and basic_block_def::succs.

Referenced by branch_prob(), and estimate_bb_frequencies().

◆ alloc_block()

◆ brief_dump_cfg()

void brief_dump_cfg ( FILE * file,
dump_flags_t flags )
extern
Dumps a brief description of cfg to FILE.   

References cfun, dump_bb_info(), FOR_EACH_BB_FN, and TDF_DETAILS.

Referenced by gimple_dump_cfg().

◆ cached_make_edge()

edge cached_make_edge ( sbitmap edge_cache,
basic_block src,
basic_block dst,
int flags )
extern
Create an edge connecting SRC and DST with FLAGS optionally using
edge cache CACHE.  Return the new edge, NULL if already exist.   

References bitmap_bit_p, bitmap_set_bit, cfun, ENTRY_BLOCK_PTR_FOR_FN, EXIT_BLOCK_PTR_FOR_FN, find_edge(), basic_block_def::index, make_edge(), NULL, and unchecked_make_edge().

Referenced by make_edges(), and make_label_edge().

◆ clear_aux_for_blocks()

◆ clear_aux_for_edges()

void clear_aux_for_edges ( void )
extern

◆ clear_bb_flags()

void clear_bb_flags ( void )
extern

◆ compact_blocks()

◆ debug() [1/2]

◆ debug() [2/2]

void debug ( edge_def * ptr)
extern

References debug.

◆ debug_bb() [1/2]

void debug_bb ( basic_block bb)
extern

References debug_bb(), and dump_flags.

Referenced by debug_bb(), debug_bb_n(), debug_bb_n(), and debug_bb_slim().

◆ debug_bb() [2/2]

void debug_bb ( basic_block bb,
dump_flags_t flags )
extern
Print BB with specified FLAGS.   

References dump_bb().

◆ debug_bb_n() [1/2]

basic_block debug_bb_n ( int n)
extern

References BASIC_BLOCK_FOR_FN, cfun, and debug_bb().

◆ debug_bb_n() [2/2]

basic_block debug_bb_n ( int n,
dump_flags_t flags )
extern
Print basic block numbered N with specified FLAGS.   

References BASIC_BLOCK_FOR_FN, cfun, and debug_bb().

◆ dump_bb_info()

void dump_bb_info ( FILE * outf,
basic_block bb,
int indent,
dump_flags_t flags,
bool do_header,
bool do_footer )
extern
Dumps cfg related information about basic block BB to OUTF.
If HEADER is true, dump things that appear before the instructions
contained in BB.  If FOOTER is true, dump things that appear after.
Flags are the TDF_* masks as documented in dumpfile.h.
NB: With TDF_DETAILS, it is assumed that cfun is available, so
that maybe_hot_bb_p and probably_never_executed_bb_p don't ICE.   
Flags on basic blocks and edges.
   Copyright (C) 2012-2024 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.   
This file defines flags that may appear on basic blocks or on
edges.  Source files define DEF_BASIC_BLOCK_FLAG or DEF_EDGE_FLAG
appropriately before including this file.   
Masks for basic_block.flags.

The format of this file is: DEF_BASIC_BLOCK_FLAG(NAME, IDX).
NAME is the name of the basic block flag.  A flag BB_#NAME will be
created and the name is used in dump_edge_info.
IDX is a sequence number that is used to determine the value
of the flag, which is 1 << IDX).

BB_HOT_PARTITION and BB_COLD_PARTITION should be preserved throughout
the compilation, so they are never cleared.

All other flags may be cleared by clear_bb_flags().  It is generally
a bad idea to rely on any flags being up-to-date.   
Only set on blocks that have just been created by create_bb.   
Set by find_unreachable_blocks.  Do not rely on this being set in any
pass.   
Set for blocks in an irreducible loop by loop analysis.   
Set on blocks that may actually not be single-entry single-exit block.   
Set on basic blocks that the scheduler should not touch.  This is used
by SMS to prevent other schedulers from messing with the loop schedule.   
Set on blocks that should be put in a hot section.   
Set on blocks that should be put in a cold section.   
Set on block that was duplicated.   
Set if the label at the top of this block is the target of a non-local goto.   
Set on blocks that are in RTL format.   
Set on blocks that are forwarder blocks.
Only used in cfgcleanup.cc.   
Set on blocks that cannot be threaded through.
Only used for jump threading.   
Set on blocks that were modified in some way.  This bit is set in
df_set_bb_dirty, but not cleared by df_analyze, so it can be used
to test whether a block has been modified prior to a df_analyze call.   
A general visited flag for passes to use.   
Set on blocks that are in a transaction.  This is calculated on
demand, and is available after calling compute_transaction_bits().   

References alloca, BB_ALL_FLAGS, bb_loop_depth(), cfun, check_bb_profile(), basic_block_def::count, current_function_decl, DECL_STRUCT_FUNCTION, profile_count::dump(), dump_edge_info(), basic_block_def::flags, FOR_EACH_EDGE, fputc(), gcc_assert, i, basic_block_def::index, profile_count::initialized_p(), maybe_hot_bb_p(), basic_block_def::next_bb, NULL, basic_block_def::preds, basic_block_def::prev_bb, probably_never_executed_bb_p(), basic_block_def::succs, and TDF_DETAILS.

Referenced by brief_dump_cfg(), dump_bb(), and print_rtl_with_bb().

◆ dump_edge_info()

void dump_edge_info ( FILE * file,
edge e,
dump_flags_t flags,
int do_succ )
extern
Flags on basic blocks and edges.
   Copyright (C) 2012-2024 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.   
This file defines flags that may appear on basic blocks or on
edges.  Source files define DEF_BASIC_BLOCK_FLAG or DEF_EDGE_FLAG
appropriately before including this file.   
Masks for edge.flags.

The format of this file is: DEF_EDGE_FLAG(NAME, IDX, STRING).
NAME is the name of the edge flag.  A flag EDGE_#NAME will be
created and the name is used in dump_edge_info.
IDX is a sequence number that is used to determine the value
of the flag, which is 1 << IDX).   
'Straight line' flow.  In GIMPLE and in cfglayout mode, all normal
edges are fallthru edges.  In cfgrtl mode, this flag really means
that control flow falls through to the next basic block in the line.   
Strange flow, like a computed jump or exception handling.  Usually
this means that the edge cannot be split.   
Edge out of a basic block that ends with a CALL_INSN with abnormal
exit, like an exception or a non-local goto.
ABNORMAL_CALL edges also have ABNORMAL set.
This flag is only used for the RTL CFG.   
Exception edge.  Exception handling edges represent possible control
transfers from a trapping instruction to an exception handler.
EH edges also have ABNORMAL set for the RTL CFG.   
Never merge blocks via this edge.  This is used for exception handling,
to prevent merging away edges to the post-landing-pad basic block.
This flag is only used for the RTL CFG.   
Not a real edge.  This is used to connect parts of the CFG that do
not halt, such as infinite loops and noreturn functions, to the
EXIT_BLOCK, so that traversing of the reverse CFG is possible.   
A back edge, marked in a depth-first search of the CFG.  Back edges
are hints that this edge may be part of a loop in the CFG.   
Edge in a part of the CFG that is an irreducible loop.   
Edge taken when controlling predicate is nonzero.
This is only used for the GIMPLE CFG.   
Edge taken when controlling predicate is zero.
This is only used for the GIMPLE CFG.   
Edge is executable.  This is only used in GIMPLE SSA-CCP and VRP.
This is only used for the GIMPLE CFG.   
Edge crosses between hot and cold sections, when we do partitioning.
This flag is only used for the RTL CFG.   
Edge from a sibcall CALL_INSN to exit.
SIBCALL edges also have ABNORMAL set.
This flag is only used for the RTL CFG.   
Candidate for straight line flow.  Only used in bb-reorder.cc.
This flag is only used for the RTL CFG.   
Exit of a loop.  This is only used in ifcvt.cc.
This flag is only used for the RTL CFG.   
Uninstrumented edge out of a GIMPLE_TRANSACTION statement.   
Abort (over) edge out of a GIMPLE_TRANSACTION statement.   
An edge we should ignore.  It should be entirely local to
passes.  ie, it is never set on any edge upon the completion
of any pass.   

References BUILTINS_LOCATION, cfun, EDGE_ALL_FLAGS, ENTRY_BLOCK, EXIT_BLOCK, fputc(), gcc_assert, i, basic_block_def::index, LOCATION_COLUMN, LOCATION_FILE, LOCATION_LINE, LOCATION_LOCUS, NULL, TDF_DETAILS, and TDF_SLIM.

Referenced by debug(), dump_basic_block_info(), dump_bb_info(), and verify_flow_info().

◆ expunge_block()

void expunge_block ( basic_block b)
extern
Remove block B from the basic block array.   

References b, cfun, n_basic_blocks_for_fn, NULL, SET_BASIC_BLOCK_FOR_FN, and unlink_block().

Referenced by delete_basic_block(), and merge_blocks().

◆ free_aux_for_blocks()

void free_aux_for_blocks ( void )
extern

◆ free_aux_for_edges()

void free_aux_for_edges ( void )
extern
Free data allocated in edge_aux_obstack and clear AUX pointers
of all edges.   

References clear_aux_for_edges(), edge_aux_obstack, first_edge_aux_obj, gcc_assert, and NULL.

Referenced by branch_prob(), and estimate_bb_frequencies().

◆ free_cfg()

◆ free_original_copy_tables()

◆ get_bb_copy()

◆ get_bb_original()

◆ get_loop_copy()

◆ init_flow()

void init_flow ( struct function * the_fun)
extern
Control flow graph manipulation code for GNU compiler.
   Copyright (C) 1987-2024 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.   
This file contains low level functions to manipulate the CFG and
 analyze it.  All other modules should not transform the data structure
 directly and use abstraction instead.  The file is supposed to be
 ordered bottom-up and should not contain any code dependent on a
 particular intermediate language (RTL or trees).

 Available functionality:
   - Initialization/deallocation
       init_flow, free_cfg
   - Low level basic block manipulation
       alloc_block, expunge_block
   - Edge manipulation
       make_edge, make_single_succ_edge, cached_make_edge, remove_edge
       - Low level edge redirection (without updating instruction chain)
           redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
   - Dumping and debugging
       dump_flow_info, debug_flow_info, dump_edge_info
   - Allocation of AUX fields for basic blocks
       alloc_aux_for_blocks, free_aux_for_blocks, alloc_aux_for_block
   - clear_bb_flags
   - Consistency checking
       verify_flow_info
   - Dumping and debugging
       print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n

 TODO: Document these "Available functionality" functions in the files
 that implement them.
Called once at initialization time.   

References alloc_block(), BB_ALL_FLAGS, control_flow_graph::bb_flags_allocated, function::cfg, control_flow_graph::count_max, EDGE_ALL_FLAGS, control_flow_graph::edge_flags_allocated, ENTRY_BLOCK, ENTRY_BLOCK_PTR_FOR_FN, EXIT_BLOCK, EXIT_BLOCK_PTR_FOR_FN, control_flow_graph::full_profile, ggc_cleared_alloc(), n_edges_for_fn, and profile_count::uninitialized().

Referenced by init_empty_tree_cfg_for_function().

◆ initialize_original_copy_tables()

◆ link_block()

◆ make_edge()

edge make_edge ( basic_block src,
basic_block dest,
int flags )
extern
Create an edge connecting SRC and DEST with flags FLAGS.  Return newly
created edge or NULL if already exist.   

References find_edge(), NULL, and unchecked_make_edge().

Referenced by add_test(), branch_fixup(), branch_prob(), cached_make_edge(), cfg_layout_split_edge(), rt_bb_visited::check(), combine_blocks(), connect_infinite_loops_to_exit(), connect_loops(), convert_if_conditions_to_switch(), copy_cfg_body(), copy_edges_for_bb(), create_cond_insert_point(), create_empty_if_region_on_edge(), create_empty_loop_on_edge(), create_parallel_loop(), tree_switch_conversion::switch_decision_tree::do_jump_if_equal(), do_split_loop_on_cond(), back_jt_path_registry::duplicate_thread_path(), edge_before_returns_twice_call(), tree_switch_conversion::bit_test_cluster::emit(), tree_switch_conversion::jump_table_cluster::emit(), tree_switch_conversion::switch_decision_tree::emit_cmp_and_jump_insns(), execute_sm_if_changed(), tree_switch_conversion::switch_conversion::exp_index_transform(), expand_complex_div_wide(), expand_gimple_tailcall(), expand_oacc_for(), expand_omp_atomic_pipeline(), expand_omp_for_generic(), expand_omp_for_init_counts(), expand_omp_for_init_vars(), expand_omp_for_ordered_loops(), expand_omp_for_static_chunk(), expand_omp_for_static_nochunk(), expand_omp_ordered_sink(), expand_omp_sections(), expand_omp_simd(), expand_omp_target(), expand_omp_taskloop_for_inner(), expand_omp_taskloop_for_outer(), expand_omp_taskreg(), expand_parallel_call(), expand_thunk(), expand_transaction(), extract_omp_for_update_vars(), find_bb_boundaries(), force_nonfallthru_and_redirect(), tree_switch_conversion::switch_conversion::gen_inbound_check(), gimple_divmod_fixed_value(), gimple_duplicate_sese_tail(), gimple_flow_call_edges_add(), gimple_gen_ic_func_profiler(), gimple_gen_time_profiler(), gimple_ic(), gimple_lower_bitint(), gimple_mod_pow2(), gimple_mod_subtract(), gimple_stringop_fixed_value(), handle_abnormal_edges(), tree_switch_conversion::bit_test_cluster::hoist_edge_and_branch_if_true(), hoist_guard(), init_lowered_empty_function(), input_cfg(), insert_check_and_trap(), insert_cond_bb(), rt_bb_visited::insert_exit_check_on_edge(), lv_adjust_loop_entry_edge(), make_cond_expr_edges(), make_edges(), make_edges(), make_edges_bb(), make_eh_dispatch_edges(), make_eh_edge(), make_gimple_asm_edges(), make_gimple_switch_edges(), make_goto_expr_edges(), make_single_succ_edge(), move_sese_in_condition(), move_sese_region_to_fn(), oacc_entry_exit_single_gang(), omp_make_gimple_edges(), optimize_mask_stores(), peep2_attempt(), rtl_flow_call_edges_add(), shrink_wrap_one_built_in_call_with_conds(), simd_clone_adjust(), slpeel_add_loop_guard(), split_bb_make_tm_edge(), tree_transform_and_unroll_loop(), ubsan_expand_null_ifn(), ubsan_expand_ptr_ifn(), unloop_loops(), unroll_loop_runtime_iterations(), vect_loop_versioning(), worker_single_copy(), and worker_single_simple().

◆ make_single_succ_edge()

◆ original_copy_tables_initialized_p()

bool original_copy_tables_initialized_p ( void )
extern
Return true iff we have had a call to initialize_original_copy_tables
without a corresponding call to free_original_copy_tables.   

References bb_copy, and NULL.

Referenced by copy_original_table_clear(), copy_original_table_set(), get_bb_copy(), get_bb_original(), get_loop_copy(), and relink_block_chain().

◆ redirect_edge_pred()

void redirect_edge_pred ( edge e,
basic_block new_pred )
extern

◆ redirect_edge_succ()

◆ remove_edge_raw()

void remove_edge_raw ( edge e)
extern
This function will remove an edge from the flow graph.   

References cfun, disconnect_dest(), disconnect_src(), execute_on_shrinking_pred(), free_edge(), and remove_predictions_associated_with_edge().

Referenced by remove_edge().

◆ reset_original_copy_tables()

void reset_original_copy_tables ( void )
extern
Reset the data structures to maintain mapping between blocks and
its copies.   

References bb_copy, bb_original, hash_map< KeyId, Value, Traits >::empty(), and loop_copy.

Referenced by vect_do_peeling().

◆ scale_bbs_frequencies()

void scale_bbs_frequencies ( basic_block * bbs,
int nbbs,
profile_probability p )
extern
Multiply all frequencies of basic blocks in array BBS of length NBBS
by NUM/DEN, in profile_count arithmetic.  More accurate than previous
function but considerably slower.   

References count, and i.

Referenced by duplicate_loop_body_to_header_edge(), hoist_guard(), scale_loop_frequencies(), and vect_do_peeling().

◆ scale_bbs_frequencies_profile_count()

void scale_bbs_frequencies_profile_count ( basic_block * bbs,
int nbbs,
profile_count num,
profile_count den )
extern
Multiply all frequencies of basic blocks in array BBS of length NBBS
by NUM/DEN, in profile_count arithmetic.  More accurate than previous
function but considerably slower.   

References count, i, profile_count::nonzero_p(), and profile_count::zero().

Referenced by duplicate_loop_body_to_header_edge(), back_jt_path_registry::duplicate_thread_path(), and gimple_duplicate_sese_tail().

◆ scale_strictly_dominated_blocks()

void scale_strictly_dominated_blocks ( basic_block bb,
profile_count num,
profile_count den )
Scales the frequencies of all basic blocks that are strictly
dominated by BB by NUM/DEN.   

References profile_count::apply_scale(), CDI_DOMINATORS, basic_block_def::count, first_dom_son(), next_dom_son(), profile_count::nonzero_p(), loop::num, worklist, and profile_count::zero().

Referenced by fold_loop_internal_call().

◆ set_bb_copy()

void set_bb_copy ( basic_block bb,
basic_block copy )
extern
Set copy for basic block.  Do nothing when data structures are not
initialized so passes not needing this don't need to care.   

References bb_copy, copy_original_table_set(), and basic_block_def::index.

Referenced by duplicate_block().

◆ set_bb_original()

void set_bb_original ( basic_block bb,
basic_block original )
extern
Set original for basic block.  Do nothing when data structures are not
initialized so passes not needing this don't need to care.   

References bb_original, copy_original_table_set(), and basic_block_def::index.

Referenced by duplicate_block().

◆ set_edge_probability_and_rescale_others()

◆ set_loop_copy()

void set_loop_copy ( class loop * loop,
class loop * copy )

◆ unchecked_make_edge()

edge unchecked_make_edge ( basic_block src,
basic_block dst,
int flags )
extern
Create an edge connecting SRC and DEST with flags FLAGS.  Return newly
created edge.  Use this only if you are sure that this edge can't
possibly already exist.   

References cfun, connect_dest(), connect_src(), execute_on_growing_pred(), basic_block_def::flags, ggc_cleared_alloc(), n_edges_for_fn, and profile_probability::uninitialized().

Referenced by cached_make_edge(), function_reader::create_edges(), duplicate_block(), force_nonfallthru_and_redirect(), and make_edge().

◆ unlink_block()

◆ update_bb_profile_for_threading()

void update_bb_profile_for_threading ( basic_block bb,
profile_count count,
edge taken_edge )
extern
An edge originally destinating BB of COUNT has been proved to
leave the block by TAKEN_EDGE.  Update profile of BB such that edge E can be
redirected to destination of TAKEN_EDGE.

This function may leave the profile inconsistent in the case TAKEN_EDGE
frequency or count is believed to be lower than COUNT
respectively.   

References profile_count::apply_scale(), profile_probability::apply_scale(), basic_block_def::count, count, profile_probability::dump(), dump_file, gcc_assert, profile_count::guessed(), profile_probability::guessed(), basic_block_def::index, profile_count::initialized_p(), profile_probability::invert(), profile_count::nonzero_p(), set_edge_probability_and_rescale_others(), and profile_count::zero().

Referenced by back_jt_path_registry::duplicate_thread_path(), try_forward_edges(), and update_profile_after_ch().