Don't use inferred types when the JIT is disabled
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 May 2018 16:08:42 +0000 (16:08 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 May 2018 16:08:42 +0000 (16:08 +0000)
https://bugs.webkit.org/show_bug.cgi?id=185539

Reviewed by Yusuke Suzuki.

There are many JSC API clients that run with the JIT disabled. They were
all allocating and tracking inferred types for no benefit. Inferred types
only benefit programs when they make it to the DFG/FTL. I was seeing cases
where the inferred type machinery used ~0.5MB. This patch makes is so we
don't allocate that machinery when the JIT is disabled.

* runtime/Structure.cpp:
(JSC::Structure::willStoreValueSlow):
* runtime/Structure.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@231703 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/Structure.cpp
Source/JavaScriptCore/runtime/Structure.h

index 62ef911..041575e 100644 (file)
@@ -1,5 +1,22 @@
 2018-05-11  Saam Barati  <sbarati@apple.com>
 
+        Don't use inferred types when the JIT is disabled
+        https://bugs.webkit.org/show_bug.cgi?id=185539
+
+        Reviewed by Yusuke Suzuki.
+
+        There are many JSC API clients that run with the JIT disabled. They were
+        all allocating and tracking inferred types for no benefit. Inferred types
+        only benefit programs when they make it to the DFG/FTL. I was seeing cases
+        where the inferred type machinery used ~0.5MB. This patch makes is so we
+        don't allocate that machinery when the JIT is disabled.
+
+        * runtime/Structure.cpp:
+        (JSC::Structure::willStoreValueSlow):
+        * runtime/Structure.h:
+
+2018-05-11  Saam Barati  <sbarati@apple.com>
+
         Don't allocate value profiles when the JIT is disabled
         https://bugs.webkit.org/show_bug.cgi?id=185525
 
index c490934..ee3f65f 100644 (file)
@@ -895,6 +895,8 @@ void Structure::willStoreValueSlow(
     ASSERT(structure()->classInfo() == info());
     ASSERT(!hasBeenDictionary());
 
+    ASSERT_WITH_MESSAGE(VM::canUseJIT(), "We don't want to use memory for inferred types unless we're using the JIT.");
+
     // Create the inferred type table before doing anything else, so that we don't GC after we have already
     // grabbed a pointer into the property map.
     InferredTypeTable* table = m_inferredTypeTable.get();
index 4549c0e..7e5e0fc 100644 (file)
@@ -608,7 +608,7 @@ public:
     ALWAYS_INLINE void willStoreValueForNewTransition(
         VM& vm, PropertyName propertyName, JSValue value, bool shouldOptimize)
     {
-        if (hasBeenDictionary() || (!shouldOptimize && !m_inferredTypeTable))
+        if (hasBeenDictionary() || (!shouldOptimize && !m_inferredTypeTable) || !VM::canUseJIT())
             return;
         willStoreValueSlow(vm, propertyName, value, shouldOptimize, InferredTypeTable::NewProperty);
     }
@@ -619,7 +619,7 @@ public:
     ALWAYS_INLINE void willStoreValueForExistingTransition(
         VM& vm, PropertyName propertyName, JSValue value, bool shouldOptimize)
     {
-        if (hasBeenDictionary() || !m_inferredTypeTable)
+        if (hasBeenDictionary() || !m_inferredTypeTable || !VM::canUseJIT())
             return;
         willStoreValueSlow(vm, propertyName, value, shouldOptimize, InferredTypeTable::NewProperty);
     }
@@ -628,7 +628,7 @@ public:
     ALWAYS_INLINE void willStoreValueForReplace(
         VM& vm, PropertyName propertyName, JSValue value, bool shouldOptimize)
     {
-        if (hasBeenDictionary())
+        if (hasBeenDictionary() || !VM::canUseJIT())
             return;
         willStoreValueSlow(vm, propertyName, value, shouldOptimize, InferredTypeTable::OldProperty);
     }