@@ -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;
}
new file mode 100644
@@ -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} } } */