[flang-commits] [flang] [flang][openacc] Allow polymorphic entity in data clauses (PR #141856)

via flang-commits flang-commits at lists.llvm.org
Wed May 28 14:05:40 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-fir-hlfir

Author: Valentin Clement (バレンタイン クレメン) (clementval)

<details>
<summary>Changes</summary>

- Attach the mappable interface to ClassType
- Remove the TODO since derived type in descriptor can be handled as other descriptors 

---
Full diff: https://github.com/llvm/llvm-project/pull/141856.diff


3 Files Affected:

- (modified) flang/include/flang/Optimizer/Builder/DirectivesCommon.h (-3) 
- (modified) flang/lib/Optimizer/OpenACC/RegisterOpenACCExtensions.cpp (+2) 
- (modified) flang/test/Lower/OpenACC/acc-enter-data.f90 (+20) 


``````````diff
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 &registry) {
     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}>>)

``````````

</details>


https://github.com/llvm/llvm-project/pull/141856


More information about the flang-commits mailing list