Skip to content

Commit 90093c9

Browse files
mdfazlaytomtor
authored andcommitted
[OpenMP 60] Initial parsing/sema for need_device_addr modifier on adjust_args clause (llvm#143442)
Adds initial parsing and semantic analysis for `need_device_addr` modifier on `adjust_args` clause.
1 parent 79de83f commit 90093c9

File tree

10 files changed

+80
-29
lines changed

10 files changed

+80
-29
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4630,6 +4630,7 @@ def OMPDeclareVariant : InheritableAttr {
46304630
OMPTraitInfoArgument<"TraitInfos">,
46314631
VariadicExprArgument<"AdjustArgsNothing">,
46324632
VariadicExprArgument<"AdjustArgsNeedDevicePtr">,
4633+
VariadicExprArgument<"AdjustArgsNeedDeviceAddr">,
46334634
VariadicOMPInteropInfoArgument<"AppendArgs">,
46344635
];
46354636
let AdditionalMembers = [{

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,8 +1581,10 @@ def err_omp_unexpected_append_op : Error<
15811581
"unexpected operation specified in 'append_args' clause, expected 'interop'">;
15821582
def err_omp_unexpected_execution_modifier : Error<
15831583
"unexpected 'execution' modifier in non-executable context">;
1584-
def err_omp_unknown_adjust_args_op : Error<
1585-
"incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'">;
1584+
def err_omp_unknown_adjust_args_op
1585+
: Error<
1586+
"incorrect 'adjust_args' type, expected 'need_device_ptr'%select{|, "
1587+
"'need_device_addr',}0 or 'nothing'">;
15861588
def err_omp_declare_variant_wrong_clause : Error<
15871589
"expected %select{'match'|'match', 'adjust_args', or 'append_args'}0 clause "
15881590
"on 'omp declare variant' directive">;

clang/include/clang/Basic/OpenMPKinds.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ OPENMP_ORIGINAL_SHARING_MODIFIER(default)
214214
// Adjust-op kinds for the 'adjust_args' clause.
215215
OPENMP_ADJUST_ARGS_KIND(nothing)
216216
OPENMP_ADJUST_ARGS_KIND(need_device_ptr)
217+
OPENMP_ADJUST_ARGS_KIND(need_device_addr)
217218

218219
// Binding kinds for the 'bind' clause.
219220
OPENMP_BIND_KIND(teams)

clang/include/clang/Sema/SemaOpenMP.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,7 @@ class SemaOpenMP : public SemaBase {
849849
FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI,
850850
ArrayRef<Expr *> AdjustArgsNothing,
851851
ArrayRef<Expr *> AdjustArgsNeedDevicePtr,
852+
ArrayRef<Expr *> AdjustArgsNeedDeviceAddr,
852853
ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc,
853854
SourceLocation AppendArgsLoc, SourceRange SR);
854855

clang/lib/AST/AttrImpl.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ void OMPDeclareVariantAttr::printPrettyPragma(
224224
PrintExprs(adjustArgsNeedDevicePtr_begin(), adjustArgsNeedDevicePtr_end());
225225
OS << ")";
226226
}
227+
if (adjustArgsNeedDeviceAddr_size()) {
228+
OS << " adjust_args(need_device_addr:";
229+
PrintExprs(adjustArgsNeedDeviceAddr_begin(),
230+
adjustArgsNeedDeviceAddr_end());
231+
OS << ")";
232+
}
227233

228234
auto PrintInteropInfo = [&OS](OMPInteropInfo *Begin, OMPInteropInfo *End) {
229235
for (OMPInteropInfo *I = Begin; I != End; ++I) {

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1483,6 +1483,7 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
14831483
OMPTraitInfo &TI = ASTCtx.getNewOMPTraitInfo();
14841484
SmallVector<Expr *, 6> AdjustNothing;
14851485
SmallVector<Expr *, 6> AdjustNeedDevicePtr;
1486+
SmallVector<Expr *, 6> AdjustNeedDeviceAddr;
14861487
SmallVector<OMPInteropInfo, 3> AppendArgs;
14871488
SourceLocation AdjustArgsLoc, AppendArgsLoc;
14881489

@@ -1515,11 +1516,21 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
15151516
SmallVector<Expr *> Vars;
15161517
IsError = ParseOpenMPVarList(OMPD_declare_variant, OMPC_adjust_args,
15171518
Vars, Data);
1518-
if (!IsError)
1519-
llvm::append_range(Data.ExtraModifier == OMPC_ADJUST_ARGS_nothing
1520-
? AdjustNothing
1521-
: AdjustNeedDevicePtr,
1522-
Vars);
1519+
if (!IsError) {
1520+
switch (Data.ExtraModifier) {
1521+
case OMPC_ADJUST_ARGS_nothing:
1522+
llvm::append_range(AdjustNothing, Vars);
1523+
break;
1524+
case OMPC_ADJUST_ARGS_need_device_ptr:
1525+
llvm::append_range(AdjustNeedDevicePtr, Vars);
1526+
break;
1527+
case OMPC_ADJUST_ARGS_need_device_addr:
1528+
llvm::append_range(AdjustNeedDeviceAddr, Vars);
1529+
break;
1530+
default:
1531+
llvm_unreachable("Unexpected 'adjust_args' clause modifier.");
1532+
}
1533+
}
15231534
break;
15241535
}
15251536
case OMPC_append_args:
@@ -1559,8 +1570,8 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
15591570
if (DeclVarData && !TI.Sets.empty())
15601571
Actions.OpenMP().ActOnOpenMPDeclareVariantDirective(
15611572
DeclVarData->first, DeclVarData->second, TI, AdjustNothing,
1562-
AdjustNeedDevicePtr, AppendArgs, AdjustArgsLoc, AppendArgsLoc,
1563-
SourceRange(Loc, Tok.getLocation()));
1573+
AdjustNeedDevicePtr, AdjustNeedDeviceAddr, AppendArgs, AdjustArgsLoc,
1574+
AppendArgsLoc, SourceRange(Loc, Tok.getLocation()));
15641575

15651576
// Skip the last annot_pragma_openmp_end.
15661577
(void)ConsumeAnnotationToken();
@@ -4818,7 +4829,8 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
48184829
getLangOpts());
48194830
Data.ExtraModifierLoc = Tok.getLocation();
48204831
if (Data.ExtraModifier == OMPC_ADJUST_ARGS_unknown) {
4821-
Diag(Tok, diag::err_omp_unknown_adjust_args_op);
4832+
Diag(Tok, diag::err_omp_unknown_adjust_args_op)
4833+
<< (getLangOpts().OpenMP >= 60 ? 1 : 0);
48224834
SkipUntil(tok::r_paren, tok::annot_pragma_openmp_end, StopBeforeMatch);
48234835
} else {
48244836
ConsumeToken();

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7122,6 +7122,7 @@ void SemaOpenMP::ActOnFinishedFunctionDefinitionInOpenMPDeclareVariantScope(
71227122
getASTContext(), VariantFuncRef, DVScope.TI,
71237123
/*NothingArgs=*/nullptr, /*NothingArgsSize=*/0,
71247124
/*NeedDevicePtrArgs=*/nullptr, /*NeedDevicePtrArgsSize=*/0,
7125+
/*NeedDeviceAddrArgs=*/nullptr, /*NeedDeviceAddrArgsSize=*/0,
71257126
/*AppendArgs=*/nullptr, /*AppendArgsSize=*/0);
71267127
for (FunctionDecl *BaseFD : Bases)
71277128
BaseFD->addAttr(OMPDeclareVariantA);
@@ -7553,6 +7554,7 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective(
75537554
FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI,
75547555
ArrayRef<Expr *> AdjustArgsNothing,
75557556
ArrayRef<Expr *> AdjustArgsNeedDevicePtr,
7557+
ArrayRef<Expr *> AdjustArgsNeedDeviceAddr,
75567558
ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc,
75577559
SourceLocation AppendArgsLoc, SourceRange SR) {
75587560

@@ -7564,6 +7566,7 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective(
75647566
SmallVector<Expr *, 8> AllAdjustArgs;
75657567
llvm::append_range(AllAdjustArgs, AdjustArgsNothing);
75667568
llvm::append_range(AllAdjustArgs, AdjustArgsNeedDevicePtr);
7569+
llvm::append_range(AllAdjustArgs, AdjustArgsNeedDeviceAddr);
75677570

75687571
if (!AllAdjustArgs.empty() || !AppendArgs.empty()) {
75697572
VariantMatchInfo VMI;
@@ -7614,6 +7617,8 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective(
76147617
const_cast<Expr **>(AdjustArgsNothing.data()), AdjustArgsNothing.size(),
76157618
const_cast<Expr **>(AdjustArgsNeedDevicePtr.data()),
76167619
AdjustArgsNeedDevicePtr.size(),
7620+
const_cast<Expr **>(AdjustArgsNeedDeviceAddr.data()),
7621+
AdjustArgsNeedDeviceAddr.size(),
76177622
const_cast<OMPInteropInfo *>(AppendArgs.data()), AppendArgs.size(), SR);
76187623
FD->addAttr(NewAttr);
76197624
}

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@ static void instantiateOMPDeclareVariantAttr(
527527

528528
SmallVector<Expr *, 8> NothingExprs;
529529
SmallVector<Expr *, 8> NeedDevicePtrExprs;
530+
SmallVector<Expr *, 8> NeedDeviceAddrExprs;
530531
SmallVector<OMPInteropInfo, 4> AppendArgs;
531532

532533
for (Expr *E : Attr.adjustArgsNothing()) {
@@ -541,14 +542,20 @@ static void instantiateOMPDeclareVariantAttr(
541542
continue;
542543
NeedDevicePtrExprs.push_back(ER.get());
543544
}
545+
for (Expr *E : Attr.adjustArgsNeedDeviceAddr()) {
546+
ExprResult ER = Subst(E);
547+
if (ER.isInvalid())
548+
continue;
549+
NeedDeviceAddrExprs.push_back(ER.get());
550+
}
544551
for (OMPInteropInfo &II : Attr.appendArgs()) {
545552
// When prefer_type is implemented for append_args handle them here too.
546553
AppendArgs.emplace_back(II.IsTarget, II.IsTargetSync);
547554
}
548555

549556
S.OpenMP().ActOnOpenMPDeclareVariantDirective(
550-
FD, E, TI, NothingExprs, NeedDevicePtrExprs, AppendArgs, SourceLocation(),
551-
SourceLocation(), Attr.getRange());
557+
FD, E, TI, NothingExprs, NeedDevicePtrExprs, NeedDeviceAddrExprs,
558+
AppendArgs, SourceLocation(), SourceLocation(), Attr.getRange());
552559
}
553560

554561
static void instantiateDependentAMDGPUFlatWorkGroupSizeAttr(

clang/test/OpenMP/declare_variant_clauses_ast_print.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ void foo_v3(float *AAA, float *BBB, int *I) {return;}
5454
//DUMP: DeclRefExpr{{.*}}Function{{.*}}foo_v1
5555
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'AAA'
5656
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'BBB'
57-
//PRINT: #pragma omp declare variant(foo_v3) match(construct={dispatch}, device={arch(x86, x86_64)}) adjust_args(nothing:I) adjust_args(need_device_ptr:BBB)
57+
//PRINT: #pragma omp declare variant(foo_v3) match(construct={dispatch}, device={arch(x86, x86_64)}) adjust_args(nothing:I) adjust_args(need_device_ptr:BBB) adjust_args(need_device_addr:AAA)
5858

59-
//PRINT: #pragma omp declare variant(foo_v2) match(construct={dispatch}, device={arch(ppc)}) adjust_args(need_device_ptr:AAA)
59+
//PRINT: #pragma omp declare variant(foo_v2) match(construct={dispatch}, device={arch(ppc)}) adjust_args(need_device_ptr:AAA) adjust_args(need_device_addr:BBB)
6060

6161
//PRINT: omp declare variant(foo_v1) match(construct={dispatch}, device={arch(arm)}) adjust_args(need_device_ptr:AAA,BBB)
6262

@@ -66,42 +66,48 @@ void foo_v3(float *AAA, float *BBB, int *I) {return;}
6666

6767
#pragma omp declare variant(foo_v2) \
6868
match(construct={dispatch}, device={arch(ppc)}), \
69-
adjust_args(need_device_ptr:AAA)
69+
adjust_args(need_device_ptr:AAA) \
70+
adjust_args(need_device_addr:BBB)
7071

7172
#pragma omp declare variant(foo_v3) \
7273
adjust_args(need_device_ptr:BBB) adjust_args(nothing:I) \
74+
adjust_args(need_device_addr:AAA) \
7375
match(construct={dispatch}, device={arch(x86,x86_64)})
7476

7577
void foo(float *AAA, float *BBB, int *I) {return;}
7678

77-
void Foo_Var(float *AAA, float *BBB) {return;}
79+
void Foo_Var(float *AAA, float *BBB, float *CCC) {return;}
7880

7981
#pragma omp declare variant(Foo_Var) \
8082
match(construct={dispatch}, device={arch(x86_64)}) \
81-
adjust_args(need_device_ptr:AAA) adjust_args(nothing:BBB)
83+
adjust_args(need_device_ptr:AAA) adjust_args(nothing:BBB) \
84+
adjust_args(need_device_addr:CCC)
8285
template<typename T>
83-
void Foo(T *AAA, T *BBB) {return;}
86+
void Foo(T *AAA, T *BBB, T *CCC) {return;}
8487

85-
//PRINT: #pragma omp declare variant(Foo_Var) match(construct={dispatch}, device={arch(x86_64)}) adjust_args(nothing:BBB) adjust_args(need_device_ptr:AAA)
86-
//DUMP: FunctionDecl{{.*}} Foo 'void (T *, T *)'
88+
//PRINT: #pragma omp declare variant(Foo_Var) match(construct={dispatch}, device={arch(x86_64)}) adjust_args(nothing:BBB) adjust_args(need_device_ptr:AAA) adjust_args(need_device_addr:CCC)
89+
//DUMP: FunctionDecl{{.*}} Foo 'void (T *, T *, T *)'
8790
//DUMP: OMPDeclareVariantAttr{{.*}}device={arch(x86_64)}
8891
//DUMP: DeclRefExpr{{.*}}Function{{.*}}Foo_Var
8992
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'BBB'
9093
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'AAA'
94+
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'CCC'
9195
//
92-
//DUMP: FunctionDecl{{.*}} Foo 'void (float *, float *)'
96+
//DUMP: FunctionDecl{{.*}} Foo 'void (float *, float *, float *)'
9397
//DUMP: OMPDeclareVariantAttr{{.*}}device={arch(x86_64)}
9498
//DUMP: DeclRefExpr{{.*}}Function{{.*}}Foo_Var
9599
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'BBB'
96100
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'AAA'
101+
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'CCC'
97102

98103
void func()
99104
{
100105
float *A;
101106
float *B;
107+
float *C;
102108

103109
//#pragma omp dispatch
104-
Foo(A, B);
110+
Foo(A, B, C);
105111
}
106112

107113
typedef void *omp_interop_t;

clang/test/OpenMP/declare_variant_clauses_messages.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -std=c++11 -o - %s
2-
// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -std=c++11 \
1+
// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11 -o - %s
2+
// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11 \
33
// RUN: -DNO_INTEROP_T_DEF -o - %s
4-
// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -std=c++11 -o - %s
5-
// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -Wno-strict-prototypes -DC -x c -o - %s
4+
// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11 -o - %s
5+
// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -Wno-strict-prototypes -DC -x c -o - %s
66
// RUN: %clang_cc1 -verify -triple x86_64-pc-windows-msvc -fms-compatibility \
7-
// RUN: -fopenmp -Wno-strict-prototypes -DC -DWIN -x c -o - %s
7+
// RUN: -fopenmp -fopenmp-version=60 -Wno-strict-prototypes -DC -DWIN -x c -o - %s
88

99
#ifdef NO_INTEROP_T_DEF
1010
void foo_v1(float *, void *);
@@ -114,6 +114,16 @@ void vararg_bar2(const char *fmt) { return; }
114114
match(construct={dispatch}, device={arch(ppc)}), \
115115
adjust_args(need_device_ptr:AAA) adjust_args(nothing:AAA)
116116

117+
// expected-error@+3 {{'adjust_arg' argument 'AAA' used in multiple clauses}}
118+
#pragma omp declare variant(foo_v1) \
119+
match(construct={dispatch}, device={arch(arm)}) \
120+
adjust_args(need_device_ptr:AAA,BBB) adjust_args(need_device_addr:AAA)
121+
122+
// expected-error@+3 {{'adjust_arg' argument 'AAA' used in multiple clauses}}
123+
#pragma omp declare variant(foo_v1) \
124+
match(construct={dispatch}, device={arch(ppc)}), \
125+
adjust_args(need_device_addr:AAA) adjust_args(nothing:AAA)
126+
117127
// expected-error@+2 {{use of undeclared identifier 'J'}}
118128
#pragma omp declare variant(foo_v1) \
119129
adjust_args(nothing:J) \
@@ -186,12 +196,12 @@ void vararg_bar2(const char *fmt) { return; }
186196
// expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *, omp_interop_t)' (aka 'void (float *, float *, int *, void *)') is incompatible with type 'void (float *, float *, int *)'}}
187197
#pragma omp declare variant(foo_v4) match(construct={dispatch})
188198

189-
// expected-error@+3 {{incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'}}
199+
// expected-error@+3 {{incorrect 'adjust_args' type, expected 'need_device_ptr', 'need_device_addr', or 'nothing'}}
190200
#pragma omp declare variant(foo_v1) \
191201
match(construct={dispatch}, device={arch(arm)}) \
192202
adjust_args(badaaop:AAA,BBB)
193203

194-
// expected-error@+3 {{incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'}}
204+
// expected-error@+3 {{incorrect 'adjust_args' type, expected 'need_device_ptr', 'need_device_addr', or 'nothing'}}
195205
#pragma omp declare variant(foo_v1) \
196206
match(construct={dispatch}, device={arch(arm)}) \
197207
adjust_args(badaaop AAA,BBB)

0 commit comments

Comments
 (0)