Skip to content

Commit 331f3cc

Browse files
committed
[OpenACC] enable 'present' clause for 'data' construct
No additional sema is required once again, so this patch adds testing and enables the clause.
1 parent fcb1591 commit 331f3cc

File tree

6 files changed

+156
-15
lines changed

6 files changed

+156
-15
lines changed

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -926,11 +926,13 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitNoCreateClause(
926926

927927
OpenACCClause *SemaOpenACCClauseVisitor::VisitPresentClause(
928928
SemaOpenACC::OpenACCParsedClause &Clause) {
929-
// Restrictions only properly implemented on 'compute'/'combined constructs,
930-
// and 'compute'/'combined' constructs are the only construct that can do
931-
// anything with this yet, so skip/treat as unimplemented in this case.
929+
// Restrictions only properly implemented on 'compute'/'combined'/'data'
930+
// constructs, and 'compute'/'combined'/'data' constructs are the only
931+
// construct that can do anything with this yet, so skip/treat as
932+
// unimplemented in this case.
932933
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
933-
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
934+
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()) &&
935+
!isOpenACCDataDirectiveKind(Clause.getDirectiveKind()))
934936
return isNotImplemented();
935937
// ActOnVar ensured that everything is a valid variable reference, so there
936938
// really isn't anything to do here. GCC does some duplicate-finding, though

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,12 @@ void foo() {
8282
#pragma acc data default(none) no_create(i, array[1], array, array[1:2])
8383
;
8484

85-
// CHECK: #pragma acc data default(none) no_create(i, array[1], array, array[1:2])
86-
// CHECK-NOT: present(i, array[1], array, array[1:2])
85+
// CHECK: #pragma acc data default(none) no_create(i, array[1], array, array[1:2]) present(i, array[1], array, array[1:2])
8786
#pragma acc data default(none) no_create(i, array[1], array, array[1:2]) present(i, array[1], array, array[1:2])
8887
;
88+
// CHECK: #pragma acc data present(i, array[1], array, array[1:2])
89+
#pragma acc data present(i, array[1], array, array[1:2])
90+
;
8991

9092
// CHECK: #pragma acc data default(none) copy(i, array[1], array, array[1:2]) pcopy(i, array[1], array, array[1:2]) present_or_copy(i, array[1], array, array[1:2])
9193
#pragma acc data default(none) copy(i, array[1], array, array[1:2]) pcopy(i, array[1], array, array[1:2]) present_or_copy(i, array[1], array, array[1:2])

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ void TemplUses(T t, U u) {
4444
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
4545
// CHECK-NEXT: no_create clause
4646
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
47-
// TODO_CHECK-NEXT: present clause
48-
// TODO_CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
49-
// TODO_CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
47+
// CHECK-NEXT: present clause
48+
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
49+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
5050
// CHECK-NEXT: NullStmt
5151

5252
// Check the instantiated versions of the above.
@@ -66,11 +66,11 @@ void TemplUses(T t, U u) {
6666
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
6767
// CHECK-NEXT: no_create clause
6868
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
69-
// TODO_CHECK-NEXT: present clause
70-
// TODO_CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
71-
// TODO_CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
72-
// TODO_CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
73-
// TODO_CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
69+
// CHECK-NEXT: present clause
70+
// CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
71+
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
72+
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
73+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
7474
// CHECK-NEXT: NullStmt
7575
}
7676

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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+
7+
#ifndef PCH_HELPER
8+
#define PCH_HELPER
9+
10+
int Global;
11+
short GlobalArray[5];
12+
13+
void NormalUses(float *PointerParam) {
14+
// CHECK: FunctionDecl{{.*}}NormalUses
15+
// CHECK: ParmVarDecl
16+
// CHECK-NEXT: CompoundStmt
17+
18+
#pragma acc data default(none) present(GlobalArray, PointerParam[Global])
19+
for(int i = 0; i < 5; ++i);
20+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
21+
// CHECK-NEXT: default(none)
22+
// CHECK-NEXT: present clause
23+
// CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
24+
// CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
25+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
26+
// CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
27+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
28+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
29+
// CHECK-NEXT: ForStmt
30+
// CHECK: NullStmt
31+
}
32+
33+
template<auto &NTTP, typename T>
34+
void TemplUses(T t) {
35+
// CHECK-NEXT: FunctionTemplateDecl
36+
// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP
37+
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T
38+
// CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T)'
39+
// CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
40+
// CHECK-NEXT: CompoundStmt
41+
42+
#pragma acc data default(none) present(NTTP, t)
43+
for(int i = 0; i < 5; ++i);
44+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
45+
// CHECK-NEXT: default(none)
46+
// CHECK-NEXT: present clause
47+
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
48+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
49+
// CHECK-NEXT: ForStmt
50+
// CHECK: NullStmt
51+
52+
53+
// Check the instantiated versions of the above.
54+
// CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int)' implicit_instantiation
55+
// CHECK-NEXT: TemplateArgument decl
56+
// CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int'
57+
// CHECK-NEXT: TemplateArgument type 'int'
58+
// CHECK-NEXT: BuiltinType{{.*}} 'int'
59+
// CHECK-NEXT: ParmVarDecl{{.*}} used t 'int'
60+
// CHECK-NEXT: CompoundStmt
61+
62+
// #pragma acc parallel seq present(NTTP, t)
63+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
64+
// CHECK-NEXT: default(none)
65+
// CHECK-NEXT: present clause
66+
// CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
67+
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
68+
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
69+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
70+
// CHECK-NEXT: ForStmt
71+
// CHECK: NullStmt
72+
73+
}
74+
75+
void Inst() {
76+
static constexpr unsigned CEVar = 1;
77+
TemplUses<CEVar>(5);
78+
}
79+
#endif
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
typedef struct IsComplete {
4+
struct S { int A; } CompositeMember;
5+
int ScalarMember;
6+
float ArrayMember[5];
7+
void *PointerMember;
8+
} Complete;
9+
void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) {
10+
int LocalInt;
11+
short *LocalPointer;
12+
float LocalArray[5];
13+
Complete LocalComposite;
14+
// Check Appertainment:
15+
#pragma acc data default(none) present(LocalInt)
16+
;
17+
18+
// Valid cases:
19+
#pragma acc data default(none) present(LocalInt, LocalPointer, LocalArray)
20+
;
21+
#pragma acc data default(none) present(LocalArray[2:1])
22+
;
23+
24+
#pragma acc data default(none) present(LocalComposite.ScalarMember, LocalComposite.ScalarMember)
25+
;
26+
27+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
28+
#pragma acc data default(none) present(1 + IntParam)
29+
;
30+
31+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
32+
#pragma acc data default(none) present(+IntParam)
33+
;
34+
35+
// expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
36+
#pragma acc data default(none) present(PointerParam[2:])
37+
;
38+
39+
// expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
40+
#pragma acc data default(none) present(ArrayParam[2:5])
41+
;
42+
43+
// expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
44+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
45+
#pragma acc data default(none) present((float*)ArrayParam[2:5])
46+
;
47+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
48+
#pragma acc data default(none) present((float)ArrayParam[2])
49+
;
50+
51+
// expected-error@+1{{OpenACC 'present' clause is not valid on 'enter data' directive}}
52+
#pragma acc enter data copyin(LocalInt) present(LocalInt)
53+
// expected-error@+1{{OpenACC 'present' clause is not valid on 'exit data' directive}}
54+
#pragma acc exit data copyout(LocalInt) present(LocalInt)
55+
// expected-warning@+2{{OpenACC clause 'use_device' not yet implemented}}
56+
// expected-error@+1{{OpenACC 'present' clause is not valid on 'host_data' directive}}
57+
#pragma acc host_data use_device(LocalInt) present(LocalInt)
58+
;
59+
}

clang/test/SemaOpenACC/data-construct.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ void AtLeastOneOf() {
3131
;
3232
#pragma acc data no_create(Var)
3333
;
34-
// expected-warning@+1{{OpenACC clause 'present' not yet implemented}}
3534
#pragma acc data present(Var)
3635
;
3736
// expected-warning@+1{{OpenACC clause 'deviceptr' not yet implemented}}

0 commit comments

Comments
 (0)