[llvm-branch-commits] [flang] 7ef9330 - Revert "[Flang][OpenMP] Clear close on descriptor members for box parents in …"

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Apr 28 01:07:03 PDT 2026


Author: Jan Patrick Lehr
Date: 2026-04-28T10:06:59+02:00
New Revision: 7ef933090f4dfe8b951e086028b5e842c97fc429

URL: https://github.com/llvm/llvm-project/commit/7ef933090f4dfe8b951e086028b5e842c97fc429
DIFF: https://github.com/llvm/llvm-project/commit/7ef933090f4dfe8b951e086028b5e842c97fc429.diff

LOG: Revert "[Flang][OpenMP] Clear close on descriptor members for box parents in …"

This reverts commit 1cb85dd46074e4e081995407cae973eee4a1aa38.

Added: 
    

Modified: 
    flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
    flang/test/Transforms/omp-map-info-finalization-usm.fir

Removed: 
    offload/test/offloading/fortran/usm-box-parent-descriptor-close.f90


################################################################################
diff  --git a/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp b/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
index 741d3174c29ee..bc0f96478ddf4 100644
--- a/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
+++ b/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
@@ -1186,15 +1186,21 @@ class MapInfoFinalizationPass
       });
 
       func->walk([&](mlir::omp::MapInfoOp op) {
-        // If a parent map is not mapped with the `close` modifier while some of
-        // its members are (e.g. implicit descriptor maps from
-        // getDescriptorMapType in USM), those members must not keep `close` —
-        // otherwise the runtime can treat unified and device placement
-        // inconsistently.
+        // If a record type is not mapped with the `close` modifier while some
+        // of its members are (e.g. descriptor maps), then in USM mode, the
+        // memory for the record will be allocated in unified memory while the
+        // the members might be allocated in device memory. This creates an
+        // inconsistent map for the record type where some of its members are
+        // allocated in 
diff erent address spaces.
+        //
+        // This fixes this issue by taking a conservative approach and removing
+        // the `close` flag from members if it is not used for mapping the
+        // parent record.
         if (op.getMembers().empty())
           return;
 
-        if (!moduleRequiresUSM(op->getParentOfType<mlir::ModuleOp>()))
+        mlir::Type varTy = fir::unwrapRefType(op.getVarPtr().getType());
+        if (!mlir::isa<fir::RecordType>(varTy))
           return;
 
         auto mapFlag = op.getMapType();

diff  --git a/flang/test/Transforms/omp-map-info-finalization-usm.fir b/flang/test/Transforms/omp-map-info-finalization-usm.fir
index 24f08474ed1d5..5f5a0d7213719 100644
--- a/flang/test/Transforms/omp-map-info-finalization-usm.fir
+++ b/flang/test/Transforms/omp-map-info-finalization-usm.fir
@@ -1,24 +1,24 @@
 // RUN: fir-opt --split-input-file --omp-map-info-finalization %s | FileCheck %s
 
 // Test that the 'close' map flag is cleared from member maps if the parent map
-// does not have the 'close' flag. This typically happens in USM mode.
-// In this test, the parent is a fir.array of derived type.
-module attributes {omp.requires = #omp<clause_requires unified_shared_memory>} {
-  func.func @test_usm_close_flag_cleanup_array(%arg0: !fir.ref<!fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>) {
-    // The implicit descriptor map for the member, with 'close'
-    %member = omp.map.info var_ptr(%arg0 : !fir.ref<!fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>, !fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) map_clauses(always, close, descriptor, to) capture(ByRef) -> !fir.ref<!fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>> {name = "parent.a.implicit_map"}
+// (derived type) does not have the 'close' flag. This typically happens in
+// Unified Shared Memory (USM) mode where the parent is in USM (no close) but
+// members (like descriptors) might have been initially tagged with close.
 
-    // The parent map, which is a fir.array, without 'close'
-    %map = omp.map.info var_ptr(%arg0 : !fir.ref<!fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>, !fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) map_clauses(to) capture(ByRef) members(%member : [0] : !fir.ref<!fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>) -> !fir.ref<!fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>> {name = "parent"}
+module attributes {omp.requires = #omp<clause_requires unified_shared_memory>} {
+  func.func @test_usm_close_flag_cleanup(%arg0: !fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) {
+    %map = omp.map.info var_ptr(%arg0 : !fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>) map_clauses(to) capture(ByRef) -> !fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>> {name = "parent"}
 
-    omp.target map_entries(%map -> %arg1 : !fir.ref<!fir.array<10x!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>) {
+    omp.target map_entries(%map -> %arg1 : !fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) {
+      // Simulate usage to trigger implicit map addition
+      %1 = hlfir.designate %arg1{"a"} : (!fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
       omp.terminator
     }
     return
   }
 }
 
-// CHECK-LABEL: func.func @test_usm_close_flag_cleanup_array
-// CHECK: %[[MEMBER:.*]] = omp.map.info {{.*}} map_clauses(always, to) {{.*}} {name = "parent{{.*}}implicit_map"}
-// CHECK: %[[PARENT:.*]] = omp.map.info {{.*}} map_clauses(to) {{.*}} members(%[[MEMBER]]{{.*}}) {{.*}} {name = "parent"}
+// CHECK-LABEL: func.func @test_usm_close_flag_cleanup
+// CHECK: %[[MEMBER:.*]] = omp.map.info {{.*}} map_clauses(always, to) {{.*}} {name = "parent.a.implicit_map"}
+// CHECK: %[[PARENT:.*]] = omp.map.info {{.*}} map_clauses(to) {{.*}} members(%[[MEMBER]], {{.*}}) {{.*}} {name = "parent", {{.*}}}
 // CHECK-NOT: close

diff  --git a/offload/test/offloading/fortran/usm-box-parent-descriptor-close.f90 b/offload/test/offloading/fortran/usm-box-parent-descriptor-close.f90
deleted file mode 100644
index 6bacc1b4a761b..0000000000000
--- a/offload/test/offloading/fortran/usm-box-parent-descriptor-close.f90
+++ /dev/null
@@ -1,49 +0,0 @@
-! Test for PR fixing close flag on descriptor members for box parents in USM
-! REQUIRES: flang, amdgpu
-! RUN: %libomptarget-compile-fortran-generic -fopenmp-force-usm
-! RUN: env LIBOMPTARGET_INFO=16 HSA_XNACK=1 %libomptarget-run-generic 2>&1 | %fcheck-generic
-
-module m
-    implicit none
-    integer :: ng
-    type :: gt
-        integer :: k
-    end type
-    type(gt), allocatable :: g(:)
-    !$omp declare target(ng, g)
-    type :: f
-        real, allocatable :: a(:)
-    end type
-end module m
-
-program r
-    use m
-    implicit none
-    integer :: i
-    type(f), target :: u(2)
-    integer :: ig
-    real, contiguous, pointer :: p(:)
-
-    ng = 1
-    allocate(g(1))
-    g(1)%k = 1
-
-    do i = 1, 2
-        allocate(u(i)%a(1), source=0.0)
-    end do
-    u(1)%a(1) = 1.0
-    u(2)%a(1) = -1.0
-
-    !$omp target enter data map(to: g, ng, u(1)%a, u(2)%a)
-
-    !$omp target teams distribute private(ig, p)
-    do ig = 1, ng
-        p(1:1) => u(2)%a(1:1)
-        p(1) = 3.14
-    end do
-    !$omp end target teams distribute
-
-    ! CHECK: PluginInterface device {{[0-9]+}} info: Launching kernel
-    ! CHECK: Result: 3.14
-    print *, "Result: ", u(2)%a(1)
-end program r


        


More information about the llvm-branch-commits mailing list