@@ -222,47 +222,77 @@ static void SetAssignment(parser::AssignmentStmt::TypedAssignment &assign,
222
222
}
223
223
}
224
224
225
- static parser::OpenMPAtomicConstruct::Analysis::Op MakeAtomicAnalysisOp (
226
- int what,
227
- const std::optional<evaluate::Assignment> &maybeAssign = std::nullopt) {
228
- parser::OpenMPAtomicConstruct::Analysis::Op operation;
229
- operation.what = what;
230
- SetAssignment (operation.assign , maybeAssign);
231
- return operation;
232
- }
225
+ namespace {
226
+ struct AtomicAnalysis {
227
+ AtomicAnalysis (const SomeExpr &atom, const MaybeExpr &cond = std::nullopt)
228
+ : atom_(atom), cond_(cond) {}
229
+
230
+ AtomicAnalysis &addOp0 (int what,
231
+ const std::optional<evaluate::Assignment> &maybeAssign = std::nullopt) {
232
+ return addOp (op0_, what, maybeAssign);
233
+ }
234
+ AtomicAnalysis &addOp1 (int what,
235
+ const std::optional<evaluate::Assignment> &maybeAssign = std::nullopt) {
236
+ return addOp (op1_, what, maybeAssign);
237
+ }
233
238
234
- static parser::OpenMPAtomicConstruct::Analysis MakeAtomicAnalysis (
235
- const SomeExpr &atom, const MaybeExpr &cond,
236
- parser::OpenMPAtomicConstruct::Analysis::Op &&op0,
237
- parser::OpenMPAtomicConstruct::Analysis::Op &&op1) {
238
- // Defined in flang/include/flang/Parser/parse-tree.h
239
- //
240
- // struct Analysis {
241
- // struct Kind {
242
- // static constexpr int None = 0;
243
- // static constexpr int Read = 1;
244
- // static constexpr int Write = 2;
245
- // static constexpr int Update = Read | Write;
246
- // static constexpr int Action = 3; // Bits containing N, R, W, U
247
- // static constexpr int IfTrue = 4;
248
- // static constexpr int IfFalse = 8;
249
- // static constexpr int Condition = 12; // Bits containing IfTrue, IfFalse
250
- // };
251
- // struct Op {
252
- // int what;
253
- // TypedAssignment assign;
254
- // };
255
- // TypedExpr atom, cond;
256
- // Op op0, op1;
257
- // };
258
-
259
- parser::OpenMPAtomicConstruct::Analysis an;
260
- SetExpr (an.atom , atom);
261
- SetExpr (an.cond , cond);
262
- an.op0 = std::move (op0);
263
- an.op1 = std::move (op1);
264
- return an;
265
- }
239
+ operator parser::OpenMPAtomicConstruct::Analysis () const {
240
+ // Defined in flang/include/flang/Parser/parse-tree.h
241
+ //
242
+ // struct Analysis {
243
+ // struct Kind {
244
+ // static constexpr int None = 0;
245
+ // static constexpr int Read = 1;
246
+ // static constexpr int Write = 2;
247
+ // static constexpr int Update = Read | Write;
248
+ // static constexpr int Action = 3; // Bits containing None, Read,
249
+ // // Write, Update
250
+ // static constexpr int IfTrue = 4;
251
+ // static constexpr int IfFalse = 8;
252
+ // static constexpr int Condition = 12; // Bits containing IfTrue,
253
+ // // IfFalse
254
+ // };
255
+ // struct Op {
256
+ // int what;
257
+ // TypedAssignment assign;
258
+ // };
259
+ // TypedExpr atom, cond;
260
+ // Op op0, op1;
261
+ // };
262
+
263
+ parser::OpenMPAtomicConstruct::Analysis an;
264
+ SetExpr (an.atom , atom_);
265
+ SetExpr (an.cond , cond_);
266
+ an.op0 = std::move (op0_);
267
+ an.op1 = std::move (op1_);
268
+ return an;
269
+ }
270
+
271
+ private:
272
+ struct Op {
273
+ operator parser::OpenMPAtomicConstruct::Analysis::Op () const {
274
+ parser::OpenMPAtomicConstruct::Analysis::Op op;
275
+ op.what = what;
276
+ SetAssignment (op.assign , assign);
277
+ return op;
278
+ }
279
+
280
+ int what;
281
+ std::optional<evaluate::Assignment> assign;
282
+ };
283
+
284
+ AtomicAnalysis &addOp (Op &op, int what,
285
+ const std::optional<evaluate::Assignment> &maybeAssign) {
286
+ op.what = what;
287
+ op.assign = maybeAssign;
288
+ return *this ;
289
+ }
290
+
291
+ const SomeExpr &atom_;
292
+ const MaybeExpr &cond_;
293
+ Op op0_, op1_;
294
+ };
295
+ } // namespace
266
296
267
297
// / Check if `expr` satisfies the following conditions for x and v:
268
298
// /
@@ -805,9 +835,9 @@ void OmpStructureChecker::CheckAtomicUpdateOnly(
805
835
CheckAtomicUpdateAssignment (*maybeUpdate, action.source );
806
836
807
837
using Analysis = parser::OpenMPAtomicConstruct::Analysis;
808
- x.analysis = MakeAtomicAnalysis (atom, std::nullopt,
809
- MakeAtomicAnalysisOp (Analysis::Update, maybeUpdate),
810
- MakeAtomicAnalysisOp (Analysis::None) );
838
+ x.analysis = AtomicAnalysis (atom)
839
+ . addOp0 (Analysis::Update, maybeUpdate)
840
+ . addOp1 (Analysis::None);
811
841
} else if (!IsAssignment (action.stmt )) {
812
842
context_.Say (
813
843
source, " ATOMIC UPDATE operation should be an assignment" _err_en_US);
@@ -889,9 +919,11 @@ void OmpStructureChecker::CheckAtomicConditionalUpdate(
889
919
}
890
920
891
921
using Analysis = parser::OpenMPAtomicConstruct::Analysis;
892
- x.analysis = MakeAtomicAnalysis (assign.lhs , update.cond ,
893
- MakeAtomicAnalysisOp (Analysis::Update | Analysis::IfTrue, assign),
894
- MakeAtomicAnalysisOp (Analysis::None));
922
+ const SomeExpr &atom{assign.lhs };
923
+
924
+ x.analysis = AtomicAnalysis (atom, update.cond )
925
+ .addOp0 (Analysis::Update | Analysis::IfTrue, assign)
926
+ .addOp1 (Analysis::None);
895
927
}
896
928
897
929
void OmpStructureChecker::CheckAtomicUpdateCapture (
@@ -936,13 +968,13 @@ void OmpStructureChecker::CheckAtomicUpdateCapture(
936
968
}
937
969
938
970
if (GetActionStmt (&body.front ()).stmt == uact.stmt ) {
939
- x.analysis = MakeAtomicAnalysis (atom, std::nullopt,
940
- MakeAtomicAnalysisOp (action, update),
941
- MakeAtomicAnalysisOp (Analysis::Read, capture) );
971
+ x.analysis = AtomicAnalysis (atom)
972
+ . addOp0 (action, update)
973
+ . addOp1 (Analysis::Read, capture);
942
974
} else {
943
- x.analysis = MakeAtomicAnalysis (atom, std::nullopt,
944
- MakeAtomicAnalysisOp (Analysis::Read, capture),
945
- MakeAtomicAnalysisOp (action, update) );
975
+ x.analysis = AtomicAnalysis (atom)
976
+ . addOp0 (Analysis::Read, capture)
977
+ . addOp1 (action, update);
946
978
}
947
979
}
948
980
@@ -1087,15 +1119,16 @@ void OmpStructureChecker::CheckAtomicConditionalUpdateCapture(
1087
1119
1088
1120
evaluate::Assignment updAssign{*GetEvaluateAssignment (update.ift .stmt )};
1089
1121
evaluate::Assignment capAssign{*GetEvaluateAssignment (capture.stmt )};
1122
+ const SomeExpr &atom{updAssign.lhs };
1090
1123
1091
1124
if (captureFirst) {
1092
- x.analysis = MakeAtomicAnalysis (updAssign. lhs , update.cond ,
1093
- MakeAtomicAnalysisOp (Analysis::Read | captureWhen, capAssign),
1094
- MakeAtomicAnalysisOp (Analysis::Write | updateWhen, updAssign) );
1125
+ x.analysis = AtomicAnalysis (atom , update.cond )
1126
+ . addOp0 (Analysis::Read | captureWhen, capAssign)
1127
+ . addOp1 (Analysis::Write | updateWhen, updAssign);
1095
1128
} else {
1096
- x.analysis = MakeAtomicAnalysis (updAssign. lhs , update.cond ,
1097
- MakeAtomicAnalysisOp (Analysis::Write | updateWhen, updAssign),
1098
- MakeAtomicAnalysisOp (Analysis::Read | captureWhen, capAssign) );
1129
+ x.analysis = AtomicAnalysis (atom , update.cond )
1130
+ . addOp0 (Analysis::Write | updateWhen, updAssign)
1131
+ . addOp1 (Analysis::Read | captureWhen, capAssign);
1099
1132
}
1100
1133
}
1101
1134
@@ -1125,9 +1158,9 @@ void OmpStructureChecker::CheckAtomicRead(
1125
1158
if (auto maybe{GetConvertInput (maybeRead->rhs )}) {
1126
1159
const SomeExpr &atom{*maybe};
1127
1160
using Analysis = parser::OpenMPAtomicConstruct::Analysis;
1128
- x.analysis = MakeAtomicAnalysis (atom, std::nullopt,
1129
- MakeAtomicAnalysisOp (Analysis::Read, maybeRead),
1130
- MakeAtomicAnalysisOp (Analysis::None) );
1161
+ x.analysis = AtomicAnalysis (atom)
1162
+ . addOp0 (Analysis::Read, maybeRead)
1163
+ . addOp1 (Analysis::None);
1131
1164
}
1132
1165
} else if (!IsAssignment (action.stmt )) {
1133
1166
context_.Say (
@@ -1159,9 +1192,9 @@ void OmpStructureChecker::CheckAtomicWrite(
1159
1192
CheckAtomicWriteAssignment (*maybeWrite, action.source );
1160
1193
1161
1194
using Analysis = parser::OpenMPAtomicConstruct::Analysis;
1162
- x.analysis = MakeAtomicAnalysis (atom, std::nullopt,
1163
- MakeAtomicAnalysisOp (Analysis::Write, maybeWrite),
1164
- MakeAtomicAnalysisOp (Analysis::None) );
1195
+ x.analysis = AtomicAnalysis (atom)
1196
+ . addOp0 (Analysis::Write, maybeWrite)
1197
+ . addOp1 (Analysis::None);
1165
1198
} else if (!IsAssignment (action.stmt )) {
1166
1199
context_.Say (
1167
1200
x.source , " ATOMIC WRITE operation should be an assignment" _err_en_US);
0 commit comments