https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117922

--- Comment #30 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Philipp Tomsich <[email protected]>:

https://gcc.gnu.org/g:f7a75a1506d91fcc76890732a0f720952e01e8fa

commit r17-2301-gf7a75a1506d91fcc76890732a0f720952e01e8fa
Author: Konstantinos Eleftheriou <[email protected]>
Date:   Sat Jun 14 17:39:54 2025 +0200

    fold-mem-offsets: Convert from DF to RTL-SSA

    This patch converts the fold-mem-offsets pass from DF to RTL-SSA.
    Along with this conversion, the way the pass collects information was
    completely reworked.  Instead of visiting each instruction multiple
    times, this is now done only once.

    Most significant changes are:
    * The pass operates mainly on insn_info objects from RTL-SSA.
    * Single iteration over all nondebug INSNs for identification
      of fold-mem-roots.  Then walk of the fold-mem-roots' DEF-chain
      to collect foldable constants.
    * The class fold_mem_info holds vectors for the DEF-chain of
      the to-be-folded INSNs (fold_agnostic_insns, which don't need
      to be adjusted, and fold_insns, which need their constant to
      be set to zero).
    * Introduction of a single-USE mode, which only collects DEFs,
      that have a single USE and therefore are safe to transform
      (the fold-mem-root will be the final USE).  This mode is fast
      and will always run (unless disabled via -fno-fold-mem-offsets).
    * Introduction of a multi-USE mode, which allows DEFs to have
      multiple USEs, but all USEs must be part of any fold-mem-root's
      DEF-chain.  The analysis of all USEs is expensive and therefore,
      this mode is disabled for highly connected CFGs, unless
      -fexpensive-optimizations (enabled by default at -O2) forces it on.
      Note that multi-USE mode will miss some opportunities that the
      single-USE mode finds (e.g. multi-USE mode fails for
      fold-mem-offsets-3.c).

    The following testing was done:
    * Bootstrapped and regtested on aarch64-linux, x86-64-linux and
      arm-linux.
    * SPEC CPU tested on aarch64.

    A compile time analysis with
      `/bin/time -v ./install/usr/local/bin/gcc -O2 all.i`
    (all.i from PR117922) shows:
     * -fno-fold-mem-offsets:    1681 s (user time)
                                 23626232 kBytes (max resident set size)
     * -ffold-mem-offsets:       1849 s (user time)
                                 23625708 kBytes (max resident set size)

    Multi-USE mode (on by default at -O2 via -fexpensive-optimizations) does
    not have an impact on the duration or the memory footprint.

    gcc/ChangeLog:

            PR rtl-optimization/117922
            * fold-mem-offsets.cc (INCLUDE_ALGORITHM):  Added definition.
            (INCLUDE_FUNCTIONAL): Likewise.
            (class pass_fold_mem_offsets): Moved to bottom of file.
            (class change_info): New.
            (def_shadowed_by_cond_exec_p): New.
            (get_single_def_in_bb): Converted to RTL-SSA.
            (get_fold_mem_offset_root): Converted to RTL-SSA.
            (get_uses): Removed.
            (fold_offsets): Converted to RTL-SSA.
            (fold_offsets_value): New.
            (fold_offsets_1): Converted to RTL-SSA.
            (has_foldable_uses_p): Converted to RTL-SSA.
            (get_fold_mem_root): Removed.
            (insn_uses_not_in_bitmap): New.
            (drop_unsafe_candidates): New.
            (do_commit_offset): Converted to RTL-SSA.
            (do_analysis): Removed.
            (do_commit_insn): Converted to RTL-SSA.
            (do_fold_info_calculation): Removed.
            (sort_changes): New.
            (struct regno_changes): New.
            (sort_pairs): New.
            (do_check_validity): Removed.
            (get_last_def): New.
            (move_uses_to_prev_def): New.
            (compute_validity_closure): Removed.
            (change_in_vec_p): New.
            (cancel_changes_for_group): New.
            (find_keys_to_remove): New.
            (free_changes_info): New.
            (update_insns): New.
            (fold_mem_offsets_1): New.
            (pass_fold_mem_offsets::execute): Moved to bottom of file.
            (fold_mem_offsets): New.

    gcc/testsuite/ChangeLog:

            * g++.target/aarch64/fold-mem-offsets.C: New test.
            * gcc.target/aarch64/fold-mem-offsets.c: New test.

    Signed-off-by: Philipp Tomsich <[email protected]>

Reply via email to