Skip to content

Commit c66dbbe

Browse files
committed
[OpenACC] Implement 'capture' modifier Sema/AST
The 'capture' modifier is an OpenACC 3.3NEXT (AKA 3.4) feature, which permits a new kind of identifying the memory location of variables in a data clause. However, it is only valid on data, combined, or compute constructs. This patch implements all of the proper restrictions.
1 parent 1a1927a commit c66dbbe

16 files changed

+100
-36
lines changed

clang/include/clang/Basic/OpenACCKinds.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,8 @@ enum class OpenACCModifierKind : uint8_t {
642642
AlwaysOut = 1 << 2,
643643
Readonly = 1 << 3,
644644
Zero = 1 << 4,
645-
LLVM_MARK_AS_BITMASK_ENUM(Zero)
645+
Capture = 1 << 5,
646+
LLVM_MARK_AS_BITMASK_ENUM(Capture)
646647
};
647648

648649
inline bool isOpenACCModifierBitSet(OpenACCModifierKind List,
@@ -690,6 +691,13 @@ inline StreamTy &printOpenACCModifierKind(StreamTy &Out,
690691
Out << "zero";
691692
First = false;
692693
}
694+
695+
if (isOpenACCModifierBitSet(Mods, OpenACCModifierKind::Capture)) {
696+
if (!First)
697+
Out << ", ";
698+
Out << "capture";
699+
First = false;
700+
}
693701
return Out;
694702
}
695703
inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &Out,

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,7 @@ OpenACCModifierKind Parser::tryParseModifierList(OpenACCClauseKind CK) {
691691
.Case("alwaysout", OpenACCModifierKind::AlwaysOut)
692692
.Case("readonly", OpenACCModifierKind::Readonly)
693693
.Case("zero", OpenACCModifierKind::Zero)
694+
.Case("capture", OpenACCModifierKind::Capture)
694695
.Default(OpenACCModifierKind::Invalid);
695696
};
696697

clang/lib/Sema/SemaOpenACCClause.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,31 +198,50 @@ class SemaOpenACCClauseVisitor {
198198
Mods = CheckSingle(Mods, ValidKinds, OpenACCModifierKind::AlwaysOut);
199199
Mods = CheckSingle(Mods, ValidKinds, OpenACCModifierKind::Readonly);
200200
Mods = CheckSingle(Mods, ValidKinds, OpenACCModifierKind::Zero);
201+
Mods = CheckSingle(Mods, ValidKinds, OpenACCModifierKind::Capture);
201202
return Mods;
202203
};
203204

