diff options
author | Michael Kuperstein <michael.m.kuperstein@intel.com> | 2015-05-26 10:47:10 +0000 |
---|---|---|
committer | Michael Kuperstein <michael.m.kuperstein@intel.com> | 2015-05-26 10:47:10 +0000 |
commit | db0712f986521e586aaff87da3db56f0ce33f20f (patch) | |
tree | b4e9c54fc70bf89956ea142ffcdd2f5938428bd1 /llvm/lib/MC/SubtargetFeature.cpp | |
parent | 02fc0b1d645436dbe3dd8256ae232939af3e9ada (diff) | |
download | bcm5719-llvm-db0712f986521e586aaff87da3db56f0ce33f20f.tar.gz bcm5719-llvm-db0712f986521e586aaff87da3db56f0ce33f20f.zip |
Use std::bitset for SubtargetFeatures.
Previously, subtarget features were a bitfield with the underlying type being uint64_t.
Since several targets (X86 and ARM, in particular) have hit or were very close to hitting this bound, switching the features to use a bitset.
No functional change.
The first several times this was committed (e.g. r229831, r233055), it caused several buildbot failures.
Apparently the reason for most failures was both clang and gcc's inability to deal with large numbers (> 10K) of bitset constructor calls in tablegen-generated initializers of instruction info tables.
This should now be fixed.
llvm-svn: 238192
Diffstat (limited to 'llvm/lib/MC/SubtargetFeature.cpp')
-rw-r--r-- | llvm/lib/MC/SubtargetFeature.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/llvm/lib/MC/SubtargetFeature.cpp b/llvm/lib/MC/SubtargetFeature.cpp index 3880d883389..78006e0d702 100644 --- a/llvm/lib/MC/SubtargetFeature.cpp +++ b/llvm/lib/MC/SubtargetFeature.cpp @@ -151,12 +151,12 @@ std::string SubtargetFeatures::getString() const { /// feature, set it. /// static -void SetImpliedBits(uint64_t &Bits, const SubtargetFeatureKV *FeatureEntry, +void SetImpliedBits(FeatureBitset &Bits, const SubtargetFeatureKV *FeatureEntry, ArrayRef<SubtargetFeatureKV> FeatureTable) { for (auto &FE : FeatureTable) { if (FeatureEntry->Value == FE.Value) continue; - if (FeatureEntry->Implies & FE.Value) { + if ((FeatureEntry->Implies & FE.Value).any()) { Bits |= FE.Value; SetImpliedBits(Bits, &FE, FeatureTable); } @@ -167,12 +167,13 @@ void SetImpliedBits(uint64_t &Bits, const SubtargetFeatureKV *FeatureEntry, /// feature, clear it. /// static -void ClearImpliedBits(uint64_t &Bits, const SubtargetFeatureKV *FeatureEntry, +void ClearImpliedBits(FeatureBitset &Bits, + const SubtargetFeatureKV *FeatureEntry, ArrayRef<SubtargetFeatureKV> FeatureTable) { for (auto &FE : FeatureTable) { if (FeatureEntry->Value == FE.Value) continue; - if (FE.Implies & FeatureEntry->Value) { + if ((FE.Implies & FeatureEntry->Value).any()) { Bits &= ~FE.Value; ClearImpliedBits(Bits, &FE, FeatureTable); } @@ -181,8 +182,8 @@ void ClearImpliedBits(uint64_t &Bits, const SubtargetFeatureKV *FeatureEntry, /// ToggleFeature - Toggle a feature and returns the newly updated feature /// bits. -uint64_t -SubtargetFeatures::ToggleFeature(uint64_t Bits, StringRef Feature, +FeatureBitset +SubtargetFeatures::ToggleFeature(FeatureBitset Bits, StringRef Feature, ArrayRef<SubtargetFeatureKV> FeatureTable) { // Find feature in table. @@ -192,7 +193,6 @@ SubtargetFeatures::ToggleFeature(uint64_t Bits, StringRef Feature, if (FeatureEntry) { if ((Bits & FeatureEntry->Value) == FeatureEntry->Value) { Bits &= ~FeatureEntry->Value; - // For each feature that implies this, clear it. ClearImpliedBits(Bits, FeatureEntry, FeatureTable); } else { @@ -213,13 +213,13 @@ SubtargetFeatures::ToggleFeature(uint64_t Bits, StringRef Feature, /// getFeatureBits - Get feature bits a CPU. /// -uint64_t +FeatureBitset SubtargetFeatures::getFeatureBits(StringRef CPU, ArrayRef<SubtargetFeatureKV> CPUTable, ArrayRef<SubtargetFeatureKV> FeatureTable) { if (CPUTable.empty() || FeatureTable.empty()) - return 0; + return FeatureBitset(); #ifndef NDEBUG for (size_t i = 1, e = CPUTable.size(); i != e; ++i) { @@ -231,7 +231,8 @@ SubtargetFeatures::getFeatureBits(StringRef CPU, "CPU features table is not sorted"); } #endif - uint64_t Bits = 0; // Resulting bits + // Resulting bits + FeatureBitset Bits; // Check if help is needed if (CPU == "help") @@ -248,7 +249,7 @@ SubtargetFeatures::getFeatureBits(StringRef CPU, // Set the feature implied by this CPU feature, if any. for (auto &FE : FeatureTable) { - if (CPUEntry->Value & FE.Value) + if ((CPUEntry->Value & FE.Value).any()) SetImpliedBits(Bits, &FE, FeatureTable); } } else { |