Skip to content

Commit 245163f

Browse files
committed
[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
1 parent a9a11aa commit 245163f

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

llvm/include/llvm/MCA/HardwareUnits/ResourceManager.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,9 @@ class ResourceManager {
347347
// Set of processor resource units that are available during this cycle.
348348
uint64_t AvailableProcResUnits;
349349

350+
// Set of processor resource groups that are currently reserved.
351+
uint64_t ReservedResourceGroups;
352+
350353
// Returns the actual resource unit that will be used.
351354
ResourceRef selectPipe(uint64_t ResourceID);
352355

@@ -397,7 +400,7 @@ class ResourceManager {
397400
// Returns a zero mask if resources requested by Desc are all available during
398401
// this cycle. It returns a non-zero mask value only if there are unavailable
399402
// processor resources; each bit set in the mask represents a busy processor
400-
// resource unit.
403+
// resource unit or a reserved processor resource group.
401404
uint64_t checkAvailability(const InstrDesc &Desc) const;
402405

403406
uint64_t getProcResUnitMask() const { return ProcResUnitMask; }

llvm/include/llvm/MCA/Instruction.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,9 @@ struct InstrDesc {
338338
// A list of buffered resources consumed by this instruction.
339339
SmallVector<uint64_t, 4> Buffers;
340340

341+
unsigned UsedProcResUnits;
342+
unsigned UsedProcResGroups;
343+
341344
unsigned MaxLatency;
342345
// Number of MicroOps for this instruction.
343346
unsigned NumMicroOps;

llvm/lib/MCA/HardwareUnits/ResourceManager.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ ResourceManager::ResourceManager(const MCSchedModel &SM)
118118
: Resources(SM.getNumProcResourceKinds()),
119119
Strategies(SM.getNumProcResourceKinds()),
120120
Resource2Groups(SM.getNumProcResourceKinds(), 0),
121-
ProcResID2Mask(SM.getNumProcResourceKinds()),
122-
ProcResUnitMask(0) {
121+
ProcResID2Mask(SM.getNumProcResourceKinds()), ProcResUnitMask(0),
122+
ReservedResourceGroups(0) {
123123
computeProcResourceMasks(SM, ProcResID2Mask);
124124

125125
for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) {
@@ -278,7 +278,10 @@ uint64_t ResourceManager::checkAvailability(const InstrDesc &Desc) const {
278278
BusyResourceMask |= E.first;
279279
}
280280

281-
return BusyResourceMask & ProcResUnitMask;
281+
BusyResourceMask &= ProcResUnitMask;
282+
if (BusyResourceMask)
283+
return BusyResourceMask;
284+
return Desc.UsedProcResGroups & ReservedResourceGroups;
282285
}
283286

284287
void ResourceManager::issueInstruction(
@@ -330,13 +333,17 @@ void ResourceManager::cycleEvent(SmallVectorImpl<ResourceRef> &ResourcesFreed) {
330333

331334
void ResourceManager::reserveResource(uint64_t ResourceID) {
332335
ResourceState &Resource = *Resources[getResourceStateIndex(ResourceID)];
333-
assert(!Resource.isReserved());
336+
assert(Resource.isAResourceGroup() && !Resource.isReserved() &&
337+
"Unexpected resource found!");
334338
Resource.setReserved();
339+
ReservedResourceGroups ^= PowerOf2Floor(ResourceID);
335340
}
336341

337342
void ResourceManager::releaseResource(uint64_t ResourceID) {
338343
ResourceState &Resource = *Resources[getResourceStateIndex(ResourceID)];
339344
Resource.clearReserved();
345+
if (Resource.isAResourceGroup())
346+
ReservedResourceGroups ^= PowerOf2Floor(ResourceID);
340347
}
341348

342349
} // namespace mca

llvm/lib/MCA/InstrBuilder.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,14 @@ static void initializeUsedResources(InstrDesc &ID,
9797
});
9898

9999
uint64_t UsedResourceUnits = 0;
100+
uint64_t UsedResourceGroups = 0;
100101

101102
// Remove cycles contributed by smaller resources.
102103
for (unsigned I = 0, E = Worklist.size(); I < E; ++I) {
103104
ResourcePlusCycles &A = Worklist[I];
104105
if (!A.second.size()) {
105-
A.second.NumUnits = 0;
106-
A.second.setReserved();
107-
ID.Resources.emplace_back(A);
106+
assert(countPopulation(A.first) > 1 && "Expected a group!");
107+
UsedResourceGroups |= PowerOf2Floor(A.first);
108108
continue;
109109
}
110110

@@ -127,6 +127,9 @@ static void initializeUsedResources(InstrDesc &ID,
127127
}
128128
}
129129

130+
ID.UsedProcResUnits = UsedResourceUnits;
131+
ID.UsedProcResGroups = UsedResourceGroups;
132+
130133
// A SchedWrite may specify a number of cycles in which a resource group
131134
// is reserved. For example (on target x86; cpu Haswell):
132135
//
@@ -179,10 +182,14 @@ static void initializeUsedResources(InstrDesc &ID,
179182

180183
LLVM_DEBUG({
181184
for (const std::pair<uint64_t, ResourceUsage> &R : ID.Resources)
182-
dbgs() << "\t\tMask=" << format_hex(R.first, 16) << ", "
185+
dbgs() << "\t\tResource Mask=" << format_hex(R.first, 16) << ", "
186+
<< "Reserved=" << R.second.isReserved() << ", "
187+
<< "#Units=" << R.second.NumUnits << ", "
183188
<< "cy=" << R.second.size() << '\n';
184189
for (const uint64_t R : ID.Buffers)
185190
dbgs() << "\t\tBuffer Mask=" << format_hex(R, 16) << '\n';
191+
dbgs() << "\t\t Used Units=" << format_hex(ID.UsedProcResUnits, 16) << '\n';
192+
dbgs() << "\t\tUsed Groups=" << format_hex(ID.UsedProcResGroups, 16) << '\n';
186193
});
187194
}
188195

0 commit comments

Comments
 (0)