https://github.com/alexey-bataev commented:

Check these tests
```
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=60 -triple 
x86_64-unknown-unknown -verify %s

void use(int);

void parallel_in_simd(int n) {
#pragma omp simd
  for (int j = 0; j < n; ++j) {
#pragma omp parallel // expected-error {{OpenMP constructs may not be nested 
inside a simd region}}
    use(j);
  }
}

// Nested in a loop-transforming construct, still inside the simd region.
void parallel_in_tile_in_simd(int n) {
#pragma omp simd
  for (int j = 0; j < n; ++j) {
#pragma omp tile sizes(4)
    for (int i = 0; i < n; ++i) {
#pragma omp parallel // expected-error {{OpenMP constructs may not be nested 
inside a simd region}}
      use(i);
    }
  }
}

// Same gap for ordered simd, which is simdizable and does not restrict its 
body.
void parallel_in_ordered_simd(int n) {
#pragma omp simd
  for (int j = 0; j < n; ++j) {
#pragma omp ordered simd
    {
#pragma omp parallel // expected-error {{OpenMP constructs may not be nested 
inside a simd region}}
      use(j);
    }
  }
}

// Loop-transforming construct applied directly by simd, accepted in OpenMP 6.0.
void simd_applied_to_tile(int n) {
#pragma omp simd
#pragma omp tile sizes(4)
  for (int i = 0; i < n; ++i)
    use(i);
}

```
```
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=60 -triple 
x86_64-unknown-unknown -verify %s

void use(int);

void critical_in_order_concurrent(int n) {
#pragma omp parallel for order(concurrent)
  for (int j = 0; j < n; ++j) {
#pragma omp critical // expected-error {{construct 'critical' not allowed in a 
region associated with a directive with 'order' clause}}
    use(j);
  }
}

// Nested in a loop-transforming construct, still inside the order(concurrent) 
region.
void critical_in_tile_in_order_concurrent(int n) {
#pragma omp parallel for order(concurrent)
  for (int j = 0; j < n; ++j) {
#pragma omp tile sizes(2)
    for (int i = 0; i < n; ++i) {
#pragma omp critical // expected-error {{construct 'critical' not allowed in a 
region associated with a directive with 'order' clause}}
      use(i);
    }
  }
}

```
```
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=60 -triple 
x86_64-unknown-unknown -verify %s
// expected-no-diagnostics

void use(int);

// The loop construct is SIMDizable when its binding region is not defined.
void loop_in_simd(int n) {
#pragma omp simd
  for (int j = 0; j < n; ++j) {
#pragma omp loop
    for (int i = 0; i < n; ++i)
      use(i);
  }
}

```
```
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=60 -triple 
x86_64-unknown-unknown -verify %s

void use(int);

void ordered_depend_in_simd(int n) {
#pragma omp simd
  for (int j = 0; j < n; ++j) {
#pragma omp ordered depend(source) // expected-warning {{'depend' clause for 
'ordered' is deprecated; use 'doacross' instead}} expected-error {{OpenMP 
constructs may not be nested inside a simd region except for ordered simd, 
simd, scan, atomic, or loop-transforming directive}}
    use(j);
  }
}

```

https://github.com/llvm/llvm-project/pull/231852
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to