diff --git a/llvm/lib/Support/X86TargetParser.cpp b/llvm/lib/Support/X86TargetParser.cpp --- a/llvm/lib/Support/X86TargetParser.cpp +++ b/llvm/lib/Support/X86TargetParser.cpp @@ -115,6 +115,7 @@ }; struct FlatFeatureDependency { + StringLiteral Name; FeatureBitset ImpliedEnabledFeatures; FeatureBitset ImpliedDisabledFeatures; }; @@ -566,7 +567,7 @@ // Traverse the dependency tree at compile time so we don't need to recompute at // runtime. -static constexpr std::pair +static constexpr FlatFeatureDependency FlattenFeatureDependencies(unsigned Index) { auto I = FeatureInfos[Index]; FeatureBitset ImpliedEnabled = @@ -574,13 +575,14 @@ FeatureBitset ImpliedDisabled = ImpliedDisabledFeatures(Index) | FeatureBitset().set(Index); - return {I.Name, {ImpliedEnabled, ImpliedDisabled}}; + return {I.Name, ImpliedEnabled, ImpliedDisabled}; } -static const StringMap FeatureDependencyMap({ +static constexpr FlatFeatureDependency + FeatureDependencies[X86::CPU_FEATURE_MAX] = { #define X86_FEATURE(ENUM, STR) FlattenFeatureDependencies(__COUNTER__), #include "llvm/Support/X86TargetParser.def" -}); +}; void llvm::X86::getFeaturesForCPU(StringRef CPU, SmallVectorImpl &EnabledFeatures) { @@ -605,11 +607,19 @@ StringMap &Features) { FeatureBitset ImpliedBits; - FlatFeatureDependency D = FeatureDependencyMap.lookup(Feature); + auto D = + llvm::find_if(FeatureDependencies, [&](const FlatFeatureDependency &FD) { + return FD.Name == Feature; + }); + if (D == std::end(FeatureDependencies)) { + // FIXME: This shouldn't happen, but may not have all features in the table + // yet. + return; + } if (Enabled) - ImpliedBits = D.ImpliedEnabledFeatures; + ImpliedBits = D->ImpliedEnabledFeatures; else - ImpliedBits = D.ImpliedDisabledFeatures; + ImpliedBits = D->ImpliedDisabledFeatures; // Update the map entry for all implied features. for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i)