Bug 1031682 - Add OperandIter::settle to skip instructions with no operands. r=nbp

This commit is contained in:
Caio Lima 2014-07-02 08:52:00 +02:00
parent 6cbdff01c3
commit b11073fe1e
4 changed files with 22 additions and 18 deletions

View File

@ -181,11 +181,8 @@ LBlock::dump()
static size_t
TotalOperandCount(LRecoverInfo *recoverInfo)
{
LRecoverInfo::OperandIter it(recoverInfo->begin());
LRecoverInfo::OperandIter end(recoverInfo->end());
size_t accum = 0;
for (; it != end; ++it) {
for (LRecoverInfo::OperandIter it(recoverInfo); !it; ++it) {
if (!it->isRecoveredOnBailout())
accum++;
}

View File

@ -965,12 +965,22 @@ class LRecoverInfo : public TempObject
{
private:
MNode **it_;
MNode **end_;
size_t op_;
public:
explicit OperandIter(MNode **it)
: it_(it), op_(0)
{ }
explicit OperandIter(LRecoverInfo *recoverInfo)
: it_(recoverInfo->begin()), end_(recoverInfo->end()), op_(0)
{
settle();
}
void settle() {
while ((*it_)->numOperands() == 0) {
++it_;
op_ = 0;
}
}
MDefinition *operator *() {
return (*it_)->getOperand(op_);
@ -985,11 +995,14 @@ class LRecoverInfo : public TempObject
op_ = 0;
++it_;
}
if (!*this)
settle();
return *this;
}
bool operator !=(const OperandIter &where) const {
return it_ != where.it_ || op_ != where.op_;
operator bool() const {
return it_ == end_;
}
#ifdef DEBUG

View File

@ -317,9 +317,7 @@ CodeGeneratorShared::encode(LSnapshot *snapshot)
#endif
uint32_t allocIndex = 0;
LRecoverInfo::OperandIter it(recoverInfo->begin());
LRecoverInfo::OperandIter end(recoverInfo->end());
for (; it != end; ++it) {
for (LRecoverInfo::OperandIter it(recoverInfo); !it; ++it) {
DebugOnly<uint32_t> allocWritten = snapshots_.allocWritten();
if (!encodeAllocation(snapshot, *it, &allocIndex))
return false;

View File

@ -106,9 +106,7 @@ LIRGeneratorShared::buildSnapshot(LInstruction *ins, MResumePoint *rp, BailoutKi
return nullptr;
size_t index = 0;
LRecoverInfo::OperandIter it(recoverInfo->begin());
LRecoverInfo::OperandIter end(recoverInfo->end());
for (; it != end; ++it) {
for (LRecoverInfo::OperandIter it(recoverInfo); !it; ++it) {
// Check that optimized out operands are in eliminable slots.
MOZ_ASSERT(it.canOptimizeOutIfUnused());
@ -166,9 +164,7 @@ LIRGeneratorShared::buildSnapshot(LInstruction *ins, MResumePoint *rp, BailoutKi
return nullptr;
size_t index = 0;
LRecoverInfo::OperandIter it(recoverInfo->begin());
LRecoverInfo::OperandIter end(recoverInfo->end());
for (; it != end; ++it) {
for (LRecoverInfo::OperandIter it(recoverInfo); !it; ++it) {
// Check that optimized out operands are in eliminable slots.
MOZ_ASSERT(it.canOptimizeOutIfUnused());