Skip to content

[flang][openacc] Allow polymorphic entity in data clauses #141856

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 29, 2025

Conversation

clementval
Copy link
Contributor

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

@llvmbot llvmbot added flang Flang issues not falling into any other category flang:fir-hlfir openacc labels May 28, 2025
@llvmbot
Copy link
Member

llvmbot commented May 28, 2025

@llvm/pr-subscribers-openacc

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

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

Changes
  • 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 --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}>>)

Copy link
Contributor

@razvanlupusoru razvanlupusoru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! :)

@clementval clementval merged commit 7b074fc into llvm:main May 29, 2025
15 checks passed
@clementval clementval deleted the acc_derived branch May 29, 2025 01:20
svkeerthy pushed a commit that referenced this pull request May 29, 2025
- Attach the mappable interface to ClassType
- Remove the TODO since derived type in descriptor can be handled as
other descriptors
google-yfyang pushed a commit to google-yfyang/llvm-project that referenced this pull request May 29, 2025
- Attach the mappable interface to ClassType
- Remove the TODO since derived type in descriptor can be handled as
other descriptors
sivan-shani pushed a commit to sivan-shani/llvm-project that referenced this pull request Jun 3, 2025
- Attach the mappable interface to ClassType
- Remove the TODO since derived type in descriptor can be handled as
other descriptors
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
flang:fir-hlfir flang Flang issues not falling into any other category openacc
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants