diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index d5018f444e1c26..0d25e775e2afdb 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -3312,12 +3312,6 @@ def OMPDeclareVariant : InheritableAttr { [ "CtxSetUnknown", "CtxSetImplementation" ]>, - EnumArgument<"CtxScore", "ScoreType", - [ "", "score" - ], - [ - "ScoreUnknown", "ScoreSpecified" - ]>, EnumArgument<"CtxSelector", "CtxSelectorType", [ "", "vendor" ], diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 514457d9e4afd7..b48c52dbc1edbb 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -11044,41 +11044,11 @@ bool checkContextEvaluateKnownConstInt(Ctx); llvm::APSInt RHSVal = RHS->EvaluateKnownConstInt(Ctx); return llvm::APSInt::compareValues(LHSVal, RHSVal) >= 0; } -namespace { -/// Comparator for the priority queue for context selector. -class OMPDeclareVariantAttrComparer - : public std::greater { -private: - ASTContext &Ctx; - -public: - OMPDeclareVariantAttrComparer(ASTContext &Ctx) : Ctx(Ctx) {} - bool operator()(const OMPDeclareVariantAttr *LHS, - const OMPDeclareVariantAttr *RHS) const { - const Expr *LHSExpr = nullptr; - const Expr *RHSExpr = nullptr; - if (LHS->getCtxScore() == OMPDeclareVariantAttr::ScoreSpecified) - LHSExpr = LHS->getScore(); - if (RHS->getCtxScore() == OMPDeclareVariantAttr::ScoreSpecified) - RHSExpr = RHS->getScore(); - return greaterCtxScore(Ctx, LHSExpr, RHSExpr); - } -}; -} // anonymous namespace - /// Finds the variant function that matches current context with its context /// selector. static const FunctionDecl *getDeclareVariantFunction(ASTContext &Ctx, @@ -11088,13 +11058,7 @@ static const FunctionDecl *getDeclareVariantFunction(ASTContext &Ctx, // Iterate through all DeclareVariant attributes and check context selectors. auto &&Comparer = [&Ctx](const OMPDeclareVariantAttr *LHS, const OMPDeclareVariantAttr *RHS) { - const Expr *LHSExpr = nullptr; - const Expr *RHSExpr = nullptr; - if (LHS->getCtxScore() == OMPDeclareVariantAttr::ScoreSpecified) - LHSExpr = LHS->getScore(); - if (RHS->getCtxScore() == OMPDeclareVariantAttr::ScoreSpecified) - RHSExpr = RHS->getScore(); - return greaterCtxScore(Ctx, LHSExpr, RHSExpr); + return greaterCtxScore(Ctx, LHS->getScore(), RHS->getScore()); }; const OMPDeclareVariantAttr *TopMostAttr = nullptr; for (const auto *A : FD->specific_attrs()) { diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 816e8882510a1d..e59b83dd99926f 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -800,13 +800,8 @@ static ExprResult parseContextScore(Parser &P) { SmallString<16> Buffer; StringRef SelectorName = P.getPreprocessor().getSpelling(P.getCurToken(), Buffer); - OMPDeclareVariantAttr::ScoreType ScoreKind = - OMPDeclareVariantAttr::ScoreUnknown; - (void)OMPDeclareVariantAttr::ConvertStrToScoreType(SelectorName, ScoreKind); - if (ScoreKind == OMPDeclareVariantAttr::ScoreUnknown) + if (!SelectorName.equals("score")) return ScoreExpr; - assert(ScoreKind == OMPDeclareVariantAttr::ScoreSpecified && - "Expected \"score\" clause."); (void)P.ConsumeToken(); SourceLocation RLoc; ScoreExpr = P.ParseOpenMPParensExpr(SelectorName, RLoc); diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 9055eff872a35e..7ed582f8446f67 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -5197,9 +5197,7 @@ void Sema::ActOnOpenMPDeclareVariantDirective( Data.Ctx == OMPDeclareVariantAttr::CtxUnknown) return; Expr *Score = nullptr; - OMPDeclareVariantAttr::ScoreType ST = OMPDeclareVariantAttr::ScoreUnknown; if (Data.CtxScore.isUsable()) { - ST = OMPDeclareVariantAttr::ScoreSpecified; Score = Data.CtxScore.get(); if (!Score->isTypeDependent() && !Score->isValueDependent() && !Score->isInstantiationDependent() && @@ -5209,9 +5207,11 @@ void Sema::ActOnOpenMPDeclareVariantDirective( if (ICE.isInvalid()) return; } + } else { + Score = ActOnIntegerConstant(SourceLocation(), 0).get(); } auto *NewAttr = OMPDeclareVariantAttr::CreateImplicit( - Context, VariantRef, Score, Data.CtxSet, ST, Data.Ctx, + Context, VariantRef, Score, Data.CtxSet, Data.Ctx, Data.ImplVendors.begin(), Data.ImplVendors.size(), SR); FD->addAttr(NewAttr); } diff --git a/clang/test/OpenMP/declare_variant_ast_print.c b/clang/test/OpenMP/declare_variant_ast_print.c index 971211c1e94440..70c11d4f83da4d 100644 --- a/clang/test/OpenMP/declare_variant_ast_print.c +++ b/clang/test/OpenMP/declare_variant_ast_print.c @@ -16,7 +16,7 @@ int bar(void); // CHECK: int foo(); // CHECK-NEXT: #pragma omp declare variant(foo) match(implementation={vendor(score(5):ibm, xxx)}) -// CHECK-NEXT: #pragma omp declare variant(foo) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(foo) match(implementation={vendor(llvm)}) -// CHECK-NEXT: #pragma omp declare variant(foo) match(implementation={vendor(llvm)}) +// CHECK-NEXT: #pragma omp declare variant(foo) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(foo) match(implementation={vendor(score(0):llvm)}) +// CHECK-NEXT: #pragma omp declare variant(foo) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: int bar(); diff --git a/clang/test/OpenMP/declare_variant_ast_print.cpp b/clang/test/OpenMP/declare_variant_ast_print.cpp index a026febfb523e1..713c4b2e746807 100644 --- a/clang/test/OpenMP/declare_variant_ast_print.cpp +++ b/clang/test/OpenMP/declare_variant_ast_print.cpp @@ -18,8 +18,8 @@ T foofoo() { return T(); } // CHECK-NEXT: } // CHECK: #pragma omp declare variant(foofoo) match(implementation={vendor(score(5):ibm)}) -// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(llvm)}) +// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: int bar(); #pragma omp declare variant(foofoo ) match(xxx = {}) #pragma omp declare variant(foofoo ) match(xxx = {vvv}) @@ -29,8 +29,8 @@ T foofoo() { return T(); } int bar(); // CHECK: #pragma omp declare variant(foofoo) match(implementation={vendor(score(C + 5):ibm, xxx)}) -// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(llvm)}) +// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: template T barbar(); #pragma omp declare variant(foofoo ) match(xxx = {}) #pragma omp declare variant(foofoo ) match(xxx = {vvv}) @@ -45,8 +45,8 @@ template T barbar(); // CHECK: #pragma omp declare variant(foofoo) match(implementation={vendor(score(3 + 5):ibm, xxx)}) -// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(llvm)}) +// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(foofoo) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: template<> int barbar(); // CHECK-NEXT: int baz() { @@ -66,8 +66,8 @@ template void h_ref(C *hp, C *hp2, C *hq, C *lin) { } -// CHECK: #pragma omp declare variant(h_ref) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(h_ref) match(implementation={vendor(llvm)}) +// CHECK: #pragma omp declare variant(h_ref) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(h_ref) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: template void h(C *hp, C *hp2, C *hq, C *lin) { // CHECK-NEXT: } #pragma omp declare variant(h_ref ) match(xxx = {}) @@ -77,8 +77,8 @@ template void h(C *hp, C *hp2, C *hq, C *lin) { } -// CHECK: #pragma omp declare variant(h_ref) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(h_ref) match(implementation={vendor(llvm)}) +// CHECK: #pragma omp declare variant(h_ref) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(h_ref) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: template<> void h(float *hp, float *hp2, float *hq, float *lin) { // CHECK-NEXT: } @@ -97,8 +97,8 @@ void h(double *hp, double *hp2, double *hq, double *lin) { int fn(); // CHECK: int fn(int); int fn(int); -// CHECK: #pragma omp declare variant(fn) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(fn) match(implementation={vendor(llvm)}) +// CHECK: #pragma omp declare variant(fn) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(fn) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: int overload(); #pragma omp declare variant(fn) match(xxx = {}) #pragma omp declare variant(fn) match(implementation={vendor(llvm)}) @@ -109,8 +109,8 @@ int overload(void); // CHECK-NEXT: return 0; // CHECK-NEXT: } auto fn_deduced_variant() { return 0; } -// CHECK: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(llvm)}) +// CHECK: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: int fn_deduced(); #pragma omp declare variant(fn_deduced_variant) match(xxx = {}) #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(llvm)}) @@ -119,8 +119,8 @@ int fn_deduced(); // CHECK: int fn_deduced_variant1(); int fn_deduced_variant1(); -// CHECK: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(ibm)}) +// CHECK: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(score(0):ibm)}) // CHECK-NEXT: int fn_deduced1() { // CHECK-NEXT: return 0; // CHECK-NEXT: } @@ -140,11 +140,11 @@ auto fn_deduced1() { return 0; } // CHECK-NEXT: } // CHECK-NEXT: void bar(int) { // CHECK-NEXT: } -// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(ibm)}) +// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(score(0):ibm)}) // CHECK-NEXT: void foo1() { // CHECK-NEXT: } -// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)}) +// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(score(0):unknown)}) // CHECK-NEXT: void xxx(); // CHECK-NEXT: } s; struct SpecialFuncs { @@ -164,7 +164,7 @@ struct SpecialFuncs { void xxx(); } s; -// CHECK: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)}) +// CHECK: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(score(0):unknown)}) // CHECK-NEXT: void SpecialFuncs::xxx() { // CHECK-NEXT: } void SpecialFuncs::xxx() {} @@ -172,8 +172,8 @@ void SpecialFuncs::xxx() {} // CHECK: static void static_f_variant() { // CHECK-NEXT: } static void static_f_variant() {} -// CHECK: #pragma omp declare variant(static_f_variant) match(implementation={vendor(unknown)}) -// CHECK-NEXT: #pragma omp declare variant(static_f_variant) match(implementation={vendor(llvm)}) +// CHECK: #pragma omp declare variant(static_f_variant) match(implementation={vendor(score(0):unknown)}) +// CHECK-NEXT: #pragma omp declare variant(static_f_variant) match(implementation={vendor(score(0):llvm)}) // CHECK-NEXT: static void static_f() { // CHECK-NEXT: } #pragma omp declare variant(static_f_variant) match(xxx = {}) @@ -192,7 +192,7 @@ void bazzzz() { // CHECK: int fn_linkage_variant(); // CHECK: extern "C" { -// CHECK: #pragma omp declare variant(fn_linkage_variant) match(implementation={vendor(xxx)}) +// CHECK: #pragma omp declare variant(fn_linkage_variant) match(implementation={vendor(score(0):xxx)}) // CHECK: int fn_linkage(); // CHECK: } int fn_linkage_variant(); @@ -202,7 +202,7 @@ int fn_linkage(); } // CHECK: extern "C" int fn_linkage_variant1() -// CHECK: #pragma omp declare variant(fn_linkage_variant1) match(implementation={vendor(xxx)}) +// CHECK: #pragma omp declare variant(fn_linkage_variant1) match(implementation={vendor(score(0):xxx)}) // CHECK: int fn_linkage1(); extern "C" int fn_linkage_variant1(); #pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(xxx)})