https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113441
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Target Milestone|--- |13.3 Summary|[14 Regression] Fail to |[13/14 Regression] Fail to |fold the last element with |fold the last element with |multiple loop |multiple loop --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- It might be t.c:29:22: missed: Data access with gaps requires scalar epilogue loop required when vectorizing the load groups. We end up with t.c:29:22: note: === vect_analyze_data_ref_accesses === t.c:29:22: note: Detected single element interleaving array1[0][_8] step 4 t.c:29:22: note: Detected single element interleaving array1[1][_8] step 4 t.c:29:22: note: Detected single element interleaving array1[2][_8] step 4 t.c:29:22: note: Detected single element interleaving array1[3][_8] step 4 t.c:29:22: note: Detected single element interleaving array1[0][_1] step 4 t.c:29:22: note: Detected single element interleaving array1[1][_1] step 4 t.c:29:22: note: Detected single element interleaving array1[2][_1] step 4 t.c:29:22: note: Detected single element interleaving array1[3][_1] step 4 t.c:29:22: missed: not consecutive access array2[_4][_8] = _69; t.c:29:22: note: using strided accesses t.c:29:22: missed: not consecutive access array2[_4][_1] = _67; t.c:29:22: note: using strided accesses it's better to use signed 'm' (or uint64_t I guess), then we get t.c:29:22: note: === vect_analyze_data_ref_accesses === t.c:29:22: note: Detected interleaving load array1[0][_1] and array1[0][_8] t.c:29:22: note: Detected interleaving load array1[1][_1] and array1[1][_8] t.c:29:22: note: Detected interleaving load array1[2][_1] and array1[2][_8] t.c:29:22: note: Detected interleaving load array1[3][_1] and array1[3][_8] t.c:29:22: note: Detected interleaving store array2[_4][_1] and array2[_4][_8] t.c:29:22: note: Detected interleaving load of size 2 t.c:29:22: note: _2 = array1[0][_1]; t.c:29:22: note: _9 = array1[0][_8]; t.c:29:22: note: Detected interleaving load of size 2 t.c:29:22: note: _18 = array1[1][_1]; t.c:29:22: note: _23 = array1[1][_8]; t.c:29:22: note: Detected interleaving load of size 2 t.c:29:22: note: _32 = array1[2][_1]; t.c:29:22: note: _37 = array1[2][_8]; t.c:29:22: note: Detected interleaving load of size 2 t.c:29:22: note: _46 = array1[3][_1]; t.c:29:22: note: _51 = array1[3][_8]; t.c:29:22: note: Detected interleaving store of size 2 t.c:29:22: note: array2[_4][_1] = _67; t.c:29:22: note: array2[_4][_8] = _69; and no gap peeling required. I guess you say GCC 13 is bad as well?