[OpenMP 60] Initial parsing/sema for need_device_addr modifier on adjust_args clause by mdfazlay · Pull Request #143442 · llvm/llvm-project (original) (raw)
@llvm/pr-subscribers-clang
Author: Fazlay Rabbi (mdfazlay)
Changes
Adds initial parsing and semantic analysis for need_device_addr modifier on adjust_args clause.
Full diff: https://github.com/llvm/llvm-project/pull/143442.diff
10 Files Affected:
- (modified) clang/include/clang/Basic/Attr.td (+1)
- (modified) clang/include/clang/Basic/DiagnosticParseKinds.td (+3-2)
- (modified) clang/include/clang/Basic/OpenMPKinds.def (+1)
- (modified) clang/include/clang/Sema/SemaOpenMP.h (+1)
- (modified) clang/lib/AST/AttrImpl.cpp (+6)
- (modified) clang/lib/Parse/ParseOpenMP.cpp (+12-7)
- (modified) clang/lib/Sema/SemaOpenMP.cpp (+5)
- (modified) clang/lib/Sema/SemaTemplateInstantiateDecl.cpp (+9-2)
- (modified) clang/test/OpenMP/declare_variant_clauses_ast_print.cpp (+16-10)
- (modified) clang/test/OpenMP/declare_variant_clauses_messages.cpp (+17-7)
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index f889e41c8699f..c8e6f7aad5459 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -4608,6 +4608,7 @@ def OMPDeclareVariant : InheritableAttr { OMPTraitInfoArgument<"TraitInfos">, VariadicExprArgument<"AdjustArgsNothing">, VariadicExprArgument<"AdjustArgsNeedDevicePtr">,
- VariadicExprArgument<"AdjustArgsNeedDeviceAddr">, VariadicOMPInteropInfoArgument<"AppendArgs">, ]; let AdditionalMembers = [{ diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 3aa36ad59d0b9..64931ae8f72a9 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -1581,8 +1581,9 @@ def err_omp_unexpected_append_op : Error< "unexpected operation specified in 'append_args' clause, expected 'interop'">; def err_omp_unexpected_execution_modifier : Error< "unexpected 'execution' modifier in non-executable context">; -def err_omp_unknown_adjust_args_op : Error<
- "incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'">; +def err_omp_unknown_adjust_args_op
- : Error<"incorrect adjust_args type, expected 'need_device_ptr'%select{|, "
"'need_device_addr',}0 or 'nothing'">;
def err_omp_declare_variant_wrong_clause : Error< "expected %select{'match'|'match', 'adjust_args', or 'append_args'}0 clause " "on 'omp declare variant' directive">; diff --git a/clang/include/clang/Basic/OpenMPKinds.def b/clang/include/clang/Basic/OpenMPKinds.def index b0de65df7e397..2b1dc1e0121b2 100644 --- a/clang/include/clang/Basic/OpenMPKinds.def +++ b/clang/include/clang/Basic/OpenMPKinds.def @@ -214,6 +214,7 @@ OPENMP_ORIGINAL_SHARING_MODIFIER(default) // Adjust-op kinds for the 'adjust_args' clause. OPENMP_ADJUST_ARGS_KIND(nothing) OPENMP_ADJUST_ARGS_KIND(need_device_ptr) +OPENMP_ADJUST_ARGS_KIND(need_device_addr)
// Binding kinds for the 'bind' clause. OPENMP_BIND_KIND(teams) diff --git a/clang/include/clang/Sema/SemaOpenMP.h b/clang/include/clang/Sema/SemaOpenMP.h index 6498390fe96f7..be6bec2068784 100644 --- a/clang/include/clang/Sema/SemaOpenMP.h +++ b/clang/include/clang/Sema/SemaOpenMP.h @@ -849,6 +849,7 @@ class SemaOpenMP : public SemaBase { FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef<Expr *> AdjustArgsNothing, ArrayRef<Expr *> AdjustArgsNeedDevicePtr,
ArrayRef<Expr *> AdjustArgsNeedDeviceAddr, ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR);
diff --git a/clang/lib/AST/AttrImpl.cpp b/clang/lib/AST/AttrImpl.cpp index fefb8f55a9ee2..5875a925d3fb0 100644 --- a/clang/lib/AST/AttrImpl.cpp +++ b/clang/lib/AST/AttrImpl.cpp @@ -224,6 +224,12 @@ void OMPDeclareVariantAttr::printPrettyPragma( PrintExprs(adjustArgsNeedDevicePtr_begin(), adjustArgsNeedDevicePtr_end()); OS << ")"; }
if (adjustArgsNeedDeviceAddr_size()) {
OS << " adjust_args(need_device_addr:";
PrintExprs(adjustArgsNeedDeviceAddr_begin(),
adjustArgsNeedDeviceAddr_end());OS << ")";
}
auto PrintInteropInfo = [&OS](OMPInteropInfo *Begin, OMPInteropInfo *End) { for (OMPInteropInfo *I = Begin; I != End; ++I) {
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index e41e5ba8596b9..dd184ba6ac607 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -1483,6 +1483,7 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, OMPTraitInfo &TI = ASTCtx.getNewOMPTraitInfo(); SmallVector<Expr *, 6> AdjustNothing; SmallVector<Expr *, 6> AdjustNeedDevicePtr;
- SmallVector<Expr *, 6> AdjustNeedDeviceAddr; SmallVector<OMPInteropInfo, 3> AppendArgs; SourceLocation AdjustArgsLoc, AppendArgsLoc;
@@ -1515,11 +1516,14 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, SmallVector<Expr *> Vars; IsError = ParseOpenMPVarList(OMPD_declare_variant, OMPC_adjust_args, Vars, Data);
if (!IsError)llvm::append_range(Data.ExtraModifier == OMPC_ADJUST_ARGS_nothing? AdjustNothing: AdjustNeedDevicePtr,Vars);
if (!IsError) {if (Data.ExtraModifier == OMPC_ADJUST_ARGS_nothing)llvm::append_range(AdjustNothing, Vars);else if (Data.ExtraModifier == OMPC_ADJUST_ARGS_need_device_ptr)llvm::append_range(AdjustNeedDevicePtr, Vars);else if (Data.ExtraModifier == OMPC_ADJUST_ARGS_need_device_addr)llvm::append_range(AdjustNeedDeviceAddr, Vars);} break; } case OMPC_append_args:
@@ -1559,7 +1563,7 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, if (DeclVarData && !TI.Sets.empty()) Actions.OpenMP().ActOnOpenMPDeclareVariantDirective( DeclVarData->first, DeclVarData->second, TI, AdjustNothing,
AdjustNeedDevicePtr, AppendArgs, AdjustArgsLoc, AppendArgsLoc,
// Skip the last annot_pragma_openmp_end.AdjustNeedDevicePtr, AdjustNeedDeviceAddr, AppendArgs, AdjustArgsLoc, AppendArgsLoc, SourceRange(Loc, Tok.getLocation()));
@@ -4818,7 +4822,8 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind, getLangOpts()); Data.ExtraModifierLoc = Tok.getLocation(); if (Data.ExtraModifier == OMPC_ADJUST_ARGS_unknown) {
Diag(Tok, diag::err_omp_unknown_adjust_args_op);
Diag(Tok, diag::err_omp_unknown_adjust_args_op) << (getLangOpts().OpenMP >=
} else { ConsumeToken();60 ? 1 : 0); SkipUntil(tok::r_paren, tok::annot_pragma_openmp_end, StopBeforeMatch);
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index dd185f2ff254b..cec17052b0680 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -7122,6 +7122,7 @@ void SemaOpenMP::ActOnFinishedFunctionDefinitionInOpenMPDeclareVariantScope( getASTContext(), VariantFuncRef, DVScope.TI, /NothingArgs=/nullptr, /NothingArgsSize=/0, /NeedDevicePtrArgs=/nullptr, /NeedDevicePtrArgsSize=/0,
for (FunctionDecl *BaseFD : Bases) BaseFD->addAttr(OMPDeclareVariantA); @@ -7553,6 +7554,7 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective( FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef<Expr *> AdjustArgsNothing, ArrayRef<Expr *> AdjustArgsNeedDevicePtr,/*NeedDeviceAddrArgs=*/nullptr, /*NeedDeviceAddrArgsSize=*/0, /*AppendArgs=*/nullptr, /*AppendArgsSize=*/0);- ArrayRef<Expr *> AdjustArgsNeedDeviceAddr, ArrayRef AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR) {
@@ -7564,6 +7566,7 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective( SmallVector<Expr *, 8> AllAdjustArgs; llvm::append_range(AllAdjustArgs, AdjustArgsNothing); llvm::append_range(AllAdjustArgs, AdjustArgsNeedDevicePtr);
llvm::append_range(AllAdjustArgs, AdjustArgsNeedDeviceAddr);
if (!AllAdjustArgs.empty() || !AppendArgs.empty()) { VariantMatchInfo VMI;
@@ -7614,6 +7617,8 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective( const_cast<Expr **>(AdjustArgsNothing.data()), AdjustArgsNothing.size(), const_cast<Expr **>(AdjustArgsNeedDevicePtr.data()), AdjustArgsNeedDevicePtr.size(),
const_cast<Expr **>(AdjustArgsNeedDeviceAddr.data()),AdjustArgsNeedDeviceAddr.size(), const_cast<OMPInteropInfo *>(AppendArgs.data()), AppendArgs.size(), SR);FD->addAttr(NewAttr); } diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index b8e830cc30be1..ab15a222af461 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -527,6 +527,7 @@ static void instantiateOMPDeclareVariantAttr(
SmallVector<Expr *, 8> NothingExprs; SmallVector<Expr *, 8> NeedDevicePtrExprs;
SmallVector<Expr *, 8> NeedDeviceAddrExprs; SmallVector<OMPInteropInfo, 4> AppendArgs;
for (Expr *E : Attr.adjustArgsNothing()) {
@@ -541,14 +542,20 @@ static void instantiateOMPDeclareVariantAttr( continue; NeedDevicePtrExprs.push_back(ER.get()); }
for (Expr *E : Attr.adjustArgsNeedDeviceAddr()) {
ExprResult ER = Subst(E);
if (ER.isInvalid())
continue;NeedDeviceAddrExprs.push_back(ER.get());
} for (OMPInteropInfo &II : Attr.appendArgs()) { // When prefer_type is implemented for append_args handle them here too. AppendArgs.emplace_back(II.IsTarget, II.IsTargetSync); }
S.OpenMP().ActOnOpenMPDeclareVariantDirective(
FD, E, TI, NothingExprs, NeedDevicePtrExprs, AppendArgs, SourceLocation(),SourceLocation(), Attr.getRange());
FD, E, TI, NothingExprs, NeedDevicePtrExprs, NeedDeviceAddrExprs,AppendArgs, SourceLocation(), SourceLocation(), Attr.getRange());
}
static void instantiateDependentAMDGPUFlatWorkGroupSizeAttr( diff --git a/clang/test/OpenMP/declare_variant_clauses_ast_print.cpp b/clang/test/OpenMP/declare_variant_clauses_ast_print.cpp index 172dd1670421d..c14e19cc8b7ec 100644 --- a/clang/test/OpenMP/declare_variant_clauses_ast_print.cpp +++ b/clang/test/OpenMP/declare_variant_clauses_ast_print.cpp @@ -54,9 +54,9 @@ void foo_v3(float AAA, float BBB, int I) {return;} //DUMP: DeclRefExpr{{.}}Function{{.}}foo_v1 //DUMP: DeclRefExpr{{.}}ParmVar{{.}}'AAA' //DUMP: DeclRefExpr{{.}}ParmVar{{.*}}'BBB' -//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) +//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)
-//PRINT: #pragma omp declare variant(foo_v2) match(construct={dispatch}, device={arch(ppc)}) adjust_args(need_device_ptr:AAA) +//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)
//PRINT: omp declare variant(foo_v1) match(construct={dispatch}, device={arch(arm)}) adjust_args(need_device_ptr:AAA,BBB)
@@ -66,42 +66,48 @@ void foo_v3(float *AAA, float *BBB, int *I) {return;}
#pragma omp declare variant(foo_v2)
match(construct={dispatch}, device={arch(ppc)}), \
- adjust_args(need_device_ptr:AAA)
- adjust_args(need_device_ptr:AAA) \
- adjust_args(need_device_addr:BBB)
#pragma omp declare variant(foo_v3)
adjust_args(need_device_ptr:BBB) adjust_args(nothing:I) \
- adjust_args(need_device_addr:AAA)
match(construct={dispatch}, device={arch(x86,x86_64)})
void foo(float *AAA, float *BBB, int *I) {return;}
-void Foo_Var(float *AAA, float *BBB) {return;} +void Foo_Var(float *AAA, float *BBB, float *CCC) {return;}
#pragma omp declare variant(Foo_Var)
match(construct={dispatch}, device={arch(x86_64)}) \
- adjust_args(need_device_ptr:AAA) adjust_args(nothing:BBB)
- adjust_args(need_device_ptr:AAA) adjust_args(nothing:BBB) \
- adjust_args(need_device_addr:CCC) template -void Foo(T *AAA, T *BBB) {return;} +void Foo(T *AAA, T *BBB, T *CCC) {return;}
-//PRINT: #pragma omp declare variant(Foo_Var) match(construct={dispatch}, device={arch(x86_64)}) adjust_args(nothing:BBB) adjust_args(need_device_ptr:AAA) -//DUMP: FunctionDecl{{.}} Foo 'void (T , T )' +//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) +//DUMP: FunctionDecl{{.}} Foo 'void (T , T , T )' //DUMP: OMPDeclareVariantAttr{{.}}device={arch(x86_64)} //DUMP: DeclRefExpr{{.}}Function{{.}}Foo_Var //DUMP: DeclRefExpr{{.}}ParmVar{{.}}'BBB' //DUMP: DeclRefExpr{{.}}ParmVar{{.}}'AAA' +//DUMP: DeclRefExpr{{.}}ParmVar{{.}}'CCC' // -//DUMP: FunctionDecl{{.}} Foo 'void (float , float )' +//DUMP: FunctionDecl{{.}} Foo 'void (float , float , float )' //DUMP: OMPDeclareVariantAttr{{.}}device={arch(x86_64)} //DUMP: DeclRefExpr{{.}}Function{{.}}Foo_Var //DUMP: DeclRefExpr{{.}}ParmVar{{.}}'BBB' //DUMP: DeclRefExpr{{.}}ParmVar{{.}}'AAA' +//DUMP: DeclRefExpr{{.}}ParmVar{{.}}'CCC'
void func() { float *A; float *B;
float *C;
//#pragma omp dispatch
- Foo(A, B);
- Foo(A, B, C); }
typedef void *omp_interop_t;
diff --git a/clang/test/OpenMP/declare_variant_clauses_messages.cpp b/clang/test/OpenMP/declare_variant_clauses_messages.cpp
index 284e49bbd21b4..a90cab4af9ba4 100644
--- a/clang/test/OpenMP/declare_variant_clauses_messages.cpp
+++ b/clang/test/OpenMP/declare_variant_clauses_messages.cpp
@@ -1,10 +1,10 @@
-// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -std=c++11 -o - %s
-// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -std=c++11
+// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11 -o - %s
+// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11
// RUN: -DNO_INTEROP_T_DEF -o - %s
-// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -std=c++11 -o - %s
-// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -Wno-strict-prototypes -DC -x c -o - %s
+// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11 -o - %s
+// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -Wno-strict-prototypes -DC -x c -o - %s
// RUN: %clang_cc1 -verify -triple x86_64-pc-windows-msvc -fms-compatibility
-// RUN: -fopenmp -Wno-strict-prototypes -DC -DWIN -x c -o - %s
+// RUN: -fopenmp -fopenmp-version=60 -Wno-strict-prototypes -DC -DWIN -x c -o - %s
#ifdef NO_INTEROP_T_DEF
void foo_v1(float *, void *);
@@ -114,6 +114,16 @@ void vararg_bar2(const char *fmt) { return; }
match(construct={dispatch}, device={arch(ppc)}),
adjust_args(need_device_ptr:AAA) adjust_args(nothing:AAA)
+// expected-error@+3 {{'adjust_arg' argument 'AAA' used in multiple clauses}} +#pragma omp declare variant(foo_v1) \
- match(construct={dispatch}, device={arch(arm)}) \
- adjust_args(need_device_ptr:AAA,BBB) adjust_args(need_device_addr:AAA)
- +// expected-error@+3 {{'adjust_arg' argument 'AAA' used in multiple clauses}} +#pragma omp declare variant(foo_v1) \
- match(construct={dispatch}, device={arch(ppc)}), \
- adjust_args(need_device_addr:AAA) adjust_args(nothing:AAA)
- // expected-error@+2 {{use of undeclared identifier 'J'}}
#pragma omp declare variant(foo_v1)
adjust_args(nothing:J)
@@ -186,12 +196,12 @@ void vararg_bar2(const char *fmt) { return; } // 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 *)'}} #pragma omp declare variant(foo_v4) match(construct={dispatch})
-// expected-error@+3 {{incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'}}
+// expected-error@+3 {{incorrect adjust_args type, expected 'need_device_ptr', 'need_device_addr', or 'nothing'}}
#pragma omp declare variant(foo_v1)
match(construct={dispatch}, device={arch(arm)})
adjust_args(badaaop:AAA,BBB)
-// expected-error@+3 {{incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'}}
+// expected-error@+3 {{incorrect adjust_args type, expected 'need_device_ptr', 'need_device_addr', or 'nothing'}}
#pragma omp declare variant(foo_v1)
match(construct={dispatch}, device={arch(arm)})
adjust_args(badaaop AAA,BBB)