diff options
Diffstat (limited to 'llvm/lib/MCA/HardwareUnits/ResourceManager.cpp')
| -rw-r--r-- | llvm/lib/MCA/HardwareUnits/ResourceManager.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp index f899b3d10c3..4cad4f40013 100644 --- a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp +++ b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp @@ -213,19 +213,20 @@ void ResourceManager::use(const ResourceRef &RR) { } void ResourceManager::release(const ResourceRef &RR) { - ResourceState &RS = *Resources[getResourceStateIndex(RR.first)]; + unsigned RSID = getResourceStateIndex(RR.first); + ResourceState &RS = *Resources[RSID]; bool WasFullyUsed = !RS.isReady(); RS.releaseSubResource(RR.second); if (!WasFullyUsed) return; - for (std::unique_ptr<ResourceState> &Res : Resources) { - ResourceState &Current = *Res; - if (!Current.isAResourceGroup() || Current.getResourceMask() == RR.first) - continue; - - if (Current.containsResource(RR.first)) - Current.releaseSubResource(RR.first); + // Notify groups that RR.first is now available again. + uint64_t Users = Resource2Groups[RSID]; + while (Users) { + unsigned GroupIndex = getResourceStateIndex(Users & (-Users)); + ResourceState &CurrentUser = *Resources[GroupIndex]; + CurrentUser.releaseSubResource(RR.first); + Users &= Users - 1; } } |

