Skip to content

Commit 362b115

Browse files
[flang][openacc] Avoid privatizing symbols during semantics (#69506)
During flang handling of semantics of OpenACC private/firstprivate/ reduction clauses (including the implicitly private loop IV), a new scoped symbol was being created. This could lead to ambiguity in the lowered FIR - aka having multiple fir.declare for the same symbol. Because lowering of OpenACC does not materialize the meaning of the private clauses (by actually creating a scoped local symbol), it does not make sense to create a new symbol in semantics either. I updated the acc-symbols01.f90 test to reflect this updated approach. Technically, the test could be removed, but it made sense to keep in place to highlight this intentional decision.
1 parent 077d89f commit 362b115

File tree

2 files changed

+12
-37
lines changed

2 files changed

+12
-37
lines changed

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -254,9 +254,6 @@ class AccAttributeVisitor : DirectiveAttributeVisitor<llvm::acc::Directive> {
254254
Symbol::Flag::AccCopyIn, Symbol::Flag::AccCopyOut,
255255
Symbol::Flag::AccDelete, Symbol::Flag::AccPresent};
256256

257-
Symbol::Flags accFlagsRequireNewSymbol{Symbol::Flag::AccPrivate,
258-
Symbol::Flag::AccFirstPrivate, Symbol::Flag::AccReduction};
259-
260257
Symbol::Flags accDataMvtFlags{
261258
Symbol::Flag::AccDevice, Symbol::Flag::AccHost, Symbol::Flag::AccSelf};
262259

@@ -266,7 +263,7 @@ class AccAttributeVisitor : DirectiveAttributeVisitor<llvm::acc::Directive> {
266263
Symbol::Flag::AccDevicePtr, Symbol::Flag::AccDeviceResident,
267264
Symbol::Flag::AccLink, Symbol::Flag::AccPresent};
268265

269-
void PrivatizeAssociatedLoopIndex(const parser::OpenACCLoopConstruct &);
266+
void CheckAssociatedLoopIndex(const parser::OpenACCLoopConstruct &);
270267
void ResolveAccObjectList(const parser::AccObjectList &, Symbol::Flag);
271268
void ResolveAccObject(const parser::AccObject &, Symbol::Flag);
272269
Symbol *ResolveAcc(const parser::Name &, Symbol::Flag, Scope &);
@@ -877,7 +874,7 @@ bool AccAttributeVisitor::Pre(const parser::OpenACCLoopConstruct &x) {
877874
}
878875
ClearDataSharingAttributeObjects();
879876
SetContextAssociatedLoopLevel(GetAssociatedLoopLevelFromClauses(clauseList));
880-
PrivatizeAssociatedLoopIndex(x);
877+
CheckAssociatedLoopIndex(x);
881878
return true;
882879
}
883880

@@ -1141,13 +1138,12 @@ std::int64_t AccAttributeVisitor::GetAssociatedLoopLevelFromClauses(
11411138
return 1; // default is outermost loop
11421139
}
11431140

1144-
void AccAttributeVisitor::PrivatizeAssociatedLoopIndex(
1141+
void AccAttributeVisitor::CheckAssociatedLoopIndex(
11451142
const parser::OpenACCLoopConstruct &x) {
11461143
std::int64_t level{GetContext().associatedLoopLevel};
1147-
if (level <= 0) { // collpase value was negative or 0
1144+
if (level <= 0) { // collapse value was negative or 0
11481145
return;
11491146
}
1150-
Symbol::Flag ivDSA{Symbol::Flag::AccPrivate};
11511147

11521148
const auto getNextDoConstruct =
11531149
[this](const parser::Block &block) -> const parser::DoConstruct * {
@@ -1166,16 +1162,8 @@ void AccAttributeVisitor::PrivatizeAssociatedLoopIndex(
11661162

11671163
const auto &outer{std::get<std::optional<parser::DoConstruct>>(x.t)};
11681164
for (const parser::DoConstruct *loop{&*outer}; loop && level > 0; --level) {
1169-
// go through all the nested do-loops and resolve index variables
1170-
const parser::Name *iv{GetLoopIndex(*loop)};
1171-
if (iv) {
1172-
if (auto *symbol{ResolveAcc(*iv, ivDSA, currScope())}) {
1173-
symbol->set(Symbol::Flag::AccPreDetermined);
1174-
iv->symbol = symbol; // adjust the symbol within region
1175-
AddToContextObjectWithDSA(*symbol, ivDSA);
1176-
}
1177-
}
1178-
1165+
// Go through all nested loops to ensure index variable exists.
1166+
GetLoopIndex(*loop);
11791167
const auto &block{std::get<parser::Block>(loop->t)};
11801168
loop = getNextDoConstruct(block);
11811169
}
@@ -1328,20 +1316,12 @@ void AccAttributeVisitor::ResolveAccObject(
13281316

13291317
Symbol *AccAttributeVisitor::ResolveAcc(
13301318
const parser::Name &name, Symbol::Flag accFlag, Scope &scope) {
1331-
if (accFlagsRequireNewSymbol.test(accFlag)) {
1332-
return DeclarePrivateAccessEntity(name, accFlag, scope);
1333-
} else {
1334-
return DeclareOrMarkOtherAccessEntity(name, accFlag);
1335-
}
1319+
return DeclareOrMarkOtherAccessEntity(name, accFlag);
13361320
}
13371321

13381322
Symbol *AccAttributeVisitor::ResolveAcc(
13391323
Symbol &symbol, Symbol::Flag accFlag, Scope &scope) {
1340-
if (accFlagsRequireNewSymbol.test(accFlag)) {
1341-
return DeclarePrivateAccessEntity(symbol, accFlag, scope);
1342-
} else {
1343-
return DeclareOrMarkOtherAccessEntity(symbol, accFlag);
1344-
}
1324+
return DeclareOrMarkOtherAccessEntity(symbol, accFlag);
13451325
}
13461326

13471327
Symbol *AccAttributeVisitor::DeclareOrMarkOtherAccessEntity(
@@ -1374,11 +1354,6 @@ static bool WithMultipleAppearancesAccException(
13741354
void AccAttributeVisitor::CheckMultipleAppearances(
13751355
const parser::Name &name, const Symbol &symbol, Symbol::Flag accFlag) {
13761356
const auto *target{&symbol};
1377-
if (accFlagsRequireNewSymbol.test(accFlag)) {
1378-
if (const auto *details{symbol.detailsIf<HostAssocDetails>()}) {
1379-
target = &details->symbol();
1380-
}
1381-
}
13821357
if (HasDataSharingAttributeObject(*target) &&
13831358
!WithMultipleAppearancesAccException(symbol, accFlag)) {
13841359
context_.Say(name.source,

flang/test/Semantics/OpenACC/acc-symbols01.f90

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ program mm
1414
b = 2
1515
!$acc parallel present(c) firstprivate(b) private(a)
1616
!$acc loop
17-
!DEF: /mm/OtherConstruct1/i (AccPrivate, AccPreDetermined) HostAssoc INTEGER(4)
17+
!REF: /mm/i
1818
do i=1,10
19-
!DEF: /mm/OtherConstruct1/a (AccPrivate) HostAssoc INTEGER(4)
20-
!REF: /mm/OtherConstruct1/i
21-
!DEF: /mm/OtherConstruct1/b (AccFirstPrivate) HostAssoc INTEGER(4)
19+
!REF: /mm/a
20+
!REF: /mm/i
21+
!REF: /mm/b
2222
a(i) = b(i)
2323
end do
2424
!$acc end parallel

0 commit comments

Comments
 (0)