Skip gnat.dg/prot7.adb on hppa.
[official-gcc.git] / libgomp / testsuite / libgomp.c / scan-14.c
blob3a20a75b2e931b09f3989515c36fb13581f1386f
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) if (simd:0)
16 for (int i = 0; i < 1024; i++)
18 { r += a[i]; r2 += a[i]; r3 += a[i]; }
19 #pragma omp scan inclusive(r, r2, r3)
21 b[i] = r;
22 b2[i] = r2;
23 b3[i] = r3;
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) simdlen (1)
36 for (int i = 0; i < 1024; i++)
39 s += 2 * a[i];
40 s2 += 2 * a[i];
41 s3 += 2 * a[i];
43 #pragma omp scan inclusive(s, s2, s3)
44 { b[i] = s; b2[i] = s2; b3[i] = s3; }
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)
55 for (int i = 0; i < 1024; i++)
58 r += a[i];
59 r2 += a[i];
60 r3 += a[i];
62 #pragma omp scan inclusive(r, r2, r3)
64 b[i] = r;
65 b2[i] = r2;
66 b3[i] = r3;
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 reduction (inscan, +:s, s2, s3)
78 for (int i = 0; i < 1024; i++)
80 { s += 2 * a[i]; s2 += 2 * a[i]; s3 += 2 * a[i]; }
81 #pragma omp scan inclusive(s, s2, s3)
82 { b[i] = s; b2[i] = s2; b3[i] = s3; }
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 s += i;
112 if (b[i] != s
113 || b2[i] != (unsigned short) s
114 || b3[i] != (unsigned char) s)
115 abort ();
116 else
118 b[i] = 25;
119 b2[i] = 24;
120 b3[i] = 26;
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 s += 2 * i;
132 if (b[i] != s
133 || b2[i] != (unsigned short) s
134 || b3[i] != (unsigned char) s)
135 abort ();
136 else
138 b[i] = -1;
139 b2[i] = -1;
140 b3[i] = -1;
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 s += i;
155 if (b[i] != s
156 || b2[i] != (unsigned short) s
157 || b3[i] != (unsigned char) s)
158 abort ();
159 else
161 b[i] = 25;
162 b2[i] = 24;
163 b3[i] = 26;
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 s += 2 * i;
177 if (b[i] != s
178 || b2[i] != (unsigned short) s
179 || b3[i] != (unsigned char) s)
180 abort ();
182 return 0;