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]>
