diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 5eda9e80bd0..f878721f13c 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -20275,10 +20275,11 @@ aarch64_vectorize_preferred_vector_alignment (const_tree type) { if (aarch64_sve_data_mode_p (TYPE_MODE (type))) { - /* If the length of the vector is fixed, try to align to that length, - otherwise don't try to align at all. */ + /* If the length of the vector is a fixed power of 2, try to align + to that length, otherwise don't try to align at all. */ HOST_WIDE_INT result; - if (!BITS_PER_SVE_VECTOR.is_constant (&result)) + if (!GET_MODE_BITSIZE (TYPE_MODE (type)).is_constant (&result) + || !pow2p_hwi (result)) result = TYPE_ALIGN (TREE_TYPE (type)); return result; } diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr98119.c b/gcc/testsuite/gcc.target/aarch64/sve/pr98119.c new file mode 100644 index 00000000000..da6208c2ce3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr98119.c @@ -0,0 +1,13 @@ +/* { dg-options "-O3 -msve-vector-bits=512 -mtune=thunderx" } */ + +void +f (unsigned short *x) +{ + for (int i = 0; i < 1000; ++i) + x[i] += x[i - 16]; +} + +/* { dg-final { scan-assembler-not {\tubfx\t[wx][0-9]+, [wx][0-9]+, #?1, #?5\n} } } */ +/* { dg-final { scan-assembler-not {\tand\tx[0-9]+, x[0-9]+, #?-63\n} } } */ +/* { dg-final { scan-assembler {\tubfx\t[wx][0-9]+, [wx][0-9]+, #?1, #?4\n} } } */ +/* { dg-final { scan-assembler {\tand\tx[0-9]+, x[0-9]+, #?-31\n} } } */