diff options
Diffstat (limited to 'flang/lib/Lower/Allocatable.cpp')
-rw-r--r-- | flang/lib/Lower/Allocatable.cpp | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/flang/lib/Lower/Allocatable.cpp b/flang/lib/Lower/Allocatable.cpp index f143656..dc13554 100644 --- a/flang/lib/Lower/Allocatable.cpp +++ b/flang/lib/Lower/Allocatable.cpp @@ -22,12 +22,14 @@ #include "flang/Lower/PFTBuilder.h" #include "flang/Lower/Runtime.h" #include "flang/Lower/StatementContext.h" +#include "flang/Optimizer/Builder/CUFCommon.h" #include "flang/Optimizer/Builder/FIRBuilder.h" #include "flang/Optimizer/Builder/Runtime/RTBuilder.h" #include "flang/Optimizer/Builder/Todo.h" #include "flang/Optimizer/Dialect/CUF/CUFOps.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Dialect/FIROpsSupport.h" +#include "flang/Optimizer/HLFIR/HLFIROps.h" #include "flang/Optimizer/Support/FatalError.h" #include "flang/Optimizer/Support/InternalNames.h" #include "flang/Parser/parse-tree.h" @@ -184,14 +186,9 @@ static mlir::Value genRuntimeAllocate(fir::FirOpBuilder &builder, ? fir::runtime::getRuntimeFunc<mkRTKey(PointerAllocate)>(loc, builder) : fir::runtime::getRuntimeFunc<mkRTKey(AllocatableAllocate)>(loc, builder); - llvm::SmallVector<mlir::Value> args{box.getAddr()}; - if (!box.isPointer()) - args.push_back( - builder.createIntegerConstant(loc, builder.getI64Type(), -1)); - args.push_back(errorManager.hasStat); - args.push_back(errorManager.errMsgAddr); - args.push_back(errorManager.sourceFile); - args.push_back(errorManager.sourceLine); + llvm::SmallVector<mlir::Value> args{ + box.getAddr(), errorManager.hasStat, errorManager.errMsgAddr, + errorManager.sourceFile, errorManager.sourceLine}; llvm::SmallVector<mlir::Value> operands; for (auto [fst, snd] : llvm::zip(args, callee.getFunctionType().getInputs())) operands.emplace_back(builder.createConvert(loc, snd, fst)); @@ -457,6 +454,19 @@ private: alloc.getSymbol()); } + void setPinnedToFalse() { + if (!pinnedExpr) + return; + Fortran::lower::StatementContext stmtCtx; + mlir::Value pinned = + fir::getBase(converter.genExprAddr(loc, *pinnedExpr, stmtCtx)); + mlir::Location loc = pinned.getLoc(); + mlir::Value falseValue = builder.createBool(loc, false); + mlir::Value falseConv = builder.createConvert( + loc, fir::unwrapRefType(pinned.getType()), falseValue); + builder.create<fir::StoreOp>(loc, falseConv, pinned); + } + void genSimpleAllocation(const Allocation &alloc, const fir::MutableBoxValue &box) { bool isCudaSymbol = Fortran::semantics::HasCUDAAttr(alloc.getSymbol()); @@ -472,6 +482,7 @@ private: // can be validated. genInlinedAllocation(alloc, box); postAllocationAction(alloc); + setPinnedToFalse(); return; } @@ -485,11 +496,13 @@ private: genSetDeferredLengthParameters(alloc, box); genAllocateObjectBounds(alloc, box); mlir::Value stat; - if (!isCudaSymbol) + if (!isCudaSymbol) { stat = genRuntimeAllocate(builder, loc, box, errorManager); - else + setPinnedToFalse(); + } else { stat = genCudaAllocate(builder, loc, box, errorManager, alloc.getSymbol()); + } fir::factory::syncMutableBoxFromIRBox(builder, loc, box); postAllocationAction(alloc); errorManager.assignStat(builder, loc, stat); @@ -619,13 +632,16 @@ private: genSetDeferredLengthParameters(alloc, box); genAllocateObjectBounds(alloc, box); mlir::Value stat; - if (Fortran::semantics::HasCUDAAttr(alloc.getSymbol())) + if (Fortran::semantics::HasCUDAAttr(alloc.getSymbol())) { stat = genCudaAllocate(builder, loc, box, errorManager, alloc.getSymbol()); - else if (isSource) - stat = genRuntimeAllocateSource(builder, loc, box, exv, errorManager); - else - stat = genRuntimeAllocate(builder, loc, box, errorManager); + } else { + if (isSource) + stat = genRuntimeAllocateSource(builder, loc, box, exv, errorManager); + else + stat = genRuntimeAllocate(builder, loc, box, errorManager); + setPinnedToFalse(); + } fir::factory::syncMutableBoxFromIRBox(builder, loc, box); postAllocationAction(alloc); errorManager.assignStat(builder, loc, stat); @@ -1098,11 +1114,13 @@ void Fortran::lower::associateMutableBox( fir::FirOpBuilder &builder = converter.getFirOpBuilder(); if (Fortran::evaluate::UnwrapExpr<Fortran::evaluate::NullPointer>(source)) { fir::factory::disassociateMutableBox(builder, loc, box); + cuf::genPointerSync(box.getAddr(), builder); return; } if (converter.getLoweringOptions().getLowerToHighLevelFIR()) { fir::ExtendedValue rhs = converter.genExprAddr(loc, source, stmtCtx); fir::factory::associateMutableBox(builder, loc, box, rhs, lbounds); + cuf::genPointerSync(box.getAddr(), builder); return; } // The right hand side is not be evaluated into a temp. Array sections can |