Skip to content

Commit c05b999

Browse files
committed
[flang][OpenMP][NFC] Refactor code related to OpenMP atomic memory order clause semantics
Reviewed By: peixin Differential Revision: https://reviews.llvm.org/D127822
1 parent ba3f266 commit c05b999

File tree

2 files changed

+29
-47
lines changed

2 files changed

+29
-47
lines changed

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

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,46 +1543,28 @@ void OmpStructureChecker::CheckAtomicUpdateAssignmentStmt(
15431543
}
15441544

15451545
void OmpStructureChecker::CheckAtomicMemoryOrderClause(
1546-
const parser::OmpAtomicClauseList &clauseList) {
1546+
const parser::OmpAtomicClauseList *leftHandClauseList,
1547+
const parser::OmpAtomicClauseList *rightHandClauseList) {
15471548
int numMemoryOrderClause = 0;
1548-
for (const auto &clause : clauseList.v) {
1549-
if (std::get_if<Fortran::parser::OmpMemoryOrderClause>(&clause.u)) {
1550-
numMemoryOrderClause++;
1551-
if (numMemoryOrderClause > 1) {
1552-
context_.Say(clause.source,
1553-
"More than one memory order clause not allowed on OpenMP "
1554-
"Atomic construct"_err_en_US);
1555-
return;
1556-
}
1557-
}
1558-
}
1559-
}
1560-
1561-
void OmpStructureChecker::CheckAtomicMemoryOrderClause(
1562-
const parser::OmpAtomicClauseList &leftHandClauseList,
1563-
const parser::OmpAtomicClauseList &rightHandClauseList) {
1564-
int numMemoryOrderClause = 0;
1565-
for (const auto &clause : leftHandClauseList.v) {
1566-
if (std::get_if<Fortran::parser::OmpMemoryOrderClause>(&clause.u)) {
1567-
numMemoryOrderClause++;
1568-
if (numMemoryOrderClause > 1) {
1569-
context_.Say(clause.source,
1570-
"More than one memory order clause not allowed on "
1571-
"OpenMP Atomic construct"_err_en_US);
1572-
return;
1573-
}
1574-
}
1549+
auto checkForValidMemoryOrderClause =
1550+
[&](const parser::OmpAtomicClauseList *clauseList) {
1551+
for (const auto &clause : clauseList->v) {
1552+
if (std::get_if<Fortran::parser::OmpMemoryOrderClause>(&clause.u)) {
1553+
numMemoryOrderClause++;
1554+
if (numMemoryOrderClause > 1) {
1555+
context_.Say(clause.source,
1556+
"More than one memory order clause not allowed on "
1557+
"OpenMP Atomic construct"_err_en_US);
1558+
return;
1559+
}
1560+
}
1561+
}
1562+
};
1563+
if (leftHandClauseList) {
1564+
checkForValidMemoryOrderClause(leftHandClauseList);
15751565
}
1576-
for (const auto &clause : rightHandClauseList.v) {
1577-
if (std::get_if<Fortran::parser::OmpMemoryOrderClause>(&clause.u)) {
1578-
numMemoryOrderClause++;
1579-
if (numMemoryOrderClause > 1) {
1580-
context_.Say(clause.source,
1581-
"More than one memory order clause not "
1582-
"allowed on OpenMP Atomic construct"_err_en_US);
1583-
return;
1584-
}
1585-
}
1566+
if (rightHandClauseList) {
1567+
checkForValidMemoryOrderClause(rightHandClauseList);
15861568
}
15871569
}
15881570

@@ -1598,25 +1580,26 @@ void OmpStructureChecker::Enter(const parser::OpenMPAtomicConstruct &x) {
15981580
atomicConstruct.t)
15991581
.statement);
16001582
CheckAtomicMemoryOrderClause(
1601-
std::get<parser::OmpAtomicClauseList>(atomicConstruct.t));
1583+
&std::get<parser::OmpAtomicClauseList>(atomicConstruct.t),
1584+
nullptr);
16021585
},
1603-
[&](const parser::OmpAtomicUpdate &atomicConstruct) {
1604-
const auto &dir{std::get<parser::Verbatim>(atomicConstruct.t)};
1586+
[&](const parser::OmpAtomicUpdate &atomicUpdate) {
1587+
const auto &dir{std::get<parser::Verbatim>(atomicUpdate.t)};
16051588
PushContextAndClauseSets(
16061589
dir.source, llvm::omp::Directive::OMPD_atomic);
16071590
CheckAtomicUpdateAssignmentStmt(
16081591
std::get<parser::Statement<parser::AssignmentStmt>>(
1609-
atomicConstruct.t)
1592+
atomicUpdate.t)
16101593
.statement);
16111594
CheckAtomicMemoryOrderClause(
1612-
std::get<0>(atomicConstruct.t), std::get<2>(atomicConstruct.t));
1595+
&std::get<0>(atomicUpdate.t), &std::get<2>(atomicUpdate.t));
16131596
},
16141597
[&](const auto &atomicConstruct) {
16151598
const auto &dir{std::get<parser::Verbatim>(atomicConstruct.t)};
16161599
PushContextAndClauseSets(
16171600
dir.source, llvm::omp::Directive::OMPD_atomic);
1618-
CheckAtomicMemoryOrderClause(
1619-
std::get<0>(atomicConstruct.t), std::get<2>(atomicConstruct.t));
1601+
CheckAtomicMemoryOrderClause(&std::get<0>(atomicConstruct.t),
1602+
&std::get<2>(atomicConstruct.t));
16201603
},
16211604
},
16221605
x.u);

flang/lib/Semantics/check-omp-structure.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,7 @@ class OmpStructureChecker
234234
void CheckCycleConstraints(const parser::OpenMPLoopConstruct &x);
235235
template <typename T, typename D> bool IsOperatorValid(const T &, const D &);
236236
void CheckAtomicMemoryOrderClause(
237-
const parser::OmpAtomicClauseList &, const parser::OmpAtomicClauseList &);
238-
void CheckAtomicMemoryOrderClause(const parser::OmpAtomicClauseList &);
237+
const parser::OmpAtomicClauseList *, const parser::OmpAtomicClauseList *);
239238
void CheckAtomicUpdateAssignmentStmt(const parser::AssignmentStmt &);
240239
void CheckAtomicConstructStructure(const parser::OpenMPAtomicConstruct &);
241240
void CheckDistLinear(const parser::OpenMPLoopConstruct &x);

0 commit comments

Comments
 (0)