Skip to content

Commit ed64042

Browse files
authored
[flang][openacc] Fix clauses check with device_type (#77389)
A couple of clauses are allowed multiple times when they are separated by a device_type clause. This patch updates the ACC.td file to move these clauses to the `allowedClause` list and the `CheckAllowedOncePerGroup` function is used to make sure they appear only once on the directive or for each device_type.
1 parent 02fa434 commit ed64042

File tree

3 files changed

+94
-40
lines changed

3 files changed

+94
-40
lines changed

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,8 @@ void AccStructureChecker::Leave(const parser::OpenACCCombinedConstruct &x) {
225225
case llvm::acc::Directive::ACCD_serial_loop:
226226
// Restriction - line 1004-1005
227227
CheckOnlyAllowedAfter(llvm::acc::Clause::ACCC_device_type,
228-
computeConstructOnlyAllowedAfterDeviceTypeClauses);
228+
computeConstructOnlyAllowedAfterDeviceTypeClauses |
229+
loopOnlyAllowedAfterDeviceTypeClauses);
229230
if (doCons) {
230231
const parser::Block &block{std::get<parser::Block>(doCons->t)};
231232
CheckNoBranching(block, GetContext().directive, beginBlockDir.source);
@@ -388,11 +389,8 @@ CHECK_SIMPLE_CLAUSE(Nohost, ACCC_nohost)
388389
CHECK_SIMPLE_CLAUSE(Private, ACCC_private)
389390
CHECK_SIMPLE_CLAUSE(Read, ACCC_read)
390391
CHECK_SIMPLE_CLAUSE(Seq, ACCC_seq)
391-
CHECK_SIMPLE_CLAUSE(Tile, ACCC_tile)
392392
CHECK_SIMPLE_CLAUSE(UseDevice, ACCC_use_device)
393-
CHECK_SIMPLE_CLAUSE(Vector, ACCC_vector)
394393
CHECK_SIMPLE_CLAUSE(Wait, ACCC_wait)
395-
CHECK_SIMPLE_CLAUSE(Worker, ACCC_worker)
396394
CHECK_SIMPLE_CLAUSE(Write, ACCC_write)
397395
CHECK_SIMPLE_CLAUSE(Unknown, ACCC_unknown)
398396

@@ -536,8 +534,28 @@ void AccStructureChecker::Enter(const parser::AccClause::DeviceType &d) {
536534
}
537535
}
538536

537+
void AccStructureChecker::Enter(const parser::AccClause::Vector &g) {
538+
CheckAllowed(llvm::acc::Clause::ACCC_vector);
539+
CheckAllowedOncePerGroup(
540+
llvm::acc::Clause::ACCC_vector, llvm::acc::Clause::ACCC_device_type);
541+
}
542+
543+
void AccStructureChecker::Enter(const parser::AccClause::Worker &g) {
544+
CheckAllowed(llvm::acc::Clause::ACCC_worker);
545+
CheckAllowedOncePerGroup(
546+
llvm::acc::Clause::ACCC_worker, llvm::acc::Clause::ACCC_device_type);
547+
}
548+
549+
void AccStructureChecker::Enter(const parser::AccClause::Tile &g) {
550+
CheckAllowed(llvm::acc::Clause::ACCC_tile);
551+
CheckAllowedOncePerGroup(
552+
llvm::acc::Clause::ACCC_tile, llvm::acc::Clause::ACCC_device_type);
553+
}
554+
539555
void AccStructureChecker::Enter(const parser::AccClause::Gang &g) {
540556
CheckAllowed(llvm::acc::Clause::ACCC_gang);
557+
CheckAllowedOncePerGroup(
558+
llvm::acc::Clause::ACCC_gang, llvm::acc::Clause::ACCC_device_type);
541559

542560
if (g.v) {
543561
bool hasNum = false;
@@ -665,6 +683,8 @@ void AccStructureChecker::Enter(const parser::AccClause::Self &x) {
665683

666684
void AccStructureChecker::Enter(const parser::AccClause::Collapse &x) {
667685
CheckAllowed(llvm::acc::Clause::ACCC_collapse);
686+
CheckAllowedOncePerGroup(
687+
llvm::acc::Clause::ACCC_collapse, llvm::acc::Clause::ACCC_device_type);
668688
const parser::AccCollapseArg &accCollapseArg = x.v;
669689
const auto &collapseValue{
670690
std::get<parser::ScalarIntConstantExpr>(accCollapseArg.t)};

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

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ program openacc_loop_validity
6363
!$acc end parallel
6464

6565
!$acc parallel
66-
!ERROR: At most one VECTOR clause can appear on the LOOP directive
66+
!ERROR: At most one VECTOR clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause
6767
!$acc loop vector vector(128)
6868
do i = 1, N
6969
a(i) = 3.14
@@ -99,7 +99,7 @@ program openacc_loop_validity
9999
!$acc end parallel
100100

101101
!$acc parallel
102-
!ERROR: At most one WORKER clause can appear on the LOOP directive
102+
!ERROR: At most one WORKER clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause
103103
!$acc loop worker worker(10)
104104
do i = 1, N
105105
a(i) = 3.14
@@ -135,13 +135,29 @@ program openacc_loop_validity
135135
!$acc end parallel
136136

137137
!$acc parallel
138-
!ERROR: At most one GANG clause can appear on the LOOP directive
138+
!ERROR: At most one GANG clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause
139139
!$acc loop gang gang(gang_size)
140140
do i = 1, N
141141
a(i) = 3.14
142142
end do
143143
!$acc end parallel
144144

145+
!$acc loop gang device_type(default) gang(gang_size)
146+
do i = 1, N
147+
a(i) = 3.14
148+
end do
149+
150+
!ERROR: At most one GANG clause can appear on the PARALLEL LOOP directive or in group separated by the DEVICE_TYPE clause
151+
!$acc parallel loop gang gang(gang_size)
152+
do i = 1, N
153+
a(i) = 3.14
154+
end do
155+
156+
!$acc parallel loop gang device_type(default) gang(gang_size)
157+
do i = 1, N
158+
a(i) = 3.14
159+
end do
160+
145161
!$acc parallel
146162
!$acc loop gang(gang_size)
147163
do i = 1, N
@@ -283,4 +299,22 @@ program openacc_loop_validity
283299
end do
284300
!$acc end parallel
285301

302+
!$acc loop gang device_type(nvidia) gang(num: 8)
303+
DO i = 1, n
304+
END DO
305+
306+
!$acc loop vector device_type(default) vector(16)
307+
DO i = 1, n
308+
END DO
309+
310+
!$acc loop worker device_type(*) worker(8)
311+
DO i = 1, n
312+
END DO
313+
314+
!$acc loop device_type(multicore) collapse(2)
315+
DO i = 1, n
316+
DO j = 1, n
317+
END DO
318+
END DO
319+
286320
end program openacc_loop_validity

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

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -391,9 +391,7 @@ def ACC_Loop : Directive<"loop"> {
391391
let allowedClauses = [
392392
VersionedClause<ACCC_DeviceType>,
393393
VersionedClause<ACCC_Private>,
394-
VersionedClause<ACCC_Reduction>
395-
];
396-
let allowedOnceClauses = [
394+
VersionedClause<ACCC_Reduction>,
397395
VersionedClause<ACCC_Collapse>,
398396
VersionedClause<ACCC_Gang>,
399397
VersionedClause<ACCC_Tile>,
@@ -421,15 +419,17 @@ def ACC_Init : Directive<"init"> {
421419

422420
// 2.15.1
423421
def ACC_Routine : Directive<"routine"> {
424-
let allowedOnceClauses = [
422+
let allowedClauses = [
425423
VersionedClause<ACCC_Bind>,
426424
VersionedClause<ACCC_DeviceType>,
427-
VersionedClause<ACCC_NoHost>,
428425
VersionedClause<ACCC_Gang>,
429426
VersionedClause<ACCC_Seq>,
430427
VersionedClause<ACCC_Vector>,
431428
VersionedClause<ACCC_Worker>
432429
];
430+
let allowedOnceClauses = [
431+
VersionedClause<ACCC_NoHost>
432+
];
433433
}
434434

435435
// 2.14.3
@@ -532,32 +532,32 @@ def ACC_HostData : Directive<"host_data"> {
532532
// 2.11
533533
def ACC_KernelsLoop : Directive<"kernels loop"> {
534534
let allowedClauses = [
535+
VersionedClause<ACCC_Attach>,
536+
VersionedClause<ACCC_Collapse>,
535537
VersionedClause<ACCC_Copy>,
536538
VersionedClause<ACCC_Copyin>,
537539
VersionedClause<ACCC_Copyout>,
538540
VersionedClause<ACCC_Create>,
541+
VersionedClause<ACCC_DevicePtr>,
539542
VersionedClause<ACCC_DeviceType>,
543+
VersionedClause<ACCC_Gang>,
540544
VersionedClause<ACCC_NoCreate>,
545+
VersionedClause<ACCC_NumGangs>,
546+
VersionedClause<ACCC_NumWorkers>,
541547
VersionedClause<ACCC_Present>,
542548
VersionedClause<ACCC_Private>,
543549
VersionedClause<ACCC_Reduction>,
544-
VersionedClause<ACCC_DevicePtr>,
545-
VersionedClause<ACCC_Attach>,
546-
VersionedClause<ACCC_Wait>
550+
VersionedClause<ACCC_Tile>,
551+
VersionedClause<ACCC_Vector>,
552+
VersionedClause<ACCC_VectorLength>,
553+
VersionedClause<ACCC_Wait>,
554+
VersionedClause<ACCC_Worker>
547555
];
548556
let allowedOnceClauses = [
549557
VersionedClause<ACCC_Async>,
550-
VersionedClause<ACCC_Collapse>,
551558
VersionedClause<ACCC_Default>,
552-
VersionedClause<ACCC_Gang>,
553559
VersionedClause<ACCC_If>,
554-
VersionedClause<ACCC_NumGangs>,
555-
VersionedClause<ACCC_NumWorkers>,
556-
VersionedClause<ACCC_Self>,
557-
VersionedClause<ACCC_Tile>,
558-
VersionedClause<ACCC_Vector>,
559-
VersionedClause<ACCC_VectorLength>,
560-
VersionedClause<ACCC_Worker>
560+
VersionedClause<ACCC_Self>
561561
];
562562
let allowedExclusiveClauses = [
563563
VersionedClause<ACCC_Auto>,
@@ -570,32 +570,32 @@ def ACC_KernelsLoop : Directive<"kernels loop"> {
570570
def ACC_ParallelLoop : Directive<"parallel loop"> {
571571
let allowedClauses = [
572572
VersionedClause<ACCC_Attach>,
573+
VersionedClause<ACCC_Collapse>,
573574
VersionedClause<ACCC_Copy>,
574575
VersionedClause<ACCC_Copyin>,
575576
VersionedClause<ACCC_Copyout>,
576577
VersionedClause<ACCC_Create>,
577578
VersionedClause<ACCC_DevicePtr>,
578579
VersionedClause<ACCC_DeviceType>,
579580
VersionedClause<ACCC_FirstPrivate>,
581+
VersionedClause<ACCC_Gang>,
580582
VersionedClause<ACCC_NoCreate>,
583+
VersionedClause<ACCC_NumGangs>,
584+
VersionedClause<ACCC_NumWorkers>,
581585
VersionedClause<ACCC_Present>,
582586
VersionedClause<ACCC_Private>,
583587
VersionedClause<ACCC_Reduction>,
584588
VersionedClause<ACCC_Tile>,
585-
VersionedClause<ACCC_Wait>
589+
VersionedClause<ACCC_Vector>,
590+
VersionedClause<ACCC_VectorLength>,
591+
VersionedClause<ACCC_Wait>,
592+
VersionedClause<ACCC_Worker>
586593
];
587594
let allowedOnceClauses = [
588595
VersionedClause<ACCC_Async>,
589-
VersionedClause<ACCC_Collapse>,
590596
VersionedClause<ACCC_Default>,
591-
VersionedClause<ACCC_Gang>,
592597
VersionedClause<ACCC_If>,
593-
VersionedClause<ACCC_NumGangs>,
594-
VersionedClause<ACCC_NumWorkers>,
595-
VersionedClause<ACCC_Self>,
596-
VersionedClause<ACCC_Vector>,
597-
VersionedClause<ACCC_VectorLength>,
598-
VersionedClause<ACCC_Worker>
598+
VersionedClause<ACCC_Self>
599599
];
600600
let allowedExclusiveClauses = [
601601
VersionedClause<ACCC_Auto>,
@@ -608,29 +608,29 @@ def ACC_ParallelLoop : Directive<"parallel loop"> {
608608
def ACC_SerialLoop : Directive<"serial loop"> {
609609
let allowedClauses = [
610610
VersionedClause<ACCC_Attach>,
611+
VersionedClause<ACCC_Collapse>,
611612
VersionedClause<ACCC_Copy>,
612613
VersionedClause<ACCC_Copyin>,
613614
VersionedClause<ACCC_Copyout>,
614615
VersionedClause<ACCC_Create>,
615616
VersionedClause<ACCC_DevicePtr>,
616617
VersionedClause<ACCC_DeviceType>,
617618
VersionedClause<ACCC_FirstPrivate>,
619+
VersionedClause<ACCC_Gang>,
618620
VersionedClause<ACCC_NoCreate>,
619621
VersionedClause<ACCC_Present>,
620622
VersionedClause<ACCC_Private>,
621623
VersionedClause<ACCC_Reduction>,
622-
VersionedClause<ACCC_Wait>
624+
VersionedClause<ACCC_Tile>,
625+
VersionedClause<ACCC_Vector>,
626+
VersionedClause<ACCC_Wait>,
627+
VersionedClause<ACCC_Worker>
623628
];
624629
let allowedOnceClauses = [
625630
VersionedClause<ACCC_Async>,
626-
VersionedClause<ACCC_Collapse>,
627631
VersionedClause<ACCC_Default>,
628-
VersionedClause<ACCC_Gang>,
629632
VersionedClause<ACCC_If>,
630-
VersionedClause<ACCC_Self>,
631-
VersionedClause<ACCC_Tile>,
632-
VersionedClause<ACCC_Vector>,
633-
VersionedClause<ACCC_Worker>
633+
VersionedClause<ACCC_Self>
634634
];
635635
let allowedExclusiveClauses = [
636636
VersionedClause<ACCC_Auto>,

0 commit comments

Comments
 (0)