Skip to content

Commit 9652c1c

Browse files
authored
[flang][OpenMP] Use iterator_range/range-for for FindClauses, NFC (#115749)
Implement a thin wrapper `GetClauses` that returns llvm::iterator_range made from the pair of iterators returned by FindClauses. This enables the use of range-for, which in turn makes the code a little more readable.
1 parent e74a002 commit 9652c1c

File tree

2 files changed

+44
-56
lines changed

2 files changed

+44
-56
lines changed

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

Lines changed: 36 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -337,24 +337,22 @@ void OmpStructureChecker::CheckMultListItems() {
337337
semantics::UnorderedSymbolSet listVars;
338338

339339
// Aligned clause
340-
auto alignedClauses{FindClauses(llvm::omp::Clause::OMPC_aligned)};
341-
for (auto itr = alignedClauses.first; itr != alignedClauses.second; ++itr) {
342-
const auto &alignedClause{
343-
std::get<parser::OmpClause::Aligned>(itr->second->u)};
340+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_aligned)) {
341+
const auto &alignedClause{std::get<parser::OmpClause::Aligned>(clause->u)};
344342
const auto &alignedList{std::get<0>(alignedClause.v.t)};
345343
std::list<parser::Name> alignedNameList;
346344
for (const auto &ompObject : alignedList.v) {
347345
if (const auto *name{parser::Unwrap<parser::Name>(ompObject)}) {
348346
if (name->symbol) {
349347
if (FindCommonBlockContaining(*(name->symbol))) {
350-
context_.Say(itr->second->source,
348+
context_.Say(clause->source,
351349
"'%s' is a common block name and can not appear in an "
352350
"ALIGNED clause"_err_en_US,
353351
name->ToString());
354352
} else if (!(IsBuiltinCPtr(*(name->symbol)) ||
355353
IsAllocatableOrObjectPointer(
356354
&name->symbol->GetUltimate()))) {
357-
context_.Say(itr->second->source,
355+
context_.Say(clause->source,
358356
"'%s' in ALIGNED clause must be of type C_PTR, POINTER or "
359357
"ALLOCATABLE"_err_en_US,
360358
name->ToString());
@@ -368,18 +366,16 @@ void OmpStructureChecker::CheckMultListItems() {
368366
}
369367
}
370368
CheckMultipleOccurrence(
371-
listVars, alignedNameList, itr->second->source, "ALIGNED");
369+
listVars, alignedNameList, clause->source, "ALIGNED");
372370
}
373371

374372
// Nontemporal clause
375-
auto nonTemporalClauses{FindClauses(llvm::omp::Clause::OMPC_nontemporal)};
376-
for (auto itr = nonTemporalClauses.first; itr != nonTemporalClauses.second;
377-
++itr) {
373+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_nontemporal)) {
378374
const auto &nontempClause{
379-
std::get<parser::OmpClause::Nontemporal>(itr->second->u)};
375+
std::get<parser::OmpClause::Nontemporal>(clause->u)};
380376
const auto &nontempNameList{nontempClause.v};
381377
CheckMultipleOccurrence(
382-
listVars, nontempNameList, itr->second->source, "NONTEMPORAL");
378+
listVars, nontempNameList, clause->source, "NONTEMPORAL");
383379
}
384380
}
385381

@@ -1688,21 +1684,18 @@ void OmpStructureChecker::ChecksOnOrderedAsStandalone() {
16881684
}};
16891685

16901686
// Visit the DEPEND and DOACROSS clauses.
1691-
auto depClauses{FindClauses(llvm::omp::Clause::OMPC_depend)};
1692-
for (auto itr{depClauses.first}; itr != depClauses.second; ++itr) {
1693-
const auto &dependClause{
1694-
std::get<parser::OmpClause::Depend>(itr->second->u)};
1687+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_depend)) {
1688+
const auto &dependClause{std::get<parser::OmpClause::Depend>(clause->u)};
16951689
if (auto *doAcross{std::get_if<parser::OmpDoacross>(&dependClause.v.u)}) {
1696-
visitDoacross(*doAcross, itr->second->source);
1690+
visitDoacross(*doAcross, clause->source);
16971691
} else {
1698-
context_.Say(itr->second->source,
1692+
context_.Say(clause->source,
16991693
"Only SINK or SOURCE dependence types are allowed when ORDERED construct is a standalone construct with no ORDERED region"_err_en_US);
17001694
}
17011695
}
1702-
auto doaClauses{FindClauses(llvm::omp::Clause::OMPC_doacross)};
1703-
for (auto itr{doaClauses.first}; itr != doaClauses.second; ++itr) {
1704-
auto &doaClause{std::get<parser::OmpClause::Doacross>(itr->second->u)};
1705-
visitDoacross(doaClause.v.v, itr->second->source);
1696+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_doacross)) {
1697+
auto &doaClause{std::get<parser::OmpClause::Doacross>(clause->u)};
1698+
visitDoacross(doaClause.v.v, clause->source);
17061699
}
17071700

