Skip to content

Commit 13615f7

Browse files
authored
[flang][openacc] Allow if clause on atomic directives (#135451)
The new version of the OpenACC specification will allow the if clause on the atomic directives. Allow it in `ACC.td` and update the parse node and parser in flang to support it. OpenACC dialect will need to be updated to support it as well.
1 parent 227f406 commit 13615f7

File tree

4 files changed

+53
-15
lines changed

4 files changed

+53
-15
lines changed

flang/include/flang/Parser/parse-tree.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5244,21 +5244,23 @@ EMPTY_CLASS(AccEndAtomic);
52445244
// ACC ATOMIC READ
52455245
struct AccAtomicRead {
52465246
TUPLE_CLASS_BOILERPLATE(AccAtomicRead);
5247-
std::tuple<Verbatim, Statement<AssignmentStmt>, std::optional<AccEndAtomic>>
5247+
std::tuple<Verbatim, AccClauseList, Statement<AssignmentStmt>,
5248+
std::optional<AccEndAtomic>>
52485249
t;
52495250
};
52505251

52515252
// ACC ATOMIC WRITE
52525253
struct AccAtomicWrite {
52535254
TUPLE_CLASS_BOILERPLATE(AccAtomicWrite);
5254-
std::tuple<Verbatim, Statement<AssignmentStmt>, std::optional<AccEndAtomic>>
5255+
std::tuple<Verbatim, AccClauseList, Statement<AssignmentStmt>,
5256+
std::optional<AccEndAtomic>>
52555257
t;
52565258
};
52575259

52585260
// ACC ATOMIC UPDATE
52595261
struct AccAtomicUpdate {
52605262
TUPLE_CLASS_BOILERPLATE(AccAtomicUpdate);
5261-
std::tuple<std::optional<Verbatim>, Statement<AssignmentStmt>,
5263+
std::tuple<std::optional<Verbatim>, AccClauseList, Statement<AssignmentStmt>,
52625264
std::optional<AccEndAtomic>>
52635265
t;
52645266
};
@@ -5268,7 +5270,7 @@ struct AccAtomicCapture {
52685270
TUPLE_CLASS_BOILERPLATE(AccAtomicCapture);
52695271
WRAPPER_CLASS(Stmt1, Statement<AssignmentStmt>);
52705272
WRAPPER_CLASS(Stmt2, Statement<AssignmentStmt>);
5271-
std::tuple<Verbatim, Stmt1, Stmt2, AccEndAtomic> t;
5273+
std::tuple<Verbatim, AccClauseList, Stmt1, Stmt2, AccEndAtomic> t;
52725274
};
52735275

52745276
struct OpenACCAtomicConstruct {

flang/lib/Parser/openacc-parsers.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -187,22 +187,25 @@ TYPE_PARSER(construct<AccBeginCombinedDirective>(
187187
// 2.12 Atomic constructs
188188
TYPE_PARSER(construct<AccEndAtomic>(startAccLine >> "END ATOMIC"_tok))
189189

190-
TYPE_PARSER("ATOMIC" >>
191-
construct<AccAtomicRead>(verbatim("READ"_tok) / endAccLine,
192-
statement(assignmentStmt), maybe(Parser<AccEndAtomic>{} / endAccLine)))
190+
TYPE_PARSER("ATOMIC" >> construct<AccAtomicRead>(verbatim("READ"_tok),
191+
Parser<AccClauseList>{} / endAccLine,
192+
statement(assignmentStmt),
193+
maybe(Parser<AccEndAtomic>{} / endAccLine)))
193194

194-
TYPE_PARSER("ATOMIC" >>
195-
construct<AccAtomicWrite>(verbatim("WRITE"_tok) / endAccLine,
196-
statement(assignmentStmt), maybe(Parser<AccEndAtomic>{} / endAccLine)))
195+
TYPE_PARSER("ATOMIC" >> construct<AccAtomicWrite>(verbatim("WRITE"_tok),
196+
Parser<AccClauseList>{} / endAccLine,
197+
statement(assignmentStmt),
198+
maybe(Parser<AccEndAtomic>{} / endAccLine)))
197199

198200
TYPE_PARSER("ATOMIC" >>
199-
construct<AccAtomicUpdate>(maybe(verbatim("UPDATE"_tok)) / endAccLine,
200-
statement(assignmentStmt), maybe(Parser<AccEndAtomic>{} / endAccLine)))
201+
construct<AccAtomicUpdate>(maybe(verbatim("UPDATE"_tok)),
202+
Parser<AccClauseList>{} / endAccLine, statement(assignmentStmt),
203+
maybe(Parser<AccEndAtomic>{} / endAccLine)))
201204

202205
TYPE_PARSER("ATOMIC" >>
203-
construct<AccAtomicCapture>(verbatim("CAPTURE"_tok) / endAccLine,
204-
statement(assignmentStmt), statement(assignmentStmt),
205-
Parser<AccEndAtomic>{} / endAccLine))
206+
construct<AccAtomicCapture>(verbatim("CAPTURE"_tok),
207+
Parser<AccClauseList>{} / endAccLine, statement(assignmentStmt),
208+
statement(assignmentStmt), Parser<AccEndAtomic>{} / endAccLine))
206209

207210
TYPE_PARSER(
208211
sourced(construct<OpenACCAtomicConstruct>(Parser<AccAtomicRead>{})) ||

flang/test/Semantics/OpenACC/acc-atomic-validity.f90

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ program openacc_atomic_validity
1010
integer :: i
1111
integer, parameter :: N = 256
1212
integer, dimension(N) :: c
13+
logical :: l
1314

1415

1516
!$acc parallel
@@ -23,27 +24,58 @@ program openacc_atomic_validity
2324
!$acc atomic write
2425
c(i) = 10
2526

27+
!$acc atomic write if(l)
28+
c(i) = 10
29+
2630
!$acc atomic write
2731
c(i) = 10
2832
!$acc end atomic
2933

34+
!$acc atomic write if(.true.)
35+
c(i) = 10
36+
!$acc end atomic
37+
3038
!$acc atomic read
3139
i = c(i)
40+
41+
!$acc atomic read if(.true.)
42+
i = c(i)
3243

3344
!$acc atomic read
3445
i = c(i)
3546
!$acc end atomic
3647

48+
!$acc atomic read if(l)
49+
i = c(i)
50+
!$acc end atomic
51+
52+
!ERROR: FINALIZE clause is not allowed on the ATOMIC READ FINALIZE IF(L)
53+
!$acc atomic read finalize if(l)
54+
i = c(i)
55+
!$acc end atomic
56+
3757
!$acc atomic capture
3858
c(i) = i
3959
i = i + 1
4060
!$acc end atomic
4161

62+
!$acc atomic capture if(l .EQV. .false.)
63+
c(i) = i
64+
i = i + 1
65+
!$acc end atomic
66+
4267
!$acc atomic update
4368
!ERROR: RHS of atomic update statement must be scalar
4469
!ERROR: LHS of atomic update statement must be scalar
4570
c = c + 1
4671

72+
!$acc atomic update if(i == 0)
73+
c(i) = c(i) + 1
74+
75+
!ERROR: At most one IF clause can appear on the ATOMIC UPDATE IF(I == 0) IF(.TRUE.)
76+
!$acc atomic update if(i == 0) if(.true.)
77+
c(i) = c(i) + 1
78+
4779
!$acc end parallel
4880

4981
end program openacc_atomic_validity

llvm/include/llvm/Frontend/OpenACC/ACC.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ def ACCC_Unknown : Clause<"unknown"> {
270270

271271
// 2.12
272272
def ACC_Atomic : Directive<"atomic"> {
273+
let allowedOnceClauses = [VersionedClause<ACCC_If, 34>];
273274
let association = AS_Block;
274275
let category = CA_Executable;
275276
}

0 commit comments

Comments
 (0)