[llvm] r350218 - [MCA] Minor refactoring of method DefaultResourceStrategy::select. NFCI

Andrea Di Biagio via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 2 07:40:52 PST 2019


Author: adibiagio
Date: Wed Jan  2 07:40:52 2019
New Revision: 350218

URL: http://llvm.org/viewvc/llvm-project?rev=350218&view=rev
Log:
[MCA] Minor refactoring of method DefaultResourceStrategy::select. NFCI

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.

Modified:
    llvm/trunk/lib/MCA/HardwareUnits/ResourceManager.cpp

Modified: llvm/trunk/lib/MCA/HardwareUnits/ResourceManager.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MCA/HardwareUnits/ResourceManager.cpp?rev=350218&r1=350217&r2=350218&view=diff
==============================================================================
--- llvm/trunk/lib/MCA/HardwareUnits/ResourceManager.cpp (original)
+++ llvm/trunk/lib/MCA/HardwareUnits/ResourceManager.cpp Wed Jan  2 07:40:52 2019
@@ -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(uint6
 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;




More information about the llvm-commits mailing list