[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