Looks like this fails on Windows: http://lab.llvm.org:8011/builders/clang-x64-windows-msvc/builds/11207/steps/stage%201%20check/logs/stdio
On Thu, Oct 3, 2019 at 4:47 PM Alexey Bataev via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: abataev > Date: Thu Oct 3 13:49:48 2019 > New Revision: 373661 > > URL: http://llvm.org/viewvc/llvm-project?rev=373661&view=rev > Log: > [OPENMP50]Codegen support for scores in context selectors. > > If the context selector has associated score and several contexts > selectors matches current context, the function with the highest score > must be selected. > > Modified: > cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp > cfe/trunk/test/OpenMP/declare_variant_implementation_vendor_codegen.cpp > > Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=373661&r1=373660&r2=373661&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp Thu Oct 3 13:49:48 2019 > @@ -11175,37 +11175,87 @@ bool checkContext<OMPDeclareVariantAttr: > return !A->getImplVendor().compare("llvm"); > } > > +static bool greaterCtxScore(ASTContext &Ctx, const Expr *LHS, const Expr > *RHS) { > + // If both scores are unknown, choose the very first one. > + if (!LHS && !RHS) > + return true; > + // If only one is known, return this one. > + if (LHS && !RHS) > + return true; > + if (!LHS && RHS) > + return false; > + llvm::APSInt LHSVal = LHS->EvaluateKnownConstInt(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<const OMPDeclareVariantAttr *> { > +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(const FunctionDecl > *FD) { > +static const FunctionDecl *getDeclareVariantFunction(ASTContext &Ctx, > + const FunctionDecl > *FD) { > if (!FD->hasAttrs() || !FD->hasAttr<OMPDeclareVariantAttr>()) > return FD; > // Iterate through all DeclareVariant attributes and check context > selectors. > - SmallVector<const OMPDeclareVariantAttr *, 4> MatchingAttributes; > - for (const auto * A : FD->specific_attrs<OMPDeclareVariantAttr>()) { > + 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); > + }; > + const OMPDeclareVariantAttr *TopMostAttr = nullptr; > + for (const auto *A : FD->specific_attrs<OMPDeclareVariantAttr>()) { > + const OMPDeclareVariantAttr *SelectedAttr = nullptr; > switch (A->getCtxSelectorSet()) { > case OMPDeclareVariantAttr::CtxSetImplementation: > switch (A->getCtxSelector()) { > case OMPDeclareVariantAttr::CtxVendor: > if (checkContext<OMPDeclareVariantAttr::CtxSetImplementation, > OMPDeclareVariantAttr::CtxVendor>(A)) > - MatchingAttributes.push_back(A); > + SelectedAttr = A; > break; > case OMPDeclareVariantAttr::CtxUnknown: > llvm_unreachable( > - "Unknown context selector in implementation selctor set."); > + "Unknown context selector in implementation selector set."); > } > break; > case OMPDeclareVariantAttr::CtxSetUnknown: > llvm_unreachable("Unknown context selector set."); > } > + // If the attribute matches the context, find the attribute with the > highest > + // score. > + if (SelectedAttr && (!TopMostAttr || Comparer(TopMostAttr, > SelectedAttr))) > + TopMostAttr = SelectedAttr; > } > - if (MatchingAttributes.empty()) > + if (!TopMostAttr) > return FD; > - // TODO: implement score analysis of multiple context selectors. > - const OMPDeclareVariantAttr *MainAttr = MatchingAttributes.front(); > return cast<FunctionDecl>( > - > cast<DeclRefExpr>(MainAttr->getVariantFuncRef()->IgnoreParenImpCasts()) > + > cast<DeclRefExpr>(TopMostAttr->getVariantFuncRef()->IgnoreParenImpCasts()) > ->getDecl()); > } > > @@ -11216,7 +11266,7 @@ bool CGOpenMPRuntime::emitDeclareVariant > llvm::GlobalValue *Orig = CGM.GetGlobalValue(MangledName); > if (Orig && !Orig->isDeclaration()) > return false; > - const FunctionDecl *NewFD = getDeclareVariantFunction(D); > + const FunctionDecl *NewFD = getDeclareVariantFunction(CGM.getContext(), > D); > // Emit original function if it does not have declare variant attribute > or the > // context does not match. > if (NewFD == D) > > Modified: > cfe/trunk/test/OpenMP/declare_variant_implementation_vendor_codegen.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_variant_implementation_vendor_codegen.cpp?rev=373661&r1=373660&r2=373661&view=diff > > ============================================================================== > --- > cfe/trunk/test/OpenMP/declare_variant_implementation_vendor_codegen.cpp > (original) > +++ > cfe/trunk/test/OpenMP/declare_variant_implementation_vendor_codegen.cpp Thu > Oct 3 13:49:48 2019 > @@ -3,11 +3,13 @@ > // RUN: %clang_cc1 -fopenmp -x c++ -triple %itanium_abi_triple > -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s > -emit-llvm -o - -fopenmp-version=50 | FileCheck %s > // expected-no-diagnostics > > -// CHECK-NOT: ret i32 {{1|4}} > +// CHECK-NOT: ret i32 {{1|4|81|84}} > // CHECK-DAG: @_Z3barv = {{.*}}alias i32 (), i32 ()* @_Z3foov > // CHECK-DAG: @_ZN16SpecSpecialFuncs6MethodEv = {{.*}}alias i32 > (%struct.SpecSpecialFuncs*), i32 (%struct.SpecSpecialFuncs*)* > @_ZN16SpecSpecialFuncs7method_Ev > // CHECK-DAG: @_ZN16SpecSpecialFuncs6methodEv = linkonce_odr {{.*}}alias > i32 (%struct.SpecSpecialFuncs*), i32 (%struct.SpecSpecialFuncs*)* > @_ZN16SpecSpecialFuncs7method_Ev > // CHECK-DAG: @_ZN12SpecialFuncs6methodEv = linkonce_odr {{.*}}alias i32 > (%struct.SpecialFuncs*), i32 (%struct.SpecialFuncs*)* > @_ZN12SpecialFuncs7method_Ev > +// CHECK-DAG: @_Z5prio_v = alias i32 (), i32 ()* @_Z4priov > +// CHECK-DAG: @_ZL6prio1_v = internal alias i32 (), i32 ()* @_ZL5prio2v > // CHECK-DAG: @_Z4callv = {{.*}}alias i32 (), i32 ()* @_Z4testv > // CHECK-DAG: @_ZL9stat_usedv = internal alias i32 (), i32 ()* > @_ZL10stat_used_v > // CHECK-DAG: @_ZN12SpecialFuncs6MethodEv = {{.*}}alias i32 > (%struct.SpecialFuncs*), i32 (%struct.SpecialFuncs*)* > @_ZN12SpecialFuncs7method_Ev > @@ -18,7 +20,9 @@ > // CHECK-DAG: ret i32 5 > // CHECK-DAG: ret i32 6 > // CHECK-DAG: ret i32 7 > -// CHECK-NOT: ret i32 {{1|4}} > +// CHECK-DAG: ret i32 82 > +// CHECK-DAG: ret i32 83 > +// CHECK-NOT: ret i32 {{1|4|81|84}} > > #ifndef HEADER > #define HEADER > @@ -88,4 +92,22 @@ void xxx() { > (void)s1.method(); > } > > +int prio() { return 81; } > +int prio1() { return 82; } > + > +#pragma omp declare variant(prio) match(implementation = {vendor(llvm)}) > +#pragma omp declare variant(prio1) match(implementation = > {vendor(score(1): llvm)}) > +int prio_() { return 1; } > + > +static int prio2() { return 83; } > +static int prio3() { return 84; } > +static int prio4() { return 84; } > + > +#pragma omp declare variant(prio4) match(implementation = > {vendor(score(3): llvm)}) > +#pragma omp declare variant(prio2) match(implementation = > {vendor(score(5): llvm)}) > +#pragma omp declare variant(prio3) match(implementation = > {vendor(score(1): llvm)}) > +static int prio1_() { return 1; } > + > +int int_fn() { return prio1_(); } > + > #endif // HEADER > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits