2018-01-16 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / slp-19c.c
blob32566cb5e1320de2ce9c83867c05902a24036de4
1 /* { dg-require-effective-target vect_int } */
3 #include <stdarg.h>
4 #include "tree-vect.h"
6 #if VECTOR_BITS > 128
7 #define N (VECTOR_BITS * 2 / 32)
8 #else
9 #define N 16
10 #endif
12 int
13 main1 ()
15 unsigned int i;
16 unsigned int out[N*8];
17 #if N == 16
18 unsigned int in[N*8] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
19 #else
20 unsigned int in[N * 8];
21 for (unsigned int i = 0; i < N * 8; ++i)
23 in[i] = i & 63;
24 asm volatile ("" ::: "memory");
26 #endif
27 unsigned int ia[N*2], a0, a1, a2, a3;
29 /* The last stmt requires interleaving of not power of 2 size - not
30 vectorizable. */
31 for (i = 0; i < N/2; i++)
33 out[i*12] = in[i*12];
34 out[i*12 + 1] = in[i*12 + 1];
35 out[i*12 + 2] = in[i*12 + 2];
36 out[i*12 + 3] = in[i*12 + 3];
37 out[i*12 + 4] = in[i*12 + 4];
38 out[i*12 + 5] = in[i*12 + 5];
39 out[i*12 + 6] = in[i*12 + 6];
40 out[i*12 + 7] = in[i*12 + 7];
41 out[i*12 + 8] = in[i*12 + 8];
42 out[i*12 + 9] = in[i*12 + 9];
43 out[i*12 + 10] = in[i*12 + 10];
44 out[i*12 + 11] = in[i*12 + 11];
46 ia[i] = in[i*12 + 7];
49 /* check results: */
50 for (i = 0; i < N/2; i++)
52 if (out[i*12] != in[i*12]
53 || out[i*12 + 1] != in[i*12 + 1]
54 || out[i*12 + 2] != in[i*12 + 2]
55 || out[i*12 + 3] != in[i*12 + 3]
56 || out[i*12 + 4] != in[i*12 + 4]
57 || out[i*12 + 5] != in[i*12 + 5]
58 || out[i*12 + 6] != in[i*12 + 6]
59 || out[i*12 + 7] != in[i*12 + 7]
60 || out[i*12 + 8] != in[i*12 + 8]
61 || out[i*12 + 9] != in[i*12 + 9]
62 || out[i*12 + 10] != in[i*12 + 10]
63 || out[i*12 + 11] != in[i*12 + 11]
64 || ia[i] != in[i*12 + 7])
65 abort ();
68 /* Hybrid SLP with unrolling by 2. */
69 for (i = 0; i < N; i++)
71 out[i*6] = in[i*6];
72 out[i*6 + 1] = in[i*6 + 1];
73 out[i*6 + 2] = in[i*6 + 2];
74 out[i*6 + 3] = in[i*6 + 3];
75 out[i*6 + 4] = in[i*6 + 4];
76 out[i*6 + 5] = in[i*6 + 5];
78 ia[i] = i;
81 /* check results: */
82 for (i = 0; i < N/2; i++)
84 if (out[i*6] != in[i*6]
85 || out[i*6 + 1] != in[i*6 + 1]
86 || out[i*6 + 2] != in[i*6 + 2]
87 || out[i*6 + 3] != in[i*6 + 3]
88 || out[i*6 + 4] != in[i*6 + 4]
89 || out[i*6 + 5] != in[i*6 + 5]
90 || ia[i] != i)
91 abort ();
94 return 0;
97 int main (void)
99 check_vect ();
101 main1 ();
103 return 0;
106 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
107 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" } } */