diff options
Diffstat (limited to 'llvm/lib/MCA/HardwareUnits/ResourceManager.cpp')
-rw-r--r-- | llvm/lib/MCA/HardwareUnits/ResourceManager.cpp | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp index 21e0271c852..06f2476353d 100644 --- a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp +++ b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp @@ -23,16 +23,10 @@ namespace mca { #define DEBUG_TYPE "llvm-mca" ResourceStrategy::~ResourceStrategy() = default; -// Returns the index of the highest bit set. For resource masks, the position of -// the highest bit set can be used to construct a resource mask identifier. -static unsigned getResourceStateIndex(uint64_t Mask) { - return std::numeric_limits<uint64_t>::digits - countLeadingZeros(Mask); -} - static uint64_t selectImpl(uint64_t CandidateMask, uint64_t &NextInSequenceMask) { // The upper bit set in CandidateMask identifies our next candidate resource. - CandidateMask = 1ULL << (getResourceStateIndex(CandidateMask) - 1); + CandidateMask = 1ULL << getResourceStateIndex(CandidateMask); NextInSequenceMask &= (CandidateMask | (CandidateMask - 1)); return CandidateMask; } @@ -74,7 +68,7 @@ ResourceState::ResourceState(const MCProcResourceDesc &Desc, unsigned Index, BufferSize(Desc.BufferSize), IsAGroup(countPopulation(ResourceMask) > 1) { if (IsAGroup) { ResourceSizeMask = - ResourceMask ^ 1ULL << (getResourceStateIndex(ResourceMask) - 1); + ResourceMask ^ 1ULL << getResourceStateIndex(ResourceMask); } else { ResourceSizeMask = (1ULL << Desc.NumUnits) - 1; } @@ -115,14 +109,21 @@ getStrategyFor(const ResourceState &RS) { } ResourceManager::ResourceManager(const MCSchedModel &SM) - : Resources(SM.getNumProcResourceKinds()), - Strategies(SM.getNumProcResourceKinds()), - Resource2Groups(SM.getNumProcResourceKinds(), 0), - ProcResID2Mask(SM.getNumProcResourceKinds()), ProcResUnitMask(0), - ReservedResourceGroups(0) { + : Resources(SM.getNumProcResourceKinds() - 1), + Strategies(SM.getNumProcResourceKinds() - 1), + Resource2Groups(SM.getNumProcResourceKinds() - 1, 0), + ProcResID2Mask(SM.getNumProcResourceKinds(), 0), + ResIndex2ProcResID(SM.getNumProcResourceKinds() - 1, 0), + ProcResUnitMask(0), ReservedResourceGroups(0) { computeProcResourceMasks(SM, ProcResID2Mask); - for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { + // initialize vector ResIndex2ProcResID. + for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) { + unsigned Index = getResourceStateIndex(ProcResID2Mask[I]); + ResIndex2ProcResID[Index] = I; + } + + for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) { uint64_t Mask = ProcResID2Mask[I]; unsigned Index = getResourceStateIndex(Mask); Resources[Index] = @@ -130,7 +131,7 @@ ResourceManager::ResourceManager(const MCSchedModel &SM) Strategies[Index] = getStrategyFor(*Resources[Index]); } - for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { + for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) { uint64_t Mask = ProcResID2Mask[I]; unsigned Index = getResourceStateIndex(Mask); const ResourceState &RS = *Resources[Index]; @@ -139,7 +140,7 @@ ResourceManager::ResourceManager(const MCSchedModel &SM) continue; } - uint64_t GroupMaskIdx = 1ULL << (Index - 1); + uint64_t GroupMaskIdx = 1ULL << Index; Mask -= GroupMaskIdx; while (Mask) { // Extract lowest set isolated bit. @@ -162,7 +163,7 @@ void ResourceManager::setCustomStrategyImpl(std::unique_ptr<ResourceStrategy> S, } unsigned ResourceManager::resolveResourceMask(uint64_t Mask) const { - return Resources[getResourceStateIndex(Mask)]->getProcResourceID(); + return ResIndex2ProcResID[getResourceStateIndex(Mask)]; } unsigned ResourceManager::getNumUnits(uint64_t ResourceID) const { @@ -332,18 +333,20 @@ void ResourceManager::cycleEvent(SmallVectorImpl<ResourceRef> &ResourcesFreed) { } void ResourceManager::reserveResource(uint64_t ResourceID) { - ResourceState &Resource = *Resources[getResourceStateIndex(ResourceID)]; + const unsigned Index = getResourceStateIndex(ResourceID); + ResourceState &Resource = *Resources[Index]; assert(Resource.isAResourceGroup() && !Resource.isReserved() && "Unexpected resource found!"); Resource.setReserved(); - ReservedResourceGroups ^= PowerOf2Floor(ResourceID); + ReservedResourceGroups ^= 1ULL << Index; } void ResourceManager::releaseResource(uint64_t ResourceID) { - ResourceState &Resource = *Resources[getResourceStateIndex(ResourceID)]; + const unsigned Index = getResourceStateIndex(ResourceID); + ResourceState &Resource = *Resources[Index]; Resource.clearReserved(); if (Resource.isAResourceGroup()) - ReservedResourceGroups ^= PowerOf2Floor(ResourceID); + ReservedResourceGroups ^= 1ULL << Index; } } // namespace mca |