This commit is contained in:
Cameron Kaiser 2019-10-28 20:31:57 -07:00
parent 8c40900ac1
commit 5b23930427
2 changed files with 74 additions and 26 deletions

View File

@ -71,11 +71,39 @@ InsertSortedList(InlineForwardList<T> &list, T* value)
// LiveRange
/////////////////////////////////////////////////////////////////////
inline void
LiveRange::noteAddedUse(UsePosition* use)
{
LUse::Policy policy = use->usePolicy();
usesSpillWeight_ += BacktrackingAllocator::SpillWeightFromUsePolicy(policy);
if (policy == LUse::FIXED)
++numFixedUses_;
}
inline void
LiveRange::noteRemovedUse(UsePosition* use)
{
LUse::Policy policy = use->usePolicy();
usesSpillWeight_ -= BacktrackingAllocator::SpillWeightFromUsePolicy(policy);
if (policy == LUse::FIXED)
--numFixedUses_;
MOZ_ASSERT_IF(!hasUses(), !usesSpillWeight_ && !numFixedUses_);
}
void
LiveRange::addUse(UsePosition* use)
{
MOZ_ASSERT(covers(use->pos));
InsertSortedList(uses_, use);
noteAddedUse(use);
}
UsePosition*
LiveRange::popUse()
{
UsePosition* ret = uses_.popFront();
noteRemovedUse(ret);
return ret;
}
void
@ -89,6 +117,7 @@ LiveRange::distributeUses(LiveRange* other)
UsePosition* use = *iter;
if (other->covers(use->pos)) {
uses_.removeAndIncrement(iter);
noteRemovedUse(use);
other->addUse(use);
} else {
iter++;
@ -2494,28 +2523,9 @@ BacktrackingAllocator::computeSpillWeight(LiveBundle* bundle)
}
}
for (UsePositionIterator iter = range->usesBegin(); iter; iter++) {
LUse* use = iter->use;
switch (use->policy()) {
case LUse::ANY:
usesTotal += 1000;
break;
case LUse::FIXED:
fixed = true;
case LUse::REGISTER:
usesTotal += 2000;
break;
case LUse::KEEPALIVE:
break;
default:
// Note: RECOVERED_INPUT will not appear in UsePositionIterator.
MOZ_CRASH("Bad use");
}
}
usesTotal += range->usesSpillWeight();
if (range->numFixedUses() > 0)
fixed = true;
}
// Bundles with fixed uses are given a higher spill weight, since they must

View File

@ -123,6 +123,8 @@ class Requirement
CodePosition position_;
};
// We may want the cache-friendlier version in
// https://hg.mozilla.org/mozilla-central/raw-file/df79199f9f0fcde01ddc2eccf2a5368cb7b801aa/js/src/jit/BacktrackingAllocator.h
struct UsePosition : public TempObject,
public InlineForwardListNode<UsePosition>
{
@ -141,6 +143,9 @@ struct UsePosition : public TempObject,
? CodePosition::INPUT
: CodePosition::OUTPUT));
}
LUse::Policy usePolicy() const {
return use->policy();
}
};
typedef InlineForwardListIterator<UsePosition> UsePositionIterator;
@ -231,15 +236,29 @@ class LiveRange : public TempObject
// All uses of the virtual register in this range, ordered by location.
InlineForwardList<UsePosition> uses_;
// Total spill weight that calculate from all the uses' policy. Because the
// use's policy can't be changed after initialization, we can update the
// weight whenever a use is added to or remove from this range. This way, we
// don't need to iterate all the uses every time computeSpillWeight() is
// called.
size_t usesSpillWeight_;
// Number of uses that have policy LUse::FIXED.
uint32_t numFixedUses_;
// Whether this range contains the virtual register's definition.
bool hasDefinition_;
LiveRange(uint32_t vreg, Range range)
: vreg_(vreg), bundle_(nullptr), range_(range), hasDefinition_(false)
: vreg_(vreg), bundle_(nullptr), range_(range), usesSpillWeight_(0),
numFixedUses_(0), hasDefinition_(false)
{
MOZ_ASSERT(!range.empty());
}
void noteAddedUse(UsePosition* use);
void noteRemovedUse(UsePosition* use);
public:
static LiveRange* New(TempAllocator& alloc, uint32_t vreg,
CodePosition from, CodePosition to) {
@ -287,9 +306,7 @@ class LiveRange : public TempObject
bool hasUses() const {
return !!usesBegin();
}
UsePosition* popUse() {
return uses_.popFront();
}
UsePosition* popUse();
bool hasDefinition() const {
return hasDefinition_;
@ -316,6 +333,13 @@ class LiveRange : public TempObject
hasDefinition_ = true;
}
size_t usesSpillWeight() {
return usesSpillWeight_;
}
uint32_t numFixedUses() {
return numFixedUses_;
}
// Return a string describing this range. This is not re-entrant!
#ifdef DEBUG
const char* toString() const;
@ -636,6 +660,20 @@ class BacktrackingAllocator : protected RegisterAllocator
bool go();
static size_t SpillWeightFromUsePolicy(LUse::Policy policy) {
switch (policy) {
case LUse::ANY:
return 1000;
case LUse::REGISTER:
case LUse::FIXED:
return 2000;
default:
return 0;
}
}
private:
typedef Vector<LiveRange*, 4, SystemAllocPolicy> LiveRangeVector;