Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang][OpenMP] Add semantic check for target nesting
This patch implements the following check for TARGET construct: ``` OpenMP Version 5.0 Target construct restriction: If a target update, target data, target enter data, or target exit data construct is encountered during execution of a target region, the behavior is unspecified. ``` Also add one test case for the check. Reviewed By: kiranchandramohan, clementval Differential Revision: https://reviews.llvm.org/D106165
- Loading branch information
1 parent
2379949
commit 3883e26
Showing
3 changed files
with
117 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp | ||
! REQUIRES: shell | ||
|
||
! OpenMP Version 5.0 | ||
! Check OpenMP construct validity for the following directives: | ||
! 2.12.5 Target Construct | ||
|
||
program main | ||
integer :: i, j, N = 10 | ||
real :: a, arrayA(512), arrayB(512), ai(10) | ||
real, allocatable :: B(:) | ||
|
||
!$omp target | ||
!WARNING: If TARGET UPDATE directive is nested inside TARGET region, the behaviour is unspecified | ||
!$omp target update from(arrayA) to(arrayB) | ||
do i = 1, 512 | ||
arrayA(i) = arrayB(i) | ||
end do | ||
!$omp end target | ||
|
||
!$omp parallel | ||
!$omp target | ||
!$omp parallel | ||
!WARNING: If TARGET UPDATE directive is nested inside TARGET region, the behaviour is unspecified | ||
!$omp target update from(arrayA) to(arrayB) | ||
do i = 1, 512 | ||
arrayA(i) = arrayB(i) | ||
end do | ||
!$omp end parallel | ||
!$omp end target | ||
!$omp end parallel | ||
|
||
!$omp target | ||
!WARNING: If TARGET DATA directive is nested inside TARGET region, the behaviour is unspecified | ||
!$omp target data map(to: a) | ||
do i = 1, N | ||
a = 3.14 | ||
end do | ||
!$omp end target data | ||
!$omp end target | ||
|
||
allocate(B(N)) | ||
!$omp target | ||
!WARNING: If TARGET ENTER DATA directive is nested inside TARGET region, the behaviour is unspecified | ||
!$omp target enter data map(alloc:B) | ||
!$omp end target | ||
|
||
!$omp target | ||
!WARNING: If TARGET EXIT DATA directive is nested inside TARGET region, the behaviour is unspecified | ||
!$omp target exit data map(delete:B) | ||
!$omp end target | ||
deallocate(B) | ||
|
||
end program main |