diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index bbf2b2ac69d6..4b030a265fa6 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -24834,12 +24834,12 @@ ExprResult SemaOpenMP::ActOnOMPIteratorExpr(Scope *S, /// Check if \p AssumptionStr is a known assumption and warn if not. static void checkOMPAssumeAttr(Sema &S, SourceLocation Loc, StringRef AssumptionStr) { - if (llvm::KnownAssumptionStrings.count(AssumptionStr)) + if (llvm::getKnownAssumptionStrings().count(AssumptionStr)) return; unsigned BestEditDistance = 3; StringRef Suggestion; - for (const auto &KnownAssumptionIt : llvm::KnownAssumptionStrings) { + for (const auto &KnownAssumptionIt : llvm::getKnownAssumptionStrings()) { unsigned EditDistance = AssumptionStr.edit_distance(KnownAssumptionIt.getKey()); if (EditDistance < BestEditDistance) { diff --git a/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h b/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h index 25a35df3efe2..5c6aee3ab38a 100644 --- a/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h +++ b/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h @@ -160,7 +160,7 @@ inlineCostFeatureToMlFeature(InlineCostFeatureIndex Feature) { return static_cast(static_cast(Feature)); } -LLVM_ABI extern std::vector FeatureMap; +LLVM_ABI extern std::vector &getFeatureMap(); LLVM_ABI extern const char *const DecisionName; LLVM_ABI extern const TensorSpec InlineDecisionSpec; diff --git a/llvm/include/llvm/IR/Assumptions.h b/llvm/include/llvm/IR/Assumptions.h index f1663f3d6d2b..ebc55921e73d 100644 --- a/llvm/include/llvm/IR/Assumptions.h +++ b/llvm/include/llvm/IR/Assumptions.h @@ -30,18 +30,18 @@ constexpr StringRef AssumptionAttrKey = "llvm.assume"; /// A set of known assumption strings that are accepted without warning and /// which can be recommended as typo correction. -LLVM_ABI extern StringSet<> KnownAssumptionStrings; +LLVM_ABI extern StringSet<> &getKnownAssumptionStrings(); /// Helper that allows to insert a new assumption string in the known assumption /// set by creating a (static) object. struct KnownAssumptionString { KnownAssumptionString(const char *AssumptionStr) : AssumptionStr(AssumptionStr) { - KnownAssumptionStrings.insert(AssumptionStr); + getKnownAssumptionStrings().insert(AssumptionStr); } KnownAssumptionString(StringRef AssumptionStr) : AssumptionStr(AssumptionStr) { - KnownAssumptionStrings.insert(AssumptionStr); + getKnownAssumptionStrings().insert(AssumptionStr); } operator StringRef() const { return AssumptionStr; } diff --git a/llvm/lib/Analysis/MLInlineAdvisor.cpp b/llvm/lib/Analysis/MLInlineAdvisor.cpp index 8853a13972be..7854c19088ad 100644 --- a/llvm/lib/Analysis/MLInlineAdvisor.cpp +++ b/llvm/lib/Analysis/MLInlineAdvisor.cpp @@ -27,6 +27,7 @@ #include "llvm/Analysis/ProfileSummaryInfo.h" #include "llvm/Analysis/ReleaseModeModelRunner.h" #include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/Analysis/TensorSpec.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/InstIterator.h" #include "llvm/IR/Module.h" @@ -77,10 +78,10 @@ llvm::getReleaseModeAdvisor(Module &M, ModuleAnalysisManager &MAM, std::unique_ptr AOTRunner; if (InteractiveChannelBaseName.empty()) AOTRunner = std::make_unique>( - M.getContext(), FeatureMap, DecisionName, + M.getContext(), getFeatureMap(), DecisionName, EmbeddedModelRunnerOptions().setModelSelector(ModelSelector)); else { - auto Features = FeatureMap; + auto Features = getFeatureMap(); if (InteractiveIncludeDefault) Features.push_back(DefaultDecisionSpec); AOTRunner = std::make_unique( @@ -106,8 +107,9 @@ static cl::opt KeepFPICache( "For test - keep the ML Inline advisor's FunctionPropertiesInfo cache"), cl::init(false)); -// clang-format off -std::vector llvm::FeatureMap{ +std::vector &llvm::getFeatureMap() { + // clang-format off +static std::vector FeatureMap{ #define POPULATE_NAMES(DTYPE, SHAPE, NAME, __) TensorSpec::createSpec(#NAME, SHAPE), // InlineCost features - these must come first INLINE_COST_FEATURE_ITERATOR(POPULATE_NAMES) @@ -116,7 +118,9 @@ std::vector llvm::FeatureMap{ INLINE_FEATURE_ITERATOR(POPULATE_NAMES) #undef POPULATE_NAMES }; -// clang-format on + // clang-format on + return FeatureMap; +} const char *const llvm::DecisionName = "inlining_decision"; const TensorSpec llvm::InlineDecisionSpec = @@ -195,9 +199,9 @@ MLInlineAdvisor::MLInlineAdvisor( } // Add the IR2Vec features to the feature map auto IR2VecDim = IR2VecVocabResult->getDimension(); - FeatureMap.push_back( + getFeatureMap().push_back( TensorSpec::createSpec("callee_embedding", {IR2VecDim})); - FeatureMap.push_back( + getFeatureMap().push_back( TensorSpec::createSpec("caller_embedding", {IR2VecDim})); } } @@ -471,7 +475,8 @@ std::unique_ptr MLInlineAdvisor::getAdviceImpl(CallBase &CB) { } // This one would have been set up to be right at the end. if (!InteractiveChannelBaseName.empty() && InteractiveIncludeDefault) - *ModelRunner->getTensor(FeatureMap.size()) = GetDefaultAdvice(CB); + *ModelRunner->getTensor(getFeatureMap().size()) = + GetDefaultAdvice(CB); return getAdviceFromModel(CB, ORE); } @@ -549,8 +554,8 @@ void MLInlineAdvice::reportContextForRemark( DiagnosticInfoOptimizationBase &OR) { using namespace ore; OR << NV("Callee", Callee->getName()); - for (size_t I = 0; I < FeatureMap.size(); ++I) - OR << NV(FeatureMap[I].name(), + for (size_t I = 0; I < getFeatureMap().size(); ++I) + OR << NV(getFeatureMap()[I].name(), *getAdvisor()->getModelRunner().getTensor(I)); OR << NV("ShouldInline", isInliningRecommended()); } diff --git a/llvm/lib/IR/Assumptions.cpp b/llvm/lib/IR/Assumptions.cpp index 6adbbc4a63b0..f8bbcb32231c 100644 --- a/llvm/lib/IR/Assumptions.cpp +++ b/llvm/lib/IR/Assumptions.cpp @@ -101,12 +101,16 @@ bool llvm::addAssumptions(CallBase &CB, return ::addAssumptionsImpl(CB, Assumptions); } -StringSet<> llvm::KnownAssumptionStrings({ - "omp_no_openmp", // OpenMP 5.1 - "omp_no_openmp_routines", // OpenMP 5.1 - "omp_no_parallelism", // OpenMP 5.1 - "omp_no_openmp_constructs", // OpenMP 6.0 - "ompx_spmd_amenable", // OpenMPOpt extension - "ompx_no_call_asm", // OpenMPOpt extension - "ompx_aligned_barrier", // OpenMPOpt extension -}); +StringSet<> &llvm::getKnownAssumptionStrings() { + static StringSet<> Object({ + "omp_no_openmp", // OpenMP 5.1 + "omp_no_openmp_routines", // OpenMP 5.1 + "omp_no_parallelism", // OpenMP 5.1 + "omp_no_openmp_constructs", // OpenMP 6.0 + "ompx_spmd_amenable", // OpenMPOpt extension + "ompx_no_call_asm", // OpenMPOpt extension + "ompx_aligned_barrier", // OpenMPOpt extension + }); + + return Object; +}