Skip to content

Commit b7f7e64

Browse files
committed
[OpenACC] Implement 'default' clause for Combined Constructs
This clause takes one of two fixed values, and can apply to all three of the combined constructs. Tests/etc are all exactly like the compute constructs, so committing them all here.
1 parent 8ac46d6 commit b7f7e64

7 files changed

+187
-21
lines changed

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -572,10 +572,12 @@ class SemaOpenACCClauseVisitor {
572572

573573
OpenACCClause *SemaOpenACCClauseVisitor::VisitDefaultClause(
574574
SemaOpenACC::OpenACCParsedClause &Clause) {
575-
// Restrictions only properly implemented on 'compute' constructs, and
576-
// 'compute' constructs are the only construct that can do anything with
577-
// this yet, so skip/treat as unimplemented in this case.
578-
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()))
575+
// Restrictions only properly implemented on 'compute'/'combined' constructs,
576+
// and 'compute'/'combined' constructs are the only construct that can do
577+
// anything with this yet, so skip/treat as unimplemented in this case.
578+
// Only 'data' is left.
579+
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
580+
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
579581
return isNotImplemented();
580582

581583
// Don't add an invalid clause to the AST.

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,14 @@ void foo() {
8686
#pragma acc kernels loop if(i == array[1])
8787
for(int i = 0;i<5;++i);
8888

89+
// CHECK: #pragma acc parallel loop default(none)
90+
// CHECK-NEXT: for (int i = 0; i < 5; ++i)
91+
// CHECK-NEXT: ;
92+
#pragma acc parallel loop default(none)
93+
for(int i = 0;i<5;++i);
94+
// CHECK: #pragma acc serial loop default(present)
95+
// CHECK-NEXT: for (int i = 0; i < 5; ++i)
96+
// CHECK-NEXT: ;
97+
#pragma acc serial loop default(present)
98+
for(int i = 0;i<5;++i);
8999
}

clang/test/SemaOpenACC/combined-construct-auto_seq_independent-clauses.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ void uses() {
5656
// expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}}
5757
#pragma acc parallel loop auto nohost
5858
for(unsigned i = 0; i < 5; ++i);
59-
// TODOexpected-error@+1{{OpenACC clause 'default' not yet implemented, clause ignored}}
60-
// expected-warning@+1{{OpenACC clause 'default' not yet implemented}}
6159
#pragma acc parallel loop auto default(none)
6260
for(unsigned i = 0; i < 5; ++i);
6361
#pragma acc parallel loop auto if(1)
@@ -226,8 +224,6 @@ void uses() {
226224
// expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}}
227225
#pragma acc parallel loop nohost auto
228226
for(unsigned i = 0; i < 5; ++i);
229-
// TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}}
230-
// expected-warning@+1{{OpenACC clause 'default' not yet implemented}}
231227
#pragma acc parallel loop default(none) auto
232228
for(unsigned i = 0; i < 5; ++i);
233229
#pragma acc parallel loop if(1) auto
@@ -397,8 +393,6 @@ void uses() {
397393
// expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}}
398394
#pragma acc parallel loop independent nohost
399395
for(unsigned i = 0; i < 5; ++i);
400-
// TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}}
401-
// expected-warning@+1{{OpenACC clause 'default' not yet implemented}}
402396
#pragma acc parallel loop independent default(none)
403397
for(unsigned i = 0; i < 5; ++i);
404398
#pragma acc parallel loop independent if(1)
@@ -567,8 +561,6 @@ void uses() {
567561
// expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}}
568562
#pragma acc parallel loop nohost independent
569563
for(unsigned i = 0; i < 5; ++i);
570-
// TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}}
571-
// expected-warning@+1{{OpenACC clause 'default' not yet implemented}}
572564
#pragma acc parallel loop default(none) independent
573565
for(unsigned i = 0; i < 5; ++i);
574566
#pragma acc parallel loop if(1) independent
@@ -744,8 +736,6 @@ void uses() {
744736
// expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}}
745737
#pragma acc parallel loop seq nohost
746738
for(unsigned i = 0; i < 5; ++i);
747-
// TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}}
748-
// expected-warning@+1{{OpenACC clause 'default' not yet implemented}}
749739
#pragma acc parallel loop seq default(none)
750740
for(unsigned i = 0; i < 5; ++i);
751741
#pragma acc parallel loop seq if(1)
@@ -920,8 +910,6 @@ void uses() {
920910
// expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}}
921911
#pragma acc parallel loop nohost seq
922912
for(unsigned i = 0; i < 5; ++i);
923-
// TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}}
924-
// expected-warning@+1{{OpenACC clause 'default' not yet implemented}}
925913
#pragma acc parallel loop default(none) seq
926914
for(unsigned i = 0; i < 5; ++i);
927915
#pragma acc parallel loop if(1) seq
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
2+
// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
3+
4+
// Test this with PCH.
5+
// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
6+
// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
7+
8+
#ifndef PCH_HELPER
9+
#define PCH_HELPER
10+
void NormalFunc() {
11+
// CHECK-LABEL: NormalFunc
12+
// CHECK-NEXT: CompoundStmt
13+
// CHECK-NEXT: OpenACCCombinedConstruct {{.*}}parallel loop
14+
// CHECK-NEXT: default(none)
15+
#pragma acc parallel loop default(none)
16+
for (unsigned I = 0; I < 5; ++I) {
17+
#pragma acc kernels loop
18+
for (unsigned J = 0; J < 5; ++J) {
19+
}
20+
// CHECK: OpenACCCombinedConstruct {{.*}}kernels loop
21+
// CHECK: OpenACCCombinedConstruct {{.*}}serial loop
22+
// CHECK-NEXT: default(present)
23+
#pragma acc serial loop default(present)
24+
for (unsigned J = 0; J < 5; ++J) {
25+
}
26+
}
27+
}
28+
template<typename T>
29+
void TemplFunc() {
30+
#pragma acc parallel loop default(none)
31+
for (unsigned i = 0; i < 5; ++i) {
32+
typename T::type I;
33+
}
34+
35+
#pragma acc serial loop default(present)
36+
for (unsigned i = 0; i < 5; ++i) {
37+
typename T::type I;
38+
}
39+
40+
// CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc
41+
// CHECK-NEXT: TemplateTypeParmDecl
42+
43+
// Template Pattern:
44+
// CHECK-NEXT: FunctionDecl
45+
// CHECK-NEXT: CompoundStmt
46+
// CHECK-NEXT: OpenACCCombinedConstruct {{.*}}parallel loop
47+
// CHECK-NEXT: default(none)
48+
// CHECK: VarDecl{{.*}} I 'typename T::type'
49+
50+
// CHECK-NEXT: OpenACCCombinedConstruct {{.*}}serial loop
51+
// CHECK-NEXT: default(present)
52+
// CHECK: VarDecl{{.*}} I 'typename T::type'
53+
54+
// Check instantiation.
55+
// CHECK-LABEL: FunctionDecl{{.*}} used TemplFunc 'void ()' implicit_instantiation
56+
// CHECK-NEXT: TemplateArgument type 'S'
57+
// CHECK-NEXT: RecordType
58+
// CHECK-NEXT: CXXRecord
59+
// CHECK-NEXT: CompoundStmt
60+
// CHECK-NEXT: OpenACCCombinedConstruct {{.*}}parallel loop
61+
// CHECK-NEXT: default(none)
62+
// CHECK: VarDecl{{.*}} I 'typename S::type':'int'
63+
// CHECK-NEXT: OpenACCCombinedConstruct {{.*}}serial loop
64+
// CHECK-NEXT: default(present)
65+
// CHECK: VarDecl{{.*}} I 'typename S::type':'int'
66+
67+
}
68+
struct S {
69+
using type = int;
70+
};
71+
72+
void use() {
73+
TemplFunc<S>();
74+
}
75+
76+
#endif
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
void SingleOnly() {
4+
#pragma acc parallel loop default(none)
5+
for(int i = 5; i < 10;++i);
6+
7+
// expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'serial loop' directive}}
8+
// expected-note@+1{{previous clause is here}}
9+
#pragma acc serial loop default(present) self default(none)
10+
for(int i = 5; i < 10;++i);
11+
12+
int i;
13+
14+
// expected-warning@+4{{OpenACC clause 'copy' not yet implemented}}
15+
// expected-warning@+3{{OpenACC clause 'present' not yet implemented}}
16+
// expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'kernels loop' directive}}
17+
// expected-note@+1{{previous clause is here}}
18+
#pragma acc kernels loop self default(present) present(i) default(none) copy(i)
19+
for(int i = 5; i < 10;++i);
20+
21+
// expected-warning@+4{{OpenACC clause 'private' not yet implemented}}
22+
// expected-warning@+3{{OpenACC clause 'copy' not yet implemented}}
23+
// expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'parallel loop' directive}}
24+
// expected-note@+1{{previous clause is here}}
25+
#pragma acc parallel loop self default(present) private(i) default(none) copy(i)
26+
for(int i = 0; i < 5; ++i);
27+
28+
// expected-error@+1{{expected '('}}
29+
#pragma acc serial loop self default private(i) default(none) if(i)
30+
for(int i = 0; i < 5; ++i);
31+
32+
#pragma acc kernels loop default(none)
33+
for(int i = 0; i < 5; ++i);
34+
35+
// expected-warning@+2{{OpenACC construct 'data' not yet implemented}}
36+
// expected-warning@+1{{OpenACC clause 'default' not yet implemented}}
37+
#pragma acc data default(none)
38+
while(0);
39+
40+
// expected-error@+1{{OpenACC 'default' clause is not valid on 'loop' directive}}
41+
#pragma acc loop default(none)
42+
for(int i = 5; i < 10;++i);
43+
44+
// expected-warning@+2{{OpenACC construct 'wait' not yet implemented}}
45+
// expected-error@+1{{OpenACC 'default' clause is not valid on 'wait' directive}}
46+
#pragma acc wait default(none)
47+
while(0);
48+
49+
// expected-error@+1{{OpenACC 'default' clause is not valid on 'loop' directive}}
50+
#pragma acc loop default(present)
51+
for(int i = 5; i < 10;++i);
52+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
template<typename T>
4+
void SingleOnly() {
5+
#pragma acc parallel loop default(none)
6+
for (unsigned I = 0; I < 5; ++I);
7+
8+
int i;
9+
10+
// expected-warning@+3{{OpenACC clause 'async' not yet implemented, clause ignored}}
11+
// expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'parallel loop' directive}}
12+
// expected-note@+1{{previous clause is here}}
13+
#pragma acc parallel loop default(present) async default(none)
14+
for (unsigned I = 0; I < 5; ++I);
15+
16+
// expected-warning@+4{{OpenACC clause 'copy' not yet implemented, clause ignored}}
17+
// expected-warning@+3{{OpenACC clause 'async' not yet implemented, clause ignored}}
18+
// expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'serial loop' directive}}
19+
// expected-note@+1{{previous clause is here}}
20+
#pragma acc serial loop async default(present) copy(i) default(none) self
21+
for (unsigned I = 0; I < 5; ++I);
22+
23+
// expected-warning@+4{{OpenACC clause 'copy' not yet implemented, clause ignored}}
24+
// expected-warning@+3{{OpenACC clause 'async' not yet implemented, clause ignored}}
25+
// expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'kernels loop' directive}}
26+
// expected-note@+1{{previous clause is here}}
27+
#pragma acc kernels loop async default(present) copy(i) default(none) self
28+
for (unsigned I = 0; I < 5; ++I);
29+
30+
// expected-warning@+3{{OpenACC clause 'copy' not yet implemented, clause ignored}}
31+
// expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}}
32+
// expected-error@+1{{expected '('}}
33+
#pragma acc parallel loop async default(none) copy(i) default self
34+
for (unsigned I = 0; I < 5; ++I);
35+
}
36+
37+
void Instantiate() {
38+
SingleOnly<int>();
39+
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@ void SingleOnly() {
1616
#pragma acc kernels self default(present) present(i) default(none) copy(i)
1717
while(0);
1818

19-
// expected-warning@+4{{OpenACC clause 'default' not yet implemented}}
20-
// expected-warning@+3{{OpenACC clause 'private' not yet implemented}}
21-
// expected-warning@+2{{OpenACC clause 'default' not yet implemented}}
22-
// expected-warning@+1{{OpenACC clause 'copy' not yet implemented}}
19+
// expected-warning@+4{{OpenACC clause 'private' not yet implemented}}
20+
// expected-warning@+3{{OpenACC clause 'copy' not yet implemented}}
21+
// expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'parallel loop' directive}}
22+
// expected-note@+1{{previous clause is here}}
2323
#pragma acc parallel loop self default(present) private(i) default(none) copy(i)
2424
for(int i = 0; i < 5; ++i);
2525

2626
// expected-error@+1{{expected '('}}
2727
#pragma acc serial loop self default private(i) default(none) if(i)
2828
for(int i = 0; i < 5; ++i);
2929

30-
// expected-warning@+1{{OpenACC clause 'default' not yet implemented}}
3130
#pragma acc kernels loop default(none)
3231
for(int i = 0; i < 5; ++i);
3332

0 commit comments

Comments
 (0)