Skip to content

Commit 5e20785

Browse files
authored
[flang][cuda] Relax cuf.data_transfer verifier (#95974)
Allow data transfer between array reference and array described by a descriptor.
1 parent 887bd73 commit 5e20785

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

flang/lib/Optimizer/Dialect/CUF/CUFOps.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,15 @@ mlir::LogicalResult cuf::DataTransferOp::verify() {
9898
mlir::Type srcTy = getSrc().getType();
9999
mlir::Type dstTy = getDst().getType();
100100
if ((fir::isa_ref_type(srcTy) && fir::isa_ref_type(dstTy)) ||
101-
(fir::isa_box_type(srcTy) && fir::isa_box_type(dstTy)))
101+
(fir::isa_box_type(srcTy) && fir::isa_box_type(dstTy)) ||
102+
(fir::isa_ref_type(srcTy) && fir::isa_box_type(dstTy)) ||
103+
(fir::isa_box_type(srcTy) && fir::isa_ref_type(dstTy)))
102104
return mlir::success();
103105
if (fir::isa_trivial(srcTy) &&
104106
matchPattern(getSrc().getDefiningOp(), mlir::m_Constant()))
105107
return mlir::success();
106108
return emitOpError()
107-
<< "expect src and dst to be both references or descriptors or src to "
109+
<< "expect src and dst to be references or descriptors or src to "
108110
"be a constant";
109111
}
110112

flang/test/Lower/CUDA/cuda-data-transfer.cuf

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,19 @@ end subroutine
179179
! CHECK: cuf.data_transfer %[[A]]#0 to %[[B]]#0 {transfer_kind = #cuf.cuda_transfer<device_host>} : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
180180
! CHECK: cuf.data_transfer %[[B]]#0 to %[[A]]#0 {transfer_kind = #cuf.cuda_transfer<host_device>} : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
181181
! CHECK: cuf.data_transfer %[[A]]#0 to %[[C]]#0 {transfer_kind = #cuf.cuda_transfer<device_device>} : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
182+
183+
184+
subroutine sub8(a, b, n)
185+
integer :: n
186+
integer, device :: a(n)
187+
integer :: b(10)
188+
b = a
189+
a = b
190+
end subroutine
191+
192+
! CHECK-LABEL: func.func @_QPsub8(
193+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<?xi32>> {cuf.data_attr = #cuf.cuda<device>, fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<10xi32>> {fir.bindc_name = "b"}, %[[ARG2:.*]]: !fir.ref<i32> {fir.bindc_name = "n"})
194+
! CHECK: %[[B:.*]]:2 = hlfir.declare %[[ARG1]](%{{.*}}) dummy_scope %{{.*}} {uniq_name = "_QFsub8Eb"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)
195+
! CHECK: %[[A:.*]]:2 = hlfir.declare %[[ARG0]](%{{.*}}) dummy_scope %{{.*}} {data_attr = #cuf.cuda<device>, uniq_name = "_QFsub8Ea"} : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.ref<!fir.array<?xi32>>)
196+
! CHECK: cuf.data_transfer %[[A]]#0 to %[[B]]#0 {transfer_kind = #cuf.cuda_transfer<device_host>} : !fir.box<!fir.array<?xi32>>, !fir.ref<!fir.array<10xi32>>
197+
! CHECK: cuf.data_transfer %[[B]]#0 to %[[A]]#0 {transfer_kind = #cuf.cuda_transfer<host_device>} : !fir.ref<!fir.array<10xi32>>, !fir.box<!fir.array<?xi32>>

0 commit comments

Comments
 (0)