llvm-project
fb69fcdb - [Flang][OpenMP] Fix COPYIN of derived types with allocatable components at -O3 (#196063)

Commit
3 hours ago
[Flang][OpenMP] Fix COPYIN of derived types with allocatable components at -O3 (#196063) COPYIN of threadprivate derived types with allocatable components segfaults at -O3 because the OpenMP runtime zero-fills per-thread storage, leaving allocatable component descriptors with invalid metadata. This patch skips the copy on the master thread (where source and destination alias) and uses temporary_lhs assignment on worker threads so the runtime initializes descriptors before the deep copy. Assisted-by: Claude Opus 4.6 Fixes : [https://github.com/llvm/llvm-project/issues/196134](https://github.com/llvm/llvm-project/issues/196134) Minimal reprducing test-case : ``` program repro_o3_segv use omp_lib implicit none integer, parameter :: NT = 4 integer :: i, rc integer :: nThreads(NT), nThreads1(NT) type structure_1 integer, allocatable :: a(:) end type type structure_2 type(structure_1) :: struc1 end type type(structure_2), save :: struc2(2) !$omp threadprivate(struc2) rc = 0 nThreads = -999 nThreads1 = -999 ! Keep this: dynamic teams can change codegen/runtime behavior. call omp_set_dynamic(.true.) call omp_set_num_threads(NT) allocate(struc2(1)%struc1%a(2)) struc2(1)%struc1%a(1) = 1 struc2(1)%struc1%a(2) = 2 !$omp parallel copyin(struc2) if (omp_get_thread_num() == NT-1) then ! Keep branch shape from original. ! struc2(1)%struc1%a(1) = 3 end if !$omp barrier allocate(struc2(2)%struc1%a(3)) nThreads(omp_get_thread_num()+1) = struc2(1)%struc1%a(1) struc2(2)%struc1%a(1) = omp_get_thread_num()+1 struc2(2)%struc1%a(2) = omp_get_thread_num()+2 !$omp end parallel do i = 1, NT if (nThreads(i) /= 1) rc = 1 end do struc2(2)%struc1%a(2) = -1 !$omp parallel copyin(struc2) nThreads(omp_get_thread_num()+1) = struc2(2)%struc1%a(1) nThreads1(omp_get_thread_num()+1) = struc2(2)%struc1%a(2) !$omp end parallel do i = 1, NT if (nThreads1(i) /= -1) rc = 1 end do if (rc /= 0) stop 1 deallocate(struc2(1)%struc1%a) deallocate(struc2(2)%struc1%a) end program ``` [>./flang -fopenmp -fopenmp-version=50 copyin_derrived_alloct.f90 -O3 > ./a.out Segmentation fault (core dumped) Co-authored-by: Chandra Ghale <ghale@pe34genoa.hpc.amslabs.hpecorp.net>
Author
Parents
Loading