Skip to content

Commit 98bfd7f

Browse files
committed
Fix declare target implementation to support enter.
1 parent eaafee2 commit 98bfd7f

File tree

9 files changed

+130
-32
lines changed

9 files changed

+130
-32
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3749,8 +3749,8 @@ def OMPDeclareTargetDecl : InheritableAttr {
37493749
let Documentation = [OMPDeclareTargetDocs];
37503750
let Args = [
37513751
EnumArgument<"MapType", "MapTypeTy",
3752-
[ "to", "link" ],
3753-
[ "MT_To", "MT_Link" ]>,
3752+
[ "to", "enter", "link" ],
3753+
[ "MT_To", "MT_Enter", "MT_Link" ]>,
37543754
EnumArgument<"DevType", "DevTypeTy",
37553755
[ "host", "nohost", "any" ],
37563756
[ "DT_Host", "DT_NoHost", "DT_Any" ]>,

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1383,12 +1383,22 @@ def note_omp_assumption_clause_continue_here
13831383
: Note<"the ignored tokens spans until here">;
13841384
def err_omp_declare_target_unexpected_clause: Error<
13851385
"unexpected '%0' clause, only %select{'device_type'|'to' or 'link'|'to', 'link' or 'device_type'|'device_type', 'indirect'|'to', 'link', 'device_type' or 'indirect'}1 clauses expected">;
1386+
def err_omp_declare_target_unexpected_clause_52: Error<
1387+
"unexpected '%0' clause, only %select{'device_type'|'enter' or 'link'|'enter', 'link' or 'device_type'|'device_type', 'indirect'|'enter', 'link', 'device_type' or 'indirect'}1 clauses expected">;
13861388
def err_omp_begin_declare_target_unexpected_implicit_to_clause: Error<
13871389
"unexpected '(', only 'to', 'link' or 'device_type' clauses expected for 'begin declare target' directive">;
1388-
def err_omp_declare_target_unexpected_clause_after_implicit_to: Error<
1390+
def err_omp_declare_target_wrong_clause_after_implicit_to: Error<
13891391
"unexpected clause after an implicit 'to' clause">;
1392+
def err_omp_declare_target_wrong_clause_after_implicit_enter: Error<
1393+
"unexpected clause after an implicit 'enter' clause">;
13901394
def err_omp_declare_target_missing_to_or_link_clause: Error<
13911395
"expected at least one %select{'to' or 'link'|'to', 'link' or 'indirect'}0 clause">;
1396+
def err_omp_declare_target_missing_enter_or_link_clause: Error<
1397+
"expected at least one %select{'enter' or 'link'|'enter', 'link' or 'indirect'}0 clause">;
1398+
def err_omp_declare_target_unexpected_to_clause: Error<
1399+
"unexpected 'to' clause, use 'enter' instead">;
1400+
def err_omp_declare_target_unexpected_enter_clause: Error<
1401+
"unexpected 'enter' clause, use 'to' instead">;
13921402
def err_omp_declare_target_multiple : Error<
13931403
"%0 appears multiple times in clauses on the same declare target directive">;
13941404
def err_omp_declare_target_indirect_device_type: Error<

clang/lib/AST/AttrImpl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void OMPDeclareTargetDeclAttr::printPrettyPragma(
137137
// Use fake syntax because it is for testing and debugging purpose only.
138138
if (getDevType() != DT_Any)
139139
OS << " device_type(" << ConvertDevTypeTyToStr(getDevType()) << ")";
140-
if (getMapType() != MT_To)
140+
if (getMapType() != MT_To && getMapType() != MT_Enter)
141141
OS << ' ' << ConvertMapTypeTyToStr(getMapType());
142142
if (Expr *E = getIndirectExpr()) {
143143
OS << " indirect(";

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2495,14 +2495,16 @@ static Address emitDeclTargetVarDeclLValue(CodeGenFunction &CGF,
24952495
const VarDecl *VD, QualType T) {
24962496
llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
24972497
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
2498-
// Return an invalid address if variable is MT_To and unified
2499-
// memory is not enabled. For all other cases: MT_Link and
2500-
// MT_To with unified memory, return a valid address.
2501-
if (!Res || (*Res == OMPDeclareTargetDeclAttr::MT_To &&
2498+
// Return an invalid address if variable is MT_To (or MT_Enter starting with
2499+
// OpenMP 5.2) and unified memory is not enabled. For all other cases: MT_Link
2500+
// and MT_To (or MT_Enter) with unified memory, return a valid address.
2501+
if (!Res || ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
2502+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
25022503
!CGF.CGM.getOpenMPRuntime().hasRequiresUnifiedSharedMemory()))
25032504
return Address::invalid();
25042505
assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
2505-
(*Res == OMPDeclareTargetDeclAttr::MT_To &&
2506+
((*Res == OMPDeclareTargetDeclAttr::MT_To ||
2507+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
25062508
CGF.CGM.getOpenMPRuntime().hasRequiresUnifiedSharedMemory())) &&
25072509
"Expected link clause OR to clause with unified memory enabled.");
25082510
QualType PtrTy = CGF.getContext().getPointerType(VD->getType());

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,7 +1627,8 @@ Address CGOpenMPRuntime::getAddrOfDeclareTargetVar(const VarDecl *VD) {
16271627
llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
16281628
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
16291629
if (Res && (*Res == OMPDeclareTargetDeclAttr::MT_Link ||
1630-
(*Res == OMPDeclareTargetDeclAttr::MT_To &&
1630+
((*Res == OMPDeclareTargetDeclAttr::MT_To ||
1631+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
16311632
HasRequiresUnifiedSharedMemory))) {
16321633
SmallString<64> PtrName;
16331634
{
@@ -1840,7 +1841,8 @@ bool CGOpenMPRuntime::emitDeclareTargetVarDefinition(const VarDecl *VD,
18401841
Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
18411842
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
18421843
if (!Res || *Res == OMPDeclareTargetDeclAttr::MT_Link ||
1843-
(*Res == OMPDeclareTargetDeclAttr::MT_To &&
1844+
((*Res == OMPDeclareTargetDeclAttr::MT_To ||
1845+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
18441846
HasRequiresUnifiedSharedMemory))
18451847
return CGM.getLangOpts().OpenMPIsDevice;
18461848
VD = VD->getDefinition(CGM.getContext());
@@ -7461,7 +7463,8 @@ class MappableExprsHandler {
74617463
if (llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
74627464
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
74637465
if ((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
7464-
(*Res == OMPDeclareTargetDeclAttr::MT_To &&
7466+
((*Res == OMPDeclareTargetDeclAttr::MT_To ||
7467+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
74657468
CGF.CGM.getOpenMPRuntime().hasRequiresUnifiedSharedMemory())) {
74667469
RequiresReference = true;
74677470
BP = CGF.CGM.getOpenMPRuntime().getAddrOfDeclareTargetVar(VD);
@@ -10325,7 +10328,8 @@ bool CGOpenMPRuntime::emitTargetGlobalVariable(GlobalDecl GD) {
1032510328
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
1032610329
cast<VarDecl>(GD.getDecl()));
1032710330
if (!Res || *Res == OMPDeclareTargetDeclAttr::MT_Link ||
10328-
(*Res == OMPDeclareTargetDeclAttr::MT_To &&
10331+
((*Res == OMPDeclareTargetDeclAttr::MT_To ||
10332+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
1032910333
HasRequiresUnifiedSharedMemory)) {
1033010334
DeferredGlobalVariables.insert(cast<VarDecl>(GD.getDecl()));
1033110335
return true;
@@ -10362,7 +10366,8 @@ void CGOpenMPRuntime::registerTargetGlobalVariable(const VarDecl *VD,
1036210366
int64_t VarSize;
1036310367
llvm::GlobalValue::LinkageTypes Linkage;
1036410368

10365-
if (*Res == OMPDeclareTargetDeclAttr::MT_To &&
10369+
if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
10370+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
1036610371
!HasRequiresUnifiedSharedMemory) {
1036710372
Flags = llvm::OffloadEntriesInfoManager::OMPTargetGlobalVarEntryTo;
1036810373
VarName = CGM.getMangledName(VD);
@@ -10393,7 +10398,8 @@ void CGOpenMPRuntime::registerTargetGlobalVariable(const VarDecl *VD,
1039310398
}
1039410399
} else {
1039510400
assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
10396-
(*Res == OMPDeclareTargetDeclAttr::MT_To &&
10401+
((*Res == OMPDeclareTargetDeclAttr::MT_To ||
10402+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
1039710403
HasRequiresUnifiedSharedMemory)) &&
1039810404
"Declare target attribute must link or to with unified memory.");
1039910405
if (*Res == OMPDeclareTargetDeclAttr::MT_Link)
@@ -10430,12 +10436,14 @@ void CGOpenMPRuntime::emitDeferredTargetDecls() const {
1043010436
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
1043110437
if (!Res)
1043210438
continue;
10433-
if (*Res == OMPDeclareTargetDeclAttr::MT_To &&
10439+
if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
10440+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
1043410441
!HasRequiresUnifiedSharedMemory) {
1043510442
CGM.EmitGlobal(VD);
1043610443
} else {
1043710444
assert((*Res == OMPDeclareTargetDeclAttr::MT_Link ||
10438-
(*Res == OMPDeclareTargetDeclAttr::MT_To &&
10445+
((*Res == OMPDeclareTargetDeclAttr::MT_To ||
10446+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
1043910447
HasRequiresUnifiedSharedMemory)) &&
1044010448
"Expected link clause or to clause with unified memory.");
1044110449
(void)CGM.getOpenMPRuntime().getAddrOfDeclareTargetVar(VD);

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3305,12 +3305,14 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) {
33053305
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
33063306
bool UnifiedMemoryEnabled =
33073307
getOpenMPRuntime().hasRequiresUnifiedSharedMemory();
3308-
if (*Res == OMPDeclareTargetDeclAttr::MT_To &&
3308+
if ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3309+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
33093310
!UnifiedMemoryEnabled) {
33103311
(void)GetAddrOfGlobalVar(VD);
33113312
} else {
33123313
assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
3313-
(*Res == OMPDeclareTargetDeclAttr::MT_To &&
3314+
((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3315+
*Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
33143316
UnifiedMemoryEnabled)) &&
33153317
"Link clause or to clause with unified memory expected.");
33163318
(void)getOpenMPRuntime().getAddrOfDeclareTargetVar(VD);

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,26 +1837,40 @@ void Parser::ParseOMPDeclareTargetClauses(
18371837
<< getOpenMPClauseName(OMPC_indirect) << 0;
18381838
break;
18391839
}
1840-
bool IsToOrLinkClause =
1840+
bool IsToEnterOrLinkClause =
18411841
OMPDeclareTargetDeclAttr::ConvertStrToMapTypeTy(ClauseName, MT);
1842-
assert((!IsDeviceTypeClause || !IsToOrLinkClause) && "Cannot be both!");
1842+
assert((!IsDeviceTypeClause || !IsToEnterOrLinkClause) &&
1843+
"Cannot be both!");
1844+
1845+
// Starting with OpenMP 5.2 the `to` clause has been replaced by the
1846+
// `enter` clause.
1847+
if (getLangOpts().OpenMP >= 52 && ClauseName == "to") {
1848+
Diag(Tok, diag::err_omp_declare_target_unexpected_to_clause);
1849+
break;
1850+
}
1851+
if (getLangOpts().OpenMP <= 51 && ClauseName == "enter") {
1852+
Diag(Tok, diag::err_omp_declare_target_unexpected_enter_clause);
1853+
break;
1854+
}
18431855

18441856
if (!IsDeviceTypeClause && !IsIndirectClause &&
18451857
DTCI.Kind == OMPD_begin_declare_target) {
18461858
Diag(Tok, diag::err_omp_declare_target_unexpected_clause)
18471859
<< ClauseName << (getLangOpts().OpenMP >= 51 ? 3 : 0);
18481860
break;
18491861
}
1850-
if (!IsDeviceTypeClause && !IsToOrLinkClause && !IsIndirectClause) {
1851-
Diag(Tok, diag::err_omp_declare_target_unexpected_clause)
1862+
if (!IsDeviceTypeClause && !IsToEnterOrLinkClause && !IsIndirectClause) {
1863+
Diag(Tok, getLangOpts().OpenMP >= 52
1864+
? diag::err_omp_declare_target_unexpected_clause_52
1865+
: diag::err_omp_declare_target_unexpected_clause)
18521866
<< ClauseName
1853-
<< (getLangOpts().OpenMP >= 51 ? 4
1854-
: getLangOpts().OpenMP >= 50 ? 2
1855-
: 1);
1867+
<< (getLangOpts().OpenMP >= 51
1868+
? 4
1869+
: getLangOpts().OpenMP >= 50 ? 2 : 1);
18561870
break;
18571871
}
18581872

1859-
if (IsToOrLinkClause || IsIndirectClause)
1873+
if (IsToEnterOrLinkClause || IsIndirectClause)
18601874
HasToOrLinkOrIndirectClause = true;
18611875

18621876
if (IsIndirectClause) {
@@ -1920,7 +1934,9 @@ void Parser::ParseOMPDeclareTargetClauses(
19201934
}
19211935
if (!HasIdentifier && Tok.isNot(tok::annot_pragma_openmp_end)) {
19221936
Diag(Tok,
1923-
diag::err_omp_declare_target_unexpected_clause_after_implicit_to);
1937+
getLangOpts().OpenMP >= 52
1938+
? diag::err_omp_declare_target_wrong_clause_after_implicit_enter
1939+
: diag::err_omp_declare_target_wrong_clause_after_implicit_to);
19241940
break;
19251941
}
19261942

@@ -1935,7 +1951,10 @@ void Parser::ParseOMPDeclareTargetClauses(
19351951
// For declare target require at least 'to' or 'link' to be present.
19361952
if (DTCI.Kind == OMPD_declare_target && RequiresToOrLinkOrIndirectClause &&
19371953
!HasToOrLinkOrIndirectClause)
1938-
Diag(DTCI.Loc, diag::err_omp_declare_target_missing_to_or_link_clause)
1954+
Diag(DTCI.Loc,
1955+
getLangOpts().OpenMP >= 52
1956+
? diag::err_omp_declare_target_missing_enter_or_link_clause
1957+
: diag::err_omp_declare_target_missing_to_or_link_clause)
19391958
<< (getLangOpts().OpenMP >= 51 ? 1 : 0);
19401959

19411960
SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22710,7 +22710,8 @@ static void checkDeclInTargetContext(SourceLocation SL, SourceRange SR,
2271022710
(SemaRef.getCurLambda(/*IgnoreNonLambdaCapturingScope=*/true) ||
2271122711
SemaRef.getCurBlock() || SemaRef.getCurCapturedRegion()) &&
2271222712
VD->hasGlobalStorage()) {
22713-
if (!MapTy || *MapTy != OMPDeclareTargetDeclAttr::MT_To) {
22713+
if (!MapTy || (*MapTy != OMPDeclareTargetDeclAttr::MT_To &&
22714+
*MapTy != OMPDeclareTargetDeclAttr::MT_Enter)) {
2271422715
// OpenMP 5.0, 2.12.7 declare target Directive, Restrictions
2271522716
// If a lambda declaration and definition appears between a
2271622717
// declare target directive and the matching end declare target
@@ -22791,8 +22792,11 @@ void Sema::checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D,
2279122792
IsIndirect = true;
2279222793
}
2279322794
auto *A = OMPDeclareTargetDeclAttr::CreateImplicit(
22794-
Context, OMPDeclareTargetDeclAttr::MT_To, DTCI.DT, IndirectE,
22795-
IsIndirect, Level, SourceRange(DTCI.Loc, DTCI.Loc));
22795+
Context,
22796+
getLangOpts().OpenMP >= 52 ? OMPDeclareTargetDeclAttr::MT_Enter
22797+
: OMPDeclareTargetDeclAttr::MT_To,
22798+
DTCI.DT, IndirectE, IsIndirect, Level,
22799+
SourceRange(DTCI.Loc, DTCI.Loc));
2279622800
D->addAttr(A);
2279722801
if (ASTMutationListener *ML = Context.getASTMutationListener())
2279822802
ML->DeclarationMarkedOpenMPDeclareTarget(D, A);

clang/test/OpenMP/declare_target_ast_print.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44

55
// RUN: %clang_cc1 -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
66
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK --check-prefix=OMP51
7+
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=52 -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK --check-prefix=OMP52
78
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
89
// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
910
// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
1011
// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP51
12+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
13+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -std=c++11 -include-pch %t -fsyntax-only -I %S/Inputs -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP52
1114

1215
// RUN: %clang_cc1 -verify -fopenmp-simd -I %S/Inputs -ast-print %s | FileCheck %s
1316
// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -I %S/Inputs -emit-pch -o %t %s
@@ -77,6 +80,48 @@ void xoo();
7780
}
7881
#endif // _OPENMP
7982

83+
#if _OPENMP == 202111
84+
extern "C" {
85+
void boo_c() {}
86+
#pragma omp declare target enter(boo_c) indirect
87+
// OMP52: #pragma omp declare target indirect
88+
// OMP52: void boo_c() {
89+
// OMP52: }
90+
// OMP52: #pragma omp end declare target
91+
#pragma omp declare target indirect
92+
void yoo(){}
93+
#pragma omp end declare target
94+
// OMP52: #pragma omp declare target indirect
95+
// OMP52: void yoo() {
96+
// OMP52: }
97+
// OMP52: #pragma omp end declare target
98+
}
99+
extern "C++" {
100+
void boo_cpp() {}
101+
#pragma omp declare target enter(boo_cpp) indirect
102+
// OMP52: #pragma omp declare target indirect
103+
// OMP52: void boo_cpp() {
104+
// OMP52: }
105+
// OMP52: #pragma omp end declare target
106+
107+
constexpr bool f() {return false;}
108+
#pragma omp begin declare target indirect(f())
109+
void zoo() {}
110+
void xoo();
111+
#pragma omp end declare target
112+
#pragma omp declare target enter(zoo) indirect(false)
113+
// OMP52: #pragma omp declare target indirect(f())
114+
// OMP52: #pragma omp declare target indirect(false)
115+
// OMP52: void zoo() {
116+
// OMP52: }
117+
// OMP52: #pragma omp end declare target
118+
// OMP52: #pragma omp declare target indirect(f())
119+
// OMP52: void xoo();
120+
// OMP52: #pragma omp end declare target
121+
122+
}
123+
#endif // _OPENMP
124+
80125
int out_decl_target = 0;
81126
#pragma omp declare target (out_decl_target)
82127

@@ -185,7 +230,11 @@ void f1() {
185230
int b1, b2, b3;
186231
void f2() {
187232
}
233+
#if _OPENMP == 202111
234+
#pragma omp declare target enter(b1) enter(b2), enter(b3, f2)
235+
#else
188236
#pragma omp declare target to(b1) to(b2), to(b3, f2)
237+
#endif // _OPENMP == 202111
189238
// CHECK: #pragma omp declare target{{$}}
190239
// CHECK: int b1;
191240
// CHECK: #pragma omp end declare target{{$}}
@@ -288,7 +337,11 @@ int baz() { return 1; }
288337

289338
#pragma omp declare target
290339
int abc1() { return 1; }
340+
#if _OPENMP == 202111
341+
#pragma omp declare target enter(abc1) device_type(nohost)
342+
#else
291343
#pragma omp declare target to(abc1) device_type(nohost)
344+
#endif // _OPENMP == 202111
292345
#pragma omp end declare target
293346

294347
// CHECK-NEXT: #pragma omp declare target

0 commit comments

Comments
 (0)