[INFER] Don't use loop registers for entries after coercing them to double/any for a branch, bug 682563.

This commit is contained in:
Brian Hackett 2011-08-29 13:59:06 -07:00
Родитель 69607e1874
Коммит 770ca1d056
3 изменённых файлов: 14 добавлений и 0 удалений

Просмотреть файл

@ -6918,6 +6918,7 @@ mjit::Compiler::fixDoubleTypes(jsbytecode *target)
if (vt.type == JSVAL_TYPE_INT32) { if (vt.type == JSVAL_TYPE_INT32) {
fixedIntToDoubleEntries.append(newv->slot); fixedIntToDoubleEntries.append(newv->slot);
frame.ensureDouble(fe); frame.ensureDouble(fe);
frame.forgetLoopReg(fe);
} else if (vt.type == JSVAL_TYPE_UNKNOWN) { } else if (vt.type == JSVAL_TYPE_UNKNOWN) {
/* /*
* Unknown here but a double at the target. The type * Unknown here but a double at the target. The type
@ -6932,6 +6933,7 @@ mjit::Compiler::fixDoubleTypes(jsbytecode *target)
} else if (fe->isType(JSVAL_TYPE_DOUBLE)) { } else if (fe->isType(JSVAL_TYPE_DOUBLE)) {
fixedDoubleToAnyEntries.append(newv->slot); fixedDoubleToAnyEntries.append(newv->slot);
frame.syncAndForgetFe(fe); frame.syncAndForgetFe(fe);
frame.forgetLoopReg(fe);
} }
newv++; newv++;
} }

Просмотреть файл

@ -878,6 +878,17 @@ FrameState::syncAndForgetFe(FrameEntry *fe, bool markSynced)
fe->data.setMemory(); fe->data.setMemory();
} }
inline void
FrameState::forgetLoopReg(FrameEntry *fe)
{
/*
* Don't use a loop register for fe in the active loop, as its underlying
* representation may have changed since the start of the loop.
*/
if (loop)
fe->lastLoop = loop->headOffset();
}
inline void inline void
FrameState::syncType(FrameEntry *fe) FrameState::syncType(FrameEntry *fe)
{ {

Просмотреть файл

@ -951,6 +951,7 @@ class FrameState
Vector<TemporaryCopy> *getTemporaryCopies(); Vector<TemporaryCopy> *getTemporaryCopies();
inline void syncAndForgetFe(FrameEntry *fe, bool markSynced = false); inline void syncAndForgetFe(FrameEntry *fe, bool markSynced = false);
inline void forgetLoopReg(FrameEntry *fe);
private: private:
inline AnyRegisterID allocAndLoadReg(FrameEntry *fe, bool fp, RematInfo::RematType type); inline AnyRegisterID allocAndLoadReg(FrameEntry *fe, bool fp, RematInfo::RematType type);