[flang-commits] [flang] [flang][OpenMP] fix lastprivate for allocatables (PR #99686)
Kiran Chandramohan via flang-commits
flang-commits at lists.llvm.org
Mon Jul 22 05:29:11 PDT 2024
================
@@ -127,8 +128,52 @@ void DataSharingProcessor::copyFirstPrivateSymbol(
void DataSharingProcessor::copyLastPrivateSymbol(
const semantics::Symbol *sym,
[[maybe_unused]] mlir::OpBuilder::InsertPoint *lastPrivIP) {
- if (sym->test(semantics::Symbol::Flag::OmpLastPrivate))
- converter.copyHostAssociateVar(*sym, lastPrivIP);
+ if (sym->test(semantics::Symbol::Flag::OmpLastPrivate)) {
+ bool allocatable = semantics::IsAllocatable(sym->GetUltimate());
+ if (!allocatable) {
+ converter.copyHostAssociateVar(*sym, lastPrivIP);
+ return;
+ }
+
+ // copyHostAssociateVar doesn't work properly if the privatised copy was
+ // reallocated (e.g. by assignment): it will only copy if the ultimate
+ // symbol was already allocated, and it only copies data so any reallocated
+ // lengths etc are lost
+
+ // 1) Fetch the original copy of the variable.
+ assert(sym->has<Fortran::semantics::HostAssocDetails>() &&
+ "No host-association found");
+ const Fortran::semantics::Symbol &hsym = sym->GetUltimate();
+ Fortran::lower::SymbolBox hsb = symTable->lookupOneLevelUpSymbol(hsym);
+ assert(hsb && "Host symbol box not found");
+
+ // 2) Fetch the copied one that will mask the original.
+ Fortran::lower::SymbolBox sb = symTable->shallowLookupSymbol(sym);
+ assert(sb && "Host-associated symbol box not found");
+ assert(hsb.getAddr() != sb.getAddr() &&
+ "Host and associated symbol boxes are the same");
+
+ // 3) Perform the assignment.
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder();
+ mlir::Location loc = converter.genLocation(sym->name());
+ mlir::OpBuilder::InsertPoint insPt = builder.saveInsertionPoint();
+ if (lastPrivIP && lastPrivIP->isSet())
+ builder.restoreInsertionPoint(*lastPrivIP);
+ else
+ builder.setInsertionPointAfter(sb.getAddr().getDefiningOp());
+
+ hlfir::Entity dst{hsb.getAddr()};
+ hlfir::Entity src{sb.getAddr()};
+ builder.create<hlfir::AssignOp>(
+ loc, src, dst, /*isWholeAllocatableAssignment=*/allocatable,
+ /*keepLhsLengthInAllocatableAssignment=*/false,
+ /*temporary_lhs=*/false);
----------------
kiranchandramohan wrote:
If this code is placed in the `isAllocatable` part of `copyVarHLFIR` in Bridge.cpp, will there be lot of tests that have to be updated?
Can we do this at some point in the future after the branch?
https://github.com/llvm/llvm-project/pull/99686
More information about the flang-commits
mailing list