1/* { dg-require-effective-target vect_int } */
2
3#include <stdarg.h>
4#include "tree-vect.h"
5
6#define N 96
7
8unsigned short in[N*8];
9volatile int y = 0;
10
11int
12main1 ()
13{
14  int i;
15  unsigned short out[N*8];
16
17  for (i = 0; i < N*8; i++)
18    {
19      in[i] = i&63;
20      if (y) /* Avoid vectorization.  */
21	abort ();
22    }
23
24  for (i = 0; i < N; i++)
25    {
26      out[i*8] = in[i*8];
27      out[i*8 + 1] = in[i*8 + 1];
28      out[i*8 + 2] = in[i*8 + 2];
29      out[i*8 + 3] = in[i*8 + 3];
30      out[i*8 + 4] = in[i*8 + 4];
31      out[i*8 + 5] = in[i*8 + 5];
32      out[i*8 + 6] = in[i*8 + 6];
33      out[i*8 + 7] = in[i*8 + 7];
34    }
35
36  /* check results:  */
37  for (i = 0; i < N; i++)
38    {
39      if (out[i*8] !=  in[i*8]
40         || out[i*8 + 1] != in[i*8 + 1]
41         || out[i*8 + 2] != in[i*8 + 2]
42         || out[i*8 + 3] != in[i*8 + 3]
43         || out[i*8 + 4] != in[i*8 + 4]
44         || out[i*8 + 5] != in[i*8 + 5]
45         || out[i*8 + 6] != in[i*8 + 6]
46         || out[i*8 + 7] != in[i*8 + 7])
47	abort ();
48    }
49
50  for (i = 0; i < N*2; i++)
51    {
52      out[i*4] = in[i*4];
53      out[i*4 + 1] = in[i*4 + 1];
54      out[i*4 + 2] = in[i*4 + 2];
55      out[i*4 + 3] = in[i*4 + 3];
56    }
57
58  /* check results:  */
59  for (i = 0; i < N*2; i++)
60    {
61      if (out[i*4] !=  in[i*4]
62         || out[i*4 + 1] != in[i*4 + 1]
63         || out[i*4 + 2] != in[i*4 + 2]
64         || out[i*4 + 3] != in[i*4 + 3])
65        abort ();
66    }
67
68  for (i = 0; i < N/2; i++)
69    {
70      out[i*16] = in[i*16];
71      out[i*16 + 1] = in[i*16 + 1];
72      out[i*16 + 2] = in[i*16 + 2];
73      out[i*16 + 3] = in[i*16 + 3];
74      out[i*16 + 4] = in[i*16 + 4];
75      out[i*16 + 5] = in[i*16 + 5];
76      out[i*16 + 6] = in[i*16 + 6];
77      out[i*16 + 7] = in[i*16 + 7];
78      out[i*16 + 8] = in[i*16 + 8];
79      out[i*16 + 9] = in[i*16 + 9];
80      out[i*16 + 10] = in[i*16 + 10];
81      out[i*16 + 11] = in[i*16 + 11];
82      out[i*16 + 12] = in[i*16 + 12];
83      out[i*16 + 13] = in[i*16 + 13];
84      out[i*16 + 14] = in[i*16 + 14];
85      out[i*16 + 15] = in[i*16 + 15];
86    }
87
88  /* check results:  */
89  for (i = 0; i < N/2; i++)
90    {
91      if (out[i*16] !=  in[i*16]
92         || out[i*16 + 1] != in[i*16 + 1]
93         || out[i*16 + 2] != in[i*16 + 2]
94         || out[i*16 + 3] != in[i*16 + 3]
95         || out[i*16 + 4] != in[i*16 + 4]
96         || out[i*16 + 5] != in[i*16 + 5]
97         || out[i*16 + 6] != in[i*16 + 6]
98         || out[i*16 + 7] != in[i*16 + 7]
99         || out[i*16 + 8] != in[i*16 + 8]
100         || out[i*16 + 9] != in[i*16 + 9]
101         || out[i*16 + 10] != in[i*16 + 10]
102         || out[i*16 + 11] != in[i*16 + 11]
103         || out[i*16 + 12] != in[i*16 + 12]
104         || out[i*16 + 13] != in[i*16 + 13]
105         || out[i*16 + 14] != in[i*16 + 14]
106         || out[i*16 + 15] != in[i*16 + 15])
107        abort ();
108    }
109
110  /* SLP with unrolling by 8.  */
111  for (i = 0; i < N/4; i++)
112    {
113      out[i*9] = in[i*9];
114      out[i*9 + 1] = in[i*9 + 1];
115      out[i*9 + 2] = in[i*9 + 2];
116      out[i*9 + 3] = in[i*9 + 3];
117      out[i*9 + 4] = in[i*9 + 4];
118      out[i*9 + 5] = in[i*9 + 5];
119      out[i*9 + 6] = in[i*9 + 6];
120      out[i*9 + 7] = in[i*9 + 7];
121      out[i*9 + 8] = in[i*9 + 8];
122    }
123
124  /* check results:  */
125  for (i = 0; i < N/4; i++)
126    {
127      if (out[i*9] !=  in[i*9]
128         || out[i*9 + 1] != in[i*9 + 1]
129         || out[i*9 + 2] != in[i*9 + 2]
130         || out[i*9 + 3] != in[i*9 + 3]
131         || out[i*9 + 4] != in[i*9 + 4]
132         || out[i*9 + 5] != in[i*9 + 5]
133         || out[i*9 + 6] != in[i*9 + 6]
134         || out[i*9 + 7] != in[i*9 + 7]
135         || out[i*9 + 8] != in[i*9 + 8])
136        abort ();
137    }
138
139
140  return 0;
141}
142
143int main (void)
144{
145  check_vect ();
146
147  main1 ();
148
149  return 0;
150}
151
152/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" } } */
153/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 4 "vect" } } */
154/* { dg-final { cleanup-tree-dump "vect" } } */
155
156