Skip to content

Commit ea14ee4

Browse files
authored
[flang][OpenMP] Refactor creating atomic analysis, NFC (#153036)
Turn it into a class that combines the information and generates the analysis instead of having independent functions do it.
1 parent d2b3e86 commit ea14ee4

File tree

1 file changed

+97
-64
lines changed

1 file changed

+97
-64
lines changed

flang/lib/Semantics/check-omp-atomic.cpp

Lines changed: 97 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -222,47 +222,77 @@ static void SetAssignment(parser::AssignmentStmt::TypedAssignment &assign,
222222
}
223223
}
224224

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+
}
233238

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
266296

267297
/// Check if `expr` satisfies the following conditions for x and v:
268298
///
@@ -805,9 +835,9 @@ void OmpStructureChecker::CheckAtomicUpdateOnly(
805835
CheckAtomicUpdateAssignment(*maybeUpdate, action.source);
806836

807837
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);
811841
} else if (!IsAssignment(action.stmt)) {
812842
context_.Say(
813843
source, "ATOMIC UPDATE operation should be an assignment"_err_en_US);
@@ -889,9 +919,11 @@ void OmpStructureChecker::CheckAtomicConditionalUpdate(
889919
}
890920

891921
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);
895927
}
896928

897929
void OmpStructureChecker::CheckAtomicUpdateCapture(
@@ -936,13 +968,13 @@ void OmpStructureChecker::CheckAtomicUpdateCapture(
936968
}
937969

938970
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);
942974
} 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);
946978
}
947979
}
948980

@@ -1087,15 +1119,16 @@ void OmpStructureChecker::CheckAtomicConditionalUpdateCapture(
10871119

10881120
evaluate::Assignment updAssign{*GetEvaluateAssignment(update.ift.stmt)};
10891121
evaluate::Assignment capAssign{*GetEvaluateAssignment(capture.stmt)};
1122+
const SomeExpr &atom{updAssign.lhs};
10901123

10911124
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);
10951128
} 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);
10991132
}
11001133
}
11011134

@@ -1125,9 +1158,9 @@ void OmpStructureChecker::CheckAtomicRead(
11251158
if (auto maybe{GetConvertInput(maybeRead->rhs)}) {
11261159
const SomeExpr &atom{*maybe};
11271160
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);
11311164
}
11321165
} else if (!IsAssignment(action.stmt)) {
11331166
context_.Say(
@@ -1159,9 +1192,9 @@ void OmpStructureChecker::CheckAtomicWrite(
11591192
CheckAtomicWriteAssignment(*maybeWrite, action.source);
11601193

11611194
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);
11651198
} else if (!IsAssignment(action.stmt)) {
11661199
context_.Say(
11671200
x.source, "ATOMIC WRITE operation should be an assignment"_err_en_US);

0 commit comments

Comments
 (0)