Issue 131549
Summary [Flang][OpenMP] Compilation abnormally terminates when end single copyprivate statement written within parallel construct after threadprivate directive
Labels flang:openmp
Assignees
Reporter ohno-fj
    ```
Version of flang : 21.0.0(74ca5799caea342ac1e8d34ab5be7f45875131b2)/AArch64
```

`end single copyprivate statement` written within `parallel construct` after `threadprivate directive` results in an abnormal compition termination. 
When `copyprivate directive` in `end single directive` is deleted, the compilation terminates normally.  
It seems to be similar to [past issue](https://github.com/llvm/llvm-project/issues/130533), but the occurrence condition and compilation result are different.  


The following are the test program, Flang, Gfortran and ifx compilation/execution result.

snefe049_2.f90:
```fortran
program main
  interface
 function sub1() bind(c) result(ret)
       use, intrinsic::iso_c_binding
 integer(c_int)::ret
     end function sub1
  end interface
 procedure(sub1),pointer,save,bind(c)::ffunptr
  save
!$omp threadprivate(ffunptr)
!$omp parallel
  ffunptr=>sub1
!$omp single
 ffunptr=>sub1
!$omp end single copyprivate(ffunptr)
  if (ffunptr() /= 1) print *,'err'
!$omp end parallel
  print *,'pass'
end program main

function sub1() bind(c) result(ret)
  use, intrinsic::iso_c_binding
  integer(c_int)::ret
  ret=1
end function sub1
```

```
$ flang -fopenmp snefe049_2.f90
flang-20: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
./snefe049_2.f90:8:41: warning: Explicit SAVE of 'ffunptr' is redundant due to global SAVE statement
 procedure(sub1),pointer,save,bind(c)::ffunptr
 ^^^^^^^
./snefe049_2.f90:9:3: Global SAVE statement
    save
 ^^^^
flang: /work/groups/ssoft/compiler/llvm/src/llvm-main/flang/lib/Lower/OpenMP/ClauseProcessor.cpp:699: void Fortran::lower::omp::TypeInfo::typeScan(mlir::Type): Assertion `ty.isIntOrIndexOrFloat() || mlir::isa<mlir::ComplexType>(ty) || mlir::isa<fir::LogicalType>(ty) || mlir::isa<fir::RecordType>(ty)' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang -fc1 -triple aarch64-unknown-linux-gnu -emit-obj -mrelocation-model pic -pic-level 2 -pic-is-pie -target-cpu generic -target-feature +outline-atomics -target-feature +v8a -target-feature +fp-armv8 -target-feature
 +neon -fopenmp -resource-dir /work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/lib/clang/21 -mframe-pointer=non-leaf -o /tmp/snefe049_2-216730.o -x f95-cpp-input snefe049_2.f90
 #0 0x0000400035cf37f0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/work/groups/ssoft/compiler/llvm/aarch64/main-latest/lib/libLLVM.so.21.0git+0x5b937f0)
 #1 0x0000400035cf1838 llvm::sys::RunSignalHandlers() (/work/groups/ssoft/compiler/llvm/aarch64/main-latest/lib/libLLVM.so.21.0git+0x5b91838)
 #2 0x0000400035cf1994 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x0000400025dd07a0 (linux-vdso.so.1+0x7a0)
 #4 0x000040003adb6274 raise (/lib64/libc.so.6+0x36274)
 #5 0x000040003ada0a2c abort (/lib64/libc.so.6+0x20a2c)
 #6 0x000040003adafba0 __assert_fail_base (/lib64/libc.so.6+0x2fba0)
 #7 0x000040003adafc18 __assert_perror_fail (/lib64/libc.so.6+0x2fc18)
 #8 0x0000000005417b74 Fortran::lower::omp::TypeInfo::typeScan(mlir::Type) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x5417b74)
 #9 0x0000000005418cac Fortran::lower::omp::createCopyFunc(mlir::Location, Fortran::lower::AbstractConverter&, mlir::Type, fir::FortranVariableFlagsEnum) ClauseProcessor.cpp:0:0
#10 0x0000000005419a98 Fortran::lower::omp::ClauseProcessor::processCopyprivate(mlir::Location, mlir::omp::CopyprivateClauseOps&) const::'lambda'(Fortran::semantics::Symbol*)::operator()(Fortran::semantics::Symbol*) const ClauseProcessor.cpp:0:0
#11 0x0000000005419e60 std::_Function_handler<void (tomp::clause::CopyprivateT<Fortran::evaluate::DynamicType, Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>> const&, Fortran::parser::CharBlock const&), Fortran::lower::omp
::ClauseProcessor::processCopyprivate(mlir::Location, mlir::omp::CopyprivateClauseOps&) const::'lambda0'(tomp::clause::CopyprivateT<Fortran::evaluate::DynamicType, Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>> const&, Fo
rtran::parser::CharBlock const&)>::_M_invoke(std::_Any_data const&, tomp::clause::CopyprivateT<Fortran::evaluate::DynamicType, Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>> const&, Fortran::parser::CharBlock const&) Clau
seProcessor.cpp:0:0
#12 0x0000000005416954 bool Fortran::lower::omp::ClauseProcessor::findRepeatableClause<tomp::clause::CopyprivateT<Fortran::evaluate::DynamicType, Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>>(std::function<void (tomp::c
lause::CopyprivateT<Fortran::evaluate::DynamicType, Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>> const&, Fortran::parser::CharBlock const&)>) const (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bi
n/flang+0x5416954)
#13 0x00000000054169c8 Fortran::lower::omp::ClauseProcessor::processCopyprivate(mlir::Location, mlir::omp::CopyprivateClauseOps&) const (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x54169c8)
#14 0x00000000053d5760 genSingleOp(Fortran::lower::AbstractConverter&, Fortran::lower::SymMap&, Fortran::semantics::SemanticsContext&, Fortran::lower::pft::Evaluation&, mlir::Location, llvm::SmallVector<tomp::DirectiveWithClauses<Fortran::lower::omp::Clause>, 0u> const&, tomp::DirectiveWithClauses<Fortran::lower::om
p::Clause> const*) OpenMP.cpp:0:0
#15 0x00000000053d741c genOMPDispatch(Fortran::lower::AbstractConverter&, Fortran::lower::SymMap&, Fortran::semantics::SemanticsContext&, Fortran::lower::pft::Evaluation&, mlir::Location, llvm::SmallVector<tomp::DirectiveWithClauses<Fortran::lower::omp::Clause>, 0u> const&, tomp::DirectiveWithClauses<Fortran::lower:
:omp::Clause> const*) OpenMP.cpp:0:0
#16 0x00000000053dc60c std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<void (*)(genOMP(Fortran::lower::AbstractConverter&, Fortran::lower::SymMap&, Fortran::semantics::SemanticsContext&, Fortran::lower::pft::Evaluation&, Fortran::parser::OpenMPConstruct const&)::'lambda'(auto&&)&&,
 std::variant<Fortran::parser::OpenMPStandaloneConstruct, Fortran::parser::OpenMPSectionsConstruct, Fortran::parser::OpenMPSectionConstruct, Fortran::parser::OpenMPLoopConstruct, Fortran::parser::OpenMPBlockConstruct, Fortran::parser::OpenMPAtomicConstruct, Fortran::parser::OpenMPDeclarativeAllocate, Fortran::parser
