https://gcc.gnu.org/g:b0fcf6cab6b44d916992f17297d7c248d64469dc
commit r17-4388-gb0fcf6cab6b44d916992f17297d7c248d64469dc Author: Richard Biener <[email protected]> Date: Thu Sep 17 11:24:41 2026 +0200 tree-optimization/127407 - negative step dependence of grouped stores The following adds a missed check for preserving scalar oder of stores to the negative distance case in the vectorizers dependence analysis. PR tree-optimization/127407 * tree-vect-data-refs.cc (vect_analyze_data_ref_dependence): Also call vect_preserves_scalar_order_p for negative dependence distance. * gcc.dg/vect/vect-pr127407.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/vect/vect-pr127407.c | 29 +++++++++++++++++++++++++++++ gcc/tree-vect-data-refs.cc | 3 +++ 2 files changed, 32 insertions(+) diff --git a/gcc/testsuite/gcc.dg/vect/vect-pr127407.c b/gcc/testsuite/gcc.dg/vect/vect-pr127407.c new file mode 100644 index 000000000000..704a631be8b4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-pr127407.c @@ -0,0 +1,29 @@ +#include "tree-vect.h" + +__attribute__ ((noipa)) void +f (int *px, int n) +{ + int i; + for (i = 0; i < n; i++, px += 2) + { + px[0] = i; + px[-2] = i + 100; + px[1] = 7; + } +} + +int a[256]; + +int +main (void) +{ + check_vect (); + + f (a + 2, 64); + + for (int k = 1; k < 64; k++) + if (a[2 * k] != k + 100) + __builtin_abort (); + + return 0; +} diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc index 827e0965d9c7..23235875fa21 100644 --- a/gcc/tree-vect-data-refs.cc +++ b/gcc/tree-vect-data-refs.cc @@ -465,6 +465,9 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr, "between data-refs %T and %T\n", DR_REF (dra), DR_REF (drb)); } + if (!vect_preserves_scalar_order_p (dr_info_a, dr_info_b)) + return opt_result::failure_at (stmtinfo_a->stmt, + "dependence in interleaving.\n"); /* Record a negative dependence distance to later limit the amount of stmt copying / unrolling we can perform. Only need to handle read-after-write dependence. */
