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