[flang-commits] [flang] [Flang][OpenMP] Fix copyin allocatable lowering to MLIR (PR #122097)
Leandro Lupori via flang-commits
flang-commits at lists.llvm.org
Tue Jan 21 11:59:48 PST 2025
================
@@ -1290,9 +1290,31 @@ class FirConverter : public Fortran::lower::AbstractConverter {
auto loadVal = builder->create<fir::LoadOp>(loc, rhs);
builder->create<fir::StoreOp>(loc, loadVal, lhs);
} else if (isAllocatable &&
- (flags.test(Fortran::semantics::Symbol::Flag::OmpFirstPrivate) ||
- flags.test(Fortran::semantics::Symbol::Flag::OmpCopyIn))) {
- // For firstprivate and copyin allocatable variables, RHS must be copied
+ flags.test(Fortran::semantics::Symbol::Flag::OmpCopyIn)) {
+ // For copyin allocatable variables, RHS must be copied to lhs
+ // only when rhs is allocated.
+ hlfir::Entity temp =
+ hlfir::derefPointersAndAllocatables(loc, *builder, rhs);
+ mlir::Value addr = hlfir::genVariableRawAddress(loc, *builder, temp);
+ mlir::Value isAllocated = builder->genIsNotNullAddr(loc, addr);
+ builder->genIfThenElse(loc, isAllocated)
+ .genThen([&]() { copyData(lhs, rhs); })
+ .genElse([&]() {
+ fir::ExtendedValue hexv = symBoxToExtendedValue(dst);
+ hexv.match(
+ [&](const fir::MutableBoxValue &new_box) -> void {
+ // if the allocation status of original list item is
+ // unallocated, unallocate the copy if it is allocated, else
+ // do nothing.
+ Fortran::lower::genDeallocateIfAllocated(*this, new_box, loc);
+ },
+ [&](const auto &) -> void {});
+ })
+ .end();
+ } else if (isAllocatable &&
+ (flags.test(
+ Fortran::semantics::Symbol::Flag::OmpFirstPrivate))) {
----------------
luporl wrote:
nit: parentheses can be removed here.
https://github.com/llvm/llvm-project/pull/122097
More information about the flang-commits
mailing list