c256730cef
PR middle-end/33880 * tree-nested.c (walk_omp_for): New function. (convert_nonlocal_reference, convert_local_reference): Call walk_omp_for on OMP_FOR. (convert_call_expr): Call walk_body on OMP_FOR's OMP_FOR_PRE_INIT_BODY. * testsuite/libgomp.c/pr33880.c: New test. * testsuite/libgomp.fortran/pr33880.f90: New test. From-SVN: r131825
124 lines
1.8 KiB
C
124 lines
1.8 KiB
C
/* PR middle-end/33880 */
|
|
/* { dg-do run } */
|
|
|
|
extern void abort (void);
|
|
|
|
void
|
|
test1 (void)
|
|
{
|
|
int i = 0, j = 0;
|
|
void bar (void)
|
|
{
|
|
i++;
|
|
j++;
|
|
}
|
|
bar ();
|
|
#pragma omp parallel for num_threads(4)
|
|
for (i = 0; i < 100; i++)
|
|
#pragma omp atomic
|
|
j += 1;
|
|
if (j != 101)
|
|
abort ();
|
|
#pragma omp parallel for lastprivate(i) num_threads(2)
|
|
for (i = 0; i < 100; i++)
|
|
#pragma omp atomic
|
|
j += 1;
|
|
if (i != 100)
|
|
abort ();
|
|
i = 3;
|
|
bar ();
|
|
if (j != 202)
|
|
abort ();
|
|
if (i != 4)
|
|
abort ();
|
|
}
|
|
|
|
void
|
|
test2 (void)
|
|
{
|
|
int i = -1, j = 99, k, l = 9, m = 0;
|
|
void bar (void)
|
|
{
|
|
i++;
|
|
j++;
|
|
l++;
|
|
m++;
|
|
}
|
|
bar ();
|
|
#pragma omp parallel for num_threads(4)
|
|
for (k = i; k < j; k += l)
|
|
#pragma omp atomic
|
|
m += 1;
|
|
bar ();
|
|
if (i != 1 || j != 101 || l != 11 || m != 12)
|
|
abort ();
|
|
}
|
|
|
|
void
|
|
test3 (void)
|
|
{
|
|
int i, j, k, l, m;
|
|
void bar (void)
|
|
{
|
|
#pragma omp parallel for num_threads(4)
|
|
for (i = j; i < k; i += l)
|
|
#pragma omp atomic
|
|
m += 1;
|
|
}
|
|
void baz (void)
|
|
{
|
|
#pragma omp parallel for num_threads(2) lastprivate(i)
|
|
for (i = j; i < k * 2; i += l / 2)
|
|
#pragma omp atomic
|
|
m += 1;
|
|
}
|
|
i = 7;
|
|
j = 0;
|
|
k = 100;
|
|
l = 2;
|
|
m = 0;
|
|
bar ();
|
|
if (j != 0 || k != 100 || l != 2 || m != 50)
|
|
abort ();
|
|
baz ();
|
|
if (i != 200 || j != 0 || k != 100 || l != 2 || m != 250)
|
|
abort ();
|
|
}
|
|
|
|
void
|
|
test4 (void)
|
|
{
|
|
int i, j, k, l, m = 0;
|
|
int foo (void)
|
|
{
|
|
return j;
|
|
}
|
|
int bar (void)
|
|
{
|
|
return k;
|
|
}
|
|
int baz (void)
|
|
{
|
|
return l;
|
|
}
|
|
j = 0;
|
|
k = 1000;
|
|
l = 2;
|
|
#pragma omp parallel for num_threads(8) lastprivate(i)
|
|
for (i = foo (); i < bar (); i += baz ())
|
|
#pragma omp atomic
|
|
m += 1;
|
|
if (i != 1000 || m != 500 || j != 0 || k != 1000 || l != 2)
|
|
abort ();
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
test1 ();
|
|
test2 ();
|
|
test3 ();
|
|
test4 ();
|
|
return 0;
|
|
}
|