Title: [89058] trunk/Source/_javascript_Core
- Revision
- 89058
- Author
- oli...@apple.com
- Date
- 2011-06-16 12:30:57 -0700 (Thu, 16 Jun 2011)
Log Message
2011-06-15 Oliver Hunt <oli...@apple.com>
Reviewed by Geoffrey Garen.
Reduce memory usage of resolve_global
https://bugs.webkit.org/show_bug.cgi?id=62765
If we have a large number of resolve_globals in a single
block start planting plain resolve instructions instead
whenever we aren't in a loop. This allows us to reduce
the code size for extremely large functions without
losing the performance benefits of op_resolve_global.
* bytecode/CodeBlock.h:
(JSC::CodeBlock::globalResolveInfoCount):
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::shouldAvoidResolveGlobal):
(JSC::BytecodeGenerator::emitResolve):
(JSC::BytecodeGenerator::emitResolveWithBase):
* bytecompiler/BytecodeGenerator.h:
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (89057 => 89058)
--- trunk/Source/_javascript_Core/ChangeLog 2011-06-16 19:14:29 UTC (rev 89057)
+++ trunk/Source/_javascript_Core/ChangeLog 2011-06-16 19:30:57 UTC (rev 89058)
@@ -1,3 +1,24 @@
+2011-06-15 Oliver Hunt <oli...@apple.com>
+
+ Reviewed by Geoffrey Garen.
+
+ Reduce memory usage of resolve_global
+ https://bugs.webkit.org/show_bug.cgi?id=62765
+
+ If we have a large number of resolve_globals in a single
+ block start planting plain resolve instructions instead
+ whenever we aren't in a loop. This allows us to reduce
+ the code size for extremely large functions without
+ losing the performance benefits of op_resolve_global.
+
+ * bytecode/CodeBlock.h:
+ (JSC::CodeBlock::globalResolveInfoCount):
+ * bytecompiler/BytecodeGenerator.cpp:
+ (JSC::BytecodeGenerator::shouldAvoidResolveGlobal):
+ (JSC::BytecodeGenerator::emitResolve):
+ (JSC::BytecodeGenerator::emitResolveWithBase):
+ * bytecompiler/BytecodeGenerator.h:
+
2011-06-16 Qi Zhang <qi.2.zh...@nokia.com>
Reviewed by Laszlo Gombos.
Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.h (89057 => 89058)
--- trunk/Source/_javascript_Core/bytecode/CodeBlock.h 2011-06-16 19:14:29 UTC (rev 89057)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.h 2011-06-16 19:30:57 UTC (rev 89058)
@@ -372,6 +372,14 @@
void addMethodCallLinkInfos(unsigned n) { m_methodCallLinkInfos.grow(n); }
MethodCallLinkInfo& methodCallLinkInfo(int index) { return m_methodCallLinkInfos[index]; }
#endif
+ unsigned globalResolveInfoCount() const
+ {
+#if ENABLE(JIT)
+ if (m_globalData->canUseJIT())
+ return m_globalResolveInfos.size();
+#endif
+ return 0;
+ }
// Exception handling support
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp (89057 => 89058)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2011-06-16 19:14:29 UTC (rev 89057)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2011-06-16 19:30:57 UTC (rev 89058)
@@ -1201,6 +1201,13 @@
return dst;
}
+static const unsigned maxGlobalResolves = 128;
+
+bool BytecodeGenerator::shouldAvoidResolveGlobal()
+{
+ return m_codeBlock->globalResolveInfoCount() > maxGlobalResolves && !m_labelScopes.size();
+}
+
RegisterID* BytecodeGenerator::emitResolve(RegisterID* dst, const Identifier& property)
{
size_t depth = 0;
@@ -1214,7 +1221,11 @@
instructions().append(addConstant(property));
return dst;
}
-
+ if (shouldAvoidResolveGlobal()) {
+ globalObject = 0;
+ requiresDynamicChecks = true;
+ }
+
if (globalObject) {
bool forceGlobalResolve = false;
@@ -1363,7 +1374,12 @@
emitGetScopedVar(propDst, depth, index, globalObject);
return baseDst;
}
-
+ if (shouldAvoidResolveGlobal()) {
+ emitOpcode(op_resolve);
+ instructions().append(propDst->index());
+ instructions().append(addConstant(property));
+ return baseDst;
+ }
#if ENABLE(JIT)
m_codeBlock->addGlobalResolveInfo(instructions().size());
#endif
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h (89057 => 89058)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2011-06-16 19:14:29 UTC (rev 89057)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2011-06-16 19:30:57 UTC (rev 89058)
@@ -459,6 +459,7 @@
void addParameter(const Identifier&, int parameterIndex);
void preserveLastVar();
+ bool shouldAvoidResolveGlobal();
RegisterID& registerFor(int index)
{
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes