diff --git a/flang/lib/Optimizer/Transforms/CUFOpConversion.cpp b/flang/lib/Optimizer/Transforms/CUFOpConversion.cpp index 8a6f28b9422f9..ec7f67dff763b 100644 --- a/flang/lib/Optimizer/Transforms/CUFOpConversion.cpp +++ b/flang/lib/Optimizer/Transforms/CUFOpConversion.cpp @@ -473,9 +473,16 @@ static mlir::Value emboxSrc(mlir::PatternRewriter &rewriter, mlir::Type srcTy = fir::unwrapRefType(op.getSrc().getType()); if (fir::isa_trivial(srcTy) && mlir::matchPattern(op.getSrc().getDefiningOp(), mlir::m_Constant())) { + mlir::Value src = op.getSrc(); + if (srcTy.isInteger(1)) { + // i1 is not a supported type in the descriptor and it is actually coming + // from a LOGICAL constant. Store it as a fir.logical. + srcTy = fir::LogicalType::get(rewriter.getContext(), 4); + src = createConvertOp(rewriter, loc, srcTy, src); + } // Put constant in memory if it is not. mlir::Value alloc = builder.createTemporary(loc, srcTy); - builder.create(loc, op.getSrc(), alloc); + builder.create(loc, src, alloc); addr = alloc; } else { addr = getDeviceAddress(rewriter, op.getSrcMutable(), symtab); diff --git a/flang/test/Fir/CUDA/cuda-data-transfer.fir b/flang/test/Fir/CUDA/cuda-data-transfer.fir index 718e82ce99725..3209197e118d1 100644 --- a/flang/test/Fir/CUDA/cuda-data-transfer.fir +++ b/flang/test/Fir/CUDA/cuda-data-transfer.fir @@ -385,7 +385,6 @@ func.func @_QPdevice_addr_conv() { // CHECK: fir.embox %[[DEV_ADDR_CONV]](%{{.*}}) : (!fir.ref>, !fir.shape<1>) -> !fir.box> // CHECK: fir.call @_FortranACUFDataTransferDescDescNoRealloc - func.func @_QQchar_transfer() attributes {fir.bindc_name = "char_transfer"} { %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index @@ -447,5 +446,24 @@ func.func @_QPdevmul(%arg0: !fir.ref> {fir.bindc_name = "b"} // CHECK: %[[DST:.*]] = fir.convert %[[ALLOCA0]] : (!fir.ref>>) -> !fir.ref> // CHECK: fir.call @_FortranACUFDataTransferDescDesc(%[[DST]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (!fir.ref>, !fir.ref>, i32, !fir.ref, i32) -> none +func.func @_QPlogical_cst() { + %c0_i64 = arith.constant 0 : i64 + %false = arith.constant false + %c0 = arith.constant 0 : index + %0 = cuf.alloc !fir.box>>> {bindc_name = "id2", data_attr = #cuf.cuda, uniq_name = "_QFlogical_cstEid2"} -> !fir.ref>>>> + %4 = fir.declare %0 {data_attr = #cuf.cuda, fortran_attrs = #fir.var_attrs, uniq_name = "_QFlogical_cstEid2"} : (!fir.ref>>>>) -> !fir.ref>>>> + cuf.data_transfer %false to %4 {transfer_kind = #cuf.cuda_transfer} : i1, !fir.ref>>>> + return +} + +// CHECK-LABEL: func.func @_QPlogical_cst() +// CHECK: %[[DESC:.*]] = fir.alloca !fir.box> +// CHECK: %[[CONST:.*]] = fir.alloca !fir.logical<4> +// CHECK: %[[CONV:.*]] = fir.convert %false : (i1) -> !fir.logical<4> +// CHECK: fir.store %[[CONV]] to %[[CONST]] : !fir.ref> +// CHECK: %[[EMBOX:.*]] = fir.embox %[[CONST]] : (!fir.ref>) -> !fir.box> +// CHECK: fir.store %[[EMBOX]] to %[[DESC]] : !fir.ref>> +// CHECK: %[[BOX_NONE:.*]] = fir.convert %[[DESC]] : (!fir.ref>>) -> !fir.ref> +// CHECK: fir.call @_FortranACUFDataTransferDescDesc(%{{.*}}, %[[BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}) : (!fir.ref>, !fir.ref>, i32, !fir.ref, i32) -> none } // end of module