Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (245238 => 245239)
--- trunk/Source/_javascript_Core/ChangeLog 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/ChangeLog 2019-05-13 17:32:31 UTC (rev 245239)
@@ -1,3 +1,105 @@
+2019-05-13 Yusuke Suzuki <ysuz...@apple.com>
+
+ [JSC] Compress miscelaneous JIT related data structures with Packed<>
+ https://bugs.webkit.org/show_bug.cgi?id=197830
+
+ Reviewed by Saam Barati.
+
+ This patch leverages Packed<> to compress miscelaneous data structures related to JIT.
+
+ 1. JIT IC data structures
+
+ 2. ValueRecovery
+
+ We use Packed<> for EncodedJSValue in ValueRecovery. This means that conservative GC cannot find
+ these values. But this is OK anyway since ValueRecovery's constant should be already registered
+ in DFG graph. From 16 (alignment 8) to 9 (alignment 1).
+
+ 3. FTL::ExitValue
+
+ We use Packed<> for EncodedJSValue in FTL::ExitValue. This is also OK since this constant should
+ be already registered by DFG/FTL graph. From 16 (alignment 8) to 9 (alignment 1).
+
+ * assembler/CodeLocation.h:
+ * bytecode/ByValInfo.h:
+ * bytecode/CallLinkInfo.cpp:
+ (JSC::CallLinkInfo::CallLinkInfo):
+ (JSC::CallLinkInfo::callReturnLocation):
+ * bytecode/CallLinkInfo.h:
+ (JSC::CallLinkInfo::nearCallMode const):
+ * bytecode/CodeBlock.cpp:
+ (JSC::CodeBlock::addJITAddIC):
+ (JSC::CodeBlock::addJITMulIC):
+ (JSC::CodeBlock::addJITSubIC):
+ (JSC::CodeBlock::addJITNegIC):
+ * bytecode/CodeBlock.h:
+ (JSC::CodeBlock::addMathIC):
+ * bytecode/InlineCallFrame.h:
+ (JSC::InlineCallFrame::InlineCallFrame):
+ * bytecode/ValueRecovery.h:
+ (JSC::ValueRecovery::inGPR):
+ (JSC::ValueRecovery::inPair):
+ (JSC::ValueRecovery::inFPR):
+ (JSC::ValueRecovery::displacedInJSStack):
+ (JSC::ValueRecovery::constant):
+ (JSC::ValueRecovery::directArgumentsThatWereNotCreated):
+ (JSC::ValueRecovery::clonedArgumentsThatWereNotCreated):
+ (JSC::ValueRecovery::gpr const):
+ (JSC::ValueRecovery::tagGPR const):
+ (JSC::ValueRecovery::payloadGPR const):
+ (JSC::ValueRecovery::fpr const):
+ (JSC::ValueRecovery::virtualRegister const):
+ (JSC::ValueRecovery::withLocalsOffset const):
+ (JSC::ValueRecovery::constant const):
+ (JSC::ValueRecovery::nodeID const):
+ * dfg/DFGSpeculativeJIT.cpp:
+ (JSC::DFG::SpeculativeJIT::compileValueAdd):
+ (JSC::DFG::SpeculativeJIT::compileValueSub):
+ (JSC::DFG::SpeculativeJIT::compileValueNegate):
+ (JSC::DFG::SpeculativeJIT::compileValueMul):
+ * ftl/FTLExitValue.cpp:
+ (JSC::FTL::ExitValue::materializeNewObject):
+ * ftl/FTLExitValue.h:
+ (JSC::FTL::ExitValue::inJSStack):
+ (JSC::FTL::ExitValue::inJSStackAsInt32):
+ (JSC::FTL::ExitValue::inJSStackAsInt52):
+ (JSC::FTL::ExitValue::inJSStackAsDouble):
+ (JSC::FTL::ExitValue::constant):
+ (JSC::FTL::ExitValue::exitArgument):
+ (JSC::FTL::ExitValue::exitArgument const):
+ (JSC::FTL::ExitValue::adjustStackmapLocationsIndexByOffset):
+ (JSC::FTL::ExitValue::constant const):
+ (JSC::FTL::ExitValue::virtualRegister const):
+ (JSC::FTL::ExitValue::objectMaterialization const):
+ (JSC::FTL::ExitValue::withVirtualRegister const):
+ * ftl/FTLLowerDFGToB3.cpp:
+ (JSC::FTL::DFG::LowerDFGToB3::compileValueAdd):
+ (JSC::FTL::DFG::LowerDFGToB3::compileValueSub):
+ (JSC::FTL::DFG::LowerDFGToB3::compileValueMul):
+ (JSC::FTL::DFG::LowerDFGToB3::compileUnaryMathIC):
+ (JSC::FTL::DFG::LowerDFGToB3::compileBinaryMathIC):
+ (JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub):
+ (JSC::FTL::DFG::LowerDFGToB3::compileValueNegate):
+ * jit/CachedRecovery.h:
+ * jit/CallFrameShuffleData.h:
+ * jit/JITArithmetic.cpp:
+ (JSC::JIT::emit_op_negate):
+ (JSC::JIT::emit_op_add):
+ (JSC::JIT::emit_op_mul):
+ (JSC::JIT::emit_op_sub):
+ * jit/JITMathIC.h:
+ (JSC::isProfileEmpty):
+ (JSC::JITBinaryMathIC::JITBinaryMathIC):
+ (JSC::JITUnaryMathIC::JITUnaryMathIC):
+ * jit/PolymorphicCallStubRoutine.h:
+ (JSC::PolymorphicCallNode::hasCallLinkInfo):
+ * jit/SnippetOperand.h:
+ (JSC::SnippetOperand::asRawBits const):
+ (JSC::SnippetOperand::asConstInt32 const):
+ (JSC::SnippetOperand::asConstDouble const):
+ (JSC::SnippetOperand::setConstInt32):
+ (JSC::SnippetOperand::setConstDouble):
+
2019-05-12 Yusuke Suzuki <ysuz...@apple.com>
[JSC] Compress Watchpoint size by using enum type and Packed<> data structure
Modified: trunk/Source/_javascript_Core/assembler/CodeLocation.h (245238 => 245239)
--- trunk/Source/_javascript_Core/assembler/CodeLocation.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/assembler/CodeLocation.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -31,7 +31,7 @@
namespace JSC {
-enum NearCallMode { Regular, Tail };
+enum class NearCallMode : uint8_t { Regular, Tail };
template<PtrTag> class CodeLocationInstruction;
template<PtrTag> class CodeLocationLabel;
@@ -153,7 +153,7 @@
: CodeLocationCommon<tag>(MacroAssemblerCodePtr<tag>(location)), m_callMode(callMode) { }
NearCallMode callMode() { return m_callMode; }
private:
- NearCallMode m_callMode = NearCallMode::Regular;
+ NearCallMode m_callMode { NearCallMode::Regular };
};
template<PtrTag tag>
Modified: trunk/Source/_javascript_Core/bytecode/ByValInfo.h (245238 => 245239)
--- trunk/Source/_javascript_Core/bytecode/ByValInfo.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/bytecode/ByValInfo.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -39,7 +39,7 @@
class StructureStubInfo;
-enum JITArrayMode {
+enum JITArrayMode : uint8_t {
JITInt32,
JITDouble,
JITContiguous,
Modified: trunk/Source/_javascript_Core/bytecode/CallLinkInfo.cpp (245238 => 245239)
--- trunk/Source/_javascript_Core/bytecode/CallLinkInfo.cpp 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/bytecode/CallLinkInfo.cpp 2019-05-13 17:32:31 UTC (rev 245239)
@@ -63,8 +63,6 @@
, m_clearedByJettison(false)
, m_callType(None)
, m_calleeGPR(255)
- , m_maxNumArguments(0)
- , m_slowPathCount(0)
{
}
@@ -100,7 +98,7 @@
CodeLocationNearCall<JSInternalPtrTag> CallLinkInfo::callReturnLocation()
{
RELEASE_ASSERT(!isDirect());
- return CodeLocationNearCall<JSInternalPtrTag>(m_callReturnLocationOrPatchableJump, Regular);
+ return CodeLocationNearCall<JSInternalPtrTag>(m_callReturnLocationOrPatchableJump, NearCallMode::Regular);
}
CodeLocationJump<JSInternalPtrTag> CallLinkInfo::patchableJump()
Modified: trunk/Source/_javascript_Core/bytecode/CallLinkInfo.h (245238 => 245239)
--- trunk/Source/_javascript_Core/bytecode/CallLinkInfo.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/bytecode/CallLinkInfo.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -41,7 +41,7 @@
enum OpcodeID : unsigned;
struct CallFrameShuffleData;
-class CallLinkInfo : public BasicRawSentinelNode<CallLinkInfo> {
+class CallLinkInfo : public PackedRawSentinelNode<CallLinkInfo> {
public:
enum CallType {
None,
@@ -146,7 +146,7 @@
NearCallMode nearCallMode() const
{
- return isTailCall() ? Tail : Regular;
+ return isTailCall() ? NearCallMode::Tail : NearCallMode::Regular;
}
bool isVarargs() const
@@ -347,6 +347,7 @@
}
private:
+ uint32_t m_maxNumArguments { 0 }; // For varargs: the profiled maximum number of arguments. For direct: the number of stack slots allocated for arguments.
CodeLocationLabel<JSInternalPtrTag> m_callReturnLocationOrPatchableJump;
CodeLocationLabel<JSInternalPtrTag> m_hotPathBeginOrSlowPathStart;
CodeLocationNearCall<JSInternalPtrTag> m_hotPathOther;
@@ -355,6 +356,7 @@
RefPtr<PolymorphicCallStubRoutine> m_stub;
RefPtr<JITStubRoutine> m_slowStub;
std::unique_ptr<CallFrameShuffleData> m_frameShuffleData;
+ CodeOrigin m_codeOrigin;
bool m_hasSeenShouldRepatch : 1;
bool m_hasSeenClosure : 1;
bool m_clearedByGC : 1;
@@ -363,9 +365,7 @@
bool m_clearedByJettison : 1;
unsigned m_callType : 4; // CallType
unsigned m_calleeGPR : 8;
- uint32_t m_maxNumArguments; // For varargs: the profiled maximum number of arguments. For direct: the number of stack slots allocated for arguments.
- uint32_t m_slowPathCount;
- CodeOrigin m_codeOrigin;
+ uint32_t m_slowPathCount { 0 };
};
inline CodeOrigin getCallLinkInfoCodeOrigin(CallLinkInfo& callLinkInfo)
Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp (245238 => 245239)
--- trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp 2019-05-13 17:32:31 UTC (rev 245239)
@@ -1427,28 +1427,28 @@
return ensureJITData(locker).m_stubInfos.add(accessType);
}
-JITAddIC* CodeBlock::addJITAddIC(ArithProfile* arithProfile, const Instruction* instruction)
+JITAddIC* CodeBlock::addJITAddIC(ArithProfile* arithProfile)
{
ConcurrentJSLocker locker(m_lock);
- return ensureJITData(locker).m_addICs.add(arithProfile, instruction);
+ return ensureJITData(locker).m_addICs.add(arithProfile);
}
-JITMulIC* CodeBlock::addJITMulIC(ArithProfile* arithProfile, const Instruction* instruction)
+JITMulIC* CodeBlock::addJITMulIC(ArithProfile* arithProfile)
{
ConcurrentJSLocker locker(m_lock);
- return ensureJITData(locker).m_mulICs.add(arithProfile, instruction);
+ return ensureJITData(locker).m_mulICs.add(arithProfile);
}
-JITSubIC* CodeBlock::addJITSubIC(ArithProfile* arithProfile, const Instruction* instruction)
+JITSubIC* CodeBlock::addJITSubIC(ArithProfile* arithProfile)
{
ConcurrentJSLocker locker(m_lock);
- return ensureJITData(locker).m_subICs.add(arithProfile, instruction);
+ return ensureJITData(locker).m_subICs.add(arithProfile);
}
-JITNegIC* CodeBlock::addJITNegIC(ArithProfile* arithProfile, const Instruction* instruction)
+JITNegIC* CodeBlock::addJITNegIC(ArithProfile* arithProfile)
{
ConcurrentJSLocker locker(m_lock);
- return ensureJITData(locker).m_negICs.add(arithProfile, instruction);
+ return ensureJITData(locker).m_negICs.add(arithProfile);
}
StructureStubInfo* CodeBlock::findStubInfo(CodeOrigin codeOrigin)
Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.h (245238 => 245239)
--- trunk/Source/_javascript_Core/bytecode/CodeBlock.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -261,8 +261,8 @@
Bag<JITSubIC> m_subICs;
Bag<ByValInfo> m_byValInfos;
Bag<CallLinkInfo> m_callLinkInfos;
- SentinelLinkedList<CallLinkInfo, BasicRawSentinelNode<CallLinkInfo>> m_incomingCalls;
- SentinelLinkedList<PolymorphicCallNode, BasicRawSentinelNode<PolymorphicCallNode>> m_incomingPolymorphicCalls;
+ SentinelLinkedList<CallLinkInfo, PackedRawSentinelNode<CallLinkInfo>> m_incomingCalls;
+ SentinelLinkedList<PolymorphicCallNode, PackedRawSentinelNode<PolymorphicCallNode>> m_incomingPolymorphicCalls;
SegmentedVector<RareCaseProfile, 8> m_rareCaseProfiles;
std::unique_ptr<PCToCodeOriginMap> m_pcToCodeOriginMap;
std::unique_ptr<RegisterAtOffsetList> m_calleeSaveRegisters;
@@ -277,22 +277,22 @@
}
JITData& ensureJITDataSlow(const ConcurrentJSLocker&);
- JITAddIC* addJITAddIC(ArithProfile*, const Instruction*);
- JITMulIC* addJITMulIC(ArithProfile*, const Instruction*);
- JITNegIC* addJITNegIC(ArithProfile*, const Instruction*);
- JITSubIC* addJITSubIC(ArithProfile*, const Instruction*);
+ JITAddIC* addJITAddIC(ArithProfile*);
+ JITMulIC* addJITMulIC(ArithProfile*);
+ JITNegIC* addJITNegIC(ArithProfile*);
+ JITSubIC* addJITSubIC(ArithProfile*);
template <typename Generator, typename = typename std::enable_if<std::is_same<Generator, JITAddGenerator>::value>::type>
- JITAddIC* addMathIC(ArithProfile* profile, const Instruction* instruction) { return addJITAddIC(profile, instruction); }
+ JITAddIC* addMathIC(ArithProfile* profile) { return addJITAddIC(profile); }
template <typename Generator, typename = typename std::enable_if<std::is_same<Generator, JITMulGenerator>::value>::type>
- JITMulIC* addMathIC(ArithProfile* profile, const Instruction* instruction) { return addJITMulIC(profile, instruction); }
+ JITMulIC* addMathIC(ArithProfile* profile) { return addJITMulIC(profile); }
template <typename Generator, typename = typename std::enable_if<std::is_same<Generator, JITNegGenerator>::value>::type>
- JITNegIC* addMathIC(ArithProfile* profile, const Instruction* instruction) { return addJITNegIC(profile, instruction); }
+ JITNegIC* addMathIC(ArithProfile* profile) { return addJITNegIC(profile); }
template <typename Generator, typename = typename std::enable_if<std::is_same<Generator, JITSubGenerator>::value>::type>
- JITSubIC* addMathIC(ArithProfile* profile, const Instruction* instruction) { return addJITSubIC(profile, instruction); }
+ JITSubIC* addMathIC(ArithProfile* profile) { return addJITSubIC(profile); }
StructureStubInfo* addStubInfo(AccessType);
Modified: trunk/Source/_javascript_Core/bytecode/InlineCallFrame.h (245238 => 245239)
--- trunk/Source/_javascript_Core/bytecode/InlineCallFrame.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/bytecode/InlineCallFrame.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -177,21 +177,21 @@
Vector<ValueRecovery> argumentsWithFixup; // Includes 'this' and arity fixups.
WriteBarrier<CodeBlock> baselineCodeBlock;
- ValueRecovery calleeRecovery;
CodeOrigin directCaller;
- unsigned argumentCountIncludingThis; // Do not include fixups.
+ unsigned argumentCountIncludingThis { 0 }; // Do not include fixups.
signed stackOffset : 28;
unsigned kind : 3; // real type is Kind
bool isClosureCall : 1; // If false then we know that callee/scope are constants and the DFG won't treat them as variables, i.e. they have to be recovered manually.
VirtualRegister argumentCountRegister; // Only set when we inline a varargs call.
+
+ ValueRecovery calleeRecovery;
// There is really no good notion of a "default" set of values for
// InlineCallFrame's fields. This constructor is here just to reduce confusion if
// we forgot to initialize explicitly.
InlineCallFrame()
- : argumentCountIncludingThis(0)
- , stackOffset(0)
+ : stackOffset(0)
, kind(Call)
, isClosureCall(false)
{
Modified: trunk/Source/_javascript_Core/bytecode/ValueRecovery.h (245238 => 245239)
--- trunk/Source/_javascript_Core/bytecode/ValueRecovery.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/bytecode/ValueRecovery.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -43,7 +43,7 @@
// Describes how to recover a given bytecode virtual register at a given
// code point.
-enum ValueRecoveryTechnique {
+enum ValueRecoveryTechnique : uint8_t {
// It's in a register.
InGPR,
UnboxedInt32InGPR,
@@ -116,7 +116,9 @@
result.m_technique = UnboxedCellInGPR;
else
result.m_technique = InGPR;
- result.m_source.gpr = gpr;
+ UnionType u;
+ u.gpr = gpr;
+ result.m_source = WTFMove(u);
return result;
}
@@ -125,8 +127,10 @@
{
ValueRecovery result;
result.m_technique = InPair;
- result.m_source.pair.tagGPR = tagGPR;
- result.m_source.pair.payloadGPR = payloadGPR;
+ UnionType u;
+ u.pair.tagGPR = tagGPR;
+ u.pair.payloadGPR = payloadGPR;
+ result.m_source = WTFMove(u);
return result;
}
#endif
@@ -139,7 +143,9 @@
result.m_technique = UnboxedDoubleInFPR;
else
result.m_technique = InFPR;
- result.m_source.fpr = fpr;
+ UnionType u;
+ u.fpr = fpr;
+ result.m_source = WTFMove(u);
return result;
}
@@ -176,7 +182,9 @@
result.m_technique = DisplacedInJSStack;
break;
}
- result.m_source.virtualReg = virtualReg.offset();
+ UnionType u;
+ u.virtualReg = virtualReg.offset();
+ result.m_source = WTFMove(u);
return result;
}
@@ -184,7 +192,9 @@
{
ValueRecovery result;
result.m_technique = Constant;
- result.m_source.constant = JSValue::encode(value);
+ UnionType u;
+ u.constant = JSValue::encode(value);
+ result.m_source = WTFMove(u);
return result;
}
@@ -192,7 +202,9 @@
{
ValueRecovery result;
result.m_technique = DirectArgumentsThatWereNotCreated;
- result.m_source.nodeID = id.bits();
+ UnionType u;
+ u.nodeID = id.bits();
+ result.m_source = WTFMove(u);
return result;
}
@@ -200,7 +212,9 @@
{
ValueRecovery result;
result.m_technique = ClonedArgumentsThatWereNotCreated;
- result.m_source.nodeID = id.bits();
+ UnionType u;
+ u.nodeID = id.bits();
+ result.m_source = WTFMove(u);
return result;
}
@@ -292,7 +306,7 @@
MacroAssembler::RegisterID gpr() const
{
ASSERT(isInGPR());
- return m_source.gpr;
+ return m_source.get().gpr;
}
#if USE(JSVALUE32_64)
@@ -299,13 +313,13 @@
MacroAssembler::RegisterID tagGPR() const
{
ASSERT(m_technique == InPair);
- return m_source.pair.tagGPR;
+ return m_source.get().pair.tagGPR;
}
MacroAssembler::RegisterID payloadGPR() const
{
ASSERT(m_technique == InPair);
- return m_source.pair.payloadGPR;
+ return m_source.get().pair.payloadGPR;
}
bool isInJSValueRegs() const
@@ -330,13 +344,13 @@
MacroAssembler::FPRegisterID fpr() const
{
ASSERT(isInFPR());
- return m_source.fpr;
+ return m_source.get().fpr;
}
VirtualRegister virtualRegister() const
{
ASSERT(isInJSStack());
- return VirtualRegister(m_source.virtualReg);
+ return VirtualRegister(m_source.get().virtualReg);
}
ValueRecovery withLocalsOffset(int offset) const
@@ -351,7 +365,9 @@
case StrictInt52DisplacedInJSStack: {
ValueRecovery result;
result.m_technique = m_technique;
- result.m_source.virtualReg = m_source.virtualReg + offset;
+ UnionType u;
+ u.virtualReg = m_source.get().virtualReg + offset;
+ result.m_source = WTFMove(u);
return result;
}
@@ -363,13 +379,13 @@
JSValue constant() const
{
ASSERT(isConstant());
- return JSValue::decode(m_source.constant);
+ return JSValue::decode(m_source.get().constant);
}
DFG::MinifiedID nodeID() const
{
ASSERT(m_technique == DirectArgumentsThatWereNotCreated || m_technique == ClonedArgumentsThatWereNotCreated);
- return DFG::MinifiedID::fromBits(m_source.nodeID);
+ return DFG::MinifiedID::fromBits(m_source.get().nodeID);
}
JSValue recover(ExecState*) const;
@@ -408,7 +424,7 @@
private:
ValueRecoveryTechnique m_technique;
- union {
+ union UnionType {
MacroAssembler::RegisterID gpr;
MacroAssembler::FPRegisterID fpr;
#if USE(JSVALUE32_64)
@@ -420,7 +436,9 @@
int virtualReg;
EncodedJSValue constant;
unsigned nodeID;
- } m_source;
+ };
+ Packed<UnionType> m_source;
};
+static_assert(alignof(ValueRecovery) == 1);
} // namespace JSC
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (245238 => 245239)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2019-05-13 17:32:31 UTC (rev 245239)
@@ -3953,8 +3953,7 @@
CodeBlock* baselineCodeBlock = m_jit.graph().baselineCodeBlockFor(node->origin.semantic);
unsigned bytecodeIndex = node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
- JITAddIC* addIC = m_jit.codeBlock()->addJITAddIC(arithProfile, instruction);
+ JITAddIC* addIC = m_jit.codeBlock()->addJITAddIC(arithProfile);
auto repatchingFunction = operationValueAddOptimize;
auto nonRepatchingFunction = operationValueAdd;
@@ -3978,8 +3977,7 @@
CodeBlock* baselineCodeBlock = m_jit.graph().baselineCodeBlockFor(node->origin.semantic);
unsigned bytecodeIndex = node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
- JITSubIC* subIC = m_jit.codeBlock()->addJITSubIC(arithProfile, instruction);
+ JITSubIC* subIC = m_jit.codeBlock()->addJITSubIC(arithProfile);
auto repatchingFunction = operationValueSubOptimize;
auto nonRepatchingFunction = operationValueSub;
@@ -4573,8 +4571,7 @@
CodeBlock* baselineCodeBlock = m_jit.graph().baselineCodeBlockFor(node->origin.semantic);
unsigned bytecodeIndex = node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
- JITNegIC* negIC = m_jit.codeBlock()->addJITNegIC(arithProfile, instruction);
+ JITNegIC* negIC = m_jit.codeBlock()->addJITNegIC(arithProfile);
auto repatchingFunction = operationArithNegateOptimize;
auto nonRepatchingFunction = operationArithNegate;
bool needsScratchGPRReg = true;
@@ -4797,8 +4794,7 @@
CodeBlock* baselineCodeBlock = m_jit.graph().baselineCodeBlockFor(node->origin.semantic);
unsigned bytecodeIndex = node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
- JITMulIC* mulIC = m_jit.codeBlock()->addJITMulIC(arithProfile, instruction);
+ JITMulIC* mulIC = m_jit.codeBlock()->addJITMulIC(arithProfile);
auto repatchingFunction = operationValueMulOptimize;
auto nonRepatchingFunction = operationValueMul;
Modified: trunk/Source/_javascript_Core/ftl/FTLExitValue.cpp (245238 => 245239)
--- trunk/Source/_javascript_Core/ftl/FTLExitValue.cpp 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/ftl/FTLExitValue.cpp 2019-05-13 17:32:31 UTC (rev 245239)
@@ -38,7 +38,9 @@
{
ExitValue result;
result.m_kind = ExitValueMaterializeNewObject;
- result.u.newObjectMaterializationData = data;
+ UnionType u;
+ u.newObjectMaterializationData = data;
+ result.m_value = WTFMove(u);
return result;
}
Modified: trunk/Source/_javascript_Core/ftl/FTLExitValue.h (245238 => 245239)
--- trunk/Source/_javascript_Core/ftl/FTLExitValue.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/ftl/FTLExitValue.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -45,7 +45,7 @@
// telling us the mapping between operands in bytecode and the arguments to
// the call.
-enum ExitValueKind {
+enum ExitValueKind : uint8_t {
InvalidExitValue,
ExitValueDead,
ExitValueArgument,
@@ -79,7 +79,9 @@
{
ExitValue result;
result.m_kind = ExitValueInJSStack;
- result.u.virtualRegister = reg.offset();
+ UnionType u;
+ u.virtualRegister = reg.offset();
+ result.m_value = WTFMove(u);
return result;
}
@@ -87,7 +89,9 @@
{
ExitValue result;
result.m_kind = ExitValueInJSStackAsInt32;
- result.u.virtualRegister = reg.offset();
+ UnionType u;
+ u.virtualRegister = reg.offset();
+ result.m_value = WTFMove(u);
return result;
}
@@ -95,7 +99,9 @@
{
ExitValue result;
result.m_kind = ExitValueInJSStackAsInt52;
- result.u.virtualRegister = reg.offset();
+ UnionType u;
+ u.virtualRegister = reg.offset();
+ result.m_value = WTFMove(u);
return result;
}
@@ -103,7 +109,9 @@
{
ExitValue result;
result.m_kind = ExitValueInJSStackAsDouble;
- result.u.virtualRegister = reg.offset();
+ UnionType u;
+ u.virtualRegister = reg.offset();
+ result.m_value = WTFMove(u);
return result;
}
@@ -111,7 +119,9 @@
{
ExitValue result;
result.m_kind = ExitValueConstant;
- result.u.constant = JSValue::encode(value);
+ UnionType u;
+ u.constant = JSValue::encode(value);
+ result.m_value = WTFMove(u);
return result;
}
@@ -119,7 +129,9 @@
{
ExitValue result;
result.m_kind = ExitValueArgument;
- result.u.argument = argument.representation();
+ UnionType u;
+ u.argument = argument.representation();
+ result.m_value = WTFMove(u);
return result;
}
@@ -148,7 +160,7 @@
ExitArgument exitArgument() const
{
ASSERT(isArgument());
- return ExitArgument(u.argument);
+ return ExitArgument(m_value.get().argument);
}
void adjustStackmapLocationsIndexByOffset(unsigned offset)
@@ -155,25 +167,27 @@
{
ASSERT(hasIndexInStackmapLocations());
ASSERT(isArgument());
+ UnionType u = m_value.get();
u.argument.argument += offset;
+ m_value = WTFMove(u);
}
JSValue constant() const
{
ASSERT(isConstant());
- return JSValue::decode(u.constant);
+ return JSValue::decode(m_value.get().constant);
}
VirtualRegister virtualRegister() const
{
ASSERT(isInJSStackSomehow());
- return VirtualRegister(u.virtualRegister);
+ return VirtualRegister(m_value.get().virtualRegister);
}
ExitTimeObjectMaterialization* objectMaterialization() const
{
ASSERT(isObjectMaterialization());
- return u.newObjectMaterializationData;
+ return m_value.get().newObjectMaterializationData;
}
ExitValue withVirtualRegister(VirtualRegister virtualRegister) const
@@ -181,7 +195,9 @@
ASSERT(isInJSStackSomehow());
ExitValue result;
result.m_kind = m_kind;
- result.u.virtualRegister = virtualRegister.offset();
+ UnionType u;
+ u.virtualRegister = virtualRegister.offset();
+ result.m_value = WTFMove(u);
return result;
}
@@ -200,12 +216,13 @@
private:
ExitValueKind m_kind;
- union {
+ union UnionType {
ExitArgumentRepresentation argument;
EncodedJSValue constant;
int virtualRegister;
ExitTimeObjectMaterialization* newObjectMaterializationData;
- } u;
+ };
+ Packed<UnionType> m_value;
};
} } // namespace JSC::FTL
Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (245238 => 245239)
--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp 2019-05-13 17:32:31 UTC (rev 245239)
@@ -2070,10 +2070,9 @@
CodeBlock* baselineCodeBlock = m_ftlState.graph.baselineCodeBlockFor(m_node->origin.semantic);
unsigned bytecodeIndex = m_node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
auto repatchingFunction = operationValueAddOptimize;
auto nonRepatchingFunction = operationValueAdd;
- compileBinaryMathIC<JITAddGenerator>(arithProfile, instruction, repatchingFunction, nonRepatchingFunction);
+ compileBinaryMathIC<JITAddGenerator>(arithProfile, repatchingFunction, nonRepatchingFunction);
}
void compileValueSub()
@@ -2090,10 +2089,9 @@
CodeBlock* baselineCodeBlock = m_ftlState.graph.baselineCodeBlockFor(m_node->origin.semantic);
unsigned bytecodeIndex = m_node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
auto repatchingFunction = operationValueSubOptimize;
auto nonRepatchingFunction = operationValueSub;
- compileBinaryMathIC<JITSubGenerator>(arithProfile, instruction, repatchingFunction, nonRepatchingFunction);
+ compileBinaryMathIC<JITSubGenerator>(arithProfile, repatchingFunction, nonRepatchingFunction);
}
void compileValueMul()
@@ -2110,15 +2108,14 @@
CodeBlock* baselineCodeBlock = m_ftlState.graph.baselineCodeBlockFor(m_node->origin.semantic);
unsigned bytecodeIndex = m_node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
auto repatchingFunction = operationValueMulOptimize;
auto nonRepatchingFunction = operationValueMul;
- compileBinaryMathIC<JITMulGenerator>(arithProfile, instruction, repatchingFunction, nonRepatchingFunction);
+ compileBinaryMathIC<JITMulGenerator>(arithProfile, repatchingFunction, nonRepatchingFunction);
}
template <typename Generator, typename Func1, typename Func2,
typename = std::enable_if_t<std::is_function<typename std::remove_pointer<Func1>::type>::value && std::is_function<typename std::remove_pointer<Func2>::type>::value>>
- void compileUnaryMathIC(ArithProfile* arithProfile, const Instruction* instruction, Func1 repatchingFunction, Func2 nonRepatchingFunction)
+ void compileUnaryMathIC(ArithProfile* arithProfile, Func1 repatchingFunction, Func2 nonRepatchingFunction)
{
Node* node = m_node;
@@ -2144,7 +2141,7 @@
#endif
Box<MathICGenerationState> mathICGenerationState = Box<MathICGenerationState>::create();
- JITUnaryMathIC<Generator>* mathIC = jit.codeBlock()->addMathIC<Generator>(arithProfile, instruction);
+ JITUnaryMathIC<Generator>* mathIC = jit.codeBlock()->addMathIC<Generator>(arithProfile);
mathIC->m_generator = Generator(JSValueRegs(params[0].gpr()), JSValueRegs(params[1].gpr()), params.gpScratch(0));
bool shouldEmitProfiling = false;
@@ -2204,7 +2201,7 @@
template <typename Generator, typename Func1, typename Func2,
typename = std::enable_if_t<std::is_function<typename std::remove_pointer<Func1>::type>::value && std::is_function<typename std::remove_pointer<Func2>::type>::value>>
- void compileBinaryMathIC(ArithProfile* arithProfile, const Instruction* instruction, Func1 repatchingFunction, Func2 nonRepatchingFunction)
+ void compileBinaryMathIC(ArithProfile* arithProfile, Func1 repatchingFunction, Func2 nonRepatchingFunction)
{
Node* node = m_node;
@@ -2238,7 +2235,7 @@
#endif
Box<MathICGenerationState> mathICGenerationState = Box<MathICGenerationState>::create();
- JITBinaryMathIC<Generator>* mathIC = jit.codeBlock()->addMathIC<Generator>(arithProfile, instruction);
+ JITBinaryMathIC<Generator>* mathIC = jit.codeBlock()->addMathIC<Generator>(arithProfile);
mathIC->m_generator = Generator(leftOperand, rightOperand, JSValueRegs(params[0].gpr()),
JSValueRegs(params[1].gpr()), JSValueRegs(params[2].gpr()), params.fpScratch(0),
params.fpScratch(1), params.gpScratch(0), InvalidFPRReg);
@@ -2372,10 +2369,9 @@
CodeBlock* baselineCodeBlock = m_ftlState.graph.baselineCodeBlockFor(m_node->origin.semantic);
unsigned bytecodeIndex = m_node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
auto repatchingFunction = operationValueSubOptimize;
auto nonRepatchingFunction = operationValueSub;
- compileBinaryMathIC<JITSubGenerator>(arithProfile, instruction, repatchingFunction, nonRepatchingFunction);
+ compileBinaryMathIC<JITSubGenerator>(arithProfile, repatchingFunction, nonRepatchingFunction);
break;
}
@@ -3023,10 +3019,9 @@
CodeBlock* baselineCodeBlock = m_ftlState.graph.baselineCodeBlockFor(m_node->origin.semantic);
unsigned bytecodeIndex = m_node->origin.semantic.bytecodeIndex();
ArithProfile* arithProfile = baselineCodeBlock->arithProfileForBytecodeOffset(bytecodeIndex);
- const Instruction* instruction = baselineCodeBlock->instructions().at(bytecodeIndex).ptr();
auto repatchingFunction = operationArithNegateOptimize;
auto nonRepatchingFunction = operationArithNegate;
- compileUnaryMathIC<JITNegGenerator>(arithProfile, instruction, repatchingFunction, nonRepatchingFunction);
+ compileUnaryMathIC<JITNegGenerator>(arithProfile, repatchingFunction, nonRepatchingFunction);
}
void compileArithNegate()
Modified: trunk/Source/_javascript_Core/jit/CachedRecovery.h (245238 => 245239)
--- trunk/Source/_javascript_Core/jit/CachedRecovery.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/jit/CachedRecovery.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -123,10 +123,10 @@
FPRReg wantedFPR() const { return m_wantedFPR; }
private:
+ Vector<VirtualRegister, 1> m_targets;
ValueRecovery m_recovery;
JSValueRegs m_wantedJSValueRegs;
FPRReg m_wantedFPR { InvalidFPRReg };
- Vector<VirtualRegister, 1> m_targets;
};
} // namespace JSC
Modified: trunk/Source/_javascript_Core/jit/CallFrameShuffleData.h (245238 => 245239)
--- trunk/Source/_javascript_Core/jit/CallFrameShuffleData.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/jit/CallFrameShuffleData.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -35,7 +35,6 @@
struct CallFrameShuffleData {
WTF_MAKE_FAST_ALLOCATED;
public:
- ValueRecovery callee;
Vector<ValueRecovery> args;
unsigned numLocals { UINT_MAX };
unsigned numPassedArgs { UINT_MAX };
@@ -45,6 +44,7 @@
void setupCalleeSaveRegisters(CodeBlock*);
#endif
+ ValueRecovery callee;
};
} // namespace JSC
Modified: trunk/Source/_javascript_Core/jit/JITArithmetic.cpp (245238 => 245239)
--- trunk/Source/_javascript_Core/jit/JITArithmetic.cpp 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/jit/JITArithmetic.cpp 2019-05-13 17:32:31 UTC (rev 245239)
@@ -453,7 +453,7 @@
void JIT::emit_op_negate(const Instruction* currentInstruction)
{
ArithProfile* arithProfile = ¤tInstruction->as<OpNegate>().metadata(m_codeBlock).m_arithProfile;
- JITNegIC* negateIC = m_codeBlock->addJITNegIC(arithProfile, currentInstruction);
+ JITNegIC* negateIC = m_codeBlock->addJITNegIC(arithProfile);
m_instructionToMathIC.add(currentInstruction, negateIC);
emitMathICFast<OpNegate>(negateIC, currentInstruction, operationArithNegateProfiled, operationArithNegate);
}
@@ -641,7 +641,7 @@
void JIT::emit_op_add(const Instruction* currentInstruction)
{
ArithProfile* arithProfile = ¤tInstruction->as<OpAdd>().metadata(m_codeBlock).m_arithProfile;
- JITAddIC* addIC = m_codeBlock->addJITAddIC(arithProfile, currentInstruction);
+ JITAddIC* addIC = m_codeBlock->addJITAddIC(arithProfile);
m_instructionToMathIC.add(currentInstruction, addIC);
emitMathICFast<OpAdd>(addIC, currentInstruction, operationValueAddProfiled, operationValueAdd);
}
@@ -960,7 +960,7 @@
void JIT::emit_op_mul(const Instruction* currentInstruction)
{
ArithProfile* arithProfile = ¤tInstruction->as<OpMul>().metadata(m_codeBlock).m_arithProfile;
- JITMulIC* mulIC = m_codeBlock->addJITMulIC(arithProfile, currentInstruction);
+ JITMulIC* mulIC = m_codeBlock->addJITMulIC(arithProfile);
m_instructionToMathIC.add(currentInstruction, mulIC);
emitMathICFast<OpMul>(mulIC, currentInstruction, operationValueMulProfiled, operationValueMul);
}
@@ -976,7 +976,7 @@
void JIT::emit_op_sub(const Instruction* currentInstruction)
{
ArithProfile* arithProfile = ¤tInstruction->as<OpSub>().metadata(m_codeBlock).m_arithProfile;
- JITSubIC* subIC = m_codeBlock->addJITSubIC(arithProfile, currentInstruction);
+ JITSubIC* subIC = m_codeBlock->addJITSubIC(arithProfile);
m_instructionToMathIC.add(currentInstruction, subIC);
emitMathICFast<OpSub>(subIC, currentInstruction, operationValueSubProfiled, operationValueSub);
}
Modified: trunk/Source/_javascript_Core/jit/JITMathIC.h (245238 => 245239)
--- trunk/Source/_javascript_Core/jit/JITMathIC.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/jit/JITMathIC.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -56,9 +56,8 @@
class JITMathIC {
WTF_MAKE_FAST_ALLOCATED;
public:
- JITMathIC(ArithProfile* arithProfile, const Instruction* instruction)
+ JITMathIC(ArithProfile* arithProfile)
: m_arithProfile(arithProfile)
- , m_instruction(instruction)
{
}
@@ -225,7 +224,6 @@
}
ArithProfile* arithProfile() const { return m_arithProfile; }
- const Instruction* instruction() const { return m_instruction; }
#if ENABLE(MATH_IC_STATS)
size_t m_generatedCodeSize { 0 };
@@ -239,7 +237,6 @@
#endif
ArithProfile* m_arithProfile;
- const Instruction* m_instruction;
MacroAssemblerCodeRef<JITStubRoutinePtrTag> m_code;
CodeLocationLabel<JSInternalPtrTag> m_inlineStart;
CodeLocationLabel<JSInternalPtrTag> m_inlineEnd;
@@ -256,8 +253,8 @@
template <typename GeneratorType>
class JITBinaryMathIC : public JITMathIC<GeneratorType, isBinaryProfileEmpty> {
public:
- JITBinaryMathIC(ArithProfile* arithProfile, const Instruction* instruction)
- : JITMathIC<GeneratorType, isBinaryProfileEmpty>(arithProfile, instruction)
+ JITBinaryMathIC(ArithProfile* arithProfile)
+ : JITMathIC<GeneratorType, isBinaryProfileEmpty>(arithProfile)
{
}
};
@@ -274,8 +271,8 @@
template <typename GeneratorType>
class JITUnaryMathIC : public JITMathIC<GeneratorType, isUnaryProfileEmpty> {
public:
- JITUnaryMathIC(ArithProfile* arithProfile, const Instruction* instruction)
- : JITMathIC<GeneratorType, isUnaryProfileEmpty>(arithProfile, instruction)
+ JITUnaryMathIC(ArithProfile* arithProfile)
+ : JITMathIC<GeneratorType, isUnaryProfileEmpty>(arithProfile)
{
}
};
Modified: trunk/Source/_javascript_Core/jit/PolymorphicCallStubRoutine.h (245238 => 245239)
--- trunk/Source/_javascript_Core/jit/PolymorphicCallStubRoutine.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/jit/PolymorphicCallStubRoutine.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -38,7 +38,7 @@
class CallLinkInfo;
-class PolymorphicCallNode : public BasicRawSentinelNode<PolymorphicCallNode> {
+class PolymorphicCallNode : public PackedRawSentinelNode<PolymorphicCallNode> {
WTF_MAKE_NONCOPYABLE(PolymorphicCallNode);
public:
PolymorphicCallNode(CallLinkInfo* info)
@@ -50,11 +50,11 @@
void unlink(VM&);
- bool hasCallLinkInfo(CallLinkInfo* info) { return m_callLinkInfo == info; }
+ bool hasCallLinkInfo(CallLinkInfo* info) { return m_callLinkInfo.get() == info; }
void clearCallLinkInfo();
private:
- CallLinkInfo* m_callLinkInfo;
+ PackedPtr<CallLinkInfo> m_callLinkInfo;
};
class PolymorphicCallCase {
Modified: trunk/Source/_javascript_Core/jit/SnippetOperand.h (245238 => 245239)
--- trunk/Source/_javascript_Core/jit/SnippetOperand.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/_javascript_Core/jit/SnippetOperand.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -28,11 +28,12 @@
#if ENABLE(JIT)
#include "ResultType.h"
+#include <wtf/Packed.h>
namespace JSC {
class SnippetOperand {
- enum ConstOrVarType {
+ enum ConstOrVarType : uint8_t {
Variable,
ConstInt32,
ConstDouble
@@ -55,18 +56,18 @@
bool isConstDouble() const { return m_type == ConstDouble; }
bool isPositiveConstInt32() const { return isConstInt32() && asConstInt32() > 0; }
- int64_t asRawBits() const { return m_val.rawBits; }
+ int64_t asRawBits() const { return m_val.get().rawBits; }
int32_t asConstInt32() const
{
ASSERT(m_type == ConstInt32);
- return m_val.int32Val;
+ return m_val.get().int32Val;
}
double asConstDouble() const
{
ASSERT(m_type == ConstDouble);
- return m_val.doubleVal;
+ return m_val.get().doubleVal;
}
double asConstNumber() const
@@ -80,24 +81,30 @@
void setConstInt32(int32_t value)
{
m_type = ConstInt32;
- m_val.int32Val = value;
+ UnionType u;
+ u.int32Val = value;
+ m_val = WTFMove(u);
}
void setConstDouble(double value)
{
m_type = ConstDouble;
- m_val.doubleVal = value;
+ UnionType u;
+ u.doubleVal = value;
+ m_val = WTFMove(u);
}
private:
ResultType m_resultType;
ConstOrVarType m_type { Variable };
- union {
+ union UnionType {
int32_t int32Val;
double doubleVal;
int64_t rawBits;
- } m_val;
+ };
+ Packed<UnionType> m_val;
};
+static_assert(alignof(SnippetOperand) == 1);
} // namespace JSC
Modified: trunk/Source/WTF/ChangeLog (245238 => 245239)
--- trunk/Source/WTF/ChangeLog 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/WTF/ChangeLog 2019-05-13 17:32:31 UTC (rev 245239)
@@ -1,3 +1,13 @@
+2019-05-13 Yusuke Suzuki <ysuz...@apple.com>
+
+ [JSC] Compress miscelaneous JIT related data structures with Packed<>
+ https://bugs.webkit.org/show_bug.cgi?id=197830
+
+ Reviewed by Saam Barati.
+
+ * wtf/Packed.h:
+ (WTF::alignof):
+
2019-05-13 Michael Catanzaro <mcatanz...@igalia.com>
Unreviewed, fix unused variable warnings in release builds
Modified: trunk/Source/WTF/wtf/Packed.h (245238 => 245239)
--- trunk/Source/WTF/wtf/Packed.h 2019-05-13 16:52:05 UTC (rev 245238)
+++ trunk/Source/WTF/wtf/Packed.h 2019-05-13 17:32:31 UTC (rev 245239)
@@ -161,6 +161,7 @@
T* operator->() const { return get(); }
T& operator*() const { return *get(); }
bool operator!() const { return !get(); }
+ explicit operator bool() const { return get(); }
PackedAlignedPtr& operator=(T* value)
{