diff options
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGAbstractState.cpp')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGAbstractState.cpp | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGAbstractState.cpp b/Source/JavaScriptCore/dfg/DFGAbstractState.cpp index eb00bcb3c..bd35e1d43 100644 --- a/Source/JavaScriptCore/dfg/DFGAbstractState.cpp +++ b/Source/JavaScriptCore/dfg/DFGAbstractState.cpp @@ -121,6 +121,8 @@ void AbstractState::initialize(Graph& graph) root->valuesAtHead.argument(i).set(PredictInt32Array); else if (isUint8ArrayPrediction(prediction)) root->valuesAtHead.argument(i).set(PredictUint8Array); + else if (isUint8ClampedArrayPrediction(prediction)) + root->valuesAtHead.argument(i).set(PredictUint8ClampedArray); else if (isUint16ArrayPrediction(prediction)) root->valuesAtHead.argument(i).set(PredictUint16Array); else if (isUint32ArrayPrediction(prediction)) @@ -151,14 +153,14 @@ bool AbstractState::endBasicBlock(MergeMode mergeMode) if (mergeMode != DontMerge || !ASSERT_DISABLED) { for (size_t argument = 0; argument < block->variablesAtTail.numberOfArguments(); ++argument) { #if DFG_ENABLE(DEBUG_PROPAGATION_VERBOSE) - printf(" Merging state for argument %lu.\n", argument); + printf(" Merging state for argument %zu.\n", argument); #endif changed |= mergeStateAtTail(block->valuesAtTail.argument(argument), m_variables.argument(argument), block->variablesAtTail.argument(argument)); } for (size_t local = 0; local < block->variablesAtTail.numberOfLocals(); ++local) { #if DFG_ENABLE(DEBUG_PROPAGATION_VERBOSE) - printf(" Merging state for local %lu.\n", local); + printf(" Merging state for local %zu.\n", local); #endif changed |= mergeStateAtTail(block->valuesAtTail.local(local), m_variables.local(local), block->variablesAtTail.local(local)); } @@ -278,7 +280,7 @@ bool AbstractState::execute(NodeIndex nodeIndex) case ValueAdd: case ArithAdd: { - if (Node::shouldSpeculateInteger(m_graph[node.child1()], m_graph[node.child2()]) && node.canSpeculateInteger()) { + if (m_graph.addShouldSpeculateInteger(node, m_codeBlock)) { forNode(node.child1()).filter(PredictInt32); forNode(node.child2()).filter(PredictInt32); forNode(nodeIndex).set(PredictInt32); @@ -296,7 +298,19 @@ bool AbstractState::execute(NodeIndex nodeIndex) break; } - case ArithSub: + case ArithSub: { + if (m_graph.addShouldSpeculateInteger(node, m_codeBlock)) { + forNode(node.child1()).filter(PredictInt32); + forNode(node.child2()).filter(PredictInt32); + forNode(nodeIndex).set(PredictInt32); + break; + } + forNode(node.child1()).filter(PredictNumber); + forNode(node.child2()).filter(PredictNumber); + forNode(nodeIndex).set(PredictDouble); + break; + } + case ArithMul: case ArithDiv: case ArithMin: @@ -448,6 +462,12 @@ bool AbstractState::execute(NodeIndex nodeIndex) forNode(nodeIndex).set(PredictInt32); break; } + if (m_graph[node.child1()].shouldSpeculateUint8ClampedArray()) { + forNode(node.child1()).filter(PredictUint8ClampedArray); + forNode(node.child2()).filter(PredictInt32); + forNode(nodeIndex).set(PredictInt32); + break; + } if (m_graph[node.child1()].shouldSpeculateUint16Array()) { forNode(node.child1()).filter(PredictUint16Array); forNode(node.child2()).filter(PredictInt32); @@ -522,6 +542,12 @@ bool AbstractState::execute(NodeIndex nodeIndex) forNode(node.child3()).filter(PredictNumber); break; } + if (m_graph[node.child1()].shouldSpeculateUint8ClampedArray()) { + forNode(node.child1()).filter(PredictUint8ClampedArray); + forNode(node.child2()).filter(PredictInt32); + forNode(node.child3()).filter(PredictNumber); + break; + } if (m_graph[node.child1()].shouldSpeculateUint16Array()) { forNode(node.child1()).filter(PredictUint16Array); forNode(node.child2()).filter(PredictInt32); @@ -688,6 +714,7 @@ bool AbstractState::execute(NodeIndex nodeIndex) break; case GetById: + case GetByIdFlush: if (!node.prediction()) { m_isValid = false; break; @@ -728,6 +755,10 @@ bool AbstractState::execute(NodeIndex nodeIndex) forNode(node.child1()).filter(PredictUint8Array); forNode(nodeIndex).set(PredictInt32); break; + case GetUint8ClampedArrayLength: + forNode(node.child1()).filter(PredictUint8ClampedArray); + forNode(nodeIndex).set(PredictInt32); + break; case GetUint16ArrayLength: forNode(node.child1()).filter(PredictUint16Array); forNode(nodeIndex).set(PredictInt32); @@ -797,6 +828,11 @@ bool AbstractState::execute(NodeIndex nodeIndex) forNode(nodeIndex).clear(); break; } + if (m_graph[node.child1()].shouldSpeculateUint8ClampedArray()) { + forNode(node.child1()).filter(PredictUint8ClampedArray); + forNode(nodeIndex).clear(); + break; + } if (m_graph[node.child1()].shouldSpeculateUint16Array()) { forNode(node.child1()).filter(PredictUint16Array); forNode(nodeIndex).set(PredictOther); |