[flang-commits] [flang] [flang][openacc] Allow polymorphic entity in data clauses (PR #141856)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Wed May 28 14:05:06 PDT 2025
https://github.com/clementval created https://github.com/llvm/llvm-project/pull/141856
- Attach the mappable interface to ClassType
- Remove the TODO since derived type in descriptor can be handled as other descriptors
>From f9fa71463a07263d992298479af46a5bf9329473 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Wed, 28 May 2025 14:02:38 -0700
Subject: [PATCH] [flang][openacc] Allow polymorphic entity in data clauses
---
.../Optimizer/Builder/DirectivesCommon.h | 3 ---
.../OpenACC/RegisterOpenACCExtensions.cpp | 2 ++
flang/test/Lower/OpenACC/acc-enter-data.f90 | 20 +++++++++++++++++++
3 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/flang/include/flang/Optimizer/Builder/DirectivesCommon.h b/flang/include/flang/Optimizer/Builder/DirectivesCommon.h
index 3f30c761acb4e..f71a2ccd07bfd 100644
--- a/flang/include/flang/Optimizer/Builder/DirectivesCommon.h
+++ b/flang/include/flang/Optimizer/Builder/DirectivesCommon.h
@@ -75,9 +75,6 @@ inline AddrAndBoundsInfo getDataOperandBaseAddr(fir::FirOpBuilder &builder,
if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(
fir::unwrapRefType(symAddr.getType()))) {
- if (mlir::isa<fir::RecordType>(boxTy.getEleTy()))
- TODO(loc, "derived type");
-
// In case of a box reference, load it here to get the box value.
// This is preferrable because then the same box value can then be used for
// all address/dimension retrievals. For Fortran optional though, leave
diff --git a/flang/lib/Optimizer/OpenACC/RegisterOpenACCExtensions.cpp b/flang/lib/Optimizer/OpenACC/RegisterOpenACCExtensions.cpp
index 16115c7cb6e59..5f174ad4b40fe 100644
--- a/flang/lib/Optimizer/OpenACC/RegisterOpenACCExtensions.cpp
+++ b/flang/lib/Optimizer/OpenACC/RegisterOpenACCExtensions.cpp
@@ -22,6 +22,8 @@ void registerOpenACCExtensions(mlir::DialectRegistry ®istry) {
fir::SequenceType::attachInterface<OpenACCMappableModel<fir::SequenceType>>(
*ctx);
fir::BoxType::attachInterface<OpenACCMappableModel<fir::BaseBoxType>>(*ctx);
+ fir::ClassType::attachInterface<OpenACCMappableModel<fir::BaseBoxType>>(
+ *ctx);
fir::ReferenceType::attachInterface<
OpenACCPointerLikeModel<fir::ReferenceType>>(*ctx);
diff --git a/flang/test/Lower/OpenACC/acc-enter-data.f90 b/flang/test/Lower/OpenACC/acc-enter-data.f90
index f7396660a6d3c..2718c96a563fb 100644
--- a/flang/test/Lower/OpenACC/acc-enter-data.f90
+++ b/flang/test/Lower/OpenACC/acc-enter-data.f90
@@ -2,6 +2,14 @@
! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
+module mod1
+ implicit none
+ type :: derived
+ real :: m
+ contains
+ end type derived
+end module mod1
+
subroutine acc_enter_data
integer :: async = 1
real, dimension(10, 10) :: a, b, c
@@ -651,3 +659,15 @@ subroutine acc_enter_data_single_array_element()
!CHECK: acc.enter_data dataOperands(%[[CREATE]] : !fir.heap<!fir.array<?x?xf32>>)
end subroutine
+
+subroutine test_class(a)
+ use mod1
+ class(derived) :: a
+ !$acc enter data copyin(a)
+end subroutine
+
+! CHECK-LABEL: func.func @_QPtest_class(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.class<!fir.type<_QMmod1Tderived{m:f32}>> {fir.bindc_name = "a"}) {
+! CHECK: %[[DECL_ARG0:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %0 {uniq_name = "_QFtest_classEa"} : (!fir.class<!fir.type<_QMmod1Tderived{m:f32}>>, !fir.dscope) -> (!fir.class<!fir.type<_QMmod1Tderived{m:f32}>>, !fir.class<!fir.type<_QMmod1Tderived{m:f32}>>)
+! CHECK: %[[COPYIN:.*]] = acc.copyin var(%[[DECL_ARG0]]#0 : !fir.class<!fir.type<_QMmod1Tderived{m:f32}>>) -> !fir.class<!fir.type<_QMmod1Tderived{m:f32}>> {name = "a", structured = false}
+! CHECK: acc.enter_data dataOperands(%[[COPYIN]] : !fir.class<!fir.type<_QMmod1Tderived{m:f32}>>)
More information about the flang-commits
mailing list