OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openrisc/tags/gnu-dev/fsf-gcc-snapshot-1-mar-12/or1k-gcc/libgomp/testsuite
    from Rev 735 to Rev 783
    Reverse comparison

Rev 735 → Rev 783

/libgomp.c++/copyin-1.C
0,0 → 1,34
// { dg-do run }
// { dg-require-effective-target tls_runtime }
 
#include <omp.h>
 
extern "C" void abort (void);
 
int thr = 32;
#pragma omp threadprivate (thr)
 
int
main (void)
{
int l = 0;
 
omp_set_dynamic (0);
omp_set_num_threads (6);
 
#pragma omp parallel copyin (thr) reduction (||:l)
{
l = thr != 32;
thr = omp_get_thread_num () + 11;
}
 
if (l || thr != 11)
abort ();
 
#pragma omp parallel reduction (||:l)
l = thr != omp_get_thread_num () + 11;
 
if (l)
abort ();
return 0;
}
/libgomp.c++/task-1.C
0,0 → 1,83
extern "C" void abort ();
 
int a = 18;
 
void
f1 (int i, int j, int k)
{
int l = 6, m = 7, n = 8;
#pragma omp task private(j, m) shared(k, n)
{
j = 6;
m = 5;
if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9)
#pragma omp atomic
k++;
}
#pragma omp taskwait
if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9)
abort ();
}
 
int v1 = 1, v2 = 2, v5 = 5;
int e;
 
void
f2 (void)
{
int v3 = 3;
#pragma omp sections private (v1) firstprivate (v2)
{
#pragma omp section
{
int v4 = 4;
v1 = 7;
#pragma omp task
{
if (++v1 != 8 || ++v2 != 3 || ++v3 != 4 || ++v4 != 5 || ++v5 != 6)
e = 1;
}
#pragma omp taskwait
if (v1 != 7 || v2 != 2 || v3 != 3 || v4 != 4 || v5 != 6)
abort ();
if (e)
abort ();
}
}
}
 
void
f3 (int i, int j, int k)
{
int l = 6, m = 7, n = 8;
#pragma omp task private(j, m) shared(k, n) untied
{
j = 6;
m = 5;
if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9)
#pragma omp atomic
k++;
}
#pragma omp taskwait
if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9)
abort ();
}
 
int
main ()
{
f1 (8, 26, 0);
f2 ();
a = 18;
f3 (8, 26, 0);
a = 18;
#pragma omp parallel num_threads(4)
{
#pragma omp master
{
f1 (8, 26, 0);
a = 18;
f3 (8, 26, 0);
}
}
}
/libgomp.c++/task-3.C
0,0 → 1,90
// { dg-do run }
 
extern "C" void abort ();
 
struct A
{
A ();
~A ();
A (const A &);
unsigned long l;
};
 
int e;
 
A::A ()
{
l = 17;
}
 
A::~A ()
{
if (l > 30)
#pragma omp atomic
e++;
}
 
A::A (const A &r)
{
l = r.l;
}
 
void
check (int i, A &a, int j, A &b)
{
if (i != 6 || a.l != 21 || j != 0 || b.l != 23)
#pragma omp atomic
e++;
}
 
A b;
int j;
 
void
foo (int i)
{
A a;
a.l = 21;
#pragma omp task firstprivate (i, a, j, b)
check (i, a, j, b);
}
 
void
bar (int i, A a)
{
a.l = 21;
#pragma omp task firstprivate (i, a, j, b)
check (i, a, j, b);
}
 
A
baz ()
{
A a, c;
a.l = 21;
c.l = 23;
#pragma omp task firstprivate (a, c)
check (6, a, 0, c);
return a;
}
 
int
main ()
{
b.l = 23;
foo (6);
bar (6, A ());
baz ();
#pragma omp parallel num_threads (4)
{
#pragma omp single
for (int i = 0; i < 64; i++)
{
foo (6);
bar (6, A ());
baz ();
}
}
if (e)
abort ();
}
/libgomp.c++/shared-1.C
0,0 → 1,60
#include <omp.h>
 
extern "C" void abort (void);
 
struct Y
{
int l[5][10];
};
 
struct X
{
struct Y y;
float b[10];
};
 
void
parallel (int a, int b)
{
int i, j;
struct X A[10][5];
a = b = 3;
 
for (i = 0; i < 10; i++)
for (j = 0; j < 5; j++)
A[i][j].y.l[3][3] = -10;
 
#pragma omp parallel shared (a, b, A) num_threads (5)
{
int i, j;
 
#pragma omp atomic
a += omp_get_num_threads ();
 
#pragma omp atomic
b += omp_get_num_threads ();
 
#pragma omp for private (j)
for (i = 0; i < 10; i++)
for (j = 0; j < 5; j++)
A[i][j].y.l[3][3] += 20;
 
}
 
for (i = 0; i < 10; i++)
for (j = 0; j < 5; j++)
if (A[i][j].y.l[3][3] != 10)
abort ();
 
if (a != 28)
abort ();
 
if (b != 28)
abort ();
}
 
main()
{
parallel (1, 2);
return 0;
}
/libgomp.c++/task-5.C
0,0 → 1,90
// { dg-do run }
 
extern "C" void abort ();
 
struct A
{
A ();
~A ();
A (const A &);
unsigned long l;
};
 
int e;
 
A::A ()
{
l = 17;
}
 
A::~A ()
{
if (l > 130)
#pragma omp atomic
e++;
}
 
A::A (const A &r)
{
l = r.l + 64;
}
 
void
check (int i, A &a, int j, A &b)
{
if (i != 6 || a.l != 21 + 64 || j != 0 || b.l != 23 + 64)
#pragma omp atomic
e++;
}
 
A b;
int j;
 
void
foo (int i)
{
A a;
a.l = 21;
#pragma omp task firstprivate (j, b)
check (i, a, j, b);
}
 
void
bar (int i, A a)
{
a.l = 21;
#pragma omp task firstprivate (j, b)
check (i, a, j, b);
}
 
A
baz ()
{
A a, c;
a.l = 21;
c.l = 23;
#pragma omp task firstprivate (a, c)
check (6, a, 0, c);
return a;
}
 
int
main ()
{
b.l = 23;
foo (6);
bar (6, A ());
baz ();
#pragma omp parallel num_threads (4)
{
#pragma omp single
for (int i = 0; i < 64; i++)
{
foo (6);
bar (6, A ());
baz ();
}
}
if (e)
abort ();
}
/libgomp.c++/task-7.C
0,0 → 1,18
// PR c++/36523
// { dg-do run }
 
template<typename T>
struct A
{
A() { }
A(const A&) { }
void foo() { }
};
 
int main()
{
A<int> a;
#pragma omp task firstprivate (a)
a.foo();
return 0;
}
/libgomp.c++/loop-1.C
0,0 → 1,96
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <omp.h>
 
#define MAX 1000
 
void main1()
{
int i, N1, N2, step;
int a[MAX], b[MAX];
 
N1 = rand () % 13;
N2 = rand () % (MAX - 51) + 50;
step = rand () % 7 + 1;
 
printf ("N1 = %d\nN2 = %d\nstep = %d\n", N1, N2, step);
 
for (i = N1; i <= N2; i += step)
a[i] = 42+ i;
 
/* COUNTING UP (<). Fill in array 'b' in parallel. */
memset (b, 0, sizeof b);
#pragma omp parallel shared(a,b,N1,N2,step) private(i)
{
#pragma omp for
for (i = N1; i < N2; i += step)
b[i] = a[i];
}
 
/* COUNTING UP (<). Check that all the cells were filled in properly. */
for (i = N1; i < N2; i += step)
if (a[i] != b[i])
abort ();
 
printf ("for (i = %d; i < %d; i += %d) [OK]\n", N1, N2, step);
 
/* COUNTING UP (<=). Fill in array 'b' in parallel. */
memset (b, 0, sizeof b);
#pragma omp parallel shared(a,b,N1,N2,step) private(i)
{
#pragma omp for
for (i = N1; i <= N2; i += step)
b[i] = a[i];
}
 
/* COUNTING UP (<=). Check that all the cells were filled in properly. */
for (i = N1; i <= N2; i += step)
if (a[i] != b[i])
abort ();
 
printf ("for (i = %d; i <= %d; i += %d) [OK]\n", N1, N2, step);
 
/* COUNTING DOWN (>). Fill in array 'b' in parallel. */
memset (b, 0, sizeof b);
#pragma omp parallel shared(a,b,N1,N2,step) private(i)
{
#pragma omp for
for (i = N2; i > N1; i -= step)
b[i] = a[i];
}
 
/* COUNTING DOWN (>). Check that all the cells were filled in properly. */
for (i = N2; i > N1; i -= step)
if (a[i] != b[i])
abort ();
 
printf ("for (i = %d; i > %d; i -= %d) [OK]\n", N2, N1, step);
 
/* COUNTING DOWN (>=). Fill in array 'b' in parallel. */
memset (b, 0, sizeof b);
#pragma omp parallel shared(a,b,N1,N2,step) private(i)
{
#pragma omp for
for (i = N2; i >= N1; i -= step)
b[i] = a[i];
}
 
/* COUNTING DOWN (>=). Check that all the cells were filled in properly. */
for (i = N2; i >= N1; i -= step)
if (a[i] != b[i])
abort ();
 
printf ("for (i = %d; i >= %d; i -= %d) [OK]\n", N2, N1, step);
}
 
int
main ()
{
int i;
 
srand (0);
for (i = 0; i < 10; ++i)
main1();
return 0;
}
/libgomp.c++/loop-3.C
0,0 → 1,26
extern "C" void abort (void);
int a;
 
void
foo ()
{
int i;
a = 30;
#pragma omp barrier
#pragma omp for lastprivate (a)
for (i = 0; i < 1024; i++)
{
a = i;
}
if (a != 1023)
abort ();
}
 
int
main (void)
{
#pragma omp parallel num_threads (64)
foo ();
 
return 0;
}
/libgomp.c++/loop-5.C
0,0 → 1,19
extern "C" void abort ();
 
int check;
int f1() { check |= 1; return 1; }
int f2() { check |= 2; return 11; }
int f3() { check |= 4; return 2; }
 
int a[12];
 
int main()
{
#pragma omp for
for (int i = f1(); i <= f2(); i += f3())
a[i] = 1;
 
for (int i = 0; i < 12; ++i)
if (a[i] != (i & 1))
abort ();
}
/libgomp.c++/atomic-2.C
0,0 → 1,156
// { dg-do run }
 
extern "C" void abort (void);
int x = 6;
float y;
 
int
main (void)
{
int v;
float f;
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
#pragma omp atomic write
x = 17;
#pragma omp atomic read
v = x;
if (v != 17)
abort ();
#pragma omp atomic update
x++;
#pragma omp atomic read
v = x;
if (v != 18)
abort ();
#pragma omp atomic capture
v = x++;
if (v != 18)
abort ();
#pragma omp atomic read
v = x;
if (v != 19)
abort ();
#pragma omp atomic capture
v = ++x;
if (v != 20)
abort ();
#pragma omp atomic read
v = x;
if (v != 20)
abort ();
#pragma omp atomic capture
{ v = x; x *= 3; }
if (v != 20)
abort ();
#pragma omp atomic read
v = x;
if (v != 60)
abort ();
#pragma omp atomic capture
{
x |= 2;
v = x;
}
if (v != 62)
abort ();
#pragma omp atomic read
v = x;
if (v != 62)
abort ();
#pragma omp atomic capture
{ v = x; x++; }
if (v != 62)
abort ();
#pragma omp atomic capture
{ v = x; ++x; }
if (v != 63)
abort ();
#pragma omp atomic capture
{
++x;
v = x;
}
if (v != 65)
abort ();
#pragma omp atomic capture
{x++;v=x;}if (v != 66)
abort ();
#pragma omp atomic read
v = x;
if (v != 66)
abort ();
#pragma omp atomic capture
{ v = x; x--; }
if (v != 66)
abort ();
#pragma omp atomic capture
{ v = x; --x; }
if (v != 65)
abort ();
#pragma omp atomic capture
{
--x;
v = x;
}
if (v != 63)
abort ();
#pragma omp atomic capture
{ x--; v = x; } if (v != 62)
abort ();
#pragma omp atomic read
v = x;
if (v != 62)
abort ();
#pragma omp atomic write
y = 17.5f;
#pragma omp atomic read
f = y;
if (f != 17.5)
abort ();
#pragma omp atomic update
y *= 2.0f;
#pragma omp atomic read
f = y;
if (y != 35.0)
abort ();
#pragma omp atomic capture
f = y *= 2.0f;
if (f != 70.0)
abort ();
#pragma omp atomic capture
f = y++;
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 71.0)
abort ();
#pragma omp atomic capture
f = --y;
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 70.0)
abort ();
#pragma omp atomic capture
{ f = y; y /= 2.0f; }
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 35.0)
abort ();
#pragma omp atomic capture
{ y /= 2.0f; f = y; }
if (f != 17.5)
abort ();
#pragma omp atomic read
f = y;
if (f != 17.5)
abort ();
return 0;
}
/libgomp.c++/atomic-4.C
0,0 → 1,166
// { dg-do run }
 
extern "C" void abort (void);
template <typename T, typename T2>
int
foo (void)
{
extern T x;
extern T2 y;
T v;
T2 f;
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
#pragma omp atomic write
x = 17;
#pragma omp atomic read
v = x;
if (v != 17)
abort ();
#pragma omp atomic update
x++;
#pragma omp atomic read
v = x;
if (v != 18)
abort ();
#pragma omp atomic capture
v = x++;
if (v != 18)
abort ();
#pragma omp atomic read
v = x;
if (v != 19)
abort ();
#pragma omp atomic capture
v = ++x;
if (v != 20)
abort ();
#pragma omp atomic read
v = x;
if (v != 20)
abort ();
#pragma omp atomic capture
{ v = x; x *= 3; }
if (v != 20)
abort ();
#pragma omp atomic read
v = x;
if (v != 60)
abort ();
#pragma omp atomic capture
{
x |= 2;
v = x;
}
if (v != 62)
abort ();
#pragma omp atomic read
v = x;
if (v != 62)
abort ();
#pragma omp atomic capture
{ v = x; x++; }
if (v != 62)
abort ();
#pragma omp atomic capture
{ v = x; ++x; }
if (v != 63)
abort ();
#pragma omp atomic capture
{
++x;
v = x;
}
if (v != 65)
abort ();
#pragma omp atomic capture
{x++;v=x;}if (v != 66)
abort ();
#pragma omp atomic read
v = x;
if (v != 66)
abort ();
#pragma omp atomic capture
{ v = x; x--; }
if (v != 66)
abort ();
#pragma omp atomic capture
{ v = x; --x; }
if (v != 65)
abort ();
#pragma omp atomic capture
{
--x;
v = x;
}
if (v != 63)
abort ();
#pragma omp atomic capture
{ x--; v = x; } if (v != 62)
abort ();
#pragma omp atomic read
v = x;
if (v != 62)
abort ();
#pragma omp atomic write
y = 17.5f;
#pragma omp atomic read
f = y;
if (f != 17.5)
abort ();
#pragma omp atomic update
y *= 2.0f;
#pragma omp atomic read
f = y;
if (y != 35.0)
abort ();
#pragma omp atomic capture
f = y *= 2.0f;
if (f != 70.0)
abort ();
#pragma omp atomic capture
f = y++;
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 71.0)
abort ();
#pragma omp atomic capture
f = --y;
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 70.0)
abort ();
#pragma omp atomic capture
{ f = y; y /= 2.0f; }
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 35.0)
abort ();
#pragma omp atomic capture
{ y /= 2.0f; f = y; }
if (f != 17.5)
abort ();
#pragma omp atomic read
f = y;
if (f != 17.5)
abort ();
return 0;
}
 
int x = 6;
float y;
 
int
main ()
{
foo <int, float> ();
return 0;
}
/libgomp.c++/loop-7.C
0,0 → 1,22
// PR c++/24502
// { dg-do run }
 
extern "C" void abort ();
 
template <typename T> T
foo (T r)
{
T i;
#pragma omp for
for (i = 0; i < 10; i++)
r += i;
return r;
}
 
int
main ()
{
if (foo (0) != 10 * 9 / 2 || foo (2L) != 10L * 9 / 2 + 2)
abort ();
return 0;
}
/libgomp.c++/loop-9.C
0,0 → 1,387
// { dg-do run }
 
#include <omp.h>
 
extern "C" void abort ();
 
#define LLONG_MAX __LONG_LONG_MAX__
#define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
#define INT_MAX __INT_MAX__
 
int arr[6 * 5];
 
void
set (int loopidx, int idx)
{
#pragma omp atomic
arr[loopidx * 5 + idx]++;
}
 
#define check(var, val, loopidx, idx) \
if (var == (val)) set (loopidx, idx); else
#define test(loopidx, count) \
for (idx = 0; idx < 5; idx++) \
if (arr[loopidx * 5 + idx] != idx < count) \
abort (); \
else \
arr[loopidx * 5 + idx] = 0
 
int
test1 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(dynamic,1) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test2 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(guided,1) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test3 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(static) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(static) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(static) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test4 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(static,1) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test5 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(runtime) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
main ()
{
if (2 * sizeof (int) != sizeof (long long))
return 0;
test1 ();
test2 ();
test3 ();
test4 ();
omp_set_schedule (omp_sched_static, 0);
test5 ();
omp_set_schedule (omp_sched_static, 3);
test5 ();
omp_set_schedule (omp_sched_dynamic, 5);
test5 ();
omp_set_schedule (omp_sched_guided, 2);
test5 ();
return 0;
}
/libgomp.c++/single-1.C
0,0 → 1,19
extern "C" void abort (void);
 
main()
{
int i = 0;
 
#pragma omp parallel shared (i)
{
#pragma omp single
{
i++;
}
}
 
if (i != 1)
abort ();
 
return 0;
}
/libgomp.c++/atomic-6.C
0,0 → 1,58
// { dg-do run }
 
extern "C" void abort (void);
long long l, m;
int i, j;
 
void
foo (void)
{
#pragma omp atomic read
i = l;
#pragma omp atomic read
m = j;
if (i != 77 || m != 88)
abort ();
#pragma omp atomic write
l = 1 + i + 6 * 1;
#pragma omp atomic write
j = 170 - 170 + m + 1 * 7;
#pragma omp atomic capture
i = l += 4;
#pragma omp atomic capture
m = j += 4;
if (i != 88 || m != 99)
abort ();
#pragma omp atomic capture
{
i = l;
l += 4;
}
#pragma omp atomic capture
{
m = j;
j += 4;
}
if (i != 88 || m != 99)
abort ();
#pragma omp atomic capture
{
l += 4;
i = l;
}
#pragma omp atomic capture
{
j += 4;
m = j;
}
if (i != 96 || m != 107)
abort ();
}
 
int
main ()
{
l = 77;
j = 88;
foo ();
}
/libgomp.c++/single-3.C
0,0 → 1,21
extern "C" void abort (void);
 
void
single (int a, int b)
{
#pragma omp single copyprivate(a) copyprivate(b)
{
a = b = 5;
}
 
if (a != b)
abort ();
}
 
int main()
{
#pragma omp parallel
single (1, 2);
 
return 0;
}
/libgomp.c++/atomic-8.C
0,0 → 1,137
// { dg-do run }
 
extern "C" void abort ();
int x = 6, cnt;
 
int
foo ()
{
return cnt++;
}
 
int
main ()
{
int v, *p;
#pragma omp atomic update
x = x + 7;
#pragma omp atomic
x = x + 7 + 6;
#pragma omp atomic update
x = x + 2 * 3;
#pragma omp atomic
x = x * (2 - 1);
#pragma omp atomic read
v = x;
if (v != 32)
abort ();
#pragma omp atomic write
x = 0;
#pragma omp atomic capture
{
v = x;
x = x | 1 ^ 2;
}
if (v != 0)
abort ();
#pragma omp atomic capture
{
v = x;
x = x | 4 | 2;
}
if (v != 3)
abort ();
#pragma omp atomic read
v = x;
if (v != 7)
abort ();
#pragma omp atomic capture
{
x = x ^ 6 & 2;
v = x;
}
if (v != 5)
abort ();
#pragma omp atomic capture
{ x = x - (6 + 4); v = x; }
if (v != -5)
abort ();
#pragma omp atomic capture
{ v = x; x = x - (1 | 2); }
if (v != -5)
abort ();
#pragma omp atomic read
v = x;
if (v != -8)
abort ();
#pragma omp atomic
x = x * -4 / 2;
#pragma omp atomic read
v = x;
if (v != 16)
abort ();
p = &x;
#pragma omp atomic update
p[foo (), 0] = p[foo (), 0] - 16;
#pragma omp atomic read
v = x;
if (cnt != 2 || v != 0)
abort ();
#pragma omp atomic capture
{
p[foo (), 0] += 6;
v = p[foo (), 0];
}
if (cnt != 4 || v != 6)
abort ();
#pragma omp atomic capture
{
v = p[foo (), 0];
p[foo (), 0] += 6;
}
if (cnt != 6 || v != 6)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic capture
{
p[foo (), 0] = p[foo (), 0] + 6;
v = p[foo (), 0];
}
if (cnt != 9 || v != 18)
abort ();
#pragma omp atomic capture
{
v = p[foo (), 0];
p[foo (), 0] = p[foo (), 0] + 6;
}
if (cnt != 12 || v != 18)
abort ();
#pragma omp atomic read
v = x;
if (v != 24)
abort ();
#pragma omp atomic capture
{ v = p[foo (), 0]; p[foo (), 0]++; }
#pragma omp atomic capture
{ v = p[foo (), 0]; ++p[foo (), 0]; }
#pragma omp atomic capture
{ p[foo (), 0]++; v = p[foo (), 0]; }
#pragma omp atomic capture
{ ++p[foo (), 0]; v = p[foo (), 0]; }
if (cnt != 20 || v != 28)
abort ();
#pragma omp atomic capture
{ v = p[foo (), 0]; p[foo (), 0]--; }
#pragma omp atomic capture
{ v = p[foo (), 0]; --p[foo (), 0]; }
#pragma omp atomic capture
{ p[foo (), 0]--; v = p[foo (), 0]; }
#pragma omp atomic capture
{ --p[foo (), 0]; v = p[foo (), 0]; }
if (cnt != 28 || v != 24)
abort ();
return 0;
}
/libgomp.c++/for-2.C
0,0 → 1,182
// { dg-do run }
 
extern "C" void abort ();
 
template <typename T>
class J
{
public:
J(T x, T y) : b (x), e (y) {}
T begin ();
T end ();
private:
T b, e;
};
 
template <typename T> T J<T>::begin () { return b; }
template <typename T> T J<T>::end () { return e; }
 
int results[2000];
 
void
baz (int i)
{
if (i < 0 || i >= 2000)
abort ();
results[i]++;
}
 
void
f1 (int x, int y)
{
#pragma omp parallel for
for (int i = x; i <= y; i += 6)
baz (i);
}
 
void
f2 (int x, int y)
{
int i;
#pragma omp parallel for private(i)
for (i = x; i < y - 1; i = 1 - 6 + 7 + i)
baz (i);
}
 
template <typename T>
void
f3 (int x, int y)
{
#pragma omp parallel for
for (int i = x; i <= y; i = i + 9 - 8)
baz (i);
}
 
template <typename T>
void
f4 (int x, int y)
{
int i;
#pragma omp parallel for lastprivate(i)
for (i = x + 2000 - 64; i > y + 10; --i)
baz (i);
}
 
void
f5 (int x, int y)
{
#pragma omp parallel for
for (int i = x + 2000 - 64; i > y + 10L; i -= 10L)
baz (i);
}
 
template <int N>
void
f6 (int x, int y)
{
#pragma omp parallel for
for (int i = x + 2000 - 64; i > y + 10L; i = i - 12 + 2L)
baz (i + N);
}
 
template <long N>
void
f7 (int i, int x, int y)
{
#pragma omp parallel for
for (i = x - 10; i <= y + 10; i += N)
baz (i);
}
 
template <long N>
void
f8 (J<int> j)
{
int i;
#pragma omp parallel for
for (i = j.begin (); i <= j.end () + N; i += 2)
baz (i);
}
 
template <typename T, long N>
void
f9 (T x, T y)
{
#pragma omp parallel for
for (T i = x; i <= y; i = i + N)
baz (i);
}
 
template <typename T, long N>
void
f10 (T x, T y)
{
T i;
#pragma omp parallel for
for (i = x; i > y; i = i + N)
baz (i);
}
 
template <typename T>
void
f11 (T x, long y)
{
#pragma omp parallel
{
#pragma omp for nowait
for (T i = x; i <= y; i += 3L)
baz (i);
#pragma omp single
baz (y + 3);
}
}
 
template <typename T>
void
f12 (T x, T y)
{
T i;
#pragma omp parallel for
for (i = x; i > y; --i)
baz (i);
}
 
#define check(expr) \
for (int i = 0; i < 2000; i++) \
if (expr) \
{ \
if (results[i] != 1) \
abort (); \
results[i] = 0; \
} \
else if (results[i]) \
abort ()
 
int
main ()
{
f1 (10, 1990);
check (i >= 10 && i <= 1990 && (i - 10) % 6 == 0);
f2 (0, 1999);
check (i < 1998 && (i & 1) == 0);
f3<char> (20, 1837);
check (i >= 20 && i <= 1837);
f4<int> (0, 30);
check (i > 40 && i <= 2000 - 64);
f5 (0, 100);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f6<-10> (10, 110);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f7<6> (0, 12, 1800);
check (i >= 2 && i <= 1808 && (i - 2) % 6 == 0);
f8<121> (J<int> (14, 1803));
check (i >= 14 && i <= 1924 && (i & 1) == 0);
f9<int, 7> (33, 1967);
check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0);
f10<int, -7> (1939, 17);
check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0);
f11<int> (16, 1981);
check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0);
f12<int> (1761, 37);
check (i > 37 && i <= 1761);
}
/libgomp.c++/ctor-11.C
0,0 → 1,100
// PR c++/36308
// { dg-do run }
 
#include <omp.h>
#include <assert.h>
 
#define N 10
 
struct B
{
static int icount;
static int ccount;
static int dcount;
static int xcount;
 
B ();
B (const B &);
virtual ~B ();
B& operator= (const B &);
void doit ();
static void clear () { icount = ccount = dcount = xcount = 0; }
};
 
int B::icount;
int B::ccount;
int B::dcount;
int B::xcount;
 
B::B ()
{
#pragma omp atomic
icount++;
}
 
B::B (const B &)
{
#pragma omp atomic
ccount++;
}
 
B::~B ()
{
#pragma omp atomic
dcount++;
}
 
void
B::doit ()
{
#pragma omp atomic
xcount++;
}
 
static int nthreads;
 
void
test1 ()
{
B b[N];
#pragma omp parallel private (b)
{
#pragma omp master
nthreads = omp_get_num_threads ();
b[0].doit ();
}
}
 
void
test2 ()
{
B b;
#pragma omp parallel firstprivate (b)
{
#pragma omp single
nthreads = omp_get_num_threads ();
b.doit ();
}
}
 
int
main ()
{
omp_set_dynamic (0);
omp_set_num_threads (4);
 
B::clear ();
test1 ();
assert (B::xcount == nthreads);
assert (B::ccount == 0);
assert (B::icount == (nthreads + 1) * N);
assert (B::dcount == (nthreads + 1) * N);
 
B::clear ();
test2 ();
assert (B::xcount == nthreads);
assert (B::ccount == nthreads);
assert (B::icount == 1);
assert (B::dcount == nthreads + 1);
return 0;
}
/libgomp.c++/for-4.C
0,0 → 1,225
// { dg-do run }
 
#include <string>
#include <cstdlib>
 
template <typename T>
class J
{
public:
typedef typename std::basic_string<T>::iterator iterator;
J(const iterator &x, const iterator &y) : b (x), e (y) {}
const iterator &begin ();
const iterator &end ();
private:
iterator b, e;
};
 
template <typename T>
const typename std::basic_string<T>::iterator &J<T>::begin () { return b; }
template <typename T>
const typename std::basic_string<T>::iterator &J<T>::end () { return e; }
 
template <typename T>
void
baz (T &i)
{
if (*i < L'a' || *i >= L'a' + 2000)
std::abort ();
(*i)++;
}
 
void
f1 (const std::basic_string<wchar_t>::iterator &x,
const std::basic_string<wchar_t>::iterator &y)
{
#pragma omp parallel for
for (std::basic_string<wchar_t>::iterator i = x; i <= y; i += 6)
baz (i);
}
 
void
f2 (const std::basic_string<wchar_t>::iterator &x,
const std::basic_string<wchar_t>::iterator &y)
{
std::basic_string<wchar_t>::iterator i;
#pragma omp parallel for private(i)
for (i = x; i < y - 1; i = 1 - 6 + 7 + i)
baz (i);
}
 
template <typename T>
void
f3 (const std::basic_string<wchar_t>::iterator &x,
const std::basic_string<wchar_t>::iterator &y)
{
#pragma omp parallel for schedule (dynamic, 6)
for (std::basic_string<wchar_t>::iterator i = x; i <= y; i = i + 9 - 8)
baz (i);
}
 
template <typename T>
void
f4 (const std::basic_string<wchar_t>::iterator &x,
const std::basic_string<wchar_t>::iterator &y)
{
std::basic_string<wchar_t>::iterator i;
#pragma omp parallel for lastprivate(i)
for (i = x + 2000 - 64; i > y + 10; --i)
baz (i);
}
 
void
f5 (const std::basic_string<wchar_t>::iterator &x,
const std::basic_string<wchar_t>::iterator &y)
{
#pragma omp parallel for schedule (static, 10)
for (std::basic_string<wchar_t>::iterator i = x + 2000 - 64;
i > y + 10; i -= 10)
baz (i);
}
 
template <int N>
void
f6 (const std::basic_string<wchar_t>::iterator &x,
const std::basic_string<wchar_t>::iterator &y)
{
#pragma omp parallel for schedule (runtime)
for (std::basic_string<wchar_t>::iterator i = x + 2000 - 64;
i > y + 10; i = i - 12 + 2)
{
std::basic_string<wchar_t>::iterator j = i + N;
baz (j);
}
}
 
template <int N>
void
f7 (std::basic_string<wchar_t>::iterator i,
const std::basic_string<wchar_t>::iterator &x,
const std::basic_string<wchar_t>::iterator &y)
{
#pragma omp parallel for schedule (dynamic, 6)
for (i = x - 10; i <= y + 10; i += N)
baz (i);
}
 
template <wchar_t N>
void
f8 (J<wchar_t> j)
{
std::basic_string<wchar_t>::iterator i;
#pragma omp parallel for schedule (dynamic, 40)
for (i = j.begin (); i <= j.end () + N; i += 2)
baz (i);
}
 
template <typename T, int N>
void
f9 (const typename std::basic_string<T>::iterator &x,
const typename std::basic_string<T>::iterator &y)
{
#pragma omp parallel for schedule (static, 25)
for (typename std::basic_string<T>::iterator i = x; i <= y; i = i + N)
baz (i);
}
 
template <typename T, int N>
void
f10 (const typename std::basic_string<T>::iterator &x,
const typename std::basic_string<T>::iterator &y)
{
typename std::basic_string<T>::iterator i;
#pragma omp parallel for
for (i = x; i > y; i = i + N)
baz (i);
}
 
template <typename T>
void
f11 (const T &x, const T &y)
{
#pragma omp parallel
{
#pragma omp for nowait schedule (static, 2)
for (T i = x; i <= y; i += 3)
baz (i);
#pragma omp single
{
T j = y + 3;
baz (j);
}
}
}
 
template <typename T>
void
f12 (const T &x, const T &y)
{
T i;
#pragma omp parallel for schedule (dynamic, 130)
for (i = x; i > y; --i)
baz (i);
}
 
template <int N>
struct K
{
template <typename T>
static void
f13 (const T &x, const T &y)
{
#pragma omp parallel for schedule (runtime)
for (T i = x; i <= y + N; i += N)
baz (i);
}
};
 
#define check(expr) \
for (int i = 0; i < 2000; i++) \
if (expr) \
{ \
if (a[i] != L'a' + i + 1) \
std::abort (); \
a[i] = L'a' + i; \
} \
else if (a[i] != L'a' + i) \
std::abort ()
 
int
main ()
{
std::basic_string<wchar_t> a = L"";
for (int i = 0; i < 2000; i++)
a += L'a' + i;
f1 (a.begin () + 10, a.begin () + 1990);
check (i >= 10 && i <= 1990 && (i - 10) % 6 == 0);
f2 (a.begin () + 0, a.begin () + 1999);
check (i < 1998 && (i & 1) == 0);
f3<char> (a.begin () + 20, a.begin () + 1837);
check (i >= 20 && i <= 1837);
f4<int> (a.begin () + 0, a.begin () + 30);
check (i > 40 && i <= 2000 - 64);
f5 (a.begin () + 0, a.begin () + 100);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f6<-10> (a.begin () + 10, a.begin () + 110);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f7<6> (std::basic_string<wchar_t>::iterator (), a.begin () + 12,
a.begin () + 1800);
check (i >= 2 && i <= 1808 && (i - 2) % 6 == 0);
f8<121> (J<wchar_t> (a.begin () + 14, a.begin () + 1803));
check (i >= 14 && i <= 1924 && (i & 1) == 0);
f9<wchar_t, 7> (a.begin () + 33, a.begin () + 1967);
check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0);
f10<wchar_t, -7> (a.begin () + 1939, a.begin () + 17);
check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0);
f11<std::basic_string<wchar_t>::iterator > (a.begin () + 16,
a.begin () + 1981);
check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0);
f12<std::basic_string<wchar_t>::iterator > (a.begin () + 1761,
a.begin () + 37);
check (i > 37 && i <= 1761);
K<5>::f13<std::basic_string<wchar_t>::iterator > (a.begin () + 1,
a.begin () + 1935);
check (i >= 1 && i <= 1936 && (i - 1) % 5 == 0);
}
/libgomp.c++/pr27337.C
0,0 → 1,87
// PR middle-end/27337
// { dg-do run }
 
#include <omp.h>
 
extern "C" void abort (void);
 
struct S
{
S ();
~S ();
S (const S &);
int i;
};
 
int n[3];
 
S::S () : i(18)
{
if (omp_get_thread_num () != 0)
#pragma omp atomic
n[0]++;
}
 
S::~S ()
{
if (omp_get_thread_num () != 0)
#pragma omp atomic
n[1]++;
}
 
S::S (const S &x)
{
if (x.i != 18)
abort ();
i = 118;
if (omp_get_thread_num () != 0)
#pragma omp atomic
n[2]++;
}
 
S
foo ()
{
int i;
S ret;
 
#pragma omp parallel for firstprivate (ret) lastprivate (ret) \
schedule (static, 1) num_threads (4)
for (i = 0; i < 4; i++)
ret.i += omp_get_thread_num ();
 
return ret;
}
 
S
bar ()
{
int i;
S ret;
 
#pragma omp parallel for num_threads (4)
for (i = 0; i < 4; i++)
#pragma omp atomic
ret.i += omp_get_thread_num () + 1;
 
return ret;
}
 
S x;
 
int
main (void)
{
omp_set_dynamic (false);
x = foo ();
if (n[0] != 0 || n[1] != 3 || n[2] != 3)
abort ();
if (x.i != 118 + 3)
abort ();
x = bar ();
if (n[0] != 0 || n[1] != 3 || n[2] != 3)
abort ();
if (x.i != 18 + 0 + 1 + 2 + 3 + 4)
abort ();
return 0;
}
/libgomp.c++/for-6.C
0,0 → 1,109
// PR c++/38348
// { dg-do run }
 
extern "C" void abort ();
int cnt;
 
template <typename T>
void
f0 (T, int)
{
abort ();
}
 
template <>
void
f0<int> (int, int type)
{
if (type != 0)
abort ();
#pragma omp atomic
cnt++;
}
 
template <>
void
f0<const char *> (const char *, int type)
{
if (type != 1)
abort ();
#pragma omp atomic
cnt++;
}
 
template <typename T>
void
f1 ()
{
#pragma omp parallel for
for (int i = 0; i < 10; i++)
f0 (i, 0);
}
 
template <typename T>
void
f2 ()
{
#pragma omp parallel for
for (T i = T (0); i < T (10); i += T (1))
f0 (i, 0);
}
 
void
f3 ()
{
#pragma omp parallel for
for (int i = 0; i < 10; i++)
f0 (i, 0);
}
 
const char *p = "abcdefghij";
 
template <typename T>
void
f4 ()
{
#pragma omp parallel for
for (const char *i = p; i < p + 10; i += 1)
f0 (i, 1);
}
 
template <typename T>
void
f5 ()
{
#pragma omp parallel for
for (T i = T (p); i < T (p + 10); i += 1)
f0 (i, 1);
}
 
void
f6 ()
{
#pragma omp parallel for
for (const char *i = p; i < p + 10; i++)
f0 (i, 1);
}
 
int
main ()
{
f1<int> ();
if (cnt != 10)
abort ();
f2<int> ();
if (cnt != 20)
abort ();
f3 ();
if (cnt != 30)
abort ();
f4<int> ();
if (cnt != 40)
abort ();
f5<const char *> ();
if (cnt != 50)
abort ();
f6 ();
if (cnt != 60)
abort ();
}
/libgomp.c++/master-1.C
0,0 → 1,24
// PR c++/24734
// { dg-do run }
 
extern "C" void abort ();
int i;
 
template<int> void
foo ()
{
#pragma omp parallel
{
#pragma omp master
i++;
}
}
 
int
main ()
{
foo<0> ();
if (i != 1)
abort ();
return 0;
}
/libgomp.c++/reduction-1.C
0,0 → 1,36
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = 0, j = 0, k = ~0;
double d = 1.0;
#pragma omp parallel num_threads(4) reduction(+:i) reduction(*:d) reduction(&:k)
{
if (i != 0 || d != 1.0 || k != ~0)
#pragma omp atomic
j |= 1;
if (omp_get_num_threads () != 4)
#pragma omp atomic
j |= 2;
 
i = omp_get_thread_num ();
d = i + 1;
k = ~(1 << (2 * i));
}
 
if (j & 1)
abort ();
if ((j & 2) == 0)
{
if (i != (0 + 1 + 2 + 3))
abort ();
if (d != (1.0 * 2.0 * 3.0 * 4.0))
abort ();
if (k != (~0 ^ 0x55))
abort ();
}
return 0;
}
/libgomp.c++/parallel-1.C
0,0 → 1,40
#include <omp.h>
 
extern "C" void abort (void);
 
int
foo (void)
{
return 10;
}
 
main ()
{
int A = 0;
 
#pragma omp parallel if (foo () > 10) shared (A)
{
A = omp_get_num_threads ();
}
 
if (A != 1)
abort ();
 
#pragma omp parallel if (foo () == 10) num_threads (3) shared (A)
{
A = omp_get_num_threads ();
}
 
if (A != 3)
abort ();
 
#pragma omp parallel if (foo () == 10) num_threads (foo ()) shared (A)
{
A = omp_get_num_threads ();
}
 
if (A != 10)
abort ();
 
return 0;
}
/libgomp.c++/for-8.C
0,0 → 1,291
// { dg-do run }
 
typedef __PTRDIFF_TYPE__ ptrdiff_t;
extern "C" void abort ();
 
template <typename T>
class I
{
public:
typedef ptrdiff_t difference_type;
I ();
~I ();
I (T *);
I (const I &);
T &operator * ();
T *operator -> ();
T &operator [] (const difference_type &) const;
I &operator = (const I &);
I &operator ++ ();
I operator ++ (int);
I &operator -- ();
I operator -- (int);
I &operator += (const difference_type &);
I &operator -= (const difference_type &);
I operator + (const difference_type &) const;
I operator - (const difference_type &) const;
template <typename S> friend bool operator == (I<S> &, I<S> &);
template <typename S> friend bool operator == (const I<S> &, const I<S> &);
template <typename S> friend bool operator < (I<S> &, I<S> &);
template <typename S> friend bool operator < (const I<S> &, const I<S> &);
template <typename S> friend bool operator <= (I<S> &, I<S> &);
template <typename S> friend bool operator <= (const I<S> &, const I<S> &);
template <typename S> friend bool operator > (I<S> &, I<S> &);
template <typename S> friend bool operator > (const I<S> &, const I<S> &);
template <typename S> friend bool operator >= (I<S> &, I<S> &);
template <typename S> friend bool operator >= (const I<S> &, const I<S> &);
template <typename S> friend typename I<S>::difference_type operator - (I<S> &, I<S> &);
template <typename S> friend typename I<S>::difference_type operator - (const I<S> &, const I<S> &);
template <typename S> friend I<S> operator + (typename I<S>::difference_type , const I<S> &);
private:
T *p;
};
template <typename T> I<T>::I () : p (0) {}
template <typename T> I<T>::~I () {}
template <typename T> I<T>::I (T *x) : p (x) {}
template <typename T> I<T>::I (const I &x) : p (x.p) {}
template <typename T> T &I<T>::operator * () { return *p; }
template <typename T> T *I<T>::operator -> () { return p; }
template <typename T> T &I<T>::operator [] (const difference_type &x) const { return p[x]; }
template <typename T> I<T> &I<T>::operator = (const I &x) { p = x.p; return *this; }
template <typename T> I<T> &I<T>::operator ++ () { ++p; return *this; }
template <typename T> I<T> I<T>::operator ++ (int) { return I (p++); }
template <typename T> I<T> &I<T>::operator -- () { --p; return *this; }
template <typename T> I<T> I<T>::operator -- (int) { return I (p--); }
template <typename T> I<T> &I<T>::operator += (const difference_type &x) { p += x; return *this; }
template <typename T> I<T> &I<T>::operator -= (const difference_type &x) { p -= x; return *this; }
template <typename T> I<T> I<T>::operator + (const difference_type &x) const { return I (p + x); }
template <typename T> I<T> I<T>::operator - (const difference_type &x) const { return I (p - x); }
template <typename T> bool operator == (I<T> &x, I<T> &y) { return x.p == y.p; }
template <typename T> bool operator == (const I<T> &x, const I<T> &y) { return x.p == y.p; }
template <typename T> bool operator != (I<T> &x, I<T> &y) { return !(x == y); }
template <typename T> bool operator != (const I<T> &x, const I<T> &y) { return !(x == y); }
template <typename T> bool operator < (I<T> &x, I<T> &y) { return x.p < y.p; }
template <typename T> bool operator < (const I<T> &x, const I<T> &y) { return x.p < y.p; }
template <typename T> bool operator <= (I<T> &x, I<T> &y) { return x.p <= y.p; }
template <typename T> bool operator <= (const I<T> &x, const I<T> &y) { return x.p <= y.p; }
template <typename T> bool operator > (I<T> &x, I<T> &y) { return x.p > y.p; }
template <typename T> bool operator > (const I<T> &x, const I<T> &y) { return x.p > y.p; }
template <typename T> bool operator >= (I<T> &x, I<T> &y) { return x.p >= y.p; }
template <typename T> bool operator >= (const I<T> &x, const I<T> &y) { return x.p >= y.p; }
template <typename T> typename I<T>::difference_type operator - (I<T> &x, I<T> &y) { return x.p - y.p; }
template <typename T> typename I<T>::difference_type operator - (const I<T> &x, const I<T> &y) { return x.p - y.p; }
template <typename T> I<T> operator + (typename I<T>::difference_type x, const I<T> &y) { return I<T> (x + y.p); }
 
template <typename T>
class J
{
public:
J(const I<T> &x, const I<T> &y) : b (x), e (y) {}
const I<T> &begin ();
const I<T> &end ();
private:
I<T> b, e;
};
 
template <typename T> const I<T> &J<T>::begin () { return b; }
template <typename T> const I<T> &J<T>::end () { return e; }
 
int results[2000];
 
template <typename T>
void
baz (I<T> &i)
{
if (*i < 0 || *i >= 2000)
abort ();
results[*i]++;
}
 
void
f1 (const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (I<int> i = x; y >= i; i += 6)
baz (i);
}
 
void
f2 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel for private(i)
for (i = x; y - 1 > i; i = 1 - 6 + 7 + i)
baz (i);
}
 
template <typename T>
void
f3 (const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (I<int> i = x; y >= i; i = i + 9 - 8)
baz (i);
}
 
template <typename T>
void
f4 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel for lastprivate(i)
for (i = x + 2000 - 64; y + 10 < i; --i)
baz (i);
}
 
void
f5 (const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (I<int> i = x + 2000 - 64; y + 10 < i; i -= 10)
baz (i);
}
 
template <int N>
void
f6 (const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (I<int> i = x + 2000 - 64; y + 10 < i; i = i - 12 + 2)
{
I<int> j = i + N;
baz (j);
}
}
 
template <int N>
void
f7 (I<int> i, const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (i = x - 10; y + 10 >= i; i += N)
baz (i);
}
 
template <int N>
void
f8 (J<int> j)
{
I<int> i;
#pragma omp parallel for
for (i = j.begin (); j.end () + N >= i; i += 2)
baz (i);
}
 
template <typename T, int N>
void
f9 (const I<T> &x, const I<T> &y)
{
#pragma omp parallel for
for (I<T> i = x; y >= i; i = i + N)
baz (i);
}
 
template <typename T, int N>
void
f10 (const I<T> &x, const I<T> &y)
{
I<T> i;
#pragma omp parallel for
for (i = x; y < i; i = i + N)
baz (i);
}
 
template <typename T>
void
f11 (const T &x, const T &y)
{
#pragma omp parallel
{
#pragma omp for nowait
for (T i = x; y >= i; i += 3)
baz (i);
#pragma omp single
{
T j = y + 3;
baz (j);
}
}
}
 
template <typename T>
void
f12 (const T &x, const T &y)
{
T i;
#pragma omp parallel for
for (i = x; y < i; --i)
baz (i);
}
 
template <int N>
struct K
{
template <typename T>
static void
f13 (const T &x, const T &y)
{
#pragma omp parallel for
for (T i = x; y + N >= i; i += N)
baz (i);
}
};
 
#define check(expr) \
for (int i = 0; i < 2000; i++) \
if (expr) \
{ \
if (results[i] != 1) \
abort (); \
results[i] = 0; \
} \
else if (results[i]) \
abort ()
 
int
main ()
{
int a[2000];
long b[2000];
for (int i = 0; i < 2000; i++)
{
a[i] = i;
b[i] = i;
}
f1 (&a[10], &a[1990]);
check (i >= 10 && i <= 1990 && (i - 10) % 6 == 0);
f2 (&a[0], &a[1999]);
check (i < 1998 && (i & 1) == 0);
f3<char> (&a[20], &a[1837]);
check (i >= 20 && i <= 1837);
f4<int> (&a[0], &a[30]);
check (i > 40 && i <= 2000 - 64);
f5 (&a[0], &a[100]);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f6<-10> (&a[10], &a[110]);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f7<6> (I<int> (), &a[12], &a[1800]);
check (i >= 2 && i <= 1808 && (i - 2) % 6 == 0);
f8<121> (J<int> (&a[14], &a[1803]));
check (i >= 14 && i <= 1924 && (i & 1) == 0);
f9<int, 7> (&a[33], &a[1967]);
check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0);
f10<int, -7> (&a[1939], &a[17]);
check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0);
f11<I<int> > (&a[16], &a[1981]);
check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0);
f12<I<int> > (&a[1761], &a[37]);
check (i > 37 && i <= 1761);
K<5>::f13<I<int> > (&a[1], &a[1935]);
check (i >= 1 && i <= 1936 && (i - 1) % 5 == 0);
f9<long, 7> (&b[33], &b[1967]);
check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0);
f10<long, -7> (&b[1939], &b[17]);
check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0);
f11<I<long> > (&b[16], &b[1981]);
check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0);
f12<I<long> > (&b[1761], &b[37]);
check (i > 37 && i <= 1761);
K<5>::f13<I<long> > (&b[1], &b[1935]);
check (i >= 1 && i <= 1936 && (i - 1) % 5 == 0);
}
/libgomp.c++/reduction-3.C
0,0 → 1,51
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = 0, j = 0, k = ~0, l;
double d = 1.0;
#pragma omp parallel num_threads(4)
{
#pragma omp single
{
i = 16;
k ^= (1 << 16);
d += 32.0;
}
 
#pragma omp for reduction(+:i) reduction(*:d) reduction(&:k) nowait
for (l = 0; l < 4; l++)
{
if (omp_get_num_threads () == 4 && (i != 0 || d != 1.0 || k != ~0))
#pragma omp atomic
j |= 1;
if (l == omp_get_thread_num ())
{
i = omp_get_thread_num ();
d = i + 1;
k = ~(1 << (2 * i));
}
}
 
if (omp_get_num_threads () == 4)
{
#pragma omp barrier
if (i != (16 + 0 + 1 + 2 + 3))
#pragma omp atomic
j |= 2;
if (d != (33.0 * 1.0 * 2.0 * 3.0 * 4.0))
#pragma omp atomic
j |= 4;
if (k != (~0 ^ 0x55 ^ (1 << 16)))
#pragma omp atomic
j |= 8;
}
}
 
if (j)
abort ();
return 0;
}
/libgomp.c++/pr39573.C
0,0 → 1,39
// PR middle-end/39573
// { dg-do run }
 
int z;
 
void __attribute__((noinline))
bar (int *x)
{
#pragma omp atomic
z += x[2];
x[2] += x[3];
}
 
int
main ()
{
int i;
#pragma omp parallel for
for (i = 0; i < 65536; i++)
{
int x[] =
{
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
};
bar (x);
}
}
/libgomp.c++/collapse-1.C
0,0 → 1,29
// { dg-do run }
 
#include <string.h>
#include <stdlib.h>
 
int
main ()
{
int i, j, k, l = 0;
int a[3][3][3];
 
memset (a, '\0', sizeof (a));
#pragma omp parallel for collapse(4 - 1) schedule(static, 4)
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
for (k = 0; k < 2; k++)
a[i][j][k] = i + j * 4 + k * 16;
#pragma omp parallel
{
#pragma omp for collapse(2) reduction(|:l) private (k)
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
for (k = 0; k < 2; k++)
if (a[i][j][k] != i + j * 4 + k * 16)
l = 1;
}
if (l)
abort ();
}
/libgomp.c++/ctor-2.C
0,0 → 1,76
// { dg-do run }
 
#include <omp.h>
#include <assert.h>
 
struct B
{
static int ccount;
static int dcount;
static int xcount;
static B *expected;
 
B();
B(int);
B(const B &);
~B();
B& operator=(const B &);
void doit();
};
 
int B::ccount;
int B::dcount;
int B::xcount;
B * B::expected;
 
B::B(int)
{
expected = this;
}
 
B::B(const B &b)
{
#pragma omp atomic
ccount++;
assert (&b == expected);
}
 
B::~B()
{
#pragma omp atomic
dcount++;
}
 
void B::doit()
{
#pragma omp atomic
xcount++;
assert (this != expected);
}
 
static int nthreads;
 
void foo()
{
B b(0);
 
#pragma omp parallel firstprivate(b)
{
#pragma omp master
nthreads = omp_get_num_threads ();
b.doit();
}
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (4);
foo();
 
assert (B::xcount == nthreads);
assert (B::ccount == nthreads);
assert (B::dcount == nthreads+1);
 
return 0;
}
/libgomp.c++/ctor-4.C
0,0 → 1,90
// { dg-do run }
 
#include <omp.h>
#include <assert.h>
 
struct B
{
static int ccount;
static int dcount;
static int ecount;
static B *e_inner;
static B *e_outer;
 
B();
B(int);
B(const B &);
~B();
B& operator=(const B &);
void doit();
};
 
int B::ccount;
int B::dcount;
int B::ecount;
B * B::e_inner;
B * B::e_outer;
 
B::B(int)
{
e_outer = this;
}
 
B::B(const B &b)
{
assert (&b == e_outer);
#pragma omp atomic
ccount++;
}
 
B::~B()
{
#pragma omp atomic
dcount++;
}
 
B& B::operator= (const B &b)
{
assert (&b == e_inner);
assert (this == e_outer);
#pragma omp atomic
ecount++;
return *this;
}
 
void B::doit()
{
#pragma omp critical
{
assert (e_inner == 0);
e_inner = this;
}
}
 
static int nthreads;
 
void foo()
{
B b(0);
 
#pragma omp parallel sections firstprivate(b) lastprivate(b)
{
#pragma omp section
nthreads = omp_get_num_threads ();
#pragma omp section
b.doit ();
}
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (4);
foo();
 
assert (B::ecount == 1);
assert (B::ccount == nthreads);
assert (B::dcount == nthreads+1);
 
return 0;
}
/libgomp.c++/ctor-6.C
0,0 → 1,50
// { dg-do run }
 
#include <omp.h>
#include <assert.h>
 
struct B
{
static int count;
static B *expected;
 
B& operator=(const B &);
};
 
int B::count;
B * B::expected;
 
B& B::operator= (const B &b)
{
assert (&b == expected);
assert (this != expected);
#pragma omp atomic
count++;
return *this;
}
 
static int nthreads;
 
void foo()
{
#pragma omp parallel
{
B b;
#pragma omp single copyprivate(b)
{
nthreads = omp_get_num_threads ();
B::expected = &b;
}
}
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (4);
foo();
 
assert (B::count == nthreads-1);
 
return 0;
}
/libgomp.c++/ctor-8.C
0,0 → 1,77
// { dg-do run }
// { dg-require-effective-target tls_runtime }
 
#include <omp.h>
#include <assert.h>
 
#define N 10
#define THR 4
 
struct B
{
B();
B(const B &);
~B();
B& operator=(const B &);
void doit();
};
 
static B *base;
static B *threadbase;
static unsigned cmask[THR];
static unsigned dmask[THR];
 
#pragma omp threadprivate(threadbase)
 
B::B()
{
assert (base == 0);
}
 
B::B(const B &b)
{
unsigned index = &b - base;
assert (index < N);
cmask[omp_get_thread_num()] |= 1u << index;
}
 
B::~B()
{
if (threadbase)
{
unsigned index = this - threadbase;
assert (index < N);
dmask[omp_get_thread_num()] |= 1u << index;
}
}
 
void foo()
{
B b[N];
 
base = b;
 
#pragma omp parallel firstprivate(b)
{
assert (omp_get_num_threads () == THR);
threadbase = b;
}
 
threadbase = 0;
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (THR);
foo();
 
for (int i = 0; i < THR; ++i)
{
unsigned xmask = (1u << N) - 1;
assert (cmask[i] == xmask);
assert (dmask[i] == xmask);
}
 
return 0;
}
/libgomp.c++/nested-1.C
0,0 → 1,28
// { dg-do run }
 
extern "C" void abort(void);
#define N 1000
 
int foo()
{
int i = 0, j;
 
#pragma omp parallel for num_threads(2) shared (i)
for (j = 0; j < N; ++j)
{
#pragma omp parallel num_threads(1) shared (i)
{
#pragma omp atomic
i++;
}
}
 
return i;
}
 
int main()
{
if (foo() != N)
abort ();
return 0;
}
/libgomp.c++/pr34513.C
0,0 → 1,32
// PR c++/34513
// { dg-do run }
 
#include <omp.h>
 
extern "C" void abort ();
 
static int errors = 0;
static int thrs = 4;
 
int
main ()
{
omp_set_dynamic (0);
 
#pragma omp parallel num_threads (thrs)
{
static int shrd = 0;
 
#pragma omp atomic
shrd += 1;
 
#pragma omp barrier
 
if (shrd != thrs)
#pragma omp atomic
errors += 1;
}
 
if (errors)
abort ();
}
/libgomp.c++/sections-1.C
0,0 → 1,64
/******************************************************************************
* FILE: omp_workshare2.c
* DESCRIPTION:
* OpenMP Example - Sections Work-sharing - C/C++ Version
* In this example, the OpenMP SECTION directive is used to assign
* different array operations to threads that execute a SECTION. Each
* thread receives its own copy of the result array to work with.
* AUTHOR: Blaise Barney 5/99
* LAST REVISED: 04/06/05
******************************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define N 50
 
int main (int argc, char *argv[]) {
 
int i, nthreads, tid;
float a[N], b[N], c[N];
 
/* Some initializations */
for (i=0; i<N; i++)
a[i] = b[i] = i * 1.0;
 
#pragma omp parallel shared(a,b,nthreads) private(c,i,tid)
{
tid = omp_get_thread_num();
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
printf("Thread %d starting...\n",tid);
 
#pragma omp sections nowait
{
#pragma omp section
{
printf("Thread %d doing section 1\n",tid);
for (i=0; i<N; i++)
{
c[i] = a[i] + b[i];
printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
}
}
 
#pragma omp section
{
printf("Thread %d doing section 2\n",tid);
for (i=0; i<N; i++)
{
c[i] = a[i] * b[i];
printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
}
}
 
} /* end of sections */
 
printf("Thread %d done.\n",tid);
 
} /* end of parallel section */
 
return 0;
}
/libgomp.c++/pr49043.C
0,0 → 1,19
// PR c++/49043
// { dg-options "-std=c++0x" }
// { dg-do run }
 
extern "C" void abort ();
 
int
main ()
{
int r = 0;
#pragma omp parallel for reduction (+:r)
for (int a = 0; a < 10; ++a)
{
auto func = [=] () { return a; };
r += func ();
}
if (r != 45)
abort ();
}
/libgomp.c++/loop-10.C
0,0 → 1,105
// { dg-do run }
 
#include <omp.h>
 
extern "C" void abort (void);
 
#define LLONG_MAX __LONG_LONG_MAX__
#define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
#define INT_MAX __INT_MAX__
 
int v;
 
int
test1 (void)
{
int e = 0, cnt = 0;
long long i;
unsigned long long j;
char buf[6], *p;
 
#pragma omp for schedule(dynamic,1) collapse(2) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
if ((i != LLONG_MAX - 30001
&& i != LLONG_MAX - 20001
&& i != LLONG_MAX - 10001)
|| j != 20)
e = 1;
else
cnt++;
if (e || cnt != 3)
abort ();
else
cnt = 0;
 
#pragma omp for schedule(guided,1) collapse(2) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
if ((i != -LLONG_MAX + 30000
&& i != -LLONG_MAX + 20000
&& i != -LLONG_MAX + 10000)
|| j != ULLONG_MAX - 3)
e = 1;
else
cnt++;
if (e || cnt != 3)
abort ();
else
cnt = 0;
 
#pragma omp for schedule(static,1) collapse(2) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
for (j = 20; j <= LLONG_MAX - 70 + v; j += LLONG_MAX + 50ULL)
if ((i != LLONG_MAX - 30001
&& i != LLONG_MAX - 20001
&& i != LLONG_MAX - 10001)
|| j != 20)
e = 1;
else
cnt++;
if (e || cnt != 3)
abort ();
else
cnt = 0;
 
#pragma omp for schedule(static) collapse(2) nowait
for (i = -LLONG_MAX + 30000 + v; i >= -LLONG_MAX + 10000; i -= 10000)
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
if ((i != -LLONG_MAX + 30000
&& i != -LLONG_MAX + 20000
&& i != -LLONG_MAX + 10000)
|| j != ULLONG_MAX - 3)
e = 1;
else
cnt++;
if (e || cnt != 3)
abort ();
else
cnt = 0;
 
#pragma omp for schedule(runtime) collapse(2) nowait
for (i = 10; i < 30; i++)
for (p = buf; p <= buf + 4; p += 2)
if (i < 10 || i >= 30 || (p != buf && p != buf + 2 && p != buf + 4))
e = 1;
else
cnt++;
if (e || cnt != 60)
abort ();
else
cnt = 0;
 
return 0;
}
 
int
main (void)
{
if (2 * sizeof (int) != sizeof (long long))
return 0;
asm volatile ("" : "+r" (v));
omp_set_schedule (omp_sched_dynamic, 1);
test1 ();
return 0;
}
/libgomp.c++/loop-12.C
0,0 → 1,387
// { dg-do run }
 
#include <omp.h>
 
extern "C" void abort ();
 
#define LLONG_MAX __LONG_LONG_MAX__
#define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
#define INT_MAX __INT_MAX__
 
int arr[6 * 5];
 
void
set (int loopidx, int idx)
{
#pragma omp atomic
arr[loopidx * 5 + idx]++;
}
 
#define check(var, val, loopidx, idx) \
if (var == (val)) set (loopidx, idx); else
#define test(loopidx, count) \
for (idx = 0; idx < 5; idx++) \
if (arr[loopidx * 5 + idx] != idx < count) \
abort (); \
else \
arr[loopidx * 5 + idx] = 0
 
int
test1 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(dynamic,1) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test2 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(guided,1) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test3 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(static) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(static) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(static) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test4 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(static,1) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test5 ()
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(runtime) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
main ()
{
if (2 * sizeof (int) != sizeof (long long))
return 0;
test1 ();
test2 ();
test3 ();
test4 ();
omp_set_schedule (omp_sched_static, 0);
test5 ();
omp_set_schedule (omp_sched_static, 3);
test5 ();
omp_set_schedule (omp_sched_dynamic, 5);
test5 ();
omp_set_schedule (omp_sched_guided, 2);
test5 ();
return 0;
}
/libgomp.c++/pr26691.C
0,0 → 1,20
// PR c++/26691
 
struct A
{
int n;
A (int i = 3) : n (i) {}
};
 
int
main ()
{
A a;
int err = 0;
#pragma omp parallel private (a) reduction (+:err)
if (a.n != 3)
err++;
 
return err;
}
 
/libgomp.c++/copyin-2.C
0,0 → 1,34
// { dg-do run }
// { dg-require-effective-target tls_runtime }
 
#include <omp.h>
 
extern "C" void abort (void);
 
struct S { int t; char buf[64]; } thr = { 32, "" };
#pragma omp threadprivate (thr)
 
int
main (void)
{
int l = 0;
 
omp_set_dynamic (0);
omp_set_num_threads (6);
 
#pragma omp parallel copyin (thr) reduction (||:l)
{
l = thr.t != 32;
thr.t = omp_get_thread_num () + 11;
}
 
if (l || thr.t != 11)
abort ();
 
#pragma omp parallel reduction (||:l)
l = thr.t != omp_get_thread_num () + 11;
 
if (l)
abort ();
return 0;
}
/libgomp.c++/task-2.C
0,0 → 1,70
// { dg-do run }
 
#include <omp.h>
extern "C" void abort ();
 
int l = 5;
 
int
foo (int i)
{
int j = 7;
const int k = 8;
#pragma omp task firstprivate (i) shared (j, l)
{
#pragma omp critical
{
j += i;
l += k;
}
}
i++;
#pragma omp task firstprivate (i) shared (j, l)
{
#pragma omp critical
{
j += i;
l += k;
}
}
i++;
#pragma omp task firstprivate (i) shared (j, l)
{
#pragma omp critical
{
j += i;
l += k;
}
}
i++;
#pragma omp task firstprivate (i) shared (j, l)
{
#pragma omp critical
{
j += i;
l += k;
}
}
i++;
#pragma omp taskwait
return (i != 8 * omp_get_thread_num () + 4
|| j != 4 * i - 3
|| k != 8);
}
 
int
main (void)
{
int r = 0;
#pragma omp parallel num_threads (4) reduction(+:r)
if (omp_get_num_threads () != 4)
{
#pragma omp master
l = 133;
}
else if (foo (8 * omp_get_thread_num ()))
r++;
if (r || l != 133)
abort ();
return 0;
}
/libgomp.c++/task-4.C
0,0 → 1,37
#include <omp.h>
extern "C" void *memset (void *, int, __SIZE_TYPE__);
extern "C" void abort (void);
 
int e;
 
void
baz (int i, int *p, int j, int *q)
{
if (p[0] != 1 || p[i] != 3 || q[0] != 2 || q[j] != 4)
#pragma omp atomic
e++;
}
 
void
foo (int i, int j)
{
int p[i + 1];
int q[j + 1];
memset (p, 0, sizeof (p));
memset (q, 0, sizeof (q));
p[0] = 1;
p[i] = 3;
q[0] = 2;
q[j] = 4;
#pragma omp task firstprivate (p, q)
baz (i, p, j, q);
}
 
int
main ()
{
#pragma omp parallel num_threads (4)
foo (5 + omp_get_thread_num (), 7 + omp_get_thread_num ());
if (e)
abort ();
}
/libgomp.c++/shared-2.C
0,0 → 1,47
extern "C" void abort (void);
 
void
parallel (int a, int b)
{
int bad, LASTPRIV, LASTPRIV_SEC;
int i;
 
a = b = 3;
 
bad = 0;
 
#pragma omp parallel firstprivate (a,b) shared (bad) num_threads (5)
{
if (a != 3 || b != 3)
bad = 1;
 
#pragma omp for lastprivate (LASTPRIV)
for (i = 0; i < 10; i++)
LASTPRIV = i;
 
#pragma omp sections lastprivate (LASTPRIV_SEC)
{
#pragma omp section
{ LASTPRIV_SEC = 3; }
 
#pragma omp section
{ LASTPRIV_SEC = 42; }
}
 
}
 
if (LASTPRIV != 9)
abort ();
 
if (LASTPRIV_SEC != 42)
abort ();
 
if (bad)
abort ();
}
 
int main()
{
parallel (1, 2);
return 0;
}
/libgomp.c++/task-6.C
0,0 → 1,86
extern "C" void abort ();
 
int a = 18;
 
template <typename T>
void
f1 (T i, T j, T k)
{
T l = 6, m = 7, n = 8;
#pragma omp task private(j, m) shared(k, n)
{
j = 6;
m = 5;
if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9)
#pragma omp atomic
k++;
}
#pragma omp taskwait
if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9)
abort ();
}
 
int v1 = 1, v2 = 2, v5 = 5;
int e;
 
template <typename T>
void
f2 (void)
{
T v3 = 3;
#pragma omp sections private (v1) firstprivate (v2)
{
#pragma omp section
{
T v4 = 4;
v1 = 7;
#pragma omp task
{
if (++v1 != 8 || ++v2 != 3 || ++v3 != 4 || ++v4 != 5 || ++v5 != 6)
e = 1;
}
#pragma omp taskwait
if (v1 != 7 || v2 != 2 || v3 != 3 || v4 != 4 || v5 != 6)
abort ();
if (e)
abort ();
}
}
}
 
template <typename T>
void
f3 (T i, T j, T k)
{
T l = 6, m = 7, n = 8;
#pragma omp task private(j, m) shared(k, n) untied
{
j = 6;
m = 5;
if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9)
#pragma omp atomic
k++;
}
#pragma omp taskwait
if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9)
abort ();
}
 
int
main ()
{
f1 <int> (8, 26, 0);
f2 <int> ();
a = 18;
f3 <int> (8, 26, 0);
a = 18;
#pragma omp parallel num_threads(4)
{
#pragma omp master
{
f1 <int> (8, 26, 0);
a = 18;
f3 <int> (8, 26, 0);
}
}
}
/libgomp.c++/task-8.C
0,0 → 1,44
// { dg-do run }
 
#include <omp.h>
#include <cstdlib>
 
int errval;
 
int
main ()
{
int e;
#pragma omp parallel shared(errval)
{
if (omp_in_final ())
#pragma omp atomic write
errval = 1;
#pragma omp task if (0) shared(errval)
{
if (omp_in_final ())
#pragma omp atomic write
errval = 1;
#pragma omp task if (0) shared(errval)
if (omp_in_final ())
#pragma omp atomic write
errval = 1;
}
#pragma omp task final (1) shared(errval)
{
if (!omp_in_final ())
#pragma omp atomic write
errval = 1;
#pragma omp taskyield
#pragma omp taskwait
#pragma omp task shared(errval)
if (!omp_in_final ())
#pragma omp atomic write
errval = 1;
}
}
#pragma omp atomic read
e = errval;
if (e)
abort ();
}
/libgomp.c++/loop-2.C
0,0 → 1,32
#include <omp.h>
 
/* Orphaned work sharing. */
 
extern "C" void abort (void);
 
#define N 10
 
void parloop (int *a)
{
int i;
 
#pragma omp for
for (i = 0; i < N; i++)
a[i] = i + 3;
}
 
main()
{
int i, a[N];
 
#pragma omp parallel shared(a)
{
parloop (a);
}
 
for (i = 0; i < N; i++)
if (a[i] != i + 3)
abort ();
 
return 0;
}
/libgomp.c++/loop-4.C
0,0 → 1,20
extern "C" void abort (void);
 
main()
{
int i, a;
 
a = 30;
 
#pragma omp parallel for firstprivate (a) lastprivate (a) \
num_threads (2) schedule(static)
for (i = 0; i < 10; i++)
a = a + i;
 
/* The thread that owns the last iteration will have computed
30 + 5 + 6 + 7 + 8 + 9 = 65. */
if (a != 65)
abort ();
 
return 0;
}
/libgomp.c++/atomic-1.C
0,0 → 1,53
// PR c++/33894
// { dg-do run }
// { dg-options "-O2" }
 
extern "C" void abort ();
 
int check;
 
template<typename T> void
foo ()
{
#pragma omp atomic
check |= sizeof (T);
}
 
template<typename T> void
bar (T *x, T y)
{
#pragma omp atomic
*x += y;
}
 
template<typename T> void
baz ()
{
#pragma omp atomic
check++;
}
 
int
main ()
{
int i = 0;
long l = 0;
 
check = 0;
foo<char> ();
if (check != sizeof (char))
abort ();
foo<short> ();
if (check != (sizeof (char) | sizeof (short)))
abort ();
bar(&i, 4);
bar(&l, 8L);
if (i != 4 || l != 8L)
abort ();
baz<char> ();
if (check != (sizeof (char) | sizeof (short)) + 1)
abort ();
baz<long double> ();
if (check != (sizeof (char) | sizeof (short)) + 2)
abort ();
}
/libgomp.c++/loop-6.C
0,0 → 1,25
// { dg-do run }
 
extern "C" void abort (void);
 
volatile int count;
static int test(void)
{
return ++count > 0;
}
 
int i;
 
int main()
{
#pragma omp for lastprivate (i)
for (i = 0; i < 10; ++i)
{
if (test())
continue;
abort ();
}
if (i != count)
abort ();
return 0;
}
/libgomp.c++/atomic-3.C
0,0 → 1,74
// { dg-do run }
 
extern "C" void abort (void);
bool v, x1, x2, x3, x4, x5, x6;
 
void
foo ()
{
#pragma omp atomic capture
v = ++x1;
if (!v)
abort ();
#pragma omp atomic capture
v = x2++;
if (v)
abort ();
#pragma omp atomic read
v = x3;
if (!v)
abort ();
#pragma omp atomic read
v = x4;
if (!v)
abort ();
#pragma omp atomic capture
{ v = x5; x5 |= 1; }
if (v)
abort ();
#pragma omp atomic capture
{ x6 |= 1; v = x6; }
if (!v)
abort ();
}
 
void
bar ()
{
#pragma omp atomic write
x1 = false;
#pragma omp atomic write
x2 = false;
#pragma omp atomic capture
{ ++x1; v = x1; }
if (!v)
abort ();
#pragma omp atomic capture
{ v = x2; x2++; }
if (v)
abort ();
#pragma omp atomic write
x1 = false;
#pragma omp atomic write
x2 = false;
#pragma omp atomic capture
{ x1++; v = x1; }
if (!v)
abort ();
#pragma omp atomic capture
{ v = x2; ++x2; }
if (v)
abort ();
}
 
int
main ()
{
#pragma omp atomic write
x3 = true;
#pragma omp atomic write
x4 = true;
foo ();
bar ();
return 0;
}
/libgomp.c++/atomic-5.C
0,0 → 1,79
// { dg-do run }
 
extern "C" void abort (void);
 
template <typename T>
void
foo ()
{
extern T v, x1, x2, x3, x4, x5, x6;
#pragma omp atomic capture
v = ++x1;
if (!v)
abort ();
#pragma omp atomic capture
v = x2++;
if (v)
abort ();
#pragma omp atomic read
v = x3;
if (!v)
abort ();
#pragma omp atomic read
v = x4;
if (!v)
abort ();
#pragma omp atomic capture
{ v = x5; x5 |= 1; }
if (v)
abort ();
#pragma omp atomic capture
{ x6 |= 1; v = x6; }
if (!v)
abort ();
}
 
template <typename T>
void
bar ()
{
extern T v, x1, x2;
#pragma omp atomic write
x1 = false;
#pragma omp atomic write
x2 = false;
#pragma omp atomic capture
{ ++x1; v = x1; }
if (!v)
abort ();
#pragma omp atomic capture
{ v = x2; x2++; }
if (v)
abort ();
#pragma omp atomic write
x1 = false;
#pragma omp atomic write
x2 = false;
#pragma omp atomic capture
{ x1++; v = x1; }
if (!v)
abort ();
#pragma omp atomic capture
{ v = x2; ++x2; }
if (v)
abort ();
}
 
bool v, x1, x2, x3, x4, x5, x6;
 
int
main ()
{
#pragma omp atomic write
x3 = true;
#pragma omp atomic write
x4 = true;
foo <bool> ();
bar <bool> ();
return 0;
}
/libgomp.c++/loop-8.C
0,0 → 1,276
#include <omp.h>
#include <stdlib.h>
#include <string.h>
 
int
test1 ()
{
short int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[10]; p < &buf[54]; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[3]; p <= &buf[63]; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[16]; p < &buf[51]; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[16]; p <= &buf[40]; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[53]; p > &buf[9]; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[63]; p >= &buf[3]; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[48]; p > &buf[15]; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[40]; p >= &buf[16]; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test2 ()
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[10]; p < &buf[54]; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[3]; p <= &buf[63]; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[16]; p < &buf[51]; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[16]; p <= &buf[40]; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[53]; p > &buf[9]; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[63]; p >= &buf[3]; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[48]; p > &buf[15]; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[40]; p >= &buf[16]; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test3 ()
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[10]; p < &buf[54]; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[3]; p <= &buf[63]; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[16]; p < &buf[51]; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[16]; p <= &buf[40]; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[53]; p > &buf[9]; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[63]; p >= &buf[3]; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[48]; p > &buf[15]; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[40]; p >= &buf[16]; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test4 ()
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[10]; p < &buf[54]; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[3]; p <= &buf[63]; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[16]; p < &buf[51]; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[16]; p <= &buf[40]; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[53]; p > &buf[9]; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[63]; p >= &buf[3]; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[48]; p > &buf[15]; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[40]; p >= &buf[16]; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
main ()
{
test1 ();
test2 ();
test3 ();
omp_set_schedule (omp_sched_static, 0);
test4 ();
omp_set_schedule (omp_sched_static, 3);
test4 ();
omp_set_schedule (omp_sched_dynamic, 5);
test4 ();
omp_set_schedule (omp_sched_guided, 2);
test4 ();
return 0;
}
/libgomp.c++/pr30703.C
0,0 → 1,73
// PR c++/30703
// { dg-do run }
 
#include <omp.h>
 
extern "C" void abort ();
 
int ctor, cctor, dtor;
 
struct A
{
A();
A(const A &);
~A();
int i;
};
 
A::A()
{
#pragma omp atomic
ctor++;
}
 
A::A(const A &r)
{
i = r.i;
#pragma omp atomic
cctor++;
}
 
A::~A()
{
#pragma omp atomic
dtor++;
}
 
void
foo (A a, A b)
{
int i, j = 0;
#pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
for (i = 0; i < 5; i++)
{
b.i = 5;
if (a.i != 6)
#pragma omp atomic
j += 1;
a.i = b.i + i + 6;
}
 
if (j || a.i != 15)
abort ();
}
 
void
bar ()
{
A a, b;
a.i = 6;
b.i = 7;
foo (a, b);
}
 
int
main ()
{
omp_set_dynamic (false);
if (ctor || cctor || dtor)
abort ();
bar ();
if (ctor + cctor != dtor)
abort ();
}
/libgomp.c++/single-2.C
0,0 → 1,36
extern "C" void abort (void);
 
struct X
{
int a;
char b;
int c;
};
 
main()
{
int i = 0;
struct X x;
int bad = 0;
 
#pragma omp parallel private (i, x) shared (bad)
{
i = 5;
 
#pragma omp single copyprivate (i, x)
{
i++;
x.a = 23;
x.b = 42;
x.c = 26;
}
 
if (i != 6 || x.a != 23 || x.b != 42 || x.c != 26)
bad = 1;
}
 
if (bad)
abort ();
 
return 0;
}
/libgomp.c++/atomic-7.C
0,0 → 1,63
// { dg-do run }
 
extern "C" void abort (void);
 
template <typename S, typename T>
void
foo (void)
{
extern S l, m;
extern T i, j;
 
#pragma omp atomic read
i = l;
#pragma omp atomic read
m = j;
if (i != 77 || m != 88)
abort ();
#pragma omp atomic write
l = 1 + i + 6 * 1;
#pragma omp atomic write
j = 170 - 170 + m + 1 * 7;
#pragma omp atomic capture
i = l += 4;
#pragma omp atomic capture
m = j += 4;
if (i != 88 || m != 99)
abort ();
#pragma omp atomic capture
{
i = l;
l += 4;
}
#pragma omp atomic capture
{
m = j;
j += 4;
}
if (i != 88 || m != 99)
abort ();
#pragma omp atomic capture
{
l += 4;
i = l;
}
#pragma omp atomic capture
{
j += 4;
m = j;
}
if (i != 96 || m != 107)
abort ();
}
 
long long l, m;
int i, j;
 
int
main ()
{
l = 77;
j = 88;
foo <long long, int> ();
}
/libgomp.c++/c++.exp
0,0 → 1,60
load_lib libgomp-dg.exp
 
global shlib_ext
 
set shlib_ext [get_shlib_extension]
set lang_link_flags "-lstdc++"
set lang_test_file_found 0
set lang_library_path "../libstdc++-v3/src/.libs"
 
# Initialize dg.
dg-init
 
set blddir [lookfor_file [get_multilibs] libgomp]
 
 
if { $blddir != "" } {
# Look for a static libstdc++ first.
if [file exists "${blddir}/${lang_library_path}/libstdc++.a"] {
set lang_test_file "${lang_library_path}/libstdc++.a"
set lang_test_file_found 1
# We may have a shared only build, so look for a shared libstdc++.
} elseif [file exists "${blddir}/${lang_library_path}/libstdc++.${shlib_ext}"] {
set lang_test_file "${lang_library_path}/libstdc++.${shlib_ext}"
set lang_test_file_found 1
} else {
puts "No libstdc++ library found, will not execute c++ tests"
}
} elseif { [info exists GXX_UNDER_TEST] } {
set lang_test_file_found 1
# Needs to exist for libgomp.exp.
set lang_test_file ""
} else {
puts "GXX_UNDER_TEST not defined, will not execute c++ tests"
}
 
if { $lang_test_file_found } {
# Gather a list of all tests.
set tests [lsort [glob -nocomplain $srcdir/$subdir/*.C]]
 
if { $blddir != "" } {
set ld_library_path "$always_ld_library_path:${blddir}/${lang_library_path}"
} else {
set ld_library_path "$always_ld_library_path"
}
append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
set_ld_library_path_env_vars
 
set flags_file "${blddir}/../libstdc++-v3/scripts/testsuite_flags"
if { [file exists $flags_file] } {
set libstdcxx_includes [exec sh $flags_file --build-includes]
} else {
set libstdcxx_includes ""
}
 
# Main loop.
gfortran-dg-runtest $tests $libstdcxx_includes
}
 
# All done.
dg-finish
/libgomp.c++/atomic-9.C
0,0 → 1,148
// { dg-do run }
 
extern "C" void abort ();
 
int cnt;
 
int
foo ()
{
return cnt++;
}
 
template <typename T>
void
bar ()
{
extern T x;
T v, *p;
#pragma omp atomic update
x = x + 7;
#pragma omp atomic
x = x + 7 + 6;
#pragma omp atomic update
x = x + 2 * 3;
#pragma omp atomic
x = x * (2 - 1);
#pragma omp atomic read
v = x;
if (v != 32)
abort ();
#pragma omp atomic write
x = 0;
#pragma omp atomic capture
{
v = x;
x = x | 1 ^ 2;
}
if (v != 0)
abort ();
#pragma omp atomic capture
{
v = x;
x = x | 4 | 2;
}
if (v != 3)
abort ();
#pragma omp atomic read
v = x;
if (v != 7)
abort ();
#pragma omp atomic capture
{
x = x ^ 6 & 2;
v = x;
}
if (v != 5)
abort ();
#pragma omp atomic capture
{ x = x - (6 + 4); v = x; }
if (v != -5)
abort ();
#pragma omp atomic capture
{ v = x; x = x - (1 | 2); }
if (v != -5)
abort ();
#pragma omp atomic read
v = x;
if (v != -8)
abort ();
#pragma omp atomic
x = x * -4 / 2;
#pragma omp atomic read
v = x;
if (v != 16)
abort ();
p = &x;
#pragma omp atomic update
p[foo (), 0] = p[foo (), 0] - 16;
#pragma omp atomic read
v = x;
if (cnt != 2 || v != 0)
abort ();
#pragma omp atomic capture
{
p[foo (), 0] += 6;
v = p[foo (), 0];
}
if (cnt != 4 || v != 6)
abort ();
#pragma omp atomic capture
{
v = p[foo (), 0];
p[foo (), 0] += 6;
}
if (cnt != 6 || v != 6)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic capture
{
p[foo (), 0] = p[foo (), 0] + 6;
v = p[foo (), 0];
}
if (cnt != 9 || v != 18)
abort ();
#pragma omp atomic capture
{
v = p[foo (), 0];
p[foo (), 0] = p[foo (), 0] + 6;
}
if (cnt != 12 || v != 18)
abort ();
#pragma omp atomic read
v = x;
if (v != 24)
abort ();
#pragma omp atomic capture
{ v = p[foo (), 0]; p[foo (), 0]++; }
#pragma omp atomic capture
{ v = p[foo (), 0]; ++p[foo (), 0]; }
#pragma omp atomic capture
{ p[foo (), 0]++; v = p[foo (), 0]; }
#pragma omp atomic capture
{ ++p[foo (), 0]; v = p[foo (), 0]; }
if (cnt != 20 || v != 28)
abort ();
#pragma omp atomic capture
{ v = p[foo (), 0]; p[foo (), 0]--; }
#pragma omp atomic capture
{ v = p[foo (), 0]; --p[foo (), 0]; }
#pragma omp atomic capture
{ p[foo (), 0]--; v = p[foo (), 0]; }
#pragma omp atomic capture
{ --p[foo (), 0]; v = p[foo (), 0]; }
if (cnt != 28 || v != 24)
abort ();
}
 
int x = 6;
 
int
main ()
{
bar <int> ();
return 0;
}
/libgomp.c++/for-1.C
0,0 → 1,291
// { dg-do run }
 
typedef __PTRDIFF_TYPE__ ptrdiff_t;
extern "C" void abort ();
 
template <typename T>
class I
{
public:
typedef ptrdiff_t difference_type;
I ();
~I ();
I (T *);
I (const I &);
T &operator * ();
T *operator -> ();
T &operator [] (const difference_type &) const;
I &operator = (const I &);
I &operator ++ ();
I operator ++ (int);
I &operator -- ();
I operator -- (int);
I &operator += (const difference_type &);
I &operator -= (const difference_type &);
I operator + (const difference_type &) const;
I operator - (const difference_type &) const;
template <typename S> friend bool operator == (I<S> &, I<S> &);
template <typename S> friend bool operator == (const I<S> &, const I<S> &);
template <typename S> friend bool operator < (I<S> &, I<S> &);
template <typename S> friend bool operator < (const I<S> &, const I<S> &);
template <typename S> friend bool operator <= (I<S> &, I<S> &);
template <typename S> friend bool operator <= (const I<S> &, const I<S> &);
template <typename S> friend bool operator > (I<S> &, I<S> &);
template <typename S> friend bool operator > (const I<S> &, const I<S> &);
template <typename S> friend bool operator >= (I<S> &, I<S> &);
template <typename S> friend bool operator >= (const I<S> &, const I<S> &);
template <typename S> friend typename I<S>::difference_type operator - (I<S> &, I<S> &);
template <typename S> friend typename I<S>::difference_type operator - (const I<S> &, const I<S> &);
template <typename S> friend I<S> operator + (typename I<S>::difference_type , const I<S> &);
private:
T *p;
};
template <typename T> I<T>::I () : p (0) {}
template <typename T> I<T>::~I () {}
template <typename T> I<T>::I (T *x) : p (x) {}
template <typename T> I<T>::I (const I &x) : p (x.p) {}
template <typename T> T &I<T>::operator * () { return *p; }
template <typename T> T *I<T>::operator -> () { return p; }
template <typename T> T &I<T>::operator [] (const difference_type &x) const { return p[x]; }
template <typename T> I<T> &I<T>::operator = (const I &x) { p = x.p; return *this; }
template <typename T> I<T> &I<T>::operator ++ () { ++p; return *this; }
template <typename T> I<T> I<T>::operator ++ (int) { return I (p++); }
template <typename T> I<T> &I<T>::operator -- () { --p; return *this; }
template <typename T> I<T> I<T>::operator -- (int) { return I (p--); }
template <typename T> I<T> &I<T>::operator += (const difference_type &x) { p += x; return *this; }
template <typename T> I<T> &I<T>::operator -= (const difference_type &x) { p -= x; return *this; }
template <typename T> I<T> I<T>::operator + (const difference_type &x) const { return I (p + x); }
template <typename T> I<T> I<T>::operator - (const difference_type &x) const { return I (p - x); }
template <typename T> bool operator == (I<T> &x, I<T> &y) { return x.p == y.p; }
template <typename T> bool operator == (const I<T> &x, const I<T> &y) { return x.p == y.p; }
template <typename T> bool operator != (I<T> &x, I<T> &y) { return !(x == y); }
template <typename T> bool operator != (const I<T> &x, const I<T> &y) { return !(x == y); }
template <typename T> bool operator < (I<T> &x, I<T> &y) { return x.p < y.p; }
template <typename T> bool operator < (const I<T> &x, const I<T> &y) { return x.p < y.p; }
template <typename T> bool operator <= (I<T> &x, I<T> &y) { return x.p <= y.p; }
template <typename T> bool operator <= (const I<T> &x, const I<T> &y) { return x.p <= y.p; }
template <typename T> bool operator > (I<T> &x, I<T> &y) { return x.p > y.p; }
template <typename T> bool operator > (const I<T> &x, const I<T> &y) { return x.p > y.p; }
template <typename T> bool operator >= (I<T> &x, I<T> &y) { return x.p >= y.p; }
template <typename T> bool operator >= (const I<T> &x, const I<T> &y) { return x.p >= y.p; }
template <typename T> typename I<T>::difference_type operator - (I<T> &x, I<T> &y) { return x.p - y.p; }
template <typename T> typename I<T>::difference_type operator - (const I<T> &x, const I<T> &y) { return x.p - y.p; }
template <typename T> I<T> operator + (typename I<T>::difference_type x, const I<T> &y) { return I<T> (x + y.p); }
 
template <typename T>
class J
{
public:
J(const I<T> &x, const I<T> &y) : b (x), e (y) {}
const I<T> &begin ();
const I<T> &end ();
private:
I<T> b, e;
};
 
template <typename T> const I<T> &J<T>::begin () { return b; }
template <typename T> const I<T> &J<T>::end () { return e; }
 
int results[2000];
 
template <typename T>
void
baz (I<T> &i)
{
if (*i < 0 || *i >= 2000)
abort ();
results[*i]++;
}
 
void
f1 (const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (I<int> i = x; i <= y; i += 6)
baz (i);
}
 
void
f2 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel for private(i)
for (i = x; i < y - 1; i = 1 - 6 + 7 + i)
baz (i);
}
 
template <typename T>
void
f3 (const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (I<int> i = x; i <= y; i = i + 9 - 8)
baz (i);
}
 
template <typename T>
void
f4 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel for lastprivate(i)
for (i = x + 2000 - 64; i > y + 10; --i)
baz (i);
}
 
void
f5 (const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (I<int> i = x + 2000 - 64; i > y + 10; i -= 10)
baz (i);
}
 
template <int N>
void
f6 (const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (I<int> i = x + 2000 - 64; i > y + 10; i = i - 12 + 2)
{
I<int> j = i + N;
baz (j);
}
}
 
template <int N>
void
f7 (I<int> i, const I<int> &x, const I<int> &y)
{
#pragma omp parallel for
for (i = x - 10; i <= y + 10; i += N)
baz (i);
}
 
template <int N>
void
f8 (J<int> j)
{
I<int> i;
#pragma omp parallel for
for (i = j.begin (); i <= j.end () + N; i += 2)
baz (i);
}
 
template <typename T, int N>
void
f9 (const I<T> &x, const I<T> &y)
{
#pragma omp parallel for
for (I<T> i = x; i <= y; i = i + N)
baz (i);
}
 
template <typename T, int N>
void
f10 (const I<T> &x, const I<T> &y)
{
I<T> i;
#pragma omp parallel for
for (i = x; i > y; i = i + N)
baz (i);
}
 
template <typename T>
void
f11 (const T &x, const T &y)
{
#pragma omp parallel
{
#pragma omp for nowait
for (T i = x; i <= y; i += 3)
baz (i);
#pragma omp single
{
T j = y + 3;
baz (j);
}
}
}
 
template <typename T>
void
f12 (const T &x, const T &y)
{
T i;
#pragma omp parallel for
for (i = x; i > y; --i)
baz (i);
}
 
template <int N>
struct K
{
template <typename T>
static void
f13 (const T &x, const T &y)
{
#pragma omp parallel for
for (T i = x; i <= y + N; i += N)
baz (i);
}
};
 
#define check(expr) \
for (int i = 0; i < 2000; i++) \
if (expr) \
{ \
if (results[i] != 1) \
abort (); \
results[i] = 0; \
} \
else if (results[i]) \
abort ()
 
int
main ()
{
int a[2000];
long b[2000];
for (int i = 0; i < 2000; i++)
{
a[i] = i;
b[i] = i;
}
f1 (&a[10], &a[1990]);
check (i >= 10 && i <= 1990 && (i - 10) % 6 == 0);
f2 (&a[0], &a[1999]);
check (i < 1998 && (i & 1) == 0);
f3<char> (&a[20], &a[1837]);
check (i >= 20 && i <= 1837);
f4<int> (&a[0], &a[30]);
check (i > 40 && i <= 2000 - 64);
f5 (&a[0], &a[100]);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f6<-10> (&a[10], &a[110]);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f7<6> (I<int> (), &a[12], &a[1800]);
check (i >= 2 && i <= 1808 && (i - 2) % 6 == 0);
f8<121> (J<int> (&a[14], &a[1803]));
check (i >= 14 && i <= 1924 && (i & 1) == 0);
f9<int, 7> (&a[33], &a[1967]);
check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0);
f10<int, -7> (&a[1939], &a[17]);
check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0);
f11<I<int> > (&a[16], &a[1981]);
check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0);
f12<I<int> > (&a[1761], &a[37]);
check (i > 37 && i <= 1761);
K<5>::f13<I<int> > (&a[1], &a[1935]);
check (i >= 1 && i <= 1936 && (i - 1) % 5 == 0);
f9<long, 7> (&b[33], &b[1967]);
check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0);
f10<long, -7> (&b[1939], &b[17]);
check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0);
f11<I<long> > (&b[16], &b[1981]);
check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0);
f12<I<long> > (&b[1761], &b[37]);
check (i > 37 && i <= 1761);
K<5>::f13<I<long> > (&b[1], &b[1935]);
check (i >= 1 && i <= 1936 && (i - 1) % 5 == 0);
}
/libgomp.c++/ctor-10.C
0,0 → 1,78
// { dg-do run }
// { dg-require-effective-target tls_runtime }
 
#include <omp.h>
#include <assert.h>
 
#define N 10
#define THR 4
 
struct B
{
B();
B(const B &);
~B();
B& operator=(const B &);
void doit();
static B *base;
static B *threadbase;
#pragma omp threadprivate(threadbase)
};
 
B *B::base;
B *B::threadbase;
static unsigned cmask[THR];
static unsigned dmask[THR];
 
B::B()
{
assert (base == 0);
}
 
B::B(const B &b)
{
unsigned index = &b - base;
assert (index < N);
cmask[omp_get_thread_num()] |= 1u << index;
}
 
B::~B()
{
if (threadbase)
{
unsigned index = this - threadbase;
assert (index < N);
dmask[omp_get_thread_num()] |= 1u << index;
}
}
 
void foo()
{
B b[N];
 
B::base = b;
 
#pragma omp parallel firstprivate(b)
{
assert (omp_get_num_threads () == THR);
B::threadbase = b;
}
 
B::threadbase = 0;
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (THR);
foo();
 
for (int i = 0; i < THR; ++i)
{
unsigned xmask = (1u << N) - 1;
assert (cmask[i] == xmask);
assert (dmask[i] == xmask);
}
 
return 0;
}
/libgomp.c++/for-3.C
0,0 → 1,239
// { dg-do run }
 
#include <vector>
#include <cstdlib>
 
template <typename T>
class J
{
public:
typedef typename std::vector<T>::const_iterator const_iterator;
J(const const_iterator &x, const const_iterator &y) : b (x), e (y) {}
const const_iterator &begin ();
const const_iterator &end ();
private:
const_iterator b, e;
};
 
template <typename T>
const typename std::vector<T>::const_iterator &J<T>::begin () { return b; }
template <typename T>
const typename std::vector<T>::const_iterator &J<T>::end () { return e; }
 
int results[2000];
 
template <typename T>
void
baz (T &i)
{
if (*i < 0 || *i >= 2000)
std::abort ();
results[*i]++;
}
 
void
f1 (const std::vector<int>::const_iterator &x,
const std::vector<int>::const_iterator &y)
{
#pragma omp parallel for
for (std::vector<int>::const_iterator i = x; i <= y; i += 6)
baz (i);
}
 
void
f2 (const std::vector<int>::const_iterator &x,
const std::vector<int>::const_iterator &y)
{
std::vector<int>::const_iterator i;
#pragma omp parallel for private(i)
for (i = x; i < y - 1; i = 1 - 6 + 7 + i)
baz (i);
}
 
template <typename T>
void
f3 (const std::vector<int>::const_iterator &x,
const std::vector<int>::const_iterator &y)
{
#pragma omp parallel for schedule (dynamic, 6)
for (std::vector<int>::const_iterator i = x; i <= y; i = i + 9 - 8)
baz (i);
}
 
template <typename T>
void
f4 (const std::vector<int>::const_iterator &x,
const std::vector<int>::const_iterator &y)
{
std::vector<int>::const_iterator i;
#pragma omp parallel for lastprivate(i)
for (i = x + 2000 - 64; i > y + 10; --i)
baz (i);
}
 
void
f5 (const std::vector<int>::const_iterator &x,
const std::vector<int>::const_iterator &y)
{
#pragma omp parallel for schedule (static, 10)
for (std::vector<int>::const_iterator i = x + 2000 - 64; i > y + 10; i -= 10)
baz (i);
}
 
template <int N>
void
f6 (const std::vector<int>::const_iterator &x,
const std::vector<int>::const_iterator &y)
{
#pragma omp parallel for schedule (runtime)
for (std::vector<int>::const_iterator i = x + 2000 - 64;
i > y + 10; i = i - 12 + 2)
{
std::vector<int>::const_iterator j = i + N;
baz (j);
}
}
 
template <int N>
void
f7 (std::vector<int>::const_iterator i,
const std::vector<int>::const_iterator &x,
const std::vector<int>::const_iterator &y)
{
#pragma omp parallel for schedule (dynamic, 6)
for (i = x - 10; i <= y + 10; i += N)
baz (i);
}
 
template <int N>
void
f8 (J<int> j)
{
std::vector<int>::const_iterator i;
#pragma omp parallel for schedule (dynamic, 40)
for (i = j.begin (); i <= j.end () + N; i += 2)
baz (i);
}
 
template <typename T, int N>
void
f9 (const typename std::vector<T>::const_iterator &x,
const typename std::vector<T>::const_iterator &y)
{
#pragma omp parallel for schedule (static, 25)
for (typename std::vector<T>::const_iterator i = x; i <= y; i = i + N)
baz (i);
}
 
template <typename T, int N>
void
f10 (const typename std::vector<T>::const_iterator &x,
const typename std::vector<T>::const_iterator &y)
{
typename std::vector<T>::const_iterator i;
#pragma omp parallel for
for (i = x; i > y; i = i + N)
baz (i);
}
 
template <typename T>
void
f11 (const T &x, const T &y)
{
#pragma omp parallel
{
#pragma omp for nowait schedule (static, 2)
for (T i = x; i <= y; i += 3)
baz (i);
#pragma omp single
{
T j = y + 3;
baz (j);
}
}
}
 
template <typename T>
void
f12 (const T &x, const T &y)
{
T i;
#pragma omp parallel for schedule (dynamic, 130)
for (i = x; i > y; --i)
baz (i);
}
 
template <int N>
struct K
{
template <typename T>
static void
f13 (const T &x, const T &y)
{
#pragma omp parallel for schedule (runtime)
for (T i = x; i <= y + N; i += N)
baz (i);
}
};
 
#define check(expr) \
for (int i = 0; i < 2000; i++) \
if (expr) \
{ \
if (results[i] != 1) \
std::abort (); \
results[i] = 0; \
} \
else if (results[i]) \
std::abort ()
 
int
main ()
{
std::vector<int> a(2000);
std::vector<long> b(2000);
for (int i = 0; i < 2000; i++)
{
a[i] = i;
b[i] = i;
}
f1 (a.begin () + 10, a.begin () + 1990);
check (i >= 10 && i <= 1990 && (i - 10) % 6 == 0);
f2 (a.begin () + 0, a.begin () + 1999);
check (i < 1998 && (i & 1) == 0);
f3<char> (a.begin () + 20, a.begin () + 1837);
check (i >= 20 && i <= 1837);
f4<int> (a.begin () + 0, a.begin () + 30);
check (i > 40 && i <= 2000 - 64);
f5 (a.begin () + 0, a.begin () + 100);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f6<-10> (a.begin () + 10, a.begin () + 110);
check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0);
f7<6> (std::vector<int>::const_iterator (), a.begin () + 12,
a.begin () + 1800);
check (i >= 2 && i <= 1808 && (i - 2) % 6 == 0);
f8<121> (J<int> (a.begin () + 14, a.begin () + 1803));
check (i >= 14 && i <= 1924 && (i & 1) == 0);
f9<int, 7> (a.begin () + 33, a.begin () + 1967);
check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0);
f10<int, -7> (a.begin () + 1939, a.begin () + 17);
check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0);
f11<std::vector<int>::const_iterator > (a.begin () + 16, a.begin () + 1981);
check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0);
f12<std::vector<int>::const_iterator > (a.begin () + 1761, a.begin () + 37);
check (i > 37 && i <= 1761);
K<5>::f13<std::vector<int>::const_iterator > (a.begin () + 1,
a.begin () + 1935);
check (i >= 1 && i <= 1936 && (i - 1) % 5 == 0);
f9<long, 7> (b.begin () + 33, b.begin () + 1967);
check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0);
f10<long, -7> (b.begin () + 1939, b.begin () + 17);
check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0);
f11<std::vector<long>::const_iterator > (b.begin () + 16, b.begin () + 1981);
check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0);
f12<std::vector<long>::const_iterator > (b.begin () + 1761, b.begin () + 37);
check (i > 37 && i <= 1761);
K<5>::f13<std::vector<long>::const_iterator > (b.begin () + 1,
b.begin () + 1935);
check (i >= 1 && i <= 1936 && (i - 1) % 5 == 0);
}
/libgomp.c++/ctor-12.C
0,0 → 1,65
// PR c++/36308
// { dg-do run }
 
extern "C" void abort ();
 
static int n;
 
struct A
{
A ()
{
l = 0;
#pragma omp atomic
ctors++;
}
A (const A &x)
{
l = x.l;
#pragma omp atomic
copyctors++;
}
virtual A& operator= (const A &x)
{
l = x.l;
#pragma omp atomic
assignops++;
return *this;
}
virtual ~A ()
{
#pragma omp atomic
dtors++;
}
int l;
static int ctors, dtors, copyctors, assignops;
};
 
int A::ctors;
int A::dtors;
int A::copyctors;
int A::assignops;
 
int
main ()
{
A a;
#pragma omp parallel private (a)
{
a.l = 6;
#pragma omp single copyprivate (a)
{
a.l = 3;
}
if (a.l != 3)
abort ();
#pragma omp atomic
n++;
}
if (A::ctors != n + 1
|| A::copyctors != 0
|| A::dtors != n
|| A::assignops != n - 1)
abort ();
return 0;
}
/libgomp.c++/for-5.C
0,0 → 1,303
// { dg-do run }
 
typedef __PTRDIFF_TYPE__ ptrdiff_t;
extern "C" void abort ();
 
template <typename T>
class I
{
public:
typedef ptrdiff_t difference_type;
I ();
~I ();
I (T *);
I (const I &);
T &operator * ();
T *operator -> ();
T &operator [] (const difference_type &) const;
I &operator = (const I &);
I &operator ++ ();
I operator ++ (int);
I &operator -- ();
I operator -- (int);
I &operator += (const difference_type &);
I &operator -= (const difference_type &);
I operator + (const difference_type &) const;
I operator - (const difference_type &) const;
template <typename S> friend bool operator == (I<S> &, I<S> &);
template <typename S> friend bool operator == (const I<S> &, const I<S> &);
template <typename S> friend bool operator < (I<S> &, I<S> &);
template <typename S> friend bool operator < (const I<S> &, const I<S> &);
template <typename S> friend bool operator <= (I<S> &, I<S> &);
template <typename S> friend bool operator <= (const I<S> &, const I<S> &);
template <typename S> friend bool operator > (I<S> &, I<S> &);
template <typename S> friend bool operator > (const I<S> &, const I<S> &);
template <typename S> friend bool operator >= (I<S> &, I<S> &);
template <typename S> friend bool operator >= (const I<S> &, const I<S> &);
template <typename S> friend typename I<S>::difference_type operator - (I<S> &, I<S> &);
template <typename S> friend typename I<S>::difference_type operator - (const I<S> &, const I<S> &);
template <typename S> friend I<S> operator + (typename I<S>::difference_type , const I<S> &);
private:
T *p;
};
template <typename T> I<T>::I () : p (0) {}
template <typename T> I<T>::~I () { p = (T *) 0; }
template <typename T> I<T>::I (T *x) : p (x) {}
template <typename T> I<T>::I (const I &x) : p (x.p) {}
template <typename T> T &I<T>::operator * () { return *p; }
template <typename T> T *I<T>::operator -> () { return p; }
template <typename T> T &I<T>::operator [] (const difference_type &x) const { return p[x]; }
template <typename T> I<T> &I<T>::operator = (const I &x) { p = x.p; return *this; }
template <typename T> I<T> &I<T>::operator ++ () { ++p; return *this; }
template <typename T> I<T> I<T>::operator ++ (int) { return I (p++); }
template <typename T> I<T> &I<T>::operator -- () { --p; return *this; }
template <typename T> I<T> I<T>::operator -- (int) { return I (p--); }
template <typename T> I<T> &I<T>::operator += (const difference_type &x) { p += x; return *this; }
template <typename T> I<T> &I<T>::operator -= (const difference_type &x) { p -= x; return *this; }
template <typename T> I<T> I<T>::operator + (const difference_type &x) const { return I (p + x); }
template <typename T> I<T> I<T>::operator - (const difference_type &x) const { return I (p - x); }
template <typename T> bool operator == (I<T> &x, I<T> &y) { return x.p == y.p; }
template <typename T> bool operator == (const I<T> &x, const I<T> &y) { return x.p == y.p; }
template <typename T> bool operator != (I<T> &x, I<T> &y) { return !(x == y); }
template <typename T> bool operator != (const I<T> &x, const I<T> &y) { return !(x == y); }
template <typename T> bool operator < (I<T> &x, I<T> &y) { return x.p < y.p; }
template <typename T> bool operator < (const I<T> &x, const I<T> &y) { return x.p < y.p; }
template <typename T> bool operator <= (I<T> &x, I<T> &y) { return x.p <= y.p; }
template <typename T> bool operator <= (const I<T> &x, const I<T> &y) { return x.p <= y.p; }
template <typename T> bool operator > (I<T> &x, I<T> &y) { return x.p > y.p; }
template <typename T> bool operator > (const I<T> &x, const I<T> &y) { return x.p > y.p; }
template <typename T> bool operator >= (I<T> &x, I<T> &y) { return x.p >= y.p; }
template <typename T> bool operator >= (const I<T> &x, const I<T> &y) { return x.p >= y.p; }
template <typename T> typename I<T>::difference_type operator - (I<T> &x, I<T> &y) { return x.p - y.p; }
template <typename T> typename I<T>::difference_type operator - (const I<T> &x, const I<T> &y) { return x.p - y.p; }
template <typename T> I<T> operator + (typename I<T>::difference_type x, const I<T> &y) { return I<T> (x + y.p); }
 
template <typename T>
class J
{
public:
J(const I<T> &x, const I<T> &y) : b (x), e (y) {}
const I<T> &begin ();
const I<T> &end ();
private:
I<T> b, e;
};
 
template <typename T> const I<T> &J<T>::begin () { return b; }
template <typename T> const I<T> &J<T>::end () { return e; }
 
int results[2000];
 
template <typename T>
void
baz (I<T> &i)
{
if (*i < 0 || *i >= 2000)
abort ();
results[*i]++;
}
 
I<int>
f1 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel shared (i)
{
#pragma omp for lastprivate (i) schedule(runtime)
for (i = x; i < y - 1; ++i)
baz (i);
#pragma omp single
i += 3;
}
return I<int> (i);
}
 
I<int>
f2 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel for lastprivate (i)
for (i = x; i < y - 1; i = 1 - 6 + 7 + i)
baz (i);
return I<int> (i);
}
 
template <typename T>
I<int>
f3 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel
#pragma omp for lastprivate (i)
for (i = x + 1000 - 64; i <= y - 10; i++)
baz (i);
return i;
}
 
template <typename T>
I<int>
f4 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel for lastprivate (i)
for (i = x + 2000 - 64; i > y + 10; --i)
baz (i);
return I<int> (i);
}
 
template <typename T>
I<int>
f5 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel for lastprivate (i)
for (i = x; i > y + T (6); i--)
baz (i);
return i;
}
 
template <typename T>
I<int>
f6 (const I<int> &x, const I<int> &y)
{
I<int> i;
#pragma omp parallel for lastprivate (i)
for (i = x - T (7); i > y; i -= T (2))
baz (i);
return I<int> (i);
}
 
template <int N>
I<int>
f7 (I<int> i, const I<int> &x, const I<int> &y)
{
#pragma omp parallel for lastprivate (i)
for (i = x - 10; i <= y + 10; i += N)
baz (i);
return I<int> (i);
}
 
template <int N>
I<int>
f8 (J<int> j)
{
I<int> i;
#pragma omp parallel shared (i)
#pragma omp for lastprivate (i)
for (i = j.begin (); i <= j.end () + N; i += 2)
baz (i);
return i;
}
 
I<int> i9;
 
template <long N>
I<int> &
f9 (J<int> j)
{
#pragma omp parallel for lastprivate (i9)
for (i9 = j.begin () + N; i9 <= j.end () - N; i9 = i9 - N)
baz (i9);
return i9;
}
 
template <typename T, int N>
I<T>
f10 (const I<T> &x, const I<T> &y)
{
I<T> i;
#pragma omp parallel for lastprivate (i)
for (i = x; i > y; i = i + N)
baz (i);
return i;
}
 
template <typename T, typename U>
T
f11 (T i, const T &x, const T &y)
{
#pragma omp parallel
#pragma omp for lastprivate (i)
for (i = x + U (2); i <= y + U (1); i = U (2) + U (3) + i)
baz (i);
return T (i);
}
 
template <typename T>
T
f12 (const T &x, const T &y)
{
T i;
#pragma omp parallel for lastprivate (i)
for (i = x; i > y; --i)
baz (i);
return i;
}
 
#define check(expr) \
for (int i = 0; i < 2000; i++) \
if (expr) \
{ \
if (results[i] != 1) \
abort (); \
results[i] = 0; \
} \
else if (results[i]) \
abort ()
 
int
main ()
{
int a[2000];
long b[2000];
for (int i = 0; i < 2000; i++)
{
a[i] = i;
b[i] = i;
}
if (*f1 (&a[10], &a[1873]) != 1875)
abort ();
check (i >= 10 && i < 1872);
if (*f2 (&a[0], &a[1998]) != 1998)
abort ();
check (i < 1997 && (i & 1) == 0);
if (*f3<int> (&a[10], &a[1971]) != 1962)
abort ();
check (i >= 946 && i <= 1961);
if (*f4<int> (&a[0], &a[30]) != 40)
abort ();
check (i > 40 && i <= 2000 - 64);
if (*f5<short> (&a[1931], &a[17]) != 23)
abort ();
check (i > 23 && i <= 1931);
if (*f6<long> (&a[1931], &a[17]) != 16)
abort ();
check (i > 17 && i <= 1924 && (i & 1) == 0);
if (*f7<6> (I<int> (), &a[12], &a[1800]) != 1814)
abort ();
check (i >= 2 && i <= 1808 && (i - 2) % 6 == 0);
if (*f8<121> (J<int> (&a[14], &a[1803])) != 1926)
abort ();
check (i >= 14 && i <= 1924 && (i & 1) == 0);
if (*f9<-3L> (J<int> (&a[27], &a[1761])) != 1767)
abort ();
check (i >= 24 && i <= 1764 && (i % 3) == 0);
if (*f10<int, -7> (&a[1939], &a[17]) != 14)
abort ();
check (i >= 21 && i <= 1939 && i % 7 == 0);
if (*f11<I<int>, short> (I<int> (), &a[71], &a[1941]) != 1943)
abort ();
check (i >= 73 && i <= 1938 && (i - 73) % 5 == 0);
if (*f12<I<int> > (&a[1761], &a[37]) != 37)
abort ();
check (i > 37 && i <= 1761);
if (*f10<long, -7> (&b[1939], &b[17]) != 14)
abort ();
check (i >= 21 && i <= 1939 && i % 7 == 0);
if (*f11<I<long>, short> (I<long> (), &b[71], &b[1941]) != 1943)
abort ();
check (i >= 73 && i <= 1938 && (i - 73) % 5 == 0);
if (*f12<I<long> > (&b[1761], &b[37]) != 37)
abort ();
check (i > 37 && i <= 1761);
}
/libgomp.c++/pr26943.C
0,0 → 1,62
// PR c++/26943
// { dg-do run }
 
#include <assert.h>
#include <unistd.h>
 
struct S
{
public:
int x;
S () : x(-1) { }
S (const S &);
S& operator= (const S &);
void test ();
};
 
static volatile int hold;
 
S::S (const S &s)
{
#pragma omp master
sleep (1);
 
assert (s.x == -1);
x = 0;
}
 
S&
S::operator= (const S& s)
{
assert (s.x == 1);
x = 2;
return *this;
}
 
void
S::test ()
{
assert (x == 0);
x = 1;
}
 
static S x;
 
void
foo ()
{
#pragma omp sections firstprivate(x) lastprivate(x)
{
x.test();
}
}
 
int
main ()
{
#pragma omp parallel num_threads(2)
foo();
 
assert (x.x == 2);
return 0;
}
/libgomp.c++/for-7.C
0,0 → 1,110
// PR c++/
// { dg-do run }
// { dg-options "-std=c++0x -fopenmp" }
 
extern "C" void abort ();
int cnt;
 
template <typename T>
void
f0 (T, int)
{
abort ();
}
 
template <>
void
f0<int> (int, int type)
{
if (type != 0)
abort ();
#pragma omp atomic
cnt++;
}
 
template <>
void
f0<const char *> (const char *, int type)
{
if (type != 1)
abort ();
#pragma omp atomic
cnt++;
}
 
template <typename T>
void
f1 ()
{
#pragma omp parallel for
for (auto i = 0; i < 10; i++)
f0 (i, 0);
}
 
template <typename T>
void
f2 ()
{
#pragma omp parallel for
for (auto i = T (0); i < T (10); i += T (1))
f0 (i, 0);
}
 
void
f3 ()
{
#pragma omp parallel for
for (auto i = 0; i < 10; i++)
f0 (i, 0);
}
 
const char *p = "abcdefghij";
 
template <typename T>
void
f4 ()
{
#pragma omp parallel for
for (auto i = p; i < p + 10; i++)
f0 (i, 1);
}
 
template <typename T>
void
f5 ()
{
#pragma omp parallel for
for (auto i = T (p); i < T (p + 10); i++)
f0 (i, 1);
}
 
void
f6 ()
{
#pragma omp parallel for
for (auto i = p; i < p + 10; i++)
f0 (i, 1);
}
 
int
main ()
{
f1<int> ();
if (cnt != 10)
abort ();
f2<int> ();
if (cnt != 20)
abort ();
f3 ();
if (cnt != 30)
abort ();
f4<int> ();
if (cnt != 40)
abort ();
f5<const char *> ();
if (cnt != 50)
abort ();
f6 ();
if (cnt != 60)
abort ();
}
/libgomp.c++/reduction-2.C
0,0 → 1,50
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = 0, j = 0, k = ~0, l;
double d = 1.0;
#pragma omp parallel num_threads(4)
{
#pragma omp single
{
i = 16;
k ^= (1 << 16);
d += 32.0;
}
 
#pragma omp for reduction(+:i) reduction(*:d) reduction(&:k)
for (l = 0; l < 4; l++)
{
if (omp_get_num_threads () == 4 && (i != 0 || d != 1.0 || k != ~0))
#pragma omp atomic
j |= 1;
if (l == omp_get_thread_num ())
{
i = omp_get_thread_num ();
d = i + 1;
k = ~(1 << (2 * i));
}
}
 
if (omp_get_num_threads () == 4)
{
if (i != (16 + 0 + 1 + 2 + 3))
#pragma omp atomic
j |= 2;
if (d != (33.0 * 1.0 * 2.0 * 3.0 * 4.0))
#pragma omp atomic
j |= 4;
if (k != (~0 ^ 0x55 ^ (1 << 16)))
#pragma omp atomic
j |= 8;
}
}
 
if (j)
abort ();
return 0;
}
/libgomp.c++/pr43893.C
0,0 → 1,125
// PR c/43893
// { dg-do run }
 
extern "C" void abort ();
 
template <typename T, T M, T N>
void
f1 ()
{
int c;
T i;
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = M; i < N; i++)
c++;
if (c != 1)
abort ();
}
 
template <typename T, T M, T N>
void
f2 ()
{
int c;
T i;
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = M; i <= N; i++)
c++;
if (c != 1)
abort ();
}
 
template <typename T, T M, T N>
void
f3 ()
{
int c;
T i;
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = M; i > N; i--)
c++;
if (c != 1)
abort ();
}
 
template <typename T, T M, T N>
void
f4 ()
{
int c;
T i;
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = M; i >= N; i--)
c++;
if (c != 1)
abort ();
}
 
int
main ()
{
int c;
unsigned int i;
int j;
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = 0; i < 1; i++)
c++;
if (c != 1)
abort ();
f1 <unsigned int, 0, 1> ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = 0; i <= 0; i++)
c++;
if (c != 1)
abort ();
f2 <unsigned int, 0, 0> ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (j = - __INT_MAX__ - 1; j < - __INT_MAX__; j++)
c++;
if (c != 1)
abort ();
f1 <int, (- __INT_MAX__ - 1), (- __INT_MAX__)> ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (j = - __INT_MAX__ - 1; j <= - __INT_MAX__ - 1; j++)
c++;
if (c != 1)
abort ();
f2 <int, (- __INT_MAX__ - 1), (- __INT_MAX__ - 1)> ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = 2U * __INT_MAX__ + 1; i > 2U * __INT_MAX__; i--)
c++;
if (c != 1)
abort ();
f3 <unsigned int, (2U * __INT_MAX__ + 1), (2U * __INT_MAX__)> ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = 2U * __INT_MAX__ + 1; i >= 2U * __INT_MAX__ + 1; i--)
c++;
if (c != 1)
abort ();
f4 <unsigned int, (2U * __INT_MAX__ + 1), (2U * __INT_MAX__ + 1)> ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (j = __INT_MAX__; j > __INT_MAX__ - 1; j--)
c++;
if (c != 1)
abort ();
f3 <int, __INT_MAX__, (__INT_MAX__ - 1)> ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (j = __INT_MAX__; j >= __INT_MAX__; j--)
c++;
if (c != 1)
abort ();
f4 <int, __INT_MAX__, __INT_MAX__> ();
return 0;
}
/libgomp.c++/reduction-4.C
0,0 → 1,54
// { dg-do run }
 
extern "C" void abort (void);
 
template <typename I, typename F>
void
foo ()
{
I j = -10000;
F f = 1024.0;
int i;
#pragma omp parallel for reduction (min:f) reduction (max:j)
for (i = 0; i < 4; i++)
switch (i)
{
case 0:
if (j < -16) j = -16; break;
case 1:
if (f > -2.0) f = -2.0; break;
case 2:
if (j < 8) j = 8; if (f > 9.0) f = 9.0; break;
case 3:
break;
}
if (j != 8 || f != -2.0)
abort ();
}
 
int
main ()
{
int j = -10000;
float f = 1024.0;
int i;
#pragma omp parallel for reduction (min:f) reduction (max:j)
for (i = 0; i < 4; i++)
switch (i)
{
case 0:
if (j < -16) j = -16; break;
case 1:
if (f > -2.0) f = -2.0; break;
case 2:
if (j < 8) j = 8; if (f > 9.0) f = 9.0; break;
case 3:
break;
}
if (j != 8 || f != -2.0)
abort ();
foo <int, float> ();
foo <long, double> ();
foo <long long, long double> ();
return 0;
}
/libgomp.c++/collapse-2.C
0,0 → 1,371
// { dg-do run }
 
#include <omp.h>
typedef __PTRDIFF_TYPE__ ptrdiff_t;
extern "C" void abort ();
 
template <typename T>
class I
{
public:
typedef ptrdiff_t difference_type;
I ();
~I ();
I (T *);
I (const I &);
T &operator * ();
T *operator -> ();
T &operator [] (const difference_type &) const;
I &operator = (const I &);
I &operator ++ ();
I operator ++ (int);
I &operator -- ();
I operator -- (int);
I &operator += (const difference_type &);
I &operator -= (const difference_type &);
I operator + (const difference_type &) const;
I operator - (const difference_type &) const;
template <typename S> friend bool operator == (I<S> &, I<S> &);
template <typename S> friend bool operator == (const I<S> &, const I<S> &);
template <typename S> friend bool operator < (I<S> &, I<S> &);
template <typename S> friend bool operator < (const I<S> &, const I<S> &);
template <typename S> friend bool operator <= (I<S> &, I<S> &);
template <typename S> friend bool operator <= (const I<S> &, const I<S> &);
template <typename S> friend bool operator > (I<S> &, I<S> &);
template <typename S> friend bool operator > (const I<S> &, const I<S> &);
template <typename S> friend bool operator >= (I<S> &, I<S> &);
template <typename S> friend bool operator >= (const I<S> &, const I<S> &);
template <typename S> friend typename I<S>::difference_type operator - (I<S> &, I<S> &);
template <typename S> friend typename I<S>::difference_type operator - (const I<S> &, const I<S> &);
template <typename S> friend I<S> operator + (typename I<S>::difference_type , const I<S> &);
private:
T *p;
};
template <typename T> I<T>::I () : p (0) {}
template <typename T> I<T>::~I () { p = (T *) 0; }
template <typename T> I<T>::I (T *x) : p (x) {}
template <typename T> I<T>::I (const I &x) : p (x.p) {}
template <typename T> T &I<T>::operator * () { return *p; }
template <typename T> T *I<T>::operator -> () { return p; }
template <typename T> T &I<T>::operator [] (const difference_type &x) const { return p[x]; }
template <typename T> I<T> &I<T>::operator = (const I &x) { p = x.p; return *this; }
template <typename T> I<T> &I<T>::operator ++ () { ++p; return *this; }
template <typename T> I<T> I<T>::operator ++ (int) { return I (p++); }
template <typename T> I<T> &I<T>::operator -- () { --p; return *this; }
template <typename T> I<T> I<T>::operator -- (int) { return I (p--); }
template <typename T> I<T> &I<T>::operator += (const difference_type &x) { p += x; return *this; }
template <typename T> I<T> &I<T>::operator -= (const difference_type &x) { p -= x; return *this; }
template <typename T> I<T> I<T>::operator + (const difference_type &x) const { return I (p + x); }
template <typename T> I<T> I<T>::operator - (const difference_type &x) const { return I (p - x); }
template <typename T> bool operator == (I<T> &x, I<T> &y) { return x.p == y.p; }
template <typename T> bool operator == (const I<T> &x, const I<T> &y) { return x.p == y.p; }
template <typename T> bool operator != (I<T> &x, I<T> &y) { return !(x == y); }
template <typename T> bool operator != (const I<T> &x, const I<T> &y) { return !(x == y); }
template <typename T> bool operator < (I<T> &x, I<T> &y) { return x.p < y.p; }
template <typename T> bool operator < (const I<T> &x, const I<T> &y) { return x.p < y.p; }
template <typename T> bool operator <= (I<T> &x, I<T> &y) { return x.p <= y.p; }
template <typename T> bool operator <= (const I<T> &x, const I<T> &y) { return x.p <= y.p; }
template <typename T> bool operator > (I<T> &x, I<T> &y) { return x.p > y.p; }
template <typename T> bool operator > (const I<T> &x, const I<T> &y) { return x.p > y.p; }
template <typename T> bool operator >= (I<T> &x, I<T> &y) { return x.p >= y.p; }
template <typename T> bool operator >= (const I<T> &x, const I<T> &y) { return x.p >= y.p; }
template <typename T> typename I<T>::difference_type operator - (I<T> &x, I<T> &y) { return x.p - y.p; }
template <typename T> typename I<T>::difference_type operator - (const I<T> &x, const I<T> &y) { return x.p - y.p; }
template <typename T> I<T> operator + (typename I<T>::difference_type x, const I<T> &y) { return I<T> (x + y.p); }
 
template <typename T>
class J
{
public:
J(const I<T> &x, const I<T> &y) : b (x), e (y) {}
const I<T> &begin ();
const I<T> &end ();
private:
I<T> b, e;
};
 
template <typename T> const I<T> &J<T>::begin () { return b; }
template <typename T> const I<T> &J<T>::end () { return e; }
 
int results[2000];
 
void
f1 (J<int> x, J<int> y, J<int> z)
{
I<int> i, j, k;
int l, f = 0, n = 0, m = 0;
#pragma omp parallel shared (i, j, k, l) firstprivate (f) \
reduction (+:n, m) num_threads (8)
{
#pragma omp for lastprivate (i, j, k, l) schedule (static, 9) \
collapse (4)
for (i = x.begin (); i < x.end (); ++i)
for (j = y.begin (); j <= y.end (); j += 1)
for (l = 0; l < 1; l++)
for (k = z.begin () + 3; k < z.end () - 3; k++)
if (omp_get_num_threads () == 8
&& ((*i + 2) * 12 + (*j + 5) * 4 + (*k - 13)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
if (n || i != x.end () || j != y.end () + 1 || k != z.end () - 3
|| m != 72 || l != 1)
abort ();
}
 
void
f2 (J<int> x, J<int> y, J<int> z)
{
int f = 0, n = 0, m = 0;
#pragma omp parallel for firstprivate (f) reduction (+:n, m) \
num_threads (8) schedule (static, 9) \
collapse (6 - 2)
for (I<int> i = x.end () - 1; i >= x.begin (); --i)
for (int l = -131; l >= -131; l--)
for (I<int> j = y.end (); j > y.begin () - 1; j -= 1)
{
for (I<int> k = z.end () - 4; k >= z.begin () + 3; k--)
if (omp_get_num_threads () == 8
&& ((3 - *i) * 12 + (-3 - *j) * 4 + (16 - *k)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
if (n || m != 72)
abort ();
}
 
template <typename T>
void
f3 (J<int> x, J<int> y, J<int> z)
{
I<int> i, j, k;
int l, f = 0, n = 0, m = 0;
#pragma omp parallel shared (i, j, k, l) firstprivate (f) \
reduction (+:n, m) num_threads (8)
{
#pragma omp for lastprivate (i, j, k, l) schedule (static, 9) \
collapse (4)
for (i = x.begin (); i < x.end (); ++i)
for (j = y.begin (); j <= y.end (); j += 1)
for (k = z.begin () + 3; k < z.end () - 3; k++)
for (l = 7; l <= 7; l++)
if (omp_get_num_threads () == 8
&& ((*i + 2) * 12 + (*j + 5) * 4 + (*k - 13)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
if (n || i != x.end () || j != y.end () + 1 || k != z.end () - 3
|| m != 72 || l != 8)
abort ();
}
 
template <typename T>
void
f4 (J<int> x, J<int> y, J<int> z)
{
int f = 0, n = 0, m = 0;
#pragma omp parallel for firstprivate (f) reduction (+:n, m) \
num_threads (8) schedule (static, 9) \
collapse (5 - 2)
for (I<int> i = x.end () - 1; i >= x.begin (); --i)
{
for (I<int> j = y.end (); j > y.begin () - 1; j -= 1)
{
for (I<int> k = z.end () - 4; k >= z.begin () + 3; k--)
if (omp_get_num_threads () == 8
&& ((3 - *i) * 12 + (-3 - *j) * 4 + (16 - *k)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
}
if (n || m != 72)
abort ();
}
 
template <typename T>
void
f5 (J<int> x, J<int> y, J<int> z)
{
I<int> i, j, k;
int f = 0, n = 0, m = 0;
#pragma omp parallel shared (i, j, k) firstprivate (f) \
reduction (+:n, m) num_threads (8)
{
#pragma omp for lastprivate (i, j, k) schedule (static, 9) \
collapse (3)
for (i = x.begin (); i < x.end (); ++i)
for (j = y.begin (); j <= y.end (); j += (T) 1)
{
for (k = z.begin () + 3; k < z.end () - 3; k++)
if (omp_get_num_threads () == 8
&& ((*i + 2) * 12 + (*j + 5) * 4 + (*k - 13)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
}
if (n || i != x.end () || j != y.end () + 1 || k != z.end () - 3
|| m != 72)
abort ();
}
 
template <typename T>
void
f6 (J<int> x, J<int> y, J<int> z)
{
int f = 0, n = 0, m = 0;
#pragma omp parallel for firstprivate (f) reduction (+:n, m) \
num_threads (8) schedule (static, 9) \
collapse (5 - 2)
for (I<int> i = x.end () - 1; i >= x.begin (); --i)
{
for (I<int> j = y.end (); j > y.begin () - 1; j -= 1)
{
for (I<int> k = z.end () - 4; k >= z.begin () + (T) 3; k--)
if (omp_get_num_threads () == 8
&& ((3 - *i) * 12 + (-3 - *j) * 4 + (16 - *k)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
}
if (n || m != 72)
abort ();
}
 
template <typename T>
void
f7 (J<T> x, J<T> y, J<T> z)
{
I<T> i, j, k, o = y.begin ();
T l, f = 0, n = 0, m = 0;
#pragma omp parallel shared (i, j, k, l) firstprivate (f) \
reduction (+:n, m) num_threads (8)
{
#pragma omp for lastprivate (i, j, k, l) schedule (static, 9) \
collapse (4)
for (i = x.begin (); i < x.end (); ++i)
for (j = y.begin (); j <= y.end (); j += 1)
for (l = *o; l <= *o; l = 1 + l)
for (k = z.begin () + 3; k < z.end () - 3; k++)
if (omp_get_num_threads () == 8
&& ((*i + 2) * 12 + (*j + 5) * 4 + (*k - 13)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
if (n || i != x.end () || j != y.end () + 1 || k != z.end () - 3
|| m != 72 || l != *o + 1)
abort ();
}
 
template <typename T>
void
f8 (J<T> x, J<T> y, J<T> z)
{
T f = 0, n = 0, m = 0;
#pragma omp parallel for firstprivate (f) reduction (+:n, m) \
num_threads (8) schedule (static, 9) \
collapse (6 - 2)
for (I<T> i = x.end () - 1; i >= x.begin (); --i)
for (T l = 0; l < 1; l++)
for (I<T> j = y.end (); j > y.begin () - 1; j -= 1)
{
for (I<T> k = z.end () - 4; k >= z.begin () + 3; k--)
if (omp_get_num_threads () == 8
&& ((3 - *i) * 12 + (-3 - *j) * 4 + (16 - *k)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
if (n || m != 72)
abort ();
}
 
template <typename S, typename T>
void
f9 (J<T> x, J<T> y, J<T> z)
{
S i, j, k, o = y.begin ();
T l, f = 0, n = 0, m = 0;
#pragma omp parallel shared (i, j, k, l) firstprivate (f) \
reduction (+:n, m) num_threads (8)
{
#pragma omp for lastprivate (i, j, k, l) schedule (static, 9) \
collapse (4)
for (i = x.begin (); i < x.end (); ++i)
for (j = y.begin (); j <= y.end (); j += 1)
for (l = *o; l <= *o; l = 1 + l)
for (k = z.begin () + 3; k < z.end () - 3; k++)
if (omp_get_num_threads () == 8
&& ((*i + 2) * 12 + (*j + 5) * 4 + (*k - 13)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
if (n || i != x.end () || j != y.end () + 1 || k != z.end () - 3
|| m != 72 || l != *o + 1)
abort ();
}
 
template <typename S, typename T>
void
f10 (J<T> x, J<T> y, J<T> z)
{
T f = 0, n = 0, m = 0;
#pragma omp parallel for firstprivate (f) reduction (+:n, m) \
num_threads (8) schedule (static, 9) \
collapse (6 - 2)
for (S i = x.end () - 1; i >= x.begin (); --i)
for (T l = 0; l < 1; l++)
for (S j = y.end (); j > y.begin () - 1; j -= 1)
{
for (S k = z.end () - 4; k >= z.begin () + 3; k--)
if (omp_get_num_threads () == 8
&& ((3 - *i) * 12 + (-3 - *j) * 4 + (16 - *k)
!= (omp_get_thread_num () * 9 + f++)))
n++;
else
m++;
}
if (n || m != 72)
abort ();
}
 
int
main ()
{
int a[2000];
long b[2000];
for (int i = 0; i < 2000; i++)
{
a[i] = i - 1000;
b[i] = i - 1000;
}
J<int> x (&a[998], &a[1004]);
J<int> y (&a[995], &a[997]);
J<int> z (&a[1010], &a[1020]);
f1 (x, y, z);
f2 (x, y, z);
f3 <int> (x, y, z);
f4 <int> (x, y, z);
f5 <int> (x, y, z);
f6 <int> (x, y, z);
f7 <int> (x, y, z);
f8 <int> (x, y, z);
f9 <I<int>, int> (x, y, z);
f10 <I<int>, int> (x, y, z);
}
/libgomp.c++/pr48869.C
0,0 → 1,68
// PR c++/48869
// { dg-do run }
// { dg-options "-std=gnu++0x" }
 
template <const int N>
struct A
{
A () {}
A (const A&) = delete;
void foo () {}
~A () {}
};
 
template <const int N>
struct B
{
B () {}
B (const B&) {}
void foo () {}
~B () {}
};
 
void __attribute__((used))
foo (B<6> b6)
{
#pragma omp task
b6.foo ();
}
 
int
main ()
{
A<0> a0;
#pragma omp task shared(a0)
a0.foo ();
#pragma omp task default(shared)
a0.foo ();
#pragma omp parallel shared(a0)
#pragma omp task
a0.foo ();
#pragma omp task
{
A<1> a1;
a1.foo ();
}
B<0> b0;
#pragma omp task shared(b0)
b0.foo ();
B<1> b1;
#pragma omp task default(shared)
b1.foo ();
B<2> b2;
#pragma omp parallel shared(b2)
#pragma omp task
b2.foo ();
B<3> b3;
#pragma omp task
b3.foo ();
B<4> b4;
#pragma omp parallel private (b4)
#pragma omp task
b4.foo ();
B<5> b5;
#pragma omp parallel firstprivate (b5)
#pragma omp task
b5.foo ();
return 0;
}
/libgomp.c++/ctor-1.C
0,0 → 1,65
// { dg-do run }
 
#include <omp.h>
#include <assert.h>
 
struct B
{
static int icount;
static int dcount;
static int xcount;
 
B();
B(const B &);
~B();
B& operator=(const B &);
void doit();
};
 
int B::icount;
int B::dcount;
int B::xcount;
 
B::B()
{
#pragma omp atomic
icount++;
}
 
B::~B()
{
#pragma omp atomic
dcount++;
}
 
void B::doit()
{
#pragma omp atomic
xcount++;
}
 
static int nthreads;
 
void foo()
{
B b;
#pragma omp parallel private(b)
{
#pragma omp master
nthreads = omp_get_num_threads ();
b.doit();
}
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (4);
foo();
 
assert (B::xcount == nthreads);
assert (B::icount == nthreads+1);
assert (B::dcount == nthreads+1);
 
return 0;
}
/libgomp.c++/ctor-3.C
0,0 → 1,89
// { dg-do run }
 
#include <omp.h>
#include <assert.h>
 
struct B
{
static int icount;
static int dcount;
static int ccount;
static B *e_inner;
static B *e_outer;
 
B();
B(int);
B(const B &);
~B();
B& operator=(const B &);
void doit();
};
 
int B::icount;
int B::dcount;
int B::ccount;
B * B::e_inner;
B * B::e_outer;
 
B::B()
{
#pragma omp atomic
icount++;
}
 
B::B(int)
{
e_outer = this;
}
 
B::~B()
{
#pragma omp atomic
dcount++;
}
 
B& B::operator= (const B &b)
{
assert (&b == e_inner);
assert (this == e_outer);
#pragma omp atomic
ccount++;
return *this;
}
 
void B::doit()
{
#pragma omp critical
{
assert (e_inner == 0);
e_inner = this;
}
}
 
static int nthreads;
 
void foo()
{
B b(0);
 
#pragma omp parallel sections lastprivate(b)
{
#pragma omp section
nthreads = omp_get_num_threads ();
#pragma omp section
b.doit ();
}
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (4);
foo();
 
assert (B::ccount == 1);
assert (B::icount == nthreads);
assert (B::dcount == nthreads+1);
 
return 0;
}
/libgomp.c++/ctor-5.C
0,0 → 1,52
// { dg-do run }
// { dg-require-effective-target tls_runtime }
 
#include <omp.h>
#include <assert.h>
 
struct B
{
static int count;
static B *expected;
 
B& operator=(const B &);
};
 
int B::count;
B * B::expected;
 
static B thr;
#pragma omp threadprivate(thr)
 
B& B::operator= (const B &b)
{
assert (&b == expected);
assert (this != expected);
#pragma omp atomic
count++;
return *this;
}
 
static int nthreads;
 
void foo()
{
B::expected = &thr;
 
#pragma omp parallel copyin(thr)
{
#pragma omp master
nthreads = omp_get_num_threads ();
}
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (4);
foo();
 
assert (B::count == nthreads-1);
 
return 0;
}
/libgomp.c++/ctor-7.C
0,0 → 1,67
// { dg-do run }
 
#include <omp.h>
#include <assert.h>
 
#define N 10
 
struct B
{
static int icount;
static int dcount;
static int xcount;
 
B();
B(const B &);
~B();
B& operator=(const B &);
void doit();
};
 
int B::icount;
int B::dcount;
int B::xcount;
 
B::B()
{
#pragma omp atomic
icount++;
}
 
B::~B()
{
#pragma omp atomic
dcount++;
}
 
void B::doit()
{
#pragma omp atomic
xcount++;
}
 
static int nthreads;
 
void foo()
{
B b[N];
#pragma omp parallel private(b)
{
#pragma omp master
nthreads = omp_get_num_threads ();
b[0].doit();
}
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (4);
foo();
 
assert (B::xcount == nthreads);
assert (B::icount == (nthreads+1)*N);
assert (B::dcount == (nthreads+1)*N);
 
return 0;
}
/libgomp.c++/ctor-9.C
0,0 → 1,60
// { dg-do run }
// { dg-require-effective-target tls_runtime }
 
#include <omp.h>
#include <assert.h>
 
#define N 10
#define THR 4
 
struct B
{
B& operator=(const B &);
};
 
static B *base;
static B *threadbase;
static int singlethread;
#pragma omp threadprivate(threadbase)
 
static unsigned cmask[THR];
 
B& B::operator= (const B &b)
{
unsigned sindex = &b - base;
unsigned tindex = this - threadbase;
assert(sindex < N);
assert(sindex == tindex);
cmask[omp_get_thread_num ()] |= 1u << tindex;
return *this;
}
 
void foo()
{
#pragma omp parallel
{
B b[N];
threadbase = b;
#pragma omp single copyprivate(b)
{
assert(omp_get_num_threads () == THR);
singlethread = omp_get_thread_num ();
base = b;
}
}
}
 
int main()
{
omp_set_dynamic (0);
omp_set_num_threads (THR);
foo();
 
for (int i = 0; i < THR; ++i)
if (i == singlethread)
assert(cmask[singlethread] == 0);
else
assert(cmask[i] == (1u << N) - 1);
 
return 0;
}
/libgomp.c++/pr24455-1.C
0,0 → 1,6
// { dg-do compile }
// { dg-require-effective-target tls }
extern int i;
#pragma omp threadprivate (i)
 
int i;
/libgomp.c++/pr24455.C
0,0 → 1,23
// { dg-do run }
// { dg-additional-sources pr24455-1.C }
// { dg-require-effective-target tls_runtime }
 
extern "C" void abort (void);
 
extern int i;
#pragma omp threadprivate(i)
 
int main()
{
i = 0;
 
#pragma omp parallel default(none) num_threads(10) copyin(i)
{
i++;
#pragma omp barrier
if (i != 1)
abort ();
}
 
return 0;
}
/libgomp.c++/pr38650.C
0,0 → 1,49
// PR c++/38650
// { dg-do run }
 
#include <cstdlib>
 
int e;
 
int
main ()
{
volatile int i, j = 10;
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < j; i += 1)
e++;
if (e != 10)
std::abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < j; ++i)
e++;
if (e != 10)
std::abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < j; i++)
e++;
if (e != 10)
std::abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < 10; i += 1)
e++;
if (e != 10)
std::abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < 10; ++i)
e++;
if (e != 10)
std::abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < 10; i++)
e++;
if (e != 10)
std::abort ();
return 0;
}
/libgomp.c++/pr35185.C
0,0 → 1,33
// PR middle-end/35185
// { dg-do run }
 
extern "C" void abort ();
 
struct S
{
S () : s (6) {}
~S () {}
int s;
};
 
__attribute__((noinline))
bool
bar (S s)
{
return s.s != 6;
}
 
int
main ()
{
S s;
int err = 0;
#pragma omp parallel shared (s)
{
if (bar (s))
#pragma omp atomic
err++;
}
if (err)
abort ();
}
/libgomp.c++/loop-11.C
0,0 → 1,276
#include <omp.h>
#include <stdlib.h>
#include <string.h>
 
int
test1 ()
{
short int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[10]; &buf[54] > p; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[3]; &buf[63] >= p; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[16]; &buf[51] > p; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[53]; &buf[9] < p; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[63]; &buf[3] <= p; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[48]; &buf[15] < p; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test2 ()
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[10]; &buf[54] > p; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[3]; &buf[63] >= p; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[16]; &buf[51] > p; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[53]; &buf[9] < p; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[63]; &buf[3] <= p; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[48]; &buf[15] < p; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test3 ()
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[10]; &buf[54] > p; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[3]; &buf[63] >= p; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[16]; &buf[51] > p; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[53]; &buf[9] < p; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[63]; &buf[3] <= p; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[48]; &buf[15] < p; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test4 ()
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[10]; &buf[54] > p; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[3]; &buf[63] >= p; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[16]; &buf[51] > p; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[53]; &buf[9] < p; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[63]; &buf[3] <= p; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[48]; &buf[15] < p; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
main ()
{
test1 ();
test2 ();
test3 ();
omp_set_schedule (omp_sched_static, 0);
test4 ();
omp_set_schedule (omp_sched_static, 3);
test4 ();
omp_set_schedule (omp_sched_dynamic, 5);
test4 ();
omp_set_schedule (omp_sched_guided, 2);
test4 ();
return 0;
}
/Makefile.in
0,0 → 1,413
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
 
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
# Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
 
@SET_MAKE@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = testsuite
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
$(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/../config/enable.m4 \
$(top_srcdir)/../config/futex.m4 \
$(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/lthostflags.m4 \
$(top_srcdir)/../config/multi.m4 \
$(top_srcdir)/../config/override.m4 \
$(top_srcdir)/../config/stdint.m4 \
$(top_srcdir)/../config/tls.m4 $(top_srcdir)/../ltoptions.m4 \
$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DEJATOOL = $(PACKAGE)
RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FC = @FC@
FCFLAGS = @FCFLAGS@
FGREP = @FGREP@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OMP_LOCK_25_ALIGN = @OMP_LOCK_25_ALIGN@
OMP_LOCK_25_KIND = @OMP_LOCK_25_KIND@
OMP_LOCK_25_SIZE = @OMP_LOCK_25_SIZE@
OMP_LOCK_ALIGN = @OMP_LOCK_ALIGN@
OMP_LOCK_KIND = @OMP_LOCK_KIND@
OMP_LOCK_SIZE = @OMP_LOCK_SIZE@
OMP_NEST_LOCK_25_ALIGN = @OMP_NEST_LOCK_25_ALIGN@
OMP_NEST_LOCK_25_KIND = @OMP_NEST_LOCK_25_KIND@
OMP_NEST_LOCK_25_SIZE = @OMP_NEST_LOCK_25_SIZE@
OMP_NEST_LOCK_ALIGN = @OMP_NEST_LOCK_ALIGN@
OMP_NEST_LOCK_KIND = @OMP_NEST_LOCK_KIND@
OMP_NEST_LOCK_SIZE = @OMP_NEST_LOCK_SIZE@
OPT_LDFLAGS = @OPT_LDFLAGS@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
RANLIB = @RANLIB@
SECTION_LDFLAGS = @SECTION_LDFLAGS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
XCFLAGS = @XCFLAGS@
XLDFLAGS = @XLDFLAGS@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
ac_ct_FC = @ac_ct_FC@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
config_path = @config_path@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
enable_shared = @enable_shared@
enable_static = @enable_static@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
libtool_VERSION = @libtool_VERSION@
link_gomp = @link_gomp@
localedir = @localedir@
localstatedir = @localstatedir@
lt_host_flags = @lt_host_flags@
mandir = @mandir@
mkdir_p = @mkdir_p@
multi_basedir = @multi_basedir@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
toolexecdir = @toolexecdir@
toolexeclibdir = @toolexeclibdir@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign dejagnu
 
# May be used by various substitution variables.
gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
EXPECT = $(shell if test -f $(top_builddir)/../expect/expect; then \
echo $(top_builddir)/../expect/expect; else echo expect; fi)
 
_RUNTEST = $(shell if test -f $(top_srcdir)/../dejagnu/runtest; then \
echo $(top_srcdir)/../dejagnu/runtest; else echo runtest; fi)
 
RUNTEST = "$(_RUNTEST) $(AM_RUNTESTFLAGS)"
all: all-am
 
.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --foreign testsuite/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
 
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
 
mostlyclean-libtool:
-rm -f *.lo
 
clean-libtool:
-rm -rf .libs _libs
tags: TAGS
TAGS:
 
ctags: CTAGS
CTAGS:
 
 
check-DEJAGNU: site.exp
srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
EXPECT=$(EXPECT); export EXPECT; \
runtest=$(RUNTEST); \
if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \
if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \
then :; else exit_status=1; fi; \
done; \
else echo "WARNING: could not find \`runtest'" 1>&2; :;\
fi; \
exit $$exit_status
site.exp: Makefile
@echo 'Making a new site.exp file...'
@echo '## these variables are automatically generated by make ##' >site.tmp
@echo '# Do not edit here. If you wish to override these values' >>site.tmp
@echo '# edit the last section' >>site.tmp
@echo 'set srcdir $(srcdir)' >>site.tmp
@echo "set objdir `pwd`" >>site.tmp
@echo 'set build_alias "$(build_alias)"' >>site.tmp
@echo 'set build_triplet $(build_triplet)' >>site.tmp
@echo 'set host_alias "$(host_alias)"' >>site.tmp
@echo 'set host_triplet $(host_triplet)' >>site.tmp
@echo 'set target_alias "$(target_alias)"' >>site.tmp
@echo 'set target_triplet $(target_triplet)' >>site.tmp
@echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
@test ! -f site.exp || \
sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
@-rm -f site.bak
@test ! -f site.exp || mv site.exp site.bak
@mv site.tmp site.exp
 
distclean-DEJAGNU:
-rm -f site.exp site.bak
-l='$(DEJATOOL)'; for tool in $$l; do \
rm -f $$tool.sum $$tool.log; \
done
check-am: all-am
$(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
check: check-am
all-am: Makefile
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
 
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
 
clean-generic:
 
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
 
clean-am: clean-generic clean-libtool mostlyclean-am
 
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-DEJAGNU distclean-generic
 
dvi: dvi-am
 
dvi-am:
 
html: html-am
 
html-am:
 
info: info-am
 
info-am:
 
install-data-am:
 
install-dvi: install-dvi-am
 
install-dvi-am:
 
install-exec-am:
 
install-html: install-html-am
 
install-html-am:
 
install-info: install-info-am
 
install-info-am:
 
install-man:
 
install-pdf: install-pdf-am
 
install-pdf-am:
 
install-ps: install-ps-am
 
install-ps-am:
 
installcheck-am:
 
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
 
mostlyclean: mostlyclean-am
 
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
pdf: pdf-am
 
pdf-am:
 
ps: ps-am
 
ps-am:
 
uninstall-am:
 
.MAKE: check-am install-am install-strip
 
.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \
clean-libtool distclean distclean-DEJAGNU distclean-generic \
distclean-libtool dvi dvi-am html html-am info info-am install \
install-am install-data install-data-am install-dvi \
install-dvi-am install-exec install-exec-am install-html \
install-html-am install-info install-info-am install-man \
install-pdf install-pdf-am install-ps install-ps-am \
install-strip installcheck installcheck-am installdirs \
maintainer-clean maintainer-clean-generic mostlyclean \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
uninstall uninstall-am
 
 
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
/libgomp.fortran/pr25219.f90
0,0 → 1,15
! PR fortran/25219
 
implicit none
save
integer :: i, k
k = 3
!$omp parallel
!$omp do lastprivate (k)
do i = 1, 100
k = i
end do
!$omp end do
!$omp end parallel
if (k .ne. 100) call abort
end
/libgomp.fortran/condinc1.f
0,0 → 1,7
! { dg-options "-fopenmp" }
program condinc1
logical l
l = .false.
!$ include 'condinc1.inc'
stop 2
end
/libgomp.fortran/pr27395-1.f90
0,0 → 1,31
! PR fortran/27395
! { dg-do run }
 
program pr27395_1
implicit none
integer, parameter :: n=10,m=1001
integer :: i
integer, dimension(n) :: sumarray
call foo(n,m,sumarray)
do i=1,n
if (sumarray(i).ne.m*i) call abort
end do
end program pr27395_1
 
subroutine foo(n,m,sumarray)
use omp_lib, only : omp_get_thread_num
implicit none
integer, intent(in) :: n,m
integer, dimension(n), intent(out) :: sumarray
integer :: i,j
sumarray(:)=0
!$OMP PARALLEL DEFAULT(shared) NUM_THREADS(4)
!$OMP DO PRIVATE(j,i), REDUCTION(+:sumarray)
do j=1,m
do i=1,n
sumarray(i)=sumarray(i)+i
end do
end do
!$OMP END DO
!$OMP END PARALLEL
end subroutine foo
/libgomp.fortran/appendix-a/a.5.1.f90
0,0 → 1,8
! { dg-do run }
PROGRAM A5
INCLUDE "omp_lib.h" ! or USE OMP_LIB
CALL OMP_SET_DYNAMIC(.TRUE.)
!$OMP PARALLEL NUM_THREADS(10)
! do work here
!$OMP END PARALLEL
END PROGRAM A5
/libgomp.fortran/appendix-a/a.21.1.f90
0,0 → 1,19
! { dg-do compile }
SUBROUTINE WORK(K)
INTEGER k
!$OMP ORDERED
WRITE(*,*) K
!$OMP END ORDERED
END SUBROUTINE WORK
SUBROUTINE SUBA21(LB, UB, STRIDE)
INTEGER LB, UB, STRIDE
INTEGER I
!$OMP PARALLEL DO ORDERED SCHEDULE(DYNAMIC)
DO I=LB,UB,STRIDE
CALL WORK(I)
END DO
!$OMP END PARALLEL DO
END SUBROUTINE SUBA21
PROGRAM A21
CALL SUBA21(1,100,5)
END PROGRAM A21
/libgomp.fortran/appendix-a/a.40.1.f90
0,0 → 1,54
! { dg-do compile }
! { dg-options "-ffixed-form" }
MODULE DATA
USE OMP_LIB, ONLY: OMP_NEST_LOCK_KIND
TYPE LOCKED_PAIR
INTEGER A
INTEGER B
INTEGER (OMP_NEST_LOCK_KIND) LCK
END TYPE
END MODULE DATA
SUBROUTINE INCR_A(P, A)
! called only from INCR_PAIR, no need to lock
USE DATA
TYPE(LOCKED_PAIR) :: P
INTEGER A
P%A = P%A + A
END SUBROUTINE INCR_A
SUBROUTINE INCR_B(P, B)
! called from both INCR_PAIR and elsewhere,
! so we need a nestable lock
USE OMP_LIB ! or INCLUDE "omp_lib.h"
USE DATA
TYPE(LOCKED_PAIR) :: P
INTEGER B
CALL OMP_SET_NEST_LOCK(P%LCK)
P%B = P%B + B
CALL OMP_UNSET_NEST_LOCK(P%LCK)
END SUBROUTINE INCR_B
SUBROUTINE INCR_PAIR(P, A, B)
USE OMP_LIB ! or INCLUDE "omp_lib.h"
USE DATA
TYPE(LOCKED_PAIR) :: P
INTEGER A
INTEGER B
CALL OMP_SET_NEST_LOCK(P%LCK)
CALL INCR_A(P, A)
CALL INCR_B(P, B)
CALL OMP_UNSET_NEST_LOCK(P%LCK)
END SUBROUTINE INCR_PAIR
SUBROUTINE A40(P)
USE OMP_LIB ! or INCLUDE "omp_lib.h"
USE DATA
TYPE(LOCKED_PAIR) :: P
INTEGER WORK1, WORK2, WORK3
EXTERNAL WORK1, WORK2, WORK3
!$OMP PARALLEL SECTIONS
!$OMP SECTION
CALL INCR_PAIR(P, WORK1(), WORK2())
!$OMP SECTION
CALL INCR_B(P, WORK3())
!$OMP END PARALLEL SECTIONS
END SUBROUTINE A40
 
! { dg-final { cleanup-modules "data" } }
/libgomp.fortran/appendix-a/a.15.1.f90
0,0 → 1,31
! { dg-do compile }
SUBROUTINE WORK(N)
INTEGER N
END SUBROUTINE WORK
SUBROUTINE SUB3(N)
INTEGER N
CALL WORK(N)
!$OMP BARRIER
CALL WORK(N)
END SUBROUTINE SUB3
SUBROUTINE SUB2(K)
INTEGER K
!$OMP PARALLEL SHARED(K)
CALL SUB3(K)
!$OMP END PARALLEL
END SUBROUTINE SUB2
SUBROUTINE SUB1(N)
INTEGER N
INTEGER I
!$OMP PARALLEL PRIVATE(I) SHARED(N)
!$OMP DO
DO I = 1, N
CALL SUB2(I)
END DO
!$OMP END PARALLEL
END SUBROUTINE SUB1
PROGRAM A15
CALL SUB1(2)
CALL SUB2(2)
CALL SUB3(2)
END PROGRAM A15
/libgomp.fortran/appendix-a/a.31.4.f90
0,0 → 1,14
! { dg-do run }
MODULE M
INTRINSIC MAX
END MODULE M
PROGRAM A31_4
USE M, REN => MAX
N=0
!$OMP PARALLEL DO REDUCTION(REN: N) ! still does MAX
DO I = 1, 100
N = MAX(N,I)
END DO
END PROGRAM A31_4
 
! { dg-final { cleanup-modules "m" } }
/libgomp.fortran/appendix-a/a.16.1.f90
0,0 → 1,41
! { dg-do run }
REAL FUNCTION WORK1(I)
INTEGER I
WORK1 = 1.0 * I
RETURN
END FUNCTION WORK1
 
REAL FUNCTION WORK2(I)
INTEGER I
WORK2 = 2.0 * I
RETURN
END FUNCTION WORK2
 
SUBROUTINE SUBA16(X, Y, INDEX, N)
REAL X(*), Y(*)
INTEGER INDEX(*), N
INTEGER I
!$OMP PARALLEL DO SHARED(X, Y, INDEX, N)
DO I=1,N
!$OMP ATOMIC
X(INDEX(I)) = X(INDEX(I)) + WORK1(I)
Y(I) = Y(I) + WORK2(I)
ENDDO
END SUBROUTINE SUBA16
 
PROGRAM A16
REAL X(1000), Y(10000)
INTEGER INDEX(10000)
INTEGER I
DO I=1,10000
INDEX(I) = MOD(I, 1000) + 1
Y(I) = 0.0
ENDDO
DO I = 1,1000
X(I) = 0.0
ENDDO
CALL SUBA16(X, Y, INDEX, 10000)
DO I = 1,10
PRINT *, "X(", I, ") = ", X(I), ", Y(", I, ") = ", Y(I)
ENDDO
END PROGRAM A16
/libgomp.fortran/appendix-a/a.26.1.f90
0,0 → 1,11
! { dg-do run }
PROGRAM A26
INTEGER I, J
I=1
J=2
!$OMP PARALLEL PRIVATE(I) FIRSTPRIVATE(J)
I=3
J=J+2
!$OMP END PARALLEL
PRINT *, I, J ! I and J are undefined
END PROGRAM A26
/libgomp.fortran/appendix-a/a.33.3.f90
0,0 → 1,10
! { dg-do compile }
 
FUNCTION NEW_LOCK()
USE OMP_LIB ! or INCLUDE "omp_lib.h"
INTEGER(OMP_LOCK_KIND), POINTER :: NEW_LOCK
!$OMP SINGLE
ALLOCATE(NEW_LOCK)
CALL OMP_INIT_LOCK(NEW_LOCK)
!$OMP END SINGLE COPYPRIVATE(NEW_LOCK)
END FUNCTION NEW_LOCK
/libgomp.fortran/appendix-a/a.31.5.f90
0,0 → 1,16
! { dg-do run }
MODULE MOD
INTRINSIC MAX, MIN
END MODULE MOD
PROGRAM A31_5
USE MOD, MIN=>MAX, MAX=>MIN
REAL :: R
R = -HUGE(0.0)
!$OMP PARALLEL DO REDUCTION(MIN: R) ! still does MAX
DO I = 1, 1000
R = MIN(R, SIN(REAL(I)))
END DO
PRINT *, R
END PROGRAM A31_5
 
! { dg-final { cleanup-modules "mod" } }
/libgomp.fortran/appendix-a/a.18.1.f90
0,0 → 1,59
! { dg-do run }
! { dg-options "-ffixed-form" }
REAL FUNCTION FN1(I)
INTEGER I
FN1 = I * 2.0
RETURN
END FUNCTION FN1
 
REAL FUNCTION FN2(A, B)
REAL A, B
FN2 = A + B
RETURN
END FUNCTION FN2
 
PROGRAM A18
INCLUDE "omp_lib.h" ! or USE OMP_LIB
INTEGER ISYNC(256)
REAL WORK(256)
REAL RESULT(256)
INTEGER IAM, NEIGHBOR
!$OMP PARALLEL PRIVATE(IAM, NEIGHBOR) SHARED(WORK, ISYNC) NUM_THREADS(4)
IAM = OMP_GET_THREAD_NUM() + 1
ISYNC(IAM) = 0
!$OMP BARRIER
! Do computation into my portion of work array
WORK(IAM) = FN1(IAM)
! Announce that I am done with my work.
! The first flush ensures that my work is made visible before
! synch. The second flush ensures that synch is made visible.
!$OMP FLUSH(WORK,ISYNC)
ISYNC(IAM) = 1
!$OMP FLUSH(ISYNC)
 
! Wait until neighbor is done. The first flush ensures that
! synch is read from memory, rather than from the temporary
! view of memory. The second flush ensures that work is read
! from memory, and is done so after the while loop exits.
IF (IAM .EQ. 1) THEN
NEIGHBOR = OMP_GET_NUM_THREADS()
ELSE
NEIGHBOR = IAM - 1
ENDIF
DO WHILE (ISYNC(NEIGHBOR) .EQ. 0)
!$OMP FLUSH(ISYNC)
END DO
!$OMP FLUSH(WORK, ISYNC)
RESULT(IAM) = FN2(WORK(NEIGHBOR), WORK(IAM))
!$OMP END PARALLEL
DO I=1,4
IF (I .EQ. 1) THEN
NEIGHBOR = 4
ELSE
NEIGHBOR = I - 1
ENDIF
IF (RESULT(I) .NE. I * 2 + NEIGHBOR * 2) THEN
CALL ABORT
ENDIF
ENDDO
END PROGRAM A18
/libgomp.fortran/appendix-a/a.22.7.f90
0,0 → 1,33
! { dg-do run }
! { dg-require-effective-target tls_runtime }
 
PROGRAM A22_7_GOOD
INTEGER, ALLOCATABLE, SAVE :: A(:)
INTEGER, POINTER, SAVE :: PTR
INTEGER, SAVE :: I
INTEGER, TARGET :: TARG
LOGICAL :: FIRSTIN = .TRUE.
!$OMP THREADPRIVATE(A, I, PTR)
ALLOCATE (A(3))
A = (/1,2,3/)
PTR => TARG
I=5
!$OMP PARALLEL COPYIN(I, PTR)
!$OMP CRITICAL
IF (FIRSTIN) THEN
TARG = 4 ! Update target of ptr
I = I + 10
IF (ALLOCATED(A)) A = A + 10
FIRSTIN = .FALSE.
END IF
IF (ALLOCATED(A)) THEN
PRINT *, "a = ", A
ELSE
PRINT *, "A is not allocated"
END IF
PRINT *, "ptr = ", PTR
PRINT *, "i = ", I
PRINT *
!$OMP END CRITICAL
!$OMP END PARALLEL
END PROGRAM A22_7_GOOD
/libgomp.fortran/appendix-a/a.19.1.f90
0,0 → 1,60
! { dg-do run }
SUBROUTINE F1(Q)
COMMON /DATA/ P, X
INTEGER, TARGET :: X
INTEGER, POINTER :: P
INTEGER Q
Q=1
!$OMP FLUSH
! X, P and Q are flushed
! because they are shared and accessible
END SUBROUTINE F1
SUBROUTINE F2(Q)
COMMON /DATA/ P, X
INTEGER, TARGET :: X
INTEGER, POINTER :: P
INTEGER Q
!$OMP BARRIER
Q=2
!$OMP BARRIER
! a barrier implies a flush
! X, P and Q are flushed
! because they are shared and accessible
END SUBROUTINE F2
 
INTEGER FUNCTION G(N)
COMMON /DATA/ P, X
INTEGER, TARGET :: X
INTEGER, POINTER :: P
INTEGER N
INTEGER I, J, SUM
I=1
SUM = 0
P=1
!$OMP PARALLEL REDUCTION(+: SUM) NUM_THREADS(2)
CALL F1(J)
! I, N and SUM were not flushed
! because they were not accessible in F1
! J was flushed because it was accessible
SUM = SUM + J
CALL F2(J)
! I, N, and SUM were not flushed
! because they were not accessible in f2
! J was flushed because it was accessible
SUM = SUM + I + J + P + N
!$OMP END PARALLEL
G = SUM
END FUNCTION G
 
PROGRAM A19
COMMON /DATA/ P, X
INTEGER, TARGET :: X
INTEGER, POINTER :: P
INTEGER RESULT, G
P => X
RESULT = G(10)
PRINT *, RESULT
IF (RESULT .NE. 30) THEN
CALL ABORT
ENDIF
END PROGRAM A19
/libgomp.fortran/appendix-a/a.28.1.f90
0,0 → 1,14
! { dg-do run }
 
SUBROUTINE SUB()
COMMON /BLOCK/ X
PRINT *,X ! X is undefined
END SUBROUTINE SUB
PROGRAM A28_1
COMMON /BLOCK/ X
X = 1.0
!$OMP PARALLEL PRIVATE (X)
X = 2.0
CALL SUB()
!$OMP END PARALLEL
END PROGRAM A28_1
/libgomp.fortran/appendix-a/a.28.2.f90
0,0 → 1,16
! { dg-do run }
 
PROGRAM A28_2
COMMON /BLOCK2/ X
X = 1.0
!$OMP PARALLEL PRIVATE (X)
X = 2.0
CALL SUB()
!$OMP END PARALLEL
CONTAINS
SUBROUTINE SUB()
COMMON /BLOCK2/ Y
PRINT *,X ! X is undefined
PRINT *,Y ! Y is undefined
END SUBROUTINE SUB
END PROGRAM A28_2
/libgomp.fortran/appendix-a/a.38.1.f90
0,0 → 1,12
! { dg-do compile }
 
FUNCTION NEW_LOCKS()
USE OMP_LIB ! or INCLUDE "omp_lib.h"
INTEGER(OMP_LOCK_KIND), DIMENSION(1000) :: NEW_LOCKS
INTEGER I
!$OMP PARALLEL DO PRIVATE(I)
DO I=1,1000
CALL OMP_INIT_LOCK(NEW_LOCKS(I))
END DO
!$OMP END PARALLEL DO
END FUNCTION NEW_LOCKS
/libgomp.fortran/appendix-a/a.22.8.f90
0,0 → 1,26
! { dg-do run }
! { dg-require-effective-target tls_runtime }
MODULE A22_MODULE8
REAL, POINTER :: WORK(:)
SAVE WORK
!$OMP THREADPRIVATE(WORK)
END MODULE A22_MODULE8
SUBROUTINE SUB1(N)
USE A22_MODULE8
!$OMP PARALLEL PRIVATE(THE_SUM)
ALLOCATE(WORK(N))
CALL SUB2(THE_SUM)
WRITE(*,*)THE_SUM
!$OMP END PARALLEL
END SUBROUTINE SUB1
SUBROUTINE SUB2(THE_SUM)
USE A22_MODULE8
WORK(:) = 10
THE_SUM=SUM(WORK)
END SUBROUTINE SUB2
PROGRAM A22_8_GOOD
N = 10
CALL SUB1(N)
END PROGRAM A22_8_GOOD
 
! { dg-final { cleanup-modules "a22_module8" } }
/libgomp.fortran/appendix-a/a.39.1.f90
0,0 → 1,26
! { dg-do run }
 
SUBROUTINE SKIP(ID)
END SUBROUTINE SKIP
SUBROUTINE WORK(ID)
END SUBROUTINE WORK
PROGRAM A39
INCLUDE "omp_lib.h" ! or USE OMP_LIB
INTEGER(OMP_LOCK_KIND) LCK
INTEGER ID
CALL OMP_INIT_LOCK(LCK)
!$OMP PARALLEL SHARED(LCK) PRIVATE(ID)
ID = OMP_GET_THREAD_NUM()
CALL OMP_SET_LOCK(LCK)
PRINT *, "My thread id is ", ID
CALL OMP_UNSET_LOCK(LCK)
DO WHILE (.NOT. OMP_TEST_LOCK(LCK))
CALL SKIP(ID) ! We do not yet have the lock
! so we must do something else
END DO
CALL WORK(ID) ! We now have the lock
! and can do the work
CALL OMP_UNSET_LOCK( LCK )
!$OMP END PARALLEL
CALL OMP_DESTROY_LOCK( LCK )
END PROGRAM A39
/libgomp.fortran/appendix-a/a.28.3.f90
0,0 → 1,11
! { dg-do run }
 
PROGRAM A28_3
EQUIVALENCE (X,Y)
X = 1.0
!$OMP PARALLEL PRIVATE(X)
PRINT *,Y ! Y is undefined
Y = 10
PRINT *,X ! X is undefined
!$OMP END PARALLEL
END PROGRAM A28_3
/libgomp.fortran/appendix-a/a.28.4.f90
0,0 → 1,24
! { dg-do run }
 
PROGRAM A28_4
INTEGER I, J
INTEGER A(100), B(100)
EQUIVALENCE (A(51), B(1))
!$OMP PARALLEL DO DEFAULT(PRIVATE) PRIVATE(I,J) LASTPRIVATE(A)
DO I=1,100
DO J=1,100
B(J) = J - 1
ENDDO
DO J=1,100
A(J) = J ! B becomes undefined at this point
ENDDO
DO J=1,50
B(J) = B(J) + 1 ! B is undefined
! A becomes undefined at this point
ENDDO
ENDDO
!$OMP END PARALLEL DO ! The LASTPRIVATE write for A has
! undefined results
PRINT *, B ! B is undefined since the LASTPRIVATE
! write of A was not defined
END PROGRAM A28_4
/libgomp.fortran/appendix-a/a.28.5.f90
0,0 → 1,34
! { dg-do compile }
! { dg-options "-w" }
!
! "-w" added as libgomp/testsuite seemingly cannot parse with
! dg-warning Fortran's output. Fortran warns for "call sub1(a)"
! that there is a "Rank mismatch in argument 'x'".
 
SUBROUTINE SUB1(X)
DIMENSION X(10)
! This use of X does not conform to the
! specification. It would be legal Fortran 90,
! but the OpenMP private directive allows the
! compiler to break the sequence association that
! A had with the rest of the common block.
FORALL (I = 1:10) X(I) = I
END SUBROUTINE SUB1
PROGRAM A28_5
COMMON /BLOCK5/ A
DIMENSION B(10)
EQUIVALENCE (A,B(1))
! the common block has to be at least 10 words
A=0
!$OMP PARALLEL PRIVATE(/BLOCK5/)
! Without the private clause,
! we would be passing a member of a sequence
! that is at least ten elements long.
! With the private clause, A may no longer be
! sequence-associated.
CALL SUB1(A)
!$OMP MASTER
PRINT *, A
!$OMP END MASTER
!$OMP END PARALLEL
END PROGRAM A28_5
/libgomp.fortran/appendix-a/a.2.1.f90
0,0 → 1,22
! { dg-do run }
PROGRAM A2
INCLUDE "omp_lib.h" ! or USE OMP_LIB
INTEGER X
X=2
!$OMP PARALLEL NUM_THREADS(2) SHARED(X)
IF (OMP_GET_THREAD_NUM() .EQ. 0) THEN
X=5
ELSE
! PRINT 1: The following read of x has a race
PRINT *,"1: THREAD# ", OMP_GET_THREAD_NUM(), "X = ", X
ENDIF
!$OMP BARRIER
IF (OMP_GET_THREAD_NUM() .EQ. 0) THEN
! PRINT 2
PRINT *,"2: THREAD# ", OMP_GET_THREAD_NUM(), "X = ", X
ELSE
! PRINT 3
PRINT *,"3: THREAD# ", OMP_GET_THREAD_NUM(), "X = ", X
ENDIF
!$OMP END PARALLEL
END PROGRAM A2
/libgomp.fortran/appendix-a/a.3.1.f90
0,0 → 1,6
! { dg-do run }
! { dg-options "-ffixed-form" }
PROGRAM A3
!234567890
!$ PRINT *, "Compiled by an OpenMP-compliant implementation."
END PROGRAM A3
/libgomp.fortran/appendix-a/a10.1.f90
0,0 → 1,20
! { dg-do run }
SUBROUTINE WORK1()
END SUBROUTINE WORK1
SUBROUTINE WORK2()
END SUBROUTINE WORK2
PROGRAM A10
!$OMP PARALLEL
!$OMP SINGLE
print *, "Beginning work1."
!$OMP END SINGLE
CALL WORK1()
!$OMP SINGLE
print *, "Finishing work1."
!$OMP END SINGLE
!$OMP SINGLE
print *, "Finished work1 and beginning work2."
!$OMP END SINGLE NOWAIT
CALL WORK2()
!$OMP END PARALLEL
END PROGRAM A10
/libgomp.fortran/appendix-a/a.4.1.f90
0,0 → 1,29
! { dg-do run }
SUBROUTINE SUBDOMAIN(X, ISTART, IPOINTS)
INTEGER ISTART, IPOINTS
REAL X(*)
INTEGER I
DO 100 I=1,IPOINTS
X(ISTART+I) = 123.456
100 CONTINUE
END SUBROUTINE SUBDOMAIN
SUBROUTINE SUB(X, NPOINTS)
INCLUDE "omp_lib.h" ! or USE OMP_LIB
REAL X(*)
INTEGER NPOINTS
INTEGER IAM, NT, IPOINTS, ISTART
!$OMP PARALLEL DEFAULT(PRIVATE) SHARED(X,NPOINTS)
IAM = OMP_GET_THREAD_NUM()
NT = OMP_GET_NUM_THREADS()
IPOINTS = NPOINTS/NT
ISTART = IAM * IPOINTS
IF (IAM .EQ. NT-1) THEN
IPOINTS = NPOINTS - ISTART
ENDIF
CALL SUBDOMAIN(X,ISTART,IPOINTS)
!$OMP END PARALLEL
END SUBROUTINE SUB
PROGRAM A4
REAL ARRAY(10000)
CALL SUB(ARRAY, 10000)
END PROGRAM A4
/libgomp.fortran/pr27395-2.f90
0,0 → 1,30
! PR fortran/27395
! { dg-do run }
 
program pr27395_2
implicit none
integer, parameter :: n=10,m=1001
integer :: i
call foo(n,m)
end program pr27395_2
 
subroutine foo(n,m)
use omp_lib, only : omp_get_thread_num
implicit none
integer, intent(in) :: n,m
integer :: i,j
integer, dimension(n) :: sumarray
sumarray(:)=0
!$OMP PARALLEL DEFAULT(shared) NUM_THREADS(4)
!$OMP DO PRIVATE(j,i), REDUCTION(+:sumarray)
do j=1,m
do i=1,n
sumarray(i)=sumarray(i)+i
end do
end do
!$OMP END DO
!$OMP END PARALLEL
do i=1,n
if (sumarray(i).ne.m*i) call abort
end do
end subroutine foo
/libgomp.fortran/pr49792-1.f90
0,0 → 1,18
! PR fortran/49792
! { dg-do run }
 
subroutine reverse(n, a)
integer :: n
real(kind=8) :: a(n)
!$omp parallel workshare
a(:) = a(n:1:-1)
!$omp end parallel workshare
end subroutine reverse
 
program pr49792
real(kind=8) :: a(16) = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
real(kind=8) :: b(16)
b(:) = a(16:1:-1)
call reverse (16,a)
if (any (a.ne.b)) call abort
end program pr49792
/libgomp.fortran/pr49792-2.f90
0,0 → 1,22
! PR fortran/49792
! { dg-do run }
! { dg-options "-std=f2003 -fall-intrinsics" }
 
subroutine reverse(n, a)
integer :: n
real(kind=8) :: a(n)
!$omp parallel workshare
a(:) = a(n:1:-1)
!$omp end parallel workshare
end subroutine reverse
 
program pr49792
integer :: b(16)
integer, allocatable :: a(:)
b = 1
!$omp parallel workshare
a = b
!$omp end parallel workshare
if (size(a).ne.size(b)) call abort()
if (any (a.ne.b)) call abort()
end program pr49792
/libgomp.fortran/crayptr1.f90
0,0 → 1,46
! { dg-do run }
! { dg-options "-fopenmp -fcray-pointer" }
 
use omp_lib
integer :: a, b, c, p
logical :: l
pointer (ip, p)
a = 1
b = 2
c = 3
l = .false.
ip = loc (a)
 
!$omp parallel num_threads (2) reduction (.or.:l)
l = p .ne. 1
!$omp barrier
!$omp master
ip = loc (b)
!$omp end master
!$omp barrier
l = l .or. p .ne. 2
!$omp barrier
if (omp_get_thread_num () .eq. 1 .or. omp_get_num_threads () .lt. 2) &
ip = loc (c)
!$omp barrier
l = l .or. p .ne. 3
!$omp end parallel
 
if (l) call abort
 
l = .false.
!$omp parallel num_threads (2) reduction (.or.:l) default (private)
ip = loc (a)
a = 3 * omp_get_thread_num () + 4
b = a + 1
c = a + 2
l = p .ne. 3 * omp_get_thread_num () + 4
ip = loc (c)
l = l .or. p .ne. 3 * omp_get_thread_num () + 6
ip = loc (b)
l = l .or. p .ne. 3 * omp_get_thread_num () + 5
!$omp end parallel
 
if (l) call abort
 
end
/libgomp.fortran/stack.f90
0,0 → 1,21
! { dg-do run }
program stack
implicit none
integer id
integer ilocs(2)
integer omp_get_thread_num, foo
call omp_set_num_threads (2)
!$omp parallel private (id)
id = omp_get_thread_num() + 1
ilocs(id) = foo()
!$omp end parallel
! Check that the two threads are not sharing a location for
! the array x in foo()
if (ilocs(1) .eq. ilocs(2)) call abort
end program stack
 
integer function foo ()
implicit none
real x(100,100)
foo = loc(x)
end function foo
/libgomp.fortran/omp_parse1.f90
0,0 → 1,185
! { dg-do run }
use omp_lib
call test_parallel
call test_do
call test_sections
call test_single
 
contains
subroutine test_parallel
integer :: a, b, c, e, f, g, i, j
integer, dimension (20) :: d
logical :: h
a = 6
b = 8
c = 11
d(:) = -1
e = 13
f = 24
g = 27
h = .false.
i = 1
j = 16
!$omp para&
!$omp&llel &
!$omp if (a .eq. 6) private (b, c) shared (d) private (e) &
!$omp firstprivate(f) num_threads (a - 1) first&
!$ompprivate(g)default (shared) reduction (.or. : h) &
!$omp reduction(*:i)
if (i .ne. 1) h = .true.
i = 2
if (f .ne. 24) h = .true.
if (g .ne. 27) h = .true.
e = 7
b = omp_get_thread_num ()
if (b .eq. 0) j = 24
f = b
g = f
c = omp_get_num_threads ()
if (c .gt. a - 1 .or. c .le. 0) h = .true.
if (b .ge. c) h = .true.
d(b + 1) = c
if (f .ne. g .or. f .ne. b) h = .true.
!$omp endparallel
if (h) call abort
if (a .ne. 6) call abort
if (j .ne. 24) call abort
if (d(1) .eq. -1) call abort
e = 1
do g = 1, d(1)
if (d(g) .ne. d(1)) call abort
e = e * 2
end do
if (e .ne. i) call abort
end subroutine test_parallel
 
subroutine test_do_orphan
integer :: k, l
!$omp parallel do private (l)
do 600 k = 1, 16, 2
600 l = k
end subroutine test_do_orphan
 
subroutine test_do
integer :: i, j, k, l, n
integer, dimension (64) :: d
logical :: m
 
j = 16
d(:) = -1
m = .true.
n = 24
!$omp parallel num_threads (4) shared (i, k, d) private (l) &
!$omp&reduction (.and. : m)
if (omp_get_thread_num () .eq. 0) then
k = omp_get_num_threads ()
end if
call test_do_orphan
!$omp do schedule (static) firstprivate (n)
do 200 i = 1, j
if (i .eq. 1 .and. n .ne. 24) call abort
n = i
200 d(n) = omp_get_thread_num ()
!$omp enddo nowait
 
!$omp do lastprivate (i) schedule (static, 5)
do 201 i = j + 1, 2 * j
201 d(i) = omp_get_thread_num () + 1024
! Implied omp end do here
 
if (i .ne. 33) m = .false.
 
!$omp do private (j) schedule (dynamic)
do i = 33, 48
d(i) = omp_get_thread_num () + 2048
end do
!$omp end do nowait
 
!$omp do schedule (runtime)
do i = 49, 4 * j
d(i) = omp_get_thread_num () + 4096
end do
! Implied omp end do here
!$omp end parallel
if (.not. m) call abort
 
j = 0
do i = 1, 64
if (d(i) .lt. j .or. d(i) .ge. j + k) call abort
if (i .eq. 16) j = 1024
if (i .eq. 32) j = 2048
if (i .eq. 48) j = 4096
end do
end subroutine test_do
 
subroutine test_sections
integer :: i, j, k, l, m, n
i = 9
j = 10
k = 11
l = 0
m = 0
n = 30
call omp_set_dynamic (.false.)
call omp_set_num_threads (4)
!$omp parallel num_threads (4)
!$omp sections private (i) firstprivate (j, k) lastprivate (j) &
!$omp& reduction (+ : l, m)
!$omp section
i = 24
if (j .ne. 10 .or. k .ne. 11 .or. m .ne. 0) l = 1
m = m + 4
!$omp section
i = 25
if (j .ne. 10 .or. k .ne. 11) l = 1
m = m + 6
!$omp section
i = 26
if (j .ne. 10 .or. k .ne. 11) l = 1
m = m + 8
!$omp section
i = 27
if (j .ne. 10 .or. k .ne. 11) l = 1
m = m + 10
j = 271
!$omp end sections nowait
!$omp sections lastprivate (n)
!$omp section
n = 6
!$omp section
n = 7
!$omp endsections
!$omp end parallel
if (j .ne. 271 .or. l .ne. 0) call abort
if (m .ne. 4 + 6 + 8 + 10) call abort
if (n .ne. 7) call abort
end subroutine test_sections
 
subroutine test_single
integer :: i, j, k, l
logical :: m
i = 200
j = 300
k = 400
l = 500
m = .false.
!$omp parallel num_threads (4), private (i, j), reduction (.or. : m)
i = omp_get_thread_num ()
j = omp_get_thread_num ()
!$omp single private (k)
k = 64
!$omp end single nowait
!$omp single private (k) firstprivate (l)
if (i .ne. omp_get_thread_num () .or. i .ne. j) then
j = -1
else
j = -2
end if
if (l .ne. 500) j = -1
l = 265
!$omp end single copyprivate (j)
if (i .ne. omp_get_thread_num () .or. j .ne. -2) m = .true.
!$omp endparallel
if (m) call abort
end subroutine test_single
end
/libgomp.fortran/crayptr2.f90
0,0 → 1,31
! { dg-do run }
! { dg-options "-fopenmp -fcray-pointer" }
! { dg-require-effective-target tls_runtime }
 
use omp_lib
integer :: a, b, c, d, p
logical :: l
pointer (ip, p)
save ip
!$omp threadprivate (ip)
a = 1
b = 2
c = 3
l = .false.
!$omp parallel num_threads (3) reduction (.or.:l)
if (omp_get_thread_num () .eq. 0) then
ip = loc (a)
elseif (omp_get_thread_num () .eq. 1) then
ip = loc (b)
else
ip = loc (c)
end if
l = p .ne. omp_get_thread_num () + 1
!$omp single
d = omp_get_thread_num ()
!$omp end single copyprivate (d, ip)
l = l .or. (p .ne. d + 1)
!$omp end parallel
 
if (l) call abort
end
/libgomp.fortran/omp_parse2.f90
0,0 → 1,102
! { dg-do run }
use omp_lib
call test_master
call test_critical
call test_barrier
call test_atomic
 
contains
subroutine test_master
logical :: i, j
i = .false.
j = .false.
!$omp parallel num_threads (4)
!$omp master
i = .true.
j = omp_get_thread_num () .eq. 0
!$omp endmaster
!$omp end parallel
if (.not. (i .or. j)) call abort
end subroutine test_master
 
subroutine test_critical_1 (i, j)
integer :: i, j
!$omp critical(critical_foo)
i = i + 1
!$omp end critical (critical_foo)
!$omp critical
j = j + 1
!$omp end critical
end subroutine test_critical_1
 
subroutine test_critical
integer :: i, j, n
n = -1
i = 0
j = 0
!$omp parallel num_threads (4)
if (omp_get_thread_num () .eq. 0) n = omp_get_num_threads ()
call test_critical_1 (i, j)
call test_critical_1 (i, j)
!$omp critical
j = j + 1
!$omp end critical
!$omp critical (critical_foo)
i = i + 1
!$omp endcritical (critical_foo)
!$omp end parallel
if (n .lt. 1 .or. i .ne. n * 3 .or. j .ne. n * 3) call abort
end subroutine test_critical
 
subroutine test_barrier
integer :: i
logical :: j
i = 23
j = .false.
!$omp parallel num_threads (4)
if (omp_get_thread_num () .eq. 0) i = 5
!$omp flush (i)
!$omp barrier
if (i .ne. 5) then
!$omp atomic
j = j .or. .true.
end if
!$omp end parallel
if (i .ne. 5 .or. j) call abort
end subroutine test_barrier
 
subroutine test_atomic
integer :: a, b, c, d, e, f, g
a = 0
b = 1
c = 0
d = 1024
e = 1024
f = -1
g = -1
!$omp parallel num_threads (8)
!$omp atomic
a = a + 2 + 4
!$omp atomic
b = 3 * b
!$omp atomic
c = 8 - c
!$omp atomic
d = d / 2
!$omp atomic
e = min (e, omp_get_thread_num ())
!$omp atomic
f = max (omp_get_thread_num (), f)
if (omp_get_thread_num () .eq. 0) g = omp_get_num_threads ()
!$omp end parallel
if (g .le. 0 .or. g .gt. 8) call abort
if (a .ne. 6 * g .or. b .ne. 3 ** g) call abort
if (iand (g, 1) .eq. 1) then
if (c .ne. 8) call abort
else if (c .ne. 0) then
call abort
end if
if (d .ne. 1024 / (2 ** g)) call abort
if (e .ne. 0 .or. f .ne. g - 1) call abort
end subroutine test_atomic
end
/libgomp.fortran/crayptr3.f90
0,0 → 1,36
! { dg-do run }
! { dg-options "-fopenmp -fcray-pointer" }
 
use omp_lib
integer :: a, b, c, i, p
logical :: l
pointer (ip, p)
a = 1
b = 2
c = 3
l = .false.
ip = loc (a)
 
!$omp parallel num_threads (2) reduction (.or.:l) firstprivate (ip)
l = p .ne. 1
ip = loc (b)
if (omp_get_thread_num () .eq. 1) ip = loc (c)
l = l .or. (p .ne. (2 + omp_get_thread_num ()))
!$omp end parallel
 
if (l) call abort
 
l = .false.
ip = loc (a)
!$omp parallel do num_threads (2) reduction (.or.:l) &
!$omp & firstprivate (ip) lastprivate (ip)
do i = 0, 1
l = l .or. (p .ne. 1)
ip = loc (b)
if (i .eq. 1) ip = loc (c)
l = l .or. (p .ne. (2 + i))
end do
 
if (l) call abort
if (p .ne. 3) call abort
end
/libgomp.fortran/omp_parse3.f90
0,0 → 1,96
! { dg-do run }
! { dg-require-effective-target tls_runtime }
use omp_lib
common /tlsblock/ x, y
integer :: x, y, z
save z
!$omp threadprivate (/tlsblock/, z)
 
call test_flush
call test_ordered
call test_threadprivate
 
contains
subroutine test_flush
integer :: i, j
i = 0
j = 0
!$omp parallel num_threads (4)
if (omp_get_thread_num () .eq. 0) i = omp_get_num_threads ()
if (omp_get_thread_num () .eq. 0) j = j + 1
!$omp flush (i, j)
!$omp barrier
if (omp_get_thread_num () .eq. 1) j = j + 2
!$omp flush
!$omp barrier
if (omp_get_thread_num () .eq. 2) j = j + 3
!$omp flush (i)
!$omp flush (j)
!$omp barrier
if (omp_get_thread_num () .eq. 3) j = j + 4
!$omp end parallel
end subroutine test_flush
 
subroutine test_ordered
integer :: i, j
integer, dimension (100) :: d
d(:) = -1
!$omp parallel do ordered schedule (dynamic) num_threads (4)
do i = 1, 100, 5
!$omp ordered
d(i) = i
!$omp end ordered
end do
j = 1
do 100 i = 1, 100
if (i .eq. j) then
if (d(i) .ne. i) call abort
j = i + 5
else
if (d(i) .ne. -1) call abort
end if
100 d(i) = -1
end subroutine test_ordered
 
subroutine test_threadprivate
common /tlsblock/ x, y
!$omp threadprivate (/tlsblock/)
integer :: i, j, x, y
logical :: m, n
call omp_set_num_threads (4)
call omp_set_dynamic (.false.)
i = -1
x = 6
y = 7
z = 8
n = .false.
m = .false.
!$omp parallel copyin (/tlsblock/, z) reduction (.or.:m) &
!$omp& num_threads (4)
if (omp_get_thread_num () .eq. 0) i = omp_get_num_threads ()
if (x .ne. 6 .or. y .ne. 7 .or. z .ne. 8) call abort
x = omp_get_thread_num ()
y = omp_get_thread_num () + 1024
z = omp_get_thread_num () + 4096
!$omp end parallel
if (x .ne. 0 .or. y .ne. 1024 .or. z .ne. 4096) call abort
!$omp parallel num_threads (4), private (j) reduction (.or.:n)
if (omp_get_num_threads () .eq. i) then
j = omp_get_thread_num ()
if (x .ne. j .or. y .ne. j + 1024 .or. z .ne. j + 4096) &
& call abort
end if
!$omp end parallel
m = m .or. n
n = .false.
!$omp parallel num_threads (4), copyin (z) reduction (.or. : n) &
!$omp&private (j)
if (z .ne. 4096) n = .true.
if (omp_get_num_threads () .eq. i) then
j = omp_get_thread_num ()
if (x .ne. j .or. y .ne. j + 1024) call abort
end if
!$omp end parallel
if (m .or. n) call abort
end subroutine test_threadprivate
end
/libgomp.fortran/condinc1.inc
0,0 → 1,2
if (l) stop 3
return
/libgomp.fortran/omp_parse4.f90
0,0 → 1,72
! { dg-do run }
!$ use omp_lib
call test_workshare
 
contains
subroutine test_workshare
integer :: i, j, k, l, m
double precision, dimension (64) :: d, e
integer, dimension (10) :: f, g
integer, dimension (16, 16) :: a, b, c
integer, dimension (16) :: n
d(:) = 1
e = 7
f = 10
l = 256
m = 512
g(1:3) = -1
g(4:6) = 0
g(7:8) = 5
g(9:10) = 10
forall (i = 1:16, j = 1:16) a (i, j) = i * 16 + j
forall (j = 1:16) n (j) = j
!$omp parallel num_threads (4) private (j, k)
!$omp barrier
!$omp workshare
i = 6
e(:) = d(:)
where (g .lt. 0)
f = 100
elsewhere (g .eq. 0)
f = 200 + f
elsewhere
where (g .gt. 6) f = f + sum (g)
f = 300 + f
end where
where (f .gt. 210) g = 0
!$omp end workshare nowait
!$omp workshare
forall (j = 1:16, k = 1:16) b (k, j) = a (j, k)
forall (k = 1:16) c (k, 1:16) = a (1:16, k)
forall (j = 2:16, n (17 - j) / 4 * 4 .ne. n (17 - j))
n (j) = n (j - 1) * n (j)
end forall
!$omp endworkshare
!$omp workshare
!$omp atomic
i = i + 8 + 6
!$omp critical
!$omp critical (critical_foox)
l = 128
!$omp end critical (critical_foox)
!$omp endcritical
!$omp parallel num_threads (2)
!$ if (omp_get_thread_num () .eq. 0) m = omp_get_num_threads ()
!$omp atomic
l = 1 + l
!$omp end parallel
!$omp end workshare
!$omp end parallel
 
if (any (f .ne. (/100, 100, 100, 210, 210, 210, 310, 310, 337, 337/))) &
& call abort
if (any (g .ne. (/-1, -1, -1, 0, 0, 0, 0, 0, 0, 0/))) call abort
if (i .ne. 20) call abort
!$ if (l .ne. 128 + m) call abort
if (any (d .ne. 1 .or. e .ne. 1)) call abort
if (any (b .ne. transpose (a))) call abort
if (any (c .ne. b)) call abort
if (any (n .ne. (/1, 2, 6, 12, 5, 30, 42, 56, 9, 90, &
& 110, 132, 13, 182, 210, 240/))) call abort
end subroutine test_workshare
end
/libgomp.fortran/reduction1.f90
0,0 → 1,181
! { dg-do run }
!$ use omp_lib
 
integer :: i, ia (6), n, cnt
real :: r, ra (4)
double precision :: d, da (5)
complex :: c, ca (3)
logical :: v
 
i = 1
ia = 2
r = 3
ra = 4
d = 5.5
da = 6.5
c = cmplx (7.5, 1.5)
ca = cmplx (8.5, -3.0)
v = .false.
cnt = -1
 
!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
!$omp & reduction (+:i, ia, r, ra, d, da, c, ca)
!$ if (i .ne. 0 .or. any (ia .ne. 0)) v = .true.
!$ if (r .ne. 0 .or. any (ra .ne. 0)) v = .true.
!$ if (d .ne. 0 .or. any (da .ne. 0)) v = .true.
!$ if (c .ne. cmplx (0) .or. any (ca .ne. cmplx (0))) v = .true.
n = omp_get_thread_num ()
if (n .eq. 0) then
cnt = omp_get_num_threads ()
i = 4
ia(3:5) = -2
r = 5
ra(1:2) = 6.5
d = -2.5
da(2:4) = 8.5
c = cmplx (2.5, -3.5)
ca(1) = cmplx (4.5, 5)
else if (n .eq. 1) then
i = 2
ia(4:6) = 5
r = 1
ra(2:4) = -1.5
d = 8.5
da(1:3) = 2.5
c = cmplx (0.5, -3)
ca(2:3) = cmplx (-1, 6)
else
i = 1
ia = 1
r = -1
ra = -1
d = 1
da = -1
c = 1
ca = cmplx (-1, 0)
end if
!$omp end parallel
if (v) call abort
if (cnt .eq. 3) then
if (i .ne. 8 .or. any (ia .ne. (/3, 3, 1, 6, 6, 8/))) call abort
if (r .ne. 8 .or. any (ra .ne. (/9.5, 8.0, 1.5, 1.5/))) call abort
if (d .ne. 12.5 .or. any (da .ne. (/8.0, 16.5, 16.5, 14.0, 5.5/))) call abort
if (c .ne. cmplx (11.5, -5)) call abort
if (ca(1) .ne. cmplx (12, 2)) call abort
if (ca(2) .ne. cmplx (6.5, 3) .or. ca(2) .ne. ca(3)) call abort
end if
 
i = 1
ia = 2
r = 3
ra = 4
d = 5.5
da = 6.5
c = cmplx (7.5, 1.5)
ca = cmplx (8.5, -3.0)
v = .false.
cnt = -1
 
!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
!$omp & reduction (-:i, ia, r, ra, d, da, c, ca)
!$ if (i .ne. 0 .or. any (ia .ne. 0)) v = .true.
!$ if (r .ne. 0 .or. any (ra .ne. 0)) v = .true.
!$ if (d .ne. 0 .or. any (da .ne. 0)) v = .true.
!$ if (c .ne. cmplx (0) .or. any (ca .ne. cmplx (0))) v = .true.
n = omp_get_thread_num ()
if (n .eq. 0) then
cnt = omp_get_num_threads ()
i = 4
ia(3:5) = -2
r = 5
ra(1:2) = 6.5
d = -2.5
da(2:4) = 8.5
c = cmplx (2.5, -3.5)
ca(1) = cmplx (4.5, 5)
else if (n .eq. 1) then
i = 2
ia(4:6) = 5
r = 1
ra(2:4) = -1.5
d = 8.5
da(1:3) = 2.5
c = cmplx (0.5, -3)
ca(2:3) = cmplx (-1, 6)
else
i = 1
ia = 1
r = -1
ra = -1
d = 1
da = -1
c = 1
ca = cmplx (-1, 0)
end if
!$omp end parallel
if (v) call abort
if (cnt .eq. 3) then
if (i .ne. 8 .or. any (ia .ne. (/3, 3, 1, 6, 6, 8/))) call abort
if (r .ne. 8 .or. any (ra .ne. (/9.5, 8.0, 1.5, 1.5/))) call abort
if (d .ne. 12.5 .or. any (da .ne. (/8.0, 16.5, 16.5, 14.0, 5.5/))) call abort
if (c .ne. cmplx (11.5, -5)) call abort
if (ca(1) .ne. cmplx (12, 2)) call abort
if (ca(2) .ne. cmplx (6.5, 3) .or. ca(2) .ne. ca(3)) call abort
end if
 
i = 1
ia = 2
r = 4
ra = 8
d = 16
da = 32
c = 2
ca = cmplx (0, 2)
v = .false.
cnt = -1
 
!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
!$omp & reduction (*:i, ia, r, ra, d, da, c, ca)
!$ if (i .ne. 1 .or. any (ia .ne. 1)) v = .true.
!$ if (r .ne. 1 .or. any (ra .ne. 1)) v = .true.
!$ if (d .ne. 1 .or. any (da .ne. 1)) v = .true.
!$ if (c .ne. cmplx (1) .or. any (ca .ne. cmplx (1))) v = .true.
n = omp_get_thread_num ()
if (n .eq. 0) then
cnt = omp_get_num_threads ()
i = 3
ia(3:5) = 2
r = 0.5
ra(1:2) = 2
d = -1
da(2:4) = -2
c = 2.5
ca(1) = cmplx (-5, 0)
else if (n .eq. 1) then
i = 2
ia(4:6) = -2
r = 8
ra(2:4) = -0.5
da(1:3) = -1
c = -3
ca(2:3) = cmplx (0, -1)
else
ia = 2
r = 0.5
ra = 0.25
d = 2.5
da = -1
c = cmplx (0, -1)
ca = cmplx (-1, 0)
end if
!$omp end parallel
if (v) call abort
if (cnt .eq. 3) then
if (i .ne. 6 .or. any (ia .ne. (/4, 4, 8, -16, -16, -8/))) call abort
if (r .ne. 8 .or. any (ra .ne. (/4., -2., -1., -1./))) call abort
if (d .ne. -40 .or. any (da .ne. (/32., -64., -64., 64., -32./))) call abort
if (c .ne. cmplx (0, 15)) call abort
if (ca(1) .ne. cmplx (0, 10)) call abort
if (ca(2) .ne. cmplx (-2, 0) .or. ca(2) .ne. ca(3)) call abort
end if
end
/libgomp.fortran/character1.f90
0,0 → 1,72
! { dg-do run }
!$ use omp_lib
 
character (len = 8) :: h, i
character (len = 4) :: j, k
h = '01234567'
i = 'ABCDEFGH'
j = 'IJKL'
k = 'MN'
call test (h, j)
contains
subroutine test (p, q)
character (len = 8) :: p
character (len = 4) :: q, r
character (len = 16) :: f
character (len = 32) :: g
integer, dimension (18) :: s
logical :: l
integer :: m
f = 'test16'
g = 'abcdefghijklmnopqrstuvwxyz'
r = ''
l = .false.
s = -6
!$omp parallel firstprivate (f, p, s) private (r, m) reduction (.or.:l) &
!$omp & num_threads (4)
m = omp_get_thread_num ()
if (any (s .ne. -6)) l = .true.
l = l .or. f .ne. 'test16' .or. p .ne. '01234567'
l = l .or. g .ne. 'abcdefghijklmnopqrstuvwxyz'
l = l .or. i .ne. 'ABCDEFGH' .or. q .ne. 'IJKL'
l = l .or. k .ne. 'MN'
!$omp barrier
if (m .eq. 0) then
f = 'ffffffff0'
g = 'xyz'
i = '123'
k = '9876'
p = '_abc'
q = '_def'
r = '1_23'
else if (m .eq. 1) then
f = '__'
p = 'xxx'
r = '7575'
else if (m .eq. 2) then
f = 'ZZ'
p = 'm2'
r = 'M2'
else if (m .eq. 3) then
f = 'YY'
p = 'm3'
r = 'M3'
end if
s = m
!$omp barrier
l = l .or. g .ne. 'xyz' .or. i .ne. '123' .or. k .ne. '9876'
l = l .or. q .ne. '_def'
if (any (s .ne. m)) l = .true.
if (m .eq. 0) then
l = l .or. f .ne. 'ffffffff0' .or. p .ne. '_abc' .or. r .ne. '1_23'
else if (m .eq. 1) then
l = l .or. f .ne. '__' .or. p .ne. 'xxx' .or. r .ne. '7575'
else if (m .eq. 2) then
l = l .or. f .ne. 'ZZ' .or. p .ne. 'm2' .or. r .ne. 'M2'
else if (m .eq. 3) then
l = l .or. f .ne. 'YY' .or. p .ne. 'm3' .or. r .ne. 'M3'
end if
!$omp end parallel
if (l) call abort
end subroutine test
end
/libgomp.fortran/reduction2.f90
0,0 → 1,73
! { dg-do run }
!$ use omp_lib
 
logical :: l, la (4), m, ma (4), v
integer :: n, cnt
 
l = .true.
la = (/.true., .false., .true., .true./)
m = .false.
ma = (/.false., .false., .false., .true./)
v = .false.
cnt = -1
 
!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
!$omp & reduction (.and.:l, la) reduction (.or.:m, ma)
!$ if (.not. l .or. any (.not. la)) v = .true.
!$ if (m .or. any (ma)) v = .true.
n = omp_get_thread_num ()
if (n .eq. 0) then
cnt = omp_get_num_threads ()
l = .false.
la(3) = .false.
ma(2) = .true.
else if (n .eq. 1) then
l = .false.
la(4) = .false.
ma(1) = .true.
else
la(3) = .false.
m = .true.
ma(1) = .true.
end if
!$omp end parallel
if (v) call abort
if (cnt .eq. 3) then
if (l .or. any (la .neqv. (/.true., .false., .false., .false./))) call abort
if (.not. m .or. any (ma .neqv. (/.true., .true., .false., .true./))) call abort
end if
 
l = .true.
la = (/.true., .false., .true., .true./)
m = .false.
ma = (/.false., .false., .false., .true./)
v = .false.
cnt = -1
 
!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
!$omp & reduction (.eqv.:l, la) reduction (.neqv.:m, ma)
!$ if (.not. l .or. any (.not. la)) v = .true.
!$ if (m .or. any (ma)) v = .true.
n = omp_get_thread_num ()
if (n .eq. 0) then
cnt = omp_get_num_threads ()
l = .false.
la(3) = .false.
ma(2) = .true.
else if (n .eq. 1) then
l = .false.
la(4) = .false.
ma(1) = .true.
else
la(3) = .false.
m = .true.
ma(1) = .true.
end if
!$omp end parallel
if (v) call abort
if (cnt .eq. 3) then
if (.not. l .or. any (la .neqv. (/.true., .false., .true., .false./))) call abort
if (.not. m .or. any (ma .neqv. (/.false., .true., .false., .true./))) call abort
end if
 
end
/libgomp.fortran/jacobi.f
0,0 → 1,261
* { dg-do run }
 
program main
************************************************************
* program to solve a finite difference
* discretization of Helmholtz equation :
* (d2/dx2)u + (d2/dy2)u - alpha u = f
* using Jacobi iterative method.
*
* Modified: Sanjiv Shah, Kuck and Associates, Inc. (KAI), 1998
* Author: Joseph Robicheaux, Kuck and Associates, Inc. (KAI), 1998
*
* Directives are used in this code to achieve paralleism.
* All do loops are parallized with default 'static' scheduling.
*
* Input : n - grid dimension in x direction
* m - grid dimension in y direction
* alpha - Helmholtz constant (always greater than 0.0)
* tol - error tolerance for iterative solver
* relax - Successice over relaxation parameter
* mits - Maximum iterations for iterative solver
*
* On output
* : u(n,m) - Dependent variable (solutions)
* : f(n,m) - Right hand side function
*************************************************************
implicit none
 
integer n,m,mits,mtemp
include "omp_lib.h"
double precision tol,relax,alpha
 
common /idat/ n,m,mits,mtemp
common /fdat/tol,alpha,relax
*
* Read info
*
write(*,*) "Input n,m - grid dimension in x,y direction "
n = 64
m = 64
* read(5,*) n,m
write(*,*) n, m
write(*,*) "Input alpha - Helmholts constant "
alpha = 0.5
* read(5,*) alpha
write(*,*) alpha
write(*,*) "Input relax - Successive over-relaxation parameter"
relax = 0.9
* read(5,*) relax
write(*,*) relax
write(*,*) "Input tol - error tolerance for iterative solver"
tol = 1.0E-12
* read(5,*) tol
write(*,*) tol
write(*,*) "Input mits - Maximum iterations for solver"
mits = 100
* read(5,*) mits
write(*,*) mits
 
call omp_set_num_threads (2)
 
*
* Calls a driver routine
*
call driver ()
 
stop
end
 
subroutine driver ( )
*************************************************************
* Subroutine driver ()
* This is where the arrays are allocated and initialzed.
*
* Working varaibles/arrays
* dx - grid spacing in x direction
* dy - grid spacing in y direction
*************************************************************
implicit none
 
integer n,m,mits,mtemp
double precision tol,relax,alpha
 
common /idat/ n,m,mits,mtemp
common /fdat/tol,alpha,relax
 
double precision u(n,m),f(n,m),dx,dy
 
* Initialize data
 
call initialize (n,m,alpha,dx,dy,u,f)
 
* Solve Helmholtz equation
 
call jacobi (n,m,dx,dy,alpha,relax,u,f,tol,mits)
 
* Check error between exact solution
 
call error_check (n,m,alpha,dx,dy,u,f)
 
return
end
 
subroutine initialize (n,m,alpha,dx,dy,u,f)
******************************************************
* Initializes data
* Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2)
*
******************************************************
implicit none
integer n,m
double precision u(n,m),f(n,m),dx,dy,alpha
integer i,j, xx,yy
double precision PI
parameter (PI=3.1415926)
 
dx = 2.0 / (n-1)
dy = 2.0 / (m-1)
 
* Initilize initial condition and RHS
 
!$omp parallel do private(xx,yy)
do j = 1,m
do i = 1,n
xx = -1.0 + dx * dble(i-1) ! -1 < x < 1
yy = -1.0 + dy * dble(j-1) ! -1 < y < 1
u(i,j) = 0.0
f(i,j) = -alpha *(1.0-xx*xx)*(1.0-yy*yy)
& - 2.0*(1.0-xx*xx)-2.0*(1.0-yy*yy)
enddo
enddo
!$omp end parallel do
 
return
end
 
subroutine jacobi (n,m,dx,dy,alpha,omega,u,f,tol,maxit)
******************************************************************
* Subroutine HelmholtzJ
* Solves poisson equation on rectangular grid assuming :
* (1) Uniform discretization in each direction, and
* (2) Dirichlect boundary conditions
*
* Jacobi method is used in this routine
*
* Input : n,m Number of grid points in the X/Y directions
* dx,dy Grid spacing in the X/Y directions
* alpha Helmholtz eqn. coefficient
* omega Relaxation factor
* f(n,m) Right hand side function
* u(n,m) Dependent variable/Solution
* tol Tolerance for iterative solver
* maxit Maximum number of iterations
*
* Output : u(n,m) - Solution
*****************************************************************
implicit none
integer n,m,maxit
double precision dx,dy,f(n,m),u(n,m),alpha, tol,omega
*
* Local variables
*
integer i,j,k,k_local
double precision error,resid,rsum,ax,ay,b
double precision error_local, uold(n,m)
 
real ta,tb,tc,td,te,ta1,ta2,tb1,tb2,tc1,tc2,td1,td2
real te1,te2
real second
external second
*
* Initialize coefficients
ax = 1.0/(dx*dx) ! X-direction coef
ay = 1.0/(dy*dy) ! Y-direction coef
b = -2.0/(dx*dx)-2.0/(dy*dy) - alpha ! Central coeff
 
error = 10.0 * tol
k = 1
 
do while (k.le.maxit .and. error.gt. tol)
 
error = 0.0
 
* Copy new solution into old
!$omp parallel
 
!$omp do
do j=1,m
do i=1,n
uold(i,j) = u(i,j)
enddo
enddo
 
* Compute stencil, residual, & update
 
!$omp do private(resid) reduction(+:error)
do j = 2,m-1
do i = 2,n-1
* Evaluate residual
resid = (ax*(uold(i-1,j) + uold(i+1,j))
& + ay*(uold(i,j-1) + uold(i,j+1))
& + b * uold(i,j) - f(i,j))/b
* Update solution
u(i,j) = uold(i,j) - omega * resid
* Accumulate residual error
error = error + resid*resid
end do
enddo
!$omp enddo nowait
 
!$omp end parallel
 
* Error check
 
k = k + 1
 
error = sqrt(error)/dble(n*m)
*
enddo ! End iteration loop
*
print *, 'Total Number of Iterations ', k
print *, 'Residual ', error
 
return
end
 
subroutine error_check (n,m,alpha,dx,dy,u,f)
implicit none
************************************************************
* Checks error between numerical and exact solution
*
************************************************************
integer n,m
double precision u(n,m),f(n,m),dx,dy,alpha
integer i,j
double precision xx,yy,temp,error
 
dx = 2.0 / (n-1)
dy = 2.0 / (m-1)
error = 0.0
 
!$omp parallel do private(xx,yy,temp) reduction(+:error)
do j = 1,m
do i = 1,n
xx = -1.0d0 + dx * dble(i-1)
yy = -1.0d0 + dy * dble(j-1)
temp = u(i,j) - (1.0-xx*xx)*(1.0-yy*yy)
error = error + temp*temp
enddo
enddo
error = sqrt(error)/dble(n*m)
 
print *, 'Solution Error : ',error
 
return
end
/libgomp.fortran/character2.f90
0,0 → 1,61
! { dg-do run }
!$ use omp_lib
 
character (len = 8) :: h
character (len = 9) :: i
h = '01234567'
i = 'ABCDEFGHI'
call test (h, i, 9)
contains
subroutine test (p, q, n)
character (len = *) :: p
character (len = n) :: q
character (len = n) :: r
character (len = n) :: t
character (len = n) :: u
integer, dimension (n + 4) :: s
logical :: l
integer :: m
r = ''
if (n .gt. 8) r = 'jklmnopqr'
do m = 1, n + 4
s(m) = m
end do
u = 'abc'
l = .false.
!$omp parallel firstprivate (p, q, r) private (t, m) reduction (.or.:l) &
!$omp & num_threads (2)
do m = 1, 13
if (s(m) .ne. m) l = .true.
end do
m = omp_get_thread_num ()
l = l .or. p .ne. '01234567' .or. q .ne. 'ABCDEFGHI'
l = l .or. r .ne. 'jklmnopqr' .or. u .ne. 'abc'
!$omp barrier
if (m .eq. 0) then
p = 'A'
q = 'B'
r = 'C'
t = '123'
u = '987654321'
else if (m .eq. 1) then
p = 'D'
q = 'E'
r = 'F'
t = '456'
s = m
end if
!$omp barrier
l = l .or. u .ne. '987654321'
if (any (s .ne. 1)) l = .true.
if (m .eq. 0) then
l = l .or. p .ne. 'A' .or. q .ne. 'B' .or. r .ne. 'C'
l = l .or. t .ne. '123'
else
l = l .or. p .ne. 'D' .or. q .ne. 'E' .or. r .ne. 'F'
l = l .or. t .ne. '456'
end if
!$omp end parallel
if (l) call abort
end subroutine test
end
/libgomp.fortran/reduction3.f90
0,0 → 1,103
! { dg-do run }
!$ use omp_lib
 
integer (kind = 4) :: i, ia (6), n, cnt
real :: r, ra (4)
double precision :: d, da (5)
logical :: v
 
i = 1
ia = 2
r = 3
ra = 4
d = 5.5
da = 6.5
v = .false.
cnt = -1
 
!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
!$omp & reduction (max:i, ia, r, ra, d, da)
!$ if (i .ne. -huge(i)-1 .or. any (ia .ne. -huge(ia)-1)) v = .true.
!$ if (r .ge. -1.0d38 .or. any (ra .ge. -1.0d38)) v = .true.
!$ if (d .ge. -1.0d300 .or. any (da .ge. -1.0d300)) v = .true.
n = omp_get_thread_num ()
if (n .eq. 0) then
cnt = omp_get_num_threads ()
i = 4
ia(3:5) = -2
ia(1) = 7
r = 5
ra(1:2) = 6.5
d = -2.5
da(2:4) = 8.5
else if (n .eq. 1) then
i = 2
ia(4:6) = 5
r = 1
ra(2:4) = -1.5
d = 8.5
da(1:3) = 2.5
else
i = 1
ia = 1
r = -1
ra = -1
d = 1
da = -1
end if
!$omp end parallel
if (v) call abort
if (cnt .eq. 3) then
if (i .ne. 4 .or. any (ia .ne. (/7, 2, 2, 5, 5, 5/))) call abort
if (r .ne. 5 .or. any (ra .ne. (/6.5, 6.5, 4., 4./))) call abort
if (d .ne. 8.5 .or. any (da .ne. (/6.5, 8.5, 8.5, 8.5, 6.5/))) call abort
end if
 
i = 1
ia = 2
r = 3
ra = 4
d = 5.5
da = 6.5
v = .false.
cnt = -1
 
!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
!$omp & reduction (min:i, ia, r, ra, d, da)
!$ if (i .ne. 2147483647 .or. any (ia .ne. 2147483647)) v = .true.
!$ if (r .le. 1.0d38 .or. any (ra .le. 1.0d38)) v = .true.
!$ if (d .le. 1.0d300 .or. any (da .le. 1.0d300)) v = .true.
n = omp_get_thread_num ()
if (n .eq. 0) then
cnt = omp_get_num_threads ()
i = 4
ia(3:5) = -2
ia(1) = 7
r = 5
ra(1:2) = 6.5
d = -2.5
da(2:4) = 8.5
else if (n .eq. 1) then
i = 2
ia(4:6) = 5
r = 1
ra(2:4) = -1.5
d = 8.5
da(1:3) = 2.5
else
i = 1
ia = 1
r = -1
ra = 7
ra(3) = -8.5
d = 1
da(1:4) = 6
end if
!$omp end parallel
if (v) call abort
if (cnt .eq. 3) then
if (i .ne. 1 .or. any (ia .ne. (/1, 1, -2, -2, -2, 1/))) call abort
if (r .ne. -1 .or. any (ra .ne. (/4., -1.5, -8.5, -1.5/))) call abort
if (d .ne. -2.5 .or. any (da .ne. (/2.5, 2.5, 2.5, 6., 6.5/))) call abort
end if
end
/libgomp.fortran/pr32550.f90
0,0 → 1,21
! PR fortran/32550
! { dg-do run }
! { dg-require-effective-target tls_runtime }
 
integer, pointer, save :: ptr
integer, target :: targ
integer :: e
!$omp threadprivate(ptr)
e = 0
targ = 42
!$omp parallel shared(targ)
!$omp single
ptr => targ
!$omp end single copyprivate(ptr)
if (ptr.ne.42) then
!$omp atomic
e = e + 1
end if
!$omp end parallel
if (e.ne.0) call abort
end
/libgomp.fortran/reduction4.f90
0,0 → 1,56
! { dg-do run }
!$ use omp_lib
 
integer (kind = 4) :: i, ia (6), j, ja (6), k, ka (6), ta (6), n, cnt, x
logical :: v
 
i = Z'ffff0f'
ia = Z'f0ff0f'
j = Z'0f0000'
ja = Z'0f5a00'
k = Z'055aa0'
ka = Z'05a5a5'
v = .false.
cnt = -1
x = not(0)
 
!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
!$omp & reduction (iand:i, ia) reduction (ior:j, ja) reduction (ieor:k, ka)
!$ if (i .ne. x .or. any (ia .ne. x)) v = .true.
!$ if (j .ne. 0 .or. any (ja .ne. 0)) v = .true.
!$ if (k .ne. 0 .or. any (ka .ne. 0)) v = .true.
n = omp_get_thread_num ()
if (n .eq. 0) then
cnt = omp_get_num_threads ()
i = Z'ff7fff'
ia(3:5) = Z'fffff1'
j = Z'078000'
ja(1:3) = 1
k = Z'78'
ka(3:6) = Z'f0f'
else if (n .eq. 1) then
i = Z'ffff77'
ia(2:5) = Z'ffafff'
j = Z'007800'
ja(2:5) = 8
k = Z'57'
ka(3:4) = Z'f0108'
else
i = Z'777fff'
ia(1:2) = Z'fffff3'
j = Z'000780'
ja(5:6) = Z'f00'
k = Z'1000'
ka(6:6) = Z'777'
end if
!$omp end parallel
if (v) call abort
if (cnt .eq. 3) then
ta = (/Z'f0ff03', Z'f0af03', Z'f0af01', Z'f0af01', Z'f0af01', Z'f0ff0f'/)
if (i .ne. Z'777f07' .or. any (ia .ne. ta)) call abort
ta = (/Z'f5a01', Z'f5a09', Z'f5a09', Z'f5a08', Z'f5f08', Z'f5f00'/)
if (j .ne. Z'fff80' .or. any (ja .ne. ta)) call abort
ta = (/Z'5a5a5', Z'5a5a5', Z'aaba2', Z'aaba2', Z'5aaaa', Z'5addd'/)
if (k .ne. Z'54a8f' .or. any (ka .ne. ta)) call abort
end if
end
/libgomp.fortran/reduction5.f90
0,0 → 1,43
! { dg-do run }
 
module reduction5
intrinsic ior, min, max
end module reduction5
 
call test1
call test2
contains
subroutine test1
use reduction5, bitwise_or => ior
integer :: n
n = Z'f'
!$omp parallel sections num_threads (3) reduction (bitwise_or: n)
n = ior (n, Z'20')
!$omp section
n = bitwise_or (Z'410', n)
!$omp section
n = bitwise_or (n, Z'2000')
!$omp end parallel sections
if (n .ne. Z'243f') call abort
end subroutine
subroutine test2
use reduction5, min => max, max => min
integer :: m, n
m = 8
n = 4
!$omp parallel sections num_threads (3) reduction (min: n) &
!$omp & reduction (max: m)
if (m .gt. 13) m = 13
if (n .lt. 11) n = 11
!$omp section
if (m .gt. 5) m = 5
if (n .lt. 15) n = 15
!$omp section
if (m .gt. 3) m = 3
if (n .lt. -1) n = -1
!$omp end parallel sections
if (m .ne. 3 .or. n .ne. 15) call abort
end subroutine test2
end
 
! { dg-final { cleanup-modules "reduction5" } }
/libgomp.fortran/omp_cond3.F90
0,0 → 1,24
! Test conditional compilation in free form if -fopenmp
! { dg-options "-fopenmp" }
10 foo = 2&
&56
if (foo.ne.256) call abort
bar = 26
!$ 20 ba&
!$ &r = 4&
!$2
!$bar = 62
!$ bar = bar + 2
#ifdef _OPENMP
bar = bar - 1
#endif
if (bar.ne.43) call abort
baz = bar
!$ 30 baz = 5& ! Comment
!$12 &
!$ + 2
!$X baz = 0 ! Not valid OpenMP conditional compilation lines
! $ baz = 1
baz = baz + 1 !$ baz = 2
if (baz.ne.515) call abort
end
/libgomp.fortran/reduction6.f90
0,0 → 1,32
! { dg-do run }
 
integer, dimension (6, 6) :: a
character (36) :: c
integer nthreads
a = 9
nthreads = -1
call foo (a (2:4, 3:5), nthreads)
if (nthreads .eq. 3) then
write (c, '(36i1)') a
if (c .ne. '999999999999966699966699966699999999') call abort
end if
contains
subroutine foo (b, nthreads)
use omp_lib
integer, dimension (3:, 5:) :: b
integer :: err, nthreads
b = 0
err = 0
!$omp parallel num_threads (3) reduction (+:b)
if (any (b .ne. 0)) then
!$omp atomic
err = err + 1
end if
!$omp master
nthreads = omp_get_num_threads ()
!$omp end master
b = 2
!$omp end parallel
if (err .gt. 0) call abort
end subroutine foo
end
/libgomp.fortran/omp_cond4.F90
0,0 → 1,24
! Test conditional compilation in free form if -fno-openmp
! { dg-options "-fno-openmp" }
10 foo = 2&
&56
if (foo.ne.256) call abort
bar = 26
!$ 20 ba&
!$ &r = 4&
!$2
!$bar = 62
!$ bar = bar + 2
#ifdef _OPENMP
bar = bar - 1
#endif
if (bar.ne.26) call abort
baz = bar
!$ 30 baz = 5& ! Comment
!$12 &
!$ + 2
!$X baz = 0 ! Not valid OpenMP conditional compilation lines
! $ baz = 1
baz = baz + 1 !$ baz = 2
if (baz.ne.27) call abort
end
/libgomp.fortran/allocatable1.f90
0,0 → 1,81
! { dg-do run }
!$ use omp_lib
 
integer, allocatable :: a(:, :)
integer :: b(6, 3)
integer :: i, j
logical :: k, l
b(:, :) = 16
l = .false.
if (allocated (a)) call abort
!$omp parallel private (a, b) reduction (.or.:l)
l = l.or.allocated (a)
allocate (a(3, 6))
l = l.or..not.allocated (a)
l = l.or.size(a).ne.18.or.size(a,1).ne.3.or.size(a,2).ne.6
a(3, 2) = 1
b(3, 2) = 1
deallocate (a)
l = l.or.allocated (a)
!$omp end parallel
if (allocated (a).or.l) call abort
allocate (a(6, 3))
a(:, :) = 3
if (.not.allocated (a)) call abort
l = l.or.size(a).ne.18.or.size(a,1).ne.6.or.size(a,2).ne.3
if (l) call abort
!$omp parallel private (a, b) reduction (.or.:l)
l = l.or..not.allocated (a)
a(3, 2) = 1
b(3, 2) = 1
!$omp end parallel
if (l.or..not.allocated (a)) call abort
!$omp parallel firstprivate (a, b) reduction (.or.:l)
l = l.or..not.allocated (a)
l = l.or.size(a).ne.18.or.size(a,1).ne.6.or.size(a,2).ne.3
do i = 1, 6
l = l.or.(a(i, 1).ne.3).or.(a(i, 2).ne.3)
l = l.or.(a(i, 3).ne.3).or.(b(i, 1).ne.16)
l = l.or.(b(i, 2).ne.16).or.(b(i, 3).ne.16)
end do
a(:, :) = omp_get_thread_num ()
b(:, :) = omp_get_thread_num ()
!$omp end parallel
if (any (a.ne.3).or.any (b.ne.16).or.l) call abort
k = .true.
!$omp parallel do firstprivate (a, b, k) lastprivate (a, b) &
!$omp & reduction (.or.:l)
do i = 1, 36
l = l.or..not.allocated (a)
l = l.or.size(a).ne.18.or.size(a,1).ne.6.or.size(a,2).ne.3
if (k) then
do j = 1, 6
l = l.or.(a(j, 1).ne.3).or.(a(j, 2).ne.3)
l = l.or.(a(j, 3).ne.3).or.(b(j, 1).ne.16)
l = l.or.(b(j, 2).ne.16).or.(b(j, 3).ne.16)
end do
k = .false.
end if
a(:, :) = i + 2
b(:, :) = i
end do
if (any (a.ne.38).or.any (b.ne.36).or.l) call abort
deallocate (a)
if (allocated (a)) call abort
allocate (a (0:1, 0:3))
a(:, :) = 0
!$omp parallel do reduction (+:a) reduction (.or.:l) &
!$omp & num_threads(3) schedule(static)
do i = 0, 7
l = l.or..not.allocated (a)
l = l.or.size(a).ne.8.or.size(a,1).ne.2.or.size(a,2).ne.4
a(modulo (i, 2), i / 2) = a(modulo (i, 2), i / 2) + i
a(i / 4, modulo (i, 4)) = a(i / 4, modulo (i, 4)) + i
end do
if (l) call abort
do i = 0, 1
do j = 0, 3
if (a(i, j) .ne. (5*i + 3*j)) call abort
end do
end do
end
/libgomp.fortran/allocatable2.f90
0,0 → 1,47
! { dg-do run }
! { dg-require-effective-target tls_runtime }
!$ use omp_lib
 
integer, save, allocatable :: a(:, :)
integer, allocatable :: b(:, :)
integer :: n
logical :: l
!$omp threadprivate (a)
if (allocated (a)) call abort
call omp_set_dynamic (.false.)
l = .false.
!$omp parallel num_threads (4) reduction(.or.:l)
allocate (a(-1:1, 7:10))
a(:, :) = omp_get_thread_num () + 6
l = l.or..not.allocated (a)
l = l.or.size(a).ne.12.or.size(a,1).ne.3.or.size(a,2).ne.4
!$omp end parallel
if (l.or.any(a.ne.6)) call abort ()
!$omp parallel num_threads (4) copyin (a) reduction(.or.:l) private (b)
l = l.or.allocated (b)
l = l.or..not.allocated (a)
l = l.or.size(a).ne.12.or.size(a,1).ne.3.or.size(a,2).ne.4
l = l.or.any(a.ne.6)
allocate (b(1, 3))
a(:, :) = omp_get_thread_num () + 36
b(:, :) = omp_get_thread_num () + 66
!$omp single
n = omp_get_thread_num ()
!$omp end single copyprivate (a, b)
l = l.or..not.allocated (a)
l = l.or.size(a).ne.12.or.size(a,1).ne.3.or.size(a,2).ne.4
l = l.or.any(a.ne.(n + 36))
l = l.or..not.allocated (b)
l = l.or.size(b).ne.3.or.size(b,1).ne.1.or.size(b,2).ne.3
l = l.or.any(b.ne.(n + 66))
deallocate (b)
l = l.or.allocated (b)
!$omp end parallel
if (n.lt.0 .or. n.ge.4) call abort
if (l.or.any(a.ne.(n + 36))) call abort
!$omp parallel num_threads (4) reduction(.or.:l)
deallocate (a)
l = l.or.allocated (a)
!$omp end parallel
if (l.or.allocated (a)) call abort
end
/libgomp.fortran/allocatable3.f90
0,0 → 1,21
! { dg-do run }
 
integer, allocatable :: a(:)
integer :: i
logical :: l
l = .false.
if (allocated (a)) call abort
!$omp parallel private (a) reduction (.or.:l)
allocate (a (-7:-5))
l = l.or..not.allocated (a)
l = l.or.size(a).ne.3.or.size(a,1).ne.3
a(:) = 0
!$omp do private (a)
do i = 1, 7
a(:) = i
l = l.or.any (a.ne.i)
end do
l = l.or.any (a.ne.0)
deallocate (a)
!$omp end parallel
end
/libgomp.fortran/workshare1.f90
0,0 → 1,30
function foo ()
integer :: foo
logical :: foo_seen
common /foo_seen/ foo_seen
foo_seen = .true.
foo = 3
end
function bar ()
integer :: bar
logical :: bar_seen
common /bar_seen/ bar_seen
bar_seen = .true.
bar = 3
end
integer :: a (10), b (10), foo, bar
logical :: foo_seen, bar_seen
common /foo_seen/ foo_seen
common /bar_seen/ bar_seen
 
foo_seen = .false.
bar_seen = .false.
!$omp parallel workshare if (foo () .gt. 2) num_threads (bar () + 1)
a = 10
b = 20
a(1:5) = max (a(1:5), b(1:5))
!$omp end parallel workshare
if (any (a(1:5) .ne. 20)) call abort
if (any (a(6:10) .ne. 10)) call abort
if (.not. foo_seen .or. .not. bar_seen) call abort
end
/libgomp.fortran/allocatable4.f90
0,0 → 1,47
! { dg-do run }
 
integer, allocatable :: a(:, :)
integer :: b(6, 3)
integer :: i, j
logical :: k, l
b(:, :) = 16
l = .false.
if (allocated (a)) call abort
!$omp task private (a, b) shared (l)
l = l.or.allocated (a)
allocate (a(3, 6))
l = l.or..not.allocated (a)
l = l.or.size(a).ne.18.or.size(a,1).ne.3.or.size(a,2).ne.6
a(3, 2) = 1
b(3, 2) = 1
deallocate (a)
l = l.or.allocated (a)
!$omp end task
!$omp taskwait
if (allocated (a).or.l) call abort
allocate (a(6, 3))
a(:, :) = 3
if (.not.allocated (a)) call abort
l = l.or.size(a).ne.18.or.size(a,1).ne.6.or.size(a,2).ne.3
if (l) call abort
!$omp task private (a, b) shared (l)
l = l.or..not.allocated (a)
a(3, 2) = 1
b(3, 2) = 1
!$omp end task
!$omp taskwait
if (l.or..not.allocated (a)) call abort
!$omp task firstprivate (a, b) shared (l)
l = l.or..not.allocated (a)
l = l.or.size(a).ne.18.or.size(a,1).ne.6.or.size(a,2).ne.3
do i = 1, 6
l = l.or.(a(i, 1).ne.3).or.(a(i, 2).ne.3)
l = l.or.(a(i, 3).ne.3).or.(b(i, 1).ne.16)
l = l.or.(b(i, 2).ne.16).or.(b(i, 3).ne.16)
end do
a(:, :) = 7
b(:, :) = 8
!$omp end task
!$omp taskwait
if (any (a.ne.3).or.any (b.ne.16).or.l) call abort
end
/libgomp.fortran/workshare2.f90
0,0 → 1,37
subroutine f1
integer a(20:50,70:90)
!$omp parallel workshare
a(:,:) = 17
!$omp end parallel workshare
if (any (a.ne.17)) call abort
end subroutine f1
subroutine f2
integer a(20:50,70:90),d(15),e(15),f(15)
integer b, c, i
!$omp parallel workshare
c = 5
a(:,:) = 17
b = 4
d = (/ 0, 1, 2, 3, 4, 0, 6, 7, 8, 9, 10, 0, 0, 13, 14 /)
forall (i=1:15, d(i) /= 0)
d(i) = 0
end forall
e = (/ 4, 5, 2, 6, 4, 5, 2, 6, 4, 5, 2, 6, 4, 5, 2 /)
f = 7
where (e.ge.5) f = f + 1
!$omp end parallel workshare
if (any (a.ne.17)) call abort
if (c.ne.5.or.b.ne.4) call abort
if (any(d.ne.0)) call abort
do i = 1, 15
if (e(i).ge.5) then
if (f(i).ne.8) call abort
else
if (f(i).ne.7) call abort
end if
end do
end subroutine f2
 
call f1
call f2
end
/libgomp.fortran/pr33880.f90
0,0 → 1,18
! PR middle-end/33880
! { dg-do run }
 
program pr33880
integer :: i, j
call something ()
!$omp parallel do
do i = 1, 1000
!$omp atomic
j = j + 1
end do
if (j .ne. 1000) call abort
contains
subroutine something()
i = 0
j = 0
end subroutine something
end program pr33880
/libgomp.fortran/pr32359.f90
0,0 → 1,34
! { dg-do compile }
!
! PR fortran/32359
! Contributed by Bill Long <longb@cray.com>
 
subroutine test
use omp_lib
implicit none
integer, parameter :: NT = 4
integer :: a
save
!$omp threadprivate(a)
a = 1
 
!$ call omp_set_num_threads(NT)
!$omp parallel
print *, omp_get_thread_num(), a
!$omp end parallel
 
end subroutine test
 
! Derived from OpenMP test omp1/F2_6_2_8_5i.f90
use omp_lib
implicit none
integer, parameter :: NT = 4
integer :: a = 1
!$omp threadprivate(a)
 
!$ call omp_set_num_threads(NT)
!$omp parallel
print *, omp_get_thread_num(), a
!$omp end parallel
 
END
/libgomp.fortran/allocatable5.f90
0,0 → 1,17
! PR fortran/42866
! { dg-do run }
 
program pr42866
integer, allocatable :: a(:)
allocate (a(16))
a = 0
!$omp parallel
!$omp sections reduction(+:a)
a = a + 1
!$omp section
a = a + 2
!$omp end sections
!$omp end parallel
if (any (a.ne.3)) call abort
deallocate (a)
end
/libgomp.fortran/omp_workshare2.f
0,0 → 1,56
C******************************************************************************
C FILE: omp_workshare2.f
C DESCRIPTION:
C OpenMP Example - Sections Work-sharing - Fortran Version
C In this example, the OpenMP SECTION directive is used to assign
C different array operations to threads that execute a SECTION. Each
C thread receives its own copy of the result array to work with.
C AUTHOR: Blaise Barney 5/99
C LAST REVISED: 01/09/04
C******************************************************************************
 
PROGRAM WORKSHARE2
 
INTEGER N, I, NTHREADS, TID, OMP_GET_NUM_THREADS,
+ OMP_GET_THREAD_NUM
PARAMETER (N=50)
REAL A(N), B(N), C(N)
 
! Some initializations
DO I = 1, N
A(I) = I * 1.0
B(I) = A(I)
ENDDO
 
!$OMP PARALLEL SHARED(A,B,NTHREADS), PRIVATE(C,I,TID)
TID = OMP_GET_THREAD_NUM()
IF (TID .EQ. 0) THEN
NTHREADS = OMP_GET_NUM_THREADS()
PRINT *, 'Number of threads =', NTHREADS
END IF
PRINT *, 'Thread',TID,' starting...'
 
!$OMP SECTIONS
 
!$OMP SECTION
PRINT *, 'Thread',TID,' doing section 1'
DO I = 1, N
C(I) = A(I) + B(I)
WRITE(*,100) TID,I,C(I)
100 FORMAT(' Thread',I2,': C(',I2,')=',F8.2)
ENDDO
 
!$OMP SECTION
PRINT *, 'Thread',TID,' doing section 2'
DO I = 1+N/2, N
C(I) = A(I) * B(I)
WRITE(*,100) TID,I,C(I)
ENDDO
 
!$OMP END SECTIONS NOWAIT
 
PRINT *, 'Thread',TID,' done.'
 
!$OMP END PARALLEL
 
END
/libgomp.fortran/allocatable6.f90
0,0 → 1,45
! PR fortran/46874
! { dg-do run }
 
interface
subroutine sub (a, b, c, d, n)
integer :: n
integer, allocatable :: a(:), b(:), c(:), d(:)
end subroutine
end interface
 
integer, allocatable :: a(:), b(:), c(:), d(:)
integer :: i, j
allocate (a(50), b(50), c(50), d(50))
do i = 1, 50
a(i) = 2 + modulo (i, 7)
b(i) = 179 - modulo (i, 11)
end do
c = 0
d = 2147483647
call sub (a, b, c, d, 50)
do i = 1, 50
j = 0
if (i .eq. 3) then
j = 8
else if (i .gt. 1 .and. i .lt. 9) then
j = 7
end if
if (c(i) .ne. j) call abort
j = 179 - modulo (i, 11)
if (i .gt. 1 .and. i .lt. 9) j = i
if (d(i) .ne. j) call abort
end do
deallocate (a, b, c, d)
end
 
subroutine sub (a, b, c, d, n)
integer :: n
integer, allocatable :: a(:), b(:), c(:), d(:)
!$omp parallel do shared(a, b) reduction(+:c) reduction(min:d)
do i = 1, n
c(a(i)) = c(a(i)) + 1
d(i) = min(d(i), b(i))
d(a(i)) = min(d(a(i)), a(i))
end do
end
/libgomp.fortran/allocatable7.f90
0,0 → 1,16
! { dg-do run }
 
integer, allocatable :: a(:)
logical :: l
l = .false.
!$omp parallel firstprivate (a) reduction (.or.:l)
l = allocated (a)
allocate (a(10))
l = l .or. .not. allocated (a)
a = 10
if (any (a .ne. 10)) l = .true.
deallocate (a)
l = l .or. allocated (a)
!$omp end parallel
if (l) call abort
end
/libgomp.fortran/pr46753.f90
0,0 → 1,17
! PR fortran/46753
! { dg-do run }
 
integer :: i, j
j = 0
!$omp parallel do reduction(+:j)
do i = 2147483636, 2147483646
j = j + 1
end do
if (j.ne.11) call abort
j = 0
!$omp parallel do reduction(+:j)
do i = -2147483637, -2147483647, -1
j = j + 1
end do
if (j.ne.11) call abort
end
/libgomp.fortran/recursion1.f90
0,0 → 1,28
! { dg-do run }
! { dg-options "-fopenmp -fcheck=recursion" }
!
! PR 42517: Bogus runtime error with -fopenmp -fcheck=recursion
!
! Contributed by Janus Weil <janus@gcc.gnu.org>
 
implicit none
integer :: i,s
 
s=0
!$omp parallel do private(i) shared(s)
do i=1,10
call sub(i)
end do
!$omp end parallel do
if (s/=55) call abort()
 
contains
 
subroutine sub (n)
integer :: n
!$omp atomic
s = s + n
print '(A,i3)',"loop =",n
end subroutine
 
end
/libgomp.fortran/allocatable8.f90
0,0 → 1,14
! { dg-do run }
! { dg-require-effective-target tls_runtime }
!$ use omp_lib
 
integer, save, allocatable :: a(:, :)
logical :: l
!$omp threadprivate (a)
if (allocated (a)) call abort
l = .false.
!$omp parallel copyin (a) num_threads (4) reduction(.or.:l)
l = l.or.allocated (a)
!$omp end parallel
if (l.or.allocated (a)) call abort
end
/libgomp.fortran/pr29629.f90
0,0 → 1,20
! PR fortran/29629
! { dg-do run }
 
program pr29629
integer :: n
n = 10000
if (any (func(n).ne.10000)) call abort
contains
function func(n)
integer, intent(in) :: n
integer, dimension(n) :: func
integer :: k
func = 0
!$omp parallel do private(k), reduction(+:func), num_threads(4)
do k = 1, n
func = func + 1
end do
!$omp end parallel do
end function
end program
/libgomp.fortran/omp_reduction.f
0,0 → 1,33
C******************************************************************************
C FILE: omp_reduction.f
C DESCRIPTION:
C OpenMP Example - Combined Parallel Loop Reduction - Fortran Version
C This example demonstrates a sum reduction within a combined parallel loop
C construct. Notice that default data element scoping is assumed - there
C are no clauses specifying shared or private variables. OpenMP will
C automatically make loop index variables private within team threads, and
C global variables shared.
C AUTHOR: Blaise Barney 5/99
C LAST REVISED:
C******************************************************************************
 
PROGRAM REDUCTION
 
INTEGER I, N
REAL A(100), B(100), SUM
 
! Some initializations
N = 100
DO I = 1, N
A(I) = I *1.0
B(I) = A(I)
ENDDO
SUM = 0.0
 
!$OMP PARALLEL DO REDUCTION(+:SUM)
DO I = 1, N
SUM = SUM + (A(I) * B(I))
ENDDO
 
PRINT *, ' Sum = ', SUM
END
/libgomp.fortran/strassen.f90
0,0 → 1,75
! { dg-options "-O2" }
 
program strassen_matmul
use omp_lib
integer, parameter :: N = 1024
double precision, save :: A(N,N), B(N,N), C(N,N), D(N,N)
double precision :: start, end
 
call random_seed
call random_number (A)
call random_number (B)
start = omp_get_wtime ()
C = matmul (A, B)
end = omp_get_wtime ()
write(*,'(a, f10.6)') ' Time for matmul = ', end - start
D = 0
start = omp_get_wtime ()
call strassen (A, B, D, N)
end = omp_get_wtime ()
write(*,'(a, f10.6)') ' Time for Strassen = ', end - start
if (sqrt (sum ((C - D) ** 2)) / N .gt. 0.1) call abort
D = 0
start = omp_get_wtime ()
!$omp parallel
!$omp single
call strassen (A, B, D, N)
!$omp end single nowait
!$omp end parallel
end = omp_get_wtime ()
write(*,'(a, f10.6)') ' Time for Strassen MP = ', end - start
if (sqrt (sum ((C - D) ** 2)) / N .gt. 0.1) call abort
 
contains
 
recursive subroutine strassen (A, B, C, N)
integer, intent(in) :: N
double precision, intent(in) :: A(N,N), B(N,N)
double precision, intent(out) :: C(N,N)
double precision :: T(N/2,N/2,7)
integer :: K, L
 
if (iand (N,1) .ne. 0 .or. N < 64) then
C = matmul (A, B)
return
end if
K = N / 2
L = N / 2 + 1
!$omp task shared (A, B, T)
call strassen (A(:K,:K) + A(L:,L:), B(:K,:K) + B(L:,L:), T(:,:,1), K)
!$omp end task
!$omp task shared (A, B, T)
call strassen (A(L:,:K) + A(L:,L:), B(:K,:K), T(:,:,2), K)
!$omp end task
!$omp task shared (A, B, T)
call strassen (A(:K,:K), B(:K,L:) - B(L:,L:), T(:,:,3), K)
!$omp end task
!$omp task shared (A, B, T)
call strassen (A(L:,L:), B(L:,:K) - B(:K,:K), T(:,:,4), K)
!$omp end task
!$omp task shared (A, B, T)
call strassen (A(:K,:K) + A(:K,L:), B(L:,L:), T(:,:,5), K)
!$omp end task
!$omp task shared (A, B, T)
call strassen (A(L:,:K) - A(:K,:K), B(:K,:K) + B(:K,L:), T(:,:,6), K)
!$omp end task
!$omp task shared (A, B, T)
call strassen (A(:K,L:) - A(L:,L:), B(L:,:K) + B(L:,L:), T(:,:,7), K)
!$omp end task
!$omp taskwait
C(:K,:K) = T(:,:,1) + T(:,:,4) - T(:,:,5) + T(:,:,7)
C(L:,:K) = T(:,:,2) + T(:,:,4)
C(:K,L:) = T(:,:,3) + T(:,:,5)
C(L:,L:) = T(:,:,1) - T(:,:,2) + T(:,:,3) + T(:,:,6)
end subroutine strassen
end
/libgomp.fortran/pr48894.f90
0,0 → 1,23
! PR fortran/48894
! { dg-do run }
! { dg-options "-fdefault-integer-8" }
 
use omp_lib
integer, parameter :: zero = 0
integer :: err
logical :: l
err = 0
!$omp parallel
!$omp parallel private (l)
l = omp_get_ancestor_thread_num (-HUGE (zero)) .ne. -1
l = l .or. (omp_get_ancestor_thread_num (HUGE (zero)) .ne. -1)
l = l .or. (omp_get_team_size (-HUGE (zero)) .ne. -1)
l = l .or. (omp_get_team_size (HUGE (zero)) .ne. -1)
if (l) then
!$omp atomic
err = err + 1
endif
!$omp end parallel
!$omp end parallel
if (err .ne. 0) call abort
end
/libgomp.fortran/vla1.f90
0,0 → 1,185
! { dg-do run }
 
call test
contains
subroutine check (x, y, l)
integer :: x, y
logical :: l
l = l .or. x .ne. y
end subroutine check
 
subroutine foo (c, d, e, f, g, h, i, j, k, n)
use omp_lib
integer :: n
character (len = *) :: c
character (len = n) :: d
integer, dimension (2, 3:5, n) :: e
integer, dimension (2, 3:n, n) :: f
character (len = *), dimension (5, 3:n) :: g
character (len = n), dimension (5, 3:n) :: h
real, dimension (:, :, :) :: i
double precision, dimension (3:, 5:, 7:) :: j
integer, dimension (:, :, :) :: k
logical :: l
integer :: p, q, r
character (len = n) :: s
integer, dimension (2, 3:5, n) :: t
integer, dimension (2, 3:n, n) :: u
character (len = n), dimension (5, 3:n) :: v
character (len = 2 * n + 24) :: w
integer :: x
character (len = 1) :: y
s = 'PQRSTUV'
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = '_+|/Oo_'
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = '///|||!'
l = .false.
!$omp parallel default (none) firstprivate (c, d, e, f, g, h, i, j, k) &
!$omp & firstprivate (s, t, u, v) reduction (.or.:l) num_threads (6) &
!$omp private (p, q, r, w, x, y)
l = l .or. c .ne. 'abcdefghijkl'
l = l .or. d .ne. 'ABCDEFG'
l = l .or. s .ne. 'PQRSTUV'
do 100, p = 1, 2
do 100, q = 3, 7
do 100, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. '0123456789AB'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. '9876543210ZY'
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. '0123456'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. '9876543'
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. '_+|/Oo_'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. '///|||!'
100 continue
do 101, p = 3, 5
do 101, q = 2, 6
do 101, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. 7.5 * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. 9.5 * p * q * r
101 continue
do 102, p = 1, 5
do 102, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + p + 7 + 3 * q
102 continue
x = omp_get_thread_num ()
w = ''
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
c = w(8:19)
d = w(1:7)
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
s = w(20:26)
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
!$omp barrier
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 103, p = 1, 2
do 103, q = 3, 7
do 103, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
103 continue
do 104, p = 3, 5
do 104, q = 2, 6
do 104, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
104 continue
do 105, p = 1, 5
do 105, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
105 continue
call check (size (e, 1), 2, l)
call check (size (e, 2), 3, l)
call check (size (e, 3), 7, l)
call check (size (e), 42, l)
call check (size (f, 1), 2, l)
call check (size (f, 2), 5, l)
call check (size (f, 3), 7, l)
call check (size (f), 70, l)
call check (size (g, 1), 5, l)
call check (size (g, 2), 5, l)
call check (size (g), 25, l)
call check (size (h, 1), 5, l)
call check (size (h, 2), 5, l)
call check (size (h), 25, l)
call check (size (i, 1), 3, l)
call check (size (i, 2), 5, l)
call check (size (i, 3), 7, l)
call check (size (i), 105, l)
call check (size (j, 1), 4, l)
call check (size (j, 2), 5, l)
call check (size (j, 3), 7, l)
call check (size (j), 140, l)
call check (size (k, 1), 5, l)
call check (size (k, 2), 1, l)
call check (size (k, 3), 3, l)
call check (size (k), 15, l)
!$omp end parallel
if (l) call abort
end subroutine foo
 
subroutine test
character (len = 12) :: c
character (len = 7) :: d
integer, dimension (2, 3:5, 7) :: e
integer, dimension (2, 3:7, 7) :: f
character (len = 12), dimension (5, 3:7) :: g
character (len = 7), dimension (5, 3:7) :: h
real, dimension (3:5, 2:6, 1:7) :: i
double precision, dimension (3:6, 2:6, 1:7) :: j
integer, dimension (1:5, 7:7, 4:6) :: k
integer :: p, q, r
c = 'abcdefghijkl'
d = 'ABCDEFG'
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = '0123456789AB'
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = '9876543210ZY'
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = '0123456'
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = '9876543'
forall (p = 3:5, q = 2:6, r = 1:7) i(p, q, r) = 7.5 * p * q * r
forall (p = 3:6, q = 2:6, r = 1:7) j(p, q, r) = 9.5 * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q, r) = 19 + p + q + 3 * r
call foo (c, d, e, f, g, h, i, j, k, 7)
end subroutine test
end
/libgomp.fortran/vla2.f90
0,0 → 1,142
! { dg-do run }
 
call test
contains
subroutine check (x, y, l)
integer :: x, y
logical :: l
l = l .or. x .ne. y
end subroutine check
 
subroutine foo (c, d, e, f, g, h, i, j, k, n)
use omp_lib
integer :: n
character (len = *) :: c
character (len = n) :: d
integer, dimension (2, 3:5, n) :: e
integer, dimension (2, 3:n, n) :: f
character (len = *), dimension (5, 3:n) :: g
character (len = n), dimension (5, 3:n) :: h
real, dimension (:, :, :) :: i
double precision, dimension (3:, 5:, 7:) :: j
integer, dimension (:, :, :) :: k
logical :: l
integer :: p, q, r
character (len = n) :: s
integer, dimension (2, 3:5, n) :: t
integer, dimension (2, 3:n, n) :: u
character (len = n), dimension (5, 3:n) :: v
character (len = 2 * n + 24) :: w
integer :: x
character (len = 1) :: y
l = .false.
!$omp parallel default (none) private (c, d, e, f, g, h, i, j, k) &
!$omp & private (s, t, u, v) reduction (.or.:l) num_threads (6) &
!$omp private (p, q, r, w, x, y)
x = omp_get_thread_num ()
w = ''
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
c = w(8:19)
d = w(1:7)
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
s = w(20:26)
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
!$omp barrier
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 103, p = 1, 2
do 103, q = 3, 7
do 103, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
103 continue
do 104, p = 3, 5
do 104, q = 2, 6
do 104, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
104 continue
do 105, p = 1, 5
do 105, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
105 continue
call check (size (e, 1), 2, l)
call check (size (e, 2), 3, l)
call check (size (e, 3), 7, l)
call check (size (e), 42, l)
call check (size (f, 1), 2, l)
call check (size (f, 2), 5, l)
call check (size (f, 3), 7, l)
call check (size (f), 70, l)
call check (size (g, 1), 5, l)
call check (size (g, 2), 5, l)
call check (size (g), 25, l)
call check (size (h, 1), 5, l)
call check (size (h, 2), 5, l)
call check (size (h), 25, l)
call check (size (i, 1), 3, l)
call check (size (i, 2), 5, l)
call check (size (i, 3), 7, l)
call check (size (i), 105, l)
call check (size (j, 1), 4, l)
call check (size (j, 2), 5, l)
call check (size (j, 3), 7, l)
call check (size (j), 140, l)
call check (size (k, 1), 5, l)
call check (size (k, 2), 1, l)
call check (size (k, 3), 3, l)
call check (size (k), 15, l)
!$omp end parallel
if (l) call abort
end subroutine foo
 
subroutine test
character (len = 12) :: c
character (len = 7) :: d
integer, dimension (2, 3:5, 7) :: e
integer, dimension (2, 3:7, 7) :: f
character (len = 12), dimension (5, 3:7) :: g
character (len = 7), dimension (5, 3:7) :: h
real, dimension (3:5, 2:6, 1:7) :: i
double precision, dimension (3:6, 2:6, 1:7) :: j
integer, dimension (1:5, 7:7, 4:6) :: k
integer :: p, q, r
call foo (c, d, e, f, g, h, i, j, k, 7)
end subroutine test
end
/libgomp.fortran/vla3.f90
0,0 → 1,191
! { dg-do run }
 
call test
contains
subroutine check (x, y, l)
integer :: x, y
logical :: l
l = l .or. x .ne. y
end subroutine check
 
subroutine foo (c, d, e, f, g, h, i, j, k, n)
use omp_lib
integer :: n
character (len = *) :: c
character (len = n) :: d
integer, dimension (2, 3:5, n) :: e
integer, dimension (2, 3:n, n) :: f
character (len = *), dimension (5, 3:n) :: g
character (len = n), dimension (5, 3:n) :: h
real, dimension (:, :, :) :: i
double precision, dimension (3:, 5:, 7:) :: j
integer, dimension (:, :, :) :: k
logical :: l
integer :: p, q, r
character (len = n) :: s
integer, dimension (2, 3:5, n) :: t
integer, dimension (2, 3:n, n) :: u
character (len = n), dimension (5, 3:n) :: v
character (len = 2 * n + 24) :: w
integer :: x, z
character (len = 1) :: y
s = 'PQRSTUV'
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = '_+|/Oo_'
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = '///|||!'
l = .false.
!$omp parallel default (none) shared (c, d, e, f, g, h, i, j, k) &
!$omp & shared (s, t, u, v) reduction (.or.:l) num_threads (6) &
!$omp private (p, q, r, w, x, y)
l = l .or. c .ne. 'abcdefghijkl'
l = l .or. d .ne. 'ABCDEFG'
l = l .or. s .ne. 'PQRSTUV'
do 100, p = 1, 2
do 100, q = 3, 7
do 100, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. '0123456789AB'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. '9876543210ZY'
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. '0123456'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. '9876543'
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. '_+|/Oo_'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. '///|||!'
100 continue
do 101, p = 3, 5
do 101, q = 2, 6
do 101, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. 7.5 * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. 9.5 * p * q * r
101 continue
do 102, p = 1, 5
do 102, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + p + 7 + 3 * q
102 continue
do 110 z = 0, omp_get_num_threads () - 1
!$omp barrier
x = omp_get_thread_num ()
w = ''
if (z .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (z .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (z .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (z .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (z .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (z .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
if (x .eq. z) then
c = w(8:19)
d = w(1:7)
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
s = w(20:26)
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
end if
!$omp barrier
x = z
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 103, p = 1, 2
do 103, q = 3, 7
do 103, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
103 continue
do 104, p = 3, 5
do 104, q = 2, 6
do 104, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
104 continue
do 105, p = 1, 5
do 105, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
105 continue
110 continue
call check (size (e, 1), 2, l)
call check (size (e, 2), 3, l)
call check (size (e, 3), 7, l)
call check (size (e), 42, l)
call check (size (f, 1), 2, l)
call check (size (f, 2), 5, l)
call check (size (f, 3), 7, l)
call check (size (f), 70, l)
call check (size (g, 1), 5, l)
call check (size (g, 2), 5, l)
call check (size (g), 25, l)
call check (size (h, 1), 5, l)
call check (size (h, 2), 5, l)
call check (size (h), 25, l)
call check (size (i, 1), 3, l)
call check (size (i, 2), 5, l)
call check (size (i, 3), 7, l)
call check (size (i), 105, l)
call check (size (j, 1), 4, l)
call check (size (j, 2), 5, l)
call check (size (j, 3), 7, l)
call check (size (j), 140, l)
call check (size (k, 1), 5, l)
call check (size (k, 2), 1, l)
call check (size (k, 3), 3, l)
call check (size (k), 15, l)
!$omp end parallel
if (l) call abort
end subroutine foo
 
subroutine test
character (len = 12) :: c
character (len = 7) :: d
integer, dimension (2, 3:5, 7) :: e
integer, dimension (2, 3:7, 7) :: f
character (len = 12), dimension (5, 3:7) :: g
character (len = 7), dimension (5, 3:7) :: h
real, dimension (3:5, 2:6, 1:7) :: i
double precision, dimension (3:6, 2:6, 1:7) :: j
integer, dimension (1:5, 7:7, 4:6) :: k
integer :: p, q, r
c = 'abcdefghijkl'
d = 'ABCDEFG'
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = '0123456789AB'
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = '9876543210ZY'
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = '0123456'
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = '9876543'
forall (p = 3:5, q = 2:6, r = 1:7) i(p, q, r) = 7.5 * p * q * r
forall (p = 3:6, q = 2:6, r = 1:7) j(p, q, r) = 9.5 * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q, r) = 19 + p + q + 3 * r
call foo (c, d, e, f, g, h, i, j, k, 7)
end subroutine test
end
/libgomp.fortran/vla4.f90
0,0 → 1,228
! { dg-do run }
 
call test
contains
subroutine check (x, y, l)
integer :: x, y
logical :: l
l = l .or. x .ne. y
end subroutine check
 
subroutine foo (c, d, e, f, g, h, i, j, k, n)
use omp_lib
integer :: n
character (len = *) :: c
character (len = n) :: d
integer, dimension (2, 3:5, n) :: e
integer, dimension (2, 3:n, n) :: f
character (len = *), dimension (5, 3:n) :: g
character (len = n), dimension (5, 3:n) :: h
real, dimension (:, :, :) :: i
double precision, dimension (3:, 5:, 7:) :: j
integer, dimension (:, :, :) :: k
logical :: l
integer :: p, q, r
character (len = n) :: s
integer, dimension (2, 3:5, n) :: t
integer, dimension (2, 3:n, n) :: u
character (len = n), dimension (5, 3:n) :: v
character (len = 2 * n + 24) :: w
integer :: x, z, z2
character (len = 1) :: y
s = 'PQRSTUV'
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = '_+|/Oo_'
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = '///|||!'
l = .false.
call omp_set_dynamic (.false.)
call omp_set_num_threads (6)
!$omp parallel do default (none) firstprivate (c, d, e, f, g, h, i, j, k) &
!$omp & firstprivate (s, t, u, v) reduction (.or.:l) num_threads (6) &
!$omp private (p, q, r, w, x, y) schedule (static) shared (z2) &
!$omp lastprivate (c, d, e, f, g, h, i, j, k, s, t, u, v)
do 110 z = 0, omp_get_num_threads () - 1
if (omp_get_thread_num () .eq. 0) z2 = omp_get_num_threads ()
l = l .or. c .ne. 'abcdefghijkl'
l = l .or. d .ne. 'ABCDEFG'
l = l .or. s .ne. 'PQRSTUV'
do 100, p = 1, 2
do 100, q = 3, 7
do 100, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. '0123456789AB'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. '9876543210ZY'
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. '0123456'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. '9876543'
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. '_+|/Oo_'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. '///|||!'
100 continue
do 101, p = 3, 5
do 101, q = 2, 6
do 101, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. 7.5 * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. 9.5 * p * q * r
101 continue
do 102, p = 1, 5
do 102, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + p + 7 + 3 * q
102 continue
x = omp_get_thread_num ()
w = ''
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
c = w(8:19)
d = w(1:7)
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
s = w(20:26)
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
!$omp barrier ! { dg-warning "may not be closely nested" }
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 103, p = 1, 2
do 103, q = 3, 7
do 103, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
103 continue
do 104, p = 3, 5
do 104, q = 2, 6
do 104, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
104 continue
do 105, p = 1, 5
do 105, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
105 continue
call check (size (e, 1), 2, l)
call check (size (e, 2), 3, l)
call check (size (e, 3), 7, l)
call check (size (e), 42, l)
call check (size (f, 1), 2, l)
call check (size (f, 2), 5, l)
call check (size (f, 3), 7, l)
call check (size (f), 70, l)
call check (size (g, 1), 5, l)
call check (size (g, 2), 5, l)
call check (size (g), 25, l)
call check (size (h, 1), 5, l)
call check (size (h, 2), 5, l)
call check (size (h), 25, l)
call check (size (i, 1), 3, l)
call check (size (i, 2), 5, l)
call check (size (i, 3), 7, l)
call check (size (i), 105, l)
call check (size (j, 1), 4, l)
call check (size (j, 2), 5, l)
call check (size (j, 3), 7, l)
call check (size (j), 140, l)
call check (size (k, 1), 5, l)
call check (size (k, 2), 1, l)
call check (size (k, 3), 3, l)
call check (size (k), 15, l)
110 continue
!$omp end parallel do
if (l) call abort
if (z2 == 6) then
x = 5
w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 113, p = 1, 2
do 113, q = 3, 7
do 113, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
113 continue
do 114, p = 3, 5
do 114, q = 2, 6
do 114, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
114 continue
do 115, p = 1, 5
do 115, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
115 continue
if (l) call abort
end if
end subroutine foo
 
subroutine test
character (len = 12) :: c
character (len = 7) :: d
integer, dimension (2, 3:5, 7) :: e
integer, dimension (2, 3:7, 7) :: f
character (len = 12), dimension (5, 3:7) :: g
character (len = 7), dimension (5, 3:7) :: h
real, dimension (3:5, 2:6, 1:7) :: i
double precision, dimension (3:6, 2:6, 1:7) :: j
integer, dimension (1:5, 7:7, 4:6) :: k
integer :: p, q, r
c = 'abcdefghijkl'
d = 'ABCDEFG'
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = '0123456789AB'
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = '9876543210ZY'
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = '0123456'
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = '9876543'
forall (p = 3:5, q = 2:6, r = 1:7) i(p, q, r) = 7.5 * p * q * r
forall (p = 3:6, q = 2:6, r = 1:7) j(p, q, r) = 9.5 * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q, r) = 19 + p + q + 3 * r
call foo (c, d, e, f, g, h, i, j, k, 7)
end subroutine test
end
/libgomp.fortran/omp_cond1.f
0,0 → 1,22
C Test conditional compilation in fixed form if -fopenmp
! { dg-options "-fopenmp" }
10 foo = 2
&56
if (foo.ne.256) call abort
bar = 26
!$2 0 ba
c$ +r = 42
!$ bar = 62
!$ bar = bar + 1
if (bar.ne.43) call abort
baz = bar
*$ 0baz = 5
C$ +12! Comment
c$ !4
!$ +!Another comment
*$ &2
!$ X baz = 0 ! Not valid OpenMP conditional compilation lines
! $ baz = 1
c$ 10&baz = 2
if (baz.ne.51242) call abort
end
/libgomp.fortran/vla5.f90
0,0 → 1,200
! { dg-do run }
 
call test
contains
subroutine check (x, y, l)
integer :: x, y
logical :: l
l = l .or. x .ne. y
end subroutine check
 
subroutine foo (c, d, e, f, g, h, i, j, k, n)
use omp_lib
integer :: n
character (len = *) :: c
character (len = n) :: d
integer, dimension (2, 3:5, n) :: e
integer, dimension (2, 3:n, n) :: f
character (len = *), dimension (5, 3:n) :: g
character (len = n), dimension (5, 3:n) :: h
real, dimension (:, :, :) :: i
double precision, dimension (3:, 5:, 7:) :: j
integer, dimension (:, :, :) :: k
logical :: l
integer :: p, q, r
character (len = n) :: s
integer, dimension (2, 3:5, n) :: t
integer, dimension (2, 3:n, n) :: u
character (len = n), dimension (5, 3:n) :: v
character (len = 2 * n + 24) :: w
integer :: x, z, z2
character (len = 1) :: y
s = 'PQRSTUV'
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = '_+|/Oo_'
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = '///|||!'
l = .false.
call omp_set_dynamic (.false.)
call omp_set_num_threads (6)
!$omp parallel do default (none) lastprivate (c, d, e, f, g, h, i, j, k) &
!$omp & lastprivate (s, t, u, v) reduction (.or.:l) num_threads (6) &
!$omp private (p, q, r, w, x, y) schedule (static) shared (z2)
do 110 z = 0, omp_get_num_threads () - 1
if (omp_get_thread_num () .eq. 0) z2 = omp_get_num_threads ()
x = omp_get_thread_num ()
w = ''
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
c = w(8:19)
d = w(1:7)
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
s = w(20:26)
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
!$omp barrier ! { dg-warning "may not be closely nested" }
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 103, p = 1, 2
do 103, q = 3, 7
do 103, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
103 continue
do 104, p = 3, 5
do 104, q = 2, 6
do 104, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
104 continue
do 105, p = 1, 5
do 105, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
105 continue
call check (size (e, 1), 2, l)
call check (size (e, 2), 3, l)
call check (size (e, 3), 7, l)
call check (size (e), 42, l)
call check (size (f, 1), 2, l)
call check (size (f, 2), 5, l)
call check (size (f, 3), 7, l)
call check (size (f), 70, l)
call check (size (g, 1), 5, l)
call check (size (g, 2), 5, l)
call check (size (g), 25, l)
call check (size (h, 1), 5, l)
call check (size (h, 2), 5, l)
call check (size (h), 25, l)
call check (size (i, 1), 3, l)
call check (size (i, 2), 5, l)
call check (size (i, 3), 7, l)
call check (size (i), 105, l)
call check (size (j, 1), 4, l)
call check (size (j, 2), 5, l)
call check (size (j, 3), 7, l)
call check (size (j), 140, l)
call check (size (k, 1), 5, l)
call check (size (k, 2), 1, l)
call check (size (k, 3), 3, l)
call check (size (k), 15, l)
110 continue
!$omp end parallel do
if (l) call abort
if (z2 == 6) then
x = 5
w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 113, p = 1, 2
do 113, q = 3, 7
do 113, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
113 continue
do 114, p = 3, 5
do 114, q = 2, 6
do 114, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
114 continue
do 115, p = 1, 5
do 115, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
115 continue
if (l) call abort
end if
end subroutine foo
 
subroutine test
character (len = 12) :: c
character (len = 7) :: d
integer, dimension (2, 3:5, 7) :: e
integer, dimension (2, 3:7, 7) :: f
character (len = 12), dimension (5, 3:7) :: g
character (len = 7), dimension (5, 3:7) :: h
real, dimension (3:5, 2:6, 1:7) :: i
double precision, dimension (3:6, 2:6, 1:7) :: j
integer, dimension (1:5, 7:7, 4:6) :: k
integer :: p, q, r
c = 'abcdefghijkl'
d = 'ABCDEFG'
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = '0123456789AB'
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = '9876543210ZY'
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = '0123456'
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = '9876543'
forall (p = 3:5, q = 2:6, r = 1:7) i(p, q, r) = 7.5 * p * q * r
forall (p = 3:6, q = 2:6, r = 1:7) j(p, q, r) = 9.5 * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q, r) = 19 + p + q + 3 * r
call foo (c, d, e, f, g, h, i, j, k, 7)
end subroutine test
end
/libgomp.fortran/vla6.f90
0,0 → 1,191
! { dg-do run }
 
call test
contains
subroutine check (x, y, l)
integer :: x, y
logical :: l
l = l .or. x .ne. y
end subroutine check
 
subroutine foo (c, d, e, f, g, h, i, j, k, n)
use omp_lib
integer :: n
character (len = *) :: c
character (len = n) :: d
integer, dimension (2, 3:5, n) :: e
integer, dimension (2, 3:n, n) :: f
character (len = *), dimension (5, 3:n) :: g
character (len = n), dimension (5, 3:n) :: h
real, dimension (:, :, :) :: i
double precision, dimension (3:, 5:, 7:) :: j
integer, dimension (:, :, :) :: k
logical :: l
integer :: p, q, r
character (len = n) :: s
integer, dimension (2, 3:5, n) :: t
integer, dimension (2, 3:n, n) :: u
character (len = n), dimension (5, 3:n) :: v
character (len = 2 * n + 24) :: w
integer :: x, z
character (len = 1) :: y
l = .false.
!$omp parallel default (none) private (c, d, e, f, g, h, i, j, k) &
!$omp & private (s, t, u, v) reduction (.or.:l) num_threads (6) &
!$omp private (p, q, r, w, x, y) shared (z)
x = omp_get_thread_num ()
w = ''
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
c = w(8:19)
d = w(1:7)
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
s = w(20:26)
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
!$omp barrier
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 103, p = 1, 2
do 103, q = 3, 7
do 103, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
103 continue
do 104, p = 3, 5
do 104, q = 2, 6
do 104, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
104 continue
do 105, p = 1, 5
do 105, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
105 continue
call check (size (e, 1), 2, l)
call check (size (e, 2), 3, l)
call check (size (e, 3), 7, l)
call check (size (e), 42, l)
call check (size (f, 1), 2, l)
call check (size (f, 2), 5, l)
call check (size (f, 3), 7, l)
call check (size (f), 70, l)
call check (size (g, 1), 5, l)
call check (size (g, 2), 5, l)
call check (size (g), 25, l)
call check (size (h, 1), 5, l)
call check (size (h, 2), 5, l)
call check (size (h), 25, l)
call check (size (i, 1), 3, l)
call check (size (i, 2), 5, l)
call check (size (i, 3), 7, l)
call check (size (i), 105, l)
call check (size (j, 1), 4, l)
call check (size (j, 2), 5, l)
call check (size (j, 3), 7, l)
call check (size (j), 140, l)
call check (size (k, 1), 5, l)
call check (size (k, 2), 1, l)
call check (size (k, 3), 3, l)
call check (size (k), 15, l)
!$omp single
z = omp_get_thread_num ()
!$omp end single copyprivate (c, d, e, f, g, h, i, j, k, s, t, u, v)
w = ''
x = z
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 113, p = 1, 2
do 113, q = 3, 7
do 113, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
113 continue
do 114, p = 3, 5
do 114, q = 2, 6
do 114, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
114 continue
do 115, p = 1, 5
do 115, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
115 continue
!$omp end parallel
if (l) call abort
end subroutine foo
 
subroutine test
character (len = 12) :: c
character (len = 7) :: d
integer, dimension (2, 3:5, 7) :: e
integer, dimension (2, 3:7, 7) :: f
character (len = 12), dimension (5, 3:7) :: g
character (len = 7), dimension (5, 3:7) :: h
real, dimension (3:5, 2:6, 1:7) :: i
double precision, dimension (3:6, 2:6, 1:7) :: j
integer, dimension (1:5, 7:7, 4:6) :: k
integer :: p, q, r
call foo (c, d, e, f, g, h, i, j, k, 7)
end subroutine test
end
/libgomp.fortran/vla7.f90
0,0 → 1,143
! { dg-do run }
! { dg-options "-w" }
 
character (6) :: c, f2
character (6) :: d(2)
c = f1 (6)
if (c .ne. 'opqrst') call abort
c = f2 (6)
if (c .ne. '_/!!/_') call abort
d = f3 (6)
if (d(1) .ne. 'opqrst' .or. d(2) .ne. 'a') call abort
d = f4 (6)
if (d(1) .ne. 'Opqrst' .or. d(2) .ne. 'A') call abort
contains
function f1 (n)
use omp_lib
character (n) :: f1
logical :: l
f1 = 'abcdef'
l = .false.
!$omp parallel firstprivate (f1) reduction (.or.:l) num_threads (2)
l = f1 .ne. 'abcdef'
if (omp_get_thread_num () .eq. 0) f1 = 'ijklmn'
if (omp_get_thread_num () .eq. 1) f1 = 'IJKLMN'
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. f1 .ne. 'ijklmn')
l = l .or. (omp_get_thread_num () .eq. 1 .and. f1 .ne. 'IJKLMN')
!$omp end parallel
f1 = 'zZzz_z'
!$omp parallel shared (f1) reduction (.or.:l) num_threads (2)
l = l .or. f1 .ne. 'zZzz_z'
!$omp barrier
!$omp master
f1 = 'abc'
!$omp end master
!$omp barrier
l = l .or. f1 .ne. 'abc'
!$omp barrier
if (omp_get_thread_num () .eq. 1) f1 = 'def'
!$omp barrier
l = l .or. f1 .ne. 'def'
!$omp end parallel
if (l) call abort
f1 = 'opqrst'
end function f1
function f3 (n)
use omp_lib
character (n), dimension (2) :: f3
logical :: l
f3 = 'abcdef'
l = .false.
!$omp parallel firstprivate (f3) reduction (.or.:l) num_threads (2)
l = any (f3 .ne. 'abcdef')
if (omp_get_thread_num () .eq. 0) f3 = 'ijklmn'
if (omp_get_thread_num () .eq. 1) f3 = 'IJKLMN'
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. any (f3 .ne. 'ijklmn'))
l = l .or. (omp_get_thread_num () .eq. 1 .and. any (f3 .ne. 'IJKLMN'))
!$omp end parallel
f3 = 'zZzz_z'
!$omp parallel shared (f3) reduction (.or.:l) num_threads (2)
l = l .or. any (f3 .ne. 'zZzz_z')
!$omp barrier
!$omp master
f3 = 'abc'
!$omp end master
!$omp barrier
l = l .or. any (f3 .ne. 'abc')
!$omp barrier
if (omp_get_thread_num () .eq. 1) f3 = 'def'
!$omp barrier
l = l .or. any (f3 .ne. 'def')
!$omp end parallel
if (l) call abort
f3(1) = 'opqrst'
f3(2) = 'a'
end function f3
function f4 (n)
use omp_lib
character (n), dimension (n - 4) :: f4
logical :: l
f4 = 'abcdef'
l = .false.
!$omp parallel firstprivate (f4) reduction (.or.:l) num_threads (2)
l = any (f4 .ne. 'abcdef')
if (omp_get_thread_num () .eq. 0) f4 = 'ijklmn'
if (omp_get_thread_num () .eq. 1) f4 = 'IJKLMN'
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. any (f4 .ne. 'ijklmn'))
l = l .or. (omp_get_thread_num () .eq. 1 .and. any (f4 .ne. 'IJKLMN'))
l = l .or. size (f4) .ne. 2
!$omp end parallel
f4 = 'zZzz_z'
!$omp parallel shared (f4) reduction (.or.:l) num_threads (2)
l = l .or. any (f4 .ne. 'zZzz_z')
!$omp barrier
!$omp master
f4 = 'abc'
!$omp end master
!$omp barrier
l = l .or. any (f4 .ne. 'abc')
!$omp barrier
if (omp_get_thread_num () .eq. 1) f4 = 'def'
!$omp barrier
l = l .or. any (f4 .ne. 'def')
l = l .or. size (f4) .ne. 2
!$omp end parallel
if (l) call abort
f4(1) = 'Opqrst'
f4(2) = 'A'
end function f4
end
function f2 (n)
use omp_lib
character (*) :: f2
logical :: l
f2 = 'abcdef'
l = .false.
!$omp parallel firstprivate (f2) reduction (.or.:l) num_threads (2)
l = f2 .ne. 'abcdef'
if (omp_get_thread_num () .eq. 0) f2 = 'ijklmn'
if (omp_get_thread_num () .eq. 1) f2 = 'IJKLMN'
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. f2 .ne. 'ijklmn')
l = l .or. (omp_get_thread_num () .eq. 1 .and. f2 .ne. 'IJKLMN')
!$omp end parallel
f2 = 'zZzz_z'
!$omp parallel shared (f2) reduction (.or.:l) num_threads (2)
l = l .or. f2 .ne. 'zZzz_z'
!$omp barrier
!$omp master
f2 = 'abc'
!$omp end master
!$omp barrier
l = l .or. f2 .ne. 'abc'
!$omp barrier
if (omp_get_thread_num () .eq. 1) f2 = 'def'
!$omp barrier
l = l .or. f2 .ne. 'def'
!$omp end parallel
if (l) call abort
f2 = '_/!!/_'
end function f2
/libgomp.fortran/vla8.f90
0,0 → 1,255
! { dg-do run }
! { dg-timeout-factor 2.0 }
 
call test
contains
subroutine check (x, y, l)
integer :: x, y
logical :: l
l = l .or. x .ne. y
end subroutine check
 
subroutine foo (c, d, e, f, g, h, i, j, k, n)
use omp_lib
integer :: n
character (len = *) :: c
character (len = n) :: d
integer, dimension (2, 3:5, n) :: e
integer, dimension (2, 3:n, n) :: f
character (len = *), dimension (5, 3:n) :: g
character (len = n), dimension (5, 3:n) :: h
real, dimension (:, :, :) :: i
double precision, dimension (3:, 5:, 7:) :: j
integer, dimension (:, :, :) :: k
logical :: l
integer :: p, q, r
character (len = n) :: s
integer, dimension (2, 3:5, n) :: t
integer, dimension (2, 3:n, n) :: u
character (len = n), dimension (5, 3:n) :: v
character (len = 2 * n + 24) :: w
integer :: x, z
character (len = 1) :: y
l = .false.
!$omp parallel default (none) private (c, d, e, f, g, h, i, j, k) &
!$omp & private (s, t, u, v) reduction (.or.:l) num_threads (6) &
!$omp private (p, q, r, w, x, y) shared (z)
x = omp_get_thread_num ()
w = ''
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
c = w(8:19)
d = w(1:7)
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
s = w(20:26)
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
!$omp barrier
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 103, p = 1, 2
do 103, q = 3, 7
do 103, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
103 continue
do 104, p = 3, 5
do 104, q = 2, 6
do 104, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
104 continue
do 105, p = 1, 5
do 105, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
105 continue
call check (size (e, 1), 2, l)
call check (size (e, 2), 3, l)
call check (size (e, 3), 7, l)
call check (size (e), 42, l)
call check (size (f, 1), 2, l)
call check (size (f, 2), 5, l)
call check (size (f, 3), 7, l)
call check (size (f), 70, l)
call check (size (g, 1), 5, l)
call check (size (g, 2), 5, l)
call check (size (g), 25, l)
call check (size (h, 1), 5, l)
call check (size (h, 2), 5, l)
call check (size (h), 25, l)
call check (size (i, 1), 3, l)
call check (size (i, 2), 5, l)
call check (size (i, 3), 7, l)
call check (size (i), 105, l)
call check (size (j, 1), 4, l)
call check (size (j, 2), 5, l)
call check (size (j, 3), 7, l)
call check (size (j), 140, l)
call check (size (k, 1), 5, l)
call check (size (k, 2), 1, l)
call check (size (k, 3), 3, l)
call check (size (k), 15, l)
!$omp single
z = omp_get_thread_num ()
!$omp end single copyprivate (c, d, e, f, g, h, i, j, k, s, t, u, v)
w = ''
x = z
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 113, p = 1, 2
do 113, q = 3, 7
do 113, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
113 continue
do 114, p = 3, 5
do 114, q = 2, 6
do 114, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
114 continue
do 115, p = 1, 5
do 115, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
115 continue
x = omp_get_thread_num ()
w = ''
if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
c = w(8:19)
d = w(1:7)
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
s = w(20:26)
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
!$omp barrier
y = ''
if (x .eq. 0) y = '0'
if (x .eq. 1) y = '1'
if (x .eq. 2) y = '2'
if (x .eq. 3) y = '3'
if (x .eq. 4) y = '4'
if (x .eq. 5) y = '5'
l = l .or. w(7:7) .ne. y
l = l .or. w(19:19) .ne. y
l = l .or. w(26:26) .ne. y
l = l .or. w(38:38) .ne. y
l = l .or. c .ne. w(8:19)
l = l .or. d .ne. w(1:7)
l = l .or. s .ne. w(20:26)
do 123, p = 1, 2
do 123, q = 3, 7
do 123, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
123 continue
do 124, p = 3, 5
do 124, q = 2, 6
do 124, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
124 continue
do 125, p = 1, 5
do 125, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
125 continue
!$omp end parallel
if (l) call abort
end subroutine foo
 
subroutine test
character (len = 12) :: c
character (len = 7) :: d
integer, dimension (2, 3:5, 7) :: e
integer, dimension (2, 3:7, 7) :: f
character (len = 12), dimension (5, 3:7) :: g
character (len = 7), dimension (5, 3:7) :: h
real, dimension (3:5, 2:6, 1:7) :: i
double precision, dimension (3:6, 2:6, 1:7) :: j
integer, dimension (1:5, 7:7, 4:6) :: k
integer :: p, q, r
call foo (c, d, e, f, g, h, i, j, k, 7)
end subroutine test
end
/libgomp.fortran/pr34020.f90
0,0 → 1,19
! PR fortran/34020
! { dg-do run }
 
subroutine atomic_add(lhs, rhs)
real lhs, rhs
!$omp atomic
lhs = rhs + lhs
end
 
real lhs, rhs
integer i
lhs = 0
rhs = 1
!$omp parallel do num_threads(8) shared(lhs, rhs)
do i = 1, 300000
call atomic_add(lhs, rhs)
enddo
if (lhs .ne. 300000) call abort
end
/libgomp.fortran/retval1.f90
0,0 → 1,120
! { dg-do run }
 
function f1 ()
use omp_lib
real :: f1
logical :: l
f1 = 6.5
l = .false.
!$omp parallel firstprivate (f1) num_threads (2) reduction (.or.:l)
l = f1 .ne. 6.5
if (omp_get_thread_num () .eq. 0) f1 = 8.5
if (omp_get_thread_num () .eq. 1) f1 = 14.5
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. f1 .ne. 8.5)
l = l .or. (omp_get_thread_num () .eq. 1 .and. f1 .ne. 14.5)
!$omp end parallel
if (l) call abort
f1 = -2.5
end function f1
function f2 ()
use omp_lib
real :: f2, e2
logical :: l
entry e2 ()
f2 = 6.5
l = .false.
!$omp parallel firstprivate (e2) num_threads (2) reduction (.or.:l)
l = e2 .ne. 6.5
if (omp_get_thread_num () .eq. 0) e2 = 8.5
if (omp_get_thread_num () .eq. 1) e2 = 14.5
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. e2 .ne. 8.5)
l = l .or. (omp_get_thread_num () .eq. 1 .and. e2 .ne. 14.5)
!$omp end parallel
if (l) call abort
e2 = 7.5
end function f2
function f3 ()
use omp_lib
real :: f3, e3
logical :: l
entry e3 ()
f3 = 6.5
l = .false.
!$omp parallel firstprivate (f3, e3) num_threads (2) reduction (.or.:l)
l = e3 .ne. 6.5
l = l .or. f3 .ne. 6.5
if (omp_get_thread_num () .eq. 0) e3 = 8.5
if (omp_get_thread_num () .eq. 1) e3 = 14.5
f3 = e3 - 4.5
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. e3 .ne. 8.5)
l = l .or. (omp_get_thread_num () .eq. 1 .and. e3 .ne. 14.5)
l = l .or. f3 .ne. e3 - 4.5
!$omp end parallel
if (l) call abort
e3 = 0.5
end function f3
function f4 () result (r4)
use omp_lib
real :: r4, s4
logical :: l
entry e4 () result (s4)
r4 = 6.5
l = .false.
!$omp parallel firstprivate (r4, s4) num_threads (2) reduction (.or.:l)
l = s4 .ne. 6.5
l = l .or. r4 .ne. 6.5
if (omp_get_thread_num () .eq. 0) s4 = 8.5
if (omp_get_thread_num () .eq. 1) s4 = 14.5
r4 = s4 - 4.5
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. s4 .ne. 8.5)
l = l .or. (omp_get_thread_num () .eq. 1 .and. s4 .ne. 14.5)
l = l .or. r4 .ne. s4 - 4.5
!$omp end parallel
if (l) call abort
s4 = -0.5
end function f4
function f5 (is_f5)
use omp_lib
real :: f5
integer :: e5
logical :: l, is_f5
entry e5 (is_f5)
if (is_f5) then
f5 = 6.5
else
e5 = 8
end if
l = .false.
!$omp parallel firstprivate (f5, e5) shared (is_f5) num_threads (2) &
!$omp reduction (.or.:l)
l = .not. is_f5 .and. e5 .ne. 8
l = l .or. (is_f5 .and. f5 .ne. 6.5)
if (omp_get_thread_num () .eq. 0) e5 = 8
if (omp_get_thread_num () .eq. 1) e5 = 14
f5 = e5 - 4.5
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. e5 .ne. 8)
l = l .or. (omp_get_thread_num () .eq. 1 .and. e5 .ne. 14)
l = l .or. f5 .ne. e5 - 4.5
!$omp end parallel
if (l) call abort
if (is_f5) f5 = -2.5
if (.not. is_f5) e5 = 8
end function f5
 
real :: f1, f2, e2, f3, e3, f4, e4, f5
integer :: e5
if (f1 () .ne. -2.5) call abort
if (f2 () .ne. 7.5) call abort
if (e2 () .ne. 7.5) call abort
if (f3 () .ne. 0.5) call abort
if (e3 () .ne. 0.5) call abort
if (f4 () .ne. -0.5) call abort
if (e4 () .ne. -0.5) call abort
if (f5 (.true.) .ne. -2.5) call abort
if (e5 (.false.) .ne. 8) call abort
end
/libgomp.fortran/retval2.f90
0,0 → 1,27
! { dg-do run }
 
function f1 ()
real :: f1
f1 = 6.5
call sub1
contains
subroutine sub1
use omp_lib
logical :: l
l = .false.
!$omp parallel firstprivate (f1) num_threads (2) reduction (.or.:l)
l = f1 .ne. 6.5
if (omp_get_thread_num () .eq. 0) f1 = 8.5
if (omp_get_thread_num () .eq. 1) f1 = 14.5
!$omp barrier
l = l .or. (omp_get_thread_num () .eq. 0 .and. f1 .ne. 8.5)
l = l .or. (omp_get_thread_num () .eq. 1 .and. f1 .ne. 14.5)
!$omp end parallel
if (l) call abort
f1 = -2.5
end subroutine sub1
end function f1
 
real :: f1
if (f1 () .ne. -2.5) call abort
end
/libgomp.fortran/lib3.f
0,0 → 1,76
C { dg-do run }
 
INCLUDE "omp_lib.h"
 
DOUBLE PRECISION :: D, E
LOGICAL :: L
INTEGER (KIND = OMP_LOCK_KIND) :: LCK
INTEGER (KIND = OMP_NEST_LOCK_KIND) :: NLCK
 
D = OMP_GET_WTIME ()
 
CALL OMP_INIT_LOCK (LCK)
CALL OMP_SET_LOCK (LCK)
IF (OMP_TEST_LOCK (LCK)) CALL ABORT
CALL OMP_UNSET_LOCK (LCK)
IF (.NOT. OMP_TEST_LOCK (LCK)) CALL ABORT
IF (OMP_TEST_LOCK (LCK)) CALL ABORT
CALL OMP_UNSET_LOCK (LCK)
CALL OMP_DESTROY_LOCK (LCK)
 
CALL OMP_INIT_NEST_LOCK (NLCK)
IF (OMP_TEST_NEST_LOCK (NLCK) .NE. 1) CALL ABORT
CALL OMP_SET_NEST_LOCK (NLCK)
IF (OMP_TEST_NEST_LOCK (NLCK) .NE. 3) CALL ABORT
CALL OMP_UNSET_NEST_LOCK (NLCK)
CALL OMP_UNSET_NEST_LOCK (NLCK)
IF (OMP_TEST_NEST_LOCK (NLCK) .NE. 2) CALL ABORT
CALL OMP_UNSET_NEST_LOCK (NLCK)
CALL OMP_UNSET_NEST_LOCK (NLCK)
CALL OMP_DESTROY_NEST_LOCK (NLCK)
 
CALL OMP_SET_DYNAMIC (.TRUE.)
IF (.NOT. OMP_GET_DYNAMIC ()) CALL ABORT
CALL OMP_SET_DYNAMIC (.FALSE.)
IF (OMP_GET_DYNAMIC ()) CALL ABORT
 
CALL OMP_SET_NESTED (.TRUE.)
IF (.NOT. OMP_GET_NESTED ()) CALL ABORT
CALL OMP_SET_NESTED (.FALSE.)
IF (OMP_GET_NESTED ()) CALL ABORT
 
CALL OMP_SET_NUM_THREADS (5)
IF (OMP_GET_NUM_THREADS () .NE. 1) CALL ABORT
IF (OMP_GET_MAX_THREADS () .NE. 5) CALL ABORT
IF (OMP_GET_THREAD_NUM () .NE. 0) CALL ABORT
CALL OMP_SET_NUM_THREADS (3)
IF (OMP_GET_NUM_THREADS () .NE. 1) CALL ABORT
IF (OMP_GET_MAX_THREADS () .NE. 3) CALL ABORT
IF (OMP_GET_THREAD_NUM () .NE. 0) CALL ABORT
L = .FALSE.
C$OMP PARALLEL REDUCTION (.OR.:L)
L = OMP_GET_NUM_THREADS () .NE. 3
L = L .OR. (OMP_GET_THREAD_NUM () .LT. 0)
L = L .OR. (OMP_GET_THREAD_NUM () .GE. 3)
C$OMP MASTER
L = L .OR. (OMP_GET_THREAD_NUM () .NE. 0)
C$OMP END MASTER
C$OMP END PARALLEL
IF (L) CALL ABORT
 
IF (OMP_GET_NUM_PROCS () .LE. 0) CALL ABORT
IF (OMP_IN_PARALLEL ()) CALL ABORT
C$OMP PARALLEL REDUCTION (.OR.:L)
L = .NOT. OMP_IN_PARALLEL ()
C$OMP END PARALLEL
C$OMP PARALLEL REDUCTION (.OR.:L) IF (.TRUE.)
L = .NOT. OMP_IN_PARALLEL ()
C$OMP END PARALLEL
 
E = OMP_GET_WTIME ()
IF (D .GT. E) CALL ABORT
D = OMP_GET_WTICK ()
C Negative precision is definitely wrong,
C bigger than 1s clock resolution is also strange
IF (D .LE. 0 .OR. D .GT. 1.) CALL ABORT
END
/libgomp.fortran/pr42162.f90
0,0 → 1,53
! PR fortran/42162
! { dg-do run }
 
subroutine sub1(k, a)
implicit none
integer :: k, a(3)
!$omp do
do k=1,3
a(k) = a(k) + 1
enddo
!$omp end do
end subroutine sub1
 
subroutine sub2(k, a)
implicit none
integer :: k, a(3)
!$omp do private (k)
do k=1,3
a(k) = a(k) + 1
enddo
!$omp end do
end subroutine sub2
 
subroutine sub3(k, a)
implicit none
integer :: k, a(3)
!$omp do lastprivate (k)
do k=1,3
a(k) = a(k) + 1
enddo
!$omp end do
end subroutine sub3
 
program pr42162
implicit none
integer :: k, a(3), b(3), c(3)
a = 1
b = 2
c = 3
k = 3
!$omp parallel num_threads(3)
call sub1 (k, a)
!$omp end parallel
k = 4
!$omp parallel num_threads(3)
call sub2 (k, b)
!$omp end parallel
k = 10
!$omp parallel num_threads(3)
call sub3 (k, c)
!$omp end parallel
if (k.ne.4.or.any(a.ne.2).or.any(b.ne.3).or.any(c.ne.4)) call abort
end
/libgomp.fortran/do1.f90
0,0 → 1,179
! { dg-do run }
 
integer, dimension (128) :: a, b
integer :: i
a = -1
b = -1
do i = 1, 128
if (i .ge. 8 .and. i .le. 15) then
b(i) = 1 * 256 + i
else if (i .ge. 19 .and. i .le. 23) then
b(i) = 2 * 256 + i
else if (i .ge. 28 .and. i .le. 38) then
if (iand (i, 1) .eq. 0) b(i) = 3 * 256 + i
else if (i .ge. 59 .and. i .le. 79) then
if (iand (i - 59, 3) .eq. 0) b(i) = 4 * 256 + i
else if (i .ge. 101 .and. i .le. 125) then
if (mod (i - 101, 12) .eq. 0) b(i) = 5 * 256 + i
end if
end do
 
!$omp parallel num_threads (4)
 
!$omp do
do i = 8, 15
a(i) = 1 * 256 + i
end do
 
!$omp do
do i = 23, 19, -1
a(i) = 2 * 256 + i
end do
 
!$omp do
do i = 28, 39, 2
a(i) = 3 * 256 + i
end do
 
!$omp do
do i = 79, 59, -4
a(i) = 4 * 256 + i
end do
 
!$omp do
do i = 125, 90, -12
a(i) = 5 * 256 + i
end do
 
!$omp end parallel
 
if (any (a .ne. b)) call abort
a = -1
 
!$omp parallel num_threads (4)
 
!$omp do schedule (static)
do i = 8, 15
a(i) = 1 * 256 + i
end do
 
!$omp do schedule (static, 1)
do i = 23, 19, -1
a(i) = 2 * 256 + i
end do
 
!$omp do schedule (static, 3)
do i = 28, 39, 2
a(i) = 3 * 256 + i
end do
 
!$omp do schedule (static, 6)
do i = 79, 59, -4
a(i) = 4 * 256 + i
end do
 
!$omp do schedule (static, 2)
do i = 125, 90, -12
a(i) = 5 * 256 + i
end do
 
!$omp end parallel
 
if (any (a .ne. b)) call abort
a = -1
 
!$omp parallel num_threads (4)
 
!$omp do schedule (dynamic)
do i = 8, 15
a(i) = 1 * 256 + i
end do
 
!$omp do schedule (dynamic, 4)
do i = 23, 19, -1
a(i) = 2 * 256 + i
end do
 
!$omp do schedule (dynamic, 1)
do i = 28, 39, 2
a(i) = 3 * 256 + i
end do
 
!$omp do schedule (dynamic, 2)
do i = 79, 59, -4
a(i) = 4 * 256 + i
end do
 
!$omp do schedule (dynamic, 3)
do i = 125, 90, -12
a(i) = 5 * 256 + i
end do
 
!$omp end parallel
 
if (any (a .ne. b)) call abort
a = -1
 
!$omp parallel num_threads (4)
 
!$omp do schedule (guided)
do i = 8, 15
a(i) = 1 * 256 + i
end do
 
!$omp do schedule (guided, 4)
do i = 23, 19, -1
a(i) = 2 * 256 + i
end do
 
!$omp do schedule (guided, 1)
do i = 28, 39, 2
a(i) = 3 * 256 + i
end do
 
!$omp do schedule (guided, 2)
do i = 79, 59, -4
a(i) = 4 * 256 + i
end do
 
!$omp do schedule (guided, 3)
do i = 125, 90, -12
a(i) = 5 * 256 + i
end do
 
!$omp end parallel
 
if (any (a .ne. b)) call abort
a = -1
 
!$omp parallel num_threads (4)
 
!$omp do schedule (runtime)
do i = 8, 15
a(i) = 1 * 256 + i
end do
 
!$omp do schedule (runtime)
do i = 23, 19, -1
a(i) = 2 * 256 + i
end do
 
!$omp do schedule (runtime)
do i = 28, 39, 2
a(i) = 3 * 256 + i
end do
 
!$omp do schedule (runtime)
do i = 79, 59, -4
a(i) = 4 * 256 + i
end do
 
!$omp do schedule (runtime)
do i = 125, 90, -12
a(i) = 5 * 256 + i
end do
 
!$omp end parallel
 
if (any (a .ne. b)) call abort
end
/libgomp.fortran/threadprivate1.f90
0,0 → 1,21
! { dg-do run }
! { dg-require-effective-target tls_runtime }
 
module threadprivate1
double precision :: d
!$omp threadprivate (d)
end module threadprivate1
 
!$ use omp_lib
use threadprivate1
logical :: l
l = .false.
!$omp parallel num_threads (4) reduction (.or.:l)
d = omp_get_thread_num () + 6.5
!$omp barrier
if (d .ne. omp_get_thread_num () + 6.5) l = .true.
!$omp end parallel
if (l) call abort ()
end
 
! { dg-final { cleanup-modules "threadprivate1" } }
/libgomp.fortran/task1.f90
0,0 → 1,27
! { dg-do run }
 
program tasktest
use omp_lib
integer :: i, j
common /tasktest_j/ j
j = 0
!$omp parallel private (i)
i = omp_get_thread_num ()
if (i.lt.2) then
!$omp task if (.false.) default(firstprivate)
call subr (i + 1)
!$omp end task
end if
!$omp end parallel
if (j.gt.0) call abort
contains
subroutine subr (i)
use omp_lib
integer :: i, j
common /tasktest_j/ j
if (omp_get_thread_num ().ne.(i - 1)) then
!$omp atomic
j = j + 1
end if
end subroutine subr
end program tasktest
/libgomp.fortran/pr27416-1.f90
0,0 → 1,19
! PR middle-end/27416
! { dg-do run }
 
integer :: j
j = 6
!$omp parallel num_threads (4)
call foo (j)
!$omp end parallel
if (j.ne.6+16) call abort
end
 
subroutine foo (j)
integer :: i, j
 
!$omp do firstprivate (j) lastprivate (j)
do i = 1, 16
if (i.eq.16) j = j + i
end do
end subroutine foo
/libgomp.fortran/threadprivate2.f90
0,0 → 1,96
! { dg-do run }
! { dg-require-effective-target tls_runtime }
 
module threadprivate2
integer, dimension(:,:), allocatable :: foo
!$omp threadprivate (foo)
end module threadprivate2
 
use omp_lib
use threadprivate2
 
integer, dimension(:), pointer :: bar1
integer, dimension(2), target :: bar2
common /thrc/ bar1, bar2
!$omp threadprivate (/thrc/)
 
integer, dimension(:), pointer, save :: bar3 => NULL()
!$omp threadprivate (bar3)
 
logical :: l
type tt
integer :: a
integer :: b = 32
end type tt
type (tt), save :: baz
!$omp threadprivate (baz)
 
l = .false.
call omp_set_dynamic (.false.)
call omp_set_num_threads (4)
 
!$omp parallel num_threads (4) reduction (.or.:l)
l = allocated (foo)
allocate (foo (6 + omp_get_thread_num (), 3))
l = l.or..not.allocated (foo)
l = l.or.size (foo).ne.(18 + 3 * omp_get_thread_num ())
foo = omp_get_thread_num () + 1
 
bar2 = omp_get_thread_num ()
l = l.or.associated (bar3)
bar1 => bar2
l = l.or..not.associated (bar1)
l = l.or..not.associated (bar1, bar2)
l = l.or.any (bar1.ne.omp_get_thread_num ())
nullify (bar1)
l = l.or.associated (bar1)
allocate (bar3 (4))
l = l.or..not.associated (bar3)
bar3 = omp_get_thread_num () - 2
 
l = l.or.(baz%b.ne.32)
baz%a = omp_get_thread_num () * 2
baz%b = omp_get_thread_num () * 2 + 1
!$omp end parallel
 
if (l) call abort
if (.not.allocated (foo)) call abort
if (size (foo).ne.18) call abort
if (any (foo.ne.1)) call abort
 
if (associated (bar1)) call abort
if (.not.associated (bar3)) call abort
if (any (bar3 .ne. -2)) call abort
deallocate (bar3)
if (associated (bar3)) call abort
 
!$omp parallel num_threads (4) reduction (.or.:l)
l = l.or..not.allocated (foo)
l = l.or.size (foo).ne.(18 + 3 * omp_get_thread_num ())
l = l.or.any (foo.ne.(omp_get_thread_num () + 1))
if (omp_get_thread_num () .ne. 0) then
deallocate (foo)
l = l.or.allocated (foo)
end if
 
l = l.or.associated (bar1)
if (omp_get_thread_num () .ne. 0) then
l = l.or..not.associated (bar3)
l = l.or.any (bar3 .ne. omp_get_thread_num () - 2)
deallocate (bar3)
end if
l = l.or.associated (bar3)
 
l = l.or.(baz%a.ne.(omp_get_thread_num () * 2))
l = l.or.(baz%b.ne.(omp_get_thread_num () * 2 + 1))
!$omp end parallel
 
if (l) call abort
if (.not.allocated (foo)) call abort
if (size (foo).ne.18) call abort
if (any (foo.ne.1)) call abort
deallocate (foo)
if (allocated (foo)) call abort
end
 
! { dg-final { cleanup-modules "threadprivate2" } }
/libgomp.fortran/task2.f90
0,0 → 1,142
integer :: err
err = 0
!$omp parallel num_threads (4) default (none) shared (err)
!$omp single
call test
!$omp end single
!$omp end parallel
if (err.ne.0) call abort
contains
subroutine check (x, y, l)
integer :: x, y
logical :: l
l = l .or. x .ne. y
end subroutine check
 
subroutine foo (c, d, e, f, g, h, i, j, k, n)
use omp_lib
integer :: n
character (len = *) :: c
character (len = n) :: d
integer, dimension (2, 3:5, n) :: e
integer, dimension (2, 3:n, n) :: f
character (len = *), dimension (5, 3:n) :: g
character (len = n), dimension (5, 3:n) :: h
real, dimension (:, :, :) :: i
double precision, dimension (3:, 5:, 7:) :: j
integer, dimension (:, :, :) :: k
logical :: l
integer :: p, q, r
character (len = n) :: s
integer, dimension (2, 3:5, n) :: t
integer, dimension (2, 3:n, n) :: u
character (len = n), dimension (5, 3:n) :: v
character (len = 2 * n + 24) :: w
integer :: x, z
character (len = 1) :: y
s = 'PQRSTUV'
forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + p - q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - p + q - 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = '_+|/Oo_'
forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = '///|||!'
!$omp task default (none) firstprivate (c, d, e, f, g, h, i, j, k) &
!$omp & firstprivate (s, t, u, v) private (l, p, q, r, w, x, y) shared (err)
l = .false.
l = l .or. c .ne. 'abcdefghijkl'
l = l .or. d .ne. 'ABCDEFG'
l = l .or. s .ne. 'PQRSTUV'
do 100, p = 1, 2
do 100, q = 3, 7
do 100, r = 1, 7
if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 + p + q + 2 * r
l = l .or. f(p, q, r) .ne. 25 + p + q + 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. '0123456789AB'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. '9876543210ZY'
if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. '0123456'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. '9876543'
if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + p - q + 2 * r
l = l .or. u(p, q, r) .ne. 30 - p + q - 2 * r
if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. '_+|/Oo_'
if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. '///|||!'
100 continue
do 101, p = 3, 5
do 101, q = 2, 6
do 101, r = 1, 7
l = l .or. i(p - 2, q - 1, r) .ne. 7.5 * p * q * r
l = l .or. j(p, q + 3, r + 6) .ne. 9.5 * p * q * r
101 continue
do 102, p = 1, 5
do 102, q = 4, 6
l = l .or. k(p, 1, q - 3) .ne. 19 + p + 7 + 3 * q
102 continue
call check (size (e, 1), 2, l)
call check (size (e, 2), 3, l)
call check (size (e, 3), 7, l)
call check (size (e), 42, l)
call check (size (f, 1), 2, l)
call check (size (f, 2), 5, l)
call check (size (f, 3), 7, l)
call check (size (f), 70, l)
call check (size (g, 1), 5, l)
call check (size (g, 2), 5, l)
call check (size (g), 25, l)
call check (size (h, 1), 5, l)
call check (size (h, 2), 5, l)
call check (size (h), 25, l)
call check (size (i, 1), 3, l)
call check (size (i, 2), 5, l)
call check (size (i, 3), 7, l)
call check (size (i), 105, l)
call check (size (j, 1), 4, l)
call check (size (j, 2), 5, l)
call check (size (j, 3), 7, l)
call check (size (j), 140, l)
call check (size (k, 1), 5, l)
call check (size (k, 2), 1, l)
call check (size (k, 3), 3, l)
call check (size (k), 15, l)
if (l) then
!$omp atomic
err = err + 1
end if
!$omp end task
c = ''
d = ''
e(:, :, :) = 199
f(:, :, :) = 198
g(:, :) = ''
h(:, :) = ''
i(:, :, :) = 7.0
j(:, :, :) = 8.0
k(:, :, :) = 9
s = ''
t(:, :, :) = 10
u(:, :, :) = 11
v(:, :) = ''
end subroutine foo
 
subroutine test
character (len = 12) :: c
character (len = 7) :: d
integer, dimension (2, 3:5, 7) :: e
integer, dimension (2, 3:7, 7) :: f
character (len = 12), dimension (5, 3:7) :: g
character (len = 7), dimension (5, 3:7) :: h
real, dimension (3:5, 2:6, 1:7) :: i
double precision, dimension (3:6, 2:6, 1:7) :: j
integer, dimension (1:5, 7:7, 4:6) :: k
integer :: p, q, r
c = 'abcdefghijkl'
d = 'ABCDEFG'
forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 + p + q + 2 * r
forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 + p + q + 2 * r
forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = '0123456789AB'
forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = '9876543210ZY'
forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = '0123456'
forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = '9876543'
forall (p = 3:5, q = 2:6, r = 1:7) i(p, q, r) = 7.5 * p * q * r
forall (p = 3:6, q = 2:6, r = 1:7) j(p, q, r) = 9.5 * p * q * r
forall (p = 1:5, q = 7:7, r = 4:6) k(p, q, r) = 19 + p + q + 3 * r
call foo (c, d, e, f, g, h, i, j, k, 7)
end subroutine test
end
/libgomp.fortran/do2.f90
0,0 → 1,366
! { dg-do run }
 
integer, dimension (128) :: a, b
integer :: i, j
logical :: k
a = -1
b = -1
do i = 1, 128
if (i .ge. 8 .and. i .le. 15) then
b(i) = 1 * 256 + i
else if (i .ge. 19 .and. i .le. 23) then
b(i) = 2 * 256 + i
else if (i .ge. 28 .and. i .le. 38) then
if (iand (i, 1) .eq. 0) b(i) = 3 * 256 + i
else if (i .ge. 59 .and. i .le. 79) then
if (iand (i - 59, 3) .eq. 0) b(i) = 4 * 256 + i
else if (i .ge. 101 .and. i .le. 125) then
if (mod (i - 101, 12) .eq. 0) b(i) = 5 * 256 + i
end if
end do
 
k = .false.
j = 8
!$omp parallel num_threads (4)
 
!$omp do ordered
do i = 8, 15
a(i) = 1 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 1
!$omp end ordered
end do
 
!$omp single
j = 23
!$omp end single
 
!$omp do ordered
do i = 23, 19, -1
a(i) = 2 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 1
!$omp end ordered
end do
 
!$omp single
j = 28
!$omp end single
 
!$omp do ordered
do i = 28, 39, 2
a(i) = 3 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 2
!$omp end ordered
end do
 
!$omp single
j = 79
!$omp end single
 
!$omp do ordered
do i = 79, 59, -4
a(i) = 4 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 4
!$omp end ordered
end do
 
!$omp single
j = 125
!$omp end single
 
!$omp do ordered
do i = 125, 90, -12
a(i) = 5 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 12
!$omp end ordered
end do
 
!$omp end parallel
 
if (any (a .ne. b) .or. k) call abort
a = -1
k = .false.
j = 8
!$omp parallel num_threads (4)
 
!$omp do ordered schedule (static)
do i = 8, 15
a(i) = 1 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 1
!$omp end ordered
end do
 
!$omp single
j = 23
!$omp end single
 
!$omp do ordered schedule (static, 1)
do i = 23, 19, -1
a(i) = 2 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 1
!$omp end ordered
end do
 
!$omp single
j = 28
!$omp end single
 
!$omp do ordered schedule (static, 3)
do i = 28, 39, 2
a(i) = 3 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 2
!$omp end ordered
end do
 
!$omp single
j = 79
!$omp end single
 
!$omp do ordered schedule (static, 6)
do i = 79, 59, -4
a(i) = 4 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 4
!$omp end ordered
end do
 
!$omp single
j = 125
!$omp end single
 
!$omp do ordered schedule (static, 2)
do i = 125, 90, -12
a(i) = 5 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 12
!$omp end ordered
end do
 
!$omp end parallel
 
if (any (a .ne. b) .or. k) call abort
a = -1
k = .false.
j = 8
!$omp parallel num_threads (4)
 
!$omp do ordered schedule (dynamic)
do i = 8, 15
a(i) = 1 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 1
!$omp end ordered
end do
 
!$omp single
j = 23
!$omp end single
 
!$omp do ordered schedule (dynamic, 4)
do i = 23, 19, -1
a(i) = 2 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 1
!$omp end ordered
end do
 
!$omp single
j = 28
!$omp end single
 
!$omp do ordered schedule (dynamic, 1)
do i = 28, 39, 2
a(i) = 3 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 2
!$omp end ordered
end do
 
!$omp single
j = 79
!$omp end single
 
!$omp do ordered schedule (dynamic, 2)
do i = 79, 59, -4
a(i) = 4 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 4
!$omp end ordered
end do
 
!$omp single
j = 125
!$omp end single
 
!$omp do ordered schedule (dynamic, 3)
do i = 125, 90, -12
a(i) = 5 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 12
!$omp end ordered
end do
 
!$omp end parallel
 
if (any (a .ne. b) .or. k) call abort
a = -1
k = .false.
j = 8
!$omp parallel num_threads (4)
 
!$omp do ordered schedule (guided)
do i = 8, 15
a(i) = 1 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 1
!$omp end ordered
end do
 
!$omp single
j = 23
!$omp end single
 
!$omp do ordered schedule (guided, 4)
do i = 23, 19, -1
a(i) = 2 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 1
!$omp end ordered
end do
 
!$omp single
j = 28
!$omp end single
 
!$omp do ordered schedule (guided, 1)
do i = 28, 39, 2
a(i) = 3 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 2
!$omp end ordered
end do
 
!$omp single
j = 79
!$omp end single
 
!$omp do ordered schedule (guided, 2)
do i = 79, 59, -4
a(i) = 4 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 4
!$omp end ordered
end do
 
!$omp single
j = 125
!$omp end single
 
!$omp do ordered schedule (guided, 3)
do i = 125, 90, -12
a(i) = 5 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 12
!$omp end ordered
end do
 
!$omp end parallel
 
if (any (a .ne. b) .or. k) call abort
a = -1
k = .false.
j = 8
!$omp parallel num_threads (4)
 
!$omp do ordered schedule (runtime)
do i = 8, 15
a(i) = 1 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 1
!$omp end ordered
end do
 
!$omp single
j = 23
!$omp end single
 
!$omp do ordered schedule (runtime)
do i = 23, 19, -1
a(i) = 2 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 1
!$omp end ordered
end do
 
!$omp single
j = 28
!$omp end single
 
!$omp do ordered schedule (runtime)
do i = 28, 39, 2
a(i) = 3 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j + 2
!$omp end ordered
end do
 
!$omp single
j = 79
!$omp end single
 
!$omp do ordered schedule (runtime)
do i = 79, 59, -4
a(i) = 4 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 4
!$omp end ordered
end do
 
!$omp single
j = 125
!$omp end single
 
!$omp do ordered schedule (runtime)
do i = 125, 90, -12
a(i) = 5 * 256 + i
!$omp ordered
if (i .ne. j) k = .true.
j = j - 12
!$omp end ordered
end do
 
!$omp end parallel
 
if (any (a .ne. b) .or. k) call abort
end
/libgomp.fortran/threadprivate3.f90
0,0 → 1,108
! { dg-do run }
! { dg-require-effective-target tls_runtime }
 
module threadprivate3
integer, dimension(:,:), pointer :: foo => NULL()
!$omp threadprivate (foo)
end module threadprivate3
 
use omp_lib
use threadprivate3
 
integer, dimension(:), pointer :: bar1
integer, dimension(2), target :: bar2, var
common /thrc/ bar1, bar2
!$omp threadprivate (/thrc/)
 
integer, dimension(:), pointer, save :: bar3 => NULL()
!$omp threadprivate (bar3)
 
logical :: l
type tt
integer :: a
integer :: b = 32
end type tt
type (tt), save :: baz
!$omp threadprivate (baz)
 
l = .false.
call omp_set_dynamic (.false.)
call omp_set_num_threads (4)
var = 6
 
!$omp parallel num_threads (4) reduction (.or.:l)
bar2 = omp_get_thread_num ()
l = associated (bar3)
bar1 => bar2
l = l.or..not.associated (bar1)
l = l.or..not.associated (bar1, bar2)
l = l.or.any (bar1.ne.omp_get_thread_num ())
nullify (bar1)
l = l.or.associated (bar1)
allocate (bar3 (4))
l = l.or..not.associated (bar3)
bar3 = omp_get_thread_num () - 2
if (omp_get_thread_num () .ne. 0) then
deallocate (bar3)
if (associated (bar3)) call abort
else
bar1 => var
end if
bar2 = omp_get_thread_num () * 6 + 130
 
l = l.or.(baz%b.ne.32)
baz%a = omp_get_thread_num () * 2
baz%b = omp_get_thread_num () * 2 + 1
!$omp end parallel
 
if (l) call abort
if (.not.associated (bar1)) call abort
if (any (bar1.ne.6)) call abort
if (.not.associated (bar3)) call abort
if (any (bar3 .ne. -2)) call abort
deallocate (bar3)
if (associated (bar3)) call abort
 
allocate (bar3 (10))
bar3 = 17
 
!$omp parallel copyin (bar1, bar2, bar3, baz) num_threads (4) &
!$omp& reduction (.or.:l)
l = l.or..not.associated (bar1)
l = l.or.any (bar1.ne.6)
l = l.or.any (bar2.ne.130)
l = l.or..not.associated (bar3)
l = l.or.size (bar3).ne.10
l = l.or.any (bar3.ne.17)
allocate (bar1 (4))
bar1 = omp_get_thread_num ()
bar2 = omp_get_thread_num () + 8
 
l = l.or.(baz%a.ne.0)
l = l.or.(baz%b.ne.1)
baz%a = omp_get_thread_num () * 3 + 4
baz%b = omp_get_thread_num () * 3 + 5
 
!$omp barrier
if (omp_get_thread_num () .eq. 0) then
deallocate (bar3)
end if
bar3 => bar2
!$omp barrier
 
l = l.or..not.associated (bar1)
l = l.or..not.associated (bar3)
l = l.or.any (bar1.ne.omp_get_thread_num ())
l = l.or.size (bar1).ne.4
l = l.or.any (bar2.ne.omp_get_thread_num () + 8)
l = l.or.any (bar3.ne.omp_get_thread_num () + 8)
l = l.or.size (bar3).ne.2
 
l = l.or.(baz%a .ne. omp_get_thread_num () * 3 + 4)
l = l.or.(baz%b .ne. omp_get_thread_num () * 3 + 5)
!$omp end parallel
 
if (l) call abort
end
 
! { dg-final { cleanup-modules "threadprivate3" } }
/libgomp.fortran/task3.f90
0,0 → 1,27
! { dg-do run }
! { dg-options "-fopenmp" }
!
! PR fortran/47886
!
! Test case contributed by Bill Long
 
! derived from OpenMP test OMP3f/F03_2_7_1d.F90
program F03_2_7_1d
use omp_lib
implicit none
integer, parameter :: NT = 4
integer :: sum = 0
 
call omp_set_num_threads(NT);
 
!$omp parallel
!$omp task if(omp_get_num_threads() > 0)
!$omp atomic
sum = sum + 1
!$omp end task
!$omp end parallel
if (sum /= NT) then
print *, "FAIL - sum == ", sum, " (expected ", NT, ")"
call abort
end if
end program F03_2_7_1d
/libgomp.fortran/threadprivate4.f90
0,0 → 1,78
! { dg-do run }
! { dg-require-effective-target tls_runtime }
 
module threadprivate4
integer :: vi
procedure(), pointer :: foo
!$omp threadprivate (foo, vi)
 
contains
subroutine fn0
vi = 0
end subroutine fn0
subroutine fn1
vi = 1
end subroutine fn1
subroutine fn2
vi = 2
end subroutine fn2
subroutine fn3
vi = 3
end subroutine fn3
end module threadprivate4
 
use omp_lib
use threadprivate4
 
integer :: i
logical :: l
 
procedure(), pointer :: bar1
common /thrc/ bar1
!$omp threadprivate (/thrc/)
 
procedure(), pointer, save :: bar2
!$omp threadprivate (bar2)
 
l = .false.
call omp_set_dynamic (.false.)
call omp_set_num_threads (4)
 
!$omp parallel num_threads (4) reduction (.or.:l) private (i)
i = omp_get_thread_num ()
if (i.eq.0) then
foo => fn0
bar1 => fn0
bar2 => fn0
elseif (i.eq.1) then
foo => fn1
bar1 => fn1
bar2 => fn1
elseif (i.eq.2) then
foo => fn2
bar1 => fn2
bar2 => fn2
else
foo => fn3
bar1 => fn3
bar2 => fn3
end if
vi = -1
!$omp barrier
vi = -1
call foo ()
l=l.or.(vi.ne.i)
vi = -2
call bar1 ()
l=l.or.(vi.ne.i)
vi = -3
call bar2 ()
l=l.or.(vi.ne.i)
vi = -1
!$omp end parallel
 
if (l) call abort
 
end
 
! { dg-final { cleanup-modules "threadprivate4" } }
/libgomp.fortran/condinc2.f
0,0 → 1,7
! { dg-options "-fno-openmp" }
program condinc2
logical l
l = .true.
C$ include 'condinc1.inc'
return
end
/libgomp.fortran/task4.f90
0,0 → 1,45
! { dg-do run }
 
use omp_lib
integer :: err, e
 
!$omp atomic write
err = 0
!$omp parallel shared(err) private(e)
if (omp_in_final ()) then
!$omp atomic write
err = 1
endif
!$omp task if (.false.) shared(err)
if (omp_in_final ()) then
!$omp atomic write
err = 1
endif
!$omp task if (.false.) shared(err)
if (omp_in_final ()) then
!$omp atomic write
err = 1
endif
!$omp end task
!$omp end task
!$omp atomic read
e = err
!$omp task final (e .eq. 0) shared(err)
if (.not.omp_in_final ()) then
!$omp atomic write
err = 1
endif
!$omp taskyield
!$omp taskwait
!$omp task shared(err)
if (.not.omp_in_final ()) then
!$omp atomic write
err = 1
endif
!$omp end task
!$omp end task
!$omp end parallel
!$omp atomic read
e = err
if (e .ne. 0) call abort
end
/libgomp.fortran/nestedfn1.f90
0,0 → 1,43
! { dg-do run }
 
integer :: a, b, c
a = 1
b = 2
c = 3
call foo
if (a .ne. 7) call abort
contains
subroutine foo
use omp_lib
logical :: l
l = .false.
!$omp parallel shared (a) private (b) firstprivate (c) &
!$omp num_threads (2) reduction (.or.:l)
if (a .ne. 1 .or. c .ne. 3) l = .true.
!$omp barrier
if (omp_get_thread_num () .eq. 0) then
a = 4
b = 5
c = 6
end if
!$omp barrier
if (omp_get_thread_num () .eq. 1) then
if (a .ne. 4 .or. c .ne. 3) l = .true.
a = 7
b = 8
c = 9
else if (omp_get_num_threads () .eq. 1) then
a = 7
end if
!$omp barrier
if (omp_get_thread_num () .eq. 0) then
if (a .ne. 7 .or. b .ne. 5 .or. c .ne. 6) l = .true.
end if
!$omp barrier
if (omp_get_thread_num () .eq. 1) then
if (a .ne. 7 .or. b .ne. 8 .or. c .ne. 9) l = .true.
end if
!$omp end parallel
if (l) call abort
end subroutine foo
end
/libgomp.fortran/lib1.f90
0,0 → 1,76
! { dg-do run }
 
use omp_lib
 
double precision :: d, e
logical :: l
integer (kind = omp_lock_kind) :: lck
integer (kind = omp_nest_lock_kind) :: nlck
 
d = omp_get_wtime ()
 
call omp_init_lock (lck)
call omp_set_lock (lck)
if (omp_test_lock (lck)) call abort
call omp_unset_lock (lck)
if (.not. omp_test_lock (lck)) call abort
if (omp_test_lock (lck)) call abort
call omp_unset_lock (lck)
call omp_destroy_lock (lck)
 
call omp_init_nest_lock (nlck)
if (omp_test_nest_lock (nlck) .ne. 1) call abort
call omp_set_nest_lock (nlck)
if (omp_test_nest_lock (nlck) .ne. 3) call abort
call omp_unset_nest_lock (nlck)
call omp_unset_nest_lock (nlck)
if (omp_test_nest_lock (nlck) .ne. 2) call abort
call omp_unset_nest_lock (nlck)
call omp_unset_nest_lock (nlck)
call omp_destroy_nest_lock (nlck)
 
call omp_set_dynamic (.true.)
if (.not. omp_get_dynamic ()) call abort
call omp_set_dynamic (.false.)
if (omp_get_dynamic ()) call abort
 
call omp_set_nested (.true.)
if (.not. omp_get_nested ()) call abort
call omp_set_nested (.false.)
if (omp_get_nested ()) call abort
 
call omp_set_num_threads (5)
if (omp_get_num_threads () .ne. 1) call abort
if (omp_get_max_threads () .ne. 5) call abort
if (omp_get_thread_num () .ne. 0) call abort
call omp_set_num_threads (3)
if (omp_get_num_threads () .ne. 1) call abort
if (omp_get_max_threads () .ne. 3) call abort
if (omp_get_thread_num () .ne. 0) call abort
l = .false.
!$omp parallel reduction (.or.:l)
l = omp_get_num_threads () .ne. 3
l = l .or. (omp_get_thread_num () .lt. 0)
l = l .or. (omp_get_thread_num () .ge. 3)
!$omp master
l = l .or. (omp_get_thread_num () .ne. 0)
!$omp end master
!$omp end parallel
if (l) call abort
 
if (omp_get_num_procs () .le. 0) call abort
if (omp_in_parallel ()) call abort
!$omp parallel reduction (.or.:l)
l = .not. omp_in_parallel ()
!$omp end parallel
!$omp parallel reduction (.or.:l) if (.true.)
l = .not. omp_in_parallel ()
!$omp end parallel
 
e = omp_get_wtime ()
if (d .gt. e) call abort
d = omp_get_wtick ()
! Negative precision is definitely wrong,
! bigger than 1s clock resolution is also strange
if (d .le. 0 .or. d .gt. 1.) call abort
end
/libgomp.fortran/pr27916-1.f90
0,0 → 1,26
! PR fortran/27916
! Test whether allocatable privatized arrays has "not currently allocated"
! status at the start of OpenMP constructs.
! { dg-do run }
 
program pr27916
integer :: n, i
logical :: r
integer, dimension(:), allocatable :: a
 
r = .false.
!$omp parallel do num_threads (4) private (n, a, i) &
!$omp & reduction (.or.: r) schedule (static)
do n = 1, 16
r = r .or. allocated (a)
allocate (a (16))
r = r .or. .not. allocated (a)
do i = 1, 16
a (i) = i
end do
deallocate (a)
r = r .or. allocated (a)
end do
!$omp end parallel do
if (r) call abort
end program pr27916
/libgomp.fortran/nestedfn2.f90
0,0 → 1,34
! { dg-do run }
 
integer :: i
common /c/ i
i = -1
!$omp parallel shared (i) num_threads (4)
call test1
!$omp end parallel
end
subroutine test1
integer :: vari
call test2
call test3
contains
subroutine test2
use omp_lib
integer :: i
common /c/ i
!$omp single
i = omp_get_thread_num ()
call test4
!$omp end single copyprivate (vari)
end subroutine test2
subroutine test3
integer :: i
common /c/ i
if (i .lt. 0 .or. i .ge. 4) call abort
if (i + 10 .ne. vari) call abort
end subroutine test3
subroutine test4
use omp_lib
vari = omp_get_thread_num () + 10
end subroutine test4
end subroutine test1
/libgomp.fortran/nestedfn3.f90
0,0 → 1,24
! PR middle-end/28790
! { dg-do run }
 
program nestomp
integer :: j
j = 8
call bar
if (j.ne.10) call abort
contains
subroutine foo (i)
integer :: i
!$omp atomic
j = j + i - 5
end subroutine
subroutine bar
use omp_lib
integer :: i
i = 6
call omp_set_dynamic (.false.)
!$omp parallel num_threads (2)
call foo(i)
!$omp end parallel
end subroutine
end
/libgomp.fortran/pr27916-2.f90
0,0 → 1,26
! PR fortran/27916
! Test whether allocatable privatized arrays has "not currently allocated"
! status at the start of OpenMP constructs.
! { dg-do run }
 
program pr27916
integer :: n, i
logical :: r
integer, dimension(:), allocatable :: a
 
r = .false.
!$omp parallel do num_threads (4) default (private) &
!$omp & reduction (.or.: r) schedule (static)
do n = 1, 16
r = r .or. allocated (a)
allocate (a (16))
r = r .or. .not. allocated (a)
do i = 1, 16
a (i) = i
end do
deallocate (a)
r = r .or. allocated (a)
end do
!$omp end parallel do
if (r) call abort
end program pr27916
/libgomp.fortran/lib4.f90
0,0 → 1,16
! { dg-do run }
 
program lib4
use omp_lib
integer (omp_sched_kind) :: kind
integer :: modifier
call omp_set_schedule (omp_sched_static, 32)
call omp_get_schedule (kind, modifier)
if (kind.ne.omp_sched_static.or.modifier.ne.32) call abort
call omp_set_schedule (omp_sched_dynamic, 4)
call omp_get_schedule (kind, modifier)
if (kind.ne.omp_sched_dynamic.or.modifier.ne.4) call abort
if (omp_get_thread_limit ().lt.0) call abort
call omp_set_max_active_levels (6)
if (omp_get_max_active_levels ().ne.6) call abort
end program lib4
/libgomp.fortran/nestedfn4.f90
0,0 → 1,41
program foo
integer :: i, j, k
integer :: a(10), c(10)
k = 2
a(:) = 0
call test1
call test2
do i = 1, 10
if (a(i) .ne. 10 * i) call abort
end do
!$omp parallel do reduction (+:c)
do i = 1, 10
c = c + a
end do
do i = 1, 10
if (c(i) .ne. 10 * a(i)) call abort
end do
!$omp parallel do lastprivate (j)
do j = 1, 10, k
end do
if (j .ne. 11) call abort
contains
subroutine test1
integer :: i
integer :: b(10)
do i = 1, 10
b(i) = i
end do
c(:) = 0
!$omp parallel do reduction (+:a)
do i = 1, 10
a = a + b
end do
end subroutine test1
subroutine test2
!$omp parallel do lastprivate (j)
do j = 1, 10, k
end do
if (j .ne. 11) call abort
end subroutine test2
end program foo
/libgomp.fortran/condinc3.f90
0,0 → 1,7
! { dg-options "-fopenmp" }
program condinc3
logical l
l = .false.
!$ include 'condinc1.inc'
stop 2
end
/libgomp.fortran/condinc4.f90
0,0 → 1,7
! { dg-options "-fno-openmp" }
program condinc4
logical l
l = .true.
!$ include 'condinc1.inc'
return
end
/libgomp.fortran/pr25162.f
0,0 → 1,40
C PR fortran/25162
C { dg-do run }
C { dg-require-effective-target tls_runtime }
PROGRAM PR25162
CALL TEST1
CALL TEST2
END
SUBROUTINE TEST1
DOUBLE PRECISION BPRIM
COMMON /TESTCOM/ BPRIM(100)
C$OMP THREADPRIVATE(/TESTCOM/)
INTEGER I
DO I = 1, 100
BPRIM( I ) = DBLE( I )
END DO
RETURN
END
SUBROUTINE TEST2
DOUBLE PRECISION BPRIM
COMMON /TESTCOM/ BPRIM(100)
C$OMP THREADPRIVATE(/TESTCOM/)
INTEGER I, IDUM(50)
DO I = 1, 50
IDUM(I) = I
END DO
C$OMP PARALLEL COPYIN(/TESTCOM/) NUM_THREADS(4)
CALL TEST3
C$OMP END PARALLEL
RETURN
END
SUBROUTINE TEST3
DOUBLE PRECISION BPRIM
COMMON /TESTCOM/ BPRIM(100)
C$OMP THREADPRIVATE(/TESTCOM/)
INTEGER K
DO K = 1, 10
IF (K.NE.BPRIM(K)) CALL ABORT
END DO
RETURN
END
/libgomp.fortran/pr28390.f
0,0 → 1,8
! PR fortran/28390
program pr28390
integer i
!$omp parallel do lastprivate(i)
do i=1,100
end do
if (i.ne.101) call abort
end
/libgomp.fortran/reference1.f90
0,0 → 1,34
! { dg-do run }
!$ use omp_lib
 
integer :: i, j, k
double precision :: d
i = 6
j = 19
k = 0
d = 24.5
call test (i, j, k, d)
if (i .ne. 38) call abort
if (iand (k, 255) .ne. 0) call abort
if (iand (k, 65280) .eq. 0) then
if (k .ne. 65536 * 4) call abort
end if
contains
subroutine test (i, j, k, d)
integer :: i, j, k
double precision :: d
 
!$omp parallel firstprivate (d) private (j) num_threads (4) reduction (+:k)
if (i .ne. 6 .or. d .ne. 24.5 .or. k .ne. 0) k = k + 1
if (omp_get_num_threads () .ne. 4) k = k + 256
d = d / 2
j = 8
k = k + 65536
!$omp barrier
if (d .ne. 12.25 .or. j .ne. 8) k = k + 1
!$omp single
i = i + 32
!$omp end single nowait
!$omp end parallel
end subroutine test
end
/libgomp.fortran/reference2.f90
0,0 → 1,21
! { dg-do run }
real, dimension (5) :: b
b = 5
call foo (b)
contains
subroutine foo (a)
real, dimension (5) :: a
logical :: l
l = .false.
!$omp parallel private (a) reduction (.or.:l)
a = 15
l = bar (a)
!$omp end parallel
if (l) call abort
end subroutine
function bar (a)
real, dimension (5) :: a
logical :: bar
bar = any (a .ne. 15)
end function
end
/libgomp.fortran/collapse1.f90
0,0 → 1,26
! { dg-do run }
 
program collapse1
integer :: i, j, k, a(1:3, 4:6, 5:7)
logical :: l
l = .false.
a(:, :, :) = 0
!$omp parallel do collapse(4 - 1) schedule(static, 4)
do i = 1, 3
do j = 4, 6
do k = 5, 7
a(i, j, k) = i + j + k
end do
end do
end do
!$omp parallel do collapse(2) reduction(.or.:l)
do i = 1, 3
do j = 4, 6
do k = 5, 7
if (a(i, j, k) .ne. (i + j + k)) l = .true.
end do
end do
end do
!$omp end parallel do
if (l) call abort
end program collapse1
/libgomp.fortran/collapse2.f90
0,0 → 1,53
! { dg-do run }
 
program collapse2
call test1
call test2
contains
subroutine test1
integer :: i, j, k, a(1:3, 4:6, 5:7)
logical :: l
l = .false.
a(:, :, :) = 0
!$omp parallel do collapse(4 - 1) schedule(static, 4)
do 164 i = 1, 3
do 164 j = 4, 6
do 164 k = 5, 7
a(i, j, k) = i + j + k
164 end do
!$omp parallel do collapse(2) reduction(.or.:l)
firstdo: do i = 1, 3
do j = 4, 6
do k = 5, 7
if (a(i, j, k) .ne. (i + j + k)) l = .true.
end do
end do
end do firstdo
!$omp end parallel do
if (l) call abort
end subroutine test1
 
subroutine test2
integer :: a(3,3,3), k, kk, kkk, l, ll, lll
!$omp do collapse(3)
do 115 k=1,3
dokk: do kk=1,3
do kkk=1,3
a(k,kk,kkk) = 1
enddo
enddo dokk
115 continue
if (any(a(1:3,1:3,1:3).ne.1)) call abort
 
!$omp do collapse(3)
dol: do 120 l=1,3
doll: do ll=1,3
do lll=1,3
a(l,ll,lll) = 2
enddo
enddo doll
120 end do dol
if (any(a(1:3,1:3,1:3).ne.2)) call abort
end subroutine test2
 
end program collapse2
/libgomp.fortran/collapse3.f90
0,0 → 1,204
! { dg-do run }
 
program collapse3
call test1
call test2 (2, 6, -2, 4, 13, 18)
call test3 (2, 6, -2, 4, 13, 18, 1, 1, 1)
call test4
call test5 (2, 6, -2, 4, 13, 18)
call test6 (2, 6, -2, 4, 13, 18, 1, 1, 1)
contains
subroutine test1
integer :: i, j, k, a(1:7, -3:5, 12:19), m
logical :: l
l = .false.
a(:, :, :) = 0
!$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l)
do i = 2, 6
do j = -2, 4
do k = 13, 18
l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
l = l.or.k.lt.13.or.k.gt.18
if (.not.l) a(i, j, k) = a(i, j, k) + 1
m = i * 100 + j * 10 + k
end do
end do
end do
if (i.ne.7.or.j.ne.5.or.k.ne.19) call abort
if (m.ne.(600+40+18)) call abort
do i = 1, 7
do j = -3, 5
do k = 12, 19
if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
if (a(i, j, k).ne.0) print *, i, j, k
else
if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
end if
end do
end do
end do
end subroutine test1
 
subroutine test2(v1, v2, v3, v4, v5, v6)
integer :: i, j, k, a(1:7, -3:5, 12:19), m
integer :: v1, v2, v3, v4, v5, v6
logical :: l
l = .false.
a(:, :, :) = 0
!$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l)
do i = v1, v2
do j = v3, v4
do k = v5, v6
l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
l = l.or.k.lt.13.or.k.gt.18
if (.not.l) a(i, j, k) = a(i, j, k) + 1
m = i * 100 + j * 10 + k
end do
end do
end do
if (i.ne.7.or.j.ne.5.or.k.ne.19) call abort
if (m.ne.(600+40+18)) call abort
do i = 1, 7
do j = -3, 5
do k = 12, 19
if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
if (a(i, j, k).ne.0) print *, i, j, k
else
if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
end if
end do
end do
end do
end subroutine test2
 
subroutine test3(v1, v2, v3, v4, v5, v6, v7, v8, v9)
integer :: i, j, k, a(1:7, -3:5, 12:19), m
integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
logical :: l
l = .false.
a(:, :, :) = 0
!$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l)
do i = v1, v2, v7
do j = v3, v4, v8
do k = v5, v6, v9
l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
l = l.or.k.lt.13.or.k.gt.18
if (.not.l) a(i, j, k) = a(i, j, k) + 1
m = i * 100 + j * 10 + k
end do
end do
end do
if (i.ne.7.or.j.ne.5.or.k.ne.19) call abort
if (m.ne.(600+40+18)) call abort
do i = 1, 7
do j = -3, 5
do k = 12, 19
if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
if (a(i, j, k).ne.0) print *, i, j, k
else
if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
end if
end do
end do
end do
end subroutine test3
 
subroutine test4
integer :: i, j, k, a(1:7, -3:5, 12:19), m
logical :: l
l = .false.
a(:, :, :) = 0
!$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l) &
!$omp& schedule (dynamic, 5)
do i = 2, 6
do j = -2, 4
do k = 13, 18
l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
l = l.or.k.lt.13.or.k.gt.18
if (.not.l) a(i, j, k) = a(i, j, k) + 1
m = i * 100 + j * 10 + k
end do
end do
end do
if (i.ne.7.or.j.ne.5.or.k.ne.19) call abort
if (m.ne.(600+40+18)) call abort
do i = 1, 7
do j = -3, 5
do k = 12, 19
if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
if (a(i, j, k).ne.0) print *, i, j, k
else
if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
end if
end do
end do
end do
end subroutine test4
 
subroutine test5(v1, v2, v3, v4, v5, v6)
integer :: i, j, k, a(1:7, -3:5, 12:19), m
integer :: v1, v2, v3, v4, v5, v6
logical :: l
l = .false.
a(:, :, :) = 0
!$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l) &
!$omp & schedule (guided)
do i = v1, v2
do j = v3, v4
do k = v5, v6
l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
l = l.or.k.lt.13.or.k.gt.18
if (.not.l) a(i, j, k) = a(i, j, k) + 1
m = i * 100 + j * 10 + k
end do
end do
end do
if (i.ne.7.or.j.ne.5.or.k.ne.19) call abort
if (m.ne.(600+40+18)) call abort
do i = 1, 7
do j = -3, 5
do k = 12, 19
if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
if (a(i, j, k).ne.0) print *, i, j, k
else
if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
end if
end do
end do
end do
end subroutine test5
 
subroutine test6(v1, v2, v3, v4, v5, v6, v7, v8, v9)
integer :: i, j, k, a(1:7, -3:5, 12:19), m
integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
logical :: l
l = .false.
a(:, :, :) = 0
!$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l) &
!$omp & schedule (dynamic)
do i = v1, v2, v7
do j = v3, v4, v8
do k = v5, v6, v9
l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
l = l.or.k.lt.13.or.k.gt.18
if (.not.l) a(i, j, k) = a(i, j, k) + 1
m = i * 100 + j * 10 + k
end do
end do
end do
if (i.ne.7.or.j.ne.5.or.k.ne.19) call abort
if (m.ne.(600+40+18)) call abort
do i = 1, 7
do j = -3, 5
do k = 12, 19
if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
if (a(i, j, k).ne.0) print *, i, j, k
else
if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
end if
end do
end do
end do
end subroutine test6
 
end program collapse3
/libgomp.fortran/lock-1.f90
0,0 → 1,24
! { dg-do run }
 
use omp_lib
 
integer (kind = omp_nest_lock_kind) :: lock
logical :: l
 
l = .false.
call omp_init_nest_lock (lock)
if (omp_test_nest_lock (lock) .ne. 1) call abort
if (omp_test_nest_lock (lock) .ne. 2) call abort
!$omp parallel if (.false.) reduction (.or.:l)
! In OpenMP 2.5 this was supposed to return 3,
! but in OpenMP 3.0 the parallel region has a different
! task and omp_*_lock_t are owned by tasks, not by threads.
if (omp_test_nest_lock (lock) .ne. 0) l = .true.
!$omp end parallel
if (l) call abort
if (omp_test_nest_lock (lock) .ne. 3) call abort
call omp_unset_nest_lock (lock)
call omp_unset_nest_lock (lock)
call omp_unset_nest_lock (lock)
call omp_destroy_nest_lock (lock)
end
/libgomp.fortran/collapse4.f90
0,0 → 1,12
! { dg-do run }
 
integer :: i, j, k
!$omp parallel do lastprivate (i, j, k) collapse (3)
do i = 0, 17
do j = 0, 6
do k = 0, 5
end do
end do
end do
if (i .ne. 18 .or. j .ne. 7 .or. k .ne. 6) call abort
end
/libgomp.fortran/lock-2.f90
0,0 → 1,24
! { dg-do run }
 
use omp_lib
 
integer (kind = omp_nest_lock_kind) :: lock
logical :: l
 
l = .false.
call omp_init_nest_lock (lock)
!$omp parallel num_threads (1) reduction (.or.:l)
if (omp_test_nest_lock (lock) .ne. 1) call abort
if (omp_test_nest_lock (lock) .ne. 2) call abort
!$omp task if (.false.) shared (lock, l)
if (omp_test_nest_lock (lock) .ne. 0) l = .true.
!$omp end task
!$omp taskwait
if (omp_test_nest_lock (lock) .ne. 3) l = .true.
call omp_unset_nest_lock (lock)
call omp_unset_nest_lock (lock)
call omp_unset_nest_lock (lock)
!$omp end parallel
if (l) call abort
call omp_destroy_nest_lock (lock)
end
/libgomp.fortran/omp_workshare1.f
0,0 → 1,48
C******************************************************************************
C FILE: omp_workshare1.f
C DESCRIPTION:
C OpenMP Example - Loop Work-sharing - Fortran Version
C In this example, the iterations of a loop are scheduled dynamically
C across the team of threads. A thread will perform CHUNK iterations
C at a time before being scheduled for the next CHUNK of work.
C AUTHOR: Blaise Barney 5/99
C LAST REVISED: 01/09/04
C******************************************************************************
 
PROGRAM WORKSHARE1
 
INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS,
+ OMP_GET_THREAD_NUM, N, CHUNKSIZE, CHUNK, I
PARAMETER (N=100)
PARAMETER (CHUNKSIZE=10)
REAL A(N), B(N), C(N)
 
! Some initializations
DO I = 1, N
A(I) = I * 1.0
B(I) = A(I)
ENDDO
CHUNK = CHUNKSIZE
 
!$OMP PARALLEL SHARED(A,B,C,NTHREADS,CHUNK) PRIVATE(I,TID)
 
TID = OMP_GET_THREAD_NUM()
IF (TID .EQ. 0) THEN
NTHREADS = OMP_GET_NUM_THREADS()
PRINT *, 'Number of threads =', NTHREADS
END IF
PRINT *, 'Thread',TID,' starting...'
 
!$OMP DO SCHEDULE(DYNAMIC,CHUNK)
DO I = 1, N
C(I) = A(I) + B(I)
WRITE(*,100) TID,I,C(I)
100 FORMAT(' Thread',I2,': C(',I3,')=',F8.2)
ENDDO
!$OMP END DO NOWAIT
 
PRINT *, 'Thread',TID,' done.'
 
!$OMP END PARALLEL
 
END
/libgomp.fortran/omp_orphan.f
0,0 → 1,44
C******************************************************************************
C FILE: omp_orphan.f
C DESCRIPTION:
C OpenMP Example - Parallel region with an orphaned directive - Fortran
C Version
C This example demonstrates a dot product being performed by an orphaned
C loop reduction construct. Scoping of the reduction variable is critical.
C AUTHOR: Blaise Barney 5/99
C LAST REVISED:
C******************************************************************************
 
PROGRAM ORPHAN
COMMON /DOTDATA/ A, B, SUM
INTEGER I, VECLEN
PARAMETER (VECLEN = 100)
REAL*8 A(VECLEN), B(VECLEN), SUM
 
DO I=1, VECLEN
A(I) = 1.0 * I
B(I) = A(I)
ENDDO
SUM = 0.0
!$OMP PARALLEL
CALL DOTPROD
!$OMP END PARALLEL
WRITE(*,*) "Sum = ", SUM
END
 
 
 
SUBROUTINE DOTPROD
COMMON /DOTDATA/ A, B, SUM
INTEGER I, TID, OMP_GET_THREAD_NUM, VECLEN
PARAMETER (VECLEN = 100)
REAL*8 A(VECLEN), B(VECLEN), SUM
 
TID = OMP_GET_THREAD_NUM()
!$OMP DO REDUCTION(+:SUM)
DO I=1, VECLEN
SUM = SUM + (A(I)*B(I))
PRINT *, ' TID= ',TID,'I= ',I
ENDDO
RETURN
END
/libgomp.fortran/pointer1.f90
0,0 → 1,77
! { dg-do run }
integer, pointer :: a, c(:)
integer, target :: b, d(10)
b = 0
a => b
d = 0
c => d
call foo (a, c)
b = 0
d = 0
call bar (a, c)
contains
subroutine foo (a, c)
integer, pointer :: a, c(:), b, d(:)
integer :: r, r2
r = 0
!$omp parallel firstprivate (a, c) reduction (+:r)
!$omp atomic
a = a + 1
!$omp atomic
c(1) = c(1) + 1
r = r + 1
!$omp end parallel
if (a.ne.r.or.c(1).ne.r) call abort
r2 = r
b => a
d => c
r = 0
!$omp parallel firstprivate (b, d) reduction (+:r)
!$omp atomic
b = b + 1
!$omp atomic
d(1) = d(1) + 1
r = r + 1
!$omp end parallel
if (b.ne.r+r2.or.d(1).ne.r+r2) call abort
end subroutine foo
subroutine bar (a, c)
integer, pointer :: a, c(:), b, d(:)
integer, target :: q, r(5)
integer :: i
q = 17
r = 21
b => a
d => c
!$omp parallel do firstprivate (a, c) lastprivate (a, c)
do i = 1, 100
!$omp atomic
a = a + 1
!$omp atomic
c((i+9)/10) = c((i+9)/10) + 1
if (i.eq.100) then
a => q
c => r
end if
end do
!$omp end parallel do
if (b.ne.100.or.any(d.ne.10)) call abort
if (a.ne.17.or.any(c.ne.21)) call abort
a => b
c => d
!$omp parallel do firstprivate (b, d) lastprivate (b, d)
do i = 1, 100
!$omp atomic
b = b + 1
!$omp atomic
d((i+9)/10) = d((i+9)/10) + 1
if (i.eq.100) then
b => q
d => r
end if
end do
!$omp end parallel do
if (a.ne.200.or.any(c.ne.20)) call abort
if (b.ne.17.or.any(d.ne.21)) call abort
end subroutine bar
end
/libgomp.fortran/tabs2.f
0,0 → 1,13
! { dg-options "-ffixed-form" }
if (b().ne.2) call abort
contains
subroutine a
!$omp parallel
!$omp end parallel
end subroutine a
function b()
integer :: b
b = 1
!$ b = 2
end function b
end
/libgomp.fortran/pointer2.f90
0,0 → 1,28
! { dg-do run }
! { dg-require-effective-target tls_runtime }
integer, pointer, save :: thr(:)
!$omp threadprivate (thr)
integer, target :: s(3), t(3), u(3)
integer :: i
logical :: l
s = 2
t = 7
u = 13
thr => t
l = .false.
i = 0
!$omp parallel copyin (thr) reduction(.or.:l) reduction(+:i)
if (any (thr.ne.7)) l = .true.
thr => s
!$omp master
thr => u
!$omp end master
!$omp atomic
thr(1) = thr(1) + 1
i = i + 1
!$omp end parallel
if (l) call abort
if (thr(1).ne.14) call abort
if (s(1).ne.1+i) call abort
if (u(1).ne.14) call abort
end
/libgomp.fortran/nested1.f90
0,0 → 1,87
! { dg-do run }
program nested1
use omp_lib
integer :: e1, e2, e3, e
integer :: tn1, tn2, tn3
e1 = 0
e2 = 0
e3 = 0
call omp_set_nested (.true.)
call omp_set_dynamic (.false.)
if (omp_in_parallel ()) call abort
if (omp_get_num_threads ().ne.1) call abort
if (omp_get_level ().ne.0) call abort
if (omp_get_ancestor_thread_num (0).ne.0) call abort
if (omp_get_ancestor_thread_num (-1).ne.-1) call abort
if (omp_get_ancestor_thread_num (1).ne.-1) call abort
if (omp_get_team_size (0).ne.1) call abort
if (omp_get_team_size (-1).ne.-1) call abort
if (omp_get_team_size (1).ne.-1) call abort
if (omp_get_active_level ().ne.0) call abort
!$omp parallel num_threads (4) private (e, tn1)
e = 0
tn1 = omp_get_thread_num ()
if (.not.omp_in_parallel ()) e = e + 1
if (omp_get_num_threads ().ne.4) e = e + 1
if (tn1.lt.0.or.tn1.ge.4) e = e + 1
if (omp_get_level ().ne.1) e = e + 1
if (omp_get_ancestor_thread_num (0).ne.0) e = e + 1
if (omp_get_ancestor_thread_num (1).ne.tn1) e = e + 1
if (omp_get_ancestor_thread_num (-1).ne.-1) e = e + 1
if (omp_get_ancestor_thread_num (2).ne.-1) e = e + 1
if (omp_get_team_size (0).ne.1) e = e + 1
if (omp_get_team_size (1).ne.4) e = e + 1
if (omp_get_team_size (-1).ne.-1) e = e + 1
if (omp_get_team_size (2).ne.-1) e = e + 1
if (omp_get_active_level ().ne.1) e = e + 1
!$omp atomic
e1 = e1 + e
!$omp parallel num_threads (5) if (.false.) firstprivate (tn1) &
!$omp& private (e, tn2)
e = 0
tn2 = omp_get_thread_num ()
if (.not.omp_in_parallel ()) e = e + 1
if (omp_get_num_threads ().ne.1) e = e + 1
if (tn2.ne.0) e = e + 1
if (omp_get_level ().ne.2) e = e + 1
if (omp_get_ancestor_thread_num (0).ne.0) e = e + 1
if (omp_get_ancestor_thread_num (1).ne.tn1) e = e + 1
if (omp_get_ancestor_thread_num (2).ne.tn2) e = e + 1
if (omp_get_ancestor_thread_num (-1).ne.-1) e = e + 1
if (omp_get_ancestor_thread_num (3).ne.-1) e = e + 1
if (omp_get_team_size (0).ne.1) e = e + 1
if (omp_get_team_size (1).ne.4) e = e + 1
if (omp_get_team_size (2).ne.1) e = e + 1
if (omp_get_team_size (-1).ne.-1) e = e + 1
if (omp_get_team_size (3).ne.-1) e = e + 1
if (omp_get_active_level ().ne.1) e = e + 1
!$omp atomic
e2 = e2 + e
!$omp parallel num_threads (2) firstprivate (tn1, tn2) &
!$omp& private (e, tn3)
e = 0
tn3 = omp_get_thread_num ()
if (.not.omp_in_parallel ()) e = e + 1
if (omp_get_num_threads ().ne.2) e = e + 1
if (tn3.lt.0.or.tn3.ge.2) e = e + 1
if (omp_get_level ().ne.3) e = e + 1
if (omp_get_ancestor_thread_num (0).ne.0) e = e + 1
if (omp_get_ancestor_thread_num (1).ne.tn1) e = e + 1
if (omp_get_ancestor_thread_num (2).ne.tn2) e = e + 1
if (omp_get_ancestor_thread_num (3).ne.tn3) e = e + 1
if (omp_get_ancestor_thread_num (-1).ne.-1) e = e + 1
if (omp_get_ancestor_thread_num (4).ne.-1) e = e + 1
if (omp_get_team_size (0).ne.1) e = e + 1
if (omp_get_team_size (1).ne.4) e = e + 1
if (omp_get_team_size (2).ne.1) e = e + 1
if (omp_get_team_size (3).ne.2) e = e + 1
if (omp_get_team_size (-1).ne.-1) e = e + 1
if (omp_get_team_size (4).ne.-1) e = e + 1
if (omp_get_active_level ().ne.2) e = e + 1
!$omp atomic
e3 = e3 + e
!$omp end parallel
!$omp end parallel
!$omp end parallel
if (e1.ne.0.or.e2.ne.0.or.e3.ne.0) call abort
end program nested1
/libgomp.fortran/omp_hello.f
0,0 → 1,36
C******************************************************************************
C FILE: omp_hello.f
C DESCRIPTION:
C OpenMP Example - Hello World - Fortran Version
C In this simple example, the master thread forks a parallel region.
C All threads in the team obtain their unique thread number and print it.
C The master thread only prints the total number of threads. Two OpenMP
C library routines are used to obtain the number of threads and each
C thread's number.
C AUTHOR: Blaise Barney 5/99
C LAST REVISED:
C******************************************************************************
 
PROGRAM HELLO
 
INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS,
+ OMP_GET_THREAD_NUM
 
C Fork a team of threads giving them their own copies of variables
!$OMP PARALLEL PRIVATE(NTHREADS, TID)
 
 
C Obtain thread number
TID = OMP_GET_THREAD_NUM()
PRINT *, 'Hello World from thread = ', TID
 
C Only master thread does this
IF (TID .EQ. 0) THEN
NTHREADS = OMP_GET_NUM_THREADS()
PRINT *, 'Number of threads = ', NTHREADS
END IF
 
C All threads join master thread and disband
!$OMP END PARALLEL
 
END
/libgomp.fortran/omp_cond2.f
0,0 → 1,22
c Test conditional compilation in fixed form if -fno-openmp
! { dg-options "-fno-openmp" }
10 foo = 2
&56
if (foo.ne.256) call abort
bar = 26
!$2 0 ba
c$ +r = 42
!$ bar = 62
!$ bar = bar + 1
if (bar.ne.26) call abort
baz = bar
*$ 0baz = 5
C$ +12! Comment
c$ !4
!$ +!Another comment
*$ &2
!$ X baz = 0 ! Not valid OpenMP conditional compilation lines
! $ baz = 1
c$ 10&baz = 2
if (baz.ne.26) call abort
end
/libgomp.fortran/omp_atomic1.f90
0,0 → 1,39
! { dg-do run }
integer (kind = 4) :: a
integer (kind = 2) :: b
real :: c, f
double precision :: d
integer, dimension (10) :: e
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
!$omp atomic
a = a + 4
!$omp atomic
b = 4 - b
!$omp atomic
c = c * 2
!$omp atomic
d = 2 / d
if (a .ne. 5 .or. b .ne. 2 .or. c .ne. 6 .or. d .ne. 0.5) call abort
d = 1.2
!$omp atomic
a = a + c + d
!$omp atomic
b = b - (a + c + d)
if (a .ne. 12 .or. b .ne. -17) call abort
!$omp atomic
a = c + d + a
!$omp atomic
b = a + c + d - b
if (a .ne. 19 .or. b .ne. 43) call abort
!$omp atomic
b = (a + c + d) - b
a = 32
!$omp atomic
a = a / 3.4
if (a .ne. 9 .or. b .ne. -16) call abort
end
/libgomp.fortran/fortran.exp
0,0 → 1,61
load_lib libgomp-dg.exp
 
global shlib_ext
global ALWAYS_CFLAGS
 
set shlib_ext [get_shlib_extension]
set lang_library_path "../libgfortran/.libs"
set lang_link_flags "-lgfortran"
set lang_test_file_found 0
set quadmath_library_path "../libquadmath/.libs"
 
 
# Initialize dg.
dg-init
 
if { $blddir != "" } {
# Look for a static libgfortran first.
if [file exists "${blddir}/${lang_library_path}/libgfortran.a"] {
set lang_test_file "${lang_library_path}/libgfortran.a"
set lang_test_file_found 1
# We may have a shared only build, so look for a shared libgfortran.
} elseif [file exists "${blddir}/${lang_library_path}/libgfortran.${shlib_ext}"] {
set lang_test_file "${lang_library_path}/libgfortran.${shlib_ext}"
set lang_test_file_found 1
} else {
puts "No libgfortran library found, will not execute fortran tests"
}
} elseif [info exists GFORTRAN_UNDER_TEST] {
set lang_test_file_found 1
# Needs to exist for libgomp.exp.
set lang_test_file ""
} else {
puts "GFORTRAN_UNDER_TEST not defined, will not execute fortran tests"
}
 
if { $lang_test_file_found } {
# Gather a list of all tests.
set tests [lsort [find $srcdir/$subdir *.\[fF\]{,90,95,03,08}]]
 
if { $blddir != "" } {
if { [file exists "${blddir}/${quadmath_library_path}/libquadmath.a"]
|| [file exists "${blddir}/${quadmath_library_path}/libquadmath.${shlib_ext}"] } {
lappend ALWAYS_CFLAGS "ldflags=-L${blddir}/${quadmath_library_path}/"
# Allow for spec subsitution.
lappend ALWAYS_CFLAGS "additional_flags=-B${blddir}/${quadmath_library_path}/"
set ld_library_path "$always_ld_library_path:${blddir}/${lang_library_path}:${blddir}/${quadmath_library_path}"
} else {
set ld_library_path "$always_ld_library_path:${blddir}/${lang_library_path}"
}
} else {
set ld_library_path "$always_ld_library_path"
}
append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
set_ld_library_path_env_vars
 
# Main loop.
gfortran-dg-runtest $tests ""
}
 
# All done.
dg-finish
/libgomp.fortran/omp_atomic2.f90
0,0 → 1,54
! { dg-do run }
real, dimension (20) :: r
integer, dimension (20) :: d
integer :: i, j, k, n
integer (kind = 2) :: a, b, c
 
do 10 i = 1, 20
r(i) = i
10 d(i) = 21 - i
 
n = 20
call foo (r, d, n)
 
if (n .ne. 22) call abort
if (any (r .ne. 33)) call abort
 
i = 1
j = 18
k = 23
!$omp atomic
i = min (i, j, k, n)
if (i .ne. 1) call abort
!$omp atomic
i = max (j, n, k, i)
if (i .ne. 23) call abort
 
a = 1
b = 18
c = 23
!$omp atomic
a = min (a, b, c)
if (a .ne. 1) call abort
!$omp atomic
a = max (a, b, c)
if (a .ne. 23) call abort
 
contains
function bar (i)
real bar
integer i
bar = 12.0 + i
end function bar
 
subroutine foo (x, y, n)
integer i, y (*), n
real x (*)
do i = 1, n
!$omp atomic
x(y(i)) = x(y(i)) + bar (i)
end do
!$omp atomic
n = n + 2
end subroutine foo
end
/libgomp.fortran/omp_atomic3.f90
0,0 → 1,58
! { dg-do run }
integer (kind = 4) :: a, a2
integer (kind = 2) :: b, b2
real :: c, f
double precision :: d, d2, c2
integer, dimension (10) :: e
!$omp atomic write
a = 1
!$omp atomic write
b = 2
!$omp end atomic
!$omp atomic write
c = 3
!$omp atomic write
d = 1 + 2 + 3 - 2
e = 5
!$omp atomic write
f = 6
!$omp end atomic
!$omp atomic
a = a + 4
!$omp end atomic
!$omp atomic update
b = 4 - b
!$omp atomic
c = c * 2
!$omp atomic update
d = 2 / d
!$omp end atomic
!$omp atomic read
a2 = a
!$omp atomic read
b2 = b
!$omp end atomic
!$omp atomic read
c2 = c
!$omp atomic read
d2 = d
if (a2 .ne. 5 .or. b2 .ne. 2 .or. c2 .ne. 6 .or. d2 .ne. 0.5) call abort
!$omp atomic write
d = 1.2
!$omp atomic
a = a + c + d
!$omp atomic
b = b - (a + c + d)
if (a .ne. 12 .or. b .ne. -17) call abort
!$omp atomic
a = c + d + a
!$omp atomic
b = a + c + d - b
if (a .ne. 19 .or. b .ne. 43) call abort
!$omp atomic
b = (a + c + d) - b
a = 32
!$omp atomic
a = a / 3.4
if (a .ne. 9 .or. b .ne. -16) call abort
end
/libgomp.fortran/tabs1.f90
0,0 → 1,12
if (b().ne.2) call abort
contains
subroutine a
!$omp parallel
!$omp end parallel
end subroutine a
function b()
integer :: b
b = 1
!$ b = 2
end function b
end
/libgomp.fortran/omp_atomic4.f90
0,0 → 1,37
! { dg-do run }
integer (kind = 4) :: a, a2
integer (kind = 2) :: b, b2
real :: c
double precision :: d, d2, c2
integer, dimension (10) :: e
!$omp atomic write
a = 1
!$omp atomic write
b = 2
!$omp atomic write
c = 3
!$omp atomic write
d = 4
!$omp atomic capture
a2 = a
a = a + 4
!$omp end atomic
!$omp atomic capture
b = b - 18
b2 = b
!$omp end atomic
!$omp atomic capture
c2 = c
c = 2.0 * c
!$omp end atomic
!$omp atomic capture
d = d / 2.0
d2 = d
!$omp end atomic
if (a2 .ne. 1 .or. b2 .ne. -16 .or. c2 .ne. 3 .or. d2 .ne. 2) call abort
!$omp atomic read
a2 = a
!$omp atomic read
c2 = c
if (a2 .ne. 5 .or. b2 .ne. -16 .or. c2 .ne. 6 .or. d2 .ne. 2) call abort
end
/libgomp.fortran/sharing1.f90
0,0 → 1,29
! { dg-do run }
 
use omp_lib
integer :: i, j, k
logical :: l
common /b/ i, j
i = 4
j = 8
l = .false.
!$omp parallel private (k) firstprivate (i) shared (j) num_threads (2) &
!$omp& reduction (.or.:l)
if (i .ne. 4 .or. j .ne. 8) l = .true.
!$omp barrier
k = omp_get_thread_num ()
if (k .eq. 0) then
i = 14
j = 15
end if
!$omp barrier
if (k .eq. 1) then
if (i .ne. 4 .or. j .ne. 15) l = .true.
i = 24
j = 25
end if
!$omp barrier
if (j .ne. 25 .or. i .ne. (k * 10 + 14)) l = .true.
!$omp end parallel
if (l .or. j .ne. 25) call abort
end
/libgomp.fortran/sharing2.f90
0,0 → 1,32
! { dg-do run }
 
use omp_lib
integer :: i, j, k, m, n
logical :: l
equivalence (i, m)
equivalence (j, n)
i = 4
j = 8
l = .false.
!$omp parallel private (k) firstprivate (i) shared (j) num_threads (2) &
!$omp& reduction (.or.:l)
l = l .or. i .ne. 4
l = l .or. j .ne. 8
!$omp barrier
k = omp_get_thread_num ()
if (k .eq. 0) then
i = 14
j = 15
end if
!$omp barrier
if (k .eq. 1) then
if (i .ne. 4 .or. j .ne. 15) l = .true.
i = 24
j = 25
end if
!$omp barrier
if (j .ne. 25 .or. i .ne. (k * 10 + 14)) l = .true.
!$omp end parallel
if (l) call abort
if (j .ne. 25) call abort
end
/libgomp.fortran/pr35130.f90
0,0 → 1,20
! PR middle-end/35130
 
program pr35130
implicit none
real, dimension(20) :: a
integer :: k
a(:) = 0.0
!$omp parallel do private(k)
do k=1,size(a)
call inner(k)
end do
!$omp end parallel do
if (any (a.ne.42)) call abort
contains
subroutine inner(i)
implicit none
integer :: i
a(i) = 42
end subroutine inner
end program pr35130
/libgomp.fortran/lib2.f
0,0 → 1,76
C { dg-do run }
 
USE OMP_LIB
 
DOUBLE PRECISION :: D, E
LOGICAL :: L
INTEGER (KIND = OMP_LOCK_KIND) :: LCK
INTEGER (KIND = OMP_NEST_LOCK_KIND) :: NLCK
 
D = OMP_GET_WTIME ()
 
CALL OMP_INIT_LOCK (LCK)
CALL OMP_SET_LOCK (LCK)
IF (OMP_TEST_LOCK (LCK)) CALL ABORT
CALL OMP_UNSET_LOCK (LCK)
IF (.NOT. OMP_TEST_LOCK (LCK)) CALL ABORT
IF (OMP_TEST_LOCK (LCK)) CALL ABORT
CALL OMP_UNSET_LOCK (LCK)
CALL OMP_DESTROY_LOCK (LCK)
 
CALL OMP_INIT_NEST_LOCK (NLCK)
IF (OMP_TEST_NEST_LOCK (NLCK) .NE. 1) CALL ABORT
CALL OMP_SET_NEST_LOCK (NLCK)
IF (OMP_TEST_NEST_LOCK (NLCK) .NE. 3) CALL ABORT
CALL OMP_UNSET_NEST_LOCK (NLCK)
CALL OMP_UNSET_NEST_LOCK (NLCK)
IF (OMP_TEST_NEST_LOCK (NLCK) .NE. 2) CALL ABORT
CALL OMP_UNSET_NEST_LOCK (NLCK)
CALL OMP_UNSET_NEST_LOCK (NLCK)
CALL OMP_DESTROY_NEST_LOCK (NLCK)
 
CALL OMP_SET_DYNAMIC (.TRUE.)
IF (.NOT. OMP_GET_DYNAMIC ()) CALL ABORT
CALL OMP_SET_DYNAMIC (.FALSE.)
IF (OMP_GET_DYNAMIC ()) CALL ABORT
 
CALL OMP_SET_NESTED (.TRUE.)
IF (.NOT. OMP_GET_NESTED ()) CALL ABORT
CALL OMP_SET_NESTED (.FALSE.)
IF (OMP_GET_NESTED ()) CALL ABORT
 
CALL OMP_SET_NUM_THREADS (5)
IF (OMP_GET_NUM_THREADS () .NE. 1) CALL ABORT
IF (OMP_GET_MAX_THREADS () .NE. 5) CALL ABORT
IF (OMP_GET_THREAD_NUM () .NE. 0) CALL ABORT
CALL OMP_SET_NUM_THREADS (3)
IF (OMP_GET_NUM_THREADS () .NE. 1) CALL ABORT
IF (OMP_GET_MAX_THREADS () .NE. 3) CALL ABORT
IF (OMP_GET_THREAD_NUM () .NE. 0) CALL ABORT
L = .FALSE.
C$OMP PARALLEL REDUCTION (.OR.:L)
L = OMP_GET_NUM_THREADS () .NE. 3
L = L .OR. (OMP_GET_THREAD_NUM () .LT. 0)
L = L .OR. (OMP_GET_THREAD_NUM () .GE. 3)
C$OMP MASTER
L = L .OR. (OMP_GET_THREAD_NUM () .NE. 0)
C$OMP END MASTER
C$OMP END PARALLEL
IF (L) CALL ABORT
 
IF (OMP_GET_NUM_PROCS () .LE. 0) CALL ABORT
IF (OMP_IN_PARALLEL ()) CALL ABORT
C$OMP PARALLEL REDUCTION (.OR.:L)
L = .NOT. OMP_IN_PARALLEL ()
C$OMP END PARALLEL
C$OMP PARALLEL REDUCTION (.OR.:L) IF (.TRUE.)
L = .NOT. OMP_IN_PARALLEL ()
C$OMP END PARALLEL
 
E = OMP_GET_WTIME ()
IF (D .GT. E) CALL ABORT
D = OMP_GET_WTICK ()
C Negative precision is definitely wrong,
C bigger than 1s clock resolution is also strange
IF (D .LE. 0 .OR. D .GT. 1.) CALL ABORT
END
/libgomp.fortran/lastprivate1.f90
0,0 → 1,126
program lastprivate
integer :: i
common /c/ i
!$omp parallel num_threads (4)
call test1
!$omp end parallel
if (i .ne. 21) call abort
!$omp parallel num_threads (4)
call test2
!$omp end parallel
if (i .ne. 64) call abort
!$omp parallel num_threads (4)
call test3
!$omp end parallel
if (i .ne. 14) call abort
call test4
call test5
call test6
call test7
call test8
call test9
call test10
call test11
call test12
contains
subroutine test1
integer :: i
common /c/ i
!$omp do lastprivate (i)
do i = 1, 20
end do
end subroutine test1
subroutine test2
integer :: i
common /c/ i
!$omp do lastprivate (i)
do i = 7, 61, 3
end do
end subroutine test2
function ret3 ()
integer :: ret3
ret3 = 3
end function ret3
subroutine test3
integer :: i
common /c/ i
!$omp do lastprivate (i)
do i = -10, 11, ret3 ()
end do
end subroutine test3
subroutine test4
integer :: j
!$omp parallel do lastprivate (j) num_threads (4) default (none)
do j = 1, 20
end do
if (j .ne. 21) call abort
end subroutine test4
subroutine test5
integer :: j
!$omp parallel do lastprivate (j) num_threads (4) default (none)
do j = 7, 61, 3
end do
if (j .ne. 64) call abort
end subroutine test5
subroutine test6
integer :: j
!$omp parallel do lastprivate (j) num_threads (4) default (none)
do j = -10, 11, ret3 ()
end do
if (j .ne. 14) call abort
end subroutine test6
subroutine test7
integer :: i
common /c/ i
!$omp parallel do lastprivate (i) num_threads (4) default (none)
do i = 1, 20
end do
if (i .ne. 21) call abort
end subroutine test7
subroutine test8
integer :: i
common /c/ i
!$omp parallel do lastprivate (i) num_threads (4) default (none)
do i = 7, 61, 3
end do
if (i .ne. 64) call abort
end subroutine test8
subroutine test9
integer :: i
common /c/ i
!$omp parallel do lastprivate (i) num_threads (4) default (none)
do i = -10, 11, ret3 ()
end do
if (i .ne. 14) call abort
end subroutine test9
subroutine test10
integer :: i
common /c/ i
!$omp parallel num_threads (4) default (none) shared (i)
!$omp do lastprivate (i)
do i = 1, 20
end do
!$omp end parallel
if (i .ne. 21) call abort
end subroutine test10
subroutine test11
integer :: i
common /c/ i
!$omp parallel num_threads (4) default (none) shared (i)
!$omp do lastprivate (i)
do i = 7, 61, 3
end do
!$omp end parallel
if (i .ne. 64) call abort
end subroutine test11
subroutine test12
integer :: i
common /c/ i
!$omp parallel num_threads (4) default (none) shared (i)
!$omp do lastprivate (i)
do i = -10, 11, ret3 ()
end do
!$omp end parallel
if (i .ne. 14) call abort
end subroutine test12
end program lastprivate
/libgomp.fortran/lastprivate2.f90
0,0 → 1,141
program lastprivate
integer :: i, k
common /c/ i, k
!$omp parallel num_threads (4)
call test1
!$omp end parallel
if (i .ne. 21 .or. k .ne. 20) call abort
!$omp parallel num_threads (4)
call test2
!$omp end parallel
if (i .ne. 64 .or. k .ne. 61) call abort
!$omp parallel num_threads (4)
call test3
!$omp end parallel
if (i .ne. 14 .or. k .ne. 11) call abort
call test4
call test5
call test6
call test7
call test8
call test9
call test10
call test11
call test12
contains
subroutine test1
integer :: i, k
common /c/ i, k
!$omp do lastprivate (i, k)
do i = 1, 20
k = i
end do
end subroutine test1
subroutine test2
integer :: i, k
common /c/ i, k
!$omp do lastprivate (i, k)
do i = 7, 61, 3
k = i
end do
end subroutine test2
function ret3 ()
integer :: ret3
ret3 = 3
end function ret3
subroutine test3
integer :: i, k
common /c/ i, k
!$omp do lastprivate (i, k)
do i = -10, 11, ret3 ()
k = i
end do
end subroutine test3
subroutine test4
integer :: j, l
!$omp parallel do lastprivate (j, l) num_threads (4)
do j = 1, 20
l = j
end do
if (j .ne. 21 .or. l .ne. 20) call abort
end subroutine test4
subroutine test5
integer :: j, l
l = 77
!$omp parallel do lastprivate (j, l) num_threads (4) firstprivate (l)
do j = 7, 61, 3
l = j
end do
if (j .ne. 64 .or. l .ne. 61) call abort
end subroutine test5
subroutine test6
integer :: j, l
!$omp parallel do lastprivate (j, l) num_threads (4)
do j = -10, 11, ret3 ()
l = j
end do
if (j .ne. 14 .or. l .ne. 11) call abort
end subroutine test6
subroutine test7
integer :: i, k
common /c/ i, k
!$omp parallel do lastprivate (i, k) num_threads (4)
do i = 1, 20
k = i
end do
if (i .ne. 21 .or. k .ne. 20) call abort
end subroutine test7
subroutine test8
integer :: i, k
common /c/ i, k
!$omp parallel do lastprivate (i, k) num_threads (4)
do i = 7, 61, 3
k = i
end do
if (i .ne. 64 .or. k .ne. 61) call abort
end subroutine test8
subroutine test9
integer :: i, k
common /c/ i, k
k = 77
!$omp parallel do lastprivate (i, k) num_threads (4) firstprivate (k)
do i = -10, 11, ret3 ()
k = i
end do
if (i .ne. 14 .or. k .ne. 11) call abort
end subroutine test9
subroutine test10
integer :: i, k
common /c/ i, k
!$omp parallel num_threads (4)
!$omp do lastprivate (i, k)
do i = 1, 20
k = i
end do
!$omp end parallel
if (i .ne. 21 .or. k .ne. 20) call abort
end subroutine test10
subroutine test11
integer :: i, k
common /c/ i, k
!$omp parallel num_threads (4)
!$omp do lastprivate (i, k)
do i = 7, 61, 3
k = i
end do
!$omp end parallel
if (i .ne. 64 .or. k .ne. 61) call abort
end subroutine test11
subroutine test12
integer :: i, k
common /c/ i, k
k = 77
!$omp parallel num_threads (4)
!$omp do lastprivate (i, k) firstprivate (k)
do i = -10, 11, ret3 ()
k = i
end do
!$omp end parallel
if (i .ne. 14 .or. k .ne. 11) call abort
end subroutine test12
end program lastprivate
/config/default.exp
0,0 → 1,17
# Copyright (C) 1997, 2009 Free Software Foundation, Inc.
 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
 
load_lib "standard.exp"
/lib/libgomp.exp
0,0 → 1,228
# Damn dejagnu for not having proper library search paths for load_lib.
# We have to explicitly load everything that gcc-dg.exp wants to load.
 
proc load_gcc_lib { filename } {
global srcdir loaded_libs
 
load_file $srcdir/../../gcc/testsuite/lib/$filename
set loaded_libs($filename) ""
}
 
load_lib dg.exp
load_gcc_lib file-format.exp
load_gcc_lib target-supports.exp
load_gcc_lib target-supports-dg.exp
load_gcc_lib scanasm.exp
load_gcc_lib scandump.exp
load_gcc_lib scanrtl.exp
load_gcc_lib scantree.exp
load_gcc_lib scanipa.exp
load_gcc_lib prune.exp
load_gcc_lib target-libpath.exp
load_gcc_lib wrapper.exp
load_gcc_lib gcc-defs.exp
load_gcc_lib torture-options.exp
load_gcc_lib timeout.exp
load_gcc_lib timeout-dg.exp
load_gcc_lib gcc-dg.exp
load_gcc_lib gfortran-dg.exp
 
set dg-do-what-default run
 
#
# GCC_UNDER_TEST is the compiler under test.
#
 
set libgomp_compile_options ""
 
#
# libgomp_init
#
 
if [info exists TOOL_OPTIONS] {
set multilibs [get_multilibs $TOOL_OPTIONS]
} else {
set multilibs [get_multilibs]
}
 
proc libgomp_init { args } {
global srcdir blddir objdir tool_root_dir
global libgomp_initialized
global tmpdir
global blddir
global gluefile wrap_flags
global ALWAYS_CFLAGS
global CFLAGS
global TOOL_EXECUTABLE TOOL_OPTIONS
global GCC_UNDER_TEST
global TESTING_IN_BUILD_TREE
global target_triplet
global always_ld_library_path
 
set blddir [lookfor_file [get_multilibs] libgomp]
 
# We set LC_ALL and LANG to C so that we get the same error
# messages as expected.
setenv LC_ALL C
setenv LANG C
 
# Many hosts now default to a non-ASCII C locale, however, so
# they can set a charset encoding here if they need.
if { [ishost "*-*-cygwin*"] } {
setenv LC_ALL C.ASCII
setenv LANG C.ASCII
}
 
if ![info exists GCC_UNDER_TEST] then {
if [info exists TOOL_EXECUTABLE] {
set GCC_UNDER_TEST $TOOL_EXECUTABLE
} else {
set GCC_UNDER_TEST "[find_gcc]"
}
}
 
if ![info exists tmpdir] {
set tmpdir "/tmp"
}
 
if [info exists gluefile] {
unset gluefile
}
 
if {![info exists CFLAGS]} {
set CFLAGS ""
}
 
# Locate libgcc.a so we don't need to account for different values of
# SHLIB_EXT on different platforms
set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
if {$gccdir != ""} {
set gccdir [file dirname $gccdir]
}
 
# Compute what needs to be put into LD_LIBRARY_PATH
set always_ld_library_path ".:${blddir}/.libs"
 
# Compute what needs to be added to the existing LD_LIBRARY_PATH.
if {$gccdir != ""} {
# Add AIX pthread directory first.
if { [llength [glob -nocomplain ${gccdir}/pthread/libgcc_s*.a]] >= 1 } {
append always_ld_library_path ":${gccdir}/pthread"
}
append always_ld_library_path ":${gccdir}"
set compiler [lindex $GCC_UNDER_TEST 0]
 
if { [is_remote host] == 0 && [which $compiler] != 0 } {
foreach i "[exec $compiler --print-multi-lib]" {
set mldir ""
regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
set mldir [string trimright $mldir "\;@"]
if { "$mldir" == "." } {
continue
}
if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
append always_ld_library_path ":${gccdir}/${mldir}"
}
}
}
}
 
set ALWAYS_CFLAGS ""
if { $blddir != "" } {
lappend ALWAYS_CFLAGS "additional_flags=-B${blddir}/"
# targets that use libgomp.a%s in their specs need a -B option
# for uninstalled testing.
lappend ALWAYS_CFLAGS "additional_flags=-B${blddir}/.libs"
lappend ALWAYS_CFLAGS "additional_flags=-I${blddir}"
lappend ALWAYS_CFLAGS "ldflags=-L${blddir}/.libs"
}
lappend ALWAYS_CFLAGS "additional_flags=-I${srcdir}/.."
 
# We use atomic operations in the testcases to validate results.
if { ([istarget i?86-*-*] || [istarget x86_64-*-*])
&& [check_effective_target_ia32] } {
lappend ALWAYS_CFLAGS "additional_flags=-march=i486"
}
 
if [istarget *-*-darwin*] {
lappend ALWAYS_CFLAGS "additional_flags=-shared-libgcc"
}
 
if [istarget sparc*-*-*] {
lappend ALWAYS_CFLAGS "additional_flags=-mcpu=v9"
}
 
if [info exists TOOL_OPTIONS] {
lappend ALWAYS_CFLAGS "additional_flags=$TOOL_OPTIONS"
}
 
# Make sure that lines are not wrapped. That can confuse the
# error-message parsing machinery.
lappend ALWAYS_CFLAGS "additional_flags=-fmessage-length=0"
 
# And, gee, turn on OpenMP.
lappend ALWAYS_CFLAGS "additional_flags=-fopenmp"
}
 
#
# libgomp_target_compile -- compile a source file
#
 
proc libgomp_target_compile { source dest type options } {
global blddir
global libgomp_compile_options
global gluefile wrap_flags
global ALWAYS_CFLAGS
global GCC_UNDER_TEST
global lang_test_file
global lang_library_path
global lang_link_flags
 
if { [info exists lang_test_file] } {
if { $blddir != "" } {
# Some targets use libgfortran.a%s in their specs, so they need
# a -B option for uninstalled testing.
lappend options "additional_flags=-B${blddir}/${lang_library_path}"
lappend options "ldflags=-L${blddir}/${lang_library_path}"
}
lappend options "ldflags=${lang_link_flags}"
}
 
if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
lappend options "libs=${gluefile}"
lappend options "ldflags=${wrap_flags}"
}
 
lappend options "additional_flags=[libio_include_flags]"
lappend options "timeout=[timeout_value]"
lappend options "compiler=$GCC_UNDER_TEST"
 
set options [concat $libgomp_compile_options $options]
 
if [info exists ALWAYS_CFLAGS] {
set options [concat "$ALWAYS_CFLAGS" $options]
}
 
set options [dg-additional-files-options $options $source]
 
set result [target_compile $source $dest $type $options]
 
return $result
}
 
proc libgomp_option_help { } {
send_user " --additional_options,OPTIONS\t\tUse OPTIONS to compile the testcase files. OPTIONS should be comma-separated.\n"
}
 
proc libgomp_option_proc { option } {
if [regexp "^--additional_options," $option] {
global libgomp_compile_options
regsub "--additional_options," $option "" option
foreach x [split $option ","] {
lappend libgomp_compile_options "additional_flags=$x"
}
return 1
} else {
return 0
}
}
/lib/libgomp-dg.exp
0,0 → 1,7
proc libgomp-dg-test { prog do_what extra_tool_flags } {
return [gcc-dg-test-1 libgomp_target_compile $prog $do_what $extra_tool_flags]
}
 
proc libgomp-dg-prune { system text } {
return [gcc-dg-prune $system $text]
}
/Makefile.am
0,0 → 1,13
## Process this file with automake to produce Makefile.in.
 
AUTOMAKE_OPTIONS = foreign dejagnu
 
# May be used by various substitution variables.
gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
 
EXPECT = $(shell if test -f $(top_builddir)/../expect/expect; then \
echo $(top_builddir)/../expect/expect; else echo expect; fi)
 
_RUNTEST = $(shell if test -f $(top_srcdir)/../dejagnu/runtest; then \
echo $(top_srcdir)/../dejagnu/runtest; else echo runtest; fi)
RUNTEST = "$(_RUNTEST) $(AM_RUNTESTFLAGS)"
/libgomp.c/atomic-14.c
0,0 → 1,137
/* { dg-do run } */
 
extern void abort (void);
int x = 6, cnt;
 
int
foo (void)
{
return cnt++;
}
 
int
main ()
{
int v, *p;
#pragma omp atomic update
x = x + 7;
#pragma omp atomic
x = x + 7 + 6;
#pragma omp atomic update
x = x + 2 * 3;
#pragma omp atomic
x = x * (2 - 1);
#pragma omp atomic read
v = x;
if (v != 32)
abort ();
#pragma omp atomic write
x = 0;
#pragma omp atomic capture
{
v = x;
x = x | 1 ^ 2;
}
if (v != 0)
abort ();
#pragma omp atomic capture
{
v = x;
x = x | 4 | 2;
}
if (v != 3)
abort ();
#pragma omp atomic read
v = x;
if (v != 7)
abort ();
#pragma omp atomic capture
{
x = x ^ 6 & 2;
v = x;
}
if (v != 5)
abort ();
#pragma omp atomic capture
{ x = x - (6 + 4); v = x; }
if (v != -5)
abort ();
#pragma omp atomic capture
{ v = x; x = x - (1 | 2); }
if (v != -5)
abort ();
#pragma omp atomic read
v = x;
if (v != -8)
abort ();
#pragma omp atomic
x = x * -4 / 2;
#pragma omp atomic read
v = x;
if (v != 16)
abort ();
p = &x;
#pragma omp atomic update
p[foo (), 0] = p[foo (), 0] - 16;
#pragma omp atomic read
v = x;
if (cnt != 2 || v != 0)
abort ();
#pragma omp atomic capture
{
p[foo (), 0] += 6;
v = p[foo (), 0];
}
if (cnt != 4 || v != 6)
abort ();
#pragma omp atomic capture
{
v = p[foo (), 0];
p[foo (), 0] += 6;
}
if (cnt != 6 || v != 6)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic capture
{
p[foo (), 0] = p[foo (), 0] + 6;
v = p[foo (), 0];
}
if (cnt != 9 || v != 18)
abort ();
#pragma omp atomic capture
{
v = p[foo (), 0];
p[foo (), 0] = p[foo (), 0] + 6;
}
if (cnt != 12 || v != 18)
abort ();
#pragma omp atomic read
v = x;
if (v != 24)
abort ();
#pragma omp atomic capture
{ v = p[foo (), 0]; p[foo (), 0]++; }
#pragma omp atomic capture
{ v = p[foo (), 0]; ++p[foo (), 0]; }
#pragma omp atomic capture
{ p[foo (), 0]++; v = p[foo (), 0]; }
#pragma omp atomic capture
{ ++p[foo (), 0]; v = p[foo (), 0]; }
if (cnt != 20 || v != 28)
abort ();
#pragma omp atomic capture
{ v = p[foo (), 0]; p[foo (), 0]--; }
#pragma omp atomic capture
{ v = p[foo (), 0]; --p[foo (), 0]; }
#pragma omp atomic capture
{ p[foo (), 0]--; v = p[foo (), 0]; }
#pragma omp atomic capture
{ --p[foo (), 0]; v = p[foo (), 0]; }
if (cnt != 28 || v != 24)
abort ();
return 0;
}
/libgomp.c/reduction-6.c
0,0 → 1,29
/* { dg-do run } */
 
extern void abort (void);
int j;
float f;
 
int
main ()
{
j = -10000;
f = 1024.0;
int i;
#pragma omp parallel for reduction (min:f) reduction (max:j)
for (i = 0; i < 4; i++)
switch (i)
{
case 0:
if (j < -16) j = -16; break;
case 1:
if (f > -2.0) f = -2.0; break;
case 2:
if (j < 8) j = 8; if (f > 9.0) f = 9.0; break;
case 3:
break;
}
if (j != 8 || f != -2.0)
abort ();
return 0;
}
/libgomp.c/collapse-2.c
0,0 → 1,30
/* { dg-do run } */
 
#include <stdlib.h>
#include <omp.h>
 
int
main (void)
{
int i, j, k, l = 0, f = 0;
int m1 = 4, m2 = -5, m3 = 17;
 
#pragma omp parallel for num_threads (8) collapse(3) \
schedule(static, 9) reduction(+:l) \
firstprivate(f)
for (i = -2; i < m1; i++)
for (j = m2; j < -2; j++)
{
for (k = 13; k < m3; k++)
{
if (omp_get_num_threads () == 8
&& ((i + 2) * 12 + (j + 5) * 4 + (k - 13)
!= (omp_get_thread_num () * 9
+ f++)))
l++;
}
}
if (l)
abort ();
return 0;
}
/libgomp.c/pr49897-1.c
0,0 → 1,31
/* PR middle-end/49897 */
/* { dg-do run } */
 
extern void abort (void);
 
int
main ()
{
int i, j, x = 0, y, sum = 0;
#pragma omp parallel reduction(+:sum)
{
#pragma omp for firstprivate(x) lastprivate(x, y)
for (i = 0; i < 10; i++)
{
x = i;
y = 0;
#pragma omp parallel reduction(+:sum)
{
#pragma omp for firstprivate(y) lastprivate(y)
for (j = 0; j < 10; j++)
{
y = j;
sum += y;
}
}
}
}
if (x != 9 || y != 9 || sum != 450)
abort ();
return 0;
}
/libgomp.c/private-1.c
0,0 → 1,54
extern void abort (void);
 
int a = 18;
 
void
f1 (int i, int j, int k)
{
int l = 6, m = 7, n = 8;
#pragma omp parallel private(j, m) shared(k, n) firstprivate(i, l) \
num_threads(1)
{
j = 6;
m = 5;
if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9)
#pragma omp atomic
k++;
}
if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9)
abort ();
}
 
int v1 = 1, v2 = 2, v5 = 5;
int err;
 
void
f2 (void)
{
int v3 = 3;
#pragma omp sections private (v1) firstprivate (v2)
{
#pragma omp section
{
int v4 = 4;
v1 = 7;
#pragma omp parallel num_threads(1) firstprivate(v1, v2, v3, v4)
{
if (++v1 != 8 || ++v2 != 3 || ++v3 != 4 || ++v4 != 5 || ++v5 != 6)
err = 1;
}
if (v1 != 7 || v2 != 2 || v3 != 3 || v4 != 4 || v5 != 6)
abort ();
if (err)
abort ();
}
}
}
 
int
main (void)
{
f1 (8, 26, 0);
f2 ();
return 0;
}
/libgomp.c/omp-single-2.c
0,0 → 1,38
#include <omp.h>
 
extern void abort (void);
 
struct X
{
int a;
char b;
int c;
};
 
main()
{
int i = 0;
struct X x;
int bad = 0;
 
#pragma omp parallel private (i, x) shared (bad)
{
i = 5;
 
#pragma omp single copyprivate (i, x)
{
i++;
x.a = 23;
x.b = 42;
x.c = 26;
}
 
if (i != 6 || x.a != 23 || x.b != 42 || x.c != 26)
bad = 1;
}
 
if (bad)
abort ();
 
return 0;
}
/libgomp.c/nested-2.c
0,0 → 1,30
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = -1, j = -1;
 
omp_set_nested (0);
omp_set_dynamic (0);
#pragma omp parallel num_threads (4)
{
#pragma omp single
{
i = omp_get_thread_num () + omp_get_num_threads () * 256;
#pragma omp parallel num_threads (2)
{
#pragma omp single
{
j = omp_get_thread_num () + omp_get_num_threads () * 256;
}
}
}
}
if (i < 4 * 256 || i >= 4 * 256 + 4)
abort ();
if (j != 256 + 0)
abort ();
return 0;
}
/libgomp.c/pr24455-1.c
0,0 → 1,6
/* { dg-do compile } */
/* { dg-require-effective-target tls } */
extern int i;
#pragma omp threadprivate (i)
 
int i;
/libgomp.c/pr24455.c
0,0 → 1,23
/* { dg-do run } */
/* { dg-additional-sources pr24455-1.c } */
/* { dg-require-effective-target tls_runtime } */
 
extern void abort (void);
 
extern int i;
#pragma omp threadprivate(i)
 
int main()
{
i = 0;
 
#pragma omp parallel default(none) num_threads(10)
{
i++;
#pragma omp barrier
if (i != 1)
abort ();
}
 
return 0;
}
/libgomp.c/pr33880.c
0,0 → 1,123
/* 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;
}
/libgomp.c/pr38650.c
0,0 → 1,49
/* PR c++/38650 */
/* { dg-do run } */
 
#include <stdlib.h>
 
int e;
 
int
main ()
{
volatile int i, j = 10;
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < j; i += 1)
e++;
if (e != 10)
abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < j; ++i)
e++;
if (e != 10)
abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < j; i++)
e++;
if (e != 10)
abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < 10; i += 1)
e++;
if (e != 10)
abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < 10; ++i)
e++;
if (e != 10)
abort ();
e = 0;
#pragma omp parallel for reduction(+:e)
for (i = 0; i < 10; i++)
e++;
if (e != 10)
abort ();
return 0;
}
/libgomp.c/lock-3.c
0,0 → 1,60
/* { dg-do run { target *-*-linux* } } */
 
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#include <pthread.h>
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
 
pthread_barrier_t bar;
omp_nest_lock_t lock;
 
void *tf (void *p)
{
int l;
if (p)
{
if (omp_test_nest_lock (&lock) != 1)
abort ();
if (omp_test_nest_lock (&lock) != 2)
abort ();
}
pthread_barrier_wait (&bar);
if (!p && omp_test_nest_lock (&lock) != 0)
abort ();
pthread_barrier_wait (&bar);
if (p)
{
if (omp_test_nest_lock (&lock) != 3)
abort ();
omp_unset_nest_lock (&lock);
omp_unset_nest_lock (&lock);
omp_unset_nest_lock (&lock);
}
pthread_barrier_wait (&bar);
if (!p)
{
if (omp_test_nest_lock (&lock) != 1)
abort ();
if (omp_test_nest_lock (&lock) != 2)
abort ();
omp_unset_nest_lock (&lock);
omp_unset_nest_lock (&lock);
}
return NULL;
}
 
int
main (void)
{
pthread_t th;
omp_init_nest_lock (&lock);
pthread_barrier_init (&bar, NULL, 2);
pthread_create (&th, NULL, tf, NULL);
tf ("");
pthread_join (th, NULL);
omp_destroy_nest_lock (&lock);
return 0;
}
/libgomp.c/loop-11.c
0,0 → 1,276
#include <omp.h>
#include <stdlib.h>
#include <string.h>
 
int
test1 (void)
{
short int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[10]; &buf[54] > p; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[3]; &buf[63] >= p; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[16]; &buf[51] > p; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[53]; &buf[9] < p; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[63]; &buf[3] <= p; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[48]; &buf[15] < p; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test2 (void)
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[10]; &buf[54] > p; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[3]; &buf[63] >= p; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[16]; &buf[51] > p; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[53]; &buf[9] < p; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[63]; &buf[3] <= p; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[48]; &buf[15] < p; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test3 (void)
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[10]; &buf[54] > p; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[3]; &buf[63] >= p; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[16]; &buf[51] > p; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[53]; &buf[9] < p; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[63]; &buf[3] <= p; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[48]; &buf[15] < p; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test4 (void)
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[10]; &buf[54] > p; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[3]; &buf[63] >= p; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[16]; &buf[51] > p; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[53]; &buf[9] < p; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[63]; &buf[3] <= p; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[48]; &buf[15] < p; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
main (void)
{
test1 ();
test2 ();
test3 ();
omp_set_schedule (omp_sched_static, 0);
test4 ();
omp_set_schedule (omp_sched_static, 3);
test4 ();
omp_set_schedule (omp_sched_dynamic, 5);
test4 ();
omp_set_schedule (omp_sched_guided, 2);
test4 ();
return 0;
}
/libgomp.c/pr48591.c
0,0 → 1,22
/* PR middle-end/48591 */
/* { dg-do run { target i?86-*-linux* x86_64-*-linux* ia64-*-linux* } } */
/* { dg-options "-fopenmp" } */
 
extern void abort (void);
 
int
main ()
{
__float128 f = 0.0;
int i;
#pragma omp parallel for reduction(+:f)
for (i = 0; i < 128; i++)
f += 0.5Q;
if (f != 64.0Q)
abort ();
#pragma omp atomic
f += 8.5Q;
if (f != 72.5Q)
abort ();
return 0;
}
/libgomp.c/copyin-1.c
0,0 → 1,34
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-require-effective-target tls_runtime } */
 
#include <omp.h>
#include <stdlib.h>
 
int thr = 32;
#pragma omp threadprivate (thr)
 
int
main (void)
{
int l = 0;
 
omp_set_dynamic (0);
omp_set_num_threads (6);
 
#pragma omp parallel copyin (thr) reduction (||:l)
{
l = thr != 32;
thr = omp_get_thread_num () + 11;
}
 
if (l || thr != 11)
abort ();
 
#pragma omp parallel reduction (||:l)
l = thr != omp_get_thread_num () + 11;
 
if (l)
abort ();
return 0;
}
/libgomp.c/task-1.c
0,0 → 1,84
extern void abort (void);
 
int a = 18;
 
void
f1 (int i, int j, int k)
{
int l = 6, m = 7, n = 8;
#pragma omp task private(j, m) shared(k, n)
{
j = 6;
m = 5;
if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9)
#pragma omp atomic
k++;
}
#pragma omp taskwait
if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9)
abort ();
}
 
int v1 = 1, v2 = 2, v5 = 5;
int err;
 
void
f2 (void)
{
int v3 = 3;
#pragma omp sections private (v1) firstprivate (v2)
{
#pragma omp section
{
int v4 = 4;
v1 = 7;
#pragma omp task
{
if (++v1 != 8 || ++v2 != 3 || ++v3 != 4 || ++v4 != 5 || ++v5 != 6)
err = 1;
}
#pragma omp taskwait
if (v1 != 7 || v2 != 2 || v3 != 3 || v4 != 4 || v5 != 6)
abort ();
if (err)
abort ();
}
}
}
 
void
f3 (int i, int j, int k)
{
int l = 6, m = 7, n = 8;
#pragma omp task private(j, m) shared(k, n) untied
{
j = 6;
m = 5;
if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9)
#pragma omp atomic
k++;
}
#pragma omp taskwait
if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9)
abort ();
}
 
int
main (void)
{
f1 (8, 26, 0);
f2 ();
a = 18;
f3 (8, 26, 0);
a = 18;
#pragma omp parallel num_threads(4)
{
#pragma omp master
{
f1 (8, 26, 0);
a = 18;
f3 (8, 26, 0);
}
}
return 0;
}
/libgomp.c/omp-loop01.c
0,0 → 1,96
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <omp.h>
 
#define MAX 1000
 
void main1()
{
int i, N1, N2, step;
int a[MAX], b[MAX];
 
N1 = rand () % 13;
N2 = rand () % (MAX - 51) + 50;
step = rand () % 7 + 1;
 
printf ("N1 = %d\nN2 = %d\nstep = %d\n", N1, N2, step);
 
for (i = N1; i <= N2; i += step)
a[i] = 42+ i;
 
/* COUNTING UP (<). Fill in array 'b' in parallel. */
memset (b, 0, sizeof b);
#pragma omp parallel shared(a,b,N1,N2,step) private(i)
{
#pragma omp for
for (i = N1; i < N2; i += step)
b[i] = a[i];
}
 
/* COUNTING UP (<). Check that all the cells were filled in properly. */
for (i = N1; i < N2; i += step)
if (a[i] != b[i])
abort ();
 
printf ("for (i = %d; i < %d; i += %d) [OK]\n", N1, N2, step);
 
/* COUNTING UP (<=). Fill in array 'b' in parallel. */
memset (b, 0, sizeof b);
#pragma omp parallel shared(a,b,N1,N2,step) private(i)
{
#pragma omp for
for (i = N1; i <= N2; i += step)
b[i] = a[i];
}
 
/* COUNTING UP (<=). Check that all the cells were filled in properly. */
for (i = N1; i <= N2; i += step)
if (a[i] != b[i])
abort ();
 
printf ("for (i = %d; i <= %d; i += %d) [OK]\n", N1, N2, step);
 
/* COUNTING DOWN (>). Fill in array 'b' in parallel. */
memset (b, 0, sizeof b);
#pragma omp parallel shared(a,b,N1,N2,step) private(i)
{
#pragma omp for
for (i = N2; i > N1; i -= step)
b[i] = a[i];
}
 
/* COUNTING DOWN (>). Check that all the cells were filled in properly. */
for (i = N2; i > N1; i -= step)
if (a[i] != b[i])
abort ();
 
printf ("for (i = %d; i > %d; i -= %d) [OK]\n", N2, N1, step);
 
/* COUNTING DOWN (>=). Fill in array 'b' in parallel. */
memset (b, 0, sizeof b);
#pragma omp parallel shared(a,b,N1,N2,step) private(i)
{
#pragma omp for
for (i = N2; i >= N1; i -= step)
b[i] = a[i];
}
 
/* COUNTING DOWN (>=). Check that all the cells were filled in properly. */
for (i = N2; i >= N1; i -= step)
if (a[i] != b[i])
abort ();
 
printf ("for (i = %d; i >= %d; i -= %d) [OK]\n", N2, N1, step);
}
 
int
main ()
{
int i;
 
srand (0);
for (i = 0; i < 10; ++i)
main1();
return 0;
}
/libgomp.c/omp_workshare4.c
0,0 → 1,48
/******************************************************************************
* OpenMP Example - Combined Parallel Loop Work-sharing - C/C++ Version
* FILE: omp_workshare4.c
* DESCRIPTION:
* This is a corrected version of the omp_workshare3.c example. Corrections
* include removing all statements between the parallel for construct and
* the actual for loop, and introducing logic to preserve the ability to
* query a thread's id and print it from inside the for loop.
* SOURCE: Blaise Barney 5/99
* LAST REVISED: 03/03/2002
******************************************************************************/
 
#include <omp.h>
#include <stdio.h>
#define N 50
#define CHUNKSIZE 5
 
main () {
 
int i, chunk, tid;
float a[N], b[N], c[N];
char first_time;
 
/* Some initializations */
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
chunk = CHUNKSIZE;
first_time = 'y';
 
#pragma omp parallel for \
shared(a,b,c,chunk) \
private(i,tid) \
schedule(static,chunk) \
firstprivate(first_time)
 
for (i=0; i < N; i++)
{
if (first_time == 'y')
{
tid = omp_get_thread_num();
first_time = 'n';
}
c[i] = a[i] + b[i];
printf("tid= %d i= %d c[i]= %f\n", tid, i, c[i]);
}
 
return 0;
}
/libgomp.c/nestedfn-1.c
0,0 → 1,49
/* { dg-do run } */
 
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int a = 1, b = 2, c = 3;
void
foo (void)
{
int l = 0;
#pragma omp parallel shared (a) private (b) firstprivate (c) \
num_threads (2) reduction (||:l)
{
if (a != 1 || c != 3) l = 1;
#pragma omp barrier
if (omp_get_thread_num () == 0)
{
a = 4;
b = 5;
c = 6;
}
#pragma omp barrier
if (omp_get_thread_num () == 1)
{
if (a != 4 || c != 3) l = 1;
a = 7;
b = 8;
c = 9;
}
else if (omp_get_num_threads () == 1)
a = 7;
#pragma omp barrier
if (omp_get_thread_num () == 0)
if (a != 7 || b != 5 || c != 6) l = 1;
#pragma omp barrier
if (omp_get_thread_num () == 1)
if (a != 7 || b != 8 || c != 9) l = 1;
}
if (l)
abort ();
}
foo ();
if (a != 7)
abort ();
return 0;
}
/libgomp.c/shared-1.c
0,0 → 1,58
extern void abort (void);
 
struct Y
{
int l[5][10];
};
 
struct X
{
struct Y y;
float b[10];
};
 
void
parallel (int a, int b)
{
int i, j;
struct X A[10][5];
a = b = 3;
 
for (i = 0; i < 10; i++)
for (j = 0; j < 5; j++)
A[i][j].y.l[3][3] = -10;
 
#pragma omp parallel shared (a, b, A) num_threads (5)
{
int i, j;
 
#pragma omp atomic
a += omp_get_num_threads ();
 
#pragma omp atomic
b += omp_get_num_threads ();
 
#pragma omp for private (j)
for (i = 0; i < 10; i++)
for (j = 0; j < 5; j++)
A[i][j].y.l[3][3] += 20;
 
}
 
for (i = 0; i < 10; i++)
for (j = 0; j < 5; j++)
if (A[i][j].y.l[3][3] != 10)
abort ();
 
if (a != 28)
abort ();
 
if (b != 28)
abort ();
}
 
main()
{
parallel (1, 2);
return 0;
}
/libgomp.c/task-5.c
0,0 → 1,45
/* { dg-do run } */
 
#include <omp.h>
#include <stdlib.h>
 
int err;
 
int
main ()
{
int e;
#pragma omp parallel shared(err)
{
if (omp_in_final ())
#pragma omp atomic write
err = 1;
#pragma omp task if (0) shared(err)
{
if (omp_in_final ())
#pragma omp atomic write
err = 1;
#pragma omp task if (0) shared(err)
if (omp_in_final ())
#pragma omp atomic write
err = 1;
}
#pragma omp task final (1) shared(err)
{
if (!omp_in_final ())
#pragma omp atomic write
err = 1;
#pragma omp taskyield
#pragma omp taskwait
#pragma omp task shared(err)
if (!omp_in_final ())
#pragma omp atomic write
err = 1;
}
}
#pragma omp atomic read
e = err;
if (e)
abort ();
return 0;
}
/libgomp.c/nestedfn-5.c
0,0 → 1,38
/* { dg-do run } */
/* { dg-options "-O2" } */
 
extern void abort (void);
 
void
foo (int *j)
{
int i = 5;
int bar (void) { return i + 1; }
#pragma omp sections
{
#pragma omp section
{
if (bar () != 6)
#pragma omp atomic
++*j;
}
#pragma omp section
{
if (bar () != 6)
#pragma omp atomic
++*j;
}
}
}
 
int
main (void)
{
int j = 0;
#pragma omp parallel num_threads (2)
foo (&j);
if (j)
abort ();
return 0;
}
 
/libgomp.c/loop-3.c
0,0 → 1,25
/* { dg-do run } */
 
extern void abort (void);
 
volatile int count;
static int test(void)
{
return ++count > 0;
}
 
int i;
 
int main()
{
#pragma omp for lastprivate (i)
for (i = 0; i < 10; ++i)
{
if (test())
continue;
abort ();
}
if (i != count)
abort ();
return 0;
}
/libgomp.c/loop-7.c
0,0 → 1,105
/* { dg-do run } */
 
#include <omp.h>
 
extern void abort (void);
 
#define LLONG_MAX __LONG_LONG_MAX__
#define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
#define INT_MAX __INT_MAX__
 
int v;
 
int
test1 (void)
{
int e = 0, cnt = 0;
long long i;
unsigned long long j;
char buf[6], *p;
 
#pragma omp for schedule(dynamic,1) collapse(2) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
if ((i != LLONG_MAX - 30001
&& i != LLONG_MAX - 20001
&& i != LLONG_MAX - 10001)
|| j != 20)
e = 1;
else
cnt++;
if (e || cnt != 3)
abort ();
else
cnt = 0;
 
#pragma omp for schedule(guided,1) collapse(2) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
if ((i != -LLONG_MAX + 30000
&& i != -LLONG_MAX + 20000
&& i != -LLONG_MAX + 10000)
|| j != ULLONG_MAX - 3)
e = 1;
else
cnt++;
if (e || cnt != 3)
abort ();
else
cnt = 0;
 
#pragma omp for schedule(static,1) collapse(2) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
for (j = 20; j <= LLONG_MAX - 70 + v; j += LLONG_MAX + 50ULL)
if ((i != LLONG_MAX - 30001
&& i != LLONG_MAX - 20001
&& i != LLONG_MAX - 10001)
|| j != 20)
e = 1;
else
cnt++;
if (e || cnt != 3)
abort ();
else
cnt = 0;
 
#pragma omp for schedule(static) collapse(2) nowait
for (i = -LLONG_MAX + 30000 + v; i >= -LLONG_MAX + 10000; i -= 10000)
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
if ((i != -LLONG_MAX + 30000
&& i != -LLONG_MAX + 20000
&& i != -LLONG_MAX + 10000)
|| j != ULLONG_MAX - 3)
e = 1;
else
cnt++;
if (e || cnt != 3)
abort ();
else
cnt = 0;
 
#pragma omp for schedule(runtime) collapse(2) nowait
for (i = 10; i < 30; i++)
for (p = buf; p <= buf + 4; p += 2)
if (i < 10 || i >= 30 || (p != buf && p != buf + 2 && p != buf + 4))
e = 1;
else
cnt++;
if (e || cnt != 60)
abort ();
else
cnt = 0;
 
return 0;
}
 
int
main (void)
{
if (2 * sizeof (int) != sizeof (long long))
return 0;
asm volatile ("" : "+r" (v));
omp_set_schedule (omp_sched_dynamic, 1);
test1 ();
return 0;
}
/libgomp.c/atomic-4.c
0,0 → 1,18
/* PR middle-end/35611 */
/* { dg-options "-O2" } */
 
extern void abort (void);
 
int
main (void)
{
long double d = .0L;
int i;
#pragma omp parallel for shared (d)
for (i = 0; i < 1000; i++)
#pragma omp atomic
d += 1.0L;
if (d != 1000.0L)
abort ();
return 0;
}
/libgomp.c/single-1.c
0,0 → 1,53
/* Trivial test of single. */
 
/* { dg-require-effective-target sync_int_long } */
 
#include <omp.h>
#include <sys/time.h>
#include <unistd.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
static int test;
 
static void f_nocopy (void *dummy)
{
if (GOMP_single_start ())
{
int iam = omp_get_thread_num ();
int old = __sync_lock_test_and_set (&test, iam);
assert (old == -1);
}
}
 
static void f_copy (void *dummy)
{
int *x = GOMP_single_copy_start ();
if (x == NULL)
{
int iam = omp_get_thread_num ();
int old = __sync_lock_test_and_set (&test, iam);
assert (old == -1);
GOMP_single_copy_end (&test);
}
else
assert (x == &test);
}
 
int main()
{
omp_set_dynamic (0);
 
test = -1;
GOMP_parallel_start (f_nocopy, NULL, 3);
f_nocopy (NULL);
GOMP_parallel_end ();
 
test = -1;
GOMP_parallel_start (f_copy, NULL, 3);
f_copy (NULL);
GOMP_parallel_end ();
 
return 0;
}
/libgomp.c/pr32362-3.c
0,0 → 1,34
/* PR middle-end/32362 */
/* { dg-do run } */
/* { dg-options "-O2" } */
 
#include <omp.h>
#include <stdlib.h>
 
int a = 2;
 
int
main ()
{
int n[4] = { -1, -1, -1, -1 };
int b = 4;
omp_set_num_threads (4);
omp_set_dynamic (0);
omp_set_nested (1);
#pragma omp parallel private(b)
{
b = omp_get_thread_num ();
#pragma omp parallel firstprivate(a)
{
a = (omp_get_thread_num () + a) + 1;
if (b == omp_get_thread_num ())
n[omp_get_thread_num ()] = a + (b << 4);
}
}
if (n[0] != 3)
abort ();
if (n[3] != -1
&& (n[1] != 0x14 || n[2] != 0x25 || n[3] != 0x36))
abort ();
return 0;
}
/libgomp.c/pr36802-1.c
0,0 → 1,34
/* PR middle-end/36802 */
 
extern void abort (void);
 
int
foo (int k)
{
int i = 0;
#pragma omp parallel
#pragma omp single
{
if (!k)
{
int j;
for (j = 0; j < 10; j++)
#pragma omp task
if (j == 4)
i++;
}
else
i++;
}
return i;
}
 
int
main (void)
{
if (foo (0) != 1)
abort ();
if (foo (1) != 1)
abort ();
return 0;
}
/libgomp.c/pr42029.c
0,0 → 1,19
/* PR middle-end/42029 */
/* { dg-do run } */
 
extern void abort (void);
 
int
main ()
{
int i;
_Complex int c = 0;
 
#pragma omp parallel for private(i) reduction(+:c)
for (i = 0; i < 8; ++i)
c += 1;
 
if (c != 8)
abort ();
return 0;
}
/libgomp.c/ordered-3.c
0,0 → 1,82
#include <stdlib.h>
 
int cnt;
 
void
check (int x)
{
if (cnt++ != x)
abort ();
}
 
int
main (void)
{
int j;
 
cnt = 0;
#pragma omp parallel for ordered schedule (static, 1) num_threads (4) if (0)
for (j = 0; j < 1000; j++)
{
#pragma omp ordered
check (j);
}
 
cnt = 0;
#pragma omp parallel for ordered schedule (static, 1) num_threads (4) if (1)
for (j = 0; j < 1000; j++)
{
#pragma omp ordered
check (j);
}
 
cnt = 0;
#pragma omp parallel for ordered schedule (runtime) num_threads (4) if (0)
for (j = 0; j < 1000; j++)
{
#pragma omp ordered
check (j);
}
 
cnt = 0;
#pragma omp parallel for ordered schedule (runtime) num_threads (4) if (1)
for (j = 0; j < 1000; j++)
{
#pragma omp ordered
check (j);
}
 
cnt = 0;
#pragma omp parallel for ordered schedule (dynamic) num_threads (4) if (0)
for (j = 0; j < 1000; j++)
{
#pragma omp ordered
check (j);
}
 
cnt = 0;
#pragma omp parallel for ordered schedule (dynamic) num_threads (4) if (1)
for (j = 0; j < 1000; j++)
{
#pragma omp ordered
check (j);
}
 
cnt = 0;
#pragma omp parallel for ordered schedule (guided) num_threads (4) if (0)
for (j = 0; j < 1000; j++)
{
#pragma omp ordered
check (j);
}
 
cnt = 0;
#pragma omp parallel for ordered schedule (guided) num_threads (4) if (1)
for (j = 0; j < 1000; j++)
{
#pragma omp ordered
check (j);
}
 
return 0;
}
/libgomp.c/pr39154.c
0,0 → 1,105
/* PR middle-end/39154 */
/* { dg-do compile } */
/* { dg-options "-O2 -std=gnu99" } */
 
extern void abort (void);
 
int n = 20;
 
int
main (void)
{
int a[n], b[n][n];
 
#pragma omp parallel for
for (int i = 0; i < n; i++)
{
a[i] = i + 1;
#pragma omp parallel for
for (int j = 0; j < n; j++)
b[i][j] = a[i];
}
 
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
if (b[i][j] != i + 1)
abort ();
if (a[i] != i + 1)
abort ();
}
 
#pragma omp parallel for shared (n, a, b)
for (int i = 0; i < n; i++)
{
a[i] = i + 3;
#pragma omp parallel for
for (int j = 0; j < n; j++)
b[i][j] = a[i];
}
 
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
if (b[i][j] != i + 3)
abort ();
if (a[i] != i + 3)
abort ();
}
 
#pragma omp parallel for
for (int i = 0; i < n; i++)
{
a[i] = i + 5;
#pragma omp parallel for shared (n, a, b)
for (int j = 0; j < n; j++)
b[i][j] = a[i];
}
 
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
if (b[i][j] != i + 5)
abort ();
if (a[i] != i + 5)
abort ();
}
 
#pragma omp parallel for shared (n, a, b)
for (int i = 0; i < n; i++)
{
a[i] = i + 7;
#pragma omp parallel for shared (n, a, b)
for (int j = 0; j < n; j++)
b[i][j] = a[i];
}
 
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
if (b[i][j] != i + 7)
abort ();
if (a[i] != i + 7)
abort ();
}
 
#pragma omp parallel for private (a, b)
for (int i = 0; i < n; i++)
{
a[i] = i + 1;
#pragma omp parallel for
for (int j = 0; j < n; j++)
b[i][j] = a[i];
}
 
#pragma omp parallel for private (a, b)
for (int i = 0; i < n; i++)
{
a[i] = i + 1;
#pragma omp parallel for private (b)
for (int j = 0; j < n; j++)
b[i][j] = a[i];
}
 
return 0;
}
/libgomp.c/pr26943-2.c
0,0 → 1,47
/* PR c++/26943 */
/* { dg-do run } */
 
extern int omp_set_dynamic (int);
extern void abort (void);
 
int a = 8, b = 12, c = 16, d = 20, j = 0;
char e[10] = "a", f[10] = "b", g[10] = "c", h[10] = "d";
 
int
main (void)
{
int i;
omp_set_dynamic (0);
#pragma omp parallel for shared (a, e) firstprivate (b, f) \
lastprivate (c, g) private (d, h) \
schedule (static, 1) num_threads (4) \
reduction (+:j)
for (i = 0; i < 4; i++)
{
if (a != 8 || b != 12 || e[0] != 'a' || f[0] != 'b')
j++;
#pragma omp barrier /* { dg-warning "may not be closely nested" } */
#pragma omp atomic
a += i;
b += i;
c = i;
d = i;
#pragma omp atomic
e[0] += i;
f[0] += i;
g[0] = 'g' + i;
h[0] = 'h' + i;
#pragma omp barrier /* { dg-warning "may not be closely nested" } */
if (a != 8 + 6 || b != 12 + i || c != i || d != i)
j += 8;
if (e[0] != 'a' + 6 || f[0] != 'b' + i || g[0] != 'g' + i)
j += 64;
if (h[0] != 'h' + i)
j += 512;
}
if (j || a != 8 + 6 || b != 12 || c != 3 || d != 20)
abort ();
if (e[0] != 'a' + 6 || f[0] != 'b' || g[0] != 'g' + 3 || h[0] != 'd')
abort ();
return 0;
}
/libgomp.c/parallel-1.c
0,0 → 1,48
/* Trivial test of thread startup. */
 
#include <omp.h>
#include <string.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
static int nthr;
static int saw[4];
 
static void function(void *dummy)
{
int iam = omp_get_thread_num ();
 
if (iam == 0)
nthr = omp_get_num_threads ();
 
saw[iam] = 1;
}
 
int main()
{
omp_set_dynamic (0);
 
GOMP_parallel_start (function, NULL, 2);
function (NULL);
GOMP_parallel_end ();
 
assert (nthr == 2);
assert (saw[0] != 0);
assert (saw[1] != 0);
assert (saw[2] == 0);
 
memset (saw, 0, sizeof (saw));
GOMP_parallel_start (function, NULL, 3);
function (NULL);
GOMP_parallel_end ();
 
assert (nthr == 3);
assert (saw[0] != 0);
assert (saw[1] != 0);
assert (saw[2] != 0);
assert (saw[3] == 0);
 
return 0;
}
/libgomp.c/atomic-11.c
0,0 → 1,156
/* { dg-do run } */
 
extern void abort (void);
int x = 6;
float y;
 
int
main (void)
{
int v;
float f;
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
#pragma omp atomic write
x = 17;
#pragma omp atomic read
v = x;
if (v != 17)
abort ();
#pragma omp atomic update
x++;
#pragma omp atomic read
v = x;
if (v != 18)
abort ();
#pragma omp atomic capture
v = x++;
if (v != 18)
abort ();
#pragma omp atomic read
v = x;
if (v != 19)
abort ();
#pragma omp atomic capture
v = ++x;
if (v != 20)
abort ();
#pragma omp atomic read
v = x;
if (v != 20)
abort ();
#pragma omp atomic capture
{ v = x; x *= 3; }
if (v != 20)
abort ();
#pragma omp atomic read
v = x;
if (v != 60)
abort ();
#pragma omp atomic capture
{
x |= 2;
v = x;
}
if (v != 62)
abort ();
#pragma omp atomic read
v = x;
if (v != 62)
abort ();
#pragma omp atomic capture
{ v = x; x++; }
if (v != 62)
abort ();
#pragma omp atomic capture
{ v = x; ++x; }
if (v != 63)
abort ();
#pragma omp atomic capture
{
++x;
v = x;
}
if (v != 65)
abort ();
#pragma omp atomic capture
{x++;v=x;}if (v != 66)
abort ();
#pragma omp atomic read
v = x;
if (v != 66)
abort ();
#pragma omp atomic capture
{ v = x; x--; }
if (v != 66)
abort ();
#pragma omp atomic capture
{ v = x; --x; }
if (v != 65)
abort ();
#pragma omp atomic capture
{
--x;
v = x;
}
if (v != 63)
abort ();
#pragma omp atomic capture
{ x--; v = x; } if (v != 62)
abort ();
#pragma omp atomic read
v = x;
if (v != 62)
abort ();
#pragma omp atomic write
y = 17.5f;
#pragma omp atomic read
f = y;
if (f != 17.5)
abort ();
#pragma omp atomic update
y *= 2.0f;
#pragma omp atomic read
f = y;
if (y != 35.0)
abort ();
#pragma omp atomic capture
f = y *= 2.0f;
if (f != 70.0)
abort ();
#pragma omp atomic capture
f = y++;
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 71.0)
abort ();
#pragma omp atomic capture
f = --y;
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 70.0)
abort ();
#pragma omp atomic capture
{ f = y; y /= 2.0f; }
if (f != 70.0)
abort ();
#pragma omp atomic read
f = y;
if (f != 35.0)
abort ();
#pragma omp atomic capture
{ y /= 2.0f; f = y; }
if (f != 17.5)
abort ();
#pragma omp atomic read
f = y;
if (f != 17.5)
abort ();
return 0;
}
/libgomp.c/reduction-3.c
0,0 → 1,51
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = 0, j = 0, k = ~0, l;
double d = 1.0;
#pragma omp parallel num_threads(4)
{
#pragma omp single
{
i = 16;
k ^= (1 << 16);
d += 32.0;
}
 
#pragma omp for reduction(+:i) reduction(*:d) reduction(&:k) nowait
for (l = 0; l < 4; l++)
{
if (omp_get_num_threads () == 4 && (i != 0 || d != 1.0 || k != ~0))
#pragma omp atomic
j |= 1;
if (l == omp_get_thread_num ())
{
i = omp_get_thread_num ();
d = i + 1;
k = ~(1 << (2 * i));
}
}
 
if (omp_get_num_threads () == 4)
{
#pragma omp barrier
if (i != (16 + 0 + 1 + 2 + 3))
#pragma omp atomic
j |= 2;
if (d != (33.0 * 1.0 * 2.0 * 3.0 * 4.0))
#pragma omp atomic
j |= 4;
if (k != (~0 ^ 0x55 ^ (1 << 16)))
#pragma omp atomic
j |= 8;
}
}
 
if (j)
abort ();
return 0;
}
/libgomp.c/pr39591-3.c
0,0 → 1,40
/* PR other/39591 */
/* { dg-do run } */
/* { dg-options "-O2" } */
 
extern void abort (void);
 
int err, a[40];
 
void __attribute__((noinline))
foo (int *array)
{
#pragma omp task
{
int j;
for (j = 0; j < sizeof array / sizeof array[0]; j++)
if (array[j] != 0x55555555)
#pragma omp atomic
err++;
}
}
 
int
main (void)
{
int k;
for (k = 0; k < sizeof a / sizeof a[0]; k++)
a[k] = 0x55555555;
 
#pragma omp parallel
{
int i;
 
#pragma omp for schedule (dynamic)
for (i = 0; i < 50; i++)
foo (a);
}
if (err)
abort ();
return 0;
}
/libgomp.c/pr46886.c
0,0 → 1,28
/* { dg-do run } */
/* { dg-options "-O -ftree-parallelize-loops=4 -fno-tree-ch -fno-tree-dominator-opts" } */
 
void abort(void);
 
int d[1024], e[1024];
 
int foo (void)
{
int s = 0;
int i;
for (i = 0; i < 1024; i++)
s += d[i] - e[i];
return s;
}
 
int main ()
{
int i;
for (i = 0; i < 1024; i++)
{
d[i] = i * 2;
e[i] = i;
}
if (foo () != 1023 * 1024 / 2)
abort ();
return 0;
}
/libgomp.c/collapse-3.c
0,0 → 1,31
/* { dg-do run } */
/* { dg-options "-O2 -std=gnu99" } */
 
#include <string.h>
#include <stdlib.h>
 
int
main (void)
{
int i2, l = 0;
int a[3][3][3];
 
memset (a, '\0', sizeof (a));
#pragma omp parallel for collapse(4 - 1) schedule(static, 4)
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
a[i][j][k] = i + j * 4 + k * 16;
#pragma omp parallel
{
#pragma omp for collapse(2) reduction(|:l)
for (i2 = 0; i2 < 2; i2++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
if (a[i2][j][k] != i2 + j * 4 + k * 16)
l = 1;
}
if (l)
abort ();
return 0;
}
/libgomp.c/pr49897-2.c
0,0 → 1,25
/* PR middle-end/49897 */
/* { dg-do run } */
 
extern void abort (void);
 
int
main ()
{
int i, j, x = 0, y, sum = 0;
#pragma omp parallel for reduction(+:sum) firstprivate(x) lastprivate(x, y)
for (i = 0; i < 10; i++)
{
x = i;
y = 0;
#pragma omp parallel for reduction(+:sum) firstprivate(y) lastprivate(y)
for (j = 0; j < 10; j++)
{
y = j;
sum += y;
}
}
if (x != 9 || y != 9 || sum != 450)
abort ();
return 0;
}
/libgomp.c/omp-single-3.c
0,0 → 1,21
extern void abort (void);
 
void
single (int a, int b)
{
#pragma omp single copyprivate(a) copyprivate(b)
{
a = b = 5;
}
 
if (a != b)
abort ();
}
 
int main()
{
#pragma omp parallel
single (1, 2);
 
return 0;
}
/libgomp.c/pr34513.c
0,0 → 1,33
/* PR c++/34513 */
/* { dg-do run } */
 
#include <omp.h>
 
extern void abort ();
 
static int errors = 0;
static int thrs = 4;
 
int
main ()
{
omp_set_dynamic (0);
 
#pragma omp parallel num_threads (thrs)
{
static int shrd = 0;
 
#pragma omp atomic
shrd += 1;
 
#pragma omp barrier
 
if (shrd != thrs)
#pragma omp atomic
errors += 1;
}
 
if (errors)
abort ();
return 0;
}
/libgomp.c/nested-3.c
0,0 → 1,89
#include <omp.h>
#include <stdlib.h>
#include <string.h>
 
int
main (void)
{
int e[3];
 
memset (e, '\0', sizeof (e));
omp_set_nested (1);
omp_set_dynamic (0);
if (omp_in_parallel ()
|| omp_get_level () != 0
|| omp_get_ancestor_thread_num (0) != 0
|| omp_get_ancestor_thread_num (-1) != -1
|| omp_get_ancestor_thread_num (1) != -1
|| omp_get_team_size (0) != 1
|| omp_get_team_size (-1) != -1
|| omp_get_team_size (1) != -1
|| omp_get_active_level () != 0)
abort ();
#pragma omp parallel num_threads (4)
{
int tn1 = omp_get_thread_num ();
if (omp_in_parallel () != 1
|| omp_get_num_threads () != 4
|| tn1 >= 4 || tn1 < 0
|| omp_get_level () != 1
|| omp_get_ancestor_thread_num (0) != 0
|| omp_get_ancestor_thread_num (1) != tn1
|| omp_get_ancestor_thread_num (-1) != -1
|| omp_get_ancestor_thread_num (2) != -1
|| omp_get_team_size (0) != 1
|| omp_get_team_size (1) != omp_get_num_threads ()
|| omp_get_team_size (-1) != -1
|| omp_get_team_size (2) != -1
|| omp_get_active_level () != 1)
#pragma omp atomic
e[0] += 1;
#pragma omp parallel if (0) num_threads(5) firstprivate(tn1)
{
int tn2 = omp_get_thread_num ();
if (omp_in_parallel () != 1
|| omp_get_num_threads () != 1
|| tn2 != 0
|| omp_get_level () != 2
|| omp_get_ancestor_thread_num (0) != 0
|| omp_get_ancestor_thread_num (1) != tn1
|| omp_get_ancestor_thread_num (2) != tn2
|| omp_get_ancestor_thread_num (-1) != -1
|| omp_get_ancestor_thread_num (3) != -1
|| omp_get_team_size (0) != 1
|| omp_get_team_size (1) != 4
|| omp_get_team_size (2) != 1
|| omp_get_team_size (-1) != -1
|| omp_get_team_size (3) != -1
|| omp_get_active_level () != 1)
#pragma omp atomic
e[1] += 1;
#pragma omp parallel num_threads(2) firstprivate(tn1, tn2)
{
int tn3 = omp_get_thread_num ();
if (omp_in_parallel () != 1
|| omp_get_num_threads () != 2
|| tn3 > 1 || tn3 < 0
|| omp_get_level () != 3
|| omp_get_ancestor_thread_num (0) != 0
|| omp_get_ancestor_thread_num (1) != tn1
|| omp_get_ancestor_thread_num (2) != tn2
|| omp_get_ancestor_thread_num (3) != tn3
|| omp_get_ancestor_thread_num (-1) != -1
|| omp_get_ancestor_thread_num (4) != -1
|| omp_get_team_size (0) != 1
|| omp_get_team_size (1) != 4
|| omp_get_team_size (2) != 1
|| omp_get_team_size (3) != 2
|| omp_get_team_size (-1) != -1
|| omp_get_team_size (4) != -1
|| omp_get_active_level () != 2)
#pragma omp atomic
e[2] += 1;
}
}
}
if (e[0] || e[1] || e[2])
abort ();
return 0;
}
/libgomp.c/debug-1.c
0,0 → 1,162
/* PR debug/36617 */
/* { dg-do run } */
/* { dg-options "-g -fopenmp -O0" } */
 
int
f1 (void)
{
int v1i, v1j, v1k, v1l = 0;
v1i = 6;
v1j = 8;
#pragma omp parallel private (v1k) firstprivate (v1j) shared (v1i) reduction (+:v1l)
{
v1k = v1i + v1j;
{
int v1m = 1;
v1l = v1m;
}
}
return v1l;
}
 
int v2k = 9;
 
int
f2 (void)
{
int v2i = 6, v2j = 7;
#pragma omp single private (v2i) firstprivate (v2k)
{
int v2l = v2j + v2k;
v2i = 8;
v2k = 10;
v2j = v2l + v2i;
}
return v2i + v2j;
}
 
int
f3 (void)
{
int v3i = 6, v3j = 7, v3k = 9;
#pragma omp parallel
{
#pragma omp master
v3i++;
#pragma omp single private (v3i) firstprivate (v3k)
{
int v3l = v3j + v3k;
v3i = 8;
v3k = 10;
v3j = v3l + v3i;
}
#pragma omp atomic
v3k++;
}
return v3i + v3j;
}
 
int v4k = 9, v4l = 0;
 
int
f4 (void)
{
int v4i = 6, v4j = 7, v4n = 0;
#pragma omp sections private (v4i) firstprivate (v4k) reduction (+:v4l)
{
#pragma omp section
{
int v4m = v4j + v4k;
v4i = 8;
v4k = 10;
v4l++;
v4n = v4m + v4i;
}
#pragma omp section
{
int v4o = v4j + v4k;
v4i = 10;
v4k = 11;
v4l++;
}
}
return v4i + v4j + v4l + v4n;
}
 
int
f5 (void)
{
int v5i = 6, v5j = 7, v5k = 9, v5l = 0, v5n = 0, v5p = 0;
#pragma omp parallel
{
#pragma omp master
v5p++;
#pragma omp sections private (v5i) firstprivate (v5k) reduction (+:v5l)
{
#pragma omp section
{
int v5m = v5j + v5k;
v5i = 8;
v5k = 10;
v5l++;
v5n = v5m + v5i;
}
#pragma omp section
{
int v5o = v5j + v5k;
v5i = 10;
v5k = 11;
v5l++;
}
}
}
return v5i + v5j + v5l + v5n + v5p;
}
 
int v6k = 9, v6l = 0;
 
int
f6 (void)
{
int v6i = 6, v6j = 7, v6n = 0;
#pragma omp for private (v6i) firstprivate (v6k) reduction (+:v6l)
for (v6n = 0; v6n < 3; v6n++)
{
int v6m = v6j + v6k;
v6i = 8;
v6l++;
}
return v6i + v6j + v6k + v6l + v6n;
}
 
int
f7 (void)
{
int v7i = 6, v7j = 7, v7k = 9, v7l = 0, v7n = 0, v7o = 1;
#pragma omp parallel
{
#pragma omp master
v7o++;
#pragma omp for private (v7i) firstprivate (v7k) reduction (+:v7l)
for (v7n = 0; v7n < 3; v7n++)
{
int v7m = v7j + v7k;
v7i = 8;
v7l++;
}
}
return v7i + v7j + v7k + v7l + v7n;
}
 
int
main (void)
{
f1 ();
f2 ();
f3 ();
f4 ();
f5 ();
f6 ();
f7 ();
return 0;
}
/libgomp.c/sections-1.c
0,0 → 1,85
/* Test that all sections are touched. */
 
/* { dg-require-effective-target sync_int_long } */
 
#include <omp.h>
#include <string.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
#define N 100
static int data[N];
static int NTHR;
 
static void clean_data (void)
{
memset (data, -1, sizeof (data));
}
 
static void test_data (void)
{
int i;
 
for (i = 0; i < N; ++i)
assert (data[i] != -1);
}
 
static void set_data (unsigned i, int val)
{
int old;
assert (i >= 1 && i <= N);
old = __sync_lock_test_and_set (data+i-1, val);
assert (old == -1);
}
 
static void f_1 (void *dummy)
{
int iam = omp_get_thread_num ();
unsigned long s;
 
for (s = GOMP_sections_start (N); s ; s = GOMP_sections_next ())
set_data (s, iam);
GOMP_sections_end ();
}
 
static void test_1 (void)
{
clean_data ();
GOMP_parallel_start (f_1, NULL, NTHR);
f_1 (NULL);
GOMP_parallel_end ();
test_data ();
}
 
static void f_2 (void *dummy)
{
int iam = omp_get_thread_num ();
unsigned s;
 
while ((s = GOMP_sections_next ()))
set_data (s, iam);
GOMP_sections_end_nowait ();
}
 
static void test_2 (void)
{
clean_data ();
GOMP_parallel_sections_start (f_2, NULL, NTHR, N);
f_2 (NULL);
GOMP_parallel_end ();
test_data ();
}
 
int main()
{
omp_set_dynamic (0);
 
NTHR = 4;
 
test_1 ();
test_2 ();
 
return 0;
}
/libgomp.c/pr35625.c
0,0 → 1,18
/* PR libgomp/35625 */
/* { dg-do run } */
/* { dg-options "-std=c99" } */
 
int
main (void)
{
#pragma omp parallel
{
#pragma omp for schedule (guided, 10)
for (int i = 0; i < 1826; i += 10)
;
#pragma omp for schedule (guided, 10)
for (int i = 0; i > -1826; i -= 10)
;
}
return 0;
}
/libgomp.c/loop-12.c
0,0 → 1,387
/* { dg-do run } */
 
#include <omp.h>
 
extern void abort (void);
 
#define LLONG_MAX __LONG_LONG_MAX__
#define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
#define INT_MAX __INT_MAX__
 
int arr[6 * 5];
 
void
set (int loopidx, int idx)
{
#pragma omp atomic
arr[loopidx * 5 + idx]++;
}
 
#define check(var, val, loopidx, idx) \
if (var == (val)) set (loopidx, idx); else
#define test(loopidx, count) \
for (idx = 0; idx < 5; idx++) \
if (arr[loopidx * 5 + idx] != idx < count) \
abort (); \
else \
arr[loopidx * 5 + idx] = 0
 
int
test1 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(dynamic,1) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test2 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(guided,1) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test3 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(static) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(static) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(static) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test4 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(static,1) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test5 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(runtime) nowait
for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
main (void)
{
if (2 * sizeof (int) != sizeof (long long))
return 0;
test1 ();
test2 ();
test3 ();
test4 ();
omp_set_schedule (omp_sched_static, 0);
test5 ();
omp_set_schedule (omp_sched_static, 3);
test5 ();
omp_set_schedule (omp_sched_dynamic, 5);
test5 ();
omp_set_schedule (omp_sched_guided, 2);
test5 ();
return 0;
}
/libgomp.c/copyin-2.c
0,0 → 1,34
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-require-effective-target tls_runtime } */
 
#include <omp.h>
#include <stdlib.h>
 
struct { int t; char buf[64]; } thr = { 32, "" };
#pragma omp threadprivate (thr)
 
int
main (void)
{
int l = 0;
 
omp_set_dynamic (0);
omp_set_num_threads (6);
 
#pragma omp parallel copyin (thr) reduction (||:l)
{
l = thr.t != 32;
thr.t = omp_get_thread_num () + 11;
}
 
if (l || thr.t != 11)
abort ();
 
#pragma omp parallel reduction (||:l)
l = thr.t != omp_get_thread_num () + 11;
 
if (l)
abort ();
return 0;
}
/libgomp.c/task-2.c
0,0 → 1,53
extern void abort (void);
 
int
f1 (void)
{
int a = 6, e = 0;
int nested (int x)
{
return x + a;
}
#pragma omp task
{
int n = nested (5);
if (n != 11)
#pragma omp atomic
e += 1;
}
#pragma omp taskwait
return e;
}
 
int
f2 (void)
{
int a = 6, e = 0;
int nested (int x)
{
return x + a;
}
a = nested (4);
#pragma omp task
{
if (a != 10)
#pragma omp atomic
e += 1;
}
#pragma omp taskwait
return e;
}
 
int
main (void)
{
int e = 0;
#pragma omp parallel num_threads(4) reduction(+:e)
{
e += f1 ();
e += f2 ();
}
if (e)
abort ();
return 0;
}
/libgomp.c/omp_workshare1.c
0,0 → 1,47
/******************************************************************************
* FILE: omp_workshare1.c
* DESCRIPTION:
* OpenMP Example - Loop Work-sharing - C/C++ Version
* In this example, the iterations of a loop are scheduled dynamically
* across the team of threads. A thread will perform CHUNK iterations
* at a time before being scheduled for the next CHUNK of work.
* AUTHOR: Blaise Barney 5/99
* LAST REVISED: 04/06/05
******************************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define CHUNKSIZE 10
#define N 100
 
int main (int argc, char *argv[]) {
 
int nthreads, tid, i, chunk;
float a[N], b[N], c[N];
 
/* Some initializations */
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
chunk = CHUNKSIZE;
 
#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid)
{
tid = omp_get_thread_num();
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
printf("Thread %d starting...\n",tid);
 
#pragma omp for schedule(dynamic,chunk)
for (i=0; i<N; i++)
{
c[i] = a[i] + b[i];
printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
}
 
} /* end of parallel section */
 
return 0;
}
/libgomp.c/omp-loop02.c
0,0 → 1,32
#include <omp.h>
 
/* Orphaned work sharing. */
 
extern void abort (void);
 
#define N 10
 
void parloop (int *a)
{
int i;
 
#pragma omp for
for (i = 0; i < N; i++)
a[i] = i + 3;
}
 
main()
{
int i, a[N];
 
#pragma omp parallel shared(a)
{
parloop (a);
}
 
for (i = 0; i < N; i++)
if (a[i] != i + 3)
abort ();
 
return 0;
}
/libgomp.c/shared-2.c
0,0 → 1,50
#include <stdio.h>
#include <omp.h>
 
extern void abort (void);
 
void
parallel (int a, int b)
{
int bad, LASTPRIV, LASTPRIV_SEC;
int i;
 
a = b = 3;
 
bad = 0;
 
#pragma omp parallel firstprivate (a,b) shared (bad) num_threads (5)
{
if (a != 3 || b != 3)
bad = 1;
 
#pragma omp for lastprivate (LASTPRIV)
for (i = 0; i < 10; i++)
LASTPRIV = i;
 
#pragma omp sections lastprivate (LASTPRIV_SEC)
{
#pragma omp section
{ LASTPRIV_SEC = 3; }
 
#pragma omp section
{ LASTPRIV_SEC = 42; }
}
 
}
 
if (LASTPRIV != 9)
abort ();
 
if (LASTPRIV_SEC != 42)
abort ();
 
if (bad)
abort ();
}
 
int main()
{
parallel (1, 2);
return 0;
}
/libgomp.c/nestedfn-2.c
0,0 → 1,20
/* { dg-do run } */
 
extern void abort (void);
 
int
main (void)
{
int i;
void
foo (void)
{
#pragma omp master
i += 8;
}
i = 4;
foo ();
if (i != 12)
abort ();
return 0;
}
/libgomp.c/omp-nested-1.c
0,0 → 1,28
// { dg-do run }
 
extern void abort(void);
#define N 1000
 
int foo()
{
int i = 0, j;
 
#pragma omp parallel for num_threads(2) shared (i)
for (j = 0; j < N; ++j)
{
#pragma omp parallel num_threads(1) shared (i)
{
#pragma omp atomic
i++;
}
}
 
return i;
}
 
int main()
{
if (foo() != N)
abort ();
return 0;
}
/libgomp.c/autopar-1.c
0,0 → 1,44
/* { dg-do run } */
/* { dg-options "-ftree-parallelize-loops=4 -O2 -ffast-math" } */
 
extern void abort (void);
 
double d[1024], e[1024];
int f[1024], g[1024];
 
double __attribute__((noinline))
foo (void)
{
double s = 0.0;
int i;
for (i = 0; i < 1024; i++)
s += d[i] - e[i];
return s;
}
 
int __attribute__((noinline))
bar (void)
{
int s = 0, i;
for (i = 0; i < 1024; i++)
s += f[i] - g[i];
return s;
}
 
int
main (void)
{
int i;
for (i = 0; i < 1024; i++)
{
d[i] = i * 2;
e[i] = i;
f[i] = i * 2;
g[i] = i;
}
if (foo () != 1023 * 1024 / 2)
abort ();
if (bar () != 1023 * 1024 / 2)
abort ();
return 0;
}
/libgomp.c/nestedfn-6.c
0,0 → 1,21
extern void abort (void);
 
int j;
 
int
main (void)
{
int i;
void nested (void) { i = 0; }
#pragma omp parallel for lastprivate (i)
for (i = 0; i < 50; i += 3)
;
if (i != 51)
abort ();
#pragma omp parallel for lastprivate (j)
for (j = -50; j < 70; j += 7)
;
if (j != 76)
abort ();
return 0;
}
/libgomp.c/loop-4.c
0,0 → 1,28
/* { dg-do run } */
 
extern void abort (void);
 
int
main (void)
{
int e = 0;
#pragma omp parallel num_threads (4) reduction(+:e)
{
long i;
#pragma omp for schedule(dynamic,1)
for (i = __LONG_MAX__ - 30001; i <= __LONG_MAX__ - 10001; i += 10000)
if (i != __LONG_MAX__ - 30001
&& i != __LONG_MAX__ - 20001
&& i != __LONG_MAX__ - 10001)
e = 1;
#pragma omp for schedule(dynamic,1)
for (i = -__LONG_MAX__ + 30000; i >= -__LONG_MAX__ + 10000; i -= 10000)
if (i != -__LONG_MAX__ + 30000
&& i != -__LONG_MAX__ + 20000
&& i != -__LONG_MAX__ + 10000)
e = 1;
}
if (e)
abort ();
return 0;
}
/libgomp.c/atomic-1.c
0,0 → 1,62
/* { dg-do run } */
/* { dg-options "-O2 -march=pentium" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
 
#ifdef __i386__
#include "cpuid.h"
#endif
 
extern void abort (void);
double d;
struct
{
int i;
double e;
int j;
} x;
 
void
f1 (void)
{
#pragma omp atomic
d += 7.5;
#pragma omp atomic
d *= 2.5;
#pragma omp atomic
d /= 0.25;
}
 
void
f2 (void)
{
#pragma omp atomic
x.e += 7.5;
#pragma omp atomic
x.e *= 2.5;
#pragma omp atomic
x.e /= 0.25;
}
 
int
main (void)
{
#ifdef __i386__
unsigned int eax, ebx, ecx, edx;
 
if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
return 0;
 
if (!(edx & bit_CMPXCHG8B))
return 0;
#endif
 
d = 1.0;
f1 ();
if (d != 85.0)
abort ();
 
x.e = 1.0;
f2 ();
if (x.i != 0 || x.e != 85.0 || x.j != 0)
abort ();
return 0;
}
/libgomp.c/atomic-5.c
0,0 → 1,41
/* PR middle-end/36106 */
/* { dg-options "-O2" } */
/* { dg-options "-O2 -mcx16" { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
 
#ifdef __x86_64__
# include "cpuid.h"
#endif
 
extern void abort (void);
 
int __attribute__((noinline))
do_test (void)
{
long double d = .0L;
int i;
#pragma omp parallel for shared (d)
for (i = 0; i < 10; i++)
#pragma omp atomic
d += 1.0L;
if (d != 10.0L)
abort ();
return 0;
}
 
int
main (void)
{
#ifdef __x86_64__
unsigned int eax, ebx, ecx, edx;
 
if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
return 0;
 
if (!(ecx & bit_CMPXCHG16B))
return 0;
#endif
 
do_test ();
 
return 0;
}
/libgomp.c/loop-8.c
0,0 → 1,27
extern void abort (void);
 
int buf[256];
 
void __attribute__((noinline))
foo (void)
{
int i;
#pragma omp for schedule (auto)
for (i = 0; i < 256; i++)
buf[i] += i;
}
 
int
main (void)
{
int i;
#pragma omp parallel for schedule (auto)
for (i = 0; i < 256; i++)
buf[i] = i;
#pragma omp parallel num_threads (4)
foo ();
for (i = 0; i < 256; i++)
if (buf[i] != 2 * i)
abort ();
return 0;
}
/libgomp.c/single-2.c
0,0 → 1,15
#include <stdlib.h>
 
int
main (void)
{
int i;
i = 4;
#pragma omp single copyprivate (i)
{
i = 6;
}
if (i != 6)
abort ();
return 0;
}
/libgomp.c/pr36802-2.c
0,0 → 1,46
/* PR middle-end/36802 */
 
extern void abort (void);
 
int q;
 
int
foo (int k)
{
int i = 6, n = 0;
omp_set_dynamic (0);
omp_set_nested (1);
#pragma omp parallel shared (i) num_threads (3)
{
int l;
 
if (omp_get_num_threads () != 3)
#pragma omp atomic
n += 1;
else
#pragma omp for
for (l = 0; l < 3; l++)
if (k)
#pragma omp atomic
q += i;
else
#pragma omp parallel shared (i) num_threads (4)
{
if (omp_get_num_threads () != 4)
#pragma omp atomic
n += 1;
#pragma omp critical
i += 1;
}
}
if (n == 0 && i != 6 + 3 * 4)
abort ();
return 0;
}
 
int
main (void)
{
foo (0);
return 0;
}
/libgomp.c/pr26943-3.c
0,0 → 1,56
/* PR c++/26943 */
/* { dg-do run } */
 
extern int omp_set_dynamic (int);
extern int omp_get_thread_num (void);
extern void abort (void);
 
int a = 8, b = 12, c = 16, d = 20, j = 0, l = 0;
char e[10] = "a", f[10] = "b", g[10] = "c", h[10] = "d";
volatile int k;
 
int
main (void)
{
int i;
omp_set_dynamic (0);
omp_set_nested (1);
#pragma omp parallel num_threads (2) reduction (+:l)
if (k == omp_get_thread_num ())
{
#pragma omp parallel for shared (a, e) firstprivate (b, f) \
lastprivate (c, g) private (d, h) \
schedule (static, 1) num_threads (4) \
reduction (+:j)
for (i = 0; i < 4; i++)
{
if (a != 8 || b != 12 || e[0] != 'a' || f[0] != 'b')
j++;
#pragma omp barrier /* { dg-warning "may not be closely nested" } */
#pragma omp atomic
a += i;
b += i;
c = i;
d = i;
#pragma omp atomic
e[0] += i;
f[0] += i;
g[0] = 'g' + i;
h[0] = 'h' + i;
#pragma omp barrier /* { dg-warning "may not be closely nested" } */
if (a != 8 + 6 || b != 12 + i || c != i || d != i)
j += 8;
if (e[0] != 'a' + 6 || f[0] != 'b' + i || g[0] != 'g' + i)
j += 64;
if (h[0] != 'h' + i)
j += 512;
}
if (j || a != 8 + 6 || b != 12 || c != 3 || d != 20)
++l;
if (e[0] != 'a' + 6 || f[0] != 'b' || g[0] != 'g' + 3 || h[0] != 'd')
l += 8;
}
if (l)
abort ();
return 0;
}
/libgomp.c/atomic-12.c
0,0 → 1,98
/* { dg-do run } */
 
extern void abort (void);
_Bool v, x1, x2, x3, x4, x5, x6;
 
void
foo (void)
{
#pragma omp atomic capture
v = ++x1;
if (!v)
abort ();
#pragma omp atomic capture
v = x2++;
if (v)
abort ();
#pragma omp atomic capture
v = --x3;
if (v)
abort ();
#pragma omp atomic capture
v = x4--;
if (!v)
abort ();
#pragma omp atomic capture
{ v = x5; x5 |= 1; }
if (v)
abort ();
#pragma omp atomic capture
{ x6 |= 1; v = x6; }
if (!v)
abort ();
}
 
void
bar (void)
{
#pragma omp atomic write
x1 = 0;
#pragma omp atomic write
x2 = 0;
#pragma omp atomic write
x3 = 1;
#pragma omp atomic write
x4 = 1;
#pragma omp atomic capture
{ ++x1; v = x1; }
if (!v)
abort ();
#pragma omp atomic capture
{ v = x2; x2++; }
if (v)
abort ();
#pragma omp atomic capture
{ --x3; v = x3; }
if (v)
abort ();
#pragma omp atomic capture
{ v = x4; x4--; }
if (!v)
abort ();
#pragma omp atomic write
x1 = 0;
#pragma omp atomic write
x2 = 0;
#pragma omp atomic write
x3 = 1;
#pragma omp atomic write
x4 = 1;
#pragma omp atomic capture
{ x1++; v = x1; }
if (!v)
abort ();
#pragma omp atomic capture
{ v = x2; ++x2; }
if (v)
abort ();
#pragma omp atomic capture
{ x3--; v = x3; }
if (v)
abort ();
#pragma omp atomic capture
{ v = x4; --x4; }
if (!v)
abort ();
}
 
int
main ()
{
#pragma omp atomic write
x3 = 1;
#pragma omp atomic write
x4 = 1;
foo ();
bar ();
return 0;
}
/libgomp.c/reduction-4.c
0,0 → 1,36
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = 0, j = 0, k = 0, l = 0;
#pragma omp parallel num_threads(4) reduction(-:i) reduction(|:k) \
reduction(^:l)
{
if (i != 0 || k != 0 || l != 0)
#pragma omp atomic
j |= 1;
if (omp_get_num_threads () != 4)
#pragma omp atomic
j |= 2;
 
i = omp_get_thread_num ();
k = 1 << (2 * i);
l = 0xea << (3 * i);
}
 
if (j & 1)
abort ();
if ((j & 2) == 0)
{
if (i != (0 + 1 + 2 + 3))
abort ();
if (k != 0x55)
abort ();
if (l != 0x1e93a)
abort ();
}
return 0;
}
/libgomp.c/pr49898-1.c
0,0 → 1,26
/* PR middle-end/49898 */
/* { dg-do run } */
 
extern void abort (void);
 
int
main ()
{
int i, j, sum = 0;
#pragma omp parallel
{
#pragma omp for reduction(+:sum)
for (i = 0; i < 10; i++)
{
#pragma omp parallel
{
#pragma omp for reduction(+:sum)
for (j = 0; j < 10; j++)
sum += j;
}
}
}
if (sum != 450)
abort ();
return 0;
}
/libgomp.c/appendix-a/a.2.1.c
0,0 → 1,45
/* { dg-do run } */
 
#include <stdio.h>
#include <omp.h>
extern void abort (void);
int
main ()
{
int bad, x;
x = 2;
bad = 0;
#pragma omp parallel num_threads(2) shared(x, bad)
{
if (omp_get_thread_num () == 0)
{
volatile int i;
for (i = 0; i < 100000000; i++)
x = 5;
}
else
{
/* Print 1: the following read of x has a race */
if (x != 2 && x != 5)
bad = 1;
}
#pragma omp barrier
if (omp_get_thread_num () == 0)
{
/* x must be 5 now. */
if (x != 5)
bad = 1;
}
else
{
/* x must be 5 now. */
if (x != 5)
bad = 1;
}
}
 
if (bad)
abort ();
 
return 0;
}
/libgomp.c/appendix-a/a.3.1.c
0,0 → 1,11
/* { dg-do run } */
 
#include <stdio.h>
int
main ()
{
# ifdef _OPENMP
printf ("Compiled by an OpenMP-compliant implementation.\n");
# endif
return 0;
}
/libgomp.c/appendix-a/a.21.1.c
0,0 → 1,25
/* { dg-do run } */
 
#include <stdio.h>
void
work (int k)
{
#pragma omp ordered
printf (" %d\n", k);
}
 
void
a21 (int lb, int ub, int stride)
{
int i;
#pragma omp parallel for ordered schedule(dynamic)
for (i = lb; i < ub; i += stride)
work (i);
}
 
int
main ()
{
a21 (0, 100, 5);
return 0;
}
/libgomp.c/appendix-a/a.40.1.c
0,0 → 1,48
/* { dg-do compile } */
 
#include <omp.h>
typedef struct
{
int a, b;
omp_nest_lock_t lck;
} pair;
int work1 ();
int work2 ();
int work3 ();
void
incr_a (pair * p, int a)
{
/* Called only from incr_pair, no need to lock. */
p->a += a;
}
 
void
incr_b (pair * p, int b)
{
/* Called both from incr_pair and elsewhere, */
/* so need a nestable lock. */
omp_set_nest_lock (&p->lck);
p->b += b;
omp_unset_nest_lock (&p->lck);
}
 
void
incr_pair (pair * p, int a, int b)
{
omp_set_nest_lock (&p->lck);
incr_a (p, a);
incr_b (p, b);
omp_unset_nest_lock (&p->lck);
}
 
void
a40 (pair * p)
{
#pragma omp parallel sections
{
#pragma omp section
incr_pair (p, work1 (), work2 ());
#pragma omp section
incr_b (p, work3 ());
}
}
/libgomp.c/appendix-a/a.4.1.c
0,0 → 1,38
/* { dg-do run } */
 
#include <omp.h>
extern void abort (void);
void
subdomain (float *x, int istart, int ipoints)
{
int i;
for (i = 0; i < ipoints; i++)
x[istart + i] = 123.456;
}
 
void
sub (float *x, int npoints)
{
int iam, nt, ipoints, istart;
#pragma omp parallel default(shared) private(iam,nt,ipoints,istart)
{
iam = omp_get_thread_num ();
nt = omp_get_num_threads ();
ipoints = npoints / nt; /* size of partition */
istart = iam * ipoints; /* starting array index */
if (iam == nt - 1) /* last thread may do more */
ipoints = npoints - istart;
subdomain (x, istart, ipoints);
}
}
int
main ()
{
int i;
float array[10000];
sub (array, 10000);
for (i = 0; i < 10000; i++)
if (array[i] < 123.45 || array[i] > 123.46)
abort ();
return 0;
}
/libgomp.c/appendix-a/a.5.1.c
0,0 → 1,13
/* { dg-do run } */
 
#include <omp.h>
int
main ()
{
omp_set_dynamic (1);
#pragma omp parallel num_threads(10)
{
/* do work here */
}
return 0;
}
/libgomp.c/appendix-a/a.15.1.c
0,0 → 1,44
/* { dg-do run } */
 
#include <stdio.h>
 
void
work (int n)
{
printf ("[%d of %d], nested = %d, n = %d\n", omp_get_thread_num (), omp_get_num_threads(), omp_get_nested (), n);
}
 
void
sub3 (int n)
{
work (n);
#pragma omp barrier
work (n);
}
 
void
sub2 (int k)
{
#pragma omp parallel shared(k)
sub3 (k);
}
 
void
sub1 (int n)
{
int i;
#pragma omp parallel private(i) shared(n)
{
#pragma omp for
for (i = 0; i < n; i++)
sub2 (i);
}
}
int
main ()
{
sub1 (2);
sub2 (15);
sub3 (20);
return 0;
}
/libgomp.c/appendix-a/a.16.1.c
0,0 → 1,47
/* { dg-do run } */
 
#include <stdio.h>
 
float
work1 (int i)
{
return 1.0 * i;
}
 
float
work2 (int i)
{
return 2.0 * i;
}
 
void
a16 (float *x, float *y, int *index, int n)
{
int i;
#pragma omp parallel for shared(x, y, index, n)
for (i = 0; i < n; i++)
{
#pragma omp atomic
x[index[i]] += work1 (i);
y[i] += work2 (i);
}
}
int
main ()
{
float x[1000];
float y[10000];
int index[10000];
int i;
for (i = 0; i < 10000; i++)
{
index[i] = i % 1000;
y[i] = 0.0;
}
for (i = 0; i < 1000; i++)
x[i] = 0.0;
a16 (x, y, index, 10000);
for (i = 0; i < 10; i++)
printf ("x[%d] = %f, y[%d] = %f\n", i, x[i], i, y[i]);
return 0;
}
/libgomp.c/appendix-a/a.26.1.c
0,0 → 1,17
/* { dg-do run } */
 
#include <stdio.h>
int
main ()
{
int i, j;
i = 1;
j = 2;
#pragma omp parallel private(i) firstprivate(j)
{
i = 3;
j = j + 2;
}
printf ("%d %d\n", i, j); /* i and j are undefined */
return 0;
}
/libgomp.c/appendix-a/a.33.3.c
0,0 → 1,16
/* { dg-do compile } */
 
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
omp_lock_t *
new_lock ()
{
omp_lock_t *lock_ptr;
#pragma omp single copyprivate(lock_ptr)
{
lock_ptr = (omp_lock_t *) malloc (sizeof (omp_lock_t));
omp_init_lock (lock_ptr);
}
return lock_ptr;
}
/libgomp.c/appendix-a/a.18.1.c
0,0 → 1,67
/* { dg-do run } */
 
#include <omp.h>
#include <stdio.h>
 
extern void abort (void);
 
#define NUMBER_OF_THREADS 4
 
int synch[NUMBER_OF_THREADS];
int work[NUMBER_OF_THREADS];
int result[NUMBER_OF_THREADS];
int
fn1 (int i)
{
return i * 2;
}
 
int
fn2 (int a, int b)
{
return a + b;
}
 
int
main ()
{
int i, iam, neighbor;
omp_set_num_threads (NUMBER_OF_THREADS);
#pragma omp parallel private(iam,neighbor) shared(work,synch)
{
iam = omp_get_thread_num ();
synch[iam] = 0;
#pragma omp barrier
/*Do computation into my portion of work array */
work[iam] = fn1 (iam);
/* Announce that I am done with my work. The first flush
* ensures that my work is made visible before synch.
* The second flush ensures that synch is made visible.
*/
#pragma omp flush(work,synch)
synch[iam] = 1;
#pragma omp flush(synch)
/* Wait for neighbor. The first flush ensures that synch is read
* from memory, rather than from the temporary view of memory.
* The second flush ensures that work is read from memory, and
* is done so after the while loop exits.
*/
neighbor = (iam > 0 ? iam : omp_get_num_threads ()) - 1;
while (synch[neighbor] == 0)
{
#pragma omp flush(synch)
}
#pragma omp flush(work,synch)
/* Read neighbor's values of work array */
result[iam] = fn2 (work[neighbor], work[iam]);
}
/* output result here */
for (i = 0; i < NUMBER_OF_THREADS; i++)
{
neighbor = (i > 0 ? i : NUMBER_OF_THREADS) - 1;
if (result[i] != i * 2 + neighbor * 2)
abort ();
}
 
return 0;
}
/libgomp.c/appendix-a/a.36.1.c
0,0 → 1,31
/* { dg-do run } */
 
#include <omp.h>
#include <stdlib.h>
void
do_by_16 (float *x, int iam, int ipoints)
{
}
 
void
a36 (float *x, int npoints)
{
int iam, ipoints;
omp_set_dynamic (0);
omp_set_num_threads (16);
#pragma omp parallel shared(x, npoints) private(iam, ipoints)
{
if (omp_get_num_threads () != 16)
abort ();
iam = omp_get_thread_num ();
ipoints = npoints / 16;
do_by_16 (x, iam, ipoints);
}
}
 
int main()
{
float a[10];
a36 (a, 10);
return 0;
}
/libgomp.c/appendix-a/a.19.1.c
0,0 → 1,55
/* { dg-do run } */
 
int x, *p = &x;
extern void abort (void);
void
f1 (int *q)
{
*q = 1;
#pragma omp flush
/* x, p, and *q are flushed */
/* because they are shared and accessible */
/* q is not flushed because it is not shared. */
}
 
void
f2 (int *q)
{
#pragma omp barrier
*q = 2;
#pragma omp barrier
/* a barrier implies a flush */
/* x, p, and *q are flushed */
/* because they are shared and accessible */
/* q is not flushed because it is not shared. */
}
 
int
g (int n)
{
int i = 1, j, sum = 0;
*p = 1;
#pragma omp parallel reduction(+: sum) num_threads(2)
{
f1 (&j);
/* i, n and sum were not flushed */
/* because they were not accessible in f1 */
/* j was flushed because it was accessible */
sum += j;
f2 (&j);
/* i, n, and sum were not flushed */
/* because they were not accessible in f2 */
/* j was flushed because it was accessible */
sum += i + j + *p + n;
}
return sum;
}
 
int
main ()
{
int result = g (10);
if (result != 30)
abort ();
return 0;
}
/libgomp.c/appendix-a/a.29.1.c
0,0 → 1,30
/* { dg-do run } */
 
#include <assert.h>
int A[2][2] = { 1, 2, 3, 4 };
void
f (int n, int B[n][n], int C[])
{
int D[2][2] = { 1, 2, 3, 4 };
int E[n][n];
assert (n >= 2);
E[1][1] = 4;
#pragma omp parallel firstprivate(B, C, D, E)
{
assert (sizeof (B) == sizeof (int (*)[n]));
assert (sizeof (C) == sizeof (int *));
assert (sizeof (D) == 4 * sizeof (int));
assert (sizeof (E) == n * n * sizeof (int));
/* Private B and C have values of original B and C. */
assert (&B[1][1] == &A[1][1]);
assert (&C[3] == &A[1][1]);
assert (D[1][1] == 4);
assert (E[1][1] == 4);
}
}
int
main ()
{
f (2, A, A[0]);
return 0;
}
/libgomp.c/appendix-a/a.39.1.c
0,0 → 1,38
/* { dg-do run } */
 
#include <stdio.h>
#include <omp.h>
void
skip (int i)
{
}
 
void
work (int i)
{
}
int
main ()
{
omp_lock_t lck;
int id;
omp_init_lock (&lck);
#pragma omp parallel shared(lck) private(id)
{
id = omp_get_thread_num ();
omp_set_lock (&lck);
/* only one thread at a time can execute this printf */
printf ("My thread id is %d.\n", id);
omp_unset_lock (&lck);
while (!omp_test_lock (&lck))
{
skip (id); /* we do not yet have the lock,
so we must do something else */
}
work (id); /* we now have the lock
and can do the work */
omp_unset_lock (&lck);
}
omp_destroy_lock (&lck);
return 0;
}
/libgomp.c/vla-1.c
0,0 → 1,60
/* { dg-do run } */
 
#include <omp.h>
#include <stdlib.h>
#include <string.h>
 
int
main (int argc, char **argv[])
{
int n = argc < 5 ? 12 : 31, i, m, l;
char a[n + 3];
unsigned short b[n / 2 - 1];
int c[n * 2 + 1];
 
for (i = 0; i < n + 3; i++)
a[i] = i;
for (i = 0; i < n / 2 - 1; i++)
b[i] = (i << 8) | i;
for (i = 0; i < n * 2 + 1; i++)
c[i] = (i << 24) | i;
l = 0;
m = n;
#pragma omp parallel default (shared) num_threads (4) \
firstprivate (a, m) private (b, i) reduction (+:l)
{
for (i = 0; i < m + 3; i++)
if (a[i] != i)
l++;
for (i = 0; i < m * 2 + 1; i++)
if (c[i] != ((i << 24) | i))
l++;
#pragma omp barrier
memset (a, omp_get_thread_num (), m + 3);
for (i = 0; i < m / 2 - 1; i++)
b[i] = a[0] + 7;
#pragma omp master
{
for (i = 0; i < m * 2 + 1; i++)
c[i] = a[0] + 16;
}
#pragma omp barrier
if (a[0] != omp_get_thread_num ())
l++;
for (i = 1; i < m + 3; i++)
if (a[i] != a[0])
l++;
for (i = 0; i < m / 2 - 1; i++)
if (b[i] != a[0] + 7)
l++;
for (i = 0; i < m * 2 + 1; i++)
if (c[i] != 16)
l++;
}
if (l)
abort ();
for (i = 0; i < n * 2 + 1; i++)
if (c[i] != 16)
l++;
return 0;
}
/libgomp.c/pr26171.c
0,0 → 1,14
/* PR c/26171 */
/* { dg-do run } */
/* { dg-options "-fopenmp" } */
/* { dg-require-effective-target tls_runtime } */
 
int thrv = 0;
#pragma omp threadprivate (thrv)
 
int
main ()
{
thrv = 1;
return 0;
}
/libgomp.c/pr30494.c
0,0 → 1,64
/* PR middle-end/30494 */
/* { dg-do run } */
 
#include <omp.h>
 
int errors;
 
int
check (int m, int i, int *v, int *w)
{
int j;
int n = omp_get_thread_num ();
for (j = 0; j < m; j++)
if (v[j] != j + n)
#pragma omp atomic
errors += 1;
for (j = 0; j < m * 3 + i; j++)
if (w[j] != j + 10 + n)
#pragma omp atomic
errors += 1;
}
 
int
foo (int n, int m)
{
int i;
#pragma omp for
for (i = 0; i < 6; i++)
{
int v[n], w[n * 3 + i], j;
for (j = 0; j < n; j++)
v[j] = j + omp_get_thread_num ();
for (j = 0; j < n * 3 + i; j++)
w[j] = j + 10 + omp_get_thread_num ();
check (m, i, v, w);
}
return 0;
}
 
int
bar (int n, int m)
{
int i;
#pragma omp parallel for num_threads (4)
for (i = 0; i < 6; i++)
{
int v[n], w[n * 3 + i], j;
for (j = 0; j < n; j++)
v[j] = j + omp_get_thread_num ();
for (j = 0; j < n * 3 + i; j++)
w[j] = j + 10 + omp_get_thread_num ();
check (m, i, v, w);
}
return 0;
}
 
int
main (void)
{
#pragma omp parallel num_threads (3)
foo (128, 128);
bar (256, 256);
return 0;
}
/libgomp.c/lock-1.c
0,0 → 1,31
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int l = 0;
omp_nest_lock_t lock;
omp_init_nest_lock (&lock);
if (omp_test_nest_lock (&lock) != 1)
abort ();
if (omp_test_nest_lock (&lock) != 2)
abort ();
#pragma omp parallel if (0) reduction (+:l)
{
/* In OpenMP 2.5 this was supposed to return 3,
but in OpenMP 3.0 the parallel region has a different
task and omp_*_lock_t are owned by tasks, not by threads. */
if (omp_test_nest_lock (&lock) != 0)
l++;
}
if (l)
abort ();
if (omp_test_nest_lock (&lock) != 3)
abort ();
omp_unset_nest_lock (&lock);
omp_unset_nest_lock (&lock);
omp_unset_nest_lock (&lock);
omp_destroy_nest_lock (&lock);
return 0;
}
/libgomp.c/critical-1.c
0,0 → 1,39
/* Trivial test of critical sections. */
 
/* { dg-require-effective-target sync_int_long } */
 
#include <omp.h>
#include <sys/time.h>
#include <unistd.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
static volatile int test = -1;
 
static void function(void *dummy)
{
int iam = omp_get_thread_num ();
int old;
 
GOMP_critical_start ();
 
old = __sync_lock_test_and_set (&test, iam);
assert (old == -1);
 
usleep (10);
test = -1;
 
GOMP_critical_end ();
}
 
int main()
{
omp_set_dynamic (0);
 
GOMP_parallel_start (function, NULL, 3);
function (NULL);
GOMP_parallel_end ();
 
return 0;
}
/libgomp.c/omp_matvec.c
0,0 → 1,72
/******************************************************************************
* OpenMP Example - Matrix-vector multiplication - C/C++ Version
* FILE: omp_matvec.c
* DESCRIPTION:
* This example multiplies all row i elements of matrix A with vector
* element b(i) and stores the summed products in vector c(i). A total is
* maintained for the entire matrix. Performed by using the OpenMP loop
* work-sharing construct. The update of the shared global total is
* serialized by using the OpenMP critical directive.
* SOURCE: Blaise Barney 5/99
* LAST REVISED:
******************************************************************************/
 
#include <omp.h>
#include <stdio.h>
#define SIZE 10
 
 
main ()
{
 
float A[SIZE][SIZE], b[SIZE], c[SIZE], total;
int i, j, tid;
 
/* Initializations */
total = 0.0;
for (i=0; i < SIZE; i++)
{
for (j=0; j < SIZE; j++)
A[i][j] = (j+1) * 1.0;
b[i] = 1.0 * (i+1);
c[i] = 0.0;
}
printf("\nStarting values of matrix A and vector b:\n");
for (i=0; i < SIZE; i++)
{
printf(" A[%d]= ",i);
for (j=0; j < SIZE; j++)
printf("%.1f ",A[i][j]);
printf(" b[%d]= %.1f\n",i,b[i]);
}
printf("\nResults by thread/row:\n");
 
/* Create a team of threads and scope variables */
#pragma omp parallel shared(A,b,c,total) private(tid,i)
{
tid = omp_get_thread_num();
 
/* Loop work-sharing construct - distribute rows of matrix */
#pragma omp for private(j)
for (i=0; i < SIZE; i++)
{
for (j=0; j < SIZE; j++)
c[i] += (A[i][j] * b[i]);
 
/* Update and display of running total must be serialized */
#pragma omp critical
{
total = total + c[i];
printf(" thread %d did row %d\t c[%d]=%.2f\t",tid,i,i,c[i]);
printf("Running total= %.2f\n",total);
}
 
} /* end of parallel i loop */
 
} /* end of parallel construct */
 
printf("\nMatrix-vector total - sum of all c[] = %.2f\n\n",total);
 
return 0;
}
 
/libgomp.c/pr35549.c
0,0 → 1,30
/* PR middle-end/35549 */
/* { dg-do run } */
 
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = 6, n = 0;
omp_set_dynamic (0);
omp_set_nested (1);
#pragma omp parallel shared (i) num_threads (3)
{
if (omp_get_num_threads () != 3)
#pragma omp atomic
n += 1;
#pragma omp parallel shared (i) num_threads (4)
{
if (omp_get_num_threads () != 4)
#pragma omp atomic
n += 1;
#pragma omp critical
i += 1;
}
}
if (n == 0 && i != 6 + 3 * 4)
abort ();
return 0;
}
/libgomp.c/pr29947-1.c
0,0 → 1,328
/* PR libgomp/29947 */
 
/* { dg-do run } */
 
extern void abort (void);
 
int cnt;
 
void
test1 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (dynamic)
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test2 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (dynamic)
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test3 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (guided)
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test4 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (guided)
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test5 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (dynamic) ordered
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test6 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (dynamic) ordered
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test7 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (guided) ordered
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test8 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (guided) ordered
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test9 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (dynamic)
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test10 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (dynamic)
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test11 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (guided)
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test12 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (guided)
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test13 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (dynamic) ordered
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test14 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (dynamic) ordered
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test15 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (guided) ordered
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test16 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (guided) ordered
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
int
__attribute__((noinline))
test (long j1, long k1, long j2, long k2)
{
test1 (j1, k1, j2, k2);
test2 (j1, k1, j2, k2);
test3 (j1, k1, j2, k2);
test4 (j1, k1, j2, k2);
test5 (j1, k1, j2, k2);
test6 (j1, k1, j2, k2);
test7 (j1, k1, j2, k2);
test8 (j1, k1, j2, k2);
test9 (j1, k1, j2, k2);
test10 (j1, k1, j2, k2);
test11 (j1, k1, j2, k2);
test12 (j1, k1, j2, k2);
test13 (j1, k1, j2, k2);
test14 (j1, k1, j2, k2);
test15 (j1, k1, j2, k2);
test16 (j1, k1, j2, k2);
return cnt;
}
 
int
main (void)
{
test (1, 5, 1, 5);
test (5, 5, 5, 5);
test (5, 4, 5, 4);
test (5, 1, 5, 1);
return 0;
}
/libgomp.c/copyin-3.c
0,0 → 1,42
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-require-effective-target tls_runtime } */
 
#include <omp.h>
#include <stdlib.h>
 
int thr;
#pragma omp threadprivate (thr)
 
int
test (int l)
{
return l || (thr != omp_get_thread_num () * 2);
}
 
int
main (void)
{
int l = 0;
 
omp_set_dynamic (0);
omp_set_num_threads (6);
 
thr = 8;
/* Broadcast the value to all threads. */
#pragma omp parallel copyin (thr)
;
 
#pragma omp parallel reduction (||:l)
{
/* Now test if the broadcast succeeded. */
l = thr != 8;
thr = omp_get_thread_num () * 2;
#pragma omp barrier
l = test (l);
}
 
if (l)
abort ();
return 0;
}
/libgomp.c/omp_workshare2.c
0,0 → 1,64
/******************************************************************************
* FILE: omp_workshare2.c
* DESCRIPTION:
* OpenMP Example - Sections Work-sharing - C/C++ Version
* In this example, the OpenMP SECTION directive is used to assign
* different array operations to threads that execute a SECTION. Each
* thread receives its own copy of the result array to work with.
* AUTHOR: Blaise Barney 5/99
* LAST REVISED: 04/06/05
******************************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define N 50
 
int main (int argc, char *argv[]) {
 
int i, nthreads, tid;
float a[N], b[N], c[N];
 
/* Some initializations */
for (i=0; i<N; i++)
a[i] = b[i] = i * 1.0;
 
#pragma omp parallel shared(a,b,nthreads) private(c,i,tid)
{
tid = omp_get_thread_num();
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
printf("Thread %d starting...\n",tid);
 
#pragma omp sections nowait
{
#pragma omp section
{
printf("Thread %d doing section 1\n",tid);
for (i=0; i<N; i++)
{
c[i] = a[i] + b[i];
printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
}
}
 
#pragma omp section
{
printf("Thread %d doing section 2\n",tid);
for (i=0; i<N; i++)
{
c[i] = a[i] * b[i];
printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
}
}
 
} /* end of sections */
 
printf("Thread %d done.\n",tid);
 
} /* end of parallel section */
 
return 0;
}
/libgomp.c/task-3.c
0,0 → 1,70
/* { dg-do run } */
 
#include <omp.h>
extern void abort ();
 
int l = 5;
 
int
foo (int i)
{
int j = 7;
const int k = 8;
#pragma omp task firstprivate (i) shared (j, l)
{
#pragma omp critical
{
j += i;
l += k;
}
}
i++;
#pragma omp task firstprivate (i) shared (j, l)
{
#pragma omp critical
{
j += i;
l += k;
}
}
i++;
#pragma omp task firstprivate (i) shared (j, l)
{
#pragma omp critical
{
j += i;
l += k;
}
}
i++;
#pragma omp task firstprivate (i) shared (j, l)
{
#pragma omp critical
{
j += i;
l += k;
}
}
i++;
#pragma omp taskwait
return (i != 8 * omp_get_thread_num () + 4
|| j != 4 * i - 3
|| k != 8);
}
 
int
main (void)
{
int r = 0;
#pragma omp parallel num_threads (4) reduction(+:r)
if (omp_get_num_threads () != 4)
{
#pragma omp master
l = 133;
}
else if (foo (8 * omp_get_thread_num ()))
r++;
if (r || l != 133)
abort ();
return 0;
}
/libgomp.c/lib-1.c
0,0 → 1,99
#include <stdlib.h>
#include <omp.h>
 
int
main (void)
{
double d, e;
int l;
omp_lock_t lck;
omp_nest_lock_t nlck;
 
d = omp_get_wtime ();
 
omp_init_lock (&lck);
omp_set_lock (&lck);
if (omp_test_lock (&lck))
abort ();
omp_unset_lock (&lck);
if (! omp_test_lock (&lck))
abort ();
if (omp_test_lock (&lck))
abort ();
omp_unset_lock (&lck);
omp_destroy_lock (&lck);
 
omp_init_nest_lock (&nlck);
if (omp_test_nest_lock (&nlck) != 1)
abort ();
omp_set_nest_lock (&nlck);
if (omp_test_nest_lock (&nlck) != 3)
abort ();
omp_unset_nest_lock (&nlck);
omp_unset_nest_lock (&nlck);
if (omp_test_nest_lock (&nlck) != 2)
abort ();
omp_unset_nest_lock (&nlck);
omp_unset_nest_lock (&nlck);
omp_destroy_nest_lock (&nlck);
 
omp_set_dynamic (1);
if (! omp_get_dynamic ())
abort ();
omp_set_dynamic (0);
if (omp_get_dynamic ())
abort ();
 
omp_set_nested (1);
if (! omp_get_nested ())
abort ();
omp_set_nested (0);
if (omp_get_nested ())
abort ();
 
omp_set_num_threads (5);
if (omp_get_num_threads () != 1)
abort ();
if (omp_get_max_threads () != 5)
abort ();
if (omp_get_thread_num () != 0)
abort ();
omp_set_num_threads (3);
if (omp_get_num_threads () != 1)
abort ();
if (omp_get_max_threads () != 3)
abort ();
if (omp_get_thread_num () != 0)
abort ();
l = 0;
#pragma omp parallel reduction (|:l)
{
l = omp_get_num_threads () != 3;
l |= omp_get_thread_num () < 0;
l |= omp_get_thread_num () >= 3;
#pragma omp master
l |= omp_get_thread_num () != 0;
}
if (l)
abort ();
 
if (omp_get_num_procs () <= 0)
abort ();
if (omp_in_parallel ())
abort ();
#pragma omp parallel reduction (|:l)
l = ! omp_in_parallel ();
#pragma omp parallel reduction (|:l) if (1)
l = ! omp_in_parallel ();
 
e = omp_get_wtime ();
if (d > e)
abort ();
d = omp_get_wtick ();
/* Negative precision is definitely wrong,
bigger than 1s clock resolution is also strange. */
if (d <= 0 || d > 1)
abort ();
 
return 0;
}
/libgomp.c/omp-loop03.c
0,0 → 1,26
extern void abort (void);
int a;
 
void
foo ()
{
int i;
a = 30;
#pragma omp barrier
#pragma omp for lastprivate (a)
for (i = 0; i < 1024; i++)
{
a = i;
}
if (a != 1023)
abort ();
}
 
int
main (void)
{
#pragma omp parallel num_threads (64)
foo ();
 
return 0;
}
/libgomp.c/shared-3.c
0,0 → 1,19
/* { dg-do run } */
 
void abort (void);
 
int main()
{
int x;
int *p;
 
p = &x;
 
#pragma omp parallel
{
if (p != &x)
abort ();
}
 
return 0;
}
/libgomp.c/nestedfn-3.c
0,0 → 1,52
/* { dg-do run } */
 
#include <omp.h>
 
extern void abort (void);
 
int
main (void)
{
int i = 5, l = 0;
int foo (void) { return i == 6; }
int bar (void) { return i - 3; }
 
omp_set_dynamic (0);
 
#pragma omp parallel if (foo ()) num_threads (bar ()) reduction (|:l)
if (omp_get_num_threads () != 1)
l = 1;
 
i++;
 
#pragma omp parallel if (foo ()) num_threads (bar ()) reduction (|:l)
if (omp_get_num_threads () != 3)
l = 1;
 
i++;
 
#pragma omp master
if (bar () != 4)
abort ();
 
#pragma omp single
{
if (foo ())
abort ();
i--;
if (! foo ())
abort ();
}
 
if (l)
abort ();
 
i = 8;
#pragma omp atomic
l += bar ();
 
if (l != 5)
abort ();
 
return 0;
}
/libgomp.c/loop-1.c
0,0 → 1,140
/* Test that all loop iterations are touched. This doesn't verify
scheduling order, merely coverage. */
 
/* { dg-require-effective-target sync_int_long } */
 
#include <omp.h>
#include <string.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
#define N 10000
static int S, E, INCR, CHUNK, NTHR;
static int data[N];
 
static void clean_data (void)
{
memset (data, -1, sizeof (data));
}
 
static void test_data (void)
{
int i, j;
 
for (i = 0; i < S; ++i)
assert (data[i] == -1);
 
for (j = 0; i < E; ++i, j = (j + 1) % INCR)
if (j == 0)
assert (data[i] != -1);
else
assert (data[i] == -1);
 
for (; i < N; ++i)
assert (data[i] == -1);
}
 
static void set_data (long i, int val)
{
int old;
assert (i >= 0 && i < N);
old = __sync_lock_test_and_set (data+i, val);
assert (old == -1);
}
 
#define TMPL_1(sched) \
static void f_##sched##_1 (void *dummy) \
{ \
int iam = omp_get_thread_num (); \
long s0, e0, i; \
if (GOMP_loop_##sched##_start (S, E, INCR, CHUNK, &s0, &e0)) \
do \
{ \
for (i = s0; i < e0; i += INCR) \
set_data (i, iam); \
} \
while (GOMP_loop_##sched##_next (&s0, &e0)); \
GOMP_loop_end (); \
} \
static void t_##sched##_1 (void) \
{ \
clean_data (); \
GOMP_parallel_start (f_##sched##_1, NULL, NTHR); \
f_##sched##_1 (NULL); \
GOMP_parallel_end (); \
test_data (); \
}
 
TMPL_1(static)
TMPL_1(dynamic)
TMPL_1(guided)
 
#define TMPL_2(sched) \
static void f_##sched##_2 (void *dummy) \
{ \
int iam = omp_get_thread_num (); \
long s0, e0, i; \
while (GOMP_loop_##sched##_next (&s0, &e0)) \
{ \
for (i = s0; i < e0; i += INCR) \
set_data (i, iam); \
} \
GOMP_loop_end_nowait (); \
} \
static void t_##sched##_2 (void) \
{ \
clean_data (); \
GOMP_parallel_loop_##sched##_start \
(f_##sched##_2, NULL, NTHR, S, E, INCR, CHUNK); \
f_##sched##_2 (NULL); \
GOMP_parallel_end (); \
test_data (); \
}
 
TMPL_2(static)
TMPL_2(dynamic)
TMPL_2(guided)
 
static void test (void)
{
t_static_1 ();
t_dynamic_1 ();
t_guided_1 ();
t_static_2 ();
t_dynamic_2 ();
t_guided_2 ();
}
 
int main()
{
omp_set_dynamic (0);
 
NTHR = 4;
 
S = 0, E = N, INCR = 1, CHUNK = 4;
test ();
 
S = 0, E = N, INCR = 2, CHUNK = 4;
test ();
 
S = 1, E = N-1, INCR = 1, CHUNK = 5;
test ();
 
S = 1, E = N-1, INCR = 2, CHUNK = 5;
test ();
 
S = 2, E = 4, INCR = 1, CHUNK = 1;
test ();
 
S = 0, E = N, INCR = 1, CHUNK = 0;
t_static_1 ();
t_static_2 ();
 
S = 1, E = N-1, INCR = 1, CHUNK = 0;
t_static_1 ();
t_static_2 ();
 
return 0;
}
/libgomp.c/omp_reduction.c
0,0 → 1,35
/******************************************************************************
* FILE: omp_reduction.c
* DESCRIPTION:
* OpenMP Example - Combined Parallel Loop Reduction - C/C++ Version
* This example demonstrates a sum reduction within a combined parallel loop
* construct. Notice that default data element scoping is assumed - there
* are no clauses specifying shared or private variables. OpenMP will
* automatically make loop index variables private within team threads, and
* global variables shared.
* AUTHOR: Blaise Barney 5/99
* LAST REVISED: 04/06/05
******************************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
 
int main (int argc, char *argv[]) {
 
int i, n;
float a[100], b[100], sum;
 
/* Some initializations */
n = 100;
for (i=0; i < n; i++)
a[i] = b[i] = i * 1.0;
sum = 0.0;
 
#pragma omp parallel for reduction(+:sum)
for (i=0; i < n; i++)
sum = sum + (a[i] * b[i]);
 
printf(" Sum = %f\n",sum);
 
return 0;
}
/libgomp.c/atomic-2.c
0,0 → 1,37
/* { dg-do run } */
/* { dg-options "-O2 -mcx16" { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
 
#ifdef __x86_64__
#include "cpuid.h"
#endif
 
double d = 1.5;
long double ld = 3;
extern void abort (void);
 
void
test (void)
{
#pragma omp atomic
d *= 1.25;
#pragma omp atomic
ld /= 0.75;
if (d != 1.875 || ld != 4.0L)
abort ();
}
 
int
main (void)
{
#ifdef __x86_64__
unsigned int eax, ebx, ecx, edx;
 
if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
return 0;
 
if (!(ecx & bit_CMPXCHG16B))
return 0;
#endif
test ();
return 0;
}
/libgomp.c/loop-5.c
0,0 → 1,276
#include <omp.h>
#include <stdlib.h>
#include <string.h>
 
int
test1 (void)
{
short int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[10]; p < &buf[54]; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[3]; p <= &buf[63]; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[16]; p < &buf[51]; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[16]; p <= &buf[40]; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[53]; p > &buf[9]; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[63]; p >= &buf[3]; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[48]; p > &buf[15]; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
for (p = &buf[40]; p >= &buf[16]; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test2 (void)
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[10]; p < &buf[54]; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[3]; p <= &buf[63]; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[16]; p < &buf[51]; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[16]; p <= &buf[40]; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[53]; p > &buf[9]; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[63]; p >= &buf[3]; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[48]; p > &buf[15]; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
for (p = &buf[40]; p >= &buf[16]; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test3 (void)
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[10]; p < &buf[54]; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[3]; p <= &buf[63]; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[16]; p < &buf[51]; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[16]; p <= &buf[40]; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[53]; p > &buf[9]; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[63]; p >= &buf[3]; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[48]; p > &buf[15]; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
for (p = &buf[40]; p >= &buf[16]; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
test4 (void)
{
int buf[64], *p;
int i;
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[10]; p < &buf[54]; p++)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[3]; p <= &buf[63]; p += 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[16]; p < &buf[51]; p = 4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[16]; p <= &buf[40]; p = p + 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[53]; p > &buf[9]; --p)
*p = 5;
for (i = 0; i < 64; i++)
if (buf[i] != 5 * (i >= 10 && i < 54))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[63]; p >= &buf[3]; p -= 2)
p[-2] = 6;
for (i = 0; i < 64; i++)
if (buf[i] != 6 * ((i & 1) && i <= 61))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[48]; p > &buf[15]; p = -4 + p)
p[2] = 7;
for (i = 0; i < 64; i++)
if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
abort ();
memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
for (p = &buf[40]; p >= &buf[16]; p = p - 4ULL)
p[2] = -7;
for (i = 0; i < 64; i++)
if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
abort ();
return 0;
}
 
int
main (void)
{
test1 ();
test2 ();
test3 ();
omp_set_schedule (omp_sched_static, 0);
test4 ();
omp_set_schedule (omp_sched_static, 3);
test4 ();
omp_set_schedule (omp_sched_dynamic, 5);
test4 ();
omp_set_schedule (omp_sched_guided, 2);
test4 ();
return 0;
}
/libgomp.c/pr32362-1.c
0,0 → 1,32
/* PR middle-end/32362 */
/* { dg-do run } */
/* { dg-options "-O2" } */
 
#include <omp.h>
#include <stdlib.h>
 
int
main ()
{
int n[4] = { -1, -1, -1, -1 };
static int a = 2, b = 4;
omp_set_num_threads (4);
omp_set_dynamic (0);
omp_set_nested (1);
#pragma omp parallel private(b)
{
b = omp_get_thread_num ();
#pragma omp parallel firstprivate(a)
{
a = (omp_get_thread_num () + a) + 1;
if (b == omp_get_thread_num ())
n[omp_get_thread_num ()] = a + (b << 4);
}
}
if (n[0] != 3)
abort ();
if (n[3] != -1
&& (n[1] != 0x14 || n[2] != 0x25 || n[3] != 0x36))
abort ();
return 0;
}
/libgomp.c/loop-9.c
0,0 → 1,18
extern void abort (void);
 
char buf[8] = "01234567";
char buf2[8] = "23456789";
 
int
main (void)
{
char *p, *q;
int sum = 0;
#pragma omp parallel for collapse (2) reduction (+:sum) lastprivate (p, q)
for (p = buf; p < &buf[8]; p++)
for (q = &buf2[0]; q <= buf2 + 7; q++)
sum += (*p - '0') + (*q - '0');
if (p != &buf[8] || q != buf2 + 8 || sum != 576)
abort ();
return 0;
}
/libgomp.c/icv-1.c
0,0 → 1,33
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int err = 0;
 
omp_set_num_threads (4);
if (omp_get_max_threads () != 4)
abort ();
#pragma omp parallel reduction(|: err) num_threads(1)
{
if (omp_get_max_threads () != 4)
err |= 1;
omp_set_num_threads (6);
#pragma omp task if(0) shared(err)
{
if (omp_get_max_threads () != 6)
err |= 2;
omp_set_num_threads (5);
if (omp_get_max_threads () != 5)
err |= 4;
}
if (omp_get_max_threads () != 6)
err |= 8;
}
if (err)
abort ();
if (omp_get_max_threads () != 4)
abort ();
return 0;
}
/libgomp.c/atomic-6.c
0,0 → 1,38
/* PR middle-end/36106 */
/* { dg-options "-O2" } */
/* { dg-options "-O2 -mieee" { target alpha*-*-* } } */
/* { dg-options "-O2 -march=i586" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
 
#ifdef __i386__
# include "cpuid.h"
#endif
 
extern void abort (void);
 
union { unsigned long long l; double d; } u = { .l = 0x7ff0000000072301ULL };
 
int __attribute__((noinline))
do_test (void)
{
#pragma omp atomic
u.d += 1.0L;
return 0;
}
 
int
main (void)
{
#ifdef __i386__
unsigned int eax, ebx, ecx, edx;
 
if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
return 0;
 
if (!(edx & bit_CMPXCHG8B))
return 0;
#endif
 
do_test ();
 
return 0;
}
/libgomp.c/omp-parallel-if.c
0,0 → 1,40
#include <omp.h>
 
extern void abort (void);
 
int
foo (void)
{
return 10;
}
 
main ()
{
int A = 0;
 
#pragma omp parallel if (foo () > 10) shared (A)
{
A = omp_get_num_threads ();
}
 
if (A != 1)
abort ();
 
#pragma omp parallel if (foo () == 10) num_threads (3) shared (A)
{
A = omp_get_num_threads ();
}
 
if (A != 3)
abort ();
 
#pragma omp parallel if (foo () == 10) num_threads (foo ()) shared (A)
{
A = omp_get_num_threads ();
}
 
if (A != 10)
abort ();
 
return 0;
}
/libgomp.c/ordered-1.c
0,0 → 1,115
/* Test that all loop iterations are touched. This doesn't verify
scheduling order, merely coverage. */
/* Note that we never call GOMP_ordered_start in here. AFAICS, this is
valid; the only requirement is "not more than once per iteration". */
 
/* { dg-require-effective-target sync_int_long } */
 
#include <omp.h>
#include <string.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
#define N 1000
static int S, E, INCR, CHUNK, NTHR;
static int data[N];
 
static void clean_data (void)
{
memset (data, -1, sizeof (data));
}
 
static void test_data (void)
{
int i, j;
 
for (i = 0; i < S; ++i)
assert (data[i] == -1);
 
for (j = 0; i < E; ++i, j = (j + 1) % INCR)
if (j == 0)
assert (data[i] != -1);
else
assert (data[i] == -1);
 
for (; i < N; ++i)
assert (data[i] == -1);
}
 
static void set_data (long i, int val)
{
int old;
assert (i >= 0 && i < N);
old = __sync_lock_test_and_set (data+i, val);
assert (old == -1);
}
 
#define TMPL_1(sched) \
static void f_##sched##_1 (void *dummy) \
{ \
int iam = omp_get_thread_num (); \
long s0, e0, i; \
if (GOMP_loop_ordered_##sched##_start (S, E, INCR, CHUNK, &s0, &e0)) \
do \
{ \
for (i = s0; i < e0; i += INCR) \
set_data (i, iam); \
} \
while (GOMP_loop_ordered_##sched##_next (&s0, &e0)); \
GOMP_loop_end (); \
} \
static void t_##sched##_1 (void) \
{ \
clean_data (); \
GOMP_parallel_start (f_##sched##_1, NULL, NTHR); \
f_##sched##_1 (NULL); \
GOMP_parallel_end (); \
test_data (); \
}
 
TMPL_1(static)
TMPL_1(dynamic)
TMPL_1(guided)
 
static void test (void)
{
t_static_1 ();
t_dynamic_1 ();
t_guided_1 ();
}
 
int main()
{
omp_set_dynamic (0);
 
NTHR = 4;
 
S = 0, E = N, INCR = 1, CHUNK = 4;
test ();
 
S = 0, E = N, INCR = 2, CHUNK = 4;
test ();
 
S = 1, E = N-1, INCR = 1, CHUNK = 5;
test ();
 
S = 1, E = N-1, INCR = 2, CHUNK = 5;
test ();
 
S = 2, E = 4, INCR = 1, CHUNK = 1;
test ();
 
S = 0, E = N, INCR = 1, CHUNK = 0;
t_static_1 ();
 
S = 1, E = N-1, INCR = 1, CHUNK = 0;
t_static_1 ();
 
NTHR = 10;
S = 1, E = 9, INCR = 1, CHUNK = 0;
t_static_1 ();
 
return 0;
}
/libgomp.c/pr36802-3.c
0,0 → 1,46
/* PR middle-end/36802 */
 
extern void abort (void);
 
int q;
 
int
foo (int k)
{
int i = 6, n = 0;
omp_set_dynamic (0);
omp_set_nested (1);
#pragma omp parallel shared (i) num_threads (3)
{
int l;
 
if (omp_get_num_threads () != 3)
#pragma omp atomic
n += 1;
else
#pragma omp for
for (l = 0; l < 3; l++)
if (!k)
#pragma omp parallel shared (i) num_threads (4)
{
if (omp_get_num_threads () != 4)
#pragma omp atomic
n += 1;
#pragma omp critical
i += 1;
}
else
#pragma omp atomic
q += i;
}
if (n == 0 && i != 6 + 3 * 4)
abort ();
return 0;
}
 
int
main (void)
{
foo (0);
return 0;
}
/libgomp.c/sort-1.c
0,0 → 1,379
/* Test and benchmark of a couple of parallel sorting algorithms.
Copyright (C) 2008 Free Software Foundation, Inc.
 
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
 
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
 
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
 
#include <limits.h>
#include <omp.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int failures;
 
#define THRESHOLD 100
 
static void
verify (const char *name, double stime, int *array, int count)
{
int i;
double etime = omp_get_wtime ();
 
printf ("%s: %g\n", name, etime - stime);
for (i = 1; i < count; i++)
if (array[i] < array[i - 1])
{
printf ("%s: incorrectly sorted\n", name);
failures = 1;
}
}
 
static void
insertsort (int *array, int s, int e)
{
int i, j, val;
for (i = s + 1; i <= e; i++)
{
val = array[i];
j = i;
while (j-- > s && val < array[j])
array[j + 1] = array[j];
array[j + 1] = val;
}
}
 
struct int_pair
{
int lo;
int hi;
};
 
struct int_pair_stack
{
struct int_pair *top;
#define STACK_SIZE 4 * CHAR_BIT * sizeof (int)
struct int_pair arr[STACK_SIZE];
};
 
static inline void
init_int_pair_stack (struct int_pair_stack *stack)
{
stack->top = &stack->arr[0];
}
 
static inline void
push_int_pair_stack (struct int_pair_stack *stack, int lo, int hi)
{
stack->top->lo = lo;
stack->top->hi = hi;
stack->top++;
}
 
static inline void
pop_int_pair_stack (struct int_pair_stack *stack, int *lo, int *hi)
{
stack->top--;
*lo = stack->top->lo;
*hi = stack->top->hi;
}
 
static inline int
size_int_pair_stack (struct int_pair_stack *stack)
{
return stack->top - &stack->arr[0];
}
 
static inline void
busy_wait (void)
{
#if defined __i386__ || defined __x86_64__
__asm volatile ("rep; nop" : : : "memory");
#elif defined __ia64__
__asm volatile ("hint @pause" : : : "memory");
#elif defined __sparc__ && (defined __arch64__ || defined __sparc_v9__)
__asm volatile ("membar #LoadLoad" : : : "memory");
#else
__asm volatile ("" : : : "memory");
#endif
}
 
static inline void
swap (int *array, int a, int b)
{
int val = array[a];
array[a] = array[b];
array[b] = val;
}
 
static inline int
choose_pivot (int *array, int lo, int hi)
{
int mid = (lo + hi) / 2;
 
if (array[mid] < array[lo])
swap (array, lo, mid);
if (array[hi] < array[mid])
{
swap (array, mid, hi);
if (array[mid] < array[lo])
swap (array, lo, mid);
}
return array[mid];
}
 
static inline int
partition (int *array, int lo, int hi)
{
int pivot = choose_pivot (array, lo, hi);
int left = lo;
int right = hi;
 
for (;;)
{
while (array[++left] < pivot);
while (array[--right] > pivot);
if (left >= right)
break;
swap (array, left, right);
}
return left;
}
 
static void
sort1 (int *array, int count)
{
omp_lock_t lock;
struct int_pair_stack global_stack;
int busy = 1;
int num_threads;
 
omp_init_lock (&lock);
init_int_pair_stack (&global_stack);
#pragma omp parallel firstprivate (array, count)
{
int lo = 0, hi = 0, mid, next_lo, next_hi;
bool idle = true;
struct int_pair_stack local_stack;
 
init_int_pair_stack (&local_stack);
if (omp_get_thread_num () == 0)
{
num_threads = omp_get_num_threads ();
hi = count - 1;
idle = false;
}
 
for (;;)
{
if (hi - lo < THRESHOLD)
{
insertsort (array, lo, hi);
lo = hi;
}
if (lo >= hi)
{
if (size_int_pair_stack (&local_stack) == 0)
{
again:
omp_set_lock (&lock);
if (size_int_pair_stack (&global_stack) == 0)
{
if (!idle)
busy--;
if (busy == 0)
{
omp_unset_lock (&lock);
break;
}
omp_unset_lock (&lock);
idle = true;
while (size_int_pair_stack (&global_stack) == 0
&& busy)
busy_wait ();
goto again;
}
if (idle)
busy++;
pop_int_pair_stack (&global_stack, &lo, &hi);
omp_unset_lock (&lock);
idle = false;
}
else
pop_int_pair_stack (&local_stack, &lo, &hi);
}
 
mid = partition (array, lo, hi);
if (mid - lo < hi - mid)
{
next_lo = mid;
next_hi = hi;
hi = mid - 1;
}
else
{
next_lo = lo;
next_hi = mid - 1;
lo = mid;
}
 
if (next_hi - next_lo < THRESHOLD)
insertsort (array, next_lo, next_hi);
else
{
if (size_int_pair_stack (&global_stack) < num_threads - 1)
{
int size;
 
omp_set_lock (&lock);
size = size_int_pair_stack (&global_stack);
if (size < num_threads - 1 && size < STACK_SIZE)
push_int_pair_stack (&global_stack, next_lo, next_hi);
else
push_int_pair_stack (&local_stack, next_lo, next_hi);
omp_unset_lock (&lock);
}
else
push_int_pair_stack (&local_stack, next_lo, next_hi);
}
}
}
omp_destroy_lock (&lock);
}
 
static void
sort2_1 (int *array, int lo, int hi, int num_threads, int *busy)
{
int mid;
 
if (hi - lo < THRESHOLD)
{
insertsort (array, lo, hi);
return;
}
 
mid = partition (array, lo, hi);
 
if (*busy >= num_threads)
{
sort2_1 (array, lo, mid - 1, num_threads, busy);
sort2_1 (array, mid, hi, num_threads, busy);
return;
}
 
#pragma omp atomic
*busy += 1;
 
#pragma omp parallel num_threads (2) \
firstprivate (array, lo, hi, mid, num_threads, busy)
{
if (omp_get_thread_num () == 0)
sort2_1 (array, lo, mid - 1, num_threads, busy);
else
{
sort2_1 (array, mid, hi, num_threads, busy);
#pragma omp atomic
*busy -= 1;
}
}
}
 
static void
sort2 (int *array, int count)
{
int num_threads;
int busy = 1;
 
#pragma omp parallel
#pragma omp single nowait
num_threads = omp_get_num_threads ();
 
sort2_1 (array, 0, count - 1, num_threads, &busy);
}
 
#if _OPENMP >= 200805
static void
sort3_1 (int *array, int lo, int hi)
{
int mid;
 
if (hi - lo < THRESHOLD)
{
insertsort (array, lo, hi);
return;
}
 
mid = partition (array, lo, hi);
#pragma omp task
sort3_1 (array, lo, mid - 1);
sort3_1 (array, mid, hi);
}
 
static void
sort3 (int *array, int count)
{
#pragma omp parallel
#pragma omp single
sort3_1 (array, 0, count - 1);
}
#endif
 
int
main (int argc, char **argv)
{
int i, count = 1000000;
double stime;
int *unsorted, *sorted, num_threads;
if (argc >= 2)
count = strtoul (argv[1], NULL, 0);
 
unsorted = malloc (count * sizeof (int));
sorted = malloc (count * sizeof (int));
if (unsorted == NULL || sorted == NULL)
{
puts ("allocation failure");
exit (1);
}
 
srand (0xdeadbeef);
for (i = 0; i < count; i++)
unsorted[i] = rand ();
 
omp_set_nested (1);
omp_set_dynamic (0);
#pragma omp parallel
#pragma omp single nowait
num_threads = omp_get_num_threads ();
printf ("Threads: %d\n", num_threads);
 
memcpy (sorted, unsorted, count * sizeof (int));
stime = omp_get_wtime ();
sort1 (sorted, count);
verify ("sort1", stime, sorted, count);
 
memcpy (sorted, unsorted, count * sizeof (int));
stime = omp_get_wtime ();
sort2 (sorted, count);
verify ("sort2", stime, sorted, count);
 
#if _OPENMP >= 200805
memcpy (sorted, unsorted, count * sizeof (int));
stime = omp_get_wtime ();
sort3 (sorted, count);
verify ("sort3", stime, sorted, count);
#endif
 
return 0;
}
/libgomp.c/pr42942.c
0,0 → 1,61
/* PR libgomp/42942 */
/* { dg-do run } */
 
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int e = 0;
omp_set_dynamic (0);
omp_set_nested (1);
omp_set_max_active_levels (1);
if (omp_get_max_active_levels () != 1)
abort ();
#pragma omp parallel num_threads(2) reduction(|:e)
if (!omp_in_parallel ()
|| omp_get_num_threads () != 2)
e = 1;
else
#pragma omp parallel num_threads(2) reduction(|:e)
if (!omp_in_parallel ()
|| omp_get_num_threads () != 1)
e = 1;
if (e)
abort ();
omp_set_max_active_levels (0);
if (omp_get_max_active_levels () != 0)
abort ();
#pragma omp parallel num_threads(2) reduction(|:e)
if (omp_in_parallel ()
|| omp_get_num_threads () != 1)
e = 1;
else
#pragma omp parallel num_threads(2) reduction(|:e)
if (omp_in_parallel ()
|| omp_get_num_threads () != 1)
e = 1;
if (e)
abort ();
omp_set_max_active_levels (2);
if (omp_get_max_active_levels () != 2)
abort ();
#pragma omp parallel num_threads(2) reduction(|:e)
if (!omp_in_parallel ()
|| omp_get_num_threads () != 2)
e = 1;
else
#pragma omp parallel num_threads(2) reduction(|:e)
if (!omp_in_parallel ()
|| omp_get_num_threads () != 2)
e = 1;
else
#pragma omp parallel num_threads(2) reduction(|:e)
if (!omp_in_parallel ()
|| omp_get_num_threads () != 1)
e = 1;
if (e)
abort ();
return 0;
}
/libgomp.c/pr32468.c
0,0 → 1,26
/* PR libgomp/32468 */
/* { dg-do run } */
 
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int res[2] = { -1, -1 };
omp_set_dynamic (0);
omp_set_num_threads (4);
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section
res[0] = omp_get_num_threads () != 4;
#pragma omp section
res[1] = omp_get_num_threads () != 4;
}
}
if (res[0] != 0 || res[1] != 0)
abort ();
return 0;
}
/libgomp.c/pr35196.c
0,0 → 1,43
/* PR middle-end/35196 */
/* { dg-do run } */
 
extern void abort (void);
extern void omp_set_dynamic (int);
 
int
main (void)
{
int i, j;
omp_set_dynamic (0);
#pragma omp parallel for lastprivate (i, j) num_threads (8) schedule (static)
for (i = 0; i < 5; i++)
j = i;
if (i != 5 || j != 4)
abort ();
#pragma omp parallel for lastprivate (i, j) num_threads (8) schedule (static, 2)
for (i = 0; i < 5; i++)
j = i;
if (i != 5 || j != 4)
abort ();
#pragma omp parallel for lastprivate (i, j) num_threads (8) schedule (dynamic)
for (i = 0; i < 5; i++)
j = i;
if (i != 5 || j != 4)
abort ();
#pragma omp parallel for lastprivate (i, j) num_threads (8) schedule (static)
for (i = -12; i < 21; i += 3)
j = i;
if (i != 21 || j != 18)
abort ();
#pragma omp parallel for lastprivate (i, j) num_threads (8) schedule (static, 2)
for (i = -12; i < 21; i += 3)
j = i;
if (i != 21 || j != 18)
abort ();
#pragma omp parallel for lastprivate (i, j) num_threads (8) schedule (dynamic, 3)
for (i = -12; i < 21; i += 3)
j = i;
if (i != 21 || j != 18)
abort ();
return 0;
}
/libgomp.c/reduction-1.c
0,0 → 1,36
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = 0, j = 0, k = ~0;
double d = 1.0;
#pragma omp parallel num_threads(4) reduction(+:i) reduction(*:d) reduction(&:k)
{
if (i != 0 || d != 1.0 || k != ~0)
#pragma omp atomic
j |= 1;
if (omp_get_num_threads () != 4)
#pragma omp atomic
j |= 2;
 
i = omp_get_thread_num ();
d = i + 1;
k = ~(1 << (2 * i));
}
 
if (j & 1)
abort ();
if ((j & 2) == 0)
{
if (i != (0 + 1 + 2 + 3))
abort ();
if (d != (1.0 * 2.0 * 3.0 * 4.0))
abort ();
if (k != (~0 ^ 0x55))
abort ();
}
return 0;
}
/libgomp.c/pr39591-1.c
0,0 → 1,33
/* PR other/39591 */
/* { dg-do run } */
/* { dg-options "-O2" } */
 
extern void abort (void);
 
int err;
 
int
main (void)
{
#pragma omp parallel
{
int array[40];
int i;
for (i = 0; i < sizeof array / sizeof array[0]; i++)
array[i] = 0x55555555;
 
#pragma omp for schedule(dynamic)
for (i = 0; i < 50; i++)
#pragma omp task shared(array)
{
int j;
for (j = 0; j < sizeof array / sizeof array[0]; j++)
if (array[j] != 0x55555555)
#pragma omp atomic
err++;
}
}
if (err)
abort ();
return 0;
}
/libgomp.c/pr26943-4.c
0,0 → 1,61
/* PR c++/26943 */
/* { dg-do run } */
 
extern int omp_set_dynamic (int);
extern int omp_get_thread_num (void);
extern void abort (void);
 
int a = 8, b = 12, c = 16, d = 20, j = 0, l = 0;
char e[10] = "a", f[10] = "b", g[10] = "c", h[10] = "d";
volatile int k;
 
int
main (void)
{
int i;
omp_set_dynamic (0);
omp_set_nested (1);
#pragma omp parallel num_threads (2) reduction (+:l) \
firstprivate (a, b, c, d, e, f, g, h, j)
if (k == omp_get_thread_num ())
{
#pragma omp parallel for shared (a, e) firstprivate (b, f) \
lastprivate (c, g) private (d, h) \
schedule (static, 1) num_threads (4) \
reduction (+:j)
for (i = 0; i < 4; i++)
{
if (a != 8 || b != 12 || e[0] != 'a' || f[0] != 'b')
j++;
#pragma omp barrier /* { dg-warning "may not be closely nested" } */
#pragma omp atomic
a += i;
b += i;
c = i;
d = i;
#pragma omp atomic
e[0] += i;
f[0] += i;
g[0] = 'g' + i;
h[0] = 'h' + i;
#pragma omp barrier /* { dg-warning "may not be closely nested" } */
if (a != 8 + 6 || b != 12 + i || c != i || d != i)
j += 8;
if (e[0] != 'a' + 6 || f[0] != 'b' + i || g[0] != 'g' + i)
j += 64;
if (h[0] != 'h' + i)
j += 512;
}
if (j || a != 8 + 6 || b != 12 || c != 3 || d != 20)
++l;
if (e[0] != 'a' + 6 || f[0] != 'b' || g[0] != 'g' + 3 || h[0] != 'd')
l += 8;
}
if (l)
abort ();
if (a != 8 || b != 12 || c != 16 || d != 20)
abort ();
if (e[0] != 'a' || f[0] != 'b' || g[0] != 'c' || h[0] != 'd')
abort ();
return 0;
}
/libgomp.c/atomic-13.c
0,0 → 1,59
/* { dg-do run } */
 
extern void abort (void);
long long l, m;
int i, j;
 
void
foo (void)
{
#pragma omp atomic read
i = l;
#pragma omp atomic read
m = j;
if (i != 77 || m != 88)
abort ();
#pragma omp atomic write
l = 1 + i + 6 * 1;
#pragma omp atomic write
j = 170 - 170 + m + 1 * 7;
#pragma omp atomic capture
i = l += 4;
#pragma omp atomic capture
m = j += 4;
if (i != 88 || m != 99)
abort ();
#pragma omp atomic capture
{
i = l;
l += 4;
}
#pragma omp atomic capture
{
m = j;
j += 4;
}
if (i != 88 || m != 99)
abort ();
#pragma omp atomic capture
{
l += 4;
i = l;
}
#pragma omp atomic capture
{
j += 4;
m = j;
}
if (i != 96 || m != 107)
abort ();
}
 
int
main ()
{
l = 77;
j = 88;
foo ();
return 0;
}
/libgomp.c/reduction-5.c
0,0 → 1,78
/* PR middle-end/36506 */
 
extern void abort (void);
 
int
main (void)
{
int sum = 0, prod = 1;
#pragma omp parallel
#pragma omp sections reduction (+:sum)
{
#pragma omp section
sum += 2;
#pragma omp section
sum += 2;
#pragma omp section
sum += 2;
}
if (sum != 6)
abort ();
sum = 0;
#pragma omp parallel sections reduction (+:sum)
{
#pragma omp section
sum += 2;
#pragma omp section
sum += 2;
#pragma omp section
sum += 2;
}
if (sum != 6)
abort ();
sum = 0;
#pragma omp parallel
#pragma omp sections reduction (+:sum) reduction (*:prod)
{
#pragma omp section
{
sum += 2;
prod *= 2;
}
#pragma omp section
{
sum += 2;
prod *= 2;
}
#pragma omp section
{
sum += 2;
prod *= 2;
}
}
if (sum != 6 || prod != 8)
abort ();
sum = 0;
prod = 1;
#pragma omp parallel sections reduction (+:sum) reduction (*:prod)
{
#pragma omp section
{
sum += 2;
prod *= 2;
}
#pragma omp section
{
sum += 2;
prod *= 2;
}
#pragma omp section
{
sum += 2;
prod *= 2;
}
}
if (sum != 6 || prod != 8)
abort ();
return 0;
}
/libgomp.c/collapse-1.c
0,0 → 1,30
/* { dg-do run } */
 
#include <string.h>
#include <stdlib.h>
 
int
main (void)
{
int i, j, k, l = 0;
int a[3][3][3];
 
memset (a, '\0', sizeof (a));
#pragma omp parallel for collapse(4 - 1) schedule(static, 4)
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
for (k = 0; k < 2; k++)
a[i][j][k] = i + j * 4 + k * 16;
#pragma omp parallel
{
#pragma omp for collapse(2) reduction(|:l) private(k)
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
for (k = 0; k < 2; k++)
if (a[i][j][k] != i + j * 4 + k * 16)
l = 1;
}
if (l)
abort ();
return 0;
}
/libgomp.c/pr49898-2.c
0,0 → 1,18
/* PR middle-end/49898 */
/* { dg-do run } */
 
extern void abort (void);
 
int
main ()
{
int i, j, sum = 0;
#pragma omp parallel for reduction(+:sum)
for (i = 0; i < 10; i++)
#pragma omp parallel for reduction(+:sum)
for (j = 0; j < 10; j++)
sum += j;
if (sum != 450)
abort ();
return 0;
}
/libgomp.c/omp-single-1.c
0,0 → 1,19
extern void abort (void);
 
main()
{
int i = 0;
 
#pragma omp parallel shared (i)
{
#pragma omp single
{
i++;
}
}
 
if (i != 1)
abort ();
 
return 0;
}
/libgomp.c/omp-parallel-for.c
0,0 → 1,20
extern void abort (void);
 
main()
{
int i, a;
 
a = 30;
 
#pragma omp parallel for firstprivate (a) lastprivate (a) \
num_threads (2) schedule(static)
for (i = 0; i < 10; i++)
a = a + i;
 
/* The thread that owns the last iteration will have computed
30 + 5 + 6 + 7 + 8 + 9 = 65. */
if (a != 65)
abort ();
 
return 0;
}
/libgomp.c/nqueens-1.c
0,0 → 1,66
/* { dg-do run } */
/* { dg-options "-O2 -fopenmp" } */
/* { dg-require-effective-target tls_runtime } */
 
#include <omp.h>
#include <stdio.h>
#include <string.h>
 
int cnt;
#pragma omp threadprivate (cnt)
 
void
nqueens (char *a, int n, int pos)
{
/* b[i] = j means the queen in i-th row is in column j. */
char b[pos + 1];
int i, j;
memcpy (b, a, pos);
for (i = 0; i < n; i++)
{
for (j = 0; j < pos; j++)
if (b[j] == i || b[j] == i + pos - j || i == b[j] + pos - j)
break;
if (j < pos)
continue;
if (pos == n - 1)
/* Found a solution. Could output it here. */
++cnt;
else
{
b[pos] = i;
#pragma omp task
nqueens (b, n, pos + 1);
}
}
}
 
int
main (int argc, char **argv)
{
int n = 8;
if (argc >= 2)
n = strtoul (argv[1], NULL, 0);
if (n < 1 || n > 127)
{
fprintf (stderr, "invalid count %d\n", n);
return 1;
}
cnt = 0;
double stime = omp_get_wtime ();
nqueens ("", n, 0);
printf ("serial N %d solutions # %d time %f\n", n, cnt, omp_get_wtime () - stime);
#pragma omp parallel
cnt = 0;
stime = omp_get_wtime ();
int tempcnt = 0;
#pragma omp parallel reduction (+:tempcnt)
{
#pragma omp single
nqueens ("", n, 0);
tempcnt = cnt;
}
cnt = tempcnt;
printf ("parallel N %d solutions # %d time %f\n", n, cnt, omp_get_wtime () - stime);
return 0;
}
/libgomp.c/nested-1.c
0,0 → 1,30
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = -1, j = -1;
 
omp_set_nested (1);
omp_set_dynamic (0);
#pragma omp parallel num_threads (4)
{
#pragma omp single
{
i = omp_get_thread_num () + omp_get_num_threads () * 256;
#pragma omp parallel num_threads (2)
{
#pragma omp single
{
j = omp_get_thread_num () + omp_get_num_threads () * 256;
}
}
}
}
if (i < 4 * 256 || i >= 4 * 256 + 4)
abort ();
if (j < 2 * 256 || j >= 2 * 256 + 2)
abort ();
return 0;
}
/libgomp.c/loop-10.c
0,0 → 1,30
extern void abort (void);
 
int i = 8;
 
int main (void)
{
int j = 7, k = 0;
#pragma omp for
for (i = 0; i < 10; i++)
;
#pragma omp for
for (j = 0; j < 10; j++)
;
/* OpenMP 3.0 newly guarantees that the original list items can't
be shared with the privatized omp for iterators, even when
the original list items are already private. */
if (i != 8 || j != 7)
abort ();
#pragma omp parallel private (i) reduction (+:k)
{
i = 6;
#pragma omp for
for (i = 0; i < 10; i++)
;
k = (i != 6);
}
if (k)
abort ();
return 0;
}
/libgomp.c/lock-2.c
0,0 → 1,32
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int l = 0;
omp_nest_lock_t lock;
omp_init_nest_lock (&lock);
#pragma omp parallel reduction (+:l) num_threads (1)
{
if (omp_test_nest_lock (&lock) != 1)
l++;
if (omp_test_nest_lock (&lock) != 2)
l++;
#pragma omp task if (0) shared (lock, l)
{
if (omp_test_nest_lock (&lock) != 0)
l++;
}
#pragma omp taskwait
if (omp_test_nest_lock (&lock) != 3)
l++;
omp_unset_nest_lock (&lock);
omp_unset_nest_lock (&lock);
omp_unset_nest_lock (&lock);
}
if (l)
abort ();
omp_destroy_nest_lock (&lock);
return 0;
}
/libgomp.c/critical-2.c
0,0 → 1,35
// { dg-do run }
// Test several constructs within a parallel. At one point in development,
// the critical directive clobbered the shared clause of the parallel.
 
#include <omp.h>
#include <stdlib.h>
 
#define N 2000
 
int main()
{
int A[N];
int nthreads;
int i;
 
#pragma omp parallel shared (A, nthreads)
{
#pragma omp master
nthreads = omp_get_num_threads ();
 
#pragma omp for
for (i = 0; i < N; i++)
A[i] = 0;
 
#pragma omp critical
for (i = 0; i < N; i++)
A[i] += 1;
}
 
for (i = 0; i < N; i++)
if (A[i] != nthreads)
abort ();
 
return 0;
}
/libgomp.c/c.exp
0,0 → 1,30
if [info exists lang_library_path] then {
unset lang_library_path
unset lang_link_flags
}
if [info exists lang_test_file] then {
unset lang_test_file
}
 
load_lib libgomp-dg.exp
 
# If a testcase doesn't have special options, use these.
if ![info exists DEFAULT_CFLAGS] then {
set DEFAULT_CFLAGS "-O2"
}
 
# Initialize dg.
dg-init
 
# Gather a list of all tests.
set tests [lsort [find $srcdir/$subdir *.c]]
 
set ld_library_path $always_ld_library_path
append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
set_ld_library_path_env_vars
 
# Main loop.
dg-runtest $tests "" $DEFAULT_CFLAGS
 
# All done.
dg-finish
/libgomp.c/pr29947-2.c
0,0 → 1,328
/* PR libgomp/29947 */
 
/* { dg-do run } */
 
extern void abort (void);
 
int cnt;
 
void
test1 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (static)
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test2 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (static)
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test3 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (static, 1)
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test4 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (static, 1)
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test5 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (static) ordered
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test6 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (static) ordered
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test7 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (static, 1) ordered
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test8 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel reduction (+:e,c)
{
#pragma omp for schedule (static, 1) ordered
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
#pragma omp atomic
++cnt;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test9 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (static)
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test10 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (static)
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test11 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (static, 1)
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test12 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (static, 1)
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test13 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (static) ordered
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test14 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (static) ordered
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test15 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (static, 1) ordered
for (i = j1; i <= k1; ++i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
void
test16 (long j1, long k1, long j2, long k2)
{
long i, e = 0, c = 0;
#pragma omp parallel for reduction (+:e,c) schedule (static, 1) ordered
for (i = k1; i >= j1; --i)
{
if (i < j2 || i > k2)
++e;
#pragma omp ordered
++c;
}
if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
abort ();
}
 
int
__attribute__((noinline))
test (long j1, long k1, long j2, long k2)
{
test1 (j1, k1, j2, k2);
test2 (j1, k1, j2, k2);
test3 (j1, k1, j2, k2);
test4 (j1, k1, j2, k2);
test5 (j1, k1, j2, k2);
test6 (j1, k1, j2, k2);
test7 (j1, k1, j2, k2);
test8 (j1, k1, j2, k2);
test9 (j1, k1, j2, k2);
test10 (j1, k1, j2, k2);
test11 (j1, k1, j2, k2);
test12 (j1, k1, j2, k2);
test13 (j1, k1, j2, k2);
test14 (j1, k1, j2, k2);
test15 (j1, k1, j2, k2);
test16 (j1, k1, j2, k2);
return cnt;
}
 
int
main (void)
{
test (1, 5, 1, 5);
test (5, 5, 5, 5);
test (5, 4, 5, 4);
test (5, 1, 5, 1);
return 0;
}
/libgomp.c/omp_orphan.c
0,0 → 1,47
/******************************************************************************
* FILE: omp_orphan.c
* DESCRIPTION:
* OpenMP Example - Parallel region with an orphaned directive - C/C++ Version
* This example demonstrates a dot product being performed by an orphaned
* loop reduction construct. Scoping of the reduction variable is critical.
* AUTHOR: Blaise Barney 5/99
* LAST REVISED: 04/06/05
******************************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define VECLEN 100
 
float a[VECLEN], b[VECLEN], sum;
 
float dotprod ()
{
int i,tid;
 
tid = omp_get_thread_num();
#pragma omp for reduction(+:sum)
for (i=0; i < VECLEN; i++)
{
sum = sum + (a[i]*b[i]);
printf(" tid= %d i=%d\n",tid,i);
}
 
return(sum);
}
 
 
int main (int argc, char *argv[])
{
int i;
 
for (i=0; i < VECLEN; i++)
a[i] = b[i] = 1.0 * i;
sum = 0.0;
 
#pragma omp parallel
sum = dotprod();
 
printf("Sum = %f\n",sum);
 
return 0;
}
/libgomp.c/omp_workshare3.c
0,0 → 1,43
/* { dg-do compile } */
 
/******************************************************************************
* OpenMP Example - Combined Parallel Loop Work-sharing - C/C++ Version
* FILE: omp_workshare3.c
* DESCRIPTION:
* This example attempts to show use of the parallel for construct. However
* it will generate errors at compile time. Try to determine what is causing
* the error. See omp_workshare4.c for a corrected version.
* SOURCE: Blaise Barney 5/99
* LAST REVISED: 03/03/2002
******************************************************************************/
 
#include <omp.h>
#include <stdio.h>
#define N 50
#define CHUNKSIZE 5
 
main () {
 
int i, chunk, tid;
float a[N], b[N], c[N];
 
/* Some initializations */
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
chunk = CHUNKSIZE;
 
#pragma omp parallel for \
shared(a,b,c,chunk) \
private(i,tid) \
schedule(static,chunk)
{ /* { dg-error "expected" } */
tid = omp_get_thread_num();
for (i=0; i < N; i++)
{
c[i] = a[i] + b[i];
printf("tid= %d i= %d c[i]= %f\n", tid, i, c[i]);
}
} /* end of parallel for construct */
 
return 0;
}
/libgomp.c/task-4.c
0,0 → 1,40
/* { dg-do run } */
 
#include <omp.h>
#include <stdlib.h>
#include <string.h>
 
int e;
 
void __attribute__((noinline))
baz (int i, int *p, int j, int *q)
{
if (p[0] != 1 || p[i] != 3 || q[0] != 2 || q[j] != 4)
#pragma omp atomic
e++;
}
 
void __attribute__((noinline))
foo (int i, int j)
{
int p[i + 1];
int q[j + 1];
memset (p, 0, sizeof (p));
memset (q, 0, sizeof (q));
p[0] = 1;
p[i] = 3;
q[0] = 2;
q[j] = 4;
#pragma omp task firstprivate (p, q)
baz (i, p, j, q);
}
 
int
main (void)
{
#pragma omp parallel num_threads (4)
foo (5 + omp_get_thread_num (), 7 + omp_get_thread_num ());
if (e)
abort ();
return 0;
}
/libgomp.c/lib-2.c
0,0 → 1,25
#include <stdlib.h>
#include <omp.h>
 
int
main (void)
{
omp_sched_t kind;
int modifier;
 
omp_set_schedule (omp_sched_static, 32);
omp_get_schedule (&kind, &modifier);
if (kind != omp_sched_static || modifier != 32)
abort ();
omp_set_schedule (omp_sched_guided, 4);
omp_get_schedule (&kind, &modifier);
if (kind != omp_sched_guided || modifier != 4)
abort ();
if (omp_get_thread_limit () < 0)
abort ();
omp_set_max_active_levels (6);
if (omp_get_max_active_levels () != 6)
abort ();
 
return 0;
}
/libgomp.c/nestedfn-4.c
0,0 → 1,65
/* PR middle-end/25261 */
/* { dg-do run } */
 
#include <omp.h>
 
extern void abort (void);
 
int
main (void)
{
int i = 5, j, l = 0;
int foo (void)
{
return i == 6;
}
int bar (void)
{
return i - 3;
}
 
omp_set_dynamic (0);
 
#pragma omp parallel if (foo ()) num_threads (2)
if (omp_get_num_threads () != 1)
#pragma omp atomic
l++;
 
#pragma omp parallel for schedule (static, bar ()) num_threads (2) \
reduction (|:l)
for (j = 0; j < 4; j++)
if (omp_get_thread_num () != (j >= 2))
#pragma omp atomic
l++;
 
i++;
 
#pragma omp parallel if (foo ()) num_threads (2)
if (omp_get_num_threads () != 2)
#pragma omp atomic
l++;
 
#pragma omp parallel for schedule (static, bar ()) num_threads (2) \
reduction (|:l)
for (j = 0; j < 6; j++)
if (omp_get_thread_num () != (j >= 3))
#pragma omp atomic
l++;
 
#pragma omp parallel num_threads (4) reduction (|:l)
if (!foo () || bar () != 3)
#pragma omp atomic
l++;
 
i++;
 
#pragma omp parallel num_threads (4) reduction (|:l)
if (foo () || bar () != 4)
#pragma omp atomic
l++;
 
if (l)
abort ();
 
return 0;
}
/libgomp.c/loop-2.c
0,0 → 1,114
/* Validate static scheduling iteration dispatch. We only test with
even thread distributions here; there are multiple valid solutions
for uneven thread distributions. */
 
/* { dg-require-effective-target sync_int_long } */
 
#include <omp.h>
#include <string.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
#define N 360
static int data[N][2];
static int INCR, NTHR, CHUNK;
 
static void clean_data (void)
{
memset (data, -1, sizeof (data));
}
 
static void test_data (void)
{
int n, i, c, thr, iter, chunk;
 
chunk = CHUNK;
if (chunk == 0)
chunk = N / INCR / NTHR;
 
thr = iter = c = i = 0;
 
for (n = 0; n < N; ++n)
{
if (i == 0)
{
assert (data[n][0] == thr);
assert (data[n][1] == iter);
}
else
{
assert (data[n][0] == -1);
assert (data[n][1] == -1);
}
 
if (++i == INCR)
{
i = 0;
if (++c == chunk)
{
c = 0;
if (++thr == NTHR)
{
thr = 0;
++iter;
}
}
}
}
}
 
static void set_data (long i, int thr, int iter)
{
int old;
assert (i >= 0 && i < N);
old = __sync_lock_test_and_set (&data[i][0], thr);
assert (old == -1);
old = __sync_lock_test_and_set (&data[i][1], iter);
assert (old == -1);
}
static void f_static_1 (void *dummy)
{
int iam = omp_get_thread_num ();
long s0, e0, i, count = 0;
if (GOMP_loop_static_start (0, N, INCR, CHUNK, &s0, &e0))
do
{
for (i = s0; i < e0; i += INCR)
set_data (i, iam, count);
++count;
}
while (GOMP_loop_static_next (&s0, &e0));
GOMP_loop_end ();
}
 
static void test (void)
{
clean_data ();
GOMP_parallel_start (f_static_1, NULL, NTHR);
f_static_1 (NULL);
GOMP_parallel_end ();
test_data ();
}
 
int main()
{
omp_set_dynamic (0);
 
NTHR = 5;
 
INCR = 1, CHUNK = 0; /* chunk = 360 / 5 = 72 */
test ();
 
INCR = 4, CHUNK = 0; /* chunk = 360 / 4 / 5 = 18 */
test ();
 
INCR = 1, CHUNK = 4; /* 1 * 4 * 5 = 20 -> 360 / 20 = 18 iterations. */
test ();
 
INCR = 3, CHUNK = 4; /* 3 * 4 * 5 = 60 -> 360 / 60 = 6 iterations. */
test ();
 
return 0;
}
/libgomp.c/atomic-3.c
0,0 → 1,50
/* { dg-do run } */
/* { dg-options "-fopenmp -O0" } */
 
#include <omp.h>
#include <stdlib.h>
 
short e[64];
int g;
_Complex double d, f;
int num_threads;
 
__attribute__((noinline)) void
foo (int x, long long y)
{
#pragma omp parallel num_threads (4)
{
int i;
#pragma omp barrier
for (i = 0; i < 2400; i++)
{
if (i == 0)
num_threads = omp_get_num_threads ();
#pragma omp atomic
e[0] += x;
#pragma omp atomic
e[16] += x;
#pragma omp atomic
g += y;
#pragma omp atomic
__real__ d += x;
#pragma omp atomic
__imag__ f += x;
}
}
}
 
int
main (void)
{
int i;
foo (3, 3LL);
if (g != 3 * 2400 * num_threads
|| __real__ d != g || __imag__ d != 0
|| __real__ f != 0 || __imag__ f != g)
abort ();
for (i = 0; i < 64; i++)
if (e[i] != ((i && i != 16) ? 0 : g))
abort ();
return 0;
}
/libgomp.c/loop-6.c
0,0 → 1,387
/* { dg-do run } */
 
#include <omp.h>
 
extern void abort (void);
 
#define LLONG_MAX __LONG_LONG_MAX__
#define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
#define INT_MAX __INT_MAX__
 
int arr[6 * 5];
 
void
set (int loopidx, int idx)
{
#pragma omp atomic
arr[loopidx * 5 + idx]++;
}
 
#define check(var, val, loopidx, idx) \
if (var == (val)) set (loopidx, idx); else
#define test(loopidx, count) \
for (idx = 0; idx < 5; idx++) \
if (arr[loopidx * 5 + idx] != idx < count) \
abort (); \
else \
arr[loopidx * 5 + idx] = 0
 
int
test1 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(dynamic,1) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(dynamic,1) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test2 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(guided,1) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(guided,1) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test3 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(static) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(static) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(static) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(static) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test4 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(static,1) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(static,1) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
test5 (void)
{
int e = 0, idx;
 
#pragma omp parallel reduction(+:e)
{
long long i;
unsigned long long j;
#pragma omp for schedule(runtime) nowait
for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
{
check (i, LLONG_MAX - 30001, 0, 0)
check (i, LLONG_MAX - 20001, 0, 1)
check (i, LLONG_MAX - 10001, 0, 2)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
{
check (i, -LLONG_MAX + 30000, 1, 0)
check (i, -LLONG_MAX + 20000, 1, 1)
check (i, -LLONG_MAX + 10000, 1, 2)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
{
check (j, 20, 2, 0)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
{
check (j, ULLONG_MAX - 3, 3, 0)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
{
check (j, LLONG_MAX - 20000ULL, 4, 0)
check (j, LLONG_MAX - 10000ULL, 4, 1)
check (j, LLONG_MAX, 4, 2)
check (j, LLONG_MAX + 10000ULL, 4, 3)
e = 1;
}
#pragma omp for schedule(runtime) nowait
for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
{
check (i, -3LL * INT_MAX - 20000LL, 5, 0)
check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
check (i, -20000LL + 600LL, 5, 3)
check (i, INT_MAX - 20000LL + 800LL, 5, 4)
e = 1;
}
}
if (e)
abort ();
test (0, 3);
test (1, 3);
test (2, 1);
test (3, 1);
test (4, 4);
test (5, 5);
return 0;
}
 
int
main (void)
{
if (2 * sizeof (int) != sizeof (long long))
return 0;
test1 ();
test2 ();
test3 ();
test4 ();
omp_set_schedule (omp_sched_static, 0);
test5 ();
omp_set_schedule (omp_sched_static, 3);
test5 ();
omp_set_schedule (omp_sched_dynamic, 5);
test5 ();
omp_set_schedule (omp_sched_guided, 2);
test5 ();
return 0;
}
/libgomp.c/pr35130.c
0,0 → 1,131
/* PR middle-end/35130 */
 
extern void abort (void);
 
void
f1 (void)
{
int a[4], k;
void nested (int x)
{
a[x] = 42;
}
 
for (k = 0; k < 4; k++)
a[k] = 0;
#pragma omp parallel for
for (k = 0; k < 4; k++)
nested (k);
 
if (a[0] != 42 || a[1] != 42 || a[2] != 42 || a[3] != 42)
abort ();
}
 
void
f2 (void)
{
int a[4], k;
void nested (void)
{
int l;
void nested2 (int x)
{
a[x] = 42;
}
#pragma omp parallel for
for (l = 0; l < 4; l++)
nested2 (l);
}
 
for (k = 0; k < 4; k++)
a[k] = 0;
 
nested ();
 
if (a[0] != 42 || a[1] != 42 || a[2] != 42 || a[3] != 42)
abort ();
}
 
void
f3 (void)
{
int a[4], b[4], c[4], k;
void nested (int x)
{
a[x] = b[x] = c[x] = 42;
}
 
for (k = 0; k < 4; k++)
a[k] = b[k] = c[k] = 0;
nested (0);
 
#pragma omp parallel
{
#pragma omp single
{
a[1] = 43;
b[1] = 43;
}
#pragma omp parallel
{
#pragma omp single
{
b[2] = 44;
c[2] = 44;
}
}
}
 
if (a[0] != 42 || a[1] != 43 || a[2] != 0 || a[3] != 0)
abort ();
if (b[0] != 42 || b[1] != 43 || b[2] != 44 || b[3] != 0)
abort ();
if (c[0] != 42 || c[1] != 0 || c[2] != 44 || c[3] != 0)
abort ();
}
 
void
f4 (void)
{
int a[4], b[4], c[4], k;
void nested ()
{
#pragma omp parallel
{
#pragma omp single
{
a[1] = 43;
b[1] = 43;
}
#pragma omp parallel
{
#pragma omp single
{
b[2] = 44;
c[2] = 44;
}
}
}
}
 
for (k = 0; k < 4; k++)
a[k] = b[k] = c[k] = k == 0 ? 42 : 0;
nested ();
 
if (a[0] != 42 || a[1] != 43 || a[2] != 0 || a[3] != 0)
abort ();
if (b[0] != 42 || b[1] != 43 || b[2] != 44 || b[3] != 0)
abort ();
if (c[0] != 42 || c[1] != 0 || c[2] != 44 || c[3] != 0)
abort ();
}
 
int
main (void)
{
f1 ();
f2 ();
f3 ();
f4 ();
return 0;
}
/libgomp.c/omp_hello.c
0,0 → 1,39
/******************************************************************************
* FILE: omp_hello.c
* DESCRIPTION:
* OpenMP Example - Hello World - C/C++ Version
* In this simple example, the master thread forks a parallel region.
* All threads in the team obtain their unique thread number and print it.
* The master thread only prints the total number of threads. Two OpenMP
* library routines are used to obtain the number of threads and each
* thread's number.
* AUTHOR: Blaise Barney 5/99
* LAST REVISED: 04/06/05
******************************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
 
int main (int argc, char *argv[]) {
 
int nthreads, tid;
 
/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, tid)
{
 
/* Obtain thread number */
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);
 
/* Only master thread does this */
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
 
} /* All threads join master thread and disband */
 
return 0;
}
/libgomp.c/pr32362-2.c
0,0 → 1,33
/* PR middle-end/32362 */
/* { dg-do run } */
/* { dg-options "-O2" } */
 
#include <omp.h>
#include <stdlib.h>
 
int a = 2, b = 4;
 
int
main ()
{
int n[4] = { -1, -1, -1, -1 };
omp_set_num_threads (4);
omp_set_dynamic (0);
omp_set_nested (1);
#pragma omp parallel private(b)
{
b = omp_get_thread_num ();
#pragma omp parallel firstprivate(a)
{
a = (omp_get_thread_num () + a) + 1;
if (b == omp_get_thread_num ())
n[omp_get_thread_num ()] = a + (b << 4);
}
}
if (n[0] != 3)
abort ();
if (n[3] != -1
&& (n[1] != 0x14 || n[2] != 0x25 || n[3] != 0x36))
abort ();
return 0;
}
/libgomp.c/icv-2.c
0,0 → 1,46
/* { dg-do run { target *-*-linux* } } */
 
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#include <pthread.h>
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
 
pthread_barrier_t bar;
 
void *tf (void *p)
{
int l;
if (p)
omp_set_num_threads (3);
pthread_barrier_wait (&bar);
if (!p)
omp_set_num_threads (6);
pthread_barrier_wait (&bar);
omp_set_dynamic (0);
if (omp_get_max_threads () != (p ? 3 : 6))
abort ();
l = 0;
#pragma omp parallel num_threads (6) reduction (|:l)
{
l |= omp_get_max_threads () != (p ? 3 : 6);
omp_set_num_threads ((p ? 3 : 6) + omp_get_thread_num ());
l |= omp_get_max_threads () != ((p ? 3 : 6) + omp_get_thread_num ());
}
if (l)
abort ();
return NULL;
}
 
int
main (void)
{
pthread_t th;
pthread_barrier_init (&bar, NULL, 2);
pthread_create (&th, NULL, tf, NULL);
tf ("");
pthread_join (th, NULL);
return 0;
}
/libgomp.c/ordered-2.c
0,0 → 1,82
/* Trivial test of ordered. */
 
/* { dg-require-effective-target sync_int_long } */
 
#include <omp.h>
#include <string.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
#define N 100
static int next;
static int CHUNK, NTHR;
 
static void clean_data (void)
{
next = 0;
}
 
static void set_data (long i)
{
int n = __sync_fetch_and_add (&next, 1);
assert (n == i);
}
 
 
#define TMPL_1(sched) \
static void f_##sched##_1 (void *dummy) \
{ \
long s0, e0, i; \
if (GOMP_loop_ordered_##sched##_start (0, N, 1, CHUNK, &s0, &e0)) \
do \
{ \
for (i = s0; i < e0; ++i) \
{ \
GOMP_ordered_start (); \
set_data (i); \
GOMP_ordered_end (); \
} \
} \
while (GOMP_loop_ordered_##sched##_next (&s0, &e0)); \
GOMP_loop_end (); \
} \
static void t_##sched##_1 (void) \
{ \
clean_data (); \
GOMP_parallel_start (f_##sched##_1, NULL, NTHR); \
f_##sched##_1 (NULL); \
GOMP_parallel_end (); \
}
 
TMPL_1(static)
TMPL_1(dynamic)
TMPL_1(guided)
 
static void test (void)
{
t_static_1 ();
t_dynamic_1 ();
t_guided_1 ();
}
 
int main()
{
omp_set_dynamic (0);
 
NTHR = 4;
 
CHUNK = 1;
test ();
 
CHUNK = 5;
test ();
 
CHUNK = 7;
test ();
 
CHUNK = 0;
t_static_1 ();
 
return 0;
}
/libgomp.c/barrier-1.c
0,0 → 1,50
/* Trivial test of barrier. */
 
#include <omp.h>
#include <sys/time.h>
#include <unistd.h>
#include <assert.h>
#include "libgomp_g.h"
 
 
struct timeval stamps[3][3];
 
static void function(void *dummy)
{
int iam = omp_get_thread_num ();
 
gettimeofday (&stamps[iam][0], NULL);
if (iam == 0)
usleep (10);
 
GOMP_barrier ();
 
if (iam == 0)
{
gettimeofday (&stamps[0][1], NULL);
usleep (10);
}
 
GOMP_barrier ();
gettimeofday (&stamps[iam][2], NULL);
}
 
int main()
{
omp_set_dynamic (0);
 
GOMP_parallel_start (function, NULL, 3);
function (NULL);
GOMP_parallel_end ();
 
assert (!timercmp (&stamps[0][0], &stamps[0][1], >));
assert (!timercmp (&stamps[1][0], &stamps[0][1], >));
assert (!timercmp (&stamps[2][0], &stamps[0][1], >));
 
assert (!timercmp (&stamps[0][1], &stamps[0][2], >));
assert (!timercmp (&stamps[0][1], &stamps[1][2], >));
assert (!timercmp (&stamps[0][1], &stamps[2][2], >));
 
return 0;
}
/libgomp.c/pr26943-1.c
0,0 → 1,24
/* PR c++/26943 */
/* { dg-do run } */
 
extern void abort (void);
extern void omp_set_dynamic (int);
int n = 6;
 
int
main (void)
{
int i, x = 0;
omp_set_dynamic (0);
#pragma omp parallel for num_threads (16) firstprivate (n) lastprivate (n) \
schedule (static, 1) reduction (+: x)
for (i = 0; i < 16; i++)
{
if (n != 6)
++x;
n = i;
}
if (x || n != 15)
abort ();
return 0;
}
/libgomp.c/atomic-10.c
0,0 → 1,139
/* { dg-do run } */
 
extern void abort (void);
int x1, x2, x3, x4, x5;
volatile int y6 = 9, y2, y3, y4, y5;
volatile unsigned char z1, z2, z3, z4, z5;
float a1, a2, a3, a4;
 
void
f1 (void)
{
#pragma omp atomic
x1++;
#pragma omp atomic
x2--;
#pragma omp atomic
++x3;
#pragma omp atomic
--x4;
#pragma omp atomic
x5 += 1;
#pragma omp atomic
x1 -= y6;
#pragma omp atomic
x2 |= 1;
#pragma omp atomic
x3 &= 1;
#pragma omp atomic
x4 ^= 1;
#pragma omp atomic
x5 *= 3;
#pragma omp atomic
x1 /= 3;
#pragma omp atomic
x2 /= 3;
#pragma omp atomic
x3 <<= 3;
#pragma omp atomic
x4 >>= 3;
}
 
void
f2 (void)
{
#pragma omp atomic
y6++;
#pragma omp atomic
y2--;
#pragma omp atomic
++y3;
#pragma omp atomic
--y4;
#pragma omp atomic
y5 += 1;
#pragma omp atomic
y6 -= x1;
#pragma omp atomic
y2 |= 1;
#pragma omp atomic
y3 &= 1;
#pragma omp atomic
y4 ^= 1;
#pragma omp atomic
y5 *= 3;
#pragma omp atomic
y6 /= 3;
#pragma omp atomic
y2 /= 3;
#pragma omp atomic
y3 <<= 3;
#pragma omp atomic
y4 >>= 3;
}
 
void
f3 (void)
{
#pragma omp atomic
z1++;
#pragma omp atomic
z2--;
#pragma omp atomic
++z3;
#pragma omp atomic
--z4;
#pragma omp atomic
z5 += 1;
#pragma omp atomic
z1 |= 1;
#pragma omp atomic
z2 &= 1;
#pragma omp atomic
z3 ^= 1;
#pragma omp atomic
z4 *= 3;
#pragma omp atomic
z5 /= 3;
#pragma omp atomic
z1 /= 3;
#pragma omp atomic
z2 <<= 3;
#pragma omp atomic
z3 >>= 3;
}
 
void
f4 (void)
{
#pragma omp atomic
a1 += 8.0;
#pragma omp atomic
a2 *= 3.5;
#pragma omp atomic
a3 -= a1 + a2;
#pragma omp atomic
a4 /= 2.0;
}
 
int
main (void)
{
f1 ();
if (x1 != -2 || x2 != 0 || x3 != 8 || x4 != -1 || x5 != 3)
abort ();
f2 ();
if (y6 != 4 || y2 != 0 || y3 != 8 || y4 != -1 || y5 != 3)
abort ();
f3 ();
if (z1 != 0 || z2 != 8 || z3 != 0 || z4 != 253 || z5 != 0)
abort ();
a1 = 7;
a2 = 10;
a3 = 11;
a4 = 13;
f4 ();
if (a1 != 15.0 || a2 != 35.0 || a3 != -39.0 || a4 != 6.5)
abort ();
return 0;
}
/libgomp.c/pr39591-2.c
0,0 → 1,39
/* PR other/39591 */
/* { dg-do run } */
/* { dg-options "-O2" } */
 
extern void abort (void);
 
int err;
 
void __attribute__((noinline))
foo (int *array)
{
#pragma omp task
{
int j;
for (j = 0; j < sizeof array / sizeof array[0]; j++)
if (array[j] != 0x55555555)
#pragma omp atomic
err++;
}
}
 
int
main (void)
{
#pragma omp parallel
{
int array[40];
int i;
for (i = 0; i < sizeof array / sizeof array[0]; i++)
array[i] = 0x55555555;
 
#pragma omp for schedule (dynamic)
for (i = 0; i < 50; i++)
foo (array);
}
if (err)
abort ();
return 0;
}
/libgomp.c/reduction-2.c
0,0 → 1,50
#include <omp.h>
#include <stdlib.h>
 
int
main (void)
{
int i = 0, j = 0, k = ~0, l;
double d = 1.0;
#pragma omp parallel num_threads(4)
{
#pragma omp single
{
i = 16;
k ^= (1 << 16);
d += 32.0;
}
 
#pragma omp for reduction(+:i) reduction(*:d) reduction(&:k)
for (l = 0; l < 4; l++)
{
if (omp_get_num_threads () == 4 && (i != 0 || d != 1.0 || k != ~0))
#pragma omp atomic
j |= 1;
if (l == omp_get_thread_num ())
{
i = omp_get_thread_num ();
d = i + 1;
k = ~(1 << (2 * i));
}
}
 
if (omp_get_num_threads () == 4)
{
if (i != (16 + 0 + 1 + 2 + 3))
#pragma omp atomic
j |= 2;
if (d != (33.0 * 1.0 * 2.0 * 3.0 * 4.0))
#pragma omp atomic
j |= 4;
if (k != (~0 ^ 0x55 ^ (1 << 16)))
#pragma omp atomic
j |= 8;
}
}
 
if (j)
abort ();
return 0;
}
/libgomp.c/pr43893.c
0,0 → 1,61
/* PR c/43893 */
/* { dg-do run } */
 
extern void abort (void);
 
int
main ()
{
int c;
unsigned int i;
int j;
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = 0; i < 1; i++)
c++;
if (c != 1)
abort ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = 0; i <= 0; i++)
c++;
if (c != 1)
abort ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (j = - __INT_MAX__ - 1; j < - __INT_MAX__; j++)
c++;
if (c != 1)
abort ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (j = - __INT_MAX__ - 1; j <= - __INT_MAX__ - 1; j++)
c++;
if (c != 1)
abort ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = 2U * __INT_MAX__ + 1; i > 2U * __INT_MAX__; i--)
c++;
if (c != 1)
abort ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (i = 2U * __INT_MAX__ + 1; i >= 2U * __INT_MAX__ + 1; i--)
c++;
if (c != 1)
abort ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (j = __INT_MAX__; j > __INT_MAX__ - 1; j--)
c++;
if (c != 1)
abort ();
c = 0;
#pragma omp parallel for reduction(+:c)
for (j = __INT_MAX__; j >= __INT_MAX__; j--)
c++;
if (c != 1)
abort ();
return 0;
}
/libgomp.graphite/force-parallel-9.c
0,0 → 1,37
void abort (void);
 
#define N 500
 
int Z[2*N+2][2*N+2], B[2*N+2][2*N+2];
 
void foo(void)
{
int i,j;
 
for (i = 0; i < 2*N+2; i++)
for (j = 0; j < 2*N+2; j++)
B[i][j] = Z[i][j] = i + j;
 
for (i = 0; i <= N; i++)
for (j = 0; j <= N; j++)
Z[i][j] = Z[j+N][i+N+1];
 
for (i = 0; i <= N; i++)
for (j = 0; j <=N; j++)
if (Z[i][j] != B[j+N][i+N+1])
abort();
}
 
int main(void)
{
foo();
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "4 loops carried no dependency" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn.0" 5 "optimized" } } */
/* { dg-final { scan-tree-dump-times "loopfn.1" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/pr41118.c
0,0 → 1,19
void foo(int *a, int *b)
{
int i;
int *c = b+1;
 
for (i = 0; i < 100; i++)
a[i] = c[i];
}
 
int main(void)
{
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn" 0 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/force-parallel-1.c
0,0 → 1,31
void abort (void);
 
int x[10000000];
 
void parloop (int N)
{
int i;
 
for (i = 0; i < N; i++)
x[i] = i + 3;
 
for (i = 0; i < N; i++)
{
if (x[i] != i + 3)
abort ();
}
}
 
int main(void)
{
parloop(10000000);
 
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 2 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/force-parallel-2.c
0,0 → 1,30
void abort (void);
 
void parloop (int N)
{
int i, j;
int x[500][500];
 
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
x[i][j] = i + j + 3;
 
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
if (x[i][j] != i + j + 3)
abort ();
}
 
int main(void)
{
parloop(500);
 
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "2 loops carried no dependency" 2 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/force-parallel-3.c
0,0 → 1,38
void abort (void);
 
#define N 500
 
int Z[2*N+2][2*N+2], B[2*N+2][2*N+2];
 
void foo(void)
{
int i,j;
 
for (i = 0; i < 2*N+2; i++)
for (j = 0; j < 2*N+2; j++)
B[i][j] = Z[i][j] = i + j;
 
for (i = 0; i <= N; i++)
for (j = 0; j <= N; j++)
Z[i][j] = Z[j+N][i+N+1];
 
for (i = 0; i <= N; i++)
for (j = 0; j <=N; j++)
if (Z[i][j] != B[j+N][i+N+1])
abort();
}
 
int main(void)
{
foo();
 
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "4 loops carried no dependency" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn.0" 5 "optimized" } } */
/* { dg-final { scan-tree-dump-times "loopfn.1" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/force-parallel-4.c
0,0 → 1,55
/* Autopar with IF conditions. */
 
void abort();
 
#define N 10000
#define T 1000
 
void foo(void)
{
int i;
int A[2*N], B[2*N];
 
/* Initialize array: carried no dependency. */
for (i = 0; i < 2*N; i++)
B[i] = A[i] = i;
 
for (i = 0; i < N; i++)
{
if (i < T)
/* loop i1: carried no dependency. */
A[i] = A[i+T];
else
/* loop i2: carried dependency. */
A[i] = A[i+T+1];
}
 
/* If it runs a wrong answer, abort. */
for (i = 0; i < N; i++)
{
if (i < T)
{
if (A[i] != B[i+T])
abort();
}
else
{
if (A[i] != B[i+T+1])
abort();
}
}
}
 
int main(void)
{
foo();
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "2 loops carried no dependency" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn.0" 5 "optimized" } } */
/* { dg-final { scan-tree-dump-times "loopfn.1" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/force-parallel-5.c
0,0 → 1,39
/* Triangle loops. */
void abort (void);
 
#define N 500
 
void foo(void)
{
int i,j;
int A[3*N], B[3*N];
 
for (i = 0; i < 3*N; i++)
B[i] = A[i] = i;
 
for (i = 1; i < N; i++)
for (j = 1; j < i; j++)
/* This loop carried no dependency, it fails
at code generation part.*/
A[j+N] = A[j] + j;
 
for (i = 1; i < N; i++)
for (j = 1; j < i; j++)
if (A[j+N] != B[j] + j)
abort();
}
 
int main(void)
{
foo();
 
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "2 loops carried no dependency" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn.0" 5 "optimized" } } */
/* { dg-final { scan-tree-dump-times "loopfn.1" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/bounds.c
0,0 → 1,13
int foo(int *a, int n)
{
int i;
for (i = 2; i < n; i++)
a[i] += a[i+1];
}
 
/* Check that Graphite dependency checking notes the dependency. */
/* { dg-do compile } */
/* { dg-final { scan-tree-dump-times "0 loops carried no dependency" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/force-parallel-6.c
0,0 → 1,39
#define N 500
 
int X[2*N], Y[2*N], B[2*N];
int A[2*N][2*N], C[2*N][2*N];
 
int foo(void)
{
int i, j, k;
 
for (i = 1; i <= N; i++)
{
X[i] = Y[i] + 10;
for (j = 1; j <= N; j++)
{
B[j] = A[j][N];
for (k = 1; k <= N; k++)
{
A[j+1][k] = B[j] + C[j][k];
}
Y[i+j] = A[j+1][N];
}
}
 
return A[1][5]*B[6];
}
 
int main(void)
{
foo();
 
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn.0" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/force-parallel-7.c
0,0 → 1,37
#define N 500
 
int A[N+5][N+5][N+5];
 
int foo(void)
{
int i, j, k;
 
/* Loop i: carried no dependency. */
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
for (k = 0; k < N; k++)
A[k+1][j+2][i+1] = A[k][j][i+1];
 
for (i = 0; i < N; i++)
/* Loop j: carried no dependency. */
for (j = 0; j < N; j++)
/* Loop k: carreid no dependency. */
for (k = 0; k < N; k++)
A[i+1][j][k] = A[i][j][k+1];
 
return A[1][5][2];
}
 
int main(void)
{
foo();
 
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "3 loops carried no dependency" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn.0" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/libgomp.graphite/graphite.exp
0,0 → 1,55
# Copyright (C) 2009 Free Software Foundation, Inc.
 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
 
if [info exists lang_library_path] then {
unset lang_library_path
unset lang_link_flags
}
if [info exists lang_test_file] then {
unset lang_test_file
}
 
load_lib libgomp-dg.exp
 
if ![check_effective_target_pthread] {
return
}
 
if ![check_effective_target_fgraphite] {
return
}
 
# Flags for force-parallel-*.c testcases.
set PARALLEL_CFLAGS "-ansi -pedantic-errors -O2 \
-ftree-parallelize-loops=4 -floop-parallelize-all \
-fdump-tree-parloops-details -fdump-tree-optimized \
-fno-loop-strip-mine -fno-loop-block -fdump-tree-graphite-all"
 
# Initialize `dg'.
dg-init
 
# Gather a list of all tests.
set tests [lsort [find $srcdir/$subdir *.c]]
 
set ld_library_path $always_ld_library_path
append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
set_ld_library_path_env_vars
 
# Run the tests
dg-runtest $tests "" $PARALLEL_CFLAGS
 
# All done.
dg-finish
/libgomp.graphite/force-parallel-8.c
0,0 → 1,41
#define N 1500
 
int x[N][N], y[N];
 
int foo(void)
{
int i, j;
 
for (i = 0; i < N; i++)
{
y[i] = i;
 
for (j = 0; j < N; j++)
{
if (j > 500)
{
x[i][j] = i + j + 3;
y[j] = i*j + 10;
}
else
x[i][j] = x[i][j]*3;
}
}
 
return x[2][5]*y[8];
}
 
int main(void)
{
foo();
 
return 0;
}
 
/* Check that parallel code generation part make the right answer. */
/* { dg-final { scan-tree-dump-times "2 loops carried no dependency" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */
/* { dg-final { scan-tree-dump-times "loopfn.0" 5 "optimized" } } */
/* { dg-final { scan-tree-dump-times "loopfn.1" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "parloops" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.