/* { dg-do run } */
/* { dg-options "-O2 -Wno-psabi" } */
/* { dg-additional-options "-std=c23" { target c } } */

unsigned char a[] = {
#embed __FILE__
};
const unsigned char b[] = {
#embed __FILE__
};
unsigned char c[] = {
  0, 1, 2, 3, 4, 5, 6, 7,
#embed __FILE__ limit(128) suffix (,)
#embed __FILE__ limit(128) suffix (,)
#embed __FILE__
};
const unsigned char d[] = {
  0, 1, 2, 3, 4, 5, 6, 7,
#embed __FILE__ limit(128) suffix (,)
#embed __FILE__ limit(128) suffix (,)
#embed __FILE__
};
typedef char V __attribute__((vector_size (16), may_alias));
struct __attribute__((may_alias)) S { int a, b, c, d; };

__attribute__((noipa)) int
foo (V x, V y)
{
  return __builtin_memcmp (&x, &y, sizeof (x));
}

__attribute__((noipa)) int
bar (struct S x, struct S y)
{
  return x.a != y.a || x.b != y.b || x.c != y.c || x.d != y.d;
}

int
main ()
{
  if (a[0] != b[0]
      || a[42] != b[42]
      || a[sizeof (a) - 5] != b[sizeof (a) - 5]
      || a[sizeof (a) - 1] != b[sizeof (a) - 1])
    __builtin_abort ();
  if (foo (((V *) a)[0], ((V *) b)[0])
      || foo (((V *) a)[1], ((V *) b)[1])
      || foo (((V *) c)[8], ((V *) d)[8])
      || foo (((V *) c)[9], ((V *) d)[9]))
    __builtin_abort ();
  if (bar (((struct S *) a)[0], ((struct S *) b)[0])
      || bar (((struct S *) a)[1], ((struct S *) b)[1])
      || bar (((struct S *) c)[8], ((struct S *) d)[8])
      || bar (((struct S *) c)[9], ((struct S *) d)[9]))
    __builtin_abort ();
}