From 500305a92ef85e6b87ad428a35221c62f4037b93 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 23 Apr 2021 11:16:52 +0200 Subject: tree-optimization/100222 - remove redundant mark_irreducible_loops calls loop_optimizer_init (LOOPS_NORMAL) already performs this (quite expensive) marking. 2021-04-23 Richard Biener PR tree-optimization/100222 * predict.c (pass_profile::execute): Remove redundant call to mark_irreducible_loops. (report_predictor_hitrates): Likewise. --- gcc/predict.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'gcc/predict.c') diff --git a/gcc/predict.c b/gcc/predict.c index d0a8e5f8..dc2327d 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -4096,8 +4096,6 @@ pass_profile::execute (function *fun) if (dump_file && (dump_flags & TDF_DETAILS)) flow_loops_dump (dump_file, NULL, 0); - mark_irreducible_loops (); - nb_loops = number_of_loops (fun); if (nb_loops > 1) scev_initialize (); @@ -4320,8 +4318,6 @@ report_predictor_hitrates (void) if (dump_file && (dump_flags & TDF_DETAILS)) flow_loops_dump (dump_file, NULL, 0); - mark_irreducible_loops (); - nb_loops = number_of_loops (cfun); if (nb_loops > 1) scev_initialize (); -- cgit v1.1 From 58ad6b2802592f1448eed48e8ad4e0e87985cecb Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 25 Feb 2021 11:31:37 +0100 Subject: First do add_noreturn_fake_exit_edges in connect_infinite_loops_to_exit Most callers of connect_infinite_loops_to_exit already do this but the few that do not end up with extra exit edges. The following makes that consistent, also matching the post-dominance DFS walk code. 2021-02-25 Richard Biener * cfganal.c (connect_infinite_loops_to_exit): First call add_noreturn_fake_exit_edges. * ipa-sra.c (process_scan_results): Do not call the now redundant add_noreturn_fake_exit_edges. * predict.c (tree_estimate_probability): Likewise. (rebuild_frequencies): Likewise. * store-motion.c (one_store_motion_pass): Likewise. --- gcc/predict.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'gcc/predict.c') diff --git a/gcc/predict.c b/gcc/predict.c index dc2327d..5d0cae5 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -3106,7 +3106,6 @@ tree_estimate_probability (bool dry_run) { basic_block bb; - add_noreturn_fake_exit_edges (); connect_infinite_loops_to_exit (); /* We use loop_niter_by_eval, which requires that the loops have preheaders. */ @@ -4289,7 +4288,6 @@ rebuild_frequencies (void) if (profile_status_for_fn (cfun) == PROFILE_GUESSED) { loop_optimizer_init (0); - add_noreturn_fake_exit_edges (); mark_irreducible_loops (); connect_infinite_loops_to_exit (); estimate_bb_frequencies (true); -- cgit v1.1 From dfef1164b1c8d0b7abdf302f94d4be99a75ca791 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 14 Jun 2021 15:36:57 +0200 Subject: Handle multiple latches in irreducible region mark The following makes irreducible region discovery handle multiple latches. 2021-06-14 Richard Biener * cfgloopanal.c (mark_irreducible_loops): Use a dominance check to identify loop latches. * cfgloop.c (verify_loop_structure): Likewise. * loop-init.c (apply_loop_flags): Allow marked irreducible regions even with multiple latches. * predict.c (rebuild_frequencies): Simplify. --- gcc/predict.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'gcc/predict.c') diff --git a/gcc/predict.c b/gcc/predict.c index 5d0cae5..d751e6c 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -4287,8 +4287,7 @@ rebuild_frequencies (void) if (profile_status_for_fn (cfun) == PROFILE_GUESSED) { - loop_optimizer_init (0); - mark_irreducible_loops (); + loop_optimizer_init (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS); connect_infinite_loops_to_exit (); estimate_bb_frequencies (true); remove_fake_exit_edges (); -- cgit v1.1 From e41ba804ba5f5ca433e09238d561b1b4c8b10985 Mon Sep 17 00:00:00 2001 From: Kewen Lin Date: Thu, 29 Jul 2021 22:26:25 -0500 Subject: Use range-based for loops for traversing loops This patch follows Martin's suggestion here[1], to support range based loop for iterating loops, analogously to the patch for vec[2]. For example, use below range-based for loop for (auto loop : loops_list (cfun, 0)) to replace the previous macro FOR_EACH_LOOP FOR_EACH_LOOP (loop, 0) [1] https://gcc.gnu.org/pipermail/gcc-patches/2021-June/573424.html [2] https://gcc.gnu.org/pipermail/gcc-patches/2021-June/572315.html gcc/ChangeLog: * cfgloop.h (as_const): New function. (class loop_iterator): Rename to ... (class loops_list): ... this. (loop_iterator::next): Rename to ... (loops_list::Iter::fill_curr_loop): ... this and adjust. (loop_iterator::loop_iterator): Rename to ... (loops_list::loops_list): ... this and adjust. (loops_list::Iter): New class. (loops_list::iterator): New type. (loops_list::const_iterator): New type. (loops_list::begin): New function. (loops_list::end): Likewise. (loops_list::begin const): Likewise. (loops_list::end const): Likewise. (FOR_EACH_LOOP): Remove. (FOR_EACH_LOOP_FN): Remove. * cfgloop.c (flow_loops_dump): Adjust FOR_EACH_LOOP* with range-based for loop with loops_list instance. (sort_sibling_loops): Likewise. (disambiguate_loops_with_multiple_latches): Likewise. (verify_loop_structure): Likewise. * cfgloopmanip.c (create_preheaders): Likewise. (force_single_succ_latches): Likewise. * config/aarch64/falkor-tag-collision-avoidance.c (execute_tag_collision_avoidance): Likewise. * config/mn10300/mn10300.c (mn10300_scan_for_setlb_lcc): Likewise. * config/s390/s390.c (s390_adjust_loops): Likewise. * doc/loop.texi: Likewise. * gimple-loop-interchange.cc (pass_linterchange::execute): Likewise. * gimple-loop-jam.c (tree_loop_unroll_and_jam): Likewise. * gimple-loop-versioning.cc (loop_versioning::analyze_blocks): Likewise. (loop_versioning::make_versioning_decisions): Likewise. * gimple-ssa-split-paths.c (split_paths): Likewise. * graphite-isl-ast-to-gimple.c (graphite_regenerate_ast_isl): Likewise. * graphite.c (canonicalize_loop_form): Likewise. (graphite_transform_loops): Likewise. * ipa-fnsummary.c (analyze_function_body): Likewise. * ipa-pure-const.c (analyze_function): Likewise. * loop-doloop.c (doloop_optimize_loops): Likewise. * loop-init.c (loop_optimizer_finalize): Likewise. (fix_loop_structure): Likewise. * loop-invariant.c (calculate_loop_reg_pressure): Likewise. (move_loop_invariants): Likewise. * loop-unroll.c (decide_unrolling): Likewise. (unroll_loops): Likewise. * modulo-sched.c (sms_schedule): Likewise. * predict.c (predict_loops): Likewise. (pass_profile::execute): Likewise. * profile.c (branch_prob): Likewise. * sel-sched-ir.c (sel_finish_pipelining): Likewise. (sel_find_rgns): Likewise. * tree-cfg.c (replace_loop_annotate): Likewise. (replace_uses_by): Likewise. (move_sese_region_to_fn): Likewise. * tree-if-conv.c (pass_if_conversion::execute): Likewise. * tree-loop-distribution.c (loop_distribution::execute): Likewise. * tree-parloops.c (parallelize_loops): Likewise. * tree-predcom.c (tree_predictive_commoning): Likewise. * tree-scalar-evolution.c (scev_initialize): Likewise. (scev_reset): Likewise. * tree-ssa-dce.c (find_obviously_necessary_stmts): Likewise. * tree-ssa-live.c (remove_unused_locals): Likewise. * tree-ssa-loop-ch.c (ch_base::copy_headers): Likewise. * tree-ssa-loop-im.c (analyze_memory_references): Likewise. (tree_ssa_lim_initialize): Likewise. * tree-ssa-loop-ivcanon.c (canonicalize_induction_variables): Likewise. * tree-ssa-loop-ivopts.c (tree_ssa_iv_optimize): Likewise. * tree-ssa-loop-manip.c (get_loops_exits): Likewise. * tree-ssa-loop-niter.c (estimate_numbers_of_iterations): Likewise. (free_numbers_of_iterations_estimates): Likewise. * tree-ssa-loop-prefetch.c (tree_ssa_prefetch_arrays): Likewise. * tree-ssa-loop-split.c (tree_ssa_split_loops): Likewise. * tree-ssa-loop-unswitch.c (tree_ssa_unswitch_loops): Likewise. * tree-ssa-loop.c (gate_oacc_kernels): Likewise. (pass_scev_cprop::execute): Likewise. * tree-ssa-propagate.c (clean_up_loop_closed_phi): Likewise. * tree-ssa-sccvn.c (do_rpo_vn): Likewise. * tree-ssa-threadupdate.c (jump_thread_path_registry::thread_through_all_blocks): Likewise. * tree-vectorizer.c (vectorize_loops): Likewise. * tree-vrp.c (vrp_asserts::find_assert_locations): Likewise. --- gcc/predict.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'gcc/predict.c') diff --git a/gcc/predict.c b/gcc/predict.c index d751e6c..d9c7249 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -1949,7 +1949,7 @@ predict_loops (void) /* Try to predict out blocks in a loop that are not part of a natural loop. */ - FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) + for (auto loop : loops_list (cfun, LI_FROM_INNERMOST)) { basic_block bb, *bbs; unsigned j, n_exits = 0; @@ -4111,8 +4111,7 @@ pass_profile::execute (function *fun) profile_status_for_fn (fun) = PROFILE_GUESSED; if (dump_file && (dump_flags & TDF_DETAILS)) { - class loop *loop; - FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) + for (auto loop : loops_list (cfun, LI_FROM_INNERMOST)) if (loop->header->count.initialized_p ()) fprintf (dump_file, "Loop got predicted %d to iterate %i times.\n", loop->num, -- cgit v1.1