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

--- Comment #13 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:6e2a2d445b15de103c966863183a326600475b20

commit r17-244-g6e2a2d445b15de103c966863183a326600475b20
Author: H.J. Lu <[email protected]>
Date:   Fri May 1 09:13:21 2026 +0800

    x86: Correct last_4x_vec_label in ix86_expand_movmem

    commit b41f96465190751561f6909e858604ceab00595b
    Author: H.J. Lu <[email protected]>

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

    has

          rtx_code_label *last_4x_vec_label = nullptr;
          if (min_size == 0 || min_size < 4 * move_max)
            last_4x_vec_label = gen_label_rtx ();

          /* Jump to LAST_4X_VEC_LABEL if size < 4 * MOVE_MAX.  */
          if (last_4x_vec_label)
            emit_cmp_and_jump_insns (count_exp, GEN_INT (4 * move_max), LTU,
                                     nullptr, count_mode, 1,
                                     last_4x_vec_label);

    ...

          if (last_4x_vec_label)
            {
              /* Size > 2 * MOVE_MAX and size <= 4 * MOVE_MAX.  */
              emit_label (last_4x_vec_label);

    The last_4x_vec_label block covers min_size <= 4 * MOVE_MAX, not
    min_size < 4 * MOVE_MAX.  When MOVE_MAX == 16 bytes and min_size == 64,
    the last_4x_vec_label isn't generated.  Change min_size < 4 * move_max
    to min_size <= 4 * move_max to correct the last_4x_vec_label condition.

    Tested on Linux/x86-64.

    gcc/

            PR target/125117
            * config/i386/i386-expand.cc (ix86_expand_movmem): Generate
            last_4x_vec_label when min_size <= 4 * MOVE_MAX.

    gcc/testsuite/

            PR target/125117
            * gcc.dg/pr125117.c: New test.
            * gfortran.dg/pr125117.f90: Likewise.
            * gcc.target/i386/builtin-memmove-10.c: Updated.
            * gcc.target/i386/builtin-memmove-15.c: Likewise.
            * gcc.target/i386/builtin-memmove-2a.c: Likewise.
            * gcc.target/i386/builtin-memmove-2b.c: Likewise.
            * gcc.target/i386/builtin-memmove-2c.c: Likewise.
            * gcc.target/i386/builtin-memmove-2d.c: Likewise.
            * gcc.target/i386/builtin-memmove-3a.c: Likewise.
            * gcc.target/i386/builtin-memmove-3b.c: Likewise.
            * gcc.target/i386/builtin-memmove-3c.c: Likewise.
            * gcc.target/i386/builtin-memmove-4a.c: Likewise.
            * gcc.target/i386/builtin-memmove-4b.c: Likewise.
            * gcc.target/i386/builtin-memmove-4c.c: Likewise.
            * gcc.target/i386/builtin-memmove-5b.c: Likewise.
            * gcc.target/i386/builtin-memmove-5c.c: Likewise.

    Signed-off-by: H.J. Lu <[email protected]>

Reply via email to