Author: Tom Eccles Date: 2025-02-18T09:12:08Z New Revision: 8261d59fcb025db2fdecc2f4497b3314dd7d992e
URL: https://github.com/llvm/llvm-project/commit/8261d59fcb025db2fdecc2f4497b3314dd7d992e DIFF: https://github.com/llvm/llvm-project/commit/8261d59fcb025db2fdecc2f4497b3314dd7d992e.diff LOG: Revert "[flang][Lower][OpenMP] Don't read moldarg for static sized array (#12…" This reverts commit 88dd372d673c7e6967c93aa2879f0ef04fc7ac20. Added: Modified: flang/lib/Lower/OpenMP/DataSharingProcessor.cpp flang/lib/Lower/OpenMP/PrivateReductionUtils.cpp flang/lib/Lower/OpenMP/PrivateReductionUtils.h flang/test/Lower/OpenMP/delayed-privatization-array.f90 Removed: ################################################################################ diff --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp index d725dfd3e94f3..d13f101f516e7 100644 --- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp +++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp @@ -508,8 +508,6 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym, lower::SymbolBox hsb = converter.lookupOneLevelUpSymbol(*sym); assert(hsb && "Host symbol box not found"); - hlfir::Entity entity{hsb.getAddr()}; - bool cannotHaveNonDefaultLowerBounds = !entity.mayHaveNonDefaultLowerBounds(); mlir::Location symLoc = hsb.getAddr().getLoc(); std::string privatizerName = sym->name().ToString() + ".privatizer"; @@ -530,6 +528,7 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym, // an alloca for a fir.array type there. Get around this by boxing all // arrays. if (mlir::isa<fir::SequenceType>(allocType)) { + hlfir::Entity entity{hsb.getAddr()}; entity = genVariableBox(symLoc, firOpBuilder, entity); privVal = entity.getBase(); allocType = privVal.getType(); @@ -591,7 +590,7 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym, result.getDeallocRegion(), isFirstPrivate ? DeclOperationKind::FirstPrivate : DeclOperationKind::Private, - sym, cannotHaveNonDefaultLowerBounds); + sym); // TODO: currently there are false positives from dead uses of the mold // arg if (!result.getInitMoldArg().getUses().empty()) diff --git a/flang/lib/Lower/OpenMP/PrivateReductionUtils.cpp b/flang/lib/Lower/OpenMP/PrivateReductionUtils.cpp index 21ade77d82d37..22cd0679050db 100644 --- a/flang/lib/Lower/OpenMP/PrivateReductionUtils.cpp +++ b/flang/lib/Lower/OpenMP/PrivateReductionUtils.cpp @@ -122,40 +122,25 @@ static void createCleanupRegion(Fortran::lower::AbstractConverter &converter, typeError(); } -fir::ShapeShiftOp -Fortran::lower::omp::getShapeShift(fir::FirOpBuilder &builder, - mlir::Location loc, mlir::Value box, - bool cannotHaveNonDefaultLowerBounds) { +fir::ShapeShiftOp Fortran::lower::omp::getShapeShift(fir::FirOpBuilder &builder, + mlir::Location loc, + mlir::Value box) { fir::SequenceType sequenceType = mlir::cast<fir::SequenceType>( hlfir::getFortranElementOrSequenceType(box.getType())); const unsigned rank = sequenceType.getDimension(); - llvm::SmallVector<mlir::Value> lbAndExtents; lbAndExtents.reserve(rank * 2); - mlir::Type idxTy = builder.getIndexType(); - if (cannotHaveNonDefaultLowerBounds && !sequenceType.hasDynamicExtents()) { - // We don't need fir::BoxDimsOp if all of the extents are statically known - // and we can assume default lower bounds. This helps avoids reads from the - // mold arg. - mlir::Value one = builder.createIntegerConstant(loc, idxTy, 1); - for (int64_t extent : sequenceType.getShape()) { - assert(extent != sequenceType.getUnknownExtent()); - mlir::Value extentVal = builder.createIntegerConstant(loc, idxTy, extent); - lbAndExtents.push_back(one); - lbAndExtents.push_back(extentVal); - } - } else { - for (unsigned i = 0; i < rank; ++i) { - // TODO: ideally we want to hoist box reads out of the critical section. - // We could do this by having box dimensions in block arguments like - // OpenACC does - mlir::Value dim = builder.createIntegerConstant(loc, idxTy, i); - auto dimInfo = - builder.create<fir::BoxDimsOp>(loc, idxTy, idxTy, idxTy, box, dim); - lbAndExtents.push_back(dimInfo.getLowerBound()); - lbAndExtents.push_back(dimInfo.getExtent()); - } + mlir::Type idxTy = builder.getIndexType(); + for (unsigned i = 0; i < rank; ++i) { + // TODO: ideally we want to hoist box reads out of the critical section. + // We could do this by having box dimensions in block arguments like + // OpenACC does + mlir::Value dim = builder.createIntegerConstant(loc, idxTy, i); + auto dimInfo = + builder.create<fir::BoxDimsOp>(loc, idxTy, idxTy, idxTy, box, dim); + lbAndExtents.push_back(dimInfo.getLowerBound()); + lbAndExtents.push_back(dimInfo.getExtent()); } auto shapeShiftTy = fir::ShapeShiftType::get(builder.getContext(), rank); @@ -263,13 +248,12 @@ class PopulateInitAndCleanupRegionsHelper { mlir::Type argType, mlir::Value scalarInitValue, mlir::Value allocatedPrivVarArg, mlir::Value moldArg, mlir::Block *initBlock, mlir::Region &cleanupRegion, - DeclOperationKind kind, const Fortran::semantics::Symbol *sym, - bool cannotHaveLowerBounds) + DeclOperationKind kind, const Fortran::semantics::Symbol *sym) : converter{converter}, builder{converter.getFirOpBuilder()}, loc{loc}, argType{argType}, scalarInitValue{scalarInitValue}, allocatedPrivVarArg{allocatedPrivVarArg}, moldArg{moldArg}, initBlock{initBlock}, cleanupRegion{cleanupRegion}, kind{kind}, - sym{sym}, cannotHaveNonDefaultLowerBounds{cannotHaveLowerBounds} { + sym{sym} { valType = fir::unwrapRefType(argType); } @@ -311,10 +295,6 @@ class PopulateInitAndCleanupRegionsHelper { /// Any length parameters which have been fetched for the type mlir::SmallVector<mlir::Value> lenParams; - /// If the source variable being privatized definitely can't have non-default - /// lower bounds then we don't need to generate code to read them. - bool cannotHaveNonDefaultLowerBounds; - void createYield(mlir::Value ret) { builder.create<mlir::omp::YieldOp>(loc, ret); } @@ -452,8 +432,7 @@ void PopulateInitAndCleanupRegionsHelper::initAndCleanupBoxedArray( // Special case for (possibly allocatable) arrays of polymorphic types // e.g. !fir.class<!fir.heap<!fir.array<?x!fir.type<>>>> if (source.isPolymorphic()) { - fir::ShapeShiftOp shape = - getShapeShift(builder, loc, source, cannotHaveNonDefaultLowerBounds); + fir::ShapeShiftOp shape = getShapeShift(builder, loc, source); mlir::Type arrayType = source.getElementOrSequenceType(); mlir::Value allocatedArray = builder.create<fir::AllocMemOp>( loc, arrayType, /*typeparams=*/mlir::ValueRange{}, shape.getExtents()); @@ -492,8 +471,8 @@ void PopulateInitAndCleanupRegionsHelper::initAndCleanupBoxedArray( // Put the temporary inside of a box: // hlfir::genVariableBox doesn't handle non-default lower bounds mlir::Value box; - fir::ShapeShiftOp shapeShift = getShapeShift(builder, loc, getLoadedMoldArg(), - cannotHaveNonDefaultLowerBounds); + fir::ShapeShiftOp shapeShift = + getShapeShift(builder, loc, getLoadedMoldArg()); mlir::Type boxType = getLoadedMoldArg().getType(); if (mlir::isa<fir::BaseBoxType>(temp.getType())) // the box created by the declare form createTempFromMold is missing @@ -628,10 +607,10 @@ void Fortran::lower::omp::populateByRefInitAndCleanupRegions( mlir::Type argType, mlir::Value scalarInitValue, mlir::Block *initBlock, mlir::Value allocatedPrivVarArg, mlir::Value moldArg, mlir::Region &cleanupRegion, DeclOperationKind kind, - const Fortran::semantics::Symbol *sym, bool cannotHaveLowerBounds) { + const Fortran::semantics::Symbol *sym) { PopulateInitAndCleanupRegionsHelper helper( converter, loc, argType, scalarInitValue, allocatedPrivVarArg, moldArg, - initBlock, cleanupRegion, kind, sym, cannotHaveLowerBounds); + initBlock, cleanupRegion, kind, sym); helper.populateByRefInitAndCleanupRegions(); // Often we load moldArg to check something (e.g. length parameters, shape) diff --git a/flang/lib/Lower/OpenMP/PrivateReductionUtils.h b/flang/lib/Lower/OpenMP/PrivateReductionUtils.h index 0a3513bff19b0..fcd36392a29e0 100644 --- a/flang/lib/Lower/OpenMP/PrivateReductionUtils.h +++ b/flang/lib/Lower/OpenMP/PrivateReductionUtils.h @@ -55,13 +55,11 @@ void populateByRefInitAndCleanupRegions( mlir::Value scalarInitValue, mlir::Block *initBlock, mlir::Value allocatedPrivVarArg, mlir::Value moldArg, mlir::Region &cleanupRegion, DeclOperationKind kind, - const Fortran::semantics::Symbol *sym = nullptr, - bool cannotHaveNonDefaultLowerBounds = false); + const Fortran::semantics::Symbol *sym = nullptr); /// Generate a fir::ShapeShift op describing the provided boxed array. fir::ShapeShiftOp getShapeShift(fir::FirOpBuilder &builder, mlir::Location loc, - mlir::Value box, - bool cannotHaveNonDefaultLowerBounds = false); + mlir::Value box); } // namespace omp } // namespace lower diff --git a/flang/test/Lower/OpenMP/delayed-privatization-array.f90 b/flang/test/Lower/OpenMP/delayed-privatization-array.f90 index c447fa6f27a75..95fa3f9e03052 100644 --- a/flang/test/Lower/OpenMP/delayed-privatization-array.f90 +++ b/flang/test/Lower/OpenMP/delayed-privatization-array.f90 @@ -108,14 +108,15 @@ program main ! ONE_DIM_DEFAULT_LB-SAME: @[[PRIVATIZER_SYM:.*]] : [[BOX_TYPE:!fir.box<!fir.array<10xi32>>]] init { ! ONE_DIM_DEFAULT_LB-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[TYPE:!fir.ref<!fir.box<!fir.array<10xi32>>>]], %[[PRIV_BOX_ALLOC:.*]]: [[TYPE]]): +! ONE_DIM_DEFAULT_LB-NEXT: %[[PRIV_ARG_VAL:.*]] = fir.load %[[PRIV_ARG]] ! ONE_DIM_DEFAULT_LB-NEXT: %[[C10:.*]] = arith.constant 10 : index ! ONE_DIM_DEFAULT_LB-NEXT: %[[SHAPE:.*]] = fir.shape %[[C10]] ! ONE_DIM_DEFAULT_LB-NEXT: %[[ARRAY_ALLOC:.*]] = fir.allocmem !fir.array<10xi32> ! ONE_DIM_DEFAULT_LB-NEXT: %[[TRUE:.*]] = arith.constant true ! ONE_DIM_DEFAULT_LB-NEXT: %[[DECL:.*]]:2 = hlfir.declare %[[ARRAY_ALLOC]](%[[SHAPE]]) -! ONE_DIM_DEFAULT_LB-NEXT: %[[ONE:.*]] = arith.constant 1 : index -! ONE_DIM_DEFAULT_LB-NEXT: %[[TEN:.*]] = arith.constant 10 : index -! ONE_DIM_DEFAULT_LB-NEXT: %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[ONE]], %[[TEN]] +! ONE_DIM_DEFAULT_LB-NEXT: %[[C0_0:.*]] = arith.constant 0 +! ONE_DIM_DEFAULT_LB-NEXT: %[[DIMS2:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0_0]] +! ONE_DIM_DEFAULT_LB-NEXT: %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[DIMS2]]#0, %[[DIMS2]]#1 ! ONE_DIM_DEFAULT_LB-NEXT: %[[EMBOX:.*]] = fir.embox %[[DECL]]#0(%[[SHAPE_SHIFT]]) ! ONE_DIM_DEFAULT_LB-NEXT: fir.store %[[EMBOX]] to %[[PRIV_BOX_ALLOC]] ! ONE_DIM_DEFAULT_LB-NEXT: omp.yield(%[[PRIV_BOX_ALLOC]] : [[TYPE]]) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits