Skip gnat.dg/prot7.adb on hppa.
[official-gcc.git] / libgomp / testsuite / libgomp.c / scan-18.c
blobae467fc7bdb9716692eddb9a71d4017d0cf6c1a8
1 /* { dg-require-effective-target size32plus } */
2 /* { dg-additional-options "-O2 -fopenmp -fdump-tree-vect-details" } */
3 /* { dg-additional-options "-msse2" { target sse2_runtime } } */
4 /* { dg-additional-options "-mavx" { target avx_runtime } } */
5 /* { dg-final { scan-tree-dump-times "vectorized \[2-6] loops" 2 "vect" { target sse2_runtime } } } */
7 extern void abort (void);
8 int r, a[1024], b[1024];
9 unsigned short r2, b2[1024];
10 unsigned char r3, b3[1024];
12 __attribute__((noipa)) void
13 foo (int *a, int *b, unsigned short *b2, unsigned char *b3)
15 #pragma omp for simd reduction (inscan, +:r, r2, r3)
16 for (int i = 0; i < 1024; i++)
19 b[i] = r;
20 b2[i] = r2;
21 b3[i] = r3;
23 #pragma omp scan exclusive(r, r2, r3)
24 { r += a[i]; r2 += a[i]; r3 += a[i]; }
28 __attribute__((noipa)) int
29 bar (unsigned short *s2p, unsigned char *s3p)
31 int s = 0;
32 unsigned short s2 = 0;
33 unsigned char s3 = 0;
34 #pragma omp parallel
35 #pragma omp for simd reduction (inscan, +:s, s2, s3)
36 for (int i = 0; i < 1024; i++)
38 { b[i] = s; b2[i] = s2; b3[i] = s3; }
39 #pragma omp scan exclusive(s, s2, s3)
41 s += 2 * a[i];
42 s2 += 2 * a[i];
43 s3 += 2 * a[i];
46 *s2p = s2;
47 *s3p = s3;
48 return s;
51 __attribute__((noipa)) void
52 baz (int *a, int *b, unsigned short *b2, unsigned char *b3)
54 #pragma omp parallel for simd reduction (inscan, +:r, r2, r3) if (simd: 0)
55 for (int i = 0; i < 1024; i++)
58 b[i] = r;
59 b2[i] = r2;
60 b3[i] = r3;
62 #pragma omp scan exclusive(r, r2, r3)
64 r += a[i];
65 r2 += a[i];
66 r3 += a[i];
71 __attribute__((noipa)) int
72 qux (unsigned short *s2p, unsigned char *s3p)
74 int s = 0;
75 unsigned short s2 = 0;
76 unsigned char s3 = 0;
77 #pragma omp parallel for simd simdlen (1) reduction (inscan, +:s, s2, s3)
78 for (int i = 0; i < 1024; i++)
80 { b[i] = s; b2[i] = s2; b3[i] = s3; }
81 #pragma omp scan exclusive(s, s2, s3)
82 { s += 2 * a[i]; s2 += 2 * a[i]; s3 += 2 * a[i]; }
84 *s2p = s2;
85 *s3p = s3;
86 return s;
89 int
90 main ()
92 int s = 0;
93 unsigned short s2;
94 unsigned char s3;
95 for (int i = 0; i < 1024; ++i)
97 a[i] = i;
98 b[i] = -1;
99 b2[i] = -1;
100 b3[i] = -1;
101 asm ("" : "+g" (i));
103 #pragma omp parallel
104 foo (a, b, b2, b3);
105 if (r != 1024 * 1023 / 2
106 || r2 != (unsigned short) r
107 || r3 != (unsigned char) r)
108 abort ();
109 for (int i = 0; i < 1024; ++i)
111 if (b[i] != s
112 || b2[i] != (unsigned short) s
113 || b3[i] != (unsigned char) s)
114 abort ();
115 else
117 b[i] = 25;
118 b2[i] = 24;
119 b3[i] = 26;
121 s += i;
123 if (bar (&s2, &s3) != 1024 * 1023)
124 abort ();
125 if (s2 != (unsigned short) (1024 * 1023)
126 || s3 != (unsigned char) (1024 * 1023))
127 abort ();
128 s = 0;
129 for (int i = 0; i < 1024; ++i)
131 if (b[i] != s
132 || b2[i] != (unsigned short) s
133 || b3[i] != (unsigned char) s)
134 abort ();
135 else
137 b[i] = -1;
138 b2[i] = -1;
139 b3[i] = -1;
141 s += 2 * i;
143 r = 0;
144 r2 = 0;
145 r3 = 0;
146 baz (a, b, b2, b3);
147 if (r != 1024 * 1023 / 2
148 || r2 != (unsigned short) r
149 || r3 != (unsigned char) r)
150 abort ();
151 s = 0;
152 for (int i = 0; i < 1024; ++i)
154 if (b[i] != s
155 || b2[i] != (unsigned short) s
156 || b3[i] != (unsigned char) s)
157 abort ();
158 else
160 b[i] = 25;
161 b2[i] = 24;
162 b3[i] = 26;
164 s += i;
166 s2 = 0;
167 s3 = 0;
168 if (qux (&s2, &s3) != 1024 * 1023)
169 abort ();
170 if (s2 != (unsigned short) (1024 * 1023)
171 || s3 != (unsigned char) (1024 * 1023))
172 abort ();
173 s = 0;
174 for (int i = 0; i < 1024; ++i)
176 if (b[i] != s
177 || b2[i] != (unsigned short) s
178 || b3[i] != (unsigned char) s)
179 abort ();
180 s += 2 * i;
182 return 0;