diff options
author | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2019-01-10 13:59:13 +0000 |
---|---|---|
committer | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2019-01-10 13:59:13 +0000 |
commit | 97ed076dd1bc1e3fd674d50b925b2a4a6eba5c79 (patch) | |
tree | e6a0241555dc410e6e6ceb01fcde5f0ea0a0b2db /llvm/lib/MCA | |
parent | 73af3d4060463e3222c56fb1cedb166c05771402 (diff) | |
download | bcm5719-llvm-97ed076dd1bc1e3fd674d50b925b2a4a6eba5c79.tar.gz bcm5719-llvm-97ed076dd1bc1e3fd674d50b925b2a4a6eba5c79.zip |
[MCA] Fix wrong definition of ResourceUnitMask in DefaultResourceStrategy.
Field ResourceUnitMask was incorrectly defined as a 'const unsigned' mask. It
should have been a 64 bit quantity instead. That means, ResourceUnitMask was
always implicitly truncated to a 32 bit quantity.
This issue has been found by inspection. Surprisingly, that bug was latent, and
it never negatively affected any existing upstream targets.
This patch fixes the wrong definition of ResourceUnitMask, and adds a bunch of
extra debug prints to help debugging potential issues related to invalid
processor resource masks.
llvm-svn: 350820
Diffstat (limited to 'llvm/lib/MCA')
-rw-r--r-- | llvm/lib/MCA/HardwareUnits/ResourceManager.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/MCA/InstrBuilder.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/MCA/Pipeline.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/MCA/Stages/ExecuteStage.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/MCA/Support.cpp | 21 |
5 files changed, 36 insertions, 15 deletions
diff --git a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp index d05ec0045de..2039b58e8ee 100644 --- a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp +++ b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp @@ -118,7 +118,8 @@ getStrategyFor(const ResourceState &RS) { ResourceManager::ResourceManager(const MCSchedModel &SM) : Resources(SM.getNumProcResourceKinds()), Strategies(SM.getNumProcResourceKinds()), - Resource2Groups(SM.getNumProcResourceKinds(), 0) { + Resource2Groups(SM.getNumProcResourceKinds(), 0), + ProcResID2Mask(SM.getNumProcResourceKinds()) { computeProcResourceMasks(SM, ProcResID2Mask); for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { @@ -283,9 +284,6 @@ void ResourceManager::issueInstruction( ResourceRef Pipe = selectPipe(R.first); use(Pipe); BusyResources[Pipe] += CS.size(); - // Replace the resource mask with a valid processor resource index. - const ResourceState &RS = *Resources[getResourceStateIndex(Pipe.first)]; - Pipe.first = RS.getProcResourceID(); Pipes.emplace_back(std::pair<ResourceRef, ResourceCycles>( Pipe, ResourceCycles(CS.size()))); } else { diff --git a/llvm/lib/MCA/InstrBuilder.cpp b/llvm/lib/MCA/InstrBuilder.cpp index 2cfe154a902..d2d65e55537 100644 --- a/llvm/lib/MCA/InstrBuilder.cpp +++ b/llvm/lib/MCA/InstrBuilder.cpp @@ -31,6 +31,8 @@ InstrBuilder::InstrBuilder(const llvm::MCSubtargetInfo &sti, const llvm::MCInstrAnalysis *mcia) : STI(sti), MCII(mcii), MRI(mri), MCIA(mcia), FirstCallInst(true), FirstReturnInst(true) { + const MCSchedModel &SM = STI.getSchedModel(); + ProcResourceMasks.resize(SM.getNumProcResourceKinds()); computeProcResourceMasks(STI.getSchedModel(), ProcResourceMasks); } @@ -178,8 +180,8 @@ 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) << ", " << - "cy=" << R.second.size() << '\n'; + dbgs() << "\t\tMask=" << format_hex(R.first, 16) << ", " + << "cy=" << R.second.size() << '\n'; for (const uint64_t R : ID.Buffers) dbgs() << "\t\tBuffer Mask=" << format_hex(R, 16) << '\n'; }); @@ -525,6 +527,9 @@ InstrBuilder::createInstrDescImpl(const MCInst &MCI) { MCI); } + LLVM_DEBUG(dbgs() << "\n\t\tOpcode Name= " << MCII.getName(Opcode) << '\n'); + LLVM_DEBUG(dbgs() << "\t\tSchedClassID=" << SchedClassID << '\n'); + // Create a new empty descriptor. std::unique_ptr<InstrDesc> ID = llvm::make_unique<InstrDesc>(); ID->NumMicroOps = SCDesc.NumMicroOps; @@ -559,9 +564,6 @@ InstrBuilder::createInstrDescImpl(const MCInst &MCI) { populateWrites(*ID, MCI, SchedClassID); populateReads(*ID, MCI, SchedClassID); -#ifndef NDEBUG - ID->Name = MCII.getName(Opcode); -#endif LLVM_DEBUG(dbgs() << "\t\tMaxLatency=" << ID->MaxLatency << '\n'); LLVM_DEBUG(dbgs() << "\t\tNumMicroOps=" << ID->NumMicroOps << '\n'); diff --git a/llvm/lib/MCA/Pipeline.cpp b/llvm/lib/MCA/Pipeline.cpp index fd97ea624b8..4c0e37c9ba7 100644 --- a/llvm/lib/MCA/Pipeline.cpp +++ b/llvm/lib/MCA/Pipeline.cpp @@ -83,13 +83,13 @@ void Pipeline::appendStage(std::unique_ptr<Stage> S) { } void Pipeline::notifyCycleBegin() { - LLVM_DEBUG(dbgs() << "[E] Cycle begin: " << Cycles << '\n'); + LLVM_DEBUG(dbgs() << "\n[E] Cycle begin: " << Cycles << '\n'); for (HWEventListener *Listener : Listeners) Listener->onCycleBegin(); } void Pipeline::notifyCycleEnd() { - LLVM_DEBUG(dbgs() << "[E] Cycle end: " << Cycles << "\n\n"); + LLVM_DEBUG(dbgs() << "[E] Cycle end: " << Cycles << "\n"); for (HWEventListener *Listener : Listeners) Listener->onCycleEnd(); } diff --git a/llvm/lib/MCA/Stages/ExecuteStage.cpp b/llvm/lib/MCA/Stages/ExecuteStage.cpp index 17f7ff7259a..e78327763fa 100644 --- a/llvm/lib/MCA/Stages/ExecuteStage.cpp +++ b/llvm/lib/MCA/Stages/ExecuteStage.cpp @@ -57,6 +57,7 @@ Error ExecuteStage::issueInstruction(InstRef &IR) { HWS.issueInstruction(IR, Used, Ready); notifyReservedOrReleasedBuffers(IR, /* Reserved */ false); + notifyInstructionIssued(IR, Used); if (IR.getInstruction()->isExecuted()) { notifyInstructionExecuted(IR); @@ -184,7 +185,7 @@ void ExecuteStage::notifyResourceAvailable(const ResourceRef &RR) const { void ExecuteStage::notifyInstructionIssued( const InstRef &IR, - ArrayRef<std::pair<ResourceRef, ResourceCycles>> Used) const { + MutableArrayRef<std::pair<ResourceRef, ResourceCycles>> Used) const { LLVM_DEBUG({ dbgs() << "[E] Instruction Issued: #" << IR << '\n'; for (const std::pair<ResourceRef, ResourceCycles> &Resource : Used) { @@ -193,6 +194,11 @@ void ExecuteStage::notifyInstructionIssued( dbgs() << "cycles: " << Resource.second << '\n'; } }); + + // Replace resource masks with valid resource processor IDs. + for (std::pair<ResourceRef, ResourceCycles> &Use : Used) + Use.first.first = HWS.getResourceID(Use.first.first); + notifyEvent<HWInstructionEvent>(HWInstructionIssuedEvent(IR, Used)); } diff --git a/llvm/lib/MCA/Support.cpp b/llvm/lib/MCA/Support.cpp index 3271bc6bf5b..335953e1048 100644 --- a/llvm/lib/MCA/Support.cpp +++ b/llvm/lib/MCA/Support.cpp @@ -19,13 +19,18 @@ namespace llvm { namespace mca { +#define DEBUG_TYPE "llvm-mca" + void computeProcResourceMasks(const MCSchedModel &SM, - SmallVectorImpl<uint64_t> &Masks) { + MutableArrayRef<uint64_t> Masks) { unsigned ProcResourceID = 0; + assert(Masks.size() == SM.getNumProcResourceKinds() && + "Invalid number of elements"); + // Resource at index 0 is the 'InvalidUnit'. Set an invalid mask for it. + Masks[0] = 0; + // Create a unique bitmask for every processor resource unit. - // Skip resource at index 0, since it always references 'InvalidUnit'. - Masks.resize(SM.getNumProcResourceKinds()); for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) { const MCProcResourceDesc &Desc = *SM.getProcResource(I); if (Desc.SubUnitsIdxBegin) @@ -46,6 +51,16 @@ void computeProcResourceMasks(const MCSchedModel &SM, } ProcResourceID++; } + +#ifndef NDEBUG + LLVM_DEBUG(dbgs() << "\nProcessor resource masks:" + << "\n"); + for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { + const MCProcResourceDesc &Desc = *SM.getProcResource(I); + LLVM_DEBUG(dbgs() << '[' << I << "] " << Desc.Name << " - " << Masks[I] + << '\n'); + } +#endif } double computeBlockRThroughput(const MCSchedModel &SM, unsigned DispatchWidth, |