diff options
-rw-r--r-- | llvm/tools/llvm-mca/lib/InstrBuilder.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/llvm/tools/llvm-mca/lib/InstrBuilder.cpp b/llvm/tools/llvm-mca/lib/InstrBuilder.cpp index 535ad4d57fe..c7345e7b976 100644 --- a/llvm/tools/llvm-mca/lib/InstrBuilder.cpp +++ b/llvm/tools/llvm-mca/lib/InstrBuilder.cpp @@ -55,12 +55,15 @@ static void initializeUsedResources(InstrDesc &ID, // part of a "Super" resource. The key value is the "Super" resource mask ID. DenseMap<uint64_t, unsigned> SuperResources; + unsigned NumProcResources = SM.getNumProcResourceKinds(); + APInt Buffers(NumProcResources, 0); + 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) - ID.Buffers.push_back(Mask); + Buffers.setBit(PRE->ProcResourceIdx); CycleSegment RCy(0, PRE->Cycles, false); Worklist.emplace_back(ResourcePlusCycles(Mask, ResourceUsage(RCy))); if (PR.SuperIdx) { @@ -138,6 +141,30 @@ static void initializeUsedResources(InstrDesc &ID, } } + // Identify extra buffers that are consumed through super resources. + for (const std::pair<uint64_t, unsigned> &SR : SuperResources) { + for (unsigned I = 1, E = NumProcResources; I < E; ++I) { + const MCProcResourceDesc &PR = *SM.getProcResource(I); + if (PR.BufferSize == -1) + continue; + + uint64_t Mask = ProcResourceMasks[I]; + if (Mask != SR.first && ((Mask & SR.first) == SR.first)) + Buffers.setBit(I); + } + } + + // Now set the buffers. + if (unsigned NumBuffers = Buffers.countPopulation()) { + ID.Buffers.resize(NumBuffers); + for (unsigned I = 0, E = NumProcResources; I < E && NumBuffers; ++I) { + if (Buffers[I]) { + --NumBuffers; + ID.Buffers[NumBuffers] = ProcResourceMasks[I]; + } + } + } + LLVM_DEBUG({ for (const std::pair<uint64_t, ResourceUsage> &R : ID.Resources) dbgs() << "\t\tMask=" << R.first << ", cy=" << R.second.size() << '\n'; |