diff options
| author | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2019-01-04 15:08:38 +0000 |
|---|---|---|
| committer | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2019-01-04 15:08:38 +0000 |
| commit | 3f4b54850f270820421400af99f9f88b346679fd (patch) | |
| tree | 5318884f4a12776fa2715acba6b6f76eb286d180 /llvm/lib/MCA | |
| parent | 7ee228562569a307a7ff8608a9c010ea2a9d41a8 (diff) | |
| download | bcm5719-llvm-3f4b54850f270820421400af99f9f88b346679fd.tar.gz bcm5719-llvm-3f4b54850f270820421400af99f9f88b346679fd.zip | |
[MCA] Improved handling of in-order issue/dispatch resources.
Added field 'MustIssueImmediately' to the instruction descriptor of instructions
that only consume in-order issue/dispatch processor resources.
This speeds up queries from the hardware Scheduler, and gives an average ~5%
speedup on a release build.
No functional change intended.
llvm-svn: 350397
Diffstat (limited to 'llvm/lib/MCA')
| -rw-r--r-- | llvm/lib/MCA/HardwareUnits/ResourceManager.cpp | 18 | ||||
| -rw-r--r-- | llvm/lib/MCA/HardwareUnits/Scheduler.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/MCA/InstrBuilder.cpp | 12 |
3 files changed, 15 insertions, 21 deletions
diff --git a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp index c7f45fd9542..b68e996ff9e 100644 --- a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp +++ b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp @@ -267,24 +267,6 @@ bool ResourceManager::canBeIssued(const InstrDesc &Desc) const { }); } -// Returns true if all resources are in-order, and there is at least one -// resource which is a dispatch hazard (BufferSize = 0). -bool ResourceManager::mustIssueImmediately(const InstrDesc &Desc) const { - if (!canBeIssued(Desc)) - return false; - bool AllInOrderResources = all_of(Desc.Buffers, [&](uint64_t BufferMask) { - unsigned Index = getResourceStateIndex(BufferMask); - const ResourceState &Resource = *Resources[Index]; - return Resource.isInOrder() || Resource.isADispatchHazard(); - }); - if (!AllInOrderResources) - return false; - - return any_of(Desc.Buffers, [&](uint64_t BufferMask) { - return Resources[getResourceStateIndex(BufferMask)]->isADispatchHazard(); - }); -} - void ResourceManager::issueInstruction( const InstrDesc &Desc, SmallVectorImpl<std::pair<ResourceRef, ResourceCycles>> &Pipes) { diff --git a/llvm/lib/MCA/HardwareUnits/Scheduler.cpp b/llvm/lib/MCA/HardwareUnits/Scheduler.cpp index 3924ac59910..355ef79d06a 100644 --- a/llvm/lib/MCA/HardwareUnits/Scheduler.cpp +++ b/llvm/lib/MCA/HardwareUnits/Scheduler.cpp @@ -199,11 +199,13 @@ void Scheduler::cycleEvent(SmallVectorImpl<ResourceRef> &Freed, } bool Scheduler::mustIssueImmediately(const InstRef &IR) const { + const InstrDesc &Desc = IR.getInstruction()->getDesc(); + if (Desc.isZeroLatency()) + return true; // Instructions that use an in-order dispatch/issue processor resource must be // issued immediately to the pipeline(s). Any other in-order buffered // resources (i.e. BufferSize=1) is consumed. - const InstrDesc &Desc = IR.getInstruction()->getDesc(); - return Desc.isZeroLatency() || Resources->mustIssueImmediately(Desc); + return Desc.MustIssueImmediately; } void Scheduler::dispatch(const InstRef &IR) { diff --git a/llvm/lib/MCA/InstrBuilder.cpp b/llvm/lib/MCA/InstrBuilder.cpp index 8d501dc6b15..d8309b6868e 100644 --- a/llvm/lib/MCA/InstrBuilder.cpp +++ b/llvm/lib/MCA/InstrBuilder.cpp @@ -59,12 +59,20 @@ static void initializeUsedResources(InstrDesc &ID, unsigned NumProcResources = SM.getNumProcResourceKinds(); APInt Buffers(NumProcResources, 0); + bool AllInOrderResources = true; + bool AnyDispatchHazards = false; for (unsigned I = 0, E = SCDesc.NumWriteProcResEntries; I < E; ++I) { const MCWriteProcResEntry *PRE = STI.getWriteProcResBegin(&SCDesc) + I; const MCProcResourceDesc &PR = *SM.getProcResource(PRE->ProcResourceIdx); uint64_t Mask = ProcResourceMasks[PRE->ProcResourceIdx]; - if (PR.BufferSize != -1) + if (PR.BufferSize < 0) { + AllInOrderResources = false; + } else { Buffers.setBit(PRE->ProcResourceIdx); + AnyDispatchHazards |= (PR.BufferSize == 0); + AllInOrderResources &= (PR.BufferSize <= 1); + } + CycleSegment RCy(0, PRE->Cycles, false); Worklist.emplace_back(ResourcePlusCycles(Mask, ResourceUsage(RCy))); if (PR.SuperIdx) { @@ -73,6 +81,8 @@ static void initializeUsedResources(InstrDesc &ID, } } + ID.MustIssueImmediately = AllInOrderResources && AnyDispatchHazards; + // Sort elements by mask popcount, so that we prioritize resource units over // resource groups, and smaller groups over larger groups. sort(Worklist, [](const ResourcePlusCycles &A, const ResourcePlusCycles &B) { |

