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

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

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

commit r17-1927-gb64fc298a3538c3d7d85ca05fef822acba23e4a1
Author: H.J. Lu <[email protected]>
Date:   Wed Jun 17 17:32:21 2026 +0800

    x86-64: Expand bounded memset and memcpy like memmove

    commit 401199377c50045ede560daf3f6e8b51749c2a87
    Author: H.J. Lu <[email protected]>
    Date:   Tue Jun 17 10:17:17 2025 +0800

        x86: Improve vector_loop/unrolled_loop for memset/memcpy

    uses move_by_pieces and store_by_pieces for memcpy and memset epilogues
    with the fixed epilogue size.  Since move_by_pieces and store_by_pieces
    don't use the maximum size info, they generate extra branches and moves
    for bounded memcpy and memset.  Commit

    commit b41f96465190751561f6909e858604ceab00595b
    Author: H.J. Lu <[email protected]>
    Date:   Mon Oct 20 16:14:34 2025 +0800

    x86-64: Inline memmove with overlapping unaligned loads and stores.

    inlines memmove with overlapping unaligned and stores which reduces the
    numbers of branches as well as moves when the maximum size is known.
    Rename ix86_expand_movmem to ix86_expand_set_or_movmem and extend it to
    inline bounded memcpy and memset.  Update ix86_expand_set_or_cpymem to
    call ix86_expand_set_or_movmem for bounded memset and memcpy as memmove
    if misaligned moves are preferred.

    In addition to reduce 727.cppcheck_r O2 code size by ~9%, there're
    another ~8 benchmarks whose code sizes are reduced >2% across spec2026
    and spec2017 with march=x86-64-v3 O2, no big code size impact for Ofast,
    performance impact is negligible(slightly better, but all under noise
    range) for both O2 and Ofast.

    gcc/

            PR target/125856
            PR target/125865
            * config/i386/i386-expand.cc (ix86_expand_set_or_cpymem):
            Call ix86_expand_set_or_movmem for
            TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES.
            (ix86_expand_memset_val): New.
            (ix86_expand_n_move_movmem): Renamed to ...
            (ix86_expand_n_move_set_or_movmem): This.  Add a pointer to rtx
            argument for memset.  Also expand memset.
            (ix86_expand_n_overlapping_move_movmem): Renamed to ...
            (ix86_expand_n_overlapping_move_set_or_movmem): This.  Add a
            pointer to rtx argument for memset.  Also expand memset.
            (ix86_expand_less_move_movmem): Renamed to ...
            (ix86_expand_less_move_set_or_movmem): This.  Add a pointer to
            rtx argument for memset.  Also expand memset.
            (ix86_expand_movmem): Renamed to ...
            (ix86_expand_set_or_movmem): This.  Add bool arguments for memcpy
            and memset.  Also expand memcpy and memset.
            * config/i386/i386-protos.h (ix86_expand_movmem): Renamed to ...
            (ix86_expand_set_or_movmem): This.  Add bool arguments for memcpy
            and memset.
            * config/i386/i386.md (movmem<mode>): Replace ix86_expand_movmem
            with ix86_expand_set_or_movmem.

    gcc/testsuite/

            PR target/125856
            PR target/125865
            * gcc.target/i386/builtin-memcpy-1a.c: New test.
            * gcc.target/i386/builtin-memcpy-1b.c: Likewise.
            * gcc.target/i386/builtin-memcpy-2a.c: Likewise.
            * gcc.target/i386/builtin-memcpy-2b.c: Likewise.
            * gcc.target/i386/builtin-memcpy-2c.c: Likewise.
            * gcc.target/i386/builtin-memcpy-3a.c: Likewise.
            * gcc.target/i386/builtin-memcpy-3b.c: Likewise.
            * gcc.target/i386/builtin-memcpy-3c.c: Likewise.
            * gcc.target/i386/builtin-memcpy-4a.c: Likewise.
            * gcc.target/i386/builtin-memcpy-4b.c: Likewise.
            * gcc.target/i386/builtin-memcpy-4c.c: Likewise.
            * gcc.target/i386/builtin-memcpy-5a.c: Likewise.
            * gcc.target/i386/builtin-memcpy-5b.c: Likewise.
            * gcc.target/i386/builtin-memcpy-5c.c: Likewise.
            * gcc.target/i386/builtin-memcpy-6.c: Likewise.
            * gcc.target/i386/builtin-memcpy-bounded-1a.c: Likewise.
            * gcc.target/i386/builtin-memcpy-bounded-1b.c: Likewise.
            * gcc.target/i386/builtin-memset-1a.c: Likewise.
            * gcc.target/i386/builtin-memset-1b.c: Likewise.
            * gcc.target/i386/builtin-memset-2a.c: Likewise.
            * gcc.target/i386/builtin-memset-2b.c: Likewise.
            * gcc.target/i386/builtin-memset-2c.c: Likewise.
            * gcc.target/i386/builtin-memset-3a.c: Likewise.
            * gcc.target/i386/builtin-memset-3b.c: Likewise.
            * gcc.target/i386/builtin-memset-3c.c: Likewise.
            * gcc.target/i386/builtin-memset-4a.c: Likewise.
            * gcc.target/i386/builtin-memset-4b.c: Likewise.
            * gcc.target/i386/builtin-memset-4c.c: Likewise.
            * gcc.target/i386/builtin-memset-5a.c: Likewise.
            * gcc.target/i386/builtin-memset-5b.c: Likewise.
            * gcc.target/i386/builtin-memset-5c.c: Likewise.
            * gcc.target/i386/builtin-memset-6a.c: Likewise.
            * gcc.target/i386/builtin-memset-6b.c: Likewise.
            * gcc.target/i386/builtin-memset-6c.c: Likewise.
            * gcc.target/i386/builtin-memset-7a.c: Likewise.
            * gcc.target/i386/builtin-memset-7b.c: Likewise.
            * gcc.target/i386/builtin-memset-7c.c: Likewise.
            * gcc.target/i386/builtin-memset-8.c: Likewise.
            * gcc.target/i386/builtin-memset-bounded-1a.c: Likewise.
            * gcc.target/i386/builtin-memset-bounded-1b.c: Likewise.

    Co-Authored-By: Hongtao Liu <[email protected]>
    Signed-off-by: H.J. Lu <[email protected]>

Reply via email to