Skip to content

Commit 0a2b6f6

Browse files
committed
[OpenACC] Fix 'copyout' allowed modifiers alwaysin vs alwaysout
While doing lowering, I discovered that the restriction onthe allowed modifiers for 'copyout' didn't make sense! After discussion on the OpenACC standards mailing list I discovered that this was a copy/paste error during standardization that they intend to fix, and really meant for copyout to allow alwaysout instead of alwaysin. When implementing, I blindly followed the standard :) This patch corrects the implementation to do what was meant.
1 parent 0b8a656 commit 0a2b6f6

9 files changed

+38
-35
lines changed

clang/lib/Sema/SemaOpenACCClause.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,8 @@ class SemaOpenACCClauseVisitor {
231231
case OpenACCClauseKind::PCopyOut:
232232
case OpenACCClauseKind::PresentOrCopyOut:
233233
// COPYOUT: Capture only struct.data & compute
234-
return Check(OpenACCModifierKind::Always | OpenACCModifierKind::AlwaysIn |
235-
OpenACCModifierKind::Zero |
234+
return Check(OpenACCModifierKind::Always |
235+
OpenACCModifierKind::AlwaysOut | OpenACCModifierKind::Zero |
236236
(IsStructuredDataOrCompute ? OpenACCModifierKind::Capture
237237
: OpenACCModifierKind::Invalid));
238238
case OpenACCClauseKind::Create:

clang/test/AST/ast-print-openacc-combined-construct.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ void foo() {
179179
#pragma acc parallel loop copyin(i, array[1], array, array[1:2]) pcopyin(readonly:i, array[1], array, array[1:2]) present_or_copyin(always, alwaysin: i, array[1], array, array[1:2])
180180
for(int i = 0;i<5;++i);
181181

182-
// CHECK: #pragma acc parallel loop copyout(i, array[1], array, array[1:2]) pcopyout(zero: i, array[1], array, array[1:2]) present_or_copyout(always, alwaysin: i, array[1], array, array[1:2])
183-
#pragma acc parallel loop copyout(i, array[1], array, array[1:2]) pcopyout(zero: i, array[1], array, array[1:2]) present_or_copyout(always, alwaysin: i, array[1], array, array[1:2])
182+
// CHECK: #pragma acc parallel loop copyout(i, array[1], array, array[1:2]) pcopyout(zero: i, array[1], array, array[1:2]) present_or_copyout(always, alwaysout: i, array[1], array, array[1:2])
183+
#pragma acc parallel loop copyout(i, array[1], array, array[1:2]) pcopyout(zero: i, array[1], array, array[1:2]) present_or_copyout(always, alwaysout: i, array[1], array, array[1:2])
184184
for(int i = 0;i<5;++i);
185185

186186
// CHECK: #pragma acc parallel loop create(i, array[1], array, array[1:2]) pcreate(zero: i, array[1], array, array[1:2]) present_or_create(i, array[1], array, array[1:2])

clang/test/SemaOpenACC/combined-construct-copyout-ast.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ void NormalUses(float *PointerParam) {
1414
// CHECK: ParmVarDecl
1515
// CHECK-NEXT: CompoundStmt
1616

17-
#pragma acc parallel loop copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(always, alwaysin: Global)
17+
#pragma acc parallel loop copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(always, alwaysout: Global)
1818
for (unsigned i = 0; i < 5; ++i);
1919
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
2020
// CHECK-NEXT: copyout clause
@@ -25,7 +25,7 @@ void NormalUses(float *PointerParam) {
2525
// CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
2626
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
2727
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
28-
// CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysin
28+
// CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysout
2929
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
3030
// CHECK-NEXT: For
3131
// CHECK: NullStmt
@@ -42,10 +42,10 @@ void TemplUses(T t, U u) {
4242
// CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
4343
// CHECK-NEXT: CompoundStmt
4444

45-
#pragma acc parallel loop copyout(always, alwaysin: t) pcopyout(zero: NTTP, u) present_or_copyout(u[0:t])
45+
#pragma acc parallel loop copyout(always, alwaysout: t) pcopyout(zero: NTTP, u) present_or_copyout(u[0:t])
4646
for (unsigned i = 0; i < 5; ++i);
4747
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
48-
// CHECK-NEXT: copyout clause modifiers: always, alwaysin
48+
// CHECK-NEXT: copyout clause modifiers: always, alwaysout
4949
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
5050
// CHECK-NEXT: pcopyout clause modifiers: zero
5151
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
@@ -73,7 +73,7 @@ void TemplUses(T t, U u) {
7373

7474
// #pragma acc parallel copyout(t) pcopyout(zero: NTTP, u) present_or_copyout(u[0:t])
7575
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
76-
// CHECK-NEXT: copyout clause modifiers: always, alwaysin
76+
// CHECK-NEXT: copyout clause modifiers: always, alwaysout
7777
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
7878
// CHECK-NEXT: pcopyout clause modifiers: zero
7979
// CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue

clang/test/SemaOpenACC/combined-construct-copyout-clause.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,19 +78,19 @@ void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete Compo
7878
}
7979
void ModList() {
8080
int V1;
81-
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
81+
// expected-error@+2{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
8282
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
8383
#pragma acc parallel loop copyout(always, alwaysin, alwaysout, zero, readonly: V1)
8484
for(int i = 0; i < 6;++i);
85-
// expected-error@+1{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
86-
#pragma acc serial loop copyout(alwaysout: V1)
85+
// expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
86+
#pragma acc serial loop copyout(alwaysin: V1)
8787
for(int i = 0; i < 6;++i);
8888
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
8989
#pragma acc kernels loop copyout(readonly: V1)
9090
for(int i = 0; i < 6;++i);
9191
#pragma acc parallel loop copyout(capture:V1)
9292
for(int i = 5; i < 10;++i);
93-
#pragma acc parallel loop copyout(always, alwaysin, zero, capture: V1)
93+
#pragma acc parallel loop copyout(always, alwaysout, zero, capture: V1)
9494
for(int i = 5; i < 10;++i);
9595
}
9696

clang/test/SemaOpenACC/compute-construct-copyout-clause.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,18 +78,18 @@ void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete Compo
7878
}
7979
void ModList() {
8080
int V1;
81-
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
81+
// expected-error@+2{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
8282
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
8383
#pragma acc parallel copyout(always, alwaysin, alwaysout, zero, readonly: V1)
8484
for(int i = 0; i < 6;++i);
85-
// expected-error@+1{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
86-
#pragma acc serial copyout(alwaysout: V1)
85+
// expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
86+
#pragma acc serial copyout(alwaysin: V1)
8787
for(int i = 0; i < 6;++i);
8888
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
8989
#pragma acc kernels copyout(readonly: V1)
9090
for(int i = 0; i < 6;++i);
9191
#pragma acc parallel copyout(capture:V1)
9292
for(int i = 5; i < 10;++i);
93-
#pragma acc parallel copyout(always, alwaysin, zero, capture: V1)
93+
#pragma acc parallel copyout(always, alwaysout, zero, capture: V1)
9494
for(int i = 5; i < 10;++i);
9595
}

clang/test/SemaOpenACC/compute-construct-varlist-ast.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void NormalUses(float *PointerParam) {
133133
// CHECK-NEXT: CXXBoolLiteralExpr
134134
// CHECK-NEXT: NullStmt
135135

136-
#pragma acc parallel copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(always, alwaysin: Global)
136+
#pragma acc parallel copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(always, alwaysout: Global)
137137
while(true);
138138
// CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
139139
// CHECK-NEXT: copyout clause
@@ -144,7 +144,7 @@ void NormalUses(float *PointerParam) {
144144
// CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
145145
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
146146
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
147-
// CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysin
147+
// CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysout
148148
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
149149
// CHECK-NEXT: WhileStmt
150150
// CHECK-NEXT: CXXBoolLiteralExpr
@@ -363,15 +363,15 @@ void TemplUses(T t, U u, T*PointerParam) {
363363
// CHECK-NEXT: CXXBoolLiteralExpr
364364
// CHECK-NEXT: NullStmt
365365

366-
#pragma acc parallel copyout(t) pcopyout(zero:NTTP, u) present_or_copyout(always, alwaysin: u[0:t])
366+
#pragma acc parallel copyout(t) pcopyout(zero:NTTP, u) present_or_copyout(always, alwaysout: u[0:t])
367367
while(true);
368368
// CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
369369
// CHECK-NEXT: copyout clause
370370
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
371371
// CHECK-NEXT: pcopyout clause modifiers: zero
372372
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
373373
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
374-
// CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysin
374+
// CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysout
375375
// CHECK-NEXT: ArraySectionExpr
376376
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
377377
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
@@ -569,7 +569,7 @@ void TemplUses(T t, U u, T*PointerParam) {
569569
// CHECK-NEXT: CXXBoolLiteralExpr
570570
// CHECK-NEXT: NullStmt
571571

572-
// #pragma acc parallel copyout(t) pcopyout(zero:NTTP, u) present_or_copyout(always, alwaysin: u[0:t])
572+
// #pragma acc parallel copyout(t) pcopyout(zero:NTTP, u) present_or_copyout(always, alwaysout: u[0:t])
573573
// CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
574574
// CHECK-NEXT: copyout clause
575575
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
@@ -578,7 +578,7 @@ void TemplUses(T t, U u, T*PointerParam) {
578578
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
579579
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
580580
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
581-
// CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysin
581+
// CHECK-NEXT: present_or_copyout clause modifiers: always, alwaysout
582582
// CHECK-NEXT: ArraySectionExpr
583583
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
584584
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'

clang/test/SemaOpenACC/data-construct-copyout-ast.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ void TemplUses(T t, U u) {
5454
// CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
5555
// CHECK-NEXT: CompoundStmt
5656

57-
#pragma acc data copyout(t) pcopyout(zero: NTTP, u) present_or_copyout(alwaysin: u[0:t])
57+
#pragma acc data copyout(t) pcopyout(zero: NTTP, u) present_or_copyout(alwaysout: u[0:t])
5858
;
5959
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
6060
// CHECK-NEXT: copyout clause
6161
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
6262
// CHECK-NEXT: pcopyout clause modifiers: zero
6363
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
6464
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
65-
// CHECK-NEXT: present_or_copyout clause modifiers: alwaysin
65+
// CHECK-NEXT: present_or_copyout clause modifiers: alwaysout
6666
// CHECK-NEXT: ArraySectionExpr
6767
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
6868
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
@@ -103,7 +103,7 @@ void TemplUses(T t, U u) {
103103
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
104104
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
105105
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
106-
// CHECK-NEXT: present_or_copyout clause modifiers: alwaysin
106+
// CHECK-NEXT: present_or_copyout clause modifiers: alwaysout
107107
// CHECK-NEXT: ArraySectionExpr
108108
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
109109
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'

clang/test/SemaOpenACC/data-construct-copyout-clause.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,20 +74,22 @@ void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete Compo
7474

7575
void ModList() {
7676
int V1;
77-
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
77+
// expected-error@+2{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
7878
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
7979
#pragma acc data copyout(always, alwaysin, alwaysout, zero, readonly: V1)
80-
// expected-error@+1{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
80+
// expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
81+
#pragma acc data copyout(alwaysin: V1)
8182
#pragma acc data copyout(alwaysout: V1)
8283
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
8384
#pragma acc data copyout(readonly: V1)
8485
#pragma acc data copyout(capture: V1)
85-
#pragma acc data copyout(always, alwaysin, zero, capture: V1)
86+
#pragma acc data copyout(always, alwaysout, zero, capture: V1)
8687

87-
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
88+
// expected-error@+2{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
8889
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
8990
#pragma acc exit data copyout(always, alwaysin, alwaysout, zero, readonly: V1)
90-
// expected-error@+1{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
91+
// expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
92+
#pragma acc exit data copyout(alwaysin: V1)
9193
#pragma acc exit data copyout(alwaysout: V1)
9294
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
9395
#pragma acc exit data copyout(readonly: V1)

clang/test/SemaOpenACC/declare-construct.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -331,17 +331,18 @@ void ModList() {
331331
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyin' clause}}
332332
#pragma acc declare copyin(always, alwaysin, readonly, capture: V8)
333333

334-
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
334+
// expected-error@+2{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
335335
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
336336
#pragma acc declare copyout(always, alwaysin, alwaysout, zero, readonly: V9)
337-
// expected-error@+1{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
338-
#pragma acc declare copyout(alwaysout: V10)
337+
// expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
338+
#pragma acc declare copyout(alwaysin: V10)
339339
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
340340
#pragma acc declare copyout(readonly: V11)
341341
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyout' clause}}
342342
#pragma acc declare copyout(capture: V11B)
343+
// expected-error@+2{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}
343344
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyout' clause}}
344-
#pragma acc declare copyout(always, alwaysin, zero, capture: V12)
345+
#pragma acc declare copyout(always, alwaysin, alwaysout, zero, capture: V12)
345346

346347
// expected-error@+5{{OpenACC 'always' modifier not valid on 'create' clause}}
347348
// expected-error@+4{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}

0 commit comments

Comments
 (0)