]> granicus.if.org Git - llvm/commitdiff
[MCA] Minor refactoring of method DefaultResourceStrategy::select. NFCI
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Wed, 2 Jan 2019 15:40:52 +0000 (15:40 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Wed, 2 Jan 2019 15:40:52 +0000 (15:40 +0000)
Common code used by the default resource strategy to select pipeline resources
has been moved to an helper function.

The new selection logic has been slightly rewritten to get rid of a redundant
zero check on the `ReadyMask` value. Before this patch, method select internally
called function `PowerOf2Floor` to compute the next ready pipeline resource.
However, `PowerOf2Floor` forces an implicit (redundant) zero check on the input
value. By construction, `ReadyMask` can never be zero. This patch replaces the
call to `PowerOf2Floor` with an equivalent block of code which avoids the
redundant zero check. This gives a minor 3-3.5% speedup on a release build.

No functional change intended.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350218 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MCA/HardwareUnits/ResourceManager.cpp

index e76543c53e14560dc71a9f6ce8cb5db594d7bdf0..9fc92cd8185ff6ff80afd977d143da6ff193271d 100644 (file)
@@ -24,29 +24,29 @@ namespace mca {
 #define DEBUG_TYPE "llvm-mca"
 ResourceStrategy::~ResourceStrategy() = default;
 
+static uint64_t selectImpl(uint64_t CandidateMask,
+                           uint64_t &NextInSequenceMask) {
+  CandidateMask = 1ULL << (countLeadingZeros(CandidateMask) ^
+                           (std::numeric_limits<uint64_t>::digits - 1));
+  NextInSequenceMask &= (CandidateMask ^ (CandidateMask - 1));
+  return CandidateMask;
+}
+
 uint64_t DefaultResourceStrategy::select(uint64_t ReadyMask) {
   // This method assumes that ReadyMask cannot be zero.
   uint64_t CandidateMask = ReadyMask & NextInSequenceMask;
-  if (CandidateMask) {
-    CandidateMask = PowerOf2Floor(CandidateMask);
-    NextInSequenceMask &= (CandidateMask | (CandidateMask - 1));
-    return CandidateMask;
-  }
+  if (CandidateMask)
+    return selectImpl(CandidateMask, NextInSequenceMask);
 
   NextInSequenceMask = ResourceUnitMask ^ RemovedFromNextInSequence;
   RemovedFromNextInSequence = 0;
   CandidateMask = ReadyMask & NextInSequenceMask;
-
-  if (CandidateMask) {
-    CandidateMask = PowerOf2Floor(CandidateMask);
-    NextInSequenceMask &= (CandidateMask | (CandidateMask - 1));
-    return CandidateMask;
-  }
+  if (CandidateMask)
+    return selectImpl(CandidateMask, NextInSequenceMask);
 
   NextInSequenceMask = ResourceUnitMask;
-  CandidateMask = PowerOf2Floor(ReadyMask & NextInSequenceMask);
-  NextInSequenceMask &= (CandidateMask | (CandidateMask - 1));
-  return CandidateMask;
+  CandidateMask = ReadyMask & NextInSequenceMask;
+  return selectImpl(CandidateMask, NextInSequenceMask);
 }
 
 void DefaultResourceStrategy::used(uint64_t Mask) {
@@ -66,11 +66,14 @@ void DefaultResourceStrategy::used(uint64_t Mask) {
 ResourceState::ResourceState(const MCProcResourceDesc &Desc, unsigned Index,
                              uint64_t Mask)
     : ProcResourceDescIndex(Index), ResourceMask(Mask),
-      BufferSize(Desc.BufferSize), IsAGroup(countPopulation(ResourceMask)>1) {
-  if (IsAGroup)
-    ResourceSizeMask = ResourceMask ^ PowerOf2Floor(ResourceMask);
-  else
+      BufferSize(Desc.BufferSize), IsAGroup(countPopulation(ResourceMask) > 1) {
+  if (IsAGroup) {
+    ResourceSizeMask =
+        ResourceMask ^ (1ULL << (countLeadingZeros(ResourceMask) ^
+                                 (std::numeric_limits<uint64_t>::digits - 1)));
+  } else {
     ResourceSizeMask = (1ULL << Desc.NumUnits) - 1;
+  }
   ReadyMask = ResourceSizeMask;
   AvailableSlots = BufferSize == -1 ? 0U : static_cast<unsigned>(BufferSize);
   Unavailable = false;