::OpenMPDispatchConstruct, Fortran::parser::OpenMPUtilityConstruct, Fortran::parser::OpenMPExecutableAllocate, Fortran::parser::OpenMPAllocatorsConstruct, Fortran::parser::OpenMPAssumeConstruct, Fortran::parser::OpenMPCriticalConstruct> const&)>, std::tuple<std::variant<Fortran::parser::OpenMPStandaloneConstruct, Fo
rtran::parser::OpenMPSectionsConstruct, Fortran::parser::OpenMPSectionConstruct, Fortran::parser::OpenMPLoopConstruct, Fortran::parser::OpenMPBlockConstruct, Fortran::parser::OpenMPAtomicConstruct, Fortran::parser::OpenMPDeclarativeAllocate, Fortran::parser::OpenMPDispatchConstruct, Fortran::parser::OpenMPUtilityCon
struct, Fortran::parser::OpenMPExecutableAllocate, Fortran::parser::OpenMPAllocatorsConstruct, Fortran::parser::OpenMPAssumeConstruct, Fortran::parser::OpenMPCriticalConstruct> const&>, std::integer_sequence<unsigned long, 4ul>>::__visit_invoke(genOMP(Fortran::lower::AbstractConverter&, Fortran::lower::SymMap&, Fort
ran::semantics::SemanticsContext&, Fortran::lower::pft::Evaluation&, Fortran::parser::OpenMPConstruct const&)::'lambda'(auto&&)&&, std::variant<Fortran::parser::OpenMPStandaloneConstruct, Fortran::parser::OpenMPSectionsConstruct, Fortran::parser::OpenMPSectionConstruct, Fortran::parser::OpenMPLoopConstruct, Fortran:
:parser::OpenMPBlockConstruct, Fortran::parser::OpenMPAtomicConstruct, Fortran::parser::OpenMPDeclarativeAllocate, Fortran::parser::OpenMPDispatchConstruct, Fortran::parser::OpenMPUtilityConstruct, Fortran::parser::OpenMPExecutableAllocate, Fortran::parser::OpenMPAllocatorsConstruct, Fortran::parser::OpenMPAssumeCon
struct, Fortran::parser::OpenMPCriticalConstruct> const&) OpenMP.cpp:0:0
#17 0x00000000053bedfc Fortran::lower::genOpenMPConstruct(Fortran::lower::AbstractConverter&, Fortran::lower::SymMap&, Fortran::semantics::SemanticsContext&, Fortran::lower::pft::Evaluation&, Fortran::parser::OpenMPConstruct const&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x53b
edfc)

