diff --git a/JSTests/stress/cell-speculated-array-indexof.js b/JSTests/stress/cell-speculated-array-indexof.js new file mode 100644 index 000000000000..60a61ba2d979 --- /dev/null +++ b/JSTests/stress/cell-speculated-array-indexof.js @@ -0,0 +1,10 @@ +for (let i = 0; i < 10000; ++i) { + const v0 = []; + const v1 = v0.length; + v0[0] %= v1; + const v2 = [0]; + const v3 = v2.slice(v2); + const v4 = v2.indexOf(v3, 0); + const v5 = new Float64Array(0, 0, v1); +} + diff --git a/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp b/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp index dc7c75982123..f928fd531b3f 100644 --- a/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp +++ b/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp @@ -4316,24 +4316,26 @@ class FixupPhase : public Phase { switch (node->arrayMode().type()) { case Array::Double: case Array::Int32: { + Node* searchElementNode = searchElement.node(); + if (searchElement->shouldSpeculateCell()) { m_insertionSet.insertNode(m_indexInBlock, SpecNone, Check, node->origin, Edge(searchElement.node(), CellUse)); m_graph.convertToConstant(node, jsNumber(-1)); - observeUseKindOnNode(searchElement.node()); + observeUseKindOnNode(searchElementNode); return; } if (searchElement->shouldSpeculateOther()) { m_insertionSet.insertNode(m_indexInBlock, SpecNone, Check, node->origin, Edge(searchElement.node(), OtherUse)); m_graph.convertToConstant(node, jsNumber(-1)); - observeUseKindOnNode(searchElement.node()); + observeUseKindOnNode(searchElementNode); return; } if (searchElement->shouldSpeculateBoolean()) { m_insertionSet.insertNode(m_indexInBlock, SpecNone, Check, node->origin, Edge(searchElement.node(), BooleanUse)); m_graph.convertToConstant(node, jsNumber(-1)); - observeUseKindOnNode(searchElement.node()); + observeUseKindOnNode(searchElementNode); return; } break;