diff --git a/flang/lib/Optimizer/Transforms/ArrayValueCopy.cpp b/flang/lib/Optimizer/Transforms/ArrayValueCopy.cpp --- a/flang/lib/Optimizer/Transforms/ArrayValueCopy.cpp +++ b/flang/lib/Optimizer/Transforms/ArrayValueCopy.cpp @@ -667,11 +667,11 @@ return {}; } -// Are either of types of conflicts present? -inline bool conflictDetected(llvm::ArrayRef reach, - llvm::ArrayRef accesses, +// Are any conflicts present? The conflicts detected here are described above. +static bool conflictDetected(llvm::ArrayRef reach, + llvm::ArrayRef mentions, ArrayMergeStoreOp st) { - return conflictOnLoad(reach, st) || conflictOnMerge(accesses); + return conflictOnLoad(reach, st) || conflictOnMerge(mentions); } // Assume that any call to a function that uses host-associations will be @@ -871,21 +871,33 @@ return fir::ReferenceType::get(ty); } -static mlir::Value -genCoorOp(mlir::PatternRewriter &rewriter, mlir::Location loc, mlir::Type eleTy, - mlir::Type resTy, mlir::Value alloc, mlir::Value shape, - mlir::Value slice, mlir::ValueRange indices, - mlir::ValueRange typeparams, bool skipOrig = false) { +static llvm::SmallVector +getTypeParamsIfRawData(mlir::Location loc, FirOpBuilder &builder, + ArrayLoadOp arrLoad, mlir::Type ty) { + if (ty.isa()) + return {}; + return fir::factory::getTypeParams(loc, builder, arrLoad); +} + +static mlir::Value genCoorOp(mlir::PatternRewriter &rewriter, + mlir::Location loc, mlir::Type eleTy, + mlir::Type resTy, mlir::Value alloc, + mlir::Value shape, mlir::Value slice, + mlir::ValueRange indices, ArrayLoadOp load, + bool skipOrig = false) { llvm::SmallVector originated; if (skipOrig) originated.assign(indices.begin(), indices.end()); else - originated = fir::factory::originateIndices(loc, rewriter, alloc.getType(), - shape, indices); - auto seqTy = fir::dyn_cast_ptrOrBoxEleTy(alloc.getType()); - assert(seqTy && seqTy.isa()); - const auto dimension = seqTy.cast().getDimension(); - mlir::Value result = rewriter.create( + originated = factory::originateIndices(loc, rewriter, alloc.getType(), + shape, indices); + auto seqTy = dyn_cast_ptrOrBoxEleTy(alloc.getType()); + assert(seqTy && seqTy.isa()); + const auto dimension = seqTy.cast().getDimension(); + auto module = load->getParentOfType(); + FirOpBuilder builder(rewriter, getKindMapping(module)); + auto typeparams = getTypeParamsIfRawData(loc, builder, load, alloc.getType()); + mlir::Value result = rewriter.create( loc, eleTy, alloc, shape, slice, llvm::ArrayRef{originated}.take_front(dimension), typeparams); @@ -946,20 +958,19 @@ } // Reverse the indices so they are in column-major order. std::reverse(indices.begin(), indices.end()); - auto typeparams = arrLoad.getTypeparams(); + auto module = arrLoad->getParentOfType(); + FirOpBuilder builder(rewriter, getKindMapping(module)); auto fromAddr = rewriter.create( loc, getEleTy(src.getType()), src, shapeOp, CopyIn && copyUsingSlice ? sliceOp : mlir::Value{}, factory::originateIndices(loc, rewriter, src.getType(), shapeOp, indices), - typeparams); + getTypeParamsIfRawData(loc, builder, arrLoad, src.getType())); auto toAddr = rewriter.create( loc, getEleTy(dst.getType()), dst, shapeOp, !CopyIn && copyUsingSlice ? sliceOp : mlir::Value{}, factory::originateIndices(loc, rewriter, dst.getType(), shapeOp, indices), - typeparams); + getTypeParamsIfRawData(loc, builder, arrLoad, src.getType())); auto eleTy = unwrapSequenceType(unwrapPassByRefType(dst.getType())); - auto module = toAddr->getParentOfType(); - FirOpBuilder builder(rewriter, getKindMapping(module)); // Copy from (to) object to (from) temp copy of same object. if (auto charTy = eleTy.dyn_cast()) { auto len = getCharacterLen(loc, builder, arrLoad, charTy); @@ -1093,11 +1104,10 @@ load); // Generate the reference for the access. rewriter.setInsertionPoint(op); - auto coor = - genCoorOp(rewriter, loc, getEleTy(load.getType()), eleTy, allocmem, - shapeOp, copyUsingSlice ? mlir::Value{} : load.getSlice(), - access.getIndices(), load.getTypeparams(), - access->hasAttr(factory::attrFortranArrayOffsets())); + auto coor = genCoorOp( + rewriter, loc, getEleTy(load.getType()), eleTy, allocmem, shapeOp, + copyUsingSlice ? mlir::Value{} : load.getSlice(), access.getIndices(), + load, access->hasAttr(factory::attrFortranArrayOffsets())); // Copy out. auto *storeOp = useMap.lookup(loadOp); auto store = mlir::cast(storeOp); @@ -1145,7 +1155,7 @@ auto coor = genCoorOp( rewriter, loc, getEleTy(load.getType()), lhsEltRefType, allocmem, shapeOp, copyUsingSlice ? mlir::Value{} : load.getSlice(), - update.getIndices(), load.getTypeparams(), + update.getIndices(), load, update->hasAttr(factory::attrFortranArrayOffsets())); assignElement(coor); auto *storeOp = useMap.lookup(loadOp); @@ -1163,10 +1173,10 @@ LLVM_DEBUG(llvm::outs() << "No, conflict wasn't found\n"); rewriter.setInsertionPoint(op); auto coorTy = getEleTy(load.getType()); - auto coor = genCoorOp(rewriter, loc, coorTy, lhsEltRefType, - load.getMemref(), load.getShape(), load.getSlice(), - update.getIndices(), load.getTypeparams(), - update->hasAttr(factory::attrFortranArrayOffsets())); + auto coor = + genCoorOp(rewriter, loc, coorTy, lhsEltRefType, load.getMemref(), + load.getShape(), load.getSlice(), update.getIndices(), load, + update->hasAttr(factory::attrFortranArrayOffsets())); assignElement(coor); return {coor, load.getResult()}; } @@ -1240,11 +1250,10 @@ rewriter.setInsertionPoint(op); auto load = mlir::cast(useMap.lookup(op)); auto loc = fetch.getLoc(); - auto coor = - genCoorOp(rewriter, loc, getEleTy(load.getType()), - toRefType(fetch.getType()), load.getMemref(), load.getShape(), - load.getSlice(), fetch.getIndices(), load.getTypeparams(), - fetch->hasAttr(factory::attrFortranArrayOffsets())); + auto coor = genCoorOp( + rewriter, loc, getEleTy(load.getType()), toRefType(fetch.getType()), + load.getMemref(), load.getShape(), load.getSlice(), fetch.getIndices(), + load, fetch->hasAttr(factory::attrFortranArrayOffsets())); if (isa_ref_type(fetch.getType())) rewriter.replaceOp(fetch, coor); else @@ -1280,11 +1289,10 @@ } rewriter.setInsertionPoint(op); auto load = mlir::cast(useMap.lookup(op)); - auto coor = genCoorOp(rewriter, loc, getEleTy(load.getType()), - toRefType(access.getType()), load.getMemref(), - load.getShape(), load.getSlice(), access.getIndices(), - load.getTypeparams(), - access->hasAttr(factory::attrFortranArrayOffsets())); + auto coor = genCoorOp( + rewriter, loc, getEleTy(load.getType()), toRefType(access.getType()), + load.getMemref(), load.getShape(), load.getSlice(), access.getIndices(), + load, access->hasAttr(factory::attrFortranArrayOffsets())); rewriter.replaceOp(access, coor); return mlir::success(); }