@@ -541,7 +541,8 @@ static mlir::Value getShapeFromDecl(mlir::Value src) {
541541
542542static mlir::Value emboxSrc (mlir::PatternRewriter &rewriter,
543543 cuf::DataTransferOp op,
544- const mlir::SymbolTable &symtab) {
544+ const mlir::SymbolTable &symtab,
545+ mlir::Type dstEleTy = nullptr ) {
545546 auto mod = op->getParentOfType <mlir::ModuleOp>();
546547 mlir::Location loc = op.getLoc ();
547548 fir::FirOpBuilder builder (rewriter, mod);
@@ -555,11 +556,21 @@ static mlir::Value emboxSrc(mlir::PatternRewriter &rewriter,
555556 // from a LOGICAL constant. Store it as a fir.logical.
556557 srcTy = fir::LogicalType::get (rewriter.getContext (), 4 );
557558 src = createConvertOp (rewriter, loc, srcTy, src);
559+ addr = builder.createTemporary (loc, srcTy);
560+ builder.create <fir::StoreOp>(loc, src, addr);
561+ } else {
562+ if (dstEleTy && fir::isa_trivial (dstEleTy) && srcTy != dstEleTy) {
563+ // Use dstEleTy and convert to avoid assign mismatch.
564+ addr = builder.createTemporary (loc, dstEleTy);
565+ auto conv = builder.create <fir::ConvertOp>(loc, dstEleTy, src);
566+ builder.create <fir::StoreOp>(loc, conv, addr);
567+ srcTy = dstEleTy;
568+ } else {
569+ // Put constant in memory if it is not.
570+ addr = builder.createTemporary (loc, srcTy);
571+ builder.create <fir::StoreOp>(loc, src, addr);
572+ }
558573 }
559- // Put constant in memory if it is not.
560- mlir::Value alloc = builder.createTemporary (loc, srcTy);
561- builder.create <fir::StoreOp>(loc, src, alloc);
562- addr = alloc;
563574 } else {
564575 addr = op.getSrc ();
565576 }
@@ -729,7 +740,7 @@ struct CUFDataTransferOpConversion
729740 };
730741
731742 // Conversion of data transfer involving at least one descriptor.
732- if (mlir::isa <fir::BaseBoxType>(dstTy)) {
743+ if (auto dstBoxTy = mlir::dyn_cast <fir::BaseBoxType>(dstTy)) {
733744 // Transfer to a descriptor.
734745 mlir::func::FuncOp func =
735746 isDstGlobal (op)
@@ -740,7 +751,8 @@ struct CUFDataTransferOpConversion
740751 mlir::Value dst = op.getDst ();
741752 mlir::Value src = op.getSrc ();
742753 if (!mlir::isa<fir::BaseBoxType>(srcTy)) {
743- src = emboxSrc (rewriter, op, symtab);
754+ mlir::Type dstEleTy = fir::unwrapInnerType (dstBoxTy.getEleTy ());
755+ src = emboxSrc (rewriter, op, symtab, dstEleTy);
744756 if (fir::isa_trivial (srcTy))
745757 func = fir::runtime::getRuntimeFunc<mkRTKey (CUFDataTransferCstDesc)>(
746758 loc, builder);
0 commit comments