From a0519636b437ca5b8eaff74a39a1179f6814a468 Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Tue, 25 Nov 2025 11:01:48 -0800 Subject: [PATCH] [flang][cuda] Add support to allocate scalar character types --- .../Optimizer/Transforms/CUFOpConversion.cpp | 5 +++++ flang/test/Fir/CUDA/cuda-alloc-free.fir | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/flang/lib/Optimizer/Transforms/CUFOpConversion.cpp b/flang/lib/Optimizer/Transforms/CUFOpConversion.cpp index caf9b7b8b38f2..7ed34f865d0e9 100644 --- a/flang/lib/Optimizer/Transforms/CUFOpConversion.cpp +++ b/flang/lib/Optimizer/Transforms/CUFOpConversion.cpp @@ -331,6 +331,11 @@ struct CUFAllocOpConversion : public mlir::OpRewritePattern { std::size_t structSize = dl->getTypeSizeInBits(structTy) / 8; bytes = builder.createIntegerConstant(loc, builder.getIndexType(), structSize); + } else if (fir::isa_char(op.getInType())) { + mlir::Type charTy = typeConverter->convertType(op.getInType()); + std::size_t charSize = dl->getTypeSizeInBits(charTy) / 8; + bytes = builder.createIntegerConstant(loc, builder.getIndexType(), + charSize); } else { mlir::emitError(loc, "unsupported type in cuf.alloc\n"); } diff --git a/flang/test/Fir/CUDA/cuda-alloc-free.fir b/flang/test/Fir/CUDA/cuda-alloc-free.fir index 31f2ed022b6c4..85313d78cc022 100644 --- a/flang/test/Fir/CUDA/cuda-alloc-free.fir +++ b/flang/test/Fir/CUDA/cuda-alloc-free.fir @@ -94,4 +94,24 @@ func.func @_QQalloc_char() attributes {fir.bindc_name = "alloc_char"} { // CHECK: %[[BYTES_CONV:.*]] = fir.convert %[[BYTES]] : (index) -> i64 // CHECK: fir.call @_FortranACUFMemAlloc(%[[BYTES_CONV]], %c0{{.*}}, %{{.*}}, %{{.*}}) {cuf.data_attr = #cuf.cuda} : (i64, i32, !fir.ref, i32) -> !fir.llvm_ptr + +func.func @_QQalloc_char2() { + %c4 = arith.constant 4 : index + %1 = cuf.alloc !fir.char<1,4>(%c4 : index) {bindc_name = "b", data_attr = #cuf.cuda, uniq_name = "_QFsub1Eb"} -> !fir.ref> + %2 = cuf.alloc !fir.char<2,4>(%c4 : index) {bindc_name = "c", data_attr = #cuf.cuda, uniq_name = "_QFsub1Ec"} -> !fir.ref> + %c10 = arith.constant 4 : index + %3 = cuf.alloc !fir.char<4,10>(%c10 : index) {bindc_name = "d", data_attr = #cuf.cuda, uniq_name = "_QFsub1Ed"} -> !fir.ref> + return +} + +// CHECK-LABEL: func.func @_QQalloc_char2() +// CHECK: %[[BYTES_4:.*]] = fir.convert %c4{{.*}} : (index) -> i64 +// CHECK: %{{.*}} = fir.call @_FortranACUFMemAlloc(%[[BYTES_4]], %{{.*}}, %{{.*}}, %{{.*}}) {cuf.data_attr = #cuf.cuda} : (i64, i32, !fir.ref, i32) -> !fir.llvm_ptr + +// CHECK: %[[BYTES_8:.*]] = fir.convert %c8{{.*}} : (index) -> i64 +// CHECK: %{{.*}} = fir.call @_FortranACUFMemAlloc(%[[BYTES_8]], %{{.*}}, %{{.*}}, %{{.*}}) {cuf.data_attr = #cuf.cuda} : (i64, i32, !fir.ref, i32) -> !fir.llvm_ptr + +// CHECK: %[[BYTES_40:.*]] = fir.convert %c40{{.*}} : (index) -> i64 +// CHECK: %{{.*}} = fir.call @_FortranACUFMemAlloc(%[[BYTES_40]], %{{.*}}, %{{.*}}, %{{.*}}) {cuf.data_attr = #cuf.cuda} : (i64, i32, !fir.ref, i32) -> !fir.llvm_ptr + } // end module