Skip to content

Commit 9b15fde

Browse files
Automerge: [Flang] Add semantics checks for CrayPointer usage in DSA list (#123171)
Follow-up PR to fix the failure caused here: llvm/llvm-project#121028 Failure: https://lab.llvm.org/buildbot/#/builders/89/builds/14474 Problems: - Cray pointee cannot be used in the DSA list (If used results in segmentation fault) - Cray pointer has to be in the DSA list when Cray pointee is used in the default (none) region Fix: Added required semantic checks along the tests Reference from the documentation (OpenMP 5.0: 2.19.1): - Cray pointees have the same data-sharing attribute as the storage with which their Cray pointers are associated.
2 parents 86e0fe5 + ba789c6 commit 9b15fde

File tree

4 files changed

+88
-6
lines changed

4 files changed

+88
-6
lines changed

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3438,13 +3438,15 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Ordered &x) {
34383438
void OmpStructureChecker::Enter(const parser::OmpClause::Shared &x) {
34393439
CheckAllowedClause(llvm::omp::Clause::OMPC_shared);
34403440
CheckIsVarPartOfAnotherVar(GetContext().clauseSource, x.v, "SHARED");
3441+
CheckCrayPointee(x.v, "SHARED");
34413442
}
34423443
void OmpStructureChecker::Enter(const parser::OmpClause::Private &x) {
34433444
SymbolSourceMap symbols;
34443445
GetSymbolsInObjectList(x.v, symbols);
34453446
CheckAllowedClause(llvm::omp::Clause::OMPC_private);
34463447
CheckIsVarPartOfAnotherVar(GetContext().clauseSource, x.v, "PRIVATE");
34473448
CheckIntentInPointer(symbols, llvm::omp::Clause::OMPC_private);
3449+
CheckCrayPointee(x.v, "PRIVATE");
34483450
}
34493451

34503452
void OmpStructureChecker::Enter(const parser::OmpClause::Nowait &x) {
@@ -3524,6 +3526,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Firstprivate &x) {
35243526
CheckAllowedClause(llvm::omp::Clause::OMPC_firstprivate);
35253527

35263528
CheckIsVarPartOfAnotherVar(GetContext().clauseSource, x.v, "FIRSTPRIVATE");
3529+
CheckCrayPointee(x.v, "FIRSTPRIVATE");
35273530
CheckIsLoopIvPartOfClause(llvmOmpClause::OMPC_firstprivate, x.v);
35283531

35293532
SymbolSourceMap currSymbols;
@@ -3758,6 +3761,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
37583761

37593762
SymbolSourceMap symbols;
37603763
auto &objects{std::get<parser::OmpObjectList>(x.v.t)};
3764+
CheckCrayPointee(objects, "LINEAR", false);
37613765
GetSymbolsInObjectList(objects, symbols);
37623766

37633767
auto CheckIntegerNoRef{[&](const Symbol *symbol, parser::CharBlock source) {
@@ -4203,6 +4207,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Lastprivate &x) {
42034207
const auto &objectList{std::get<parser::OmpObjectList>(x.v.t)};
42044208
CheckIsVarPartOfAnotherVar(
42054209
GetContext().clauseSource, objectList, "LASTPRIVATE");
4210+
CheckCrayPointee(objectList, "LASTPRIVATE");
42064211

42074212
DirectivesClauseTriple dirClauseTriple;
42084213
SymbolSourceMap currSymbols;
@@ -4620,6 +4625,26 @@ void OmpStructureChecker::CheckProcedurePointer(
46204625
}
46214626
}
46224627

4628+
void OmpStructureChecker::CheckCrayPointee(
4629+
const parser::OmpObjectList &objectList, llvm::StringRef clause,
4630+
bool suggestToUseCrayPointer) {
4631+
SymbolSourceMap symbols;
4632+
GetSymbolsInObjectList(objectList, symbols);
4633+
for (auto it{symbols.begin()}; it != symbols.end(); ++it) {
4634+
const auto *symbol{it->first};
4635+
const auto source{it->second};
4636+
if (symbol->test(Symbol::Flag::CrayPointee)) {
4637+
std::string suggestionMsg = "";
4638+
if (suggestToUseCrayPointer)
4639+
suggestionMsg = ", use Cray Pointer '" +
4640+
semantics::GetCrayPointer(*symbol).name().ToString() + "' instead";
4641+
context_.Say(source,
4642+
"Cray Pointee '%s' may not appear in %s clause%s"_err_en_US,
4643+
symbol->name(), clause.str(), suggestionMsg);
4644+
}
4645+
}
4646+
}
4647+
46234648
void OmpStructureChecker::GetSymbolsInObjectList(
46244649
const parser::OmpObjectList &objectList, SymbolSourceMap &symbols) {
46254650
for (const auto &ompObject : objectList.v) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ class OmpStructureChecker
199199
const parser::CharBlock &source, const parser::OmpObjectList &objList);
200200
void CheckIntentInPointer(SymbolSourceMap &, const llvm::omp::Clause);
201201
void CheckProcedurePointer(SymbolSourceMap &, const llvm::omp::Clause);
202+
void CheckCrayPointee(const parser::OmpObjectList &objectList,
203+
llvm::StringRef clause, bool suggestToUseCrayPointer = true);
202204
void GetSymbolsInObjectList(const parser::OmpObjectList &, SymbolSourceMap &);
203205
void CheckDefinableObjects(SymbolSourceMap &, const llvm::omp::Clause);
204206
void CheckCopyingPolymorphicAllocatable(

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,8 +2105,11 @@ void OmpAttributeVisitor::Post(const parser::OpenMPAllocatorsConstruct &x) {
21052105
static bool IsPrivatizable(const Symbol *sym) {
21062106
auto *misc{sym->detailsIf<MiscDetails>()};
21072107
return IsVariableName(*sym) && !IsProcedure(*sym) && !IsNamedConstant(*sym) &&
2108-
!semantics::IsAssumedSizeArray(
2109-
*sym) && /* OpenMP 5.2, 5.1.1: Assumed-size arrays are shared*/
2108+
( // OpenMP 5.2, 5.1.1: Assumed-size arrays are shared
2109+
!semantics::IsAssumedSizeArray(*sym) ||
2110+
// If CrayPointer is among the DSA list then the
2111+
// CrayPointee is Privatizable
2112+
sym->test(Symbol::Flag::CrayPointee)) &&
21102113
!sym->owner().IsDerivedType() &&
21112114
sym->owner().kind() != Scope::Kind::ImpliedDos &&
21122115
sym->owner().kind() != Scope::Kind::Forall &&
@@ -2273,10 +2276,18 @@ void OmpAttributeVisitor::Post(const parser::Name &name) {
22732276
// the scope of the parallel region, and not in this scope.
22742277
// TODO: check whether this should be caught in IsObjectWithDSA
22752278
!symbol->test(Symbol::Flag::OmpPrivate)) {
2276-
context_.Say(name.source,
2277-
"The DEFAULT(NONE) clause requires that '%s' must be listed in "
2278-
"a data-sharing attribute clause"_err_en_US,
2279-
symbol->name());
2279+
if (symbol->test(Symbol::Flag::CrayPointee)) {
2280+
std::string crayPtrName{
2281+
semantics::GetCrayPointer(*symbol).name().ToString()};
2282+
if (!IsObjectWithDSA(*currScope().FindSymbol(crayPtrName)))
2283+
context_.Say(name.source,
2284+
"The DEFAULT(NONE) clause requires that the Cray Pointer '%s' must be listed in a data-sharing attribute clause"_err_en_US,
2285+
crayPtrName);
2286+
} else {
2287+
context_.Say(name.source,
2288+
"The DEFAULT(NONE) clause requires that '%s' must be listed in a data-sharing attribute clause"_err_en_US,
2289+
symbol->name());
2290+
}
22802291
}
22812292
}
22822293
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
!RUN: %python %S/../test_errors.py %s %flang -fopenmp
2+
subroutine test_cray_pointer_usage
3+
implicit none
4+
integer :: i
5+
real(8) :: var(*), pointee(2)
6+
pointer(ivar, var)
7+
! ERROR: Cray Pointee 'var' may not appear in LINEAR clause
8+
! ERROR: The list item 'var' specified without the REF 'linear-modifier' must be of INTEGER type
9+
! ERROR: The list item `var` must be a dummy argument
10+
!$omp declare simd linear(var)
11+
12+
pointee = 42.0
13+
ivar = loc(pointee)
14+
15+
!$omp parallel num_threads(2) default(none)
16+
! ERROR: The DEFAULT(NONE) clause requires that the Cray Pointer 'ivar' must be listed in a data-sharing attribute clause
17+
print *, var(1)
18+
!$omp end parallel
19+
20+
! ERROR: Cray Pointee 'var' may not appear in PRIVATE clause, use Cray Pointer 'ivar' instead
21+
!$omp parallel num_threads(2) default(none) private(var)
22+
print *, var(1)
23+
!$omp end parallel
24+
25+
! ERROR: Cray Pointee 'var' may not appear in SHARED clause, use Cray Pointer 'ivar' instead
26+
!$omp parallel num_threads(2) default(none) shared(var)
27+
print *, var(1)
28+
!$omp end parallel
29+
30+
! ERROR: Cray Pointee 'var' may not appear in LASTPRIVATE clause, use Cray Pointer 'ivar' instead
31+
!$omp do lastprivate(var)
32+
do i = 1, 10
33+
print *, var(1)
34+
end do
35+
!$omp end do
36+
37+
!$omp parallel num_threads(2) default(none) firstprivate(ivar)
38+
print *, var(1)
39+
!$omp end parallel
40+
41+
!$omp parallel num_threads(2) default(private) shared(ivar)
42+
print *, var(1)
43+
!$omp end parallel
44+
end subroutine test_cray_pointer_usage

0 commit comments

Comments
 (0)