[flang-commits] [flang] edf5305 - [flang][OpenMP] Fix privatization of linear in TARGET (#202443)

via flang-commits flang-commits at lists.llvm.org
Wed Jun 10 06:22:12 PDT 2026


Author: Leandro Lupori
Date: 2026-06-10T10:22:06-03:00
New Revision: edf5305fee7e67f4d6fd5e1228970dba757ebc71

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

LOG: [flang][OpenMP] Fix privatization of linear in TARGET (#202443)

Linear symbols are privatized by OpenMP IRBuilder, except when they are
enclosed within TARGET, in which case their privatization must occur in
DataSharingProcessor.

Fixes #201628

Added: 
    

Modified: 
    flang/lib/Lower/OpenMP/DataSharingProcessor.cpp
    flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp
index 5bf798d36e83a..c97d054e1210b 100644
--- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp
@@ -492,6 +492,17 @@ void DataSharingProcessor::collectPrivatizedSymbols(
   }
 
   auto shouldCollectSymbol = [&](const semantics::Symbol *sym) {
+    // Linear symbols are privatized by OpenMP IRBuilder, except when they are
+    // enclosed within TARGET.
+    mlir::Operation *currentOp =
+        firOpBuilder.getInsertionBlock()->getParentOp();
+    bool inTarget =
+        currentOp && (mlir::isa<mlir::omp::TargetOp>(currentOp) ||
+                      currentOp->getParentOfType<mlir::omp::TargetOp>());
+
+    if (sym->test(semantics::Symbol::Flag::OmpLinear) && !inTarget)
+      return false;
+
     if (collectImplicit) {
       // If we're a combined construct with a target region, implicit
       // firstprivate captures, should only belong to the target region
@@ -533,9 +544,6 @@ void DataSharingProcessor::collectPrivatizedSymbols(
 
   for (const auto *sym : allSymbols) {
     if (semantics::omp::IsPrivatizable(*sym) &&
-        // Linear symbols are privatized by OpenMP IRBuilder. See comments
-        // in collectSymbolsForPrivatization() for more details.
-        !sym->test(semantics::Symbol::Flag::OmpLinear) &&
         !symbolsInNestedRegions.contains(sym) &&
         !explicitlyPrivatizedSymbols.contains(sym) &&
         shouldCollectSymbol(sym) && clauseScopes.contains(&sym->owner())) {

diff  --git a/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 b/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90
index 2543e9470452a..270bb9fe1045b 100644
--- a/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90
+++ b/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90
@@ -150,3 +150,16 @@ subroutine lastprivate_cond_in_composite_construct(x_min, x_max, y_min, y_max)
     enddo
   enddo
 end subroutine
+
+! CHECK-LABEL:   func.func @_QPtarget_teams_distribute_parallel_do_simd_linear
+subroutine target_teams_distribute_parallel_do_simd_linear()
+  implicit none
+  integer :: iv
+
+  ! CHECK: omp.target
+  ! CHECK: %[[IV:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtarget_teams_distribute_parallel_do_simd_linearEiv"}
+  ! CHECK: omp.simd private(@_QFtarget_teams_distribute_parallel_do_simd_linearEiv_private_i32 %[[IV]]#0 -> %{{.*}} : !fir.ref<i32>)
+  !$omp target teams distribute parallel do simd
+  do iv = 1, 10
+  end do
+end subroutine


        


More information about the flang-commits mailing list