diff options
Diffstat (limited to 'flang/lib/Lower/CUDA.cpp')
-rw-r--r-- | flang/lib/Lower/CUDA.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/flang/lib/Lower/CUDA.cpp b/flang/lib/Lower/CUDA.cpp index bb4bdee..9501b0e 100644 --- a/flang/lib/Lower/CUDA.cpp +++ b/flang/lib/Lower/CUDA.cpp @@ -68,11 +68,26 @@ cuf::DataAttributeAttr Fortran::lower::translateSymbolCUFDataAttribute( return cuf::getDataAttribute(mlirContext, cudaAttr); } -bool Fortran::lower::isTransferWithConversion(mlir::Value rhs) { +hlfir::ElementalOp Fortran::lower::isTransferWithConversion(mlir::Value rhs) { + auto isConversionElementalOp = [](hlfir::ElementalOp elOp) { + return llvm::hasSingleElement( + elOp.getBody()->getOps<hlfir::DesignateOp>()) && + llvm::hasSingleElement(elOp.getBody()->getOps<fir::LoadOp>()) == 1 && + llvm::hasSingleElement(elOp.getBody()->getOps<fir::ConvertOp>()) == + 1; + }; + if (auto declOp = mlir::dyn_cast<hlfir::DeclareOp>(rhs.getDefiningOp())) { + if (!declOp.getMemref().getDefiningOp()) + return {}; + if (auto associateOp = mlir::dyn_cast<hlfir::AssociateOp>( + declOp.getMemref().getDefiningOp())) + if (auto elOp = mlir::dyn_cast<hlfir::ElementalOp>( + associateOp.getSource().getDefiningOp())) + if (isConversionElementalOp(elOp)) + return elOp; + } if (auto elOp = mlir::dyn_cast<hlfir::ElementalOp>(rhs.getDefiningOp())) - if (llvm::hasSingleElement(elOp.getBody()->getOps<hlfir::DesignateOp>()) && - llvm::hasSingleElement(elOp.getBody()->getOps<fir::LoadOp>()) == 1 && - llvm::hasSingleElement(elOp.getBody()->getOps<fir::ConvertOp>()) == 1) - return true; - return false; + if (isConversionElementalOp(elOp)) + return elOp; + return {}; } |