Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (95785 => 95786)
--- trunk/Source/_javascript_Core/ChangeLog 2011-09-23 05:58:55 UTC (rev 95785)
+++ trunk/Source/_javascript_Core/ChangeLog 2011-09-23 06:59:38 UTC (rev 95786)
@@ -1,5 +1,28 @@
2011-09-22 Filip Pizlo <[email protected]>
+ GetScopedVar should have value profiling
+ https://bugs.webkit.org/show_bug.cgi?id=68676
+
+ Reviewed by Oliver Hunt.
+
+ Added GetScopedVar value profiling and predictin propagation.
+ Added GetScopeChain to CSE.
+
+ * dfg/DFGByteCodeParser.cpp:
+ (JSC::DFG::ByteCodeParser::parseBlock):
+ * dfg/DFGGraph.h:
+ (JSC::DFG::Graph::predict):
+ * dfg/DFGNode.h:
+ (JSC::DFG::Node::hasPrediction):
+ * dfg/DFGPropagator.cpp:
+ (JSC::DFG::Propagator::propagateNodePredictions):
+ (JSC::DFG::Propagator::getScopeChainLoadElimination):
+ (JSC::DFG::Propagator::performNodeCSE):
+ * jit/JITPropertyAccess.cpp:
+ (JSC::JIT::emit_op_get_scoped_var):
+
+2011-09-22 Filip Pizlo <[email protected]>
+
PPC build fix, part 3.
* runtime/Executable.cpp:
Modified: trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp (95785 => 95786)
--- trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp 2011-09-23 05:58:55 UTC (rev 95785)
+++ trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp 2011-09-23 06:59:38 UTC (rev 95786)
@@ -1119,8 +1119,9 @@
int slot = currentInstruction[2].u.operand;
int depth = currentInstruction[3].u.operand;
NodeIndex getScopeChain = addToGraph(GetScopeChain, OpInfo(depth));
- NodeIndex getScopedVar = addToGraph(GetScopedVar, OpInfo(slot), getScopeChain);
+ NodeIndex getScopedVar = addToGraph(GetScopedVar, OpInfo(slot), OpInfo(PredictNone), getScopeChain);
set(dst, getScopedVar);
+ stronglyPredict(getScopedVar);
NEXT_OPCODE(op_get_scoped_var);
}
case op_put_scoped_var: {
Modified: trunk/Source/_javascript_Core/dfg/DFGGraph.h (95785 => 95786)
--- trunk/Source/_javascript_Core/dfg/DFGGraph.h 2011-09-23 05:58:55 UTC (rev 95785)
+++ trunk/Source/_javascript_Core/dfg/DFGGraph.h 2011-09-23 06:59:38 UTC (rev 95786)
@@ -196,6 +196,7 @@
case Call:
case Construct:
case GetByOffset:
+ case GetScopedVar:
return node.predict(prediction, source);
default:
return false;
Modified: trunk/Source/_javascript_Core/dfg/DFGNode.h (95785 => 95786)
--- trunk/Source/_javascript_Core/dfg/DFGNode.h 2011-09-23 05:58:55 UTC (rev 95785)
+++ trunk/Source/_javascript_Core/dfg/DFGNode.h 2011-09-23 06:59:38 UTC (rev 95786)
@@ -624,6 +624,7 @@
case Call:
case Construct:
case GetByOffset:
+ case GetScopedVar:
return true;
default:
return false;
Modified: trunk/Source/_javascript_Core/dfg/DFGPropagator.cpp (95785 => 95786)
--- trunk/Source/_javascript_Core/dfg/DFGPropagator.cpp 2011-09-23 05:58:55 UTC (rev 95785)
+++ trunk/Source/_javascript_Core/dfg/DFGPropagator.cpp 2011-09-23 06:59:38 UTC (rev 95786)
@@ -471,7 +471,7 @@
changed |= mergeUse(node.child1(), PredictObjectUnknown | StrongPredictionTag);
changed |= node.predict(m_uses[m_compileIndex] & ~PredictionTagMask, StrongPrediction);
if (isStrongPrediction(node.getPrediction()))
- changed |= setPrediction(node.getPrediction());
+ changed |= mergePrediction(node.getPrediction());
break;
}
@@ -489,7 +489,7 @@
case GetByOffset: {
changed |= node.predict(m_uses[m_compileIndex] & ~PredictionTagMask, StrongPrediction);
if (isStrongPrediction(node.getPrediction()))
- changed |= setPrediction(node.getPrediction());
+ changed |= mergePrediction(node.getPrediction());
break;
}
@@ -504,7 +504,7 @@
changed |= mergeUse(m_graph.m_varArgChildren[node.firstChild()], PredictObjectUnknown | StrongPredictionTag);
changed |= node.predict(m_uses[m_compileIndex] & ~PredictionTagMask, StrongPrediction);
if (isStrongPrediction(node.getPrediction()))
- changed |= setPrediction(node.getPrediction());
+ changed |= mergePrediction(node.getPrediction());
break;
}
@@ -527,6 +527,19 @@
break;
}
+ case GetScopedVar: {
+ changed |= node.predict(m_uses[m_compileIndex] & ~PredictionTagMask, StrongPrediction);
+ PredictedType prediction = node.getPrediction();
+ if (isStrongPrediction(prediction))
+ changed |= mergePrediction(prediction);
+ break;
+ }
+
+ case GetScopeChain: {
+ changed |= setPrediction(makePrediction(PredictCellOther, StrongPrediction));
+ break;
+ }
+
case PutByVal:
case PutByValAlias:
case PutById:
@@ -535,7 +548,6 @@
break;
}
- case GetScopeChain:
case GetCallee: {
changed |= setPrediction(makePrediction(PredictObjectOther, StrongPrediction));
break;
@@ -587,7 +599,6 @@
case Resolve:
case ResolveBase:
case ResolveBaseStrictPut:
- case GetScopedVar:
break;
// This gets ignored because it doesn't do anything.
@@ -976,6 +987,18 @@
return NoNode;
}
+ NodeIndex getScopeChainLoadElimination(unsigned depth)
+ {
+ NodeIndex start = startIndexForChildren();
+ for (NodeIndex index = endIndexForPureCSE(); index-- > start;) {
+ Node& node = m_graph[index];
+ if (node.op == GetScopeChain
+ && node.scopeChainDepth() == depth)
+ return index;
+ }
+ return NoNode;
+ }
+
void performSubstitution(NodeIndex& child)
{
// Check if this operand is actually unused.
@@ -1067,6 +1090,10 @@
setReplacement(pureCSE(node));
break;
+ case GetScopeChain:
+ setReplacement(getScopeChainLoadElimination(node.scopeChainDepth()));
+ break;
+
// Handle nodes that are conditionally pure: these are pure, and can
// be CSE'd, so long as the prediction is the one we want.
case ValueAdd:
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp (95785 => 95786)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2011-09-23 05:58:55 UTC (rev 95785)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2011-09-23 06:59:38 UTC (rev 95786)
@@ -965,6 +965,7 @@
loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, object)), regT0);
loadPtr(Address(regT0, JSVariableObject::offsetOfRegisters()), regT0);
loadPtr(Address(regT0, currentInstruction[2].u.operand * sizeof(Register)), regT0);
+ emitValueProfilingSite(FirstProfilingSite);
emitPutVirtualRegister(currentInstruction[1].u.operand);
}