[flang-commits] [flang] [flang][OpenMP] Do not skip privatization of linear variable if it is OmpPreDetermined (PR #144315)
via flang-commits
flang-commits at lists.llvm.org
Mon Jun 16 01:25:28 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: None (NimishMishra)
<details>
<summary>Changes</summary>
Current implementation of linear clause skips privatisation of all linear variables during the FIR generation phase, since linear variables are handled in their entirety by the OpenMP IRBuilder. However, "implicit" linear variables (like OmpPreDetermined) cannot be skipped, since FIR generation requires privatized symbols. This patch adds checks to skip the same.
Fixes https://github.com/llvm/llvm-project/issues/142935
---
Full diff: https://github.com/llvm/llvm-project/pull/144315.diff
1 Files Affected:
- (modified) flang/lib/Lower/OpenMP/DataSharingProcessor.cpp (+38-2)
``````````diff
diff --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp
index 8b334d7a392ac..1c50ba30ba40b 100644
--- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp
@@ -204,6 +204,42 @@ void DataSharingProcessor::collectOmpObjectListSymbol(
}
void DataSharingProcessor::collectSymbolsForPrivatization() {
+ // Add checks here for exceptional cases where privatization is not
+ // needed and be deferred to a later phase (like OpenMP IRBuilder).
+ // Such cases are suggested to be clearly documented and explained
+ // instead of being silently skipped
+ auto isException = [&](const Fortran::semantics::Symbol *sym) -> bool {
+ // `OmpPreDetermined` symbols cannot be exceptions since
+ // their privatized symbols are heavily used in FIR.
+ if (sym->test(Fortran::semantics::Symbol::Flag::OmpPreDetermined))
+ return false;
+
+ // The handling of linear clause is deferred to the OpenMP
+ // IRBuilder which is responsible for all it's aspects,
+ // including privatization. Privatizing linear variables at this point would
+ // cause the following structure:
+ //
+ // omp.op linear(%linear = %step : !fir.ref<type>) {
+ // Use %linear in this BB
+ // }
+ //
+ // to be changed to the following:
+ //
+ // omp. op linear(%linear = %step : !fir.ref<type>)
+ // private(%linear -> %arg0 : !fir.ref<i32>) {
+ // Declare and use %arg0 in this BB
+ // }
+ //
+ // The OpenMP IRBuilder needs to map the linear MLIR value
+ // (i.e. %linear) to its `uses` in the BB to correctly
+ // implement the functionalities of linear clause. However,
+ // privatizing here disallows the IRBuilder to
+ // draw a relation between %linear and %arg0. Hence skip.
+ if (sym->test(Fortran::semantics::Symbol::Flag::OmpLinear))
+ return true;
+ return false;
+ };
+
for (const omp::Clause &clause : clauses) {
if (const auto &privateClause =
std::get_if<omp::clause::Private>(&clause.u)) {
@@ -222,10 +258,10 @@ void DataSharingProcessor::collectSymbolsForPrivatization() {
}
// TODO For common blocks, add the underlying objects within the block. Doing
- // so, we won't need to explicitely handle block objects (or forget to do
+ // so, we won't need to explicitly handle block objects (or forget to do
// so).
for (auto *sym : explicitlyPrivatizedSymbols)
- if (!sym->test(Fortran::semantics::Symbol::Flag::OmpLinear))
+ if (!isException(sym))
allPrivatizedSymbols.insert(sym);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/144315
More information about the flang-commits
mailing list