[PATCH] D85257: [X86] Optimize getImpliedDisabledFeatures & getImpliedEnabledFeatures'
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 4 16:29:39 PDT 2020
MaskRay created this revision.
MaskRay added reviewers: craig.topper, echristo, nickdesaulniers, Nathan-Huckleberry.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
MaskRay requested review of this revision.
Previously the time complexity is O(|number of paths from the root to an
implied feature| * CPU_FWATURE_MAX) where CPU_FEATURE_MAX is 92.
The number of paths can be exponential.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D85257
Files:
llvm/lib/Support/X86TargetParser.cpp
Index: llvm/lib/Support/X86TargetParser.cpp
===================================================================
--- llvm/lib/Support/X86TargetParser.cpp
+++ llvm/lib/Support/X86TargetParser.cpp
@@ -37,6 +37,13 @@
set(I);
}
+ constexpr operator bool() const {
+ for (unsigned I = 0, E = array_lengthof(Bits); I != E; ++I)
+ if (Bits[I])
+ return true;
+ return false;
+ }
+
constexpr FeatureBitset &set(unsigned I) {
// GCC <6.2 crashes if this is written in a single statement.
uint32_t NewBits = Bits[I / 32] | (uint32_t(1) << (I % 32));
@@ -89,6 +96,13 @@
Result.Bits[I] = ~Bits[I];
return Result;
}
+
+ constexpr bool operator==(const FeatureBitset &RHS) const {
+ for (unsigned I = 0, E = array_lengthof(Bits); I != E; ++I)
+ if (Bits[I] != RHS.Bits[I])
+ return false;
+ return true;
+ }
};
struct ProcInfo {
@@ -552,11 +566,14 @@
// For each feature that is (transitively) implied by this feature, set it.
static void getImpliedEnabledFeatures(FeatureBitset &Bits,
const FeatureBitset &Implies) {
+ FeatureBitset Prev;
Bits |= Implies;
- for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i) {
- if (Implies[i])
- getImpliedEnabledFeatures(Bits, FeatureInfos[i].ImpliedFeatures);
- }
+ do {
+ Prev = Bits;
+ for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i)
+ if (Bits[i])
+ Bits |= FeatureInfos[i].ImpliedFeatures;
+ } while (!(Prev == Bits));
}
/// Create bit vector of features that are implied disabled if the feature
@@ -564,12 +581,14 @@
static void getImpliedDisabledFeatures(FeatureBitset &Bits, unsigned Value) {
// Check all features looking for any dependent on this feature. If we find
// one, mark it and recursively find any feature that depend on it.
- for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i) {
- if (FeatureInfos[i].ImpliedFeatures[Value]) {
- Bits.set(i);
- getImpliedDisabledFeatures(Bits, i);
- }
- }
+ FeatureBitset Prev;
+ Bits.set(Value);
+ do {
+ Prev = Bits;
+ for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i)
+ if (FeatureInfos[i].ImpliedFeatures & Bits)
+ Bits.set(i);
+ } while (!(Prev == Bits));
}
void llvm::X86::getImpliedFeatures(
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D85257.283056.patch
Type: text/x-patch
Size: 2281 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200804/a7a5bef7/attachment.bin>
More information about the llvm-commits
mailing list