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 *> implicitSymbols;
100 llvm::SetVector<const semantics::Symbol *> preDeterminedSymbols;
101 llvm::SetVector<const semantics::Symbol *> allPrivatizedSymbols;
106 omp::List<omp::Clause> clauses;
108 bool shouldCollectPreDeterminedSymbols;
109 bool useDelayedPrivatization;
110 llvm::SmallPtrSet<const semantics::Symbol *, 16> mightHaveReadHostSym;
112 bool isTargetPrivatization;
113 OMPConstructSymbolVisitor visitor;
116 void collectSymbols(semantics::Symbol::Flag flag,
117 llvm::SetVector<const semantics::Symbol *> &symbols);
118 void collectSymbolsInNestedRegions(
120 llvm::SetVector<const semantics::Symbol *> &symbolsInNestedRegions);
121 void collectOmpObjectListSymbol(
122 const omp::ObjectList &objects,
123 llvm::SetVector<const semantics::Symbol *> &symbolSet);
124 void collectSymbolsForPrivatization();
125 void insertBarrier(mlir::omp::PrivateClauseOps *clauseOps);
126 void collectDefaultSymbols();
127 void collectImplicitSymbols();
128 void collectPreDeterminedSymbols();
129 void privatize(mlir::omp::PrivateClauseOps *clauseOps,
130 std::optional<llvm::omp::Directive> dir = std::nullopt);
131 void copyLastPrivatize(mlir::Operation *op);
132 void insertLastPrivateCompare(mlir::Operation *op);
136 mlir::OpBuilder::InsertPoint *copyAssignIP =
nullptr);
138 mlir::OpBuilder::InsertPoint *lastPrivIP);
139 void insertDeallocs();
148 const List<Clause> &clauses,
150 bool shouldCollectPreDeterminedSymbols,
152 bool isTargetPrivatization =
false);
158 bool isTargetPrivatization =
false);
171 void processStep1(mlir::omp::PrivateClauseOps *clauseOps =
nullptr,
172 std::optional<llvm::omp::Directive> dir = std::nullopt);
173 void processStep2(mlir::Operation *op,
bool isLoop);
175 void pushLoopIV(mlir::Value iv) { loopIVs.push_back(iv); }
177 const llvm::SetVector<const semantics::Symbol *> &
178 getAllSymbolsToPrivatize()
const {
179 return allPrivatizedSymbols;
183 return useDelayedPrivatization
184 ? allPrivatizedSymbols.getArrayRef()
189 mlir::omp::PrivateClauseOps *clauseOps,
190 std::optional<llvm::omp::Directive> dir = std::nullopt);
Definition semantics.h:67