205+
// The 'capture' modifier is only valid on copyin, copyout, and create on
206+
// structured data or compute constructs (which also includes combined).
207+
bool IsStructuredDataOrCompute =
208+
Clause.getDirectiveKind() == OpenACCDirectiveKind::Data ||
209+
isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) ||
210+
isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind());
211+
204212
switch (Clause.getClauseKind()) {
205213
default:
206214
llvm_unreachable("Only for copy, copyin, copyout, create");
207215
case OpenACCClauseKind::Copy:
208216
case OpenACCClauseKind::PCopy:
209217
case OpenACCClauseKind::PresentOrCopy:
218+
// COPY: Capture always
210219
return Check(OpenACCModifierKind::Always | OpenACCModifierKind::AlwaysIn |
211-
OpenACCModifierKind::AlwaysOut);
220+
OpenACCModifierKind::AlwaysOut |
221+
OpenACCModifierKind::Capture);
212222
case OpenACCClauseKind::CopyIn:
213223
case OpenACCClauseKind::PCopyIn:
214224
case OpenACCClauseKind::PresentOrCopyIn:
225+
// COPYIN: Capture only struct.data & compute
215226
return Check(OpenACCModifierKind::Always | OpenACCModifierKind::AlwaysIn |
216-
OpenACCModifierKind::Readonly);
227+
OpenACCModifierKind::Readonly |
228+
(IsStructuredDataOrCompute ? OpenACCModifierKind::Capture
229+
: OpenACCModifierKind::Invalid));
217230
case OpenACCClauseKind::CopyOut:
218231
case OpenACCClauseKind::PCopyOut:
219232
case OpenACCClauseKind::PresentOrCopyOut:
233+
// COPYOUT: Capture only struct.data & compute
220234
return Check(OpenACCModifierKind::Always | OpenACCModifierKind::AlwaysIn |
221-
OpenACCModifierKind::Zero);
235+
OpenACCModifierKind::Zero |
236+
(IsStructuredDataOrCompute ? OpenACCModifierKind::Capture
237+
: OpenACCModifierKind::Invalid));
222238
case OpenACCClauseKind::Create:
223239
case OpenACCClauseKind::PCreate:
224240
case OpenACCClauseKind::PresentOrCreate:
225-
return Check(OpenACCModifierKind::Zero);
241+
// CREATE: Capture only struct.data & compute
242+
return Check(OpenACCModifierKind::Zero |
243+
(IsStructuredDataOrCompute ? OpenACCModifierKind::Capture
244+
: OpenACCModifierKind::Invalid));
226245
}
227246
llvm_unreachable("didn't return from switch above?");
228247
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ void ModList() {
8282
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copy' clause}}
8383
#pragma acc kernels loop copy(zero: V1)
8484
for(int i = 5; i < 10;++i);
85-
#pragma acc parallel loop copy(always, alwaysin, alwaysout: V1)
85+
#pragma acc parallel loop copy(capture:V1)
86+
for(int i = 5; i < 10;++i);
87+
#pragma acc parallel loop copy(always, alwaysin, alwaysout, capture: V1)
8688
for(int i = 5; i < 10;++i);
8789
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ void ModList() {
8989
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}
9090
#pragma acc kernels loop copyin(zero: V1)
9191
for(int i = 5; i < 10;++i);
92-
#pragma acc parallel loop copyin(always, alwaysin, readonly: V1)
92+
#pragma acc parallel loop copyin(capture:V1)
93+
for(int i = 5; i < 10;++i);
94+
#pragma acc parallel loop copyin(always, alwaysin, readonly, capture: V1)
9395
for(int i = 5; i < 10;++i);
9496
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ void ModList() {
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);
91-
#pragma acc parallel loop copyout(always, alwaysin, zero: V1)
92-
for(int i = 0; i < 6;++i);
91+
#pragma acc parallel loop copyout(capture:V1)
92+
for(int i = 5; i < 10;++i);
93+
#pragma acc parallel loop copyout(always, alwaysin, zero, capture: V1)
94+
for(int i = 5; i < 10;++i);
9395
}
9496

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,6 @@ void ModList() {
9999
for(int i = 5; i < 10;++i);
100100
#pragma acc kernels loop create(zero: V1)
101101
for(int i = 5; i < 10;++i);
102+
#pragma acc parallel loop create(capture:V1)
103+
for(int i = 5; i < 10;++i);
102104
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ void ModList() {
9595
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copy' clause}}
9696
#pragma acc kernels copy(zero: V1)
9797
for(int i = 5; i < 10;++i);
98-
#pragma acc parallel copy(always, alwaysin, alwaysout: V1)
98+
#pragma acc parallel copy(capture:V1)
99+
for(int i = 5; i < 10;++i);
100+
#pragma acc parallel copy(always, alwaysin, alwaysout, capture: V1)
99101
for(int i = 5; i < 10;++i);
100102
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ void ModList() {
8888
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}
8989
#pragma acc kernels copyin(zero: V1)
9090
for(int i = 5; i < 10;++i);
91-
#pragma acc parallel copyin(always, alwaysin, readonly: V1)
91+
#pragma acc parallel copyin(capture:V1)
92+
for(int i = 5; i < 10;++i);
93+
#pragma acc parallel copyin(always, alwaysin, readonly, capture: V1)
9294
for(int i = 5; i < 10;++i);
9395
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ void ModList() {
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);
91-
#pragma acc parallel copyout(always, alwaysin, zero: V1)
92-
for(int i = 0; i < 6;++i);
91+
#pragma acc parallel copyout(capture:V1)
92+
for(int i = 5; i < 10;++i);
93+
#pragma acc parallel copyout(always, alwaysin, zero, capture: V1)
94+
for(int i = 5; i < 10;++i);
9395
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,6 @@ void ModList() {
9797
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}
9898
#pragma acc serial create(readonly: V1)
9999
for(int i = 5; i < 10;++i);
100-
#pragma acc kernels loop create(zero: V1)
100+
#pragma acc parallel create(capture:V1)
101101
for(int i = 5; i < 10;++i);
102102
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ void ModList() {
7979
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copy' clause}}
8080
#pragma acc data copy(zero: V1)
8181
;
82-
#pragma acc data copy(always, alwaysin, alwaysout: V1)
82+
#pragma acc data copy(capture:V1)
83+
;
84+
#pragma acc data copy(always, alwaysin, alwaysout, capture: V1)
8385
;
8486
}
8587

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ void ModList() {
8181
#pragma acc data copyin(alwaysout: V1)
8282
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}
8383
#pragma acc data copyin(zero: V1)
84-
#pragma acc data copyin(always, alwaysin, readonly: V1)
84+
#pragma acc data copyin(capture: V1)
85+
#pragma acc data copyin(always, alwaysin, readonly, capture: V1)
8586

8687
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyin' clause}}
8788
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}
@@ -90,5 +91,6 @@ void ModList() {
9091
#pragma acc enter data copyin(alwaysout: V1)
9192
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}
9293
#pragma acc enter data copyin(zero: V1)
93-
#pragma acc enter data copyin(always, alwaysin, readonly: V1)
94+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyin' clause}}
95+
#pragma acc enter data copyin(capture: V1)
9496
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ void ModList() {
8181
#pragma acc data copyout(alwaysout: V1)
8282
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
8383
#pragma acc data copyout(readonly: V1)
84-
#pragma acc data copyout(always, alwaysin, zero: V1)
84+
#pragma acc data copyout(capture: V1)
85+
#pragma acc data copyout(always, alwaysin, zero, capture: V1)
8586

8687
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
8788
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
@@ -90,6 +91,7 @@ void ModList() {
9091
#pragma acc exit data copyout(alwaysout: V1)
9192
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
9293
#pragma acc exit data copyout(readonly: V1)
93-
#pragma acc exit data copyout(always, alwaysin, zero: V1)
94+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyout' clause}}
95+
#pragma acc exit data copyout(capture: V1)
9496
}
9597

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void ModList() {
7878
// expected-error@+3{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}
7979
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}
8080
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}
81-
#pragma acc data create(always, alwaysin, alwaysout, zero, readonly: V1)
81+
#pragma acc data create(always, alwaysin, alwaysout, zero, readonly, capture: V1)
8282
// expected-error@+1{{OpenACC 'always' modifier not valid on 'create' clause}}
8383
#pragma acc data create(always: V1)
8484
// expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}
@@ -88,12 +88,14 @@ void ModList() {
8888
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}
8989
#pragma acc data create(readonly: V1)
9090
#pragma acc data create(zero: V1)
91+
#pragma acc data create(zero, capture: V1)
9192

92-
// expected-error@+4{{OpenACC 'always' modifier not valid on 'create' clause}}
93-
// expected-error@+3{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}
94-
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}
95-
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}
96-
#pragma acc enter data create(always, alwaysin, alwaysout, zero, readonly: V1)
93+
// expected-error@+5{{OpenACC 'always' modifier not valid on 'create' clause}}
94+
// expected-error@+4{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}
95+
// expected-error@+3{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}
96+
// expected-error@+2{{OpenACC 'readonly' modifier not valid on 'create' clause}}
97+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'create' clause}}
98+
#pragma acc enter data create(always, alwaysin, alwaysout, zero, readonly, capture: V1)
9799
// expected-error@+1{{OpenACC 'always' modifier not valid on 'create' clause}}
98100
#pragma acc enter data create(always: V1)
99101
// expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}
@@ -102,5 +104,8 @@ void ModList() {
102104
#pragma acc enter data create(alwaysout: V1)
103105
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}
104106
#pragma acc enter data create(readonly: V1)
107+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'create' clause}}
108+
#pragma acc enter data create(capture: V1)
109+
105110
#pragma acc enter data create(zero: V1)
106111
}

