Title: [164442] trunk/Source/_javascript_Core
- Revision
- 164442
- Author
- [email protected]
- Date
- 2014-02-20 12:37:03 -0800 (Thu, 20 Feb 2014)
Log Message
FTL should not emit stack overflow checks in leaf functions
https://bugs.webkit.org/show_bug.cgi?id=129085
Reviewed by Michael Saboff.
Miniscule (0.5%) speed-up on V8v7.
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::LowerDFGToLLVM::lower):
(JSC::FTL::LowerDFGToLLVM::didOverflowStack):
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (164441 => 164442)
--- trunk/Source/_javascript_Core/ChangeLog 2014-02-20 20:01:19 UTC (rev 164441)
+++ trunk/Source/_javascript_Core/ChangeLog 2014-02-20 20:37:03 UTC (rev 164442)
@@ -1,3 +1,16 @@
+2014-02-19 Filip Pizlo <[email protected]>
+
+ FTL should not emit stack overflow checks in leaf functions
+ https://bugs.webkit.org/show_bug.cgi?id=129085
+
+ Reviewed by Michael Saboff.
+
+ Miniscule (0.5%) speed-up on V8v7.
+
+ * ftl/FTLLowerDFGToLLVM.cpp:
+ (JSC::FTL::LowerDFGToLLVM::lower):
+ (JSC::FTL::LowerDFGToLLVM::didOverflowStack):
+
2014-02-20 Mark Hahnenberg <[email protected]>
Dynamically generated JSExport protocols added to a class results in a crash
Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp (164441 => 164442)
--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp 2014-02-20 20:01:19 UTC (rev 164441)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp 2014-02-20 20:37:03 UTC (rev 164442)
@@ -136,9 +136,9 @@
m_tagMask = m_out.constInt64(TagMask);
m_out.storePtr(m_out.constIntPtr(codeBlock()), addressFor(JSStack::CodeBlock));
+
m_out.branch(
- m_out.below(m_callFrame, m_out.loadPtr(m_out.absolute(vm().addressOfFTLStackLimit()))),
- rarely(stackOverflow), usually(lowBlock(m_graph.block(0))));
+ didOverflowStack(), rarely(stackOverflow), usually(lowBlock(m_graph.block(0))));
m_out.appendTo(stackOverflow, m_handleExceptions);
vmCall(m_out.operation(operationThrowStackOverflowError), m_callFrame, m_out.constIntPtr(codeBlock()), NoExceptions);
@@ -3704,6 +3704,42 @@
m_out.store64(m_out.add(m_out.load64(counter), m_out.constInt64(1)), counter);
}
+ LValue didOverflowStack()
+ {
+ // This does a very simple leaf function analysis. The invariant of FTL call
+ // frames is that the caller had already done enough of a stack check to
+ // prove that this call frame has enough stack to run, and also enough stack
+ // to make runtime calls. So, we only need to stack check when making calls
+ // to other JS functions. If we don't find such calls then we don't need to
+ // do any stack checks.
+
+ for (BlockIndex blockIndex = 0; blockIndex < m_graph.numBlocks(); ++blockIndex) {
+ BasicBlock* block = m_graph.block(blockIndex);
+ if (!block)
+ continue;
+
+ for (unsigned nodeIndex = block->size(); nodeIndex--;) {
+ Node* node = block->at(nodeIndex);
+
+ switch (node->op()) {
+ case GetById:
+ case PutById:
+ case Call:
+ case Construct:
+ return m_out.below(
+ m_callFrame,
+ m_out.loadPtr(
+ m_out.absolute(vm().addressOfFTLStackLimit())));
+
+ default:
+ break;
+ }
+ }
+ }
+
+ return m_out.booleanFalse;
+ }
+
LValue getById(LValue base)
{
StringImpl* uid = m_graph.identifiers()[m_node->identifierNumber()];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes