OSDN Git Service

e1749dea8c90f384e9c4badc26db6b719f2dc0bc
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / powerpc / pr35907.c
1 /* PR target/35907 */
2 /* { dg-do run { target powerpc*-*-* } } */
3 /* { dg-require-effective-target powerpc_altivec_ok } */
4 /* { dg-options "-O2 -maltivec" } */
5
6 #include "altivec_check.h"
7
8 #define vector __attribute__((vector_size (16)))
9 union
10 {
11   vector int k;
12   int c[16];
13 } u, v, w;
14 vector int m;
15
16 void __attribute__((noinline))
17 bar (void *i, vector int j)
18 {
19   asm volatile ("" : : "r" (i), "r" (&j) : "memory");
20 }
21
22 int __attribute__((noinline))
23 foo (int i, vector int j)
24 {
25   char *p = __builtin_alloca (64 + i);
26   m += u.k;
27   v.k = m;
28   w.k = j;
29   if (__builtin_memcmp (&v.c, &w.c, 16) != 0)
30     __builtin_abort ();
31   j += u.k;
32   bar (p, j);
33   j += u.k;
34   bar (p, j);
35   return 0;
36 }
37
38 void
39 test (void)
40 {
41   vector int l;
42   int i;
43   for (i = 0; i < 4; i++)
44     u.c[i] = i;
45   l = u.k;
46   if (foo (64, l))
47     __builtin_abort ();
48   l += u.k;
49   if (foo (64, l))
50     __builtin_abort ();
51 }
52
53 int
54 main ()
55 {
56   altivec_check ();
57   test ();
58   return 0;
59 }