зеркало из https://github.com/mozilla/pjs.git
[INFER] Don't use loop registers for entries after coercing them to double/any for a branch, bug 682563.
This commit is contained in:
Родитель
69607e1874
Коммит
770ca1d056
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче