[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:

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">,

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,

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 << ")"; }

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;

@@ -1515,11 +1516,14 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, SmallVector<Expr *> Vars; IsError = ParseOpenMPVarList(OMPD_declare_variant, OMPC_adjust_args, Vars, Data);

@@ -1559,7 +1563,7 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, if (DeclVarData && !TI.Sets.empty()) Actions.OpenMP().ActOnOpenMPDeclareVariantDirective( DeclVarData->first, DeclVarData->second, TI, AdjustNothing,

@@ -4818,7 +4822,8 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind, getLangOpts()); Data.ExtraModifierLoc = Tok.getLocation(); if (Data.ExtraModifier == OMPC_ADJUST_ARGS_unknown) {

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,

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

@@ -7614,6 +7617,8 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective( const_cast<Expr **>(AdjustArgsNothing.data()), AdjustArgsNothing.size(), const_cast<Expr **>(AdjustArgsNeedDevicePtr.data()), AdjustArgsNeedDevicePtr.size(),

@@ -541,14 +542,20 @@ static void instantiateOMPDeclareVariantAttr( continue; NeedDevicePtrExprs.push_back(ER.get()); }

}

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)}), \

#pragma omp declare variant(foo_v3)
adjust_args(need_device_ptr:BBB) adjust_args(nothing:I) \

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)}) \

-//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;

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) \

-// 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)