34class DataSharingProcessor {
39 struct OMPConstructSymbolVisitor {
40 OMPConstructSymbolVisitor(
43 : metadirectiveLoopIVs(metadirectiveLoopIVs.begin(),
44 metadirectiveLoopIVs.end()),
45 isMetadirectiveLoop(!metadirectiveLoopIVs.empty()),
46 version(ctx.langOptions().getOpenMPVersion()) {}
52 void Post(
const T &) {}
54 bool Pre(
const parser::LoopControl::Bounds &bounds) {
55 if (isMetadirectiveLoop)
57 metadirectiveLoopIVs.insert(symbol);
63 if (isOpenMPPrivatizingConstruct(omp, version))
64 constructs.push_back(&omp);
69 if (isOpenMPPrivatizingConstruct(omp, version))
70 constructs.pop_back();
74 auto current = !constructs.empty() ? constructs.back() : ConstructPtr();
75 symDefMap.try_emplace(name.symbol, current);
79 constructs.push_back(&decl);
84 constructs.pop_back();
101 llvm::DenseMap<semantics::Symbol *, ConstructPtr> symDefMap;
102 llvm::SmallPtrSet<const semantics::Symbol *, 4> metadirectiveLoopIVs;
103 bool isMetadirectiveLoop;
105 llvm::omp::Version version;
108 mlir::OpBuilder::InsertPoint lastPrivIP;
111 llvm::SetVector<const semantics::Symbol *> explicitlyPrivatizedSymbols;
112 llvm::SetVector<const semantics::Symbol *> defaultSymbols;
113 llvm::SetVector<const semantics::Symbol *> allPrivatizedSymbols;
114 llvm::SetVector<const semantics::Symbol *> conditionalLastPrivatizedSymbols;
121 bool conditionalLpUsesPrivateCopy =
false;
126 omp::List<omp::Clause> clauses;
128 bool shouldCollectPreDeterminedSymbols;
129 bool useDelayedPrivatization;
130 bool forceHeapAllocationForPrivateDynamicArrays =
false;
131 llvm::SmallPtrSet<const semantics::Symbol *, 16> mightHaveReadHostSym;
133 bool isTargetPrivatization;
134 bool isMetadirectiveLoop;
135 OMPConstructSymbolVisitor visitor;
138 void collectPrivatizedSymbols(
139 std::optional<semantics::Symbol::Flag> flag,
140 const llvm::SetVector<const semantics::Symbol *> &allSymbols,
141 const llvm::SetVector<const semantics::Symbol *> &symbolsInNestedRegions,
142 llvm::SetVector<const semantics::Symbol *> *symbols =
nullptr);
144 collectSymbols(semantics::Symbol::Flag flag,
145 llvm::SetVector<const semantics::Symbol *> *symbols =
nullptr);
146 void collectSymbolsInNestedRegions(
148 llvm::SetVector<const semantics::Symbol *> &symbolsInNestedRegions);
149 void collectOmpObjectListSymbol(
150 const omp::ObjectList &objects,
151 llvm::SetVector<const semantics::Symbol *> &symbolSet);
152 void collectSymbolsForPrivatization();
153 void insertBarrier(mlir::omp::PrivateClauseOps *clauseOps);
154 void collectDefaultSymbols();
155 void collectImplicitSymbols();
156 void collectPreDeterminedSymbols();
157 void collectIndirectReferences();
158 void privatize(mlir::omp::PrivateClauseOps *clauseOps,
159 std::optional<llvm::omp::Directive> dir = std::nullopt);
160 void copyLastPrivatize(mlir::Operation *op);
161 void insertLastPrivateCompare(mlir::Operation *op);
165 mlir::OpBuilder::InsertPoint *copyAssignIP =
nullptr);
167 mlir::OpBuilder::InsertPoint *lastPrivIP);
168 void insertDeallocs();
171 llvm::omp::Version version);
175 DataSharingProcessor(
178 bool shouldCollectPreDeterminedSymbols,
bool useDelayedPrivatization,
186 bool isTargetPrivatization =
false);
199 void processStep1(mlir::omp::PrivateClauseOps *clauseOps =
nullptr,
200 std::optional<llvm::omp::Directive> dir = std::nullopt);
201 void processStep2(mlir::Operation *op,
bool isLoop);
203 void pushLoopIV(mlir::Value iv) { loopIVs.push_back(iv); }
205 void setForceHeapAllocationForPrivateDynamicArrays(
bool value =
true) {
206 forceHeapAllocationForPrivateDynamicArrays = value;
209 const llvm::SetVector<const semantics::Symbol *> &
210 getAllSymbolsToPrivatize()
const {
211 return allPrivatizedSymbols;
215 return useDelayedPrivatization
216 ? allPrivatizedSymbols.getArrayRef()
221 mlir::omp::PrivateClauseOps *clauseOps,
222 std::optional<llvm::omp::Directive> dir = std::nullopt);
224 const llvm::SetVector<const semantics::Symbol *> &
225 getConditionalLastprivateSymbols()
const {
226 return conditionalLastPrivatizedSymbols;
229 void setConditionalLpUsesPrivateCopy(
bool v) {
230 conditionalLpUsesPrivateCopy = v;