--- /dev/null
+#include <stdint.h>
+#include "tree-vect.h"
+
+#define BLOCK_SIZE (sizeof (uint32_t))
+
+struct unaligned {
+ uint32_t x;
+} __attribute__((packed, may_alias));
+
+static inline uint32_t
+load_unaligned (const char *p)
+{
+ return ((struct unaligned *) p)->x;
+}
+
+static inline void
+store_unaligned (uint32_t x, char *p)
+{
+ ((struct unaligned *) p)->x = x;
+}
+
+void __attribute__((noipa))
+copy (char *dst, const char *src, size_t n)
+{
+ for (size_t i = 0; i < n; i += BLOCK_SIZE)
+ store_unaligned (load_unaligned (src + i), dst + i);
+}
+
+#define INPUT_SIZE 64
+#define MAX_STEP 32
+
+char x[INPUT_SIZE + MAX_STEP];
+
+int
+main (void)
+{
+ check_vect ();
+
+ for (unsigned int i = 1; i < MAX_STEP; ++i)
+ {
+ for (unsigned int j = 0; j < INPUT_SIZE + MAX_STEP; ++j)
+ x[j] = j + 10;
+ copy (x + i, x, INPUT_SIZE);
+ for (int j = 0; j < INPUT_SIZE + i; ++j)
+ {
+ int expected;
+ if (j < i)
+ expected = j + 10;
+ else if (i >= BLOCK_SIZE)
+ expected = j % i + 10;
+ else if ((j - i) % BLOCK_SIZE < i)
+ expected = x[j - i];
+ else
+ expected = j - i + 10;
+ if (x[j] != expected)
+ __builtin_abort ();
+ }
+ }
+
+ return 0;
+}
static unsigned int
vect_vfa_align (dr_vec_info *dr_info)
{
- return TYPE_ALIGN_UNIT (TREE_TYPE (DR_REF (dr_info->dr)));
+ return dr_alignment (dr_info->dr);
}
/* Function vect_no_alias_p.