34class DataSharingProcessor {
36 mlir::OpBuilder::InsertPoint lastPrivIP;
39 llvm::SetVector<const semantics::Symbol *> explicitlyPrivatizedSymbols;
40 llvm::SetVector<const semantics::Symbol *> defaultSymbols;
41 llvm::SetVector<const semantics::Symbol *> allPrivatizedSymbols;
42 llvm::SetVector<const semantics::Symbol *> conditionalLastPrivatizedSymbols;
49 bool conditionalLpUsesPrivateCopy =
false;
54 omp::List<omp::Clause> clauses;
56 bool shouldCollectPreDeterminedSymbols;
57 bool useDelayedPrivatization;
58 bool forceHeapAllocationForPrivateDynamicArrays =
false;
59 llvm::SmallPtrSet<const semantics::Symbol *, 16> mightHaveReadHostSym;
61 bool isTargetPrivatization;
62 bool isMetadirectiveLoop;
65 void collectPrivatizedSymbols(
66 std::optional<semantics::Symbol::Flag> flag,
67 const llvm::SetVector<const semantics::Symbol *> &allSymbols,
68 const llvm::SetVector<const semantics::Symbol *> &symbolsInNestedRegions,
69 llvm::SetVector<const semantics::Symbol *> *symbols =
nullptr);
71 collectSymbols(semantics::Symbol::Flag flag,
72 llvm::SetVector<const semantics::Symbol *> *symbols =
nullptr);
73 void collectSymbolsInNestedRegions(
75 llvm::SetVector<const semantics::Symbol *> &symbolsInNestedRegions);
76 void collectOmpObjectListSymbol(
77 const omp::ObjectList &objects,
78 llvm::SetVector<const semantics::Symbol *> &symbolSet);
79 void collectSymbolsForPrivatization();
80 void insertBarrier(mlir::omp::PrivateClauseOps *clauseOps);
81 void collectDefaultSymbols();
82 void collectImplicitSymbols();
83 void collectPreDeterminedSymbols();
84 void collectIndirectReferences();
85 void privatize(mlir::omp::PrivateClauseOps *clauseOps,
86 std::optional<llvm::omp::Directive> dir = std::nullopt);
87 void copyLastPrivatize(mlir::Operation *op);
88 void insertLastPrivateCompare(mlir::Operation *op);
92 mlir::OpBuilder::InsertPoint *copyAssignIP =
nullptr);
94 mlir::OpBuilder::InsertPoint *lastPrivIP);
95 void insertDeallocs();
98 llvm::omp::Version version);
102 DataSharingProcessor(
105 bool shouldCollectPreDeterminedSymbols,
bool useDelayedPrivatization,
113 bool isTargetPrivatization =
false);
126 void processStep1(mlir::omp::PrivateClauseOps *clauseOps =
nullptr,
127 std::optional<llvm::omp::Directive> dir = std::nullopt);
128 void processStep2(mlir::Operation *op,
bool isLoop);
130 void pushLoopIV(mlir::Value iv) { loopIVs.push_back(iv); }
132 void setForceHeapAllocationForPrivateDynamicArrays(
bool value =
true) {
133 forceHeapAllocationForPrivateDynamicArrays = value;
136 const llvm::SetVector<const semantics::Symbol *> &
137 getAllSymbolsToPrivatize()
const {
138 return allPrivatizedSymbols;
142 return useDelayedPrivatization
143 ? allPrivatizedSymbols.getArrayRef()
148 mlir::omp::PrivateClauseOps *clauseOps,
149 std::optional<llvm::omp::Directive> dir = std::nullopt,
150 bool isLinear =
false);
152 bool usesDelayedPrivatization()
const {
return useDelayedPrivatization; }
154 const llvm::SetVector<const semantics::Symbol *> &
155 getConditionalLastprivateSymbols()
const {
156 return conditionalLastPrivatizedSymbols;
159 void setConditionalLpUsesPrivateCopy(
bool v) {
160 conditionalLpUsesPrivateCopy = v;