diff options
author | Kareem Ergawy <kareem.ergawy@amd.com> | 2024-02-28 10:15:57 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-28 10:15:57 +0100 |
commit | 26b8be201e2d15867bb327a8008fffb3e34d42a5 (patch) | |
tree | cd156a8383a3a8165dd5324a48d040a0527753b0 /flang/lib/Lower/Bridge.cpp | |
parent | 1d61709f7718d2dc2aee1c27d02043a748e8e6d7 (diff) | |
download | llvm-26b8be201e2d15867bb327a8008fffb3e34d42a5.zip llvm-26b8be201e2d15867bb327a8008fffb3e34d42a5.tar.gz llvm-26b8be201e2d15867bb327a8008fffb3e34d42a5.tar.bz2 |
[flang][OpenMP][MLIR] Basic support for delayed privatization code-gen (#81833)
Adds basic support for emitting delayed privatizers from flang. So far,
only types of symbols are supported (i.e. scalars), support for more
complicated types will be added later. This also makes sure that
reduction and delayed privatization work properly together by merging
the
body-gen callbacks for both in case both clauses are present on the
parallel construct.
Diffstat (limited to 'flang/lib/Lower/Bridge.cpp')
-rw-r--r-- | flang/lib/Lower/Bridge.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index f865b53..0691753 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -1000,6 +1000,17 @@ private: if (sym.detailsIf<Fortran::semantics::CommonBlockDetails>()) return symMap->lookupSymbol(sym); + // For symbols to be privatized in OMP, the symbol is mapped to an + // instance of `SymbolBox::Intrinsic` (i.e. a direct mapping to an MLIR + // SSA value). This MLIR SSA value is the block argument to the + // `omp.private`'s `alloc` block. If this is the case, we return this + // `SymbolBox::Intrinsic` value. + if (Fortran::lower::SymbolBox v = symMap->lookupSymbol(sym)) + return v.match( + [&](const Fortran::lower::SymbolBox::Intrinsic &) + -> Fortran::lower::SymbolBox { return v; }, + [](const auto &) -> Fortran::lower::SymbolBox { return {}; }); + return {}; } if (Fortran::lower::SymbolBox v = symMap->lookupSymbol(sym)) @@ -1018,7 +1029,7 @@ private: /// Find the symbol in one level up of symbol map such as for host-association /// in OpenMP code or return null. Fortran::lower::SymbolBox - lookupOneLevelUpSymbol(const Fortran::semantics::Symbol &sym) { + lookupOneLevelUpSymbol(const Fortran::semantics::Symbol &sym) override { if (Fortran::lower::SymbolBox v = localSymbols.lookupOneLevelUpSymbol(sym)) return v; return {}; |