On Thu, Feb 3, 2022 at 11:52 AM Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > After the fix for PR102659, the vectoriser can no longer group > conditional accesses of the form: > > for (int i = 0; i < n; ++i) > if (...) > ...a[i * 2] + a[i * 2 + 1]...; > > on LP64 targets. It has to treat them as two independent > gathers instead.
Hmm, that's unfortunate. Can you file an enhancement bugreport? How does using intptr_t help? i * 2 can still overflow with large n, so can it with 'int' on ILP32. So I guess this is the old issue of transforming (uint64)(i * 2 + 1) to (uint64)(i*2) + 1UL? > This was causing failures in the sve mask_struct*.c tests. > The tests weren't really testing that int iterators could > be used, so this patch switches to pointer-sized iterators > instead. > > Tested on aarch64-linux-gnu & pushed. > > Richard > > > gcc/testsuite/ > * gcc.target/aarch64/sve/mask_struct_load_1.c: Use intptr_t > iterators instead of int iterators. > * gcc.target/aarch64/sve/mask_struct_load_2.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_load_3.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_load_4.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_load_5.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_load_6.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_load_7.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_load_8.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_store_1.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_store_2.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_store_3.c: Likewise. > * gcc.target/aarch64/sve/mask_struct_store_4.c: Likewise. > --- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_5.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_6.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_7.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_8.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_3.c | 4 ++-- > gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_4.c | 6 +++--- > 12 files changed, 25 insertions(+), 25 deletions(-) > > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c > index 03b2b93df07..450fbb887e3 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_2 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > if (cond[i]) \ > dest[i] = src[i * 2] + src[i * 2 + 1]; \ > } > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c > index 87ac3178be0..499abd7c99a 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_3 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > if (cond[i]) \ > dest[i] = (src[i * 3] \ > + src[i * 3 + 1] \ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c > index 54806f93ad9..a5ce0716322 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_4 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > if (cond[i]) \ > dest[i] = (src[i * 4] \ > + src[i * 4 + 1] \ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c > index 4c73004f68d..bdfea964f88 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_3 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > if (cond[i]) \ > dest[i] = src[i * 3] + src[i * 3 + 2]; \ > } > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_5.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_5.c > index 2a33ee81d1a..299955a8a93 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_5.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_5.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_4 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > if (cond[i]) \ > dest[i] = src[i * 4] + src[i * 4 + 3]; \ > } > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_6.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_6.c > index d4542eca0f7..999c7b52422 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_6.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_6.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_2 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > if (cond[i]) \ > dest[i] = src[i * 2]; \ > } > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_7.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_7.c > index 9d26e15c0d9..57d71ed460a 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_7.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_7.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_3 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > if (cond[i]) \ > dest[i] = src[i * 3] + src[i * 3 + 1]; \ > } > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_8.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_8.c > index 17fd4c0a079..1ead3ba695e 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_8.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_8.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_4 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > if (cond[i]) \ > dest[i] = src[i * 4] + src[i * 4 + 2]; \ > } > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c > index a75a694f9c3..39fae68a5d0 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_2 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, INTYPE bias, int n) \ > + MASKTYPE *__restrict cond, INTYPE bias, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > { \ > INTYPE value = src[i] + bias; \ > if (cond[i]) \ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c > index 0fd35f2ff52..0fe9b993402 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_3 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, INTYPE bias, int n) \ > + MASKTYPE *__restrict cond, INTYPE bias, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > { \ > INTYPE value = src[i] + bias; \ > if (cond[i]) \ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_3.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_3.c > index 1765d54a483..a9430870eee 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_3.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_3.c > @@ -6,9 +6,9 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_4 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, INTYPE bias, int n) \ > + MASKTYPE *__restrict cond, INTYPE bias, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > { \ > INTYPE value = src[i] + bias; \ > if (cond[i]) \ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_4.c > b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_4.c > index 59e9ee49c4a..d3f0216406d 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_4.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_4.c > @@ -6,15 +6,15 @@ > #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE) \ > void __attribute__ ((noinline, noclone)) \ > NAME##_2 (OUTTYPE *__restrict dest, INTYPE *__restrict src, \ > - MASKTYPE *__restrict cond, int n) \ > + MASKTYPE *__restrict cond, intptr_t n) \ > { \ > - for (int i = 0; i < n; ++i) \ > + for (intptr_t i = 0; i < n; ++i) \ > { \ > if (cond[i] < 8) \ > dest[i * 2] = src[i]; \ > if (cond[i] > 2) \ > dest[i * 2 + 1] = src[i]; \ > - } \ > + } \ > } > > #define TEST2(NAME, OUTTYPE, INTYPE) \ > -- > 2.25.1 >