diff options
-rw-r--r-- | llvm/lib/MC/SubtargetFeature.cpp | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/llvm/lib/MC/SubtargetFeature.cpp b/llvm/lib/MC/SubtargetFeature.cpp index c34c6ff9007..84c743c5e33 100644 --- a/llvm/lib/MC/SubtargetFeature.cpp +++ b/llvm/lib/MC/SubtargetFeature.cpp @@ -124,12 +124,12 @@ std::string SubtargetFeatures::getString() const { static void SetImpliedBits(FeatureBitset &Bits, const FeatureBitset &Implies, ArrayRef<SubtargetFeatureKV> FeatureTable) { - for (const SubtargetFeatureKV &FE : FeatureTable) { - if (Implies.test(FE.Value)) { - Bits.set(FE.Value); + // OR the Implies bits in outside the loop. This allows the Implies for CPUs + // which might imply features not in FeatureTable to use this. + Bits |= Implies; + for (const SubtargetFeatureKV &FE : FeatureTable) + if (Implies.test(FE.Value)) SetImpliedBits(Bits, FE.Implies.getAsBitset(), FeatureTable); - } - } } /// For each feature that (transitively) implies this feature, clear it. @@ -219,15 +219,8 @@ SubtargetFeatures::getFeatureBits(StringRef CPU, // If there is a match if (CPUEntry) { - // Set base feature bits - FeatureBitset CPUImplies = CPUEntry->Implies.getAsBitset(); - Bits = CPUImplies; - - // Set the feature implied by this CPU feature, if any. - for (auto &FE : FeatureTable) { - if (CPUImplies.test(FE.Value)) - SetImpliedBits(Bits, FE.Implies.getAsBitset(), FeatureTable); - } + // Set the features implied by this CPU feature, if any. + SetImpliedBits(Bits, CPUEntry->Implies.getAsBitset(), FeatureTable); } else { errs() << "'" << CPU << "' is not a recognized processor for this target" << " (ignoring processor)\n"; |