clang/test/SemaOpenACC/declare-construct.cpp

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -307,16 +307,17 @@ struct Struct2 {
307307
};
308308

309309
void ModList() {
310-
int V1, V2, V3, V4, V5, V6, V7, V8, V9, V10,
311-
V11, V12, V13, V14, V15, V16, V17, V18;
310+
int V1, V2, V3, V4, V4B, V5, V6, V7, V7B, V8, V9, V10,
311+
V11, V11B, V12, V13, V14, V15, V16, V17, V18, V19;
312312
// expected-error@+2{{OpenACC 'readonly' modifier not valid on 'copy' clause}}
313313
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copy' clause}}
314314
#pragma acc declare copy(always, alwaysin, alwaysout, zero, readonly: V1)
315315
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copy' clause}}
316316
#pragma acc declare copy(readonly: V2)
317317
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copy' clause}}
318318
#pragma acc declare copy(zero: V3)
319-
#pragma acc declare copy(always, alwaysin, alwaysout: V4)
319+
#pragma acc declare copy(capture: V4)
320+
#pragma acc declare copy(always, alwaysin, alwaysout, capture: V4B)
320321

321322
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyin' clause}}
322323
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}
@@ -325,7 +326,10 @@ void ModList() {
325326
#pragma acc declare copyin(alwaysout: V6)
326327
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}
327328
#pragma acc declare copyin(zero: V7)
328-
#pragma acc declare copyin(always, alwaysin, readonly: V8)
329+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyin' clause}}
330+
#pragma acc declare copyin(capture: V7B)
331+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyin' clause}}
332+
#pragma acc declare copyin(always, alwaysin, readonly, capture: V8)
329333

