1 /* { dg-require-effective-target vect_int } */
2
3 #include "tree-vect.h"
4
5 static int a[512], b[512];
6
7 void __attribute__((noinline,noclone))
8 foo (int *sum1p, int *sum2p, int *sum3p)
9 {
10 int sum1 = 0;
11 int sum2 = 0;
12 int sum3 = 0;
13 /* Check that we vectorize a reduction chain and a SLP reduction
14 at the same time. */
15 for (int i = 0; i < 256; ++i)
16 {
17 sum1 += a[2*i];
18 sum1 += a[2*i + 1];
19 sum2 += b[2*i];
20 sum3 += b[2*i + 1];
21 }
22 *sum1p = sum1;
23 *sum2p = sum2;
24 *sum3p = sum3;
25 }
26
27 int main()
28 {
29 check_vect ();
30
31 for (int i = 0; i < 256; ++i)
32 {
33 a[2*i] = i;
34 a[2*i + 1] = i/2;
35 b[2*i] = i + 1;
36 b[2*i + 1] = i/2 + 1;
37 __asm__ volatile ("" : : : "memory");
38 }
39 int sum1, sum2, sum3;
40 foo (&sum1, &sum2, &sum3);
41 if (sum1 != 48896 || sum2 != 32896 || sum3 != 16512)
42 abort ();
43
44 return 0;
45 }
46
47 /* { dg-final { scan-tree-dump "Loop contains only SLP stmts" "vect" } } */
48 /* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */