[clang] [llvm] Singleton hack of fixing static initialisation order ficaso (PR #154541)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 21 20:03:36 PDT 2025
https://github.com/Dalmurii updated https://github.com/llvm/llvm-project/pull/154541
>From 4bc8f7c83dfd53cc1984d722e78fbc1f19fbf991 Mon Sep 17 00:00:00 2001
From: ae2f <mincraft20046 at gmail.com>
Date: Wed, 20 Aug 2025 22:26:09 +0900
Subject: [PATCH 1/5] Fix of [Static Initialization Order Fiasco
Issue](https://github.com/llvm/llvm-project/issues/154528)
Changes to be committed:
modified: clang/lib/Sema/SemaOpenMP.cpp
modified: llvm/include/llvm/Analysis/InlineModelFeatureMaps.h
modified: llvm/include/llvm/IR/Assumptions.h
modified: llvm/lib/Analysis/MLInlineAdvisor.cpp
modified: llvm/lib/IR/Assumptions.cpp
---
clang/lib/Sema/SemaOpenMP.cpp | 4 ++--
.../llvm/Analysis/InlineModelFeatureMaps.h | 2 +-
llvm/include/llvm/IR/Assumptions.h | 6 ++---
llvm/lib/Analysis/MLInlineAdvisor.cpp | 22 +++++++++++--------
llvm/lib/IR/Assumptions.cpp | 22 +++++++++++--------
5 files changed, 32 insertions(+), 24 deletions(-)
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 4ecc9b0d4c5c8..eceab451e969c 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -24790,12 +24790,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 25a35df3efe2c..258ae453f382d 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<FeatureIndex>(static_cast<size_t>(Feature));
}
-LLVM_ABI extern std::vector<TensorSpec> FeatureMap;
+LLVM_ABI extern std::vector<TensorSpec>& 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 f1663f3d6d2bd..6cc8dd1144286 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 8853a13972bea..cc9951f601cd8 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<MLModelRunner> AOTRunner;
if (InteractiveChannelBaseName.empty())
AOTRunner = std::make_unique<ReleaseModeModelRunner<CompiledModelType>>(
- 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<InteractiveModelRunner>(
@@ -106,8 +107,9 @@ static cl::opt<bool> KeepFPICache(
"For test - keep the ML Inline advisor's FunctionPropertiesInfo cache"),
cl::init(false));
+std::vector<TensorSpec>& llvm::getFeatureMap() {
// clang-format off
-std::vector<TensorSpec> llvm::FeatureMap{
+static std::vector<TensorSpec> FeatureMap{
#define POPULATE_NAMES(DTYPE, SHAPE, NAME, __) TensorSpec::createSpec<DTYPE>(#NAME, SHAPE),
// InlineCost features - these must come first
INLINE_COST_FEATURE_ITERATOR(POPULATE_NAMES)
@@ -117,6 +119,8 @@ std::vector<TensorSpec> llvm::FeatureMap{
#undef POPULATE_NAMES
};
// clang-format on
+return FeatureMap;
+}
const char *const llvm::DecisionName = "inlining_decision";
const TensorSpec llvm::InlineDecisionSpec =
@@ -126,7 +130,7 @@ const TensorSpec llvm::DefaultDecisionSpec =
TensorSpec::createSpec<int64_t>(DefaultDecisionName, {1});
const char *const llvm::RewardName = "delta_size";
-CallBase *getInlinableCS(Instruction &I) {
+static CallBase *getInlinableCS(Instruction &I) {
if (auto *CS = dyn_cast<CallBase>(&I))
if (Function *Callee = CS->getCalledFunction()) {
if (!Callee->isDeclaration()) {
@@ -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<float>("callee_embedding", {IR2VecDim}));
- FeatureMap.push_back(
+ getFeatureMap().push_back(
TensorSpec::createSpec<float>("caller_embedding", {IR2VecDim}));
}
}
@@ -471,7 +475,7 @@ std::unique_ptr<InlineAdvice> MLInlineAdvisor::getAdviceImpl(CallBase &CB) {
}
// This one would have been set up to be right at the end.
if (!InteractiveChannelBaseName.empty() && InteractiveIncludeDefault)
- *ModelRunner->getTensor<int64_t>(FeatureMap.size()) = GetDefaultAdvice(CB);
+ *ModelRunner->getTensor<int64_t>(getFeatureMap().size()) = GetDefaultAdvice(CB);
return getAdviceFromModel(CB, ORE);
}
@@ -549,8 +553,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<int64_t>(I));
OR << NV("ShouldInline", isInliningRecommended());
}
diff --git a/llvm/lib/IR/Assumptions.cpp b/llvm/lib/IR/Assumptions.cpp
index 6adbbc4a63b0a..bdb9bd7ae0850 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;
+}
>From d66502b57161aaa0c0df88df81eb95add095b649 Mon Sep 17 00:00:00 2001
From: ae2f <mincraft20046 at gmail.com>
Date: Wed, 20 Aug 2025 22:45:05 +0900
Subject: [PATCH 2/5] clang-formatting the changes.
Changes to be committed:
modified: llvm/include/llvm/Analysis/InlineModelFeatureMaps.h
modified: llvm/include/llvm/IR/Assumptions.h
modified: llvm/lib/Analysis/MLInlineAdvisor.cpp
modified: llvm/lib/IR/Assumptions.cpp
---
.../llvm/Analysis/InlineModelFeatureMaps.h | 2 +-
llvm/include/llvm/IR/Assumptions.h | 2 +-
llvm/lib/Analysis/MLInlineAdvisor.cpp | 11 +++++----
llvm/lib/IR/Assumptions.cpp | 24 +++++++++----------
4 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h b/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h
index 258ae453f382d..5c6aee3ab38ab 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<FeatureIndex>(static_cast<size_t>(Feature));
}
-LLVM_ABI extern std::vector<TensorSpec>& getFeatureMap();
+LLVM_ABI extern std::vector<TensorSpec> &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 6cc8dd1144286..ebc55921e73d3 100644
--- a/llvm/include/llvm/IR/Assumptions.h
+++ b/llvm/include/llvm/IR/Assumptions.h
@@ -30,7 +30,7 @@ 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<>& getKnownAssumptionStrings();
+LLVM_ABI extern StringSet<> &getKnownAssumptionStrings();
/// Helper that allows to insert a new assumption string in the known assumption
/// set by creating a (static) object.
diff --git a/llvm/lib/Analysis/MLInlineAdvisor.cpp b/llvm/lib/Analysis/MLInlineAdvisor.cpp
index cc9951f601cd8..d25d5b7fc127a 100644
--- a/llvm/lib/Analysis/MLInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/MLInlineAdvisor.cpp
@@ -107,8 +107,8 @@ static cl::opt<bool> KeepFPICache(
"For test - keep the ML Inline advisor's FunctionPropertiesInfo cache"),
cl::init(false));
-std::vector<TensorSpec>& llvm::getFeatureMap() {
-// clang-format off
+std::vector<TensorSpec> &llvm::getFeatureMap() {
+ // clang-format off
static std::vector<TensorSpec> FeatureMap{
#define POPULATE_NAMES(DTYPE, SHAPE, NAME, __) TensorSpec::createSpec<DTYPE>(#NAME, SHAPE),
// InlineCost features - these must come first
@@ -118,8 +118,8 @@ static std::vector<TensorSpec> FeatureMap{
INLINE_FEATURE_ITERATOR(POPULATE_NAMES)
#undef POPULATE_NAMES
};
-// clang-format on
-return FeatureMap;
+ // clang-format on
+ return FeatureMap;
}
const char *const llvm::DecisionName = "inlining_decision";
@@ -475,7 +475,8 @@ std::unique_ptr<InlineAdvice> MLInlineAdvisor::getAdviceImpl(CallBase &CB) {
}
// This one would have been set up to be right at the end.
if (!InteractiveChannelBaseName.empty() && InteractiveIncludeDefault)
- *ModelRunner->getTensor<int64_t>(getFeatureMap().size()) = GetDefaultAdvice(CB);
+ *ModelRunner->getTensor<int64_t>(getFeatureMap().size()) =
+ GetDefaultAdvice(CB);
return getAdviceFromModel(CB, ORE);
}
diff --git a/llvm/lib/IR/Assumptions.cpp b/llvm/lib/IR/Assumptions.cpp
index bdb9bd7ae0850..f8bbcb32231cb 100644
--- a/llvm/lib/IR/Assumptions.cpp
+++ b/llvm/lib/IR/Assumptions.cpp
@@ -101,16 +101,16 @@ bool llvm::addAssumptions(CallBase &CB,
return ::addAssumptionsImpl(CB, Assumptions);
}
-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;
+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;
}
>From d2ce240e90cda4065fb27f18320098f4a2cb4ad0 Mon Sep 17 00:00:00 2001
From: dalmurii <mincraft20046 at gmail.com>
Date: Thu, 21 Aug 2025 08:04:23 +0900
Subject: [PATCH 3/5] Update
llvm/include/llvm/Analysis/InlineModelFeatureMaps.h
> suggesting `getFeatureMap()` (past `FeatureMap`) could be constant.
> suggesting `getKnownAssumptionStrings()` (past `KnownAssumptionStrings`) constant
Co-authored-by: Eli Friedman <efriedma at quicinc.com>
---
llvm/include/llvm/Analysis/InlineModelFeatureMaps.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h b/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h
index 5c6aee3ab38ab..de496e4d760ec 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<FeatureIndex>(static_cast<size_t>(Feature));
}
-LLVM_ABI extern std::vector<TensorSpec> &getFeatureMap();
+LLVM_ABI extern const std::vector<TensorSpec> &getFeatureMap();
LLVM_ABI extern const char *const DecisionName;
LLVM_ABI extern const TensorSpec InlineDecisionSpec;
>From 8024e64335c438be4a2b078b036cb47386143fe9 Mon Sep 17 00:00:00 2001
From: dalmurii <mincraft20046 at gmail.com>
Date: Thu, 21 Aug 2025 08:04:34 +0900
Subject: [PATCH 4/5] Update llvm/include/llvm/IR/Assumptions.h
> suggesting `getFeatureMap()` (past `FeatureMap`) could be constant.
> suggesting `getKnownAssumptionStrings()` (past `KnownAssumptionStrings`) constant
Co-authored-by: Eli Friedman <efriedma at quicinc.com>
---
llvm/include/llvm/IR/Assumptions.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/IR/Assumptions.h b/llvm/include/llvm/IR/Assumptions.h
index ebc55921e73d3..8c3669d1e9308 100644
--- a/llvm/include/llvm/IR/Assumptions.h
+++ b/llvm/include/llvm/IR/Assumptions.h
@@ -30,7 +30,7 @@ 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<> &getKnownAssumptionStrings();
+LLVM_ABI extern const StringSet<> &getKnownAssumptionStrings();
/// Helper that allows to insert a new assumption string in the known assumption
/// set by creating a (static) object.
>From c4a84bfcbf9cff51abe1d43d183914dd89913508 Mon Sep 17 00:00:00 2001
From: ae2f <mincraft20046 at gmail.com>
Date: Thu, 21 Aug 2025 08:22:31 +0900
Subject: [PATCH 5/5] Two functions requires to be mutable.
On branch Singleton
Changes to be committed:
modified: llvm/include/llvm/Analysis/InlineModelFeatureMaps.h
modified: llvm/include/llvm/IR/Assumptions.h
---
llvm/include/llvm/Analysis/InlineModelFeatureMaps.h | 2 +-
llvm/include/llvm/IR/Assumptions.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h b/llvm/include/llvm/Analysis/InlineModelFeatureMaps.h
index de496e4d760ec..5c6aee3ab38ab 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<FeatureIndex>(static_cast<size_t>(Feature));
}
-LLVM_ABI extern const std::vector<TensorSpec> &getFeatureMap();
+LLVM_ABI extern std::vector<TensorSpec> &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 8c3669d1e9308..ebc55921e73d3 100644
--- a/llvm/include/llvm/IR/Assumptions.h
+++ b/llvm/include/llvm/IR/Assumptions.h
@@ -30,7 +30,7 @@ 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 const StringSet<> &getKnownAssumptionStrings();
+LLVM_ABI extern StringSet<> &getKnownAssumptionStrings();
/// Helper that allows to insert a new assumption string in the known assumption
/// set by creating a (static) object.
More information about the llvm-commits
mailing list