llvm/openmp/runtime/test/worksharing/for/omp_for_non_rectangular.c

// RUN: %libomp-compile-and-run

// Support for collapse of non-rectangular loop nests was added in GCC 11
// UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7, gcc-8, gcc-9, gcc-10

#define N 10
int arr[N][N][N];

int collapsed(int mp) {
  int Cnt = 0;
#pragma omp for collapse(3)
  for (int j = 0; j < mp; ++j) {
    for (int i = j; i < mp; ++i) {
      for (int i0 = 0; i0 < N; ++i0) {
        arr[j][i][i0] = 1;
        ++Cnt;
      }
    }
  }
  return Cnt;
}

int test(int mp) {
  int Failed = 0;
  for (int j = 0; j < mp; ++j) {
    for (int i = 0; i < mp; ++i) {
      for (int i0 = 0; i0 < N; ++i0) {
        if ((i < j && arr[j][i][i0] == 0) || (i >= j && arr[j][i][i0] == 1))
          continue;
        ++Failed;
      }
    }
  }
  return Failed;
}

int main() {
  int Res = collapsed(N);
  return Res == N * (N + 1) && test(N) == 0;
}