From 5e20785edc39854751e78dbd102fc9e6fa740fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?= =?UTF-8?q?=E3=83=B3=29?= Date: Tue, 18 Jun 2024 13:09:37 -0700 Subject: [flang][cuda] Relax cuf.data_transfer verifier (#95974) Allow data transfer between array reference and array described by a descriptor. --- flang/lib/Optimizer/Dialect/CUF/CUFOps.cpp | 6 ++++-- flang/test/Lower/CUDA/cuda-data-transfer.cuf | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/flang/lib/Optimizer/Dialect/CUF/CUFOps.cpp b/flang/lib/Optimizer/Dialect/CUF/CUFOps.cpp index 00b706f..4fa1d39 100644 --- a/flang/lib/Optimizer/Dialect/CUF/CUFOps.cpp +++ b/flang/lib/Optimizer/Dialect/CUF/CUFOps.cpp @@ -98,13 +98,15 @@ mlir::LogicalResult cuf::DataTransferOp::verify() { mlir::Type srcTy = getSrc().getType(); mlir::Type dstTy = getDst().getType(); if ((fir::isa_ref_type(srcTy) && fir::isa_ref_type(dstTy)) || - (fir::isa_box_type(srcTy) && fir::isa_box_type(dstTy))) + (fir::isa_box_type(srcTy) && fir::isa_box_type(dstTy)) || + (fir::isa_ref_type(srcTy) && fir::isa_box_type(dstTy)) || + (fir::isa_box_type(srcTy) && fir::isa_ref_type(dstTy))) return mlir::success(); if (fir::isa_trivial(srcTy) && matchPattern(getSrc().getDefiningOp(), mlir::m_Constant())) return mlir::success(); return emitOpError() - << "expect src and dst to be both references or descriptors or src to " + << "expect src and dst to be references or descriptors or src to " "be a constant"; } diff --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf index 42fa4d0..3b407b9 100644 --- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf +++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf @@ -179,3 +179,19 @@ end subroutine ! CHECK: cuf.data_transfer %[[A]]#0 to %[[B]]#0 {transfer_kind = #cuf.cuda_transfer} : !fir.ref>>>, !fir.ref>>> ! CHECK: cuf.data_transfer %[[B]]#0 to %[[A]]#0 {transfer_kind = #cuf.cuda_transfer} : !fir.ref>>>, !fir.ref>>> ! CHECK: cuf.data_transfer %[[A]]#0 to %[[C]]#0 {transfer_kind = #cuf.cuda_transfer} : !fir.ref>>>, !fir.ref>>> + + +subroutine sub8(a, b, n) + integer :: n + integer, device :: a(n) + integer :: b(10) + b = a + a = b +end subroutine + +! CHECK-LABEL: func.func @_QPsub8( +! CHECK-SAME: %[[ARG0:.*]]: !fir.ref> {cuf.data_attr = #cuf.cuda, fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref> {fir.bindc_name = "b"}, %[[ARG2:.*]]: !fir.ref {fir.bindc_name = "n"}) +! CHECK: %[[B:.*]]:2 = hlfir.declare %[[ARG1]](%{{.*}}) dummy_scope %{{.*}} {uniq_name = "_QFsub8Eb"} : (!fir.ref>, !fir.shape<1>, !fir.dscope) -> (!fir.ref>, !fir.ref>) +! CHECK: %[[A:.*]]:2 = hlfir.declare %[[ARG0]](%{{.*}}) dummy_scope %{{.*}} {data_attr = #cuf.cuda, uniq_name = "_QFsub8Ea"} : (!fir.ref>, !fir.shape<1>, !fir.dscope) -> (!fir.box>, !fir.ref>) +! CHECK: cuf.data_transfer %[[A]]#0 to %[[B]]#0 {transfer_kind = #cuf.cuda_transfer} : !fir.box>, !fir.ref> +! CHECK: cuf.data_transfer %[[B]]#0 to %[[A]]#0 {transfer_kind = #cuf.cuda_transfer} : !fir.ref>, !fir.box> -- cgit v1.1