diff options
author | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2019-02-13 14:56:06 +0000 |
---|---|---|
committer | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2019-02-13 14:56:06 +0000 |
commit | 245163ffd0efd3321e77ed6b1209e5422551d3d8 (patch) | |
tree | 160769e7fb4d97bf4adc345e05552e1813b7df6a /llvm/lib/MCA | |
parent | a9a11aac0f943ef7eccb31214f9fd9eeb340a78e (diff) | |
download | bcm5719-llvm-245163ffd0efd3321e77ed6b1209e5422551d3d8.tar.gz bcm5719-llvm-245163ffd0efd3321e77ed6b1209e5422551d3d8.zip |
[MCA] Store a bitmask of used groups in the instruction descriptor.
This is to speedup 'checkAvailability' queries in class ResourceManager.
No functional change intended.
llvm-svn: 353949
Diffstat (limited to 'llvm/lib/MCA')
-rw-r--r-- | llvm/lib/MCA/HardwareUnits/ResourceManager.cpp | 15 | ||||
-rw-r--r-- | llvm/lib/MCA/InstrBuilder.cpp | 15 |
2 files changed, 22 insertions, 8 deletions
diff --git a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp index da6bfd55339..21e0271c852 100644 --- a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp +++ b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp @@ -118,8 +118,8 @@ ResourceManager::ResourceManager(const MCSchedModel &SM) : Resources(SM.getNumProcResourceKinds()), Strategies(SM.getNumProcResourceKinds()), Resource2Groups(SM.getNumProcResourceKinds(), 0), - ProcResID2Mask(SM.getNumProcResourceKinds()), - ProcResUnitMask(0) { + ProcResID2Mask(SM.getNumProcResourceKinds()), ProcResUnitMask(0), + ReservedResourceGroups(0) { computeProcResourceMasks(SM, ProcResID2Mask); for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { @@ -278,7 +278,10 @@ uint64_t ResourceManager::checkAvailability(const InstrDesc &Desc) const { BusyResourceMask |= E.first; } - return BusyResourceMask & ProcResUnitMask; + BusyResourceMask &= ProcResUnitMask; + if (BusyResourceMask) + return BusyResourceMask; + return Desc.UsedProcResGroups & ReservedResourceGroups; } void ResourceManager::issueInstruction( @@ -330,13 +333,17 @@ void ResourceManager::cycleEvent(SmallVectorImpl<ResourceRef> &ResourcesFreed) { void ResourceManager::reserveResource(uint64_t ResourceID) { ResourceState &Resource = *Resources[getResourceStateIndex(ResourceID)]; - assert(!Resource.isReserved()); + assert(Resource.isAResourceGroup() && !Resource.isReserved() && + "Unexpected resource found!"); Resource.setReserved(); + ReservedResourceGroups ^= PowerOf2Floor(ResourceID); } void ResourceManager::releaseResource(uint64_t ResourceID) { ResourceState &Resource = *Resources[getResourceStateIndex(ResourceID)]; Resource.clearReserved(); + if (Resource.isAResourceGroup()) + ReservedResourceGroups ^= PowerOf2Floor(ResourceID); } } // namespace mca diff --git a/llvm/lib/MCA/InstrBuilder.cpp b/llvm/lib/MCA/InstrBuilder.cpp index 1e08f898523..e10efb28f77 100644 --- a/llvm/lib/MCA/InstrBuilder.cpp +++ b/llvm/lib/MCA/InstrBuilder.cpp @@ -97,14 +97,14 @@ static void initializeUsedResources(InstrDesc &ID, }); uint64_t UsedResourceUnits = 0; + uint64_t UsedResourceGroups = 0; // Remove cycles contributed by smaller resources. for (unsigned I = 0, E = Worklist.size(); I < E; ++I) { ResourcePlusCycles &A = Worklist[I]; if (!A.second.size()) { - A.second.NumUnits = 0; - A.second.setReserved(); - ID.Resources.emplace_back(A); + assert(countPopulation(A.first) > 1 && "Expected a group!"); + UsedResourceGroups |= PowerOf2Floor(A.first); continue; } @@ -127,6 +127,9 @@ static void initializeUsedResources(InstrDesc &ID, } } + ID.UsedProcResUnits = UsedResourceUnits; + ID.UsedProcResGroups = UsedResourceGroups; + // A SchedWrite may specify a number of cycles in which a resource group // is reserved. For example (on target x86; cpu Haswell): // @@ -179,10 +182,14 @@ static void initializeUsedResources(InstrDesc &ID, LLVM_DEBUG({ for (const std::pair<uint64_t, ResourceUsage> &R : ID.Resources) - dbgs() << "\t\tMask=" << format_hex(R.first, 16) << ", " + dbgs() << "\t\tResource Mask=" << format_hex(R.first, 16) << ", " + << "Reserved=" << R.second.isReserved() << ", " + << "#Units=" << R.second.NumUnits << ", " << "cy=" << R.second.size() << '\n'; for (const uint64_t R : ID.Buffers) dbgs() << "\t\tBuffer Mask=" << format_hex(R, 16) << '\n'; + dbgs() << "\t\t Used Units=" << format_hex(ID.UsedProcResUnits, 16) << '\n'; + dbgs() << "\t\tUsed Groups=" << format_hex(ID.UsedProcResGroups, 16) << '\n'; }); } |