- Omitted -

#27 0x0000000005059318 (anonymous namespace)::FirConverter::lowerFunc(Fortran::lower::pft::FunctionLikeUnit&) Bridge.cpp:0:0
#28 0x0000000005053160 Fortran::lower::LoweringBridge::lower(Fortran::parser::Program const&, Fortran::semantics::SemanticsContext const&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x5053160)
#29 0x0000000005004908 Fortran::frontend::CodeGenAction::beginSourceFileAction() (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x5004908)
#30 0x0000000004f106a8 Fortran::frontend::FrontendAction::beginSourceFile(Fortran::frontend::CompilerInstance&, Fortran::frontend::FrontendInputFile const&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x4f106a8)
#31 0x0000000004effacc Fortran::frontend::CompilerInstance::executeAction(Fortran::frontend::FrontendAction&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x4effacc)
#32 0x0000000004f150ac Fortran::frontend::executeCompilerInvocation(Fortran::frontend::CompilerInstance*) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x4f150ac)
#33 0x0000000004ef82fc fc1_main(llvm::ArrayRef<char const*>, char const*) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x4ef82fc)
#34 0x0000000004ef7d50 main (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x4ef7d50)
#35 0x000040003ada4384 __libc_start_main (/lib64/libc.so.6+0x24384)
#36 0x0000000004ef621c _start (/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang+0x4ef621c)
flang-20: error: unable to execute command: Aborted (core dumped)
flang-20: error: flang frontend command failed due to signal (use -v to see invocation)
flang version 21.0.0git (https://github.com/llvm/llvm-project.git 74ca5799caea342ac1e8d34ab5be7f45875131b2)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin
Build config: +assertions
flang-20: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
flang-20: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
flang-20: note: diagnostic msg: /tmp/snefe049_2-f702d8
flang-20: note: diagnostic msg: /tmp/snefe049_2-f702d8.sh
flang-20: note: diagnostic msg:

********************
$
```

```
$ cat /tmp/snefe049_2-f702d8
#line "./snefe049_2.f90" 1
      program main
 interface
      function sub1() bind(c) result(ret)
       use, intrinsic::iso_c_binding
       integer(c_int)::ret
      end function sub1
      end interface
 procedure(sub1),pointer,save,bind(c)::ffunptr
      save
!$omp threadprivate(ffunptr)
!$omp parallel
      ffunptr=>sub1
!$omp single
 ffunptr=>sub1
!$omp end single copyprivate(ffunptr)
      if(ffunptr() /= 1) print *,'err'
!$omp end parallel
      print *,'pass'
      end program main

      function sub1() bind(c) result(ret)
      use, intrinsic::iso_c_binding
      integer(c_int)::ret
      ret=1
      end function sub1
$
```

```
$ cat /tmp/snefe049_2-f702d8.sh
# Crash reproducer for clang version 21.0.0git (https://github.com/llvm/llvm-project.git 74ca5799caea342ac1e8d34ab5be7f45875131b2)
# Driver args: "-fopenmp" "snefe049_2.f90"
# Original command: "/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang" "-fc1" "-triple" "aarch64-unknown-linux-gnu" "-emit-obj" "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie" "-target-cpu" "generic" "-target-feature" "+outline-atomics" "-target-feature" "+v8a" "-target-featur
e" "+fp-armv8" "-target-feature" "+neon" "-fopenmp" "-resource-dir" "/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/lib/clang/21" "-mframe-pointer=non-leaf" "-o" "/tmp/snefe049_2-216730.o" "-x" "f95-cpp-input" "snefe049_2.f90"
 "/work/groups/ssoft/compiler/llvm/aarch64/main-20250310-74ca5799caea/bin/flang" "-fc1" "-triple" "aarch64-unknown-linux-gnu" "-emit-obj" "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie" "-target-cpu" "generic" "-target-feature" "+outline-atomics" "-target-feature" "+v8a" "-target-feature" "+fp-armv8" "-tar
get-feature" "+neon" "-fopenmp" "-mframe-pointer=non-leaf" "-x" "f95-cpp-input" "snefe049_2-f702d8"
$
```

```
$ export OMP_NUM_THREADS=2; gfortran -fopenmp snefe049_2.f90; ./a.out
 pass
$
```

```
$ export OMP_NUM_THREADS=2; ifx -qopenmp snefe049_2.f90; ./a.out
 pass
$
```

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to