330334
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyout' clause}}
331335
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
@@ -334,13 +338,17 @@ void ModList() {
334338
#pragma acc declare copyout(alwaysout: V10)
335339
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
336340
#pragma acc declare copyout(readonly: V11)
337-
#pragma acc declare copyout(always, alwaysin, zero: V12)
338-
339-
// expected-error@+4{{OpenACC 'always' modifier not valid on 'create' clause}}
340-
// expected-error@+3{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}
341-
// expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}
342-
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}
343-
#pragma acc declare create(always, alwaysin, alwaysout, zero, readonly: V13)
341+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyout' clause}}
342+
#pragma acc declare copyout(capture: V11B)
343+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyout' clause}}
344+
#pragma acc declare copyout(always, alwaysin, zero, capture: V12)
345+
346+
// expected-error@+5{{OpenACC 'always' modifier not valid on 'create' clause}}
347+
// expected-error@+4{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}
348+
// expected-error@+3{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}
349+
// expected-error@+2{{OpenACC 'readonly' modifier not valid on 'create' clause}}
350+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'create' clause}}
351+
#pragma acc declare create(always, alwaysin, alwaysout, zero, readonly, capture: V13)
344352
// expected-error@+1{{OpenACC 'always' modifier not valid on 'create' clause}}
345353
#pragma acc declare create(always: V14)
346354
// expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}
@@ -349,5 +357,8 @@ void ModList() {
349357
#pragma acc declare create(alwaysout: V16)
350358
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}
351359
#pragma acc declare create(readonly: V17)
360+
352361
#pragma acc declare create(zero: V18)
362+
// expected-error@+1{{OpenACC 'capture' modifier not valid on 'create' clause}}
363+
#pragma acc declare create(capture: V19)
353364
}

0 commit comments

Comments
 (0)