[JSC] Optimize padding of UnlinkedCodeBlock to shrink
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 8 Jul 2018 17:39:55 +0000 (17:39 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 8 Jul 2018 17:39:55 +0000 (17:39 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187448

Reviewed by Saam Barati.

Source/JavaScriptCore:

We optimize the size of CodeType and TriState. And we arrange the layout of UnlinkedCodeBlock.
These optimizations reduce the size of UnlinkedCodeBlock from 304 to 288.

* bytecode/CodeType.h:
* bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
* bytecode/UnlinkedCodeBlock.h:
(JSC::UnlinkedCodeBlock::codeType const):
(JSC::UnlinkedCodeBlock::didOptimize const):
(JSC::UnlinkedCodeBlock::setDidOptimize):
* bytecode/VirtualRegister.h:

Source/WTF:

* wtf/TriState.h:

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/CodeType.h
Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp
Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h
Source/JavaScriptCore/bytecode/VirtualRegister.h
Source/WTF/ChangeLog
Source/WTF/wtf/TriState.h

index 6543774..ca8a0df 100644 (file)
@@ -1,5 +1,24 @@
 2018-07-08  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        [JSC] Optimize padding of UnlinkedCodeBlock to shrink
+        https://bugs.webkit.org/show_bug.cgi?id=187448
+
+        Reviewed by Saam Barati.
+
+        We optimize the size of CodeType and TriState. And we arrange the layout of UnlinkedCodeBlock.
+        These optimizations reduce the size of UnlinkedCodeBlock from 304 to 288.
+
+        * bytecode/CodeType.h:
+        * bytecode/UnlinkedCodeBlock.cpp:
+        (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
+        * bytecode/UnlinkedCodeBlock.h:
+        (JSC::UnlinkedCodeBlock::codeType const):
+        (JSC::UnlinkedCodeBlock::didOptimize const):
+        (JSC::UnlinkedCodeBlock::setDidOptimize):
+        * bytecode/VirtualRegister.h:
+
+2018-07-08  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         [JSC] Optimize padding of InferredTypeTable by using cellLock
         https://bugs.webkit.org/show_bug.cgi?id=187447
 
index 3c38ca2..84a58ce 100644 (file)
 
 namespace JSC {
 
-enum CodeType { GlobalCode, EvalCode, FunctionCode, ModuleCode };
+// CodeType should be within 2 bits (0b00 - 0b11).
+enum CodeType : uint8_t {
+    GlobalCode,
+    EvalCode,
+    FunctionCode,
+    ModuleCode
+};
 
 } // namespace JSC
 
index 30ee664..1a0bb44 100644 (file)
@@ -57,7 +57,6 @@ UnlinkedCodeBlock::UnlinkedCodeBlock(VM* vm, Structure* structure, CodeType code
     , m_numVars(0)
     , m_numCalleeLocals(0)
     , m_numParameters(0)
-    , m_globalObjectRegister(VirtualRegister())
     , m_usesEval(info.usesEval())
     , m_isStrictMode(info.isStrictMode())
     , m_isConstructor(info.isConstructor())
@@ -72,12 +71,12 @@ UnlinkedCodeBlock::UnlinkedCodeBlock(VM* vm, Structure* structure, CodeType code
     , m_derivedContextType(static_cast<unsigned>(info.derivedContextType()))
     , m_evalContextType(static_cast<unsigned>(info.evalContextType()))
     , m_hasTailCalls(false)
+    , m_codeType(codeType)
+    , m_didOptimize(MixedTriState)
     , m_lineCount(0)
     , m_endColumn(UINT_MAX)
-    , m_didOptimize(MixedTriState)
     , m_parseMode(info.parseMode())
     , m_features(0)
-    , m_codeType(codeType)
     , m_arrayProfileCount(0)
     , m_arrayAllocationProfileCount(0)
     , m_objectAllocationProfileCount(0)
@@ -86,6 +85,8 @@ UnlinkedCodeBlock::UnlinkedCodeBlock(VM* vm, Structure* structure, CodeType code
 {
     for (auto& constantRegisterIndex : m_linkTimeConstants)
         constantRegisterIndex = 0;
+    ASSERT(codeType == this->codeType());
+    ASSERT(MixedTriState == this->didOptimize());
     ASSERT(m_constructorKind == static_cast<unsigned>(info.constructorKind()));
 }
 
index 5ae594b..e32d9a2 100644 (file)
@@ -319,7 +319,7 @@ public:
     UnlinkedLLIntCallLinkInfo addLLIntCallLinkInfo() { return m_llintCallLinkInfoCount++; }
     unsigned numberOfLLintCallLinkInfos() { return m_llintCallLinkInfoCount; }
 
-    CodeType codeType() const { return m_codeType; }
+    CodeType codeType() const { return static_cast<CodeType>(m_codeType); }
 
     VirtualRegister thisRegister() const { return m_thisRegister; }
     VirtualRegister scopeRegister() const { return m_scopeRegister; }
@@ -380,8 +380,12 @@ public:
 
     bool wasCompiledWithDebuggingOpcodes() const { return m_wasCompiledWithDebuggingOpcodes; }
 
-    TriState didOptimize() const { return m_didOptimize; }
-    void setDidOptimize(TriState didOptimize) { m_didOptimize = didOptimize; }
+    TriState didOptimize() const { return static_cast<TriState>(m_didOptimize); }
+    void setDidOptimize(TriState didOptimize)
+    {
+        m_didOptimize = static_cast<unsigned>(didOptimize);
+        ASSERT(didOptimize == this->didOptimize());
+    }
 
     void dump(PrintStream&) const;
 
@@ -436,10 +440,6 @@ private:
     std::unique_ptr<UnlinkedInstructionStream> m_unlinkedInstructions;
     std::unique_ptr<BytecodeLivenessAnalysis> m_liveness;
 
-    VirtualRegister m_thisRegister;
-    VirtualRegister m_scopeRegister;
-    VirtualRegister m_globalObjectRegister;
-
     String m_sourceURLDirective;
     String m_sourceMappingURLDirective;
 
@@ -461,16 +461,21 @@ private:
     unsigned m_derivedContextType : 2;
     unsigned m_evalContextType : 2;
     unsigned m_hasTailCalls : 1;
+    unsigned m_codeType : 2; // CodeType
+    unsigned m_didOptimize : 2; // TriState
     unsigned m_lineCount;
     unsigned m_endColumn;
 
+    VirtualRegister m_thisRegister;
+    VirtualRegister m_scopeRegister;
+    VirtualRegister m_globalObjectRegister;
+
+    SourceParseMode m_parseMode;
+
 public:
     ConcurrentJSLock m_lock;
 private:
-    TriState m_didOptimize;
-    SourceParseMode m_parseMode;
     CodeFeatures m_features;
-    CodeType m_codeType;
 
     Vector<unsigned> m_jumpTargets;
 
index f32e8d2..d38bd10 100644 (file)
@@ -47,9 +47,7 @@ public:
     friend VirtualRegister virtualRegisterForLocal(int);
     friend VirtualRegister virtualRegisterForArgument(int, int);
 
-    VirtualRegister()
-        : m_virtualRegister(s_invalidVirtualRegister)
-    { }
+    VirtualRegister() = default;
 
     explicit VirtualRegister(int virtualRegister)
         : m_virtualRegister(virtualRegister)
@@ -109,7 +107,7 @@ private:
     static int operandToArgument(int operand) { return operand - CallFrame::thisArgumentOffset(); }
     static int argumentToOperand(int argument) { return argument + CallFrame::thisArgumentOffset(); }
 
-    int m_virtualRegister;
+    int m_virtualRegister { s_invalidVirtualRegister };
 };
 
 COMPILE_ASSERT(sizeof(VirtualRegister) == sizeof(int), VirtualRegister_is_32bit);
index 2644468..50034eb 100644 (file)
@@ -1,3 +1,12 @@
+2018-07-08  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [JSC] Optimize padding of UnlinkedCodeBlock to shrink
+        https://bugs.webkit.org/show_bug.cgi?id=187448
+
+        Reviewed by Saam Barati.
+
+        * wtf/TriState.h:
+
 2018-07-07  David Kilzer  <ddkilzer@apple.com>
 
         iOS port should define HAVE_RUNLOOP_TIMER
index 93a496f..315514d 100644 (file)
@@ -28,7 +28,8 @@
 
 namespace WTF {
 
-enum TriState {
+// TriState should be within 2 bits (0b00 - 0b10).
+enum TriState : uint8_t {
     FalseTriState,
     TrueTriState,
     MixedTriState