1 #include "tree-vect.h"
2 
3 #define N 1024
4 typedef int V __attribute__((vector_size (4)));
5 unsigned int a[N * 2] __attribute__((aligned));
6 unsigned int b[N * 2] __attribute__((aligned));
7 V c[N];
8 
9 __attribute__((noinline, noclone)) unsigned int
foo(unsigned int * a,unsigned int * b)10 foo (unsigned int *a, unsigned int *b)
11 {
12   int i;
13   unsigned int r = 0;
14   for (i = 0; i < N; i++)
15     {
16       unsigned int x = a[i], y = b[i];
17       if (x < 32)
18 	{
19 	  x = x + 127;
20 	  y = y * 2;
21 	}
22       else
23 	{
24 	  x = x - 16;
25 	  y = y + 1;
26 	}
27       a[i] = x;
28       b[i] = y;
29       r += x;
30     }
31   return r;
32 }
33 
34 __attribute__((noinline, noclone)) unsigned int
bar(unsigned int * a,unsigned int * b)35 bar (unsigned int *a, unsigned int *b)
36 {
37   int i;
38   unsigned int r = 0;
39   for (i = 0; i < N; i++)
40     {
41       unsigned int x = a[i], y = b[i];
42       if (x < 32)
43 	{
44 	  x = x + 127;
45 	  y = y * 2;
46 	}
47       else
48 	{
49 	  x = x - 16;
50 	  y = y + 1;
51 	}
52       a[i] = x;
53       b[i] = y;
54       c[i] = c[i] + 1;
55       r += x;
56     }
57   return r;
58 }
59 
60 void
baz(unsigned int * a,unsigned int * b,unsigned int (* fn)(unsigned int *,unsigned int *))61 baz (unsigned int *a, unsigned int *b,
62      unsigned int (*fn) (unsigned int *, unsigned int *))
63 {
64   int i;
65   for (i = -64; i < 0; i++)
66     {
67       a[i] = 19;
68       b[i] = 17;
69     }
70   for (; i < N; i++)
71     {
72       a[i] = i - 512;
73       b[i] = i;
74     }
75   for (; i < N + 64; i++)
76     {
77       a[i] = 27;
78       b[i] = 19;
79     }
80   if (fn (a, b) != -512U - (N - 32) * 16U + 32 * 127U)
81     __builtin_abort ();
82   for (i = -64; i < 0; i++)
83     if (a[i] != 19 || b[i] != 17)
84       __builtin_abort ();
85   for (; i < N; i++)
86     if (a[i] != (i - 512U < 32U ? i - 512U + 127 : i - 512U - 16)
87 	|| b[i] != (i - 512U < 32U ? i * 2U : i + 1U))
88       __builtin_abort ();
89   for (; i < N + 64; i++)
90     if (a[i] != 27 || b[i] != 19)
91       __builtin_abort ();
92 }
93 
94 int
main()95 main ()
96 {
97   int i;
98   check_vect ();
99   baz (a + 512, b + 512, foo);
100   baz (a + 512, b + 512, bar);
101   baz (a + 512 + 1, b + 512 + 1, foo);
102   baz (a + 512 + 1, b + 512 + 1, bar);
103   baz (a + 512 + 31, b + 512 + 31, foo);
104   baz (a + 512 + 31, b + 512 + 31, bar);
105   baz (a + 512 + 1, b + 512, foo);
106   baz (a + 512 + 1, b + 512, bar);
107   baz (a + 512 + 31, b + 512, foo);
108   baz (a + 512 + 31, b + 512, bar);
109   baz (a + 512, b + 512 + 1, foo);
110   baz (a + 512, b + 512 + 1, bar);
111   baz (a + 512, b + 512 + 31, foo);
112   baz (a + 512, b + 512 + 31, bar);
113   return 0;
114 }
115 
116