12#ifndef FORTRAN_LOWER_DATASHARINGPROCESSOR_H
13#define FORTRAN_LOWER_DATASHARINGPROCESSOR_H
16#include "flang/Lower/AbstractConverter.h"
17#include "flang/Lower/OpenMP.h"
18#include "flang/Optimizer/Builder/FIRBuilder.h"
19#include "flang/Parser/parse-tree.h"
20#include "flang/Semantics/symbol.h"
21#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
25struct PrivateClauseOps;
38 struct OMPConstructSymbolVisitor {
44 void Post(
const T &) {}
48 if (!std::holds_alternative<parser::OpenMPCriticalConstruct>(omp.u))
49 currentConstruct = &omp;
54 currentConstruct =
nullptr;
58 symDefMap.try_emplace(name.symbol, currentConstruct);
62 llvm::DenseMap<semantics::Symbol *, const parser::OpenMPConstruct *>
71 mlir::OpBuilder::InsertPoint lastPrivIP;
74 llvm::SetVector<const semantics::Symbol *> explicitlyPrivatizedSymbols;
75 llvm::SetVector<const semantics::Symbol *> defaultSymbols;
76 llvm::SetVector<const semantics::Symbol *> implicitSymbols;
77 llvm::SetVector<const semantics::Symbol *> preDeterminedSymbols;
78 llvm::SetVector<const semantics::Symbol *> allPrivatizedSymbols;
80 llvm::DenseMap<const semantics::Symbol *, mlir::omp::PrivateClauseOp>
85 omp::List<omp::Clause> clauses;
87 bool shouldCollectPreDeterminedSymbols;
88 bool useDelayedPrivatization;
89 bool callsInitClone =
false;
91 OMPConstructSymbolVisitor visitor;
94 void collectSymbols(semantics::Symbol::Flag flag,
95 llvm::SetVector<const semantics::Symbol *> &symbols);
96 void collectSymbolsInNestedRegions(
98 llvm::SetVector<const semantics::Symbol *> &symbolsInNestedRegions);
99 void collectOmpObjectListSymbol(
100 const omp::ObjectList &objects,
101 llvm::SetVector<const semantics::Symbol *> &symbolSet);
102 void collectSymbolsForPrivatization();
103 void insertBarrier();
104 void collectDefaultSymbols();
105 void collectImplicitSymbols();
106 void collectPreDeterminedSymbols();
107 void privatize(mlir::omp::PrivateClauseOps *clauseOps);
109 mlir::omp::PrivateClauseOps *clauseOps);
110 void copyLastPrivatize(mlir::Operation *op);
111 void insertLastPrivateCompare(mlir::Operation *op);
115 mlir::OpBuilder::InsertPoint *copyAssignIP =
nullptr);
117 mlir::OpBuilder::InsertPoint *lastPrivIP);
118 void insertDeallocs();
123 const List<Clause> &clauses,
125 bool shouldCollectPreDeterminedSymbols,
139 void processStep1(mlir::omp::PrivateClauseOps *clauseOps =
nullptr);
140 void processStep2(mlir::Operation *op,
bool isLoop);
142 void pushLoopIV(mlir::Value iv) { loopIVs.push_back(iv); }
144 const llvm::SetVector<const semantics::Symbol *> &
145 getAllSymbolsToPrivatize()
const {
146 return allPrivatizedSymbols;
150 return useDelayedPrivatization
151 ? allPrivatizedSymbols.getArrayRef()
Definition: AbstractConverter.h:82
Definition: SymbolMap.h:146
Definition: DataSharingProcessor.h:33
Definition: semantics.h:67
Definition: FIRBuilder.h:55
Definition: bit-population-count.h:20
Definition: AbstractConverter.h:27
Definition: PFTBuilder.h:216
Definition: parse-tree.h:580
Definition: parse-tree.h:4756