Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (244577 => 244578)
--- trunk/Source/_javascript_Core/ChangeLog 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/ChangeLog 2019-04-24 01:50:50 UTC (rev 244578)
@@ -1,3 +1,45 @@
+2019-04-23 Yusuke Suzuki <[email protected]>
+
+ [JSC] Use node index as DFG::MinifiedID
+ https://bugs.webkit.org/show_bug.cgi?id=197186
+
+ Reviewed by Saam Barati.
+
+ DFG Nodes can be identified with index if the graph is given. We should use unsigned index as a DFG::MinifiedID's underlying
+ source instead of Node* to reduce the size of VariableEvent from 16 to 12. Vector<VariableEvent> is the main data in DFG's OSR
+ tracking. It is kept after DFG compilation is done to make OSR work. We saw that this is allocated with large size in GMail.
+
+ * _javascript_Core.xcodeproj/project.pbxproj:
+ * bytecode/DataFormat.h:
+ * bytecode/ValueRecovery.h:
+ * dfg/DFGGenerationInfo.h:
+ * dfg/DFGMinifiedID.h:
+ (JSC::DFG::MinifiedID::MinifiedID):
+ (JSC::DFG::MinifiedID::operator! const):
+ (JSC::DFG::MinifiedID::operator== const):
+ (JSC::DFG::MinifiedID::operator!= const):
+ (JSC::DFG::MinifiedID::operator< const):
+ (JSC::DFG::MinifiedID::operator> const):
+ (JSC::DFG::MinifiedID::operator<= const):
+ (JSC::DFG::MinifiedID::operator>= const):
+ (JSC::DFG::MinifiedID::hash const):
+ (JSC::DFG::MinifiedID::dump const):
+ (JSC::DFG::MinifiedID::isHashTableDeletedValue const):
+ (JSC::DFG::MinifiedID::fromBits):
+ (JSC::DFG::MinifiedID::bits const):
+ (JSC::DFG::MinifiedID::invalidIndex):
+ (JSC::DFG::MinifiedID::otherInvalidIndex):
+ (JSC::DFG::MinifiedID::node const): Deleted.
+ (JSC::DFG::MinifiedID::invalidID): Deleted.
+ (JSC::DFG::MinifiedID::otherInvalidID): Deleted.
+ * dfg/DFGMinifiedIDInlines.h: Copied from Source/_javascript_Core/dfg/DFGMinifiedNode.cpp.
+ (JSC::DFG::MinifiedID::MinifiedID):
+ * dfg/DFGMinifiedNode.cpp:
+ * dfg/DFGValueSource.h:
+ (JSC::DFG::ValueSource::ValueSource):
+ * dfg/DFGVariableEvent.h:
+ (JSC::DFG::VariableEvent::dataFormat const):
+
2019-04-23 Keith Rollin <[email protected]>
Add Xcode version check for Header post-processing scripts
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (244577 => 244578)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2019-04-24 01:50:50 UTC (rev 244578)
@@ -1783,6 +1783,7 @@
E35E03601B7AB43E0073AD2A /* InspectorInstrumentationObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E35E035E1B7AB43E0073AD2A /* InspectorInstrumentationObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
E36CC9472086314F0051FFD6 /* WasmCreationMode.h in Headers */ = {isa = PBXBuildFile; fileRef = E36CC9462086314F0051FFD6 /* WasmCreationMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
E3794E761B77EB97005543AE /* ModuleAnalyzer.h in Headers */ = {isa = PBXBuildFile; fileRef = E3794E741B77EB97005543AE /* ModuleAnalyzer.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ E3850B15226ED641009ABF9C /* DFGMinifiedIDInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = E3850B14226ED63E009ABF9C /* DFGMinifiedIDInlines.h */; };
E3893A1D2203A7C600E79A74 /* AsyncFromSyncIteratorPrototype.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = E3893A1C2203A7C600E79A74 /* AsyncFromSyncIteratorPrototype.lut.h */; };
E38D999C221B78BB00D50474 /* JSNonDestructibleProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = E38D999A221B789F00D50474 /* JSNonDestructibleProxy.h */; settings = {ATTRIBUTES = (Private, ); }; };
E39006212208BFC4001019CF /* SubspaceAccess.h in Headers */ = {isa = PBXBuildFile; fileRef = E39006202208BFC3001019CF /* SubspaceAccess.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -4781,6 +4782,7 @@
E3794E741B77EB97005543AE /* ModuleAnalyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModuleAnalyzer.h; sourceTree = "<group>"; };
E380A76B1DCD7195000F89E6 /* MacroAssemblerHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerHelpers.h; sourceTree = "<group>"; };
E380D66B1F19249D00A59095 /* BuiltinNames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BuiltinNames.cpp; sourceTree = "<group>"; };
+ E3850B14226ED63E009ABF9C /* DFGMinifiedIDInlines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DFGMinifiedIDInlines.h; path = dfg/DFGMinifiedIDInlines.h; sourceTree = "<group>"; };
E3893A1C2203A7C600E79A74 /* AsyncFromSyncIteratorPrototype.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncFromSyncIteratorPrototype.lut.h; sourceTree = "<group>"; };
E38D060B1F8E814100649CF2 /* JSScriptFetchParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSScriptFetchParameters.h; sourceTree = "<group>"; };
E38D060C1F8E814100649CF2 /* ScriptFetchParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptFetchParameters.h; sourceTree = "<group>"; };
@@ -6002,9 +6004,9 @@
142D6F0713539A2800B02E86 /* MarkedBlock.h */,
0F7C5FB71D888A010044F5E2 /* MarkedBlockInlines.h */,
141448CA13A176EC00F5BA1A /* MarkedBlockSet.h */,
+ 33B2A54522651D53005A0F79 /* MarkedSpace.cpp */,
14D2F3D9139F4BE200491031 /* MarkedSpace.h */,
0F7DF1301E2970D50095951B /* MarkedSpaceInlines.h */,
- 33B2A54522651D53005A0F79 /* MarkedSpace.cpp */,
0F660E331E0517B70031462C /* MarkingConstraint.cpp */,
0F660E341E0517B70031462C /* MarkingConstraint.h */,
0F660E351E0517B70031462C /* MarkingConstraintSet.cpp */,
@@ -7598,6 +7600,7 @@
0F1725FE1B48719A00AC3A55 /* DFGMinifiedGraph.cpp */,
0F2BDC3D1522801700CD8910 /* DFGMinifiedGraph.h */,
0FB4B51016B3A964003F696B /* DFGMinifiedID.h */,
+ E3850B14226ED63E009ABF9C /* DFGMinifiedIDInlines.h */,
0F2BDC4C1522818300CD8910 /* DFGMinifiedNode.cpp */,
0F2BDC3E1522801700CD8910 /* DFGMinifiedNode.h */,
0F8F14311ADF090100ED792C /* DFGMovHintRemovalPhase.cpp */,
@@ -8521,7 +8524,6 @@
0F2C63BC1E63440C00C13839 /* AirBlockInsertionSet.h in Headers */,
0FB3878E1BFBC44D00E3AB1E /* AirBlockWorklist.h in Headers */,
0F79C7CA1E74C93B00EB34D1 /* AirBreakCriticalEdges.h in Headers */,
- 33B2A54722653481005A0F79 /* B3ValueInlines.h in Headers */,
0F61832A1C45BF070072450B /* AirCCallingConvention.h in Headers */,
0FEC85741BDACDC70080FF74 /* AirCCallSpecial.h in Headers */,
0FF4B4C71E8893C500DBBE86 /* AirCFG.h in Headers */,
@@ -8714,6 +8716,7 @@
0FEC85401BDACDAC0080FF74 /* B3UseCounts.h in Headers */,
0FEC85421BDACDAC0080FF74 /* B3Validate.h in Headers */,
0FEC85441BDACDAC0080FF74 /* B3Value.h in Headers */,
+ 33B2A54722653481005A0F79 /* B3ValueInlines.h in Headers */,
0F338E151BF0276C0013C88F /* B3ValueKey.h in Headers */,
0F338E161BF0276C0013C88F /* B3ValueKeyInlines.h in Headers */,
0FEC85471BDACDAC0080FF74 /* B3ValueRep.h in Headers */,
@@ -8967,6 +8970,7 @@
0F5874EE194FEB1200AAB2C1 /* DFGMayExit.h in Headers */,
0F2BDC451522801B00CD8910 /* DFGMinifiedGraph.h in Headers */,
0F2E892D16D02BAF009E4FD2 /* DFGMinifiedID.h in Headers */,
+ E3850B15226ED641009ABF9C /* DFGMinifiedIDInlines.h in Headers */,
0F2BDC461522802000CD8910 /* DFGMinifiedNode.h in Headers */,
0F8F14361ADF090100ED792C /* DFGMovHintRemovalPhase.h in Headers */,
0FF2CD5C1B61A4F8004955A8 /* DFGMultiGetByOffsetData.h in Headers */,
@@ -10718,6 +10722,7 @@
5333BBDC2110F7D9007618EC /* DFGSpeculativeJIT.cpp in Sources */,
5333BBDB2110F7D2007618EC /* DFGSpeculativeJIT32_64.cpp in Sources */,
5333BBDD2110F7E1007618EC /* DFGSpeculativeJIT64.cpp in Sources */,
+ 33B2A548226543BF005A0F79 /* FTLLowerDFGToB3.cpp in Sources */,
536B319E1F735F160037FC33 /* LowLevelInterpreter.cpp in Sources */,
0FF4274A158EBE91004CB9FF /* udis86.c in Sources */,
0FF42740158EBE8B004CB9FF /* udis86_decode.c in Sources */,
@@ -10851,7 +10856,6 @@
536B310C1F71C5990037FC33 /* UnifiedSource119.cpp in Sources */,
536B31261F71C5990037FC33 /* UnifiedSource120.cpp in Sources */,
536B312D1F71C5990037FC33 /* UnifiedSource121.cpp in Sources */,
- 33B2A548226543BF005A0F79 /* FTLLowerDFGToB3.cpp in Sources */,
536B31251F71C5990037FC33 /* UnifiedSource122.cpp in Sources */,
536B311E1F71C5990037FC33 /* UnifiedSource123.cpp in Sources */,
536B31141F71C5990037FC33 /* UnifiedSource124.cpp in Sources */,
Modified: trunk/Source/_javascript_Core/bytecode/DataFormat.h (244577 => 244578)
--- trunk/Source/_javascript_Core/bytecode/DataFormat.h 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/bytecode/DataFormat.h 2019-04-24 01:50:50 UTC (rev 244578)
@@ -35,7 +35,7 @@
// Values may be unboxed primitives (int32, double, or cell), or boxed as a JSValue.
// For boxed values, we may know the type of boxing that has taken place.
// (May also need bool, array, object, string types!)
-enum DataFormat {
+enum DataFormat : uint8_t {
DataFormatNone = 0,
DataFormatInt32 = 1,
DataFormatInt52 = 2, // Int52's are left-shifted by 12 by default.
Modified: trunk/Source/_javascript_Core/bytecode/ValueRecovery.h (244577 => 244578)
--- trunk/Source/_javascript_Core/bytecode/ValueRecovery.h 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/bytecode/ValueRecovery.h 2019-04-24 01:50:50 UTC (rev 244578)
@@ -419,7 +419,7 @@
#endif
int virtualReg;
EncodedJSValue constant;
- uintptr_t nodeID;
+ unsigned nodeID;
} m_source;
};
Modified: trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h (244577 => 244578)
--- trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h 2019-04-24 01:50:50 UTC (rev 244578)
@@ -27,7 +27,7 @@
#if ENABLE(DFG_JIT)
-#include "DFGMinifiedID.h"
+#include "DFGMinifiedIDInlines.h"
#include "DFGVariableEvent.h"
#include "DFGVariableEventStream.h"
#include "DataFormat.h"
Modified: trunk/Source/_javascript_Core/dfg/DFGMinifiedID.h (244577 => 244578)
--- trunk/Source/_javascript_Core/dfg/DFGMinifiedID.h 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/dfg/DFGMinifiedID.h 2019-04-24 01:50:50 UTC (rev 244578)
@@ -38,46 +38,41 @@
class MinifiedID {
public:
- MinifiedID() : m_id(invalidID()) { }
- MinifiedID(WTF::HashTableDeletedValueType) : m_id(otherInvalidID()) { }
- explicit MinifiedID(Node* node) : m_id(bitwise_cast<uintptr_t>(node)) { }
+ MinifiedID() = default;
+ MinifiedID(WTF::HashTableDeletedValueType) : m_index(otherInvalidIndex()) { }
+ explicit MinifiedID(Node* node);
- bool operator!() const { return m_id == invalidID(); }
+ bool operator!() const { return m_index == invalidIndex(); }
- // This takes Graph& to remind you, that you should only be calling this method
- // when you're in the main compilation pass (i.e. you have a graph) and not later,
- // like during OSR exit compilation.
- Node* node(const Graph&) const { return bitwise_cast<Node*>(m_id); }
+ bool operator==(const MinifiedID& other) const { return m_index == other.m_index; }
+ bool operator!=(const MinifiedID& other) const { return m_index != other.m_index; }
+ bool operator<(const MinifiedID& other) const { return m_index < other.m_index; }
+ bool operator>(const MinifiedID& other) const { return m_index > other.m_index; }
+ bool operator<=(const MinifiedID& other) const { return m_index <= other.m_index; }
+ bool operator>=(const MinifiedID& other) const { return m_index >= other.m_index; }
- bool operator==(const MinifiedID& other) const { return m_id == other.m_id; }
- bool operator!=(const MinifiedID& other) const { return m_id != other.m_id; }
- bool operator<(const MinifiedID& other) const { return m_id < other.m_id; }
- bool operator>(const MinifiedID& other) const { return m_id > other.m_id; }
- bool operator<=(const MinifiedID& other) const { return m_id <= other.m_id; }
- bool operator>=(const MinifiedID& other) const { return m_id >= other.m_id; }
+ unsigned hash() const { return WTF::IntHash<unsigned>::hash(m_index); }
- unsigned hash() const { return WTF::IntHash<uintptr_t>::hash(m_id); }
+ void dump(PrintStream& out) const { out.print(m_index); }
- void dump(PrintStream& out) const { out.print(RawPointer(reinterpret_cast<void*>(m_id))); }
+ bool isHashTableDeletedValue() const { return m_index == otherInvalidIndex(); }
- bool isHashTableDeletedValue() const { return m_id == otherInvalidID(); }
-
- static MinifiedID fromBits(uintptr_t value)
+ static MinifiedID fromBits(unsigned value)
{
MinifiedID result;
- result.m_id = value;
+ result.m_index = value;
return result;
}
- uintptr_t bits() const { return m_id; }
+ unsigned bits() const { return m_index; }
private:
friend class MinifiedNode;
- static uintptr_t invalidID() { return static_cast<uintptr_t>(static_cast<intptr_t>(-1)); }
- static uintptr_t otherInvalidID() { return static_cast<uintptr_t>(static_cast<intptr_t>(-2)); }
+ static constexpr unsigned invalidIndex() { return static_cast<unsigned>(-1); }
+ static constexpr unsigned otherInvalidIndex() { return static_cast<unsigned>(-2); }
- uintptr_t m_id;
+ unsigned m_index { invalidIndex() };
};
struct MinifiedIDHash {
Copied: trunk/Source/_javascript_Core/dfg/DFGMinifiedIDInlines.h (from rev 244577, trunk/Source/_javascript_Core/dfg/DFGMinifiedNode.cpp) (0 => 244578)
--- trunk/Source/_javascript_Core/dfg/DFGMinifiedIDInlines.h (rev 0)
+++ trunk/Source/_javascript_Core/dfg/DFGMinifiedIDInlines.h 2019-04-24 01:50:50 UTC (rev 244578)
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "DFGMinifiedID.h"
+
+#include "DFGNode.h"
+
+namespace JSC {
+namespace DFG {
+
+inline MinifiedID::MinifiedID(Node* node)
+ : m_index(node->index())
+{
+ RELEASE_ASSERT(m_index != invalidIndex() && m_index != otherInvalidIndex());
+}
+
+} } // namespace JSC::DFG
Modified: trunk/Source/_javascript_Core/dfg/DFGMinifiedNode.cpp (244577 => 244578)
--- trunk/Source/_javascript_Core/dfg/DFGMinifiedNode.cpp 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/dfg/DFGMinifiedNode.cpp 2019-04-24 01:50:50 UTC (rev 244578)
@@ -28,6 +28,7 @@
#if ENABLE(DFG_JIT)
+#include "DFGMinifiedIDInlines.h"
#include "DFGNode.h"
#include "JSCInlines.h"
Modified: trunk/Source/_javascript_Core/dfg/DFGValueSource.h (244577 => 244578)
--- trunk/Source/_javascript_Core/dfg/DFGValueSource.h 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/dfg/DFGValueSource.h 2019-04-24 01:50:50 UTC (rev 244578)
@@ -125,7 +125,7 @@
ValueSource(ValueSourceKind valueSourceKind, VirtualRegister where)
: m_kind(valueSourceKind)
- , m_value(static_cast<intptr_t>(where.offset()))
+ , m_value(where.offset())
{
ASSERT(kind() != SourceNotSet);
ASSERT(kind() != HaveNode);
@@ -208,7 +208,7 @@
private:
ValueSourceKind m_kind;
- uintptr_t m_value;
+ unsigned m_value;
};
} } // namespace JSC::DFG
Modified: trunk/Source/_javascript_Core/dfg/DFGVariableEvent.h (244577 => 244578)
--- trunk/Source/_javascript_Core/dfg/DFGVariableEvent.h 2019-04-24 01:28:49 UTC (rev 244577)
+++ trunk/Source/_javascript_Core/dfg/DFGVariableEvent.h 2019-04-24 01:50:50 UTC (rev 244578)
@@ -198,7 +198,7 @@
ASSERT(
m_kind == BirthToFill || m_kind == Fill || m_kind == BirthToSpill || m_kind == Spill
|| m_kind == SetLocalEvent);
- return static_cast<DataFormat>(m_dataFormat);
+ return m_dataFormat;
}
MacroAssembler::RegisterID gpr() const
@@ -262,7 +262,7 @@
union {
int virtualReg;
- uintptr_t id;
+ unsigned id;
} m_which;
// For BirthToFill, Fill:
@@ -276,7 +276,7 @@
VariableRepresentation m_representation;
int8_t m_kind;
- int8_t m_dataFormat;
+ DataFormat m_dataFormat { DataFormatNone };
};
} } // namespace JSC::DFG