libcpp, c, middle-end: Optimize initializers using #embed in C
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / vect-simd-12.c
blob45b55384006b1674c36a89f4539d2ffee2e4236e
1 /* { dg-require-effective-target size32plus } */
2 /* { dg-additional-options "-fopenmp-simd" } */
3 /* { dg-additional-options "-mavx" { target avx_runtime } } */
4 /* { dg-final { scan-tree-dump-times "vectorized \[1-3] loops" 2 "vect" { target i?86-*-* x86_64-*-* } } } */
6 #ifndef main
7 #include "tree-vect.h"
8 #endif
10 int r, a[1024], b[1024];
12 __attribute__((noipa)) void
13 foo (int *a, int *b)
15 #pragma omp simd reduction (inscan, +:r)
16 for (int i = 0; i < 1024; i++)
18 b[i] = r;
19 #pragma omp scan exclusive(r)
20 r += a[i];
24 __attribute__((noipa)) int
25 bar (void)
27 int s = 0;
28 #pragma omp simd reduction (inscan, +:s)
29 for (int i = 0; i < 1024; i++)
31 b[i] = s;
32 #pragma omp scan exclusive(s)
33 s += 2 * a[i];
35 return s;
38 __attribute__((noipa)) void
39 baz (int *a, int *b)
41 #pragma omp simd reduction (inscan, +:r) if (simd: 0)
42 for (int i = 0; i < 1024; i++)
44 b[i] = r;
45 #pragma omp scan exclusive(r)
46 r += a[i];
50 __attribute__((noipa)) int
51 qux (void)
53 int s = 0;
54 #pragma omp simd reduction (inscan, +:s) simdlen (1)
55 for (int i = 0; i < 1024; i++)
57 b[i] = s;
58 #pragma omp scan exclusive(s)
59 s += 2 * a[i];
61 return s;
64 int
65 main ()
67 int s = 0;
68 #ifndef main
69 check_vect ();
70 #endif
71 for (int i = 0; i < 1024; ++i)
73 a[i] = i;
74 b[i] = -1;
75 asm ("" : "+g" (i));
77 foo (a, b);
78 if (r != 1024 * 1023 / 2)
79 abort ();
80 #pragma GCC novector
81 for (int i = 0; i < 1024; ++i)
83 if (b[i] != s)
84 abort ();
85 else
86 b[i] = 25;
87 s += i;
89 if (bar () != 1024 * 1023)
90 abort ();
91 s = 0;
92 #pragma GCC novector
93 for (int i = 0; i < 1024; ++i)
95 if (b[i] != s)
96 abort ();
97 else
98 b[i] = -1;
99 s += 2 * i;
101 r = 0;
102 baz (a, b);
103 if (r != 1024 * 1023 / 2)
104 abort ();
105 s = 0;
106 #pragma GCC novector
107 for (int i = 0; i < 1024; ++i)
109 if (b[i] != s)
110 abort ();
111 else
112 b[i] = -25;
113 s += i;
115 if (qux () != 1024 * 1023)
116 abort ();
117 s = 0;
118 #pragma GCC novector
119 for (int i = 0; i < 1024; ++i)
121 if (b[i] != s)
122 abort ();
123 s += 2 * i;
125 return 0;