Modified: trunk/Source/_javascript_Core/dfg/DFGFixupPhase.cpp (174024 => 174025)
--- trunk/Source/_javascript_Core/dfg/DFGFixupPhase.cpp 2014-09-26 22:17:52 UTC (rev 174024)
+++ trunk/Source/_javascript_Core/dfg/DFGFixupPhase.cpp 2014-09-26 22:53:20 UTC (rev 174025)
@@ -644,7 +644,7 @@
case Array::Arguments:
fixEdge<KnownCellUse>(child1);
fixEdge<Int32Use>(child2);
- insertStoreBarrier(m_indexInBlock, child1);
+ insertStoreBarrier(m_indexInBlock, child1, child3);
break;
default:
fixEdge<KnownCellUse>(child1);
@@ -682,7 +682,7 @@
break;
case Array::Contiguous:
case Array::ArrayStorage:
- insertStoreBarrier(m_indexInBlock, node->child1());
+ insertStoreBarrier(m_indexInBlock, node->child1(), node->child2());
break;
default:
break;
@@ -854,7 +854,7 @@
case PutClosureVar: {
fixEdge<KnownCellUse>(node->child1());
- insertStoreBarrier(m_indexInBlock, node->child1());
+ insertStoreBarrier(m_indexInBlock, node->child1(), node->child2());
break;
}
@@ -899,7 +899,7 @@
case PutByIdFlush:
case PutByIdDirect: {
fixEdge<CellUse>(node->child1());
- insertStoreBarrier(m_indexInBlock, node->child1());
+ insertStoreBarrier(m_indexInBlock, node->child1(), node->child2());
break;
}
@@ -942,13 +942,13 @@
if (!node->child1()->hasStorageResult())
fixEdge<KnownCellUse>(node->child1());
fixEdge<KnownCellUse>(node->child2());
- insertStoreBarrier(m_indexInBlock, node->child2());
+ insertStoreBarrier(m_indexInBlock, node->child2(), node->child3());
break;
}
case MultiPutByOffset: {
fixEdge<CellUse>(node->child1());
- insertStoreBarrier(m_indexInBlock, node->child1());
+ insertStoreBarrier(m_indexInBlock, node->child1(), node->child2());
break;
}
@@ -1640,11 +1640,46 @@
edge.setUseKind(useKind);
}
- void insertStoreBarrier(unsigned indexInBlock, Edge child1)
+ void insertStoreBarrier(unsigned indexInBlock, Edge base, Edge value = Edge())
{
- Node* barrierNode = m_graph.addNode(SpecNone, StoreBarrier, m_currentNode->origin, child1);
- m_insertionSet.insert(indexInBlock, barrierNode);
+ if (!!value) {
+ if (value->shouldSpeculateInt32()) {
+ insertCheck<Int32Use>(indexInBlock, value.node());
+ return;
+ }
+
+ if (value->shouldSpeculateBoolean()) {
+ insertCheck<BooleanUse>(indexInBlock, value.node());
+ return;
+ }
+
+ if (value->shouldSpeculateOther()) {
+ insertCheck<OtherUse>(indexInBlock, value.node());
+ return;
+ }
+
+ if (value->shouldSpeculateNumber()) {
+ insertCheck<NumberUse>(indexInBlock, value.node());
+ return;
+ }
+
+ if (value->shouldSpeculateNotCell()) {
+ insertCheck<NotCellUse>(indexInBlock, value.node());
+ return;
+ }
+ }
+
+ m_insertionSet.insertNode(
+ indexInBlock, SpecNone, StoreBarrier, m_currentNode->origin, base);
}
+
+ template<UseKind useKind>
+ void insertCheck(unsigned indexInBlock, Node* node)
+ {
+ observeUseKindOnNode<useKind>(node);
+ m_insertionSet.insertNode(
+ indexInBlock, SpecNone, Check, m_currentNode->origin, Edge(node, useKind));
+ }
void fixIntConvertingEdge(Edge& edge)
{
Modified: trunk/Source/_javascript_Core/dfg/DFGNode.h (174024 => 174025)
--- trunk/Source/_javascript_Core/dfg/DFGNode.h 2014-09-26 22:17:52 UTC (rev 174024)
+++ trunk/Source/_javascript_Core/dfg/DFGNode.h 2014-09-26 22:53:20 UTC (rev 174025)
@@ -1682,6 +1682,11 @@
return isCellSpeculation(prediction());
}
+ bool shouldSpeculateNotCell()
+ {
+ return isNotCellSpeculation(prediction());
+ }
+
static bool shouldSpeculateBoolean(Node* op1, Node* op2)
{
return op1->shouldSpeculateBoolean() && op2->shouldSpeculateBoolean();