GCC Middle and Back End API Reference
|
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "rtl.h"
#include "tree.h"
#include "gimple.h"
#include "cfghooks.h"
#include "gimple-ssa.h"
#include "diagnostic-core.h"
#include "cfganal.h"
#include "cfgloop.h"
#include "gimple-iterator.h"
#include "dumpfile.h"
#include "tree-ssa.h"
#include "tree-pretty-print.h"
#include "sreal.h"
Macros | |
#define | HEAVY_EDGE_RATIO 8 |
#define | HEAVY_EDGE_MIN_SAMPLES 10 |
Variables | |
static int * | sort_sibling_loops_cmp_rpo |
static hash_set< edge > * | mfb_reis_set |
#define HEAVY_EDGE_MIN_SAMPLES 10 |
Minimum number of samples for that we apply find_subloop_latch_edge_by_profile heuristics.
Referenced by find_subloop_latch_edge_by_profile().
#define HEAVY_EDGE_RATIO 8 |
Ratio of frequencies of edges so that one of more latch edges is considered to belong to inner loop with same header.
Referenced by find_subloop_latch_edge_by_profile().
void add_bb_to_loop | ( | basic_block | bb, |
class loop * | loop ) |
Adds basic block BB to LOOP.
References loop_exit::e, FOR_EACH_EDGE, FOR_EACH_VEC_SAFE_ELT, gcc_assert, i, basic_block_def::loop_father, NULL, loop::num_nodes, basic_block_def::preds, rescan_loop_exit(), basic_block_def::succs, and loop::superloops.
Referenced by add_loop(), rt_bb_visited::check(), cleanup_tree_cfg_noloop(), construct_exit_block(), construct_init_block(), create_cond_insert_point(), duplicate_block(), dw2_build_landing_pads(), execute_sm_if_changed(), expand_complex_div_wide(), expand_gimple_cond(), expand_omp_for_generic(), expand_omp_for_init_counts(), expand_omp_for_init_vars(), expand_omp_sections(), expand_omp_simd(), expand_omp_target(), expand_parallel_call(), expand_thunk(), expand_transaction(), extract_omp_for_update_vars(), fix_bb_placement(), force_nonfallthru(), gimple_find_sub_bbs(), gsi_insert_finally_seq_after_call(), init_lowered_empty_function(), insert_check_and_trap(), insert_cond_bb(), rt_bb_visited::insert_exit_check_on_edge(), loop_version(), lower_resx(), make_forwarder_block(), merge_blocks(), merge_loop_tree(), move_sese_region_to_fn(), optimize_mask_stores(), redirect_edge_and_branch_force(), simd_clone_adjust(), sjlj_emit_dispatch_table(), split_block_1(), split_edge(), split_function(), ubsan_expand_null_ifn(), ubsan_expand_ptr_ifn(), unloop(), and unloop_loops().
class loop * alloc_loop | ( | void | ) |
Allocates and returns new loop structure.
References loop::can_be_parallel, loop::constraints, loop::exits, ggc_cleared_alloc(), loop::nb_iterations_estimate, loop::nb_iterations_likely_upper_bound, loop::nb_iterations_upper_bound, loop_exit::next, and loop_exit::prev.
Referenced by copy_loops(), create_empty_loop_on_edge(), duplicate_loop(), eliminate_tail_call(), expand_oacc_for(), expand_omp_atomic_pipeline(), expand_omp_for_generic(), expand_omp_for_ordered_loops(), expand_omp_for_static_chunk(), expand_omp_for_static_nochunk(), expand_omp_simd(), expand_omp_taskloop_for_inner(), flow_loops_find(), form_subloop(), init_loops_structure(), input_cfg(), loop_version(), and simd_clone_adjust().
int bb_loop_depth | ( | const_basic_block | bb | ) |
Returns the loop depth of the loop BB belongs to.
References loop_depth(), and basic_block_def::loop_father.
Referenced by analyze_function_body(), combine_and_move_insns(), compute_alignments(), dump_bb_info(), get_value_locus_in_path(), insert_into_preds_of_block(), select_best_block(), split_live_ranges_for_shrink_wrap(), update_equiv_regs(), and vect_loop_versioning().
bool bb_loop_header_p | ( | basic_block | header | ) |
Returns whether HEADER is a loop header.
References bb_has_abnormal_pred(), CDI_DOMINATORS, cfun, dominated_by_p(), ENTRY_BLOCK_PTR_FOR_FN, FOR_EACH_EDGE, header, and loop::latch.
Referenced by crc_optimization::cond_depends_on_crc(), crc_optimization::find_shift_after_xor(), fix_loop_structure(), flow_loops_find(), vect_optimize_slp_pass::is_cfg_latch_edge(), remove_forwarder_block_with_phi(), crc_optimization::set_crc_and_data_phi(), crc_optimization::set_defs(), tree_forwarder_block_p(), and verify_loop_structure().
|
static |
Cancels the LOOP; it must be innermost one.
References delete_loop(), free(), gcc_assert, get_loop_body(), i, loop::inner, loop_outer(), and loop::num_nodes.
Referenced by cancel_loop_tree().
void cancel_loop_tree | ( | class loop * | loop | ) |
Cancels LOOP and all its subloops.
References cancel_loop(), cancel_loop_tree(), and loop::inner.
Referenced by cancel_loop_tree(), destroy_loop(), and remove_path().
void delete_loop | ( | class loop * | loop | ) |
Removes LOOP from structures and frees its data.
References current_loops, flow_loop_free(), flow_loop_tree_node_remove(), NULL, and loop::num.
Referenced by cancel_loop(), fuse_loops(), and unloop().
void disambiguate_loops_with_multiple_latches | ( | void | ) |
Split loops with multiple latch edges.
References cfun, disambiguate_multiple_latches(), and loop::latch.
Referenced by apply_loop_flags().
|
static |
LOOP may have several latch edges. Transform it into (possibly several) loops with single latch edge.
References cfun, dump_file, ENTRY_BLOCK_PTR_FOR_FN, find_edge(), find_subloop_latch_edge(), form_subloop(), loop::header, merge_latch_edges(), loop::num, and split_edge().
Referenced by disambiguate_loops_with_multiple_latches().
int dump_recorded_exit | ( | loop_exit ** | slot, |
FILE * | file ) |
Dumps information about the exit in *SLOT to FILE. Callback for htab_traverse.
References loop_exit::e, loop_exit::next_e, and NULL.
Referenced by dump_recorded_exits().
|
extern |
Dumps the recorded exits of loops to FILE.
References current_loops, and dump_recorded_exit().
Records the vector of superloops of the loop LOOP, whose immediate superloop is FATHER.
References establish_preds(), FOR_EACH_VEC_SAFE_ELT, i, loop::inner, loop_depth(), loop::next, loop::superloops, and vec_alloc().
Referenced by establish_preds(), and flow_loop_tree_node_add().
|
static |
Fills dominance descendants inside LOOP of the basic block BB into array TOVISIT from index *TV.
References CDI_DOMINATORS, dominated_by_p(), fill_sons_in_loop(), first_dom_son(), flow_bb_inside_loop_p(), loop::latch, next_dom_son(), and NULL.
Referenced by fill_sons_in_loop(), and get_loop_body_in_dom_order().
Finds nearest common ancestor in loop tree for given loops.
References loop_depth(), loop_outer(), and loop::superloops.
Referenced by add_exit_phi(), cleanup_tree_cfg_noloop(), expand_gimple_cond(), find_exits(), fix_bb_placements(), fix_loop_placement(), force_nonfallthru(), get_minimal_bb(), instantiate_scev_name(), make_forwarder_block(), mark_irreducible_loops(), nb_common_loops(), outermost_invariant_loop(), loop_distribution::pg_add_dependence_edges(), redirect_edge_and_branch_force(), rescan_loop_exit(), set_level(), and split_edge().
If we can determine that one of the several latch edges of LOOP behaves as a latch edge of a separate subloop, returns this edge. Otherwise returns NULL.
References current_ir_type(), find_subloop_latch_edge_by_ivs(), find_subloop_latch_edge_by_profile(), get_loop_latch_edges(), IR_GIMPLE, loop::latch, and NULL.
Referenced by disambiguate_multiple_latches().
Among LATCHES, guesses a latch edge of LOOP corresponding to subloop, based on the structure of induction variables. Returns this edge, or NULL if we do not find any. We are quite conservative, and look just for an obvious simple innermost loop (which is the case where we would lose the most performance by not disambiguating the loop). More precisely, we look for the following situation: The source of the chosen latch edge dominates sources of all the other latch edges. Additionally, the header does not contain a phi node such that the argument from the chosen edge is equal to the argument from another edge.
References CDI_DOMINATORS, dominated_by_p(), dump_file, flow_bb_inside_loop_p(), FOR_EACH_VEC_ELT, gimple_bb(), gsi_end_p(), gsi_next(), gsi_start_phis(), loop::header, i, basic_block_def::index, loop::latch, NULL, gphi_iterator::phi(), PHI_ARG_DEF_FROM_EDGE, SSA_NAME_DEF_STMT, and TREE_CODE.
Referenced by find_subloop_latch_edge().
If the profile info is available, finds an edge in LATCHES that much more frequent than the remaining edges. Returns such an edge, or NULL if we do not find one. We do not use guessed profile here, only the measured one. The guessed profile is usually too flat and unreliable for this (and it is mostly based on the loop structure of the program, so it does not make much sense to derive the loop structure from it).
References dump_file, FOR_EACH_VEC_ELT, HEAVY_EDGE_MIN_SAMPLES, HEAVY_EDGE_RATIO, i, NULL, and profile_count::zero().
Referenced by find_subloop_latch_edge().
bool flow_bb_inside_loop_p | ( | const class loop * | loop, |
const_basic_block | bb ) |
Return nonzero if basic block BB belongs to LOOP.
References cfun, ENTRY_BLOCK_PTR_FOR_FN, EXIT_BLOCK_PTR_FOR_FN, flow_loop_nested_p(), and basic_block_def::loop_father.
Referenced by add_exit_phi(), add_to_dst_predicate_list(), add_to_predicate_list(), analyze_evolution_in_loop(), loop_cand::analyze_iloop_reduction_var(), analyze_initial_condition(), loop_cand::analyze_oloop_reduction_var(), analyze_scalar_evolution_1(), base_names_in_chain_on(), bb_in_loop_p(), can_move_invariant_reg(), chain_of_csts_start(), check_exit_phi(), check_loop_closed_ssa_def(), check_reduction_path(), classify_builtin_st(), compute_access_stride(), compute_added_num_insns(), create_rdg_cd_edges(), duplicate_loop_body_to_header_edge(), rpo_elim::eliminate_avail(), eliminate_dom_walker::eliminate_stmt(), evaluate_bbs(), crc_symbolic_execution::execute_crc_loop(), expr_invariant_in_loop_p(), fill_always_executed_in_1(), fill_sons_in_loop(), final_range_test_p(), find_exits(), find_interesting_uses(), find_inv_vars_cb(), find_loop_guard(), crc_optimization::find_shift_after_xor(), find_simple_exit(), find_subloop_latch_edge_by_ivs(), find_unswitching_predicates_for_bb(), find_uses_to_rename_use(), find_vdef_in_loop(), flow_loops_find(), scev_dfs::follow_ssa_edge_inner_loop_phi(), for_all_locs_in_loop(), get_cond_invariant_branch(), get_control_equiv_head_block(), get_iv(), get_loop_body_in_bfs_order(), get_loop_exit_edges(), hoist_defs_of_uses(), hoist_guard(), init_loop_unswitch_info(), inner_loop_header_p(), insert_into_preds_of_block(), ip_normal_pos(), is_cond_scalar_reduction(), is_inv_store_elimination_chain(), is_reassociable_op(), crc_symbolic_execution::is_used_outside_the_loop(), iv_elimination_compare(), loop_combined_static_and_iv_p(), loop_count_in(), loop_exit_edge_p(), loop_invariant_op_p(), loop_inverted_rev_post_order_compute(), loop_iter_phi_semi_invariant_p(), loop_rev_post_order_compute(), loop_static_op_p(), mark_irreducible_loops(), may_eliminate_iv(), tree_loop_interchange::move_code_to_inner_loop(), outermost_invariant_loop_for_expr(), parloops_is_simple_reduction(), parloops_is_slp_reduction(), crc_optimization::passes_checks_for_def_chain(), predict_loops(), predict_paths_for_bb(), record_invariant(), rename_variables_in_bb(), rescan_loop_exit(), scale_dominated_blocks_in_loop(), should_duplicate_loop_header_p(), single_use_in_loop(), slpeel_tree_duplicate_loop_to_edge_cfg(), ssa_name_has_uses_outside_loop_p(), ssa_semi_invariant_p(), crc_symbolic_execution::symb_execute_crc_loop(), tree_unswitch_loop(), try_create_reduction_list(), unroll_jam_possible_p(), unroll_loop_runtime_iterations(), used_outside_loop_p(), vect_create_epilog_for_reduction(), vect_do_peeling(), vect_is_simple_iv_evolution(), vect_is_simple_reduction(), vect_loop_dist_alias_call(), vect_loop_kill_debug_uses(), vect_loop_versioning(), vect_phi_first_order_recurrence_p(), vect_stmt_relevant_p(), vectorizable_early_exit(), vectorizable_induction(), vectorizable_live_operation(), and verify_loop_structure().
void flow_loop_dump | ( | const class loop * | loop, |
FILE * | file, | ||
void(* | loop_dump_aux )(const class loop *, FILE *, int), | ||
int | verbose ) |
Dump the loop information specified by LOOP to the stream FILE using auxiliary dump callback function LOOP_DUMP_AUX if non null.
References FOR_EACH_VEC_ELT, free(), get_loop_body(), get_loop_latch_edges(), loop::header, i, basic_block_def::index, loop::latch, loop_depth(), loop_outer(), loop::num, loop::num_nodes, print_loop_info(), and verbose.
Referenced by analyze_and_mark_doloop_use(), flow_loops_dump(), and tree_ssa_iv_optimize().
void flow_loop_free | ( | class loop * | loop | ) |
Free data allocated for LOOP.
References loop::exits, ggc_free(), loop_exit::next, loop_exit::prev, loop::superloops, and vec_free().
Referenced by delete_loop(), fix_loop_structure(), and flow_loops_free().
Return nonzero if the nodes of LOOP are a subset of OUTER.
References loop_depth(), and loop::superloops.
Referenced by add_dependency(), add_other_self_distances(), scev_dfs::add_to_evolution_1(), build_classic_dist_vector_1(), jt_path_registry::cancel_invalid_paths(), chrec_component_in_loop_num(), chrec_contains_symbols(), chrec_contains_symbols_defined_in_loop(), chrec_evaluate(), chrec_fold_multiply_poly_poly(), chrec_fold_plus_poly_poly(), compute_access_strides(), compute_live_loop_exits(), compute_overall_effect_of_inner_loop(), evolution_function_is_invariant_rec_p(), evolution_function_is_univariate_p(), find_exits(), find_ref_loc_in_loop_cmp(), fix_bb_placement(), fix_bb_placements(), fix_loop_placement(), flow_bb_inside_loop_p(), scev_dfs::follow_ssa_edge_expr(), forward_propagate_into(), get_coldest_out_loop(), hide_evolution_in_other_loops_than_loop(), instantiate_scev_name(), fwd_jt_path_registry::mark_threaded_blocks(), move_computations_worker(), ref_always_accessed::operator()(), optimize_mask_stores(), parloops_is_simple_reduction(), process_bb(), process_use(), remove_edge_and_dominated_blocks(), reset_evolution_in_loop(), set_level(), fwd_jt_path_registry::thread_block_1(), vect_do_peeling(), vect_enhance_data_refs_alignment(), vect_is_simple_reduction(), vect_loop_versioning(), vect_slp_function(), and vectorizable_live_operation().
int flow_loop_nodes_find | ( | basic_block | header, |
class loop * | loop ) |
Find the nodes contained within the LOOP with header HEADER. Return the number of nodes within the loop.
References CDI_DOMINATORS, dominated_by_p(), loop_exit::e, FOR_EACH_EDGE, header, loop::header, basic_block_def::loop_father, basic_block_def::preds, and vNULL.
Referenced by flow_loops_find().
Add LOOP to the loop hierarchy tree where FATHER is father of the added loop. If LOOP has some children, take care of that their pred field will be initialized correctly. If AFTER is non-null then it's expected it's a pointer into FATHERs inner sibling list and LOOP is added behind AFTER, otherwise it's added in front of FATHERs siblings.
References establish_preds(), loop::inner, and loop::next.
Referenced by add_loop(), copy_loops(), duplicate_loop(), fix_loop_placement(), fix_loop_structure(), flow_loops_find(), input_cfg(), merge_loop_tree(), move_sese_region_to_fn(), and unloop().
void flow_loop_tree_node_remove | ( | class loop * | loop | ) |
Remove LOOP from the loop hierarchy tree.
References loop::inner, loop_outer(), loop::next, NULL, and loop::superloops.
Referenced by add_loop(), delete_loop(), fix_loop_placement(), fix_loop_structure(), flow_loops_find(), merge_loop_tree(), move_sese_region_to_fn(), and unloop().
|
static |
Natural loop discovery code for GNU compiler. Copyright (C) 2000-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/>.
Dump loop related CFG information.
References cfun, FOR_EACH_BB_FN, FOR_EACH_EDGE, basic_block_def::index, and basic_block_def::succs.
Referenced by flow_loops_dump().
void flow_loops_dump | ( | FILE * | file, |
void(* | loop_dump_aux )(const class loop *, FILE *, int), | ||
int | verbose ) |
Dump the loop information about loops to the stream FILE, using auxiliary dump callback function LOOP_DUMP_AUX if non null.
References cfun, current_loops, flow_loop_dump(), flow_loops_cfg_dump(), LI_INCLUDE_ROOT, number_of_loops(), and verbose.
Referenced by analyze_function_body(), compute_alignments(), finite_function_p(), loop_optimizer_init(), and report_predictor_hitrates().
Find all the natural loops in the function and save in LOOPS structure and recalculate loop_father information in basic block structures. If LOOPS is non-NULL then the loop structures for already recorded loops will be re-used and their number will not change. We assume that no stale loops exist in LOOPS. When LOOPS is NULL it is allocated and re-built from scratch. Return the built LOOPS structure.
References alloc_loop(), b, BASIC_BLOCK_FOR_FN, bb_loop_header_p(), calculate_dominance_info(), CDI_DOMINATORS, cfun, dump_file, dump_flags, loops::exits, flow_bb_inside_loop_p(), flow_loop_nodes_find(), flow_loop_tree_node_add(), flow_loop_tree_node_remove(), FOR_EACH_EDGE, free(), gcc_assert, ggc_cleared_alloc(), header, loop::header, i, init_loops_structure(), loops::larray, loop::latch, n_basic_blocks_for_fn, NULL, loop::num, NUM_FIXED_BLOCKS, loop::num_nodes, pre_and_rev_post_order_compute(), TDF_DETAILS, loops::tree_root, and vec_safe_push().
Referenced by fix_loop_structure(), input_cfg(), and loop_optimizer_init().
void flow_loops_free | ( | struct loops * | loops | ) |
Free all the memory allocated for LOOPS.
References flow_loop_free(), FOR_EACH_VEC_SAFE_ELT, i, loops::larray, and vec_free().
Referenced by loop_optimizer_finalize().
Creates a subloop of LOOP with latch edge LATCH.
References hash_set< KeyId, Lazy, Traits >::add(), add_loop(), alloc_loop(), FOR_EACH_EDGE, loop::header, loop::latch, make_forwarder_block(), mfb_redirect_edges_in_set(), mfb_reis_set, NULL, and basic_block_def::preds.
Referenced by disambiguate_multiple_latches().
bool get_estimated_loop_iterations | ( | class loop * | loop, |
widest_int * | nit ) |
Sets NIT to the estimated number of executions of the latch of the LOOP. If we have no reliable estimate, the function returns false, otherwise returns true.
References loop::any_estimate, expected_loop_iterations_by_profile(), loop::nb_iterations_estimate, SIGNED, and sreal::to_nearest_int().
Referenced by decide_unroll_constant_iterations(), decide_unroll_runtime_iterations(), decide_unroll_stupid(), estimated_loop_iterations(), and get_estimated_loop_iterations_int().
HOST_WIDE_INT get_estimated_loop_iterations_int | ( | class loop * | loop | ) |
Similar to get_estimated_loop_iterations, but returns the estimate only if it fits to HOST_WIDE_INT. If this is not the case, or the estimate on the number of iterations of LOOP could not be derived, returns -1.
References wi::fits_shwi_p(), get_estimated_loop_iterations(), and generic_wide_int< storage >::to_shwi().
Referenced by doloop_optimize(), find_simple_exit(), and generic_predict_doloop_p().
Returns the list of records for E as an exit of a loop.
References current_loops, and loop_exit::e.
Referenced by verify_loop_structure().
bool get_likely_max_loop_iterations | ( | class loop * | loop, |
widest_int * | nit ) |
Sets NIT to an upper bound for the maximum number of executions of the latch of the LOOP. If we have no reliable estimate, the function returns false, otherwise returns true.
References loop::any_likely_upper_bound, loop::nb_iterations_likely_upper_bound, and SIGNED.
Referenced by decide_unroll_constant_iterations(), decide_unroll_runtime_iterations(), decide_unroll_stupid(), get_likely_max_loop_iterations_int(), and likely_max_loop_iterations().
HOST_WIDE_INT get_likely_max_loop_iterations_int | ( | class loop * | loop | ) |
Similar to get_max_loop_iterations, but returns the estimate only if it fits to HOST_WIDE_INT. If this is not the case, or the estimate on the number of iterations of LOOP could not be derived, returns -1.
References wi::fits_shwi_p(), get_likely_max_loop_iterations(), and generic_wide_int< storage >::to_shwi().
Referenced by doloop_optimize(), find_simple_exit(), generic_predict_doloop_p(), likely_max_stmt_executions_int(), parallelize_loops(), and scale_profile_for_vect_loop().
basic_block * get_loop_body | ( | const class loop * | loop | ) |
Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs order against direction of edges from latch. Specially, if header != latch, latch is the 1-st block.
References cfun, EXIT_BLOCK_PTR_FOR_FN, FOR_EACH_BB_FN, gcc_assert, get_loop_body_with_size(), loop::header, loop::latch, n_basic_blocks_for_fn, and loop::num_nodes.
Referenced by analyze_function_body(), analyze_insns_in_loop(), average_num_loop_insns(), can_duplicate_loop_p(), cancel_loop(), determine_reduction_stmt(), doloop_valid_p(), draw_cfg_nodes_for_loop(), estimate_loops_at_level(), estimate_numbers_of_iterations(), find_loop_guard(), find_simple_exit(), fix_bb_placements(), fix_loop_bb_probability(), flow_loop_dump(), free_rdg(), get_loop_body_in_custom_order(), get_loop_body_in_custom_order(), get_loop_exit_edges(), hoist_guard(), ifcvt_split_critical_edges(), init_loop_unswitch_info(), loop_has_phi_with_address_arg(), loop_nest_has_data_refs(), num_loop_branches(), num_loop_insns(), number_of_iterations_exit_assumptions(), optimize_mask_stores(), predict_loops(), referenced_in_one_insn_in_loop_p(), reset_debug_uses_in_loop(), scale_loop_frequencies(), set_uid_loop_bbs(), simplify_loop_version(), split_loop(), split_loop_on_cond(), tree_estimate_loop_size(), tree_num_loop_insns(), tree_ssa_iv_optimize_loop(), tree_unswitch_single_loop(), unloop(), unroll_loop_runtime_iterations(), update_dominators_in_loop(), update_epilogue_loop_vinfo(), vect_analyze_loop_form(), vect_do_peeling(), and verify_loop_closed_ssa().
basic_block * get_loop_body_in_bfs_order | ( | const class loop * | loop | ) |
Get body of a LOOP in breadth first sort order.
References bitmap_set_bit, cfun, EXIT_BLOCK_PTR_FOR_FN, flow_bb_inside_loop_p(), FOR_EACH_EDGE, gcc_assert, loop::header, i, basic_block_def::index, loop::latch, loop::num_nodes, basic_block_def::succs, and visited.
Referenced by draw_cfg_nodes_for_loop(), and get_loop_body_in_if_conv_order().
basic_block * get_loop_body_in_custom_order | ( | const class loop * | loop, |
int(* | bb_comparator )(const void *, const void *) ) |
Gets body of a LOOP sorted via provided BB_COMPARATOR.
References get_loop_body(), loop::num_nodes, and qsort.
Referenced by loop_distribution::stmts_from_loop().
basic_block * get_loop_body_in_custom_order | ( | const class loop * | loop, |
void * | data, | ||
int(* | bb_comparator )(const void *, const void *, void *) ) |
Same as above, but use gcc_sort_r instead of qsort.
References gcc_sort_r(), get_loop_body(), and loop::num_nodes.
basic_block * get_loop_body_in_dom_order | ( | const class loop * | loop | ) |
Gets body of a LOOP (that must be different from the outermost loop) sorted by dominance relation. Additionally, if a basic block s dominates the latch, then only blocks dominated by s are be after it.
References cfun, EXIT_BLOCK_PTR_FOR_FN, fill_sons_in_loop(), gcc_assert, loop::header, loop::latch, and loop::num_nodes.
Referenced by destroy_loop(), duplicate_loop_body_to_header_edge(), find_data_references_in_loop(), find_invariants(), find_seed_stmts_for_distribution(), gather_memory_references(), generate_loops_for_partition(), init_var_map(), loop_has_blocks_with_irreducible_flag(), loop_has_vector_phi_nodes(), crc_optimization::loop_may_calculate_crc(), loop_version(), oacc_entry_exit_ok(), rewrite_all_phi_nodes_with_iv(), transform_to_exit_first_loop(), and pcom_worker::try_combine_chains().
unsigned get_loop_body_with_size | ( | const class loop * | loop, |
basic_block * | body, | ||
unsigned | max_size ) |
Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs order against direction of edges from latch. Specially, if header != latch, latch is the 1-st block. LOOP cannot be the fake loop tree root, and its size must be at most MAX_SIZE. The blocks in the LOOP body are stored to BODY, and the size of the LOOP is returned.
References dfs_enumerate_from(), glb_enum_p(), and loop::header.
Referenced by add_loop(), get_loop_body(), merge_loop_tree(), slpeel_can_duplicate_loop_p(), slpeel_tree_duplicate_loop_to_edge_cfg(), unroll_jam_possible_p(), and verify_loop_structure().
auto_vec< edge > get_loop_exit_edges | ( | const class loop * | loop, |
basic_block * | body ) |
Returns the list of the exit edges of a LOOP.
References cfun, loop_exit::e, EXIT_BLOCK_PTR_FOR_FN, loop::exits, flow_bb_inside_loop_p(), FOR_EACH_EDGE, free(), gcc_assert, get_loop_body(), i, loop::latch, LOOPS_HAVE_RECORDED_EXITS, loops_state_satisfies_p(), loop_exit::next, and loop::num_nodes.
Referenced by analyze_function_body(), analyze_insns_in_loop(), canonicalize_loop_induction_variables(), clean_up_loop_closed_phi(), create_loop_tree_node_allocnos(), create_loop_tree_nodes(), duplicate_loop_body_to_header_edge(), emit_mfence_after_loop(), estimate_numbers_of_iterations(), find_loop_location(), find_loop_niter(), find_loop_niter_by_eval(), finite_loop_p(), fix_loop_placement(), ira_loop_edge_freq(), last_always_executed_block(), loop_edge_to_cancel(), loop_exit_for_scaling(), may_use_storent_in_loop_p(), move_early_exit_stmts(), predict_loops(), replace_loop_annotate(), slpeel_tree_duplicate_loop_to_edge_cfg(), store_motion_loop(), tree_if_conversion(), vec_init_loop_exit_info(), vect_analyze_loop_form(), vect_analyze_slp(), vect_do_peeling(), vect_get_loop_niters(), and vectorizable_live_operation().
Returns the list of the latch edges of LOOP.
References CDI_DOMINATORS, dominated_by_p(), FOR_EACH_EDGE, loop::header, basic_block_def::preds, and vNULL.
Referenced by find_subloop_latch_edge(), flow_loop_dump(), and merge_latch_edges().
dump_user_location_t get_loop_location | ( | class loop * | loop | ) |
Return location corresponding to the loop control condition if possible.
References current_function_decl, FOR_BB_INSNS, FOR_BB_INSNS_REVERSE, dump_user_location_t::from_function_decl(), get_simple_loop_desc(), loop::header, niter_desc::in_edge, INSN_HAS_LOCATION(), INSN_P, loop::latch, NULL, and single_exit().
Referenced by decide_unrolling().
bool get_max_loop_iterations | ( | const class loop * | loop, |
widest_int * | nit ) |
Sets NIT to an upper bound for the maximum number of executions of the latch of the LOOP. If we have no reliable estimate, the function returns false, otherwise returns true.
References loop::any_upper_bound, loop::nb_iterations_upper_bound, and SIGNED.
Referenced by doloop_modify(), doloop_optimize(), doloop_simplify_count(), get_max_loop_iterations_int(), iv_can_overflow_p(), loop_niters_no_overflow(), and max_loop_iterations().
HOST_WIDE_INT get_max_loop_iterations_int | ( | const class loop * | loop | ) |
Similar to get_max_loop_iterations, but returns the estimate only if it fits to HOST_WIDE_INT. If this is not the case, or the estimate on the number of iterations of LOOP could not be derived, returns -1.
References wi::fits_shwi_p(), get_max_loop_iterations(), and generic_wide_int< storage >::to_shwi().
Referenced by expected_loop_iterations_unbounded(), find_simple_exit(), max_stmt_executions_int(), and pcom_worker::tree_predictive_commoning_loop().
|
static |
Enumeration predicate for get_loop_body_with_size.
References CDI_DOMINATORS, dominated_by_p(), and loop::header.
Referenced by get_loop_body_with_size().
Initializes loops structure LOOPS, reserving place for NUM_LOOPS loops (including the root of the loop tree).
References alloc_loop(), ENTRY_BLOCK_PTR_FOR_FN, EXIT_BLOCK_PTR_FOR_FN, loop::header, loops::larray, loop::latch, n_basic_blocks_for_fn, loop::num_nodes, loops::tree_root, and vec_alloc().
Referenced by flow_loops_find(), init_lowered_empty_function(), input_cfg(), and move_sese_region_to_fn().
HOST_WIDE_INT likely_max_stmt_executions_int | ( | class loop * | loop | ) |
Returns an likely upper bound on the number of executions of statements in the LOOP. For statements before the loop exit, this exceeds the number of execution of the latch by one.
References get_likely_max_loop_iterations_int().
Referenced by avg_loop_niter(), vector_costs::compare_inside_loop_cost(), loop_prefetch_arrays(), vect_analyze_loop_costing(), and vect_need_peeling_or_partial_vectors_p().
bool loop_exit_edge_p | ( | const class loop * | loop, |
const_edge | e ) |
Returns true if E is an exit of LOOP.
References loop_exit::e, and flow_bb_inside_loop_p().
Referenced by bb_with_exit_edge_p(), build_region(), combine_blocks(), dfs_find_deadend(), discover_iteration_bound_by_body_walk(), do_hoist_insertion(), get_loop_hot_path(), if_convertible_loop_p(), loop_exits_from_bb_p(), loop_exits_to_bb_p(), make_forwarders_with_degenerate_phis(), mark_loop_exit_edges(), maybe_lower_iteration_bound(), predict_paths_for_bb(), remove_ctrl_stmt_and_useless_edges(), remove_dead_stmt(), remove_exits_and_undefined_stmts(), remove_redundant_iv_tests(), should_duplicate_loop_header_p(), static_loop_exit(), fwd_jt_path_registry::thread_block_1(), update_loop_exit_probability_scale_dom_bbs(), update_profile_after_ch(), vectorizable_live_operation(), and copy_prop::visit_phi().
bool loop_exits_from_bb_p | ( | class loop * | loop, |
basic_block | bb ) |
Returns true when BB has an outgoing edge exiting LOOP.
References loop_exit::e, FOR_EACH_EDGE, loop_exit_edge_p(), and basic_block_def::succs.
Referenced by do_while_loop_p(), replace_phi_edge_with_variable(), split_at_bb_p(), fwd_jt_path_registry::thread_block_1(), unroll_jam_possible_p(), and vect_analyze_loop_form().
bool loop_exits_to_bb_p | ( | class loop * | loop, |
basic_block | bb ) |
Returns true when BB has an incoming edge exiting LOOP.
References loop_exit::e, FOR_EACH_EDGE, loop_exit_edge_p(), and basic_block_def::preds.
Returns latch edge of LOOP.
References find_edge(), loop::header, and loop::latch.
Referenced by add_iv_candidate_for_biv(), analyze_and_compute_bitop_with_inv_effect(), analyze_and_compute_bitwise_induction_effect(), loop_cand::analyze_iloop_reduction_var(), loop_cand::analyze_oloop_reduction_var(), assign_calc_vals_to_header_phis(), connect_loop_phis(), constant_after_peeling(), create_iv(), create_parallel_loop(), create_preheader(), discover_iteration_bound_by_body_walk(), do_split_loop_on_cond(), duplicate_loop_body_to_header_edge(), easy_exit_values(), eliminate_temp_copies(), estimate_loops_at_level(), crc_optimization::execute(), pcom_worker::find_looparound_phi(), find_vdef_in_loop(), fuse_loops(), get_base_for(), ifcvt_local_dce(), initialize_root_vars(), initialize_root_vars_lm(), initialize_root_vars_store_elim_2(), is_cond_scalar_reduction(), crc_optimization::is_output_crc(), loop_iter_phi_semi_invariant_p(), loop_niter_by_eval(), mark_bivs(), maybe_lower_iteration_bound(), maybe_set_vectorized_backedge_value(), number_of_iterations_cltz(), number_of_iterations_cltz_complement(), number_of_iterations_popcount(), parloops_is_simple_reduction(), process_use(), slpeel_tree_duplicate_loop_to_edge_cfg(), split_loop(), crc_optimization::swap_crc_and_data_if_needed(), fwd_jt_path_registry::thread_through_loop_header(), tree_transform_and_unroll_loop(), unloop_loops(), unroll_loop_constant_iterations(), unroll_loop_runtime_iterations(), unroll_loop_stupid(), vect_analyze_slp(), vect_build_slp_instance(), vect_build_slp_tree_2(), vect_create_epilog_for_reduction(), vect_is_nonlinear_iv_evolution(), vect_is_simple_reduction(), vect_phi_first_order_recurrence_p(), vect_set_loop_control(), vectorizable_induction(), vectorizable_load(), vectorizable_nonlinear_induction(), vectorizable_recurr(), vectorizable_reduction(), and vectorizable_simd_clone_call().
Returns preheader edge of LOOP.
References cfun, loop_exit::e, ENTRY_BLOCK_PTR_FOR_FN, FOR_EACH_EDGE, gcc_assert, loop::header, loop::latch, loop_outer(), LOOPS_HAVE_PREHEADERS, LOOPS_MAY_HAVE_MULTIPLE_LATCHES, loops_state_satisfies_p(), basic_block_def::preds, and single_succ_edge().
Referenced by add_preheader_seq(), analyze_and_compute_bitop_with_inv_effect(), analyze_and_compute_bitwise_induction_effect(), loop_cand::analyze_carried_vars(), analyze_function_body(), loop_cand::analyze_iloop_reduction_var(), loop_cand::analyze_induction_var(), analyze_insns_in_loop(), loop_cand::analyze_oloop_reduction_var(), assign_calc_vals_to_header_phis(), assign_known_vals_to_header_phis(), assign_vals_to_header_phis(), bb_colder_than_loop_preheader(), block_before_loop(), build_region(), canonicalize_loop_ivs(), check_exit_phi(), compute_access_stride(), connect_loop_phis(), connect_loops(), constant_after_peeling(), copy_loop_before(), create_empty_loop_on_edge(), create_iv(), create_parallel_loop(), cse_and_gimplify_to_preheader(), destroy_loop(), determine_exit_conditions(), determine_loop_nest_reuse(), determine_value_range(), do_split_loop_on_cond(), doloop_modify(), execute_sm(), execute_sm_exit(), fill_coldest_and_hotter_out_loop(), find_bivs(), find_data_references_in_stmt(), find_invariants_bb(), pcom_worker::find_looparound_phi(), find_reduc_addr(), fix_loop_placements(), gen_parallel_loop(), generate_memcpy_builtin(), generate_memset_builtin(), generate_reduction_builtin_1(), get_base_for(), get_range_query(), get_vop_from_header(), hoist_guard(), hoist_memory_references(), ifcvt_can_hoist(), initialize_data_dependence_relation(), initialize_reductions(), initialize_root_vars(), initialize_root_vars_lm(), initialize_root_vars_store_elim_2(), insert_init_seqs(), vec_info::insert_seq_on_entry(), instantiate_parameters(), tree_loop_interchange::interchange_loops(), loop_niter_by_eval(), loop_rev_post_order_compute(), loop_version(), move_computations_worker(), move_invariant_reg(), number_of_iterations_cltz(), number_of_iterations_cltz_complement(), number_of_iterations_popcount(), parallelize_loops(), predict_loops(), pcom_worker::prepare_initializers_chain(), resolve_mixers(), rewrite_use_compare(), scale_profile_for_vect_loop(), simplify_using_initial_values(), slpeel_can_duplicate_loop_p(), slpeel_tree_duplicate_loop_to_edge_cfg(), slpeel_update_phi_nodes_for_guard1(), split_loop(), stmt_semi_invariant_p_1(), transform_to_exit_first_loop_alt(), tree_if_conversion(), tree_loop_unroll_and_jam(), tree_transform_and_unroll_loop(), tree_unroll_loops_completely(), try_peel_loop(), try_transform_to_exit_first_loop_alt(), try_unroll_loop_completely(), unloop(), unroll_loop_constant_iterations(), unroll_loop_runtime_iterations(), crc_optimization::validate_crc_and_data(), vect_analyze_loop_form(), vect_build_loop_niters(), vect_build_slp_tree_2(), vect_create_data_ref_ptr(), vect_create_epilog_for_reduction(), vect_do_peeling(), vect_emit_reduction_init_stmts(), vect_enhance_data_refs_alignment(), vect_gen_vector_loop_niters(), vect_get_external_def_edge(), vect_get_gather_scatter_ops(), vect_is_nonlinear_iv_evolution(), vect_loop_dist_alias_call(), vect_loop_vectorized_call(), vect_loop_versioning(), vect_phi_initial_value(), vect_prepare_for_masked_peels(), vect_set_loop_condition_normal(), vect_set_loop_control(), vect_setup_realignment(), vect_transform_cycle_phi(), vect_transform_loop(), vect_update_ivs_after_vectorizer(), vectorizable_induction(), vectorizable_load(), vectorizable_nonlinear_induction(), vectorizable_recurr(), and vectorizable_simd_clone_call().
void mark_loop_for_removal | ( | loop_p | loop | ) |
Marks LOOP for removal and sets LOOPS_NEED_FIXUP.
References loop::former_header, loop::header, loop::latch, LOOPS_NEED_FIXUP, loops_state_set(), and NULL.
Referenced by cleanup_empty_eh_merge_phis(), delete_basic_block(), duplicate_block(), back_jt_path_registry::duplicate_thread_path(), merge_blocks(), remove_edge_and_dominated_blocks(), sjlj_emit_dispatch_table(), and fwd_jt_path_registry::thread_through_loop_header().
HOST_WIDE_INT max_stmt_executions_int | ( | class loop * | loop | ) |
Returns an upper bound on the number of executions of statements in the LOOP. For statements before the loop exit, this exceeds the number of execution of the latch by one.
References get_max_loop_iterations_int().
Referenced by analyze_siv_subscript_cst_affine(), analyze_subscript_affine_affine(), compute_overlap_steps_for_affine_1_2(), and vect_known_niters_smaller_than_vf().
|
static |
Make all the latch edges of LOOP to go to a single forwarder block -- a new latch of LOOP.
References hash_set< KeyId, Lazy, Traits >::add(), dump_file, FOR_EACH_VEC_ELT, gcc_assert, get_loop_latch_edges(), loop::header, i, loop::latch, make_forwarder_block(), mfb_redirect_edges_in_set(), mfb_reis_set, NULL, and loop::num.
Referenced by disambiguate_multiple_latches().
References hash_set< KeyId, Lazy, Traits >::contains(), and mfb_reis_set.
Referenced by form_subloop(), and merge_latch_edges().
unsigned num_loop_branches | ( | const class loop * | loop | ) |
Counts the number of conditional branches inside LOOP.
References cfun, EDGE_COUNT, EXIT_BLOCK_PTR_FOR_FN, free(), gcc_assert, get_loop_body(), i, loop::latch, and loop::num_nodes.
Referenced by decide_unroll_stupid().
void record_loop_exits | ( | void | ) |
For each loop, record list of exit edges, and start maintaining these lists.
References cfun, hash_table< Descriptor, Lazy, Allocator >::create_ggc(), current_loops, FOR_EACH_BB_FN, FOR_EACH_EDGE, gcc_assert, LOOPS_HAVE_RECORDED_EXITS, loops_state_satisfies_p(), loops_state_set(), NULL, number_of_loops(), rescan_loop_exit(), and basic_block_def::succs.
Referenced by apply_loop_flags(), rewrite_into_loop_closed_ssa_1(), and tree_estimate_probability().
void record_niter_bound | ( | class loop * | loop, |
const widest_int & | i_bound, | ||
bool | realistic, | ||
bool | upper ) |
Records that every statement in LOOP is executed I_BOUND times. REALISTIC is true if I_BOUND is expected to be close to the real number of iterations. UPPER is true if we are sure the loop iterates at most I_BOUND times.
References loop::any_estimate, loop::any_likely_upper_bound, loop::any_upper_bound, wi::ltu_p(), wi::min_precision(), loop::nb_iterations_estimate, loop::nb_iterations_likely_upper_bound, loop::nb_iterations_upper_bound, and SIGNED.
Referenced by branch_prob(), canonicalize_loop_induction_variables(), discover_iteration_bound_by_body_walk(), estimate_numbers_of_iterations(), iv_number_of_iterations(), maybe_lower_iteration_bound(), record_estimate(), and vect_do_peeling().
void release_recorded_exits | ( | function * | fn | ) |
Releases lists of loop exits.
References hash_table< Descriptor, Lazy, Allocator >::empty(), loops::exits, gcc_assert, loops_for_fn(), LOOPS_HAVE_RECORDED_EXITS, loops_state_clear(), loops_state_satisfies_p(), and NULL.
Referenced by fix_loop_structure(), loop_optimizer_finalize(), loop_optimizer_init(), and rewrite_into_loop_closed_ssa_1().
void remove_bb_from_loops | ( | basic_block | bb | ) |
Remove basic block BB from loops.
References FOR_EACH_EDGE, FOR_EACH_VEC_SAFE_ELT, gcc_assert, i, basic_block_def::loop_father, NULL, loop::num_nodes, basic_block_def::preds, rescan_loop_exit(), basic_block_def::succs, and loop::superloops.
Referenced by add_loop(), cleanup_tree_cfg_noloop(), delete_basic_block(), expand_omp_for_generic(), fix_bb_placement(), loop_version(), make_forwarder_block(), merge_blocks(), merge_loop_tree(), and unloop().
Updates the lists of loop exits in that E appears. If REMOVED is true, E is being removed, and we just remove it from the lists of exits. If NEW_EDGE is true and E is not a loop exit, we do not try to remove it from loop exit lists.
References current_loops, loop::exits, find_common_loop(), flow_bb_inside_loop_p(), ggc_alloc(), loop_outer(), LOOPS_HAVE_RECORDED_EXITS, loops_state_satisfies_p(), loop_exit::next, loop_exit::next_e, NULL, loop_exit::prev, and loop_exit_hasher::remove().
Referenced by add_bb_to_loop(), add_loop(), create_edge_and_update_destination_phis(), create_parallel_loop(), destroy_loop(), back_jt_path_registry::duplicate_thread_path(), fix_loop_placement(), force_nonfallthru(), gimple_duplicate_sese_tail(), merge_blocks(), merge_loop_tree(), record_loop_exits(), redirect_edge_and_branch(), redirect_edge_and_branch_force(), remove_bb_from_loops(), remove_edge(), split_edge(), and tree_transform_and_unroll_loop().
Returns the single exit edge of LOOP, or NULL if LOOP has either no exit or more than one exit. If loops do not have the exits recorded, NULL is returned always.
References loop_exit::e, loop::exits, LOOPS_HAVE_RECORDED_EXITS, loops_state_satisfies_p(), loop_exit::next, and NULL.
Referenced by canonicalize_loop_induction_variables(), check_exit_phi(), combine_blocks(), compute_access_range(), connect_loops(), copy_loop_before(), create_bb_after_loop(), create_empty_loop_on_edge(), destroy_loop(), do_warn_aggressive_loop_optimizations(), easy_exit_values(), empty_bb_without_guard_p(), loop_distribution::execute(), final_value_replacement_loop(), finalize_eliminated_stores(), find_simple_exit(), find_single_drs(), gen_parallel_loop(), generate_loops_for_partition(), get_loop_exit_condition(), get_loop_location(), crc_optimization::get_output_phi(), hoist_guard(), crc_optimization::is_output_crc(), latch_dominated_by_data_ref(), crc_optimization::loop_calculates_crc(), loop_closed_phi_def(), loop_exit_for_scaling(), loop_only_exit_p(), tree_loop_interchange::move_code_to_inner_loop(), number_of_latch_executions(), patch_loop_exit(), prepare_perfect_loop_nest(), single_dom_exit(), single_likely_exit(), pcom_worker::split_data_refs_to_components(), split_loop(), crc_optimization::swap_crc_and_data_if_needed(), loop_distribution::transform_reduction_loop(), tree_if_conversion(), tree_loop_unroll_and_jam(), tree_unswitch_outer_loop(), unroll_jam_possible_p(), vect_analyze_loop_form(), vect_loop_versioning(), and versionable_outer_loop_p().
void sort_sibling_loops | ( | function * | fn | ) |
Sort sibling loops in RPO order.
References cfun, free(), i, loop::inner, last_basic_block_for_fn, LI_INCLUDE_ROOT, n_basic_blocks_for_fn, loop::next, NULL, NUM_FIXED_BLOCKS, pre_and_rev_post_order_compute_fn(), sort_sibling_loops_cmp(), and sort_sibling_loops_cmp_rpo.
|
static |
References loop::header, basic_block_def::index, and sort_sibling_loops_cmp_rpo.
Referenced by sort_sibling_loops().
Returns the loop such that LOOP is nested DEPTH (indexed from zero) loops within LOOP.
References gcc_assert, loop_depth(), and loop::superloops.
Referenced by analyze_scalar_evolution_1(), compute_access_strides(), compute_live_loop_exits(), determine_max_movement(), do_rpo_vn_1(), final_value_replacement_loop(), find_sibling_superloop(), find_unswitching_predicates_for_bb(), outermost_indep_loop(), outermost_invariant_loop(), outermost_invariant_loop_for_expr(), and vect_loop_versioning().
DEBUG_FUNCTION void verify_loop_structure | ( | void | ) |
Disable warnings about missing quoting in GCC diagnostics for the verification errors. Their format strings don't follow GCC diagnostic conventions and the calls are ultimately followed by a deliberate ICE triggered by a failed assertion.
Checks that information about loops is correct -- sizes of loops are all right -- results of get_loop_body really belong to the loop -- loop header have just single entry edge and single latch edge -- loop latches have only single successor that is header of their loop -- irreducible loops are correctly marked -- the cached loop depth and loop father of each bb is correct
References bb_loop_header_p(), bitmap_bit_p, bitmap_clear(), bitmap_set_bit, calculate_dominance_info(), CDI_DOMINATORS, cfun, current_loops, dom_info_available_p(), dominated_by_p(), loop_exit::e, EDGE_COUNT, ENTRY_BLOCK_PTR_FOR_FN, error(), EXIT_BLOCK_PTR_FOR_FN, loop::exits, find_edge(), find_released_ssa_name(), basic_block_def::flags, flow_bb_inside_loop_p(), FOR_EACH_BB_FN, FOR_EACH_EDGE, free(), free_dominance_info(), gcc_assert, get_exit_descriptions(), get_loop_body_with_size(), loop::header, i, basic_block_def::index, last_basic_block_for_fn, loop::latch, LI_FROM_INNERMOST, basic_block_def::loop_father, loop_outer(), LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS, LOOPS_HAVE_PREHEADERS, LOOPS_HAVE_RECORDED_EXITS, LOOPS_HAVE_SIMPLE_LATCHES, LOOPS_NEED_FIXUP, loops_state_satisfies_p(), mark_irreducible_loops(), n_basic_blocks_for_fn, loop::nb_iterations, loop_exit::next, loop_exit::next_e, NULL, loop::num, loop::num_nodes, number_of_loops(), basic_block_def::preds, single_succ(), single_succ_p(), basic_block_def::succs, verify_dominators(), visited, and walk_tree.
Referenced by checking_verify_loop_structure(), execute_function_todo(), expand_omp_target(), and expand_omp_taskreg().
Callback for make_forwarder_block. Returns true if the edge E is marked in the set MFB_REIS_SET.
Referenced by form_subloop(), merge_latch_edges(), and mfb_redirect_edges_in_set().
|
static |
qsort helper for sort_sibling_loops.
Referenced by sort_sibling_loops(), and sort_sibling_loops_cmp().