forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang][OpenMP] Reland Fix copyprivate semantic checks (llvm#95799)
There are some cases in which variables used in OpenMP constructs are predetermined as private. The semantic checks for copyprivate were not handling those cases. Besides that, shared symbols were not being properly represented in some cases. When there was no previously declared private (implicit) symbol, no new association symbols, representing shared ones, were being created. These symbols must always be inserted in constructs that may privatize the original symbol: parallel, teams and task generating constructs. Fixes llvm#87214 and llvm#86907
- Loading branch information
Showing
15 changed files
with
250 additions
and
95 deletions.
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,112 @@ | ||
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp | ||
! OpenMP Version 5.2 | ||
! 5.1.1 - Variables Referenced in a Construct | ||
! Copyprivate must accept variables that are predetermined as private. | ||
|
||
module m1 | ||
integer :: m | ||
end module | ||
|
||
program omp_copyprivate | ||
use m1 | ||
implicit none | ||
integer :: i | ||
integer, save :: j | ||
integer :: k | ||
common /c/ k | ||
real, parameter :: pi = 3.14 | ||
integer :: a1(10) | ||
|
||
! Local variables are private. | ||
!$omp single | ||
i = 123 | ||
!$omp end single copyprivate(i) | ||
!$omp single | ||
!$omp end single copyprivate(a1) | ||
|
||
! Variables with the SAVE attribute are not private. | ||
!$omp single | ||
!ERROR: COPYPRIVATE variable 'j' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(j) | ||
|
||
! Common block variables are not private. | ||
!$omp single | ||
!ERROR: COPYPRIVATE variable 'k' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(/c/) | ||
!$omp single | ||
!ERROR: COPYPRIVATE variable 'k' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(k) | ||
|
||
! Module variables are not private. | ||
!$omp single | ||
!ERROR: COPYPRIVATE variable 'm' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(m) | ||
|
||
! Parallel can make a variable shared. | ||
!$omp parallel | ||
!$omp single | ||
i = 456 | ||
!ERROR: COPYPRIVATE variable 'i' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(i) | ||
call sub(j, a1) | ||
!$omp end parallel | ||
|
||
!$omp parallel shared(i) | ||
!$omp single | ||
i = 456 | ||
!ERROR: COPYPRIVATE variable 'i' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(i) | ||
!$omp end parallel | ||
|
||
!FIXME: an error should be emitted in this case. | ||
! copyprivate(i) should be considered as a reference to i and a new | ||
! symbol should be created in `parallel` scope, for this case to be | ||
! handled properly. | ||
!$omp parallel | ||
!$omp single | ||
!$omp end single copyprivate(i) | ||
!$omp end parallel | ||
|
||
! Named constants are shared. | ||
!$omp single | ||
!ERROR: COPYPRIVATE variable 'pi' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(pi) | ||
|
||
!$omp parallel do | ||
do i = 1, 10 | ||
!$omp parallel | ||
!$omp single | ||
j = i | ||
!ERROR: COPYPRIVATE variable 'i' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(i) | ||
!$omp end parallel | ||
end do | ||
!$omp end parallel do | ||
|
||
contains | ||
subroutine sub(s1, a) | ||
integer :: s1 | ||
integer :: a(:) | ||
|
||
! Dummy argument. | ||
!$omp single | ||
!$omp end single copyprivate(s1) | ||
|
||
! Assumed shape arrays are shared. | ||
!$omp single | ||
!ERROR: COPYPRIVATE variable 'a' is not PRIVATE or THREADPRIVATE in outer context | ||
!$omp end single copyprivate(a) | ||
end subroutine | ||
|
||
integer function fun(f1) | ||
integer :: f1 | ||
|
||
! Dummy argument. | ||
!$omp single | ||
!$omp end single copyprivate(f1) | ||
|
||
! Function result is private. | ||
!$omp single | ||
!$omp end single copyprivate(fun) | ||
end function | ||
end program |
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
Oops, something went wrong.