[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