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