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

Reply via email to