182164922SJonathan Peyton // RUN: %libomp-compile-and-run
282164922SJonathan Peyton // XFAIL: gcc-4, gcc-5, clang-3.7, clang-3.8, icc-15, icc-16
382164922SJonathan Peyton #include <stdio.h>
482164922SJonathan Peyton #include <stdlib.h>
582164922SJonathan Peyton #include "omp_testsuite.h"
682164922SJonathan Peyton
782164922SJonathan Peyton #ifndef N
882164922SJonathan Peyton #define N 750
982164922SJonathan Peyton #endif
1082164922SJonathan Peyton
test_doacross()1182164922SJonathan Peyton int test_doacross() {
1282164922SJonathan Peyton int i, j;
1382164922SJonathan Peyton // Allocate and zero out the matrix
1482164922SJonathan Peyton int *m = (int *)malloc(sizeof(int) * N * N);
1582164922SJonathan Peyton for (i = 0; i < N; ++i) {
1682164922SJonathan Peyton for (j = 0; j < N; ++j) {
1782164922SJonathan Peyton m[i * N + j] = 0;
1882164922SJonathan Peyton }
1982164922SJonathan Peyton }
2082164922SJonathan Peyton // Have first row and column be 0, 1, 2, 3, etc.
2182164922SJonathan Peyton for (i = 0; i < N; ++i)
2282164922SJonathan Peyton m[i * N] = i;
2382164922SJonathan Peyton for (j = 0; j < N; ++j)
2482164922SJonathan Peyton m[j] = j;
2582164922SJonathan Peyton // Perform wavefront which results in matrix:
2682164922SJonathan Peyton // 0 1 2 3 4
2782164922SJonathan Peyton // 1 2 3 4 5
2882164922SJonathan Peyton // 2 3 4 5 6
2982164922SJonathan Peyton // 3 4 5 6 7
3082164922SJonathan Peyton // 4 5 6 7 8
3182164922SJonathan Peyton #pragma omp parallel shared(m)
3282164922SJonathan Peyton {
3382164922SJonathan Peyton int row, col;
3482164922SJonathan Peyton #pragma omp for ordered(2)
3582164922SJonathan Peyton for (row = 1; row < N; ++row) {
3682164922SJonathan Peyton for (col = 1; col < N; ++col) {
3782164922SJonathan Peyton #pragma omp ordered depend(sink : row - 1, col) depend(sink : row, col - 1)
3882164922SJonathan Peyton m[row * N + col] = m[(row - 1) * N + col] + m[row * N + (col - 1)] -
3982164922SJonathan Peyton m[(row - 1) * N + (col - 1)];
4082164922SJonathan Peyton #pragma omp ordered depend(source)
4182164922SJonathan Peyton }
4282164922SJonathan Peyton }
4382164922SJonathan Peyton }
4482164922SJonathan Peyton
4582164922SJonathan Peyton // Check the bottom right element to see if iteration dependencies were held
4682164922SJonathan Peyton int retval = (m[(N - 1) * N + N - 1] == 2 * (N - 1));
4782164922SJonathan Peyton free(m);
4882164922SJonathan Peyton return retval;
4982164922SJonathan Peyton }
5082164922SJonathan Peyton
main(int argc,char ** argv)5182164922SJonathan Peyton int main(int argc, char **argv) {
5282164922SJonathan Peyton int i;
5382164922SJonathan Peyton int num_failed = 0;
54*74f98554SAndrey Churbanov if (omp_get_max_threads() < 2)
55*74f98554SAndrey Churbanov omp_set_num_threads(4);
5682164922SJonathan Peyton for (i = 0; i < REPETITIONS; i++) {
5782164922SJonathan Peyton if (!test_doacross()) {
5882164922SJonathan Peyton num_failed++;
5982164922SJonathan Peyton }
6082164922SJonathan Peyton }
6182164922SJonathan Peyton return num_failed;
6282164922SJonathan Peyton }
63