17081701
bool isNestedInDoOrderedWithPara{false};
@@ -1741,17 +1734,15 @@ void OmpStructureChecker::CheckOrderedDependClause(
17411734
}
17421735
}
17431736
}};
1744-
auto depClauses{FindClauses(llvm::omp::Clause::OMPC_depend)};
1745-
for (auto itr{depClauses.first}; itr != depClauses.second; ++itr) {
1746-
auto &dependClause{std::get<parser::OmpClause::Depend>(itr->second->u)};
1737+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_depend)) {
1738+
auto &dependClause{std::get<parser::OmpClause::Depend>(clause->u)};
17471739
if (auto *doAcross{std::get_if<parser::OmpDoacross>(&dependClause.v.u)}) {
1748-
visitDoacross(*doAcross, itr->second->source);
1740+
visitDoacross(*doAcross, clause->source);
17491741
}
17501742
}
1751-
auto doaClauses = FindClauses(llvm::omp::Clause::OMPC_doacross);
1752-
for (auto itr{doaClauses.first}; itr != doaClauses.second; ++itr) {
1753-
auto &doaClause{std::get<parser::OmpClause::Doacross>(itr->second->u)};
1754-
visitDoacross(doaClause.v.v, itr->second->source);
1743+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_doacross)) {
1744+
auto &doaClause{std::get<parser::OmpClause::Doacross>(clause->u)};
1745+
visitDoacross(doaClause.v.v, clause->source);
17551746
}
17561747
}
17571748

@@ -3829,19 +3820,16 @@ void OmpStructureChecker::Enter(const parser::OmpClause::UseDevicePtr &x) {
38293820
SymbolSourceMap currSymbols;
38303821
GetSymbolsInObjectList(x.v, currSymbols);
38313822
semantics::UnorderedSymbolSet listVars;
3832-
auto useDevicePtrClauses{FindClauses(llvm::omp::Clause::OMPC_use_device_ptr)};
3833-
for (auto itr = useDevicePtrClauses.first; itr != useDevicePtrClauses.second;
3834-
++itr) {
3823+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_use_device_ptr)) {
38353824
const auto &useDevicePtrClause{
3836-
std::get<parser::OmpClause::UseDevicePtr>(itr->second->u)};
3825+
std::get<parser::OmpClause::UseDevicePtr>(clause->u)};
38373826
const auto &useDevicePtrList{useDevicePtrClause.v};
38383827
std::list<parser::Name> useDevicePtrNameList;
38393828
for (const auto &ompObject : useDevicePtrList.v) {
38403829
if (const auto *name{parser::Unwrap<parser::Name>(ompObject)}) {
38413830
if (name->symbol) {
38423831
if (!(IsBuiltinCPtr(*(name->symbol)))) {
3843-
context_.Warn(common::UsageWarning::OpenMPUsage,
3844-
itr->second->source,
3832+
context_.Warn(common::UsageWarning::OpenMPUsage, clause->source,
38453833
"Use of non-C_PTR type '%s' in USE_DEVICE_PTR is deprecated, use USE_DEVICE_ADDR instead"_warn_en_US,
38463834
name->ToString());
38473835
} else {
@@ -3851,7 +3839,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::UseDevicePtr &x) {
38513839
}
38523840
}
38533841
CheckMultipleOccurrence(
3854-
listVars, useDevicePtrNameList, itr->second->source, "USE_DEVICE_PTR");
3842+
listVars, useDevicePtrNameList, clause->source, "USE_DEVICE_PTR");
38553843
}
38563844
}
38573845

@@ -3861,12 +3849,9 @@ void OmpStructureChecker::Enter(const parser::OmpClause::UseDeviceAddr &x) {
38613849
SymbolSourceMap currSymbols;
38623850
GetSymbolsInObjectList(x.v, currSymbols);
38633851
semantics::UnorderedSymbolSet listVars;
3864-
auto useDeviceAddrClauses{
3865-
FindClauses(llvm::omp::Clause::OMPC_use_device_addr)};
3866-
for (auto itr = useDeviceAddrClauses.first;
3867-
itr != useDeviceAddrClauses.second; ++itr) {
3852+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_use_device_addr)) {
38683853
const auto &useDeviceAddrClause{
3869-
std::get<parser::OmpClause::UseDeviceAddr>(itr->second->u)};
3854+
std::get<parser::OmpClause::UseDeviceAddr>(clause->u)};
38703855
const auto &useDeviceAddrList{useDeviceAddrClause.v};
38713856
std::list<parser::Name> useDeviceAddrNameList;
38723857
for (const auto &ompObject : useDeviceAddrList.v) {
@@ -3876,8 +3861,8 @@ void OmpStructureChecker::Enter(const parser::OmpClause::UseDeviceAddr &x) {
38763861
}
38773862
}
38783863
}
3879-
CheckMultipleOccurrence(listVars, useDeviceAddrNameList,
3880-
itr->second->source, "USE_DEVICE_ADDR");
3864+
CheckMultipleOccurrence(
3865+
listVars, useDeviceAddrNameList, clause->source, "USE_DEVICE_ADDR");
38813866
}
38823867
}
38833868

@@ -3886,26 +3871,24 @@ void OmpStructureChecker::Enter(const parser::OmpClause::IsDevicePtr &x) {
38863871
SymbolSourceMap currSymbols;
38873872
GetSymbolsInObjectList(x.v, currSymbols);
38883873
semantics::UnorderedSymbolSet listVars;
3889-
auto isDevicePtrClauses{FindClauses(llvm::omp::Clause::OMPC_is_device_ptr)};
3890-
for (auto itr = isDevicePtrClauses.first; itr != isDevicePtrClauses.second;
3891-
++itr) {
3874+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_is_device_ptr)) {
38923875
const auto &isDevicePtrClause{
3893-
std::get<parser::OmpClause::IsDevicePtr>(itr->second->u)};
3876+
std::get<parser::OmpClause::IsDevicePtr>(clause->u)};
38943877
const auto &isDevicePtrList{isDevicePtrClause.v};
38953878
SymbolSourceMap currSymbols;
38963879
GetSymbolsInObjectList(isDevicePtrList, currSymbols);
38973880
for (auto &[symbol, source] : currSymbols) {
38983881
if (!(IsBuiltinCPtr(*symbol))) {
3899-
context_.Say(itr->second->source,
3882+
context_.Say(clause->source,
39003883
"Variable '%s' in IS_DEVICE_PTR clause must be of type C_PTR"_err_en_US,
39013884
source.ToString());
39023885
} else if (!(IsDummy(*symbol))) {
3903-
context_.Warn(common::UsageWarning::OpenMPUsage, itr->second->source,
3886+
context_.Warn(common::UsageWarning::OpenMPUsage, clause->source,
39043887
"Variable '%s' in IS_DEVICE_PTR clause must be a dummy argument. "
39053888
"This semantic check is deprecated from OpenMP 5.2 and later."_warn_en_US,
39063889
source.ToString());
39073890
} else if (IsAllocatableOrPointer(*symbol) || IsValue(*symbol)) {
3908-
context_.Warn(common::UsageWarning::OpenMPUsage, itr->second->source,
3891+
context_.Warn(common::UsageWarning::OpenMPUsage, clause->source,
39093892
"Variable '%s' in IS_DEVICE_PTR clause must be a dummy argument "
39103893
"that does not have the ALLOCATABLE, POINTER or VALUE attribute. "
39113894
"This semantic check is deprecated from OpenMP 5.2 and later."_warn_en_US,
@@ -3920,12 +3903,9 @@ void OmpStructureChecker::Enter(const parser::OmpClause::HasDeviceAddr &x) {
39203903
SymbolSourceMap currSymbols;
39213904
GetSymbolsInObjectList(x.v, currSymbols);
39223905
semantics::UnorderedSymbolSet listVars;
3923-
auto hasDeviceAddrClauses{
3924-
FindClauses(llvm::omp::Clause::OMPC_has_device_addr)};
3925-
for (auto itr = hasDeviceAddrClauses.first;
3926-
itr != hasDeviceAddrClauses.second; ++itr) {
3906+
for (auto [_, clause] : GetClauses(llvm::omp::Clause::OMPC_has_device_addr)) {
39273907
const auto &hasDeviceAddrClause{
3928-
std::get<parser::OmpClause::HasDeviceAddr>(itr->second->u)};
3908+
std::get<parser::OmpClause::HasDeviceAddr>(clause->u)};
39293909
const auto &hasDeviceAddrList{hasDeviceAddrClause.v};
39303910
std::list<parser::Name> hasDeviceAddrNameList;
39313911
for (const auto &ompObject : hasDeviceAddrList.v) {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ class OmpStructureChecker
141141
#include "llvm/Frontend/OpenMP/OMP.inc"
142142

143143
private:
144+
inline llvm::iterator_range<typename ClauseMapTy::iterator> GetClauses(
145+
llvm::omp::Clause clauseId);
146+
144147
bool CheckAllowedClause(llvmOmpClause clause);
145148
bool IsVariableListItem(const Symbol &sym);
146149
bool IsExtendedListItem(const Symbol &sym);
@@ -291,5 +294,10 @@ const T *OmpStructureChecker::FindDuplicateEntry(const std::list<T> &list) {
291294
return nullptr;
292295
}
293296

297+
llvm::iterator_range<typename OmpStructureChecker::ClauseMapTy::iterator>
298+
OmpStructureChecker::GetClauses(llvm::omp::Clause clauseId) {
299+
return llvm::make_range(FindClauses(clauseId));
300+
}
301+
294302
} // namespace Fortran::semantics
295303
#endif // FORTRAN_SEMANTICS_CHECK_OMP_STRUCTURE_H_

0 commit comments

Comments
 (0)