================ @@ -96,17 +149,118 @@ fir::ShapeShiftOp Fortran::lower::omp::getShapeShift(fir::FirOpBuilder &builder, return shapeShift; } +// Initialize box newBox using moldBox. These should both have the same type and +// be boxes containing derived types e.g. +// fir.box<!fir.type<>> +// fir.box<!fir.heap<!fir.type<>> +// fir.box<!fir.heap<!fir.array<fir.type<>>> +// fir.class<...<!fir.type<>>> +// If the type doesn't match , this does nothing +static void initializeIfDerivedTypeBox(fir::FirOpBuilder &builder, + mlir::Location loc, mlir::Value newBox, + mlir::Value moldBox, bool hasInitializer, + bool isFirstPrivate) { + fir::BoxType boxTy = mlir::dyn_cast<fir::BoxType>(newBox.getType()); + fir::ClassType classTy = mlir::dyn_cast<fir::ClassType>(newBox.getType()); + if (!boxTy && !classTy) + return; + + // remove pointer and array types in the middle + mlir::Type eleTy; + if (boxTy) + eleTy = boxTy.getElementType(); + if (classTy) + eleTy = classTy.getEleTy(); + mlir::Type derivedTy = fir::unwrapRefType(eleTy); + if (auto array = mlir::dyn_cast<fir::SequenceType>(derivedTy)) + derivedTy = array.getElementType(); + + if (!fir::isa_derived(derivedTy)) + return; + assert(moldBox.getType() == newBox.getType()); + + if (hasInitializer) + fir::runtime::genDerivedTypeInitialize(builder, loc, newBox); + + if (hlfir::mayHaveAllocatableComponent(derivedTy) && !isFirstPrivate) + fir::runtime::genDerivedTypeInitializeClone(builder, loc, newBox, moldBox); +} + +static void getLengthParameters(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Value moldArg, + llvm::SmallVectorImpl<mlir::Value> &lenParams) { + // We pass derived types unboxed and so are not self-contained entities. + // Assume that unboxed derived types won't need length paramters. + if (!hlfir::isFortranEntity(moldArg)) + return; + + hlfir::genLengthParameters(loc, builder, hlfir::Entity{moldArg}, lenParams); + if (lenParams.empty()) + return; + + // The verifier for EmboxOp doesn't allow length parameters when the the + // character already has static LEN. genLengthParameters may still return them + // in this case. + mlir::Type unwrappedType = + fir::unwrapRefType(fir::unwrapSeqOrBoxedSeqType(moldArg.getType())); + if (auto strTy = mlir::dyn_cast<fir::CharacterType>(unwrappedType)) { + if (strTy.hasConstantLen()) + lenParams.resize(0); + } +} + +static bool +isDerivedTypeNeedingInitialization(const Fortran::semantics::Symbol &sym) { + // Fortran::lower::hasDefaultInitialization returns false for ALLOCATABLE, so + // re-implement here. + // ignorePointer=true because either the pointer points to the same target as + // the original variable, or it is uninitialized. + if (const Fortran::semantics::DeclTypeSpec *declTypeSpec = sym.GetType()) + if (const Fortran::semantics::DerivedTypeSpec *derivedTypeSpec = + declTypeSpec->AsDerived()) + if (derivedTypeSpec->HasDefaultInitialization( + /*ignoreAllocatable=*/false, /*ignorePointer=*/true)) + return true; + return false; +} + +static mlir::Value generateZeroShapeForRank(fir::FirOpBuilder &builder, + mlir::Location loc, + mlir::Value moldArg) { + mlir::Type moldVal = fir::unwrapRefType(moldArg.getType()); ---------------- ergawy wrote:
```suggestion mlir::Type moldType = fir::unwrapRefType(moldArg.getType()); ``` https://github.com/llvm/llvm-project/pull/124019 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits