Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Unified Diff: src/IceRegAlloc.cpp

Issue 781683002: Subzero: Improve the memory-related performance of the register allocator. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Code review changes Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceRegAlloc.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceRegAlloc.cpp
diff --git a/src/IceRegAlloc.cpp b/src/IceRegAlloc.cpp
index 2a300346018749ce5561b65b4df5101facbcd250..8a1656bb1f6c45983f9950c00eba425994d18dd0 100644
--- a/src/IceRegAlloc.cpp
+++ b/src/IceRegAlloc.cpp
@@ -85,6 +85,7 @@ void LinearScan::initForGlobal() {
FindOverlap = true;
const VarList &Vars = Func->getVariables();
Unhandled.reserve(Vars.size());
+ UnhandledPrecolored.reserve(Vars.size());
// Gather the live ranges of all variables and add them to the
// Unhandled set.
for (Variable *Var : Vars) {
@@ -184,6 +185,7 @@ void LinearScan::initForInfOnly() {
}
Unhandled.reserve(NumVars);
+ UnhandledPrecolored.reserve(NumVars);
for (SizeT i = 0; i < Vars.size(); ++i) {
Variable *Var = Vars[i];
if (LRBegin[i] != Inst::NumberSentinel) {
@@ -239,6 +241,10 @@ void LinearScan::init(RegAllocKind Kind) {
std::sort(Unhandled.rbegin(), Unhandled.rend(), CompareRanges());
std::sort(UnhandledPrecolored.rbegin(), UnhandledPrecolored.rend(),
CompareRanges());
+
+ Handled.reserve(Unhandled.size());
+ Inactive.reserve(Unhandled.size());
+ Active.reserve(Unhandled.size());
}
// Implements the linear-scan algorithm. Based on "Linear Scan
@@ -276,7 +282,6 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
assert(Active.empty());
assert(Inactive.empty());
assert(Handled.empty());
- UnorderedRanges::iterator Next;
const TargetLowering::RegSetMask RegsInclude =
TargetLowering::RegSet_CallerSave;
const TargetLowering::RegSetMask RegsExclude = TargetLowering::RegSet_None;
@@ -319,10 +324,9 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
}
// Check for active ranges that have expired or become inactive.
- for (auto I = Active.begin(), E = Active.end(); I != E; I = Next) {
- Next = I;
- ++Next;
- Variable *Item = *I;
+ for (SizeT I = Active.size(); I > 0; --I) {
+ const SizeT Index = I - 1;
+ Variable *Item = Active[Index];
Item->trimLiveRange(Cur->getLiveRange().getStart());
bool Moved = false;
if (Item->rangeEndsBefore(Cur)) {
@@ -332,7 +336,7 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
dumpLiveRange(Item, Func);
Str << "\n";
}
- Handled.splice(Handled.end(), Active, I);
+ moveItem(Active, Index, Handled);
Moved = true;
} else if (!Item->rangeOverlapsStart(Cur)) {
// Move Item from Active to Inactive list.
@@ -341,7 +345,7 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
dumpLiveRange(Item, Func);
Str << "\n";
}
- Inactive.splice(Inactive.end(), Active, I);
+ moveItem(Active, Index, Inactive);
Moved = true;
}
if (Moved) {
@@ -354,10 +358,9 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
}
// Check for inactive ranges that have expired or reactivated.
- for (auto I = Inactive.begin(), E = Inactive.end(); I != E; I = Next) {
- Next = I;
- ++Next;
- Variable *Item = *I;
+ for (SizeT I = Inactive.size(); I > 0; --I) {
+ const SizeT Index = I - 1;
+ Variable *Item = Inactive[Index];
Item->trimLiveRange(Cur->getLiveRange().getStart());
if (Item->rangeEndsBefore(Cur)) {
// Move Item from Inactive to Handled list.
@@ -366,7 +369,7 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
dumpLiveRange(Item, Func);
Str << "\n";
}
- Handled.splice(Handled.end(), Inactive, I);
+ moveItem(Inactive, Index, Handled);
} else if (Item->rangeOverlapsStart(Cur)) {
// Move Item from Inactive to Active list.
if (Verbose) {
@@ -374,7 +377,7 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
dumpLiveRange(Item, Func);
Str << "\n";
}
- Active.splice(Active.end(), Inactive, I);
+ moveItem(Inactive, Index, Active);
// Increment Item in RegUses[].
assert(Item->hasRegTmp());
int32_t RegNum = Item->getRegNumTmp();
@@ -598,10 +601,9 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
} else {
// Evict all live ranges in Active that register number
// MinWeightIndex is assigned to.
- for (auto I = Active.begin(), E = Active.end(); I != E; I = Next) {
- Next = I;
- ++Next;
- Variable *Item = *I;
+ for (SizeT I = Active.size(); I > 0; --I) {
+ const SizeT Index = I - 1;
+ Variable *Item = Active[Index];
if (Item->getRegNumTmp() == MinWeightIndex) {
if (Verbose) {
Str << "Evicting ";
@@ -611,14 +613,13 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
--RegUses[MinWeightIndex];
assert(RegUses[MinWeightIndex] >= 0);
Item->setRegNumTmp(Variable::NoRegister);
- Handled.splice(Handled.end(), Active, I);
+ moveItem(Active, Index, Handled);
}
}
// Do the same for Inactive.
- for (auto I = Inactive.begin(), E = Inactive.end(); I != E; I = Next) {
- Next = I;
- ++Next;
- Variable *Item = *I;
+ for (SizeT I = Inactive.size(); I > 0; --I) {
+ const SizeT Index = I - 1;
+ Variable *Item = Inactive[Index];
// Note: The Item->rangeOverlaps(Cur) clause is not part of the
// description of AssignMemLoc() in the original paper. But
// there doesn't seem to be any need to evict an inactive
@@ -636,7 +637,7 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
Str << "\n";
}
Item->setRegNumTmp(Variable::NoRegister);
- Handled.splice(Handled.end(), Inactive, I);
+ moveItem(Inactive, Index, Handled);
}
}
// Assign the register to Cur.
« no previous file with comments | « src/IceRegAlloc.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698