On Tue, Jul 20, 2021 at 4:37 PM Kewen.Lin <li...@linux.ibm.com> wrote: > > Hi, > > This v2 has addressed some review comments/suggestions: > > - Use "!=" instead of "<" in function operator!= (const Iter &rhs) > - Add new CTOR loops_list (struct loops *loops, unsigned flags) > to support loop hierarchy tree rather than just a function, > and adjust to use loops* accordingly.
I actually meant struct loop *, not struct loops * ;) At the point we pondered to make loop invariant motion work on single loop nests we gave up not only but also because it iterates over the loop nest but all the iterators only ever can process all loops, not say, all loops inside a specific 'loop' (and including that 'loop' if LI_INCLUDE_ROOT). So the CTOR would take the 'root' of the loop tree as argument. I see that doesn't trivially fit how loops_list works, at least not for LI_ONLY_INNERMOST. But I guess FROM_INNERMOST could be adjusted to do ONLY_INNERMOST as well? > - Make implicit 'cfun' become explicit. > - Get rid of macros ALL_LOOPS*, use loops_list instance. > - Add const_iterator type begin()/end(). > - Use class loop* instead of loop_p in range-based for. > > Bootstrapped and regtested again on powerpc64le-linux-gnu P9, > x86_64-redhat-linux and aarch64-linux-gnu, also > bootstrapped again on ppc64le P9 with bootstrap-O3 config. > > Does it look better? Is it ok for trunk? > > BR, > Kewen > ----- > 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.