| Issue |
172935
|
| Summary |
[Flang][OpenMP] ALLOCATED() Incorrectly Returns False for Shared Allocatable Component in OpenMP Parallel Construct
|
| Labels |
|
| Assignees |
|
| Reporter |
boo-aboutme
|
```
Version of flang : 22.0.0git (bcbbe2c2bcbeee4e37ca39c8088bbc0702f7f69c)
Target: aarch64-unknown-linux-gnu
```
In the sample program below, `v%x` is defined and allocated outside of the parallel construct.
Therefore, it is shared in the parallel construct according to the OpenMP standard (OpenMP API v6.0 7.1.1),
and `ALLOCATED(v%x)` should be true for all threads.
However, occasionally the IF clause on line 15 is taken and `101` is printed when the program
is compiled with Flang on an AArch64 system.
``` fortran
module m1
type y3
integer,allocatable::x
integer::x1
end type
contains
subroutine s4(v)
type(y3),allocatable::v
integer::omp_get_num_threads,tnum
integer::s,n
s=1
n=10
!$omp parallel
if (.not. allocated(v%x)) print *,'101'
!$omp do schedule(dynamic) lastprivate(v)
do i=s,n
v%x=i
v%x1=i*10
if( i == 1 ) then
if (.not. allocated(v%x)) print *,'100'
endif
end do
!$omp end do
!$omp master
tnum = omp_get_num_threads()
!$omp end master
!$omp end parallel
if (v%x /= 10 ) print *,'102',v%x,tnum
if (v%x1 /= 100 ) print *,'102',v%x1,tnum
end subroutine s4
end module m1
use m1
type(y3),allocatable::v
allocate(v)
allocate(v%x)
v%x=0
v%x1=0
call s4(v)
print *,'pass'
end
```
``` text
$ export OMP_NUM_THREADS=32
$ flang -fopenmp -O3 sample.f90
$ for i in $(seq 1 10) ; do ./a.out ; done
pass
101
pass
pass
101
pass
101
pass
101
101
101
101
pass
101
pass
101
pass
101
pass
101
101
pass
$ gfortran -fopenmp -O3 sample.f90
$ for i in $(seq 1 10) ; do ./a.out ; done
pass
pass
pass
pass
pass
pass
pass
pass
pass
pass
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs