Skip to content

Commit 6b2de10

Browse files
committed
[OpenACC] implement 'device_type' for combined constructs
This clause is pretty small/doesn't do much semantic-analysis-wise, , other than have two spellings and disallow certain clauses after it. However, as most of those aren't implemented yet, the diagnostic is left as a TODO.
1 parent 67fb268 commit 6b2de10

11 files changed

+514
-57
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12686,7 +12686,7 @@ def err_acc_var_not_pointer_type
1268612686
def note_acc_expected_pointer_var : Note<"expected variable of pointer type">;
1268712687
def err_acc_clause_after_device_type
1268812688
: Error<"OpenACC clause '%0' may not follow a '%1' clause in a "
12689-
"%select{'%3'|compute}2 construct">;
12689+
"'%2' construct">;
1269012690
def err_acc_clause_cannot_combine
1269112691
: Error<"OpenACC clause '%0' may not appear on the same construct as a "
1269212692
"'%1' clause on a '%2' construct">;

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,6 @@ bool checkValidAfterDeviceType(
502502
}
503503
S.Diag(NewClause.getBeginLoc(), diag::err_acc_clause_after_device_type)
504504
<< NewClause.getClauseKind() << DeviceTypeClause.getClauseKind()
505-
<< isOpenACCComputeDirectiveKind(NewClause.getDirectiveKind())
506505
<< NewClause.getDirectiveKind();
507506
S.Diag(DeviceTypeClause.getBeginLoc(), diag::note_acc_previous_clause_here);
508507
return true;
@@ -999,12 +998,13 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitWaitClause(
999998

1000999
OpenACCClause *SemaOpenACCClauseVisitor::VisitDeviceTypeClause(
10011000
SemaOpenACC::OpenACCParsedClause &Clause) {
1002-
// Restrictions only properly implemented on 'compute' and 'loop'
1003-
// constructs, and 'compute'/'loop' constructs are the only construct that
1004-
// can do anything with this yet, so skip/treat as unimplemented in this
1005-
// case.
1001+
// Restrictions only properly implemented on 'compute', 'combined', and
1002+
// 'loop' constructs, and 'compute'/'combined'/'loop' constructs are the only
1003+
// construct that can do anything with this yet, so skip/treat as
1004+
// unimplemented in this case.
10061005
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
1007-
Clause.getDirectiveKind() != OpenACCDirectiveKind::Loop)
1006+
Clause.getDirectiveKind() != OpenACCDirectiveKind::Loop &&
1007+
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
10081008
return isNotImplemented();
10091009

10101010
// TODO OpenACC: Once we get enough of the CodeGen implemented that we have

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,45 @@ void foo() {
3131
// CHECK-NEXT: ;
3232
#pragma acc kernels loop independent
3333
for(int i = 0;i<5;++i);
34+
35+
bool SomeB;
36+
struct SomeStruct{} SomeStructImpl;
37+
38+
//CHECK: #pragma acc parallel loop dtype(SomeB)
39+
// CHECK-NEXT: for (int i = 0; i < 5; ++i)
40+
// CHECK-NEXT: ;
41+
#pragma acc parallel loop dtype(SomeB)
42+
for(int i = 0;i<5;++i);
43+
44+
//CHECK: #pragma acc serial loop device_type(SomeStruct)
45+
// CHECK-NEXT: for (int i = 0; i < 5; ++i)
46+
// CHECK-NEXT: ;
47+
#pragma acc serial loop device_type(SomeStruct)
48+
for(int i = 0;i<5;++i);
49+
50+
//CHECK: #pragma acc kernels loop device_type(int)
51+
// CHECK-NEXT: for (int i = 0; i < 5; ++i)
52+
// CHECK-NEXT: ;
53+
#pragma acc kernels loop device_type(int)
54+
for(int i = 0;i<5;++i);
55+
56+
//CHECK: #pragma acc parallel loop dtype(bool)
57+
// CHECK-NEXT: for (int i = 0; i < 5; ++i)
58+
// CHECK-NEXT: ;
59+
#pragma acc parallel loop dtype(bool)
60+
for(int i = 0;i<5;++i);
61+
62+
//CHECK: #pragma acc serial loop device_type(SomeStructImpl)
63+
// CHECK-NEXT: for (int i = 0; i < 5; ++i)
64+
// CHECK-NEXT: ;
65+
#pragma acc serial loop device_type (SomeStructImpl)
66+
for(int i = 0;i<5;++i);
67+
68+
// CHECK: #pragma acc kernels loop dtype(AnotherIdent)
69+
// CHECK-NEXT: for (int i = 0; i < 5; ++i)
70+
// CHECK-NEXT: ;
71+
#pragma acc kernels loop dtype(AnotherIdent)
72+
for(int i = 0;i<5;++i);
73+
74+
3475
}

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,8 @@ void uses() {
195195
// expected-warning@+1{{OpenACC clause 'default_async' not yet implemented}}
196196
#pragma acc parallel loop auto default_async(1)
197197
for(unsigned i = 0; i < 5; ++i);
198-
// expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}}
199198
#pragma acc parallel loop auto device_type(*)
200199
for(unsigned i = 0; i < 5; ++i);
201-
// expected-warning@+1{{OpenACC clause 'dtype' not yet implemented}}
202200
#pragma acc parallel loop auto dtype(*)
203201
for(unsigned i = 0; i < 5; ++i);
204202
// TODOexpected-error@+1{{OpenACC 'async' clause is not valid on 'parallel loop' directive}}
@@ -371,10 +369,8 @@ void uses() {
371369
// expected-warning@+1{{OpenACC clause 'default_async' not yet implemented}}
372370
#pragma acc parallel loop default_async(1) auto
373371
for(unsigned i = 0; i < 5; ++i);
374-
// expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}}
375372
#pragma acc parallel loop device_type(*) auto
376373
for(unsigned i = 0; i < 5; ++i);
377-
// expected-warning@+1{{OpenACC clause 'dtype' not yet implemented}}
378374
#pragma acc parallel loop dtype(*) auto
379375
for(unsigned i = 0; i < 5; ++i);
380376
// TODOexpected-error@+1{{OpenACC 'async' clause is not valid on 'parallel loop' directive}}
@@ -548,10 +544,8 @@ void uses() {
548544
// expected-warning@+1{{OpenACC clause 'default_async' not yet implemented}}
549545
#pragma acc parallel loop independent default_async(1)
550546
for(unsigned i = 0; i < 5; ++i);
551-
// expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}}
552547
#pragma acc parallel loop independent device_type(*)
553548
for(unsigned i = 0; i < 5; ++i);
554-
// expected-warning@+1{{OpenACC clause 'dtype' not yet implemented}}
555549
#pragma acc parallel loop independent dtype(*)
556550
for(unsigned i = 0; i < 5; ++i);
557551
// TODOexpected-error@+1{{OpenACC 'async' clause is not valid on 'parallel loop' directive}}
@@ -724,10 +718,8 @@ void uses() {
724718
// expected-warning@+1{{OpenACC clause 'default_async' not yet implemented}}
725719
#pragma acc parallel loop default_async(1) independent
726720
for(unsigned i = 0; i < 5; ++i);
727-
// expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}}
728721
#pragma acc parallel loop device_type(*) independent
729722
for(unsigned i = 0; i < 5; ++i);
730-
// expected-warning@+1{{OpenACC clause 'dtype' not yet implemented}}
731723
#pragma acc parallel loop dtype(*) independent
732724
for(unsigned i = 0; i < 5; ++i);
733725
// TODOexpected-error@+1{{OpenACC 'async' clause is not valid on 'parallel loop' directive}}
@@ -907,10 +899,8 @@ void uses() {
907899
// expected-warning@+1{{OpenACC clause 'default_async' not yet implemented}}
908900
#pragma acc parallel loop seq default_async(1)
909901
for(unsigned i = 0; i < 5; ++i);
910-
// expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}}
911902
#pragma acc parallel loop seq device_type(*)
912903
for(unsigned i = 0; i < 5; ++i);
913-
// expected-warning@+1{{OpenACC clause 'dtype' not yet implemented}}
914904
#pragma acc parallel loop seq dtype(*)
915905
for(unsigned i = 0; i < 5; ++i);
916906
// TODOexpected-error@+1{{OpenACC 'async' clause is not valid on 'parallel loop' directive}}
@@ -1089,10 +1079,8 @@ void uses() {
10891079
// expected-warning@+1{{OpenACC clause 'default_async' not yet implemented}}
10901080
#pragma acc parallel loop default_async(1) seq
10911081
for(unsigned i = 0; i < 5; ++i);
1092-
// expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}}
10931082
#pragma acc parallel loop device_type(*) seq
10941083
for(unsigned i = 0; i < 5; ++i);
1095-
// expected-warning@+1{{OpenACC clause 'dtype' not yet implemented}}
10961084
#pragma acc parallel loop dtype(*) seq
10971085
for(unsigned i = 0; i < 5; ++i);
10981086
// TODOexpected-error@+1{{OpenACC 'async' clause is not valid on 'parallel loop' directive}}
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
2+
3+
// Test this with PCH.
4+
// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
5+
// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
6+
#ifndef PCH_HELPER
7+
#define PCH_HELPER
8+
9+
struct SomeS{};
10+
void NormalUses() {
11+
// CHECK: FunctionDecl{{.*}}NormalUses
12+
// CHECK-NEXT: CompoundStmt
13+
14+
SomeS SomeImpl;
15+
// CHECK-NEXT: DeclStmt
16+
// CHECK-NEXT: VarDecl{{.*}} SomeImpl 'SomeS'
17+
// CHECK-NEXT: CXXConstructExpr
18+
bool SomeVar;
19+
// CHECK-NEXT: DeclStmt
20+
// CHECK-NEXT: VarDecl{{.*}} SomeVar 'bool'
21+
22+
#pragma acc parallel loop device_type(SomeS) dtype(SomeImpl)
23+
for(int i = 0; i < 5; ++i){}
24+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
25+
// CHECK-NEXT: device_type(SomeS)
26+
// CHECK-NEXT: dtype(SomeImpl)
27+
// CHECK-NEXT: ForStmt
28+
// CHECK-NEXT: DeclStmt
29+
// CHECK-NEXT: VarDecl{{.*}} i 'int'
30+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
31+
// CHECK-NEXT: <<<NULL>>>
32+
// CHECK-NEXT: BinaryOperator{{.*}}'<'
33+
// CHECK-NEXT: ImplicitCastExpr
34+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
35+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
36+
// CHECK-NEXT: UnaryOperator{{.*}}++
37+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
38+
// CHECK-NEXT: CompoundStmt
39+
#pragma acc serial loop device_type(SomeVar) dtype(int)
40+
for(int i = 0; i < 5; ++i){}
41+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop
42+
// CHECK-NEXT: device_type(SomeVar)
43+
// CHECK-NEXT: dtype(int)
44+
// CHECK-NEXT: ForStmt
45+
// CHECK-NEXT: DeclStmt
46+
// CHECK-NEXT: VarDecl{{.*}} i 'int'
47+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
48+
// CHECK-NEXT: <<<NULL>>>
49+
// CHECK-NEXT: BinaryOperator{{.*}}'<'
50+
// CHECK-NEXT: ImplicitCastExpr
51+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
52+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
53+
// CHECK-NEXT: UnaryOperator{{.*}}++
54+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
55+
// CHECK-NEXT: CompoundStmt
56+
#pragma acc kernels loop device_type(private) dtype(struct)
57+
for(int i = 0; i < 5; ++i){}
58+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
59+
// CHECK-NEXT: device_type(private)
60+
// CHECK-NEXT: dtype(struct)
61+
// CHECK-NEXT: ForStmt
62+
// CHECK-NEXT: DeclStmt
63+
// CHECK-NEXT: VarDecl{{.*}} i 'int'
64+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
65+
// CHECK-NEXT: <<<NULL>>>
66+
// CHECK-NEXT: BinaryOperator{{.*}}'<'
67+
// CHECK-NEXT: ImplicitCastExpr
68+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
69+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
70+
// CHECK-NEXT: UnaryOperator{{.*}}++
71+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
72+
// CHECK-NEXT: CompoundStmt
73+
#pragma acc parallel loop device_type(private) dtype(class)
74+
for(int i = 0; i < 5; ++i){}
75+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
76+
// CHECK-NEXT: device_type(private)
77+
// CHECK-NEXT: dtype(class)
78+
// CHECK-NEXT: ForStmt
79+
// CHECK-NEXT: DeclStmt
80+
// CHECK-NEXT: VarDecl{{.*}} i 'int'
81+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
82+
// CHECK-NEXT: <<<NULL>>>
83+
// CHECK-NEXT: BinaryOperator{{.*}}'<'
84+
// CHECK-NEXT: ImplicitCastExpr
85+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
86+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
87+
// CHECK-NEXT: UnaryOperator{{.*}}++
88+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
89+
// CHECK-NEXT: CompoundStmt
90+
#pragma acc serial loop device_type(float) dtype(*)
91+
for(int i = 0; i < 5; ++i){}
92+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop
93+
// CHECK-NEXT: device_type(float)
94+
// CHECK-NEXT: dtype(*)
95+
// CHECK-NEXT: ForStmt
96+
// CHECK-NEXT: DeclStmt
97+
// CHECK-NEXT: VarDecl{{.*}} i 'int'
98+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
99+
// CHECK-NEXT: <<<NULL>>>
100+
// CHECK-NEXT: BinaryOperator{{.*}}'<'
101+
// CHECK-NEXT: ImplicitCastExpr
102+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
103+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
104+
// CHECK-NEXT: UnaryOperator{{.*}}++
105+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
106+
// CHECK-NEXT: CompoundStmt
107+
#pragma acc kernels loop device_type(float, int) dtype(*)
108+
for(int i = 0; i < 5; ++i){}
109+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
110+
// CHECK-NEXT: device_type(float, int)
111+
// CHECK-NEXT: dtype(*)
112+
// CHECK-NEXT: ForStmt
113+
// CHECK-NEXT: DeclStmt
114+
// CHECK-NEXT: VarDecl{{.*}} i 'int'
115+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
116+
// CHECK-NEXT: <<<NULL>>>
117+
// CHECK-NEXT: BinaryOperator{{.*}}'<'
118+
// CHECK-NEXT: ImplicitCastExpr
119+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
120+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
121+
// CHECK-NEXT: UnaryOperator{{.*}}++
122+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
123+
// CHECK-NEXT: CompoundStmt
124+
}
125+
126+
template<typename T>
127+
void TemplUses() {
128+
// CHECK-NEXT: FunctionTemplateDecl{{.*}}TemplUses
129+
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}T
130+
// CHECK-NEXT: FunctionDecl{{.*}}TemplUses
131+
// CHECK-NEXT: CompoundStmt
132+
#pragma acc parallel loop device_type(T) dtype(T)
133+
for(int i = 0; i < 5; ++i){}
134+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
135+
// CHECK-NEXT: device_type(T)
136+
// CHECK-NEXT: dtype(T)
137+
// CHECK-NEXT: ForStmt
138+
// CHECK-NEXT: DeclStmt
139+
// CHECK-NEXT: VarDecl{{.*}} i 'int'
140+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
141+
// CHECK-NEXT: <<<NULL>>>
142+
// CHECK-NEXT: BinaryOperator{{.*}}'<'
143+
// CHECK-NEXT: ImplicitCastExpr
144+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
145+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
146+
// CHECK-NEXT: UnaryOperator{{.*}}++
147+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
148+
// CHECK-NEXT: CompoundStmt
149+
150+
151+
// Instantiations
152+
// CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void ()' implicit_instantiation
153+
// CHECK-NEXT: TemplateArgument type 'int'
154+
// CHECK-NEXT: BuiltinType{{.*}} 'int'
155+
// CHECK-NEXT: CompoundStmt
156+
157+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
158+
// CHECK-NEXT: device_type(T)
159+
// CHECK-NEXT: dtype(T)
160+
// CHECK-NEXT: ForStmt
161+
// CHECK-NEXT: DeclStmt
162+
// CHECK-NEXT: VarDecl{{.*}} i 'int'
163+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
164+
// CHECK-NEXT: <<<NULL>>>
165+
// CHECK-NEXT: BinaryOperator{{.*}}'<'
166+
// CHECK-NEXT: ImplicitCastExpr
167+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
168+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
169+
// CHECK-NEXT: UnaryOperator{{.*}}++
170+
// CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
171+
// CHECK-NEXT: CompoundStmt
172+
}
173+
174+
void Inst() {
175+
TemplUses<int>();
176+
}
177+
178+
#endif // PCH_HELPER

0 commit comments

Comments
 (0)