34class DataSharingProcessor {
39 struct OMPConstructSymbolVisitor {
41 : version(ctx.langOptions().OpenMPVersion) {}
47 void Post(
const T &) {}
51 if (isOpenMPPrivatizingConstruct(omp, version))
52 constructs.push_back(&omp);
57 if (isOpenMPPrivatizingConstruct(omp, version))
58 constructs.pop_back();
62 auto current = !constructs.empty() ? constructs.back() : ConstructPtr();
63 symDefMap.try_emplace(name.symbol, current);
67 constructs.push_back(&decl);
72 constructs.pop_back();
89 llvm::DenseMap<semantics::Symbol *, ConstructPtr> symDefMap;
94 mlir::OpBuilder::InsertPoint lastPrivIP;
97 llvm::SetVector<const semantics::Symbol *> explicitlyPrivatizedSymbols;
98 llvm::SetVector<const semantics::Symbol *> defaultSymbols;
99 llvm::SetVector<const semantics::Symbol *> allPrivatizedSymbols;
104 omp::List<omp::Clause> clauses;
106 bool shouldCollectPreDeterminedSymbols;
107 bool useDelayedPrivatization;
108 llvm::SmallPtrSet<const semantics::Symbol *, 16> mightHaveReadHostSym;
110 bool isTargetPrivatization;
111 OMPConstructSymbolVisitor visitor;
114 void collectPrivatizedSymbols(
115 std::optional<semantics::Symbol::Flag> flag,
116 const llvm::SetVector<const semantics::Symbol *> &allSymbols,
117 const llvm::SetVector<const semantics::Symbol *> &symbolsInNestedRegions,
118 llvm::SetVector<const semantics::Symbol *> *symbols =
nullptr);
120 collectSymbols(semantics::Symbol::Flag flag,
121 llvm::SetVector<const semantics::Symbol *> *symbols =
nullptr);
122 void collectSymbolsInNestedRegions(
124 llvm::SetVector<const semantics::Symbol *> &symbolsInNestedRegions);
125 void collectOmpObjectListSymbol(
126 const omp::ObjectList &objects,
127 llvm::SetVector<const semantics::Symbol *> &symbolSet);
128 void collectSymbolsForPrivatization();
129 void insertBarrier(mlir::omp::PrivateClauseOps *clauseOps);
130 void collectDefaultSymbols();
131 void collectImplicitSymbols();
132 void collectPreDeterminedSymbols();
133 void collectIndirectReferences();
134 void privatize(mlir::omp::PrivateClauseOps *clauseOps,
135 std::optional<llvm::omp::Directive> dir = std::nullopt);
136 void copyLastPrivatize(mlir::Operation *op);
137 void insertLastPrivateCompare(mlir::Operation *op);
141 mlir::OpBuilder::InsertPoint *copyAssignIP =
nullptr);
143 mlir::OpBuilder::InsertPoint *lastPrivIP);
144 void insertDeallocs();
153 const List<Clause> &clauses,
155 bool shouldCollectPreDeterminedSymbols,
157 bool isTargetPrivatization =
false);
163 bool isTargetPrivatization =
false);
176 void processStep1(mlir::omp::PrivateClauseOps *clauseOps =
nullptr,
177 std::optional<llvm::omp::Directive> dir = std::nullopt);
178 void processStep2(mlir::Operation *op,
bool isLoop);
180 void pushLoopIV(mlir::Value iv) { loopIVs.push_back(iv); }
182 const llvm::SetVector<const semantics::Symbol *> &
183 getAllSymbolsToPrivatize()
const {
184 return allPrivatizedSymbols;
188 return useDelayedPrivatization
189 ? allPrivatizedSymbols.getArrayRef()
194 mlir::omp::PrivateClauseOps *clauseOps,
195 std::optional<llvm::omp::Directive> dir = std::nullopt);