Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (293628 => 293629)
--- trunk/Source/_javascript_Core/ChangeLog 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/ChangeLog 2022-04-29 20:05:32 UTC (rev 293629)
@@ -1,3 +1,103 @@
+2022-04-29 Yusuke Suzuki <[email protected]>
+
+ [JSC] Use FixedVector in JumpReplacements and VariableEventStream
+ https://bugs.webkit.org/show_bug.cgi?id=239892
+
+ Reviewed by Mark Lam.
+
+ 1. Introduce DFG::VariableEventStreamBuilder. And construct DFG::VariableEventStream from that
+ builder when finailizing code generation. We also make it FixedVector.
+ 2. Use FixedVector for JumpReplacements.
+
+ * dfg/DFGCommonData.cpp:
+ (JSC::DFG::CommonData::shrinkToFit):
+ * dfg/DFGCommonData.h:
+ * dfg/DFGGenerationInfo.h:
+ (JSC::DFG::GenerationInfo::noticeOSRBirth):
+ (JSC::DFG::GenerationInfo::use):
+ (JSC::DFG::GenerationInfo::spill):
+ (JSC::DFG::GenerationInfo::setSpilled):
+ (JSC::DFG::GenerationInfo::fillGPR):
+ (JSC::DFG::GenerationInfo::fillJSValue):
+ (JSC::DFG::GenerationInfo::fillCell):
+ (JSC::DFG::GenerationInfo::fillInt32):
+ (JSC::DFG::GenerationInfo::fillInt52):
+ (JSC::DFG::GenerationInfo::fillStrictInt52):
+ (JSC::DFG::GenerationInfo::fillBoolean):
+ (JSC::DFG::GenerationInfo::fillDouble):
+ (JSC::DFG::GenerationInfo::fillStorage):
+ (JSC::DFG::GenerationInfo::appendBirth):
+ (JSC::DFG::GenerationInfo::appendFill):
+ (JSC::DFG::GenerationInfo::appendSpill):
+ * dfg/DFGJITCode.cpp:
+ (JSC::DFG::JITCode::shrinkToFit):
+ (JSC::DFG::JITCode::reconstruct):
+ * dfg/DFGJITCompiler.cpp:
+ (JSC::DFG::JITCompiler::link):
+ (JSC::DFG::JITCompiler::compile):
+ (JSC::DFG::JITCompiler::compileFunction):
+ (JSC::DFG::JITCompiler::exceptionCheck):
+ * dfg/DFGSlowPathGenerator.h:
+ (JSC::DFG::SlowPathGenerator::SlowPathGenerator):
+ * dfg/DFGSpeculativeJIT.cpp:
+ (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
+ (JSC::DFG::SpeculativeJIT::speculationCheck):
+ (JSC::DFG::SpeculativeJIT::emitInvalidationPoint):
+ (JSC::DFG::SpeculativeJIT::addSlowPathGeneratorLambda):
+ (JSC::DFG::SpeculativeJIT::fillStorage):
+ (JSC::DFG::SpeculativeJIT::compileDeleteById):
+ (JSC::DFG::SpeculativeJIT::compileDeleteByVal):
+ (JSC::DFG::SpeculativeJIT::compileInById):
+ (JSC::DFG::SpeculativeJIT::compileInByVal):
+ (JSC::DFG::SpeculativeJIT::compileHasPrivate):
+ (JSC::DFG::SpeculativeJIT::noticeOSRBirth):
+ (JSC::DFG::SpeculativeJIT::compileMovHint):
+ (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
+ (JSC::DFG::SpeculativeJIT::compilePutByVal):
+ * dfg/DFGSpeculativeJIT.h:
+ (JSC::DFG::SpeculativeJIT::finalizeEventStream):
+ (JSC::DFG::SpeculativeJIT::use):
+ (JSC::DFG::SpeculativeJIT::spill):
+ (JSC::DFG::SpeculativeJIT::recordSetLocal):
+ * dfg/DFGSpeculativeJIT32_64.cpp:
+ (JSC::DFG::SpeculativeJIT::fillJSValue):
+ (JSC::DFG::SpeculativeJIT::cachedGetById):
+ (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis):
+ (JSC::DFG::SpeculativeJIT::emitCall):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
+ (JSC::DFG::SpeculativeJIT::compileGetByVal):
+ * dfg/DFGSpeculativeJIT64.cpp:
+ (JSC::DFG::SpeculativeJIT::fillJSValue):
+ (JSC::DFG::SpeculativeJIT::cachedGetById):
+ (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis):
+ (JSC::DFG::SpeculativeJIT::emitCall):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateInt52):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
+ (JSC::DFG::SpeculativeJIT::fillSpeculateBigInt32):
+ (JSC::DFG::SpeculativeJIT::compileGetByVal):
+ (JSC::DFG::SpeculativeJIT::compile):
+ * dfg/DFGVariableEventStream.cpp:
+ (JSC::DFG::VariableEventStreamBuilder::logEvent):
+ (JSC::DFG::VariableEventStream::reconstruct const):
+ (JSC::DFG::VariableEventStream::logEvent): Deleted.
+ * dfg/DFGVariableEventStream.h:
+ (JSC::DFG::VariableEventStream::VariableEventStream):
+ (JSC::DFG::VariableEventStreamBuilder::appendAndLog):
+ (JSC::DFG::VariableEventStreamBuilder::size const):
+ (JSC::DFG::VariableEventStreamBuilder::finalize):
+ (JSC::DFG::VariableEventStream::appendAndLog): Deleted.
+ * ftl/FTLLink.cpp:
+ (JSC::FTL::link):
+ * ftl/FTLLowerDFGToB3.cpp:
+ (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
+ * ftl/FTLState.h:
+
2022-04-29 Yury Semikhatsky <[email protected]>
Format time zone name using ICU instead of platform calls
Modified: trunk/Source/_javascript_Core/dfg/DFGCommonData.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGCommonData.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGCommonData.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -42,7 +42,6 @@
void CommonData::shrinkToFit()
{
codeOrigins->shrinkToFit();
- m_jumpReplacements.shrinkToFit();
}
static Lock pcCodeBlockMapLock;
Modified: trunk/Source/_javascript_Core/dfg/DFGCommonData.h (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGCommonData.h 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGCommonData.h 2022-04-29 20:05:32 UTC (rev 293629)
@@ -129,7 +129,7 @@
FixedVector<AdaptiveInferredPropertyValueWatchpoint> m_adaptiveInferredPropertyValueWatchpoints;
std::unique_ptr<PCToCodeOriginMap> m_pcToCodeOriginMap;
RecordedStatuses recordedStatuses;
- Vector<JumpReplacement> m_jumpReplacements;
+ FixedVector<JumpReplacement> m_jumpReplacements;
Bag<StructureStubInfo> m_stubInfos;
Bag<OptimizingCallLinkInfo> m_callLinkInfos;
Yarr::YarrBoyerMoyerData m_boyerMooreData;
Modified: trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h 2022-04-29 20:05:32 UTC (rev 293629)
@@ -148,7 +148,7 @@
// Get the node that produced this value.
Node* node() { return m_node; }
- void noticeOSRBirth(VariableEventStream& stream, Node* node, VirtualRegister virtualRegister)
+ void noticeOSRBirth(VariableEventStreamBuilder& stream, Node* node, VirtualRegister virtualRegister)
{
if (m_node != node)
return;
@@ -170,7 +170,7 @@
// Mark the value as having been used (decrement the useCount).
// Returns true if this was the last use of the value, and any
// associated machine registers may be freed.
- bool use(VariableEventStream& stream)
+ bool use(VariableEventStreamBuilder& stream)
{
ASSERT(m_useCount);
bool result = !--m_useCount;
@@ -268,7 +268,7 @@
}
// Called when a VirtualRegister is being spilled to the JSStack for the first time.
- void spill(VariableEventStream& stream, VirtualRegister virtualRegister, DataFormat spillFormat)
+ void spill(VariableEventStreamBuilder& stream, VirtualRegister virtualRegister, DataFormat spillFormat)
{
// We shouldn't be spill values that don't need spilling.
ASSERT(!m_canFill);
@@ -286,7 +286,7 @@
// Called on values that don't need spilling (constants and values that have
// already been spilled), to mark them as no longer being in machine registers.
- void setSpilled(VariableEventStream& stream, VirtualRegister virtualRegister)
+ void setSpilled(VariableEventStreamBuilder& stream, VirtualRegister virtualRegister)
{
// Should only be called on values that don't need spilling, and are currently in registers.
ASSERT(m_canFill && m_registerFormat != DataFormatNone);
@@ -302,7 +302,7 @@
m_canFill = false;
}
- void fillGPR(VariableEventStream& stream, GPRReg gpr, DataFormat format)
+ void fillGPR(VariableEventStreamBuilder& stream, GPRReg gpr, DataFormat format)
{
ASSERT(gpr != InvalidGPRReg);
m_registerFormat = format;
@@ -314,13 +314,13 @@
// Record that this value is filled into machine registers,
// tracking which registers, and what format the value has.
#if USE(JSVALUE64)
- void fillJSValue(VariableEventStream& stream, GPRReg gpr, DataFormat format = DataFormatJS)
+ void fillJSValue(VariableEventStreamBuilder& stream, GPRReg gpr, DataFormat format = DataFormatJS)
{
ASSERT(format & DataFormatJS);
fillGPR(stream, gpr, format);
}
#elif USE(JSVALUE32_64)
- void fillJSValue(VariableEventStream& stream, GPRReg tagGPR, GPRReg payloadGPR, DataFormat format = DataFormatJS)
+ void fillJSValue(VariableEventStreamBuilder& stream, GPRReg tagGPR, GPRReg payloadGPR, DataFormat format = DataFormatJS)
{
ASSERT(format & DataFormatJS);
m_registerFormat = format;
@@ -330,33 +330,33 @@
if (m_bornForOSR)
appendFill(Fill, stream);
}
- void fillCell(VariableEventStream& stream, GPRReg gpr)
+ void fillCell(VariableEventStreamBuilder& stream, GPRReg gpr)
{
fillGPR(stream, gpr, DataFormatCell);
}
#endif
- void fillInt32(VariableEventStream& stream, GPRReg gpr)
+ void fillInt32(VariableEventStreamBuilder& stream, GPRReg gpr)
{
fillGPR(stream, gpr, DataFormatInt32);
}
- void fillInt52(VariableEventStream& stream, GPRReg gpr, DataFormat format)
+ void fillInt52(VariableEventStreamBuilder& stream, GPRReg gpr, DataFormat format)
{
ASSERT(format == DataFormatInt52 || format == DataFormatStrictInt52);
fillGPR(stream, gpr, format);
}
- void fillInt52(VariableEventStream& stream, GPRReg gpr)
+ void fillInt52(VariableEventStreamBuilder& stream, GPRReg gpr)
{
fillGPR(stream, gpr, DataFormatInt52);
}
- void fillStrictInt52(VariableEventStream& stream, GPRReg gpr)
+ void fillStrictInt52(VariableEventStreamBuilder& stream, GPRReg gpr)
{
fillGPR(stream, gpr, DataFormatStrictInt52);
}
- void fillBoolean(VariableEventStream& stream, GPRReg gpr)
+ void fillBoolean(VariableEventStreamBuilder& stream, GPRReg gpr)
{
fillGPR(stream, gpr, DataFormatBoolean);
}
- void fillDouble(VariableEventStream& stream, FPRReg fpr)
+ void fillDouble(VariableEventStreamBuilder& stream, FPRReg fpr)
{
ASSERT(fpr != InvalidFPRReg);
m_registerFormat = DataFormatDouble;
@@ -365,7 +365,7 @@
if (m_bornForOSR)
appendFill(Fill, stream);
}
- void fillStorage(VariableEventStream& stream, GPRReg gpr)
+ void fillStorage(VariableEventStreamBuilder& stream, GPRReg gpr)
{
fillGPR(stream, gpr, DataFormatStorage);
}
@@ -399,12 +399,12 @@
}
private:
- void appendBirth(VariableEventStream& stream)
+ void appendBirth(VariableEventStreamBuilder& stream)
{
stream.appendAndLog(VariableEvent::birth(MinifiedID(m_node)));
}
- void appendFill(VariableEventKind kind, VariableEventStream& stream)
+ void appendFill(VariableEventKind kind, VariableEventStreamBuilder& stream)
{
ASSERT(m_bornForOSR);
@@ -421,7 +421,7 @@
stream.appendAndLog(VariableEvent::fillGPR(kind, MinifiedID(m_node), u.gpr, m_registerFormat));
}
- void appendSpill(VariableEventKind kind, VariableEventStream& stream, VirtualRegister virtualRegister)
+ void appendSpill(VariableEventKind kind, VariableEventStreamBuilder& stream, VirtualRegister virtualRegister)
{
stream.appendAndLog(VariableEvent::spill(kind, MinifiedID(m_node), virtualRegister, m_spillFormat));
}
Modified: trunk/Source/_javascript_Core/dfg/DFGJITCode.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGJITCode.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCode.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -59,7 +59,6 @@
{
common.shrinkToFit();
minifiedDFG.prepareAndShrink();
- variableEventStream.shrinkToFit();
}
void JITCode::reconstruct(
@@ -66,8 +65,7 @@
CodeBlock* codeBlock, CodeOrigin codeOrigin, unsigned streamIndex,
Operands<ValueRecovery>& result)
{
- variableEventStream.reconstruct(
- codeBlock, codeOrigin, minifiedDFG, streamIndex, result);
+ variableEventStream.reconstruct(codeBlock, codeOrigin, minifiedDFG, streamIndex, result);
}
void JITCode::reconstruct(CallFrame* callFrame, CodeBlock* codeBlock, CodeOrigin codeOrigin, unsigned streamIndex, Operands<std::optional<JSValue>>& result)
Modified: trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -291,6 +291,7 @@
if (!m_exceptionChecksWithCallFrameRollback.empty())
linkBuffer.link(m_exceptionChecksWithCallFrameRollback, CodeLocationLabel(vm().getCTIStub(handleExceptionWithCallFrameRollbackGenerator).retaggedCode<NoPtrTag>()));
+ Vector<JumpReplacement> jumpReplacements;
MacroAssemblerCodeRef<JITThunkPtrTag> osrExitThunk = vm().getCTIStub(osrExitGenerationThunkGenerator);
auto target = CodeLocationLabel<JITThunkPtrTag>(osrExitThunk.code());
for (unsigned i = 0; i < m_osrExit.size(); ++i) {
@@ -303,11 +304,12 @@
}
if (info.m_replacementSource.isSet()) {
- m_jitCode->common.m_jumpReplacements.append(JumpReplacement(
+ jumpReplacements.append(JumpReplacement(
linkBuffer.locationOf<JSInternalPtrTag>(info.m_replacementSource),
linkBuffer.locationOf<OSRExitPtrTag>(info.m_replacementDestination)));
}
}
+ m_jitCode->common.m_jumpReplacements = WTFMove(jumpReplacements);
if (UNLIKELY(m_graph.compilation())) {
ASSERT(m_exitSiteLabels.size() == m_osrExit.size());
@@ -415,6 +417,7 @@
auto codeRef = FINALIZE_DFG_CODE(*linkBuffer, JSEntryPtrTag, "DFG JIT code for %s", toCString(CodeBlockWithJITType(m_codeBlock, JITType::DFGJIT)).data());
m_jitCode->initializeCodeRefForDFG(codeRef, codeRef.code());
+ m_jitCode->variableEventStream = m_speculative->finalizeEventStream();
auto finalizer = makeUnique<JITFinalizer>(m_graph.m_plan, m_jitCode.releaseNonNull(), WTFMove(linkBuffer));
m_graph.m_plan.setFinalizer(WTFMove(finalizer));
@@ -525,6 +528,7 @@
m_jitCode->initializeCodeRefForDFG(
FINALIZE_DFG_CODE(*linkBuffer, JSEntryPtrTag, "DFG JIT code for %s", toCString(CodeBlockWithJITType(m_codeBlock, JITType::DFGJIT)).data()),
withArityCheck);
+ m_jitCode->variableEventStream = m_speculative->finalizeEventStream();
auto finalizer = makeUnique<JITFinalizer>(m_graph.m_plan, m_jitCode.releaseNonNull(), WTFMove(linkBuffer), withArityCheck);
m_graph.m_plan.setFinalizer(WTFMove(finalizer));
@@ -653,7 +657,7 @@
HandlerInfo* exceptionHandler;
bool willCatchException = m_graph.willCatchExceptionInMachineFrame(m_speculative->m_currentNode->origin.forExit, opCatchOrigin, exceptionHandler);
if (willCatchException) {
- unsigned streamIndex = m_speculative->m_outOfLineStreamIndex ? *m_speculative->m_outOfLineStreamIndex : m_speculative->m_stream->size();
+ unsigned streamIndex = m_speculative->m_outOfLineStreamIndex ? *m_speculative->m_outOfLineStreamIndex : m_speculative->m_stream.size();
MacroAssembler::Jump hadException = emitNonPatchableExceptionCheck(vm());
// We assume here that this is called after callOpeartion()/appendCall() is called.
appendExceptionHandlingOSRExit(ExceptionCheck, streamIndex, opCatchOrigin, exceptionHandler, m_jitCode->common.codeOrigins->lastCallSite(), hadException);
Modified: trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h 2022-04-29 20:05:32 UTC (rev 293629)
@@ -39,7 +39,7 @@
public:
SlowPathGenerator(SpeculativeJIT* jit)
: m_currentNode(jit->m_currentNode)
- , m_streamIndex(jit->m_stream->size())
+ , m_streamIndex(jit->m_stream.size())
, m_origin(jit->m_origin)
{
}
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -84,7 +84,6 @@
, m_compileOkay(true)
, m_state(m_graph)
, m_interpreter(m_graph, m_state)
- , m_stream(&jit.jitCode()->variableEventStream)
, m_minifiedGraph(&jit.jitCode()->minifiedDFG)
{
}
@@ -268,7 +267,7 @@
m_jit.appendExitInfo(jumpsToFail);
} else
m_jit.appendExitInfo(jumpToFail);
- m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream->size()));
+ m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream.size()));
}
void SpeculativeJIT::speculationCheck(ExitKind kind, JSValueSource jsValueSource, Node* node, const MacroAssembler::JumpList& jumpsToFail)
@@ -283,7 +282,7 @@
m_jit.appendExitInfo(myJumpsToFail);
} else
m_jit.appendExitInfo(jumpsToFail);
- m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream->size()));
+ m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream.size()));
}
OSRExitJumpPlaceholder SpeculativeJIT::speculationCheck(ExitKind kind, JSValueSource jsValueSource, Node* node)
@@ -292,7 +291,7 @@
return OSRExitJumpPlaceholder();
unsigned index = m_jit.m_osrExit.size();
m_jit.appendExitInfo();
- m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream->size()));
+ m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream.size()));
return OSRExitJumpPlaceholder(index);
}
@@ -317,7 +316,7 @@
return;
unsigned recoveryIndex = m_jit.appendSpeculationRecovery(recovery);
m_jit.appendExitInfo(jumpToFail);
- m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream->size(), recoveryIndex));
+ m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream.size(), recoveryIndex));
}
void SpeculativeJIT::speculationCheck(ExitKind kind, JSValueSource jsValueSource, Edge nodeUse, MacroAssembler::Jump jumpToFail, const SpeculationRecovery& recovery)
@@ -332,7 +331,7 @@
OSRExitCompilationInfo& info = m_jit.appendExitInfo(JITCompiler::JumpList());
m_jit.appendOSRExit(OSRExit(
UncountableInvalidation, JSValueSource(), MethodOfGettingAValueProfile(),
- this, m_stream->size()));
+ this, m_stream.size()));
info.m_replacementSource = m_jit.watchpointLabel();
RELEASE_ASSERT(info.m_replacementSource.isSet());
noResult(node);
@@ -403,7 +402,7 @@
void SpeculativeJIT::addSlowPathGeneratorLambda(Function<void()>&& lambda)
{
- m_slowPathLambdas.append(SlowPathLambda{ WTFMove(lambda), m_currentNode, static_cast<unsigned>(m_stream->size()) });
+ m_slowPathLambdas.append(SlowPathLambda { WTFMove(lambda), m_currentNode, static_cast<unsigned>(m_stream.size()) });
}
void SpeculativeJIT::runSlowPathGenerators(PCToCodeOriginMapBuilder& pcToCodeOriginMapBuilder)
@@ -992,7 +991,7 @@
GPRReg gpr = allocate();
m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
m_jit.loadPtr(JITCompiler::addressFor(virtualRegister), gpr);
- info.fillStorage(*m_stream, gpr);
+ info.fillStorage(m_stream, gpr);
return gpr;
}
@@ -1189,7 +1188,7 @@
GPRReg resultGPR = resultRegs.payloadGPR();
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITDelByIdGenerator gen(
@@ -1275,7 +1274,7 @@
slowCases.append(m_jit.branchIfNotCell(keyRegs));
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITDelByValGenerator gen(
@@ -1355,7 +1354,7 @@
base.use();
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITInByIdGenerator gen(
m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, usedRegisters, node->cacheableIdentifier(),
@@ -1407,7 +1406,7 @@
CCallHelpers::JumpList slowCases;
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITInByValGenerator gen(
m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, AccessType::InByVal, usedRegisters,
@@ -1459,7 +1458,7 @@
CCallHelpers::JumpList slowCases;
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITInByValGenerator gen(
m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, type, usedRegisters,
@@ -2104,7 +2103,7 @@
VirtualRegister virtualRegister = node->virtualRegister();
GenerationInfo& info = generationInfoFromVirtualRegister(virtualRegister);
- info.noticeOSRBirth(*m_stream, node, virtualRegister);
+ info.noticeOSRBirth(m_stream, node, virtualRegister);
}
void SpeculativeJIT::compileLoopHint(Node* node)
@@ -2168,7 +2167,7 @@
Node* child = node->child1().node();
noticeOSRBirth(child);
- m_stream->appendAndLog(VariableEvent::movHint(MinifiedID(child), node->unlinkedOperand()));
+ m_stream.appendAndLog(VariableEvent::movHint(MinifiedID(child), node->unlinkedOperand()));
}
void SpeculativeJIT::compileCheckDetached(Node* node)
@@ -2228,7 +2227,7 @@
#endif
}
- m_stream->appendAndLog(VariableEvent::reset());
+ m_stream.appendAndLog(VariableEvent::reset());
m_jit.jitAssertHasValidCallFrame();
m_jit.jitAssertTagsInPlace();
@@ -2249,7 +2248,7 @@
continue; // No need to record dead SetLocal's.
format = dataFormatFor(variable->flushFormat());
DFG_ASSERT(m_graph, node, !operand.isArgument() || operand.virtualRegister().toArgument() >= 0);
- m_stream->appendAndLog(VariableEvent::setLocal(operand, variable->machineLocal(), format));
+ m_stream.appendAndLog(VariableEvent::setLocal(operand, variable->machineLocal(), format));
}
m_origin = NodeOrigin();
@@ -2732,7 +2731,7 @@
speculate(node, child3);
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
bool isDirect = node->op() == PutByValDirect;
ECMAMode ecmaMode = node->ecmaMode();
@@ -4139,7 +4138,7 @@
speculateSymbol(m_graph.child(node, 1));
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITCompiler::JumpList slowCases;
@@ -4344,7 +4343,7 @@
speculateSymbol(child2, propertyGPR);
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITPutByValGenerator gen(
@@ -4421,7 +4420,7 @@
speculateSymbol(node->child2(), brandGPR);
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITCompiler::JumpList slowCases;
@@ -4472,7 +4471,7 @@
speculateSymbol(node->child2(), brandGPR);
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITCompiler::JumpList slowCases;
@@ -15820,7 +15819,7 @@
if (scratch2GPR != InvalidGPRReg)
usedRegisters.set(scratch2GPR, false);
}
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
JITPutByIdGenerator gen(
m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, usedRegisters, identifier,
JSValueRegs::payloadOnly(baseGPR), valueRegs, stubInfoGPR,
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h 2022-04-29 20:05:32 UTC (rev 293629)
@@ -160,6 +160,7 @@
void createOSREntries();
void linkOSREntries(LinkBuffer&);
+ Vector<VariableEvent> finalizeEventStream() { return m_stream.finalize(); }
BasicBlock* nextBlock()
{
@@ -297,7 +298,7 @@
// use() returns true when the value becomes dead, and any
// associated resources may be freed.
- if (!info.use(*m_stream))
+ if (!info.use(m_stream))
return;
// Release the associated machine registers.
@@ -496,7 +497,7 @@
// Check the GenerationInfo to see if this value need writing
// to the JSStack - if not, mark it as spilled & return.
if (!info.needsSpill()) {
- info.setSpilled(*m_stream, spillMe);
+ info.setSpilled(m_stream, spillMe);
return;
}
@@ -506,13 +507,13 @@
// This is special, since it's not a JS value - as in it's not visible to JS
// code.
m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe));
- info.spill(*m_stream, spillMe, DataFormatStorage);
+ info.spill(m_stream, spillMe, DataFormatStorage);
return;
}
case DataFormatInt32: {
m_jit.store32(info.gpr(), JITCompiler::payloadFor(spillMe));
- info.spill(*m_stream, spillMe, DataFormatInt32);
+ info.spill(m_stream, spillMe, DataFormatInt32);
return;
}
@@ -519,7 +520,7 @@
#if USE(JSVALUE64)
case DataFormatDouble: {
m_jit.storeDouble(info.fpr(), JITCompiler::addressFor(spillMe));
- info.spill(*m_stream, spillMe, DataFormatDouble);
+ info.spill(m_stream, spillMe, DataFormatDouble);
return;
}
@@ -526,7 +527,7 @@
case DataFormatInt52:
case DataFormatStrictInt52: {
m_jit.store64(info.gpr(), JITCompiler::addressFor(spillMe));
- info.spill(*m_stream, spillMe, spillFormat);
+ info.spill(m_stream, spillMe, spillFormat);
return;
}
@@ -542,13 +543,13 @@
// Spill the value, and record it as spilled in its boxed form.
m_jit.store64(reg, JITCompiler::addressFor(spillMe));
- info.spill(*m_stream, spillMe, (DataFormat)(spillFormat | DataFormatJS));
+ info.spill(m_stream, spillMe, (DataFormat)(spillFormat | DataFormatJS));
return;
#elif USE(JSVALUE32_64)
case DataFormatCell:
case DataFormatBoolean: {
m_jit.store32(info.gpr(), JITCompiler::payloadFor(spillMe));
- info.spill(*m_stream, spillMe, spillFormat);
+ info.spill(m_stream, spillMe, spillFormat);
return;
}
@@ -555,7 +556,7 @@
case DataFormatDouble: {
// On JSVALUE32_64 boxing a double is a no-op.
m_jit.storeDouble(info.fpr(), JITCompiler::addressFor(spillMe));
- info.spill(*m_stream, spillMe, DataFormatDouble);
+ info.spill(m_stream, spillMe, DataFormatDouble);
return;
}
@@ -564,7 +565,7 @@
RELEASE_ASSERT(spillFormat & DataFormatJS);
m_jit.store32(info.tagGPR(), JITCompiler::tagFor(spillMe));
m_jit.store32(info.payloadGPR(), JITCompiler::payloadFor(spillMe));
- info.spill(*m_stream, spillMe, spillFormat);
+ info.spill(m_stream, spillMe, spillFormat);
return;
#endif
}
@@ -1781,7 +1782,7 @@
Operand bytecodeReg, VirtualRegister machineReg, DataFormat format)
{
ASSERT(!bytecodeReg.isArgument() || bytecodeReg.virtualRegister().toArgument() >= 0);
- m_stream->appendAndLog(VariableEvent::setLocal(bytecodeReg, machineReg, format));
+ m_stream.appendAndLog(VariableEvent::setLocal(bytecodeReg, machineReg, format));
}
void recordSetLocal(DataFormat format)
@@ -1845,7 +1846,7 @@
InPlaceAbstractState m_state;
AbstractInterpreter<InPlaceAbstractState> m_interpreter;
- VariableEventStream* m_stream;
+ VariableEventStreamBuilder m_stream;
MinifiedGraph* m_minifiedGraph;
Vector<std::unique_ptr<SlowPathGenerator>, 8> m_slowPathGenerators;
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -73,7 +73,7 @@
m_jit.move(Imm32(value.payload()), payloadGPR);
m_gprs.retain(tagGPR, virtualRegister, SpillOrderConstant);
m_gprs.retain(payloadGPR, virtualRegister, SpillOrderConstant);
- info.fillJSValue(*m_stream, tagGPR, payloadGPR, DataFormatJS);
+ info.fillJSValue(m_stream, tagGPR, payloadGPR, DataFormatJS);
} else {
DataFormat spillFormat = info.spillFormat();
ASSERT(spillFormat != DataFormatNone && spillFormat != DataFormatStorage);
@@ -99,7 +99,7 @@
}
m_gprs.retain(tagGPR, virtualRegister, SpillOrderSpilled);
m_gprs.retain(payloadGPR, virtualRegister, SpillOrderSpilled);
- info.fillJSValue(*m_stream, tagGPR, payloadGPR, spillFormat == DataFormatJSDouble ? DataFormatJS : spillFormat);
+ info.fillJSValue(m_stream, tagGPR, payloadGPR, spillFormat == DataFormatJSDouble ? DataFormatJS : spillFormat);
}
return true;
@@ -141,7 +141,7 @@
m_gprs.release(gpr);
m_gprs.retain(tagGPR, virtualRegister, SpillOrderJS);
m_gprs.retain(payloadGPR, virtualRegister, SpillOrderJS);
- info.fillJSValue(*m_stream, tagGPR, payloadGPR, fillFormat);
+ info.fillJSValue(m_stream, tagGPR, payloadGPR, fillFormat);
return true;
}
@@ -199,7 +199,7 @@
usedRegisters.set(JSValueRegs(resultTagGPR, resultPayloadGPR), false);
}
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
JITGetByIdGenerator gen(
m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, usedRegisters, identifier,
JSValueRegs(baseTagGPROrNone, basePayloadGPR), JSValueRegs(resultTagGPR, resultPayloadGPR), InvalidGPRReg, type);
@@ -235,7 +235,7 @@
UNUSED_PARAM(stubInfoGPR);
RegisterSet usedRegisters = this->usedRegisters();
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
JITGetByIdWithThisGenerator gen(
m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, usedRegisters, identifier,
JSValueRegs(resultTagGPR, resultPayloadGPR), JSValueRegs(baseTagGPROrNone, basePayloadGPR), JSValueRegs(thisTagGPR, thisPayloadGPR), InvalidGPRReg);
@@ -783,7 +783,7 @@
ASSERT(!isEmulatedTail || (staticInlineCallFrame && staticInlineCallFrame->getCallerSkippingTailCalls()));
CodeOrigin dynamicOrigin =
isEmulatedTail ? *staticInlineCallFrame->getCallerSkippingTailCalls() : staticOrigin;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(dynamicOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(dynamicOrigin, m_stream.size());
auto* info = m_jit.jitCode()->common.addCallLinkInfo(node->origin.semantic, CallLinkInfo::UseDataIC::No);
info->setUpCall(callType, calleePayloadGPR);
@@ -973,7 +973,7 @@
GPRReg gpr = allocate();
m_jit.move(MacroAssembler::Imm32(edge->asInt32()), gpr);
m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
- info.fillInt32(*m_stream, gpr);
+ info.fillInt32(m_stream, gpr);
returnFormat = DataFormatInt32;
return gpr;
}
@@ -989,7 +989,7 @@
GPRReg gpr = allocate();
m_jit.load32(JITCompiler::payloadFor(virtualRegister), gpr);
m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
- info.fillInt32(*m_stream, gpr);
+ info.fillInt32(m_stream, gpr);
returnFormat = DataFormatInt32;
return gpr;
}
@@ -1007,7 +1007,7 @@
m_gprs.release(tagGPR);
m_gprs.release(payloadGPR);
m_gprs.retain(payloadGPR, virtualRegister, SpillOrderInteger);
- info.fillInt32(*m_stream, payloadGPR);
+ info.fillInt32(m_stream, payloadGPR);
// If !strict we're done, return.
returnFormat = DataFormatInt32;
return payloadGPR;
@@ -1060,7 +1060,7 @@
FPRReg fpr = fprAllocate();
m_jit.loadDouble(TrustedImmPtr(m_jit.addressOfDoubleConstant(edge.node())), fpr);
m_fprs.retain(fpr, virtualRegister, SpillOrderConstant);
- info.fillDouble(*m_stream, fpr);
+ info.fillDouble(m_stream, fpr);
return fpr;
}
@@ -1068,7 +1068,7 @@
FPRReg fpr = fprAllocate();
m_jit.loadDouble(JITCompiler::addressFor(virtualRegister), fpr);
m_fprs.retain(fpr, virtualRegister, SpillOrderSpilled);
- info.fillDouble(*m_stream, fpr);
+ info.fillDouble(m_stream, fpr);
return fpr;
}
@@ -1099,7 +1099,7 @@
GPRReg gpr = allocate();
m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
m_jit.move(TrustedImmPtr(edge->constant()), gpr);
- info.fillCell(*m_stream, gpr);
+ info.fillCell(m_stream, gpr);
return gpr;
}
@@ -1114,7 +1114,7 @@
GPRReg gpr = allocate();
m_jit.load32(JITCompiler::payloadFor(virtualRegister), gpr);
m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
- info.fillCell(*m_stream, gpr);
+ info.fillCell(m_stream, gpr);
return gpr;
}
@@ -1139,7 +1139,7 @@
m_gprs.release(tagGPR);
m_gprs.release(payloadGPR);
m_gprs.retain(payloadGPR, virtualRegister, SpillOrderCell);
- info.fillCell(*m_stream, payloadGPR);
+ info.fillCell(m_stream, payloadGPR);
return payloadGPR;
}
@@ -1180,7 +1180,7 @@
GPRReg gpr = allocate();
m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
m_jit.move(MacroAssembler::TrustedImm32(jsValue.asBoolean()), gpr);
- info.fillBoolean(*m_stream, gpr);
+ info.fillBoolean(m_stream, gpr);
return gpr;
}
@@ -1192,7 +1192,7 @@
GPRReg gpr = allocate();
m_jit.load32(JITCompiler::payloadFor(virtualRegister), gpr);
m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
- info.fillBoolean(*m_stream, gpr);
+ info.fillBoolean(m_stream, gpr);
return gpr;
}
@@ -1215,7 +1215,7 @@
m_gprs.release(tagGPR);
m_gprs.release(payloadGPR);
m_gprs.retain(payloadGPR, virtualRegister, SpillOrderBoolean);
- info.fillBoolean(*m_stream, payloadGPR);
+ info.fillBoolean(m_stream, payloadGPR);
return payloadGPR;
}
@@ -1819,7 +1819,7 @@
std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS);
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITCompiler::JumpList slowCases;
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -84,7 +84,7 @@
if (edge->hasConstant()) {
JSValue jsValue = edge->asJSValue();
m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsValue)), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJS);
+ info.fillJSValue(m_stream, gpr, DataFormatJS);
m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
} else {
DataFormat spillFormat = info.spillFormat();
@@ -102,7 +102,7 @@
DFG_ASSERT(m_graph, m_currentNode, spillFormat & DataFormatJS, spillFormat);
break;
}
- info.fillJSValue(*m_stream, gpr, spillFormat);
+ info.fillJSValue(m_stream, gpr, spillFormat);
}
return gpr;
}
@@ -118,7 +118,7 @@
}
m_gprs.lock(gpr);
m_jit.or64(GPRInfo::numberTagRegister, gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJSInt32);
+ info.fillJSValue(m_stream, gpr, DataFormatJSInt32);
return gpr;
}
@@ -155,7 +155,7 @@
void SpeculativeJIT::cachedGetById(CodeOrigin codeOrigin, GPRReg baseGPR, GPRReg resultGPR, GPRReg stubInfoGPR, GPRReg scratchGPR, CacheableIdentifier identifier, JITCompiler::Jump slowPathTarget, SpillRegistersMode spillMode, AccessType type)
{
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
if (spillMode == DontSpill) {
// We've already flushed registers to the stack, we don't need to spill these.
@@ -195,7 +195,7 @@
void SpeculativeJIT::cachedGetByIdWithThis(CodeOrigin codeOrigin, GPRReg baseGPR, GPRReg thisGPR, GPRReg resultGPR, GPRReg stubInfoGPR, GPRReg scratchGPR, CacheableIdentifier identifier, const JITCompiler::JumpList& slowPathTarget)
{
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
// We've already flushed registers to the stack, we don't need to spill these.
usedRegisters.set(baseGPR, false);
@@ -921,7 +921,7 @@
CodeOrigin dynamicOrigin =
isEmulatedTail ? *staticInlineCallFrame->getCallerSkippingTailCalls() : staticOrigin;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(dynamicOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(dynamicOrigin, m_stream.size());
auto setResultAndResetStack = [&] () {
GPRFlushedCallResult result(this);
@@ -1101,7 +1101,7 @@
m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
ASSERT(edge->isInt32Constant());
m_jit.move(MacroAssembler::Imm32(edge->asInt32()), gpr);
- info.fillInt32(*m_stream, gpr);
+ info.fillInt32(m_stream, gpr);
returnFormat = DataFormatInt32;
return gpr;
}
@@ -1116,17 +1116,17 @@
// If we know this was spilled as an integer we can fill without checking.
if (strict) {
m_jit.load32(JITCompiler::addressFor(virtualRegister), gpr);
- info.fillInt32(*m_stream, gpr);
+ info.fillInt32(m_stream, gpr);
returnFormat = DataFormatInt32;
return gpr;
}
if (spillFormat == DataFormatInt32) {
m_jit.load32(JITCompiler::addressFor(virtualRegister), gpr);
- info.fillInt32(*m_stream, gpr);
+ info.fillInt32(m_stream, gpr);
returnFormat = DataFormatInt32;
} else {
m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJSInt32);
+ info.fillJSValue(m_stream, gpr, DataFormatJSInt32);
returnFormat = DataFormatJSInt32;
}
return gpr;
@@ -1134,7 +1134,7 @@
m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
// Fill as JSValue, and fall through.
- info.fillJSValue(*m_stream, gpr, DataFormatJSInt32);
+ info.fillJSValue(m_stream, gpr, DataFormatJSInt32);
m_gprs.unlock(gpr);
FALLTHROUGH;
}
@@ -1146,7 +1146,7 @@
m_gprs.lock(gpr);
if (type & ~SpecInt32Only)
speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchIfNotInt32(gpr));
- info.fillJSValue(*m_stream, gpr, DataFormatJSInt32);
+ info.fillJSValue(m_stream, gpr, DataFormatJSInt32);
// If !strict we're done, return.
if (!strict) {
returnFormat = DataFormatJSInt32;
@@ -1168,7 +1168,7 @@
result = allocate();
else {
m_gprs.lock(gpr);
- info.fillInt32(*m_stream, gpr);
+ info.fillInt32(m_stream, gpr);
result = gpr;
}
m_jit.zeroExtend32ToWord(gpr, result);
@@ -1249,7 +1249,7 @@
if (desiredFormat == DataFormatInt52)
value = value << JSValue::int52ShiftAmount;
m_jit.move(MacroAssembler::Imm64(value), gpr);
- info.fillGPR(*m_stream, gpr, desiredFormat);
+ info.fillGPR(m_stream, gpr, desiredFormat);
return gpr;
}
@@ -1263,12 +1263,12 @@
if (desiredFormat == DataFormatStrictInt52) {
if (spillFormat == DataFormatInt52)
m_jit.rshift64(TrustedImm32(JSValue::int52ShiftAmount), gpr);
- info.fillStrictInt52(*m_stream, gpr);
+ info.fillStrictInt52(m_stream, gpr);
return gpr;
}
if (spillFormat == DataFormatStrictInt52)
m_jit.lshift64(TrustedImm32(JSValue::int52ShiftAmount), gpr);
- info.fillInt52(*m_stream, gpr);
+ info.fillInt52(m_stream, gpr);
return gpr;
}
@@ -1284,7 +1284,7 @@
unlock(gpr);
gpr = result;
} else
- info.fillInt52(*m_stream, gpr);
+ info.fillInt52(m_stream, gpr);
m_jit.lshift64(TrustedImm32(JSValue::int52ShiftAmount), gpr);
return gpr;
}
@@ -1301,7 +1301,7 @@
unlock(gpr);
gpr = result;
} else
- info.fillStrictInt52(*m_stream, gpr);
+ info.fillStrictInt52(m_stream, gpr);
m_jit.rshift64(TrustedImm32(JSValue::int52ShiftAmount), gpr);
return gpr;
}
@@ -1334,7 +1334,7 @@
}
m_fprs.retain(fpr, virtualRegister, SpillOrderDouble);
- info.fillDouble(*m_stream, fpr);
+ info.fillDouble(m_stream, fpr);
return fpr;
}
if (mayHaveTypeCheck(edge.useKind()))
@@ -1353,7 +1353,7 @@
FPRReg fpr = fprAllocate();
m_jit.loadDouble(JITCompiler::addressFor(virtualRegister), fpr);
m_fprs.retain(fpr, virtualRegister, SpillOrderDouble);
- info.fillDouble(*m_stream, fpr);
+ info.fillDouble(m_stream, fpr);
return fpr;
}
@@ -1389,7 +1389,7 @@
JSValue jsValue = edge->asJSValue();
m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsValue)), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJSCell);
+ info.fillJSValue(m_stream, gpr, DataFormatJSCell);
return gpr;
}
@@ -1396,10 +1396,10 @@
m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJS);
+ info.fillJSValue(m_stream, gpr, DataFormatJS);
if (type & ~SpecCellCheck)
speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchIfNotCell(JSValueRegs(gpr)));
- info.fillJSValue(*m_stream, gpr, DataFormatJSCell);
+ info.fillJSValue(m_stream, gpr, DataFormatJSCell);
return gpr;
}
@@ -1420,7 +1420,7 @@
m_gprs.lock(gpr);
if (type & ~SpecCellCheck)
speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchIfNotCell(JSValueRegs(gpr)));
- info.fillJSValue(*m_stream, gpr, DataFormatJSCell);
+ info.fillJSValue(m_stream, gpr, DataFormatJSCell);
return gpr;
}
@@ -1467,7 +1467,7 @@
JSValue jsValue = edge->asJSValue();
m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsValue)), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJSBoolean);
+ info.fillJSValue(m_stream, gpr, DataFormatJSBoolean);
return gpr;
}
DFG_ASSERT(m_graph, m_currentNode, info.spillFormat() & DataFormatJS, info.spillFormat());
@@ -1474,13 +1474,13 @@
m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJS);
+ info.fillJSValue(m_stream, gpr, DataFormatJS);
if (type & ~SpecBoolean) {
m_jit.xor64(TrustedImm32(JSValue::ValueFalse), gpr);
speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchTest64(MacroAssembler::NonZero, gpr, TrustedImm32(static_cast<int32_t>(~1))), SpeculationRecovery(BooleanSpeculationCheck, gpr, InvalidGPRReg));
m_jit.xor64(TrustedImm32(JSValue::ValueFalse), gpr);
}
- info.fillJSValue(*m_stream, gpr, DataFormatJSBoolean);
+ info.fillJSValue(m_stream, gpr, DataFormatJSBoolean);
return gpr;
}
@@ -1499,7 +1499,7 @@
speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchTest64(MacroAssembler::NonZero, gpr, TrustedImm32(static_cast<int32_t>(~1))), SpeculationRecovery(BooleanSpeculationCheck, gpr, InvalidGPRReg));
m_jit.xor64(TrustedImm32(JSValue::ValueFalse), gpr);
}
- info.fillJSValue(*m_stream, gpr, DataFormatJSBoolean);
+ info.fillJSValue(m_stream, gpr, DataFormatJSBoolean);
return gpr;
}
@@ -1574,7 +1574,7 @@
m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
ASSERT(jsValue.isBigInt32());
m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsValue)), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJSBigInt32);
+ info.fillJSValue(m_stream, gpr, DataFormatJSBigInt32);
return gpr;
}
@@ -1589,13 +1589,13 @@
}
if (spillFormat == DataFormatJSBigInt32) {
m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJSBigInt32);
+ info.fillJSValue(m_stream, gpr, DataFormatJSBigInt32);
return gpr;
}
m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
- info.fillJSValue(*m_stream, gpr, DataFormatJS);
+ info.fillJSValue(m_stream, gpr, DataFormatJS);
m_gprs.unlock(gpr);
FALLTHROUGH;
}
@@ -1610,7 +1610,7 @@
speculationCheck(BadType, JSValueRegs(gpr), edge, failureCases);
unlock(tempGPR);
}
- info.fillJSValue(*m_stream, gpr, DataFormatJSBigInt32);
+ info.fillJSValue(m_stream, gpr, DataFormatJSBigInt32);
return gpr;
}
@@ -2459,7 +2459,7 @@
GPRReg resultGPR = resultRegs.gpr();
CodeOrigin codeOrigin = node->origin.semantic;
- CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+ CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
RegisterSet usedRegisters = this->usedRegisters();
JITCompiler::JumpList slowCases;
@@ -6003,7 +6003,7 @@
Vector<SilentRegisterSavePlan> savePlans;
silentSpillAllRegistersImpl(false, savePlans, tempGPR);
- unsigned streamIndex = m_stream->size();
+ unsigned streamIndex = m_stream.size();
m_jit.jitCode()->bytecodeIndexToStreamIndex.add(bytecodeIndex, streamIndex);
addSlowPathGeneratorLambda([=, this]() {
Modified: trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -38,9 +38,9 @@
namespace JSC { namespace DFG {
-void VariableEventStream::logEvent(const VariableEvent& event)
+void VariableEventStreamBuilder::logEvent(const VariableEvent& event)
{
- dataLogF("seq#%u:", static_cast<unsigned>(size()));
+ dataLogF("seq#%u:", static_cast<unsigned>(m_stream.size()));
event.dump(WTF::dataFile());
dataLogLn(" ");
}
@@ -174,7 +174,7 @@
// Step 1: Find the last checkpoint, and figure out the number of virtual registers as we go.
unsigned startIndex = index - 1;
- while (at(startIndex).kind() != Reset)
+ while (m_stream.at(startIndex).kind() != Reset)
startIndex--;
// Step 2: Create a mock-up of the DFG's state and execute the events.
@@ -183,7 +183,7 @@
operandSources[i] = ValueSource(SourceIsDead);
HashMap<MinifiedID, MinifiedGenerationInfo> generationInfos;
for (unsigned i = startIndex; i < index; ++i) {
- const VariableEvent& event = at(i);
+ const VariableEvent& event = m_stream.at(i);
dataLogLnIf(verbose, "Processing event ", event);
switch (event.kind()) {
case Reset:
Modified: trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.h (293628 => 293629)
--- trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.h 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.h 2022-04-29 20:05:32 UTC (rev 293629)
@@ -41,16 +41,14 @@
unsigned numberOfRegisters;
};
-class VariableEventStream : public Vector<VariableEvent> {
- static constexpr bool verbose = false;
+class VariableEventStream {
public:
- void appendAndLog(const VariableEvent& event)
+ VariableEventStream() = default;
+ VariableEventStream(Vector<VariableEvent>&& stream)
+ : m_stream(WTFMove(stream))
{
- if (verbose)
- logEvent(event);
- append(event);
}
-
+
unsigned reconstruct(CodeBlock*, CodeOrigin, MinifiedGraph&, unsigned index, Operands<ValueRecovery>&) const;
unsigned reconstruct(CodeBlock*, CodeOrigin, MinifiedGraph&, unsigned index, Operands<ValueRecovery>&, Vector<UndefinedOperandSpan>*) const;
@@ -64,7 +62,31 @@
CodeBlock*, CodeOrigin, MinifiedGraph&,
unsigned index, Operands<ValueRecovery>&, Vector<UndefinedOperandSpan>*) const;
+ FixedVector<VariableEvent> m_stream;
+};
+
+class VariableEventStreamBuilder {
+ WTF_MAKE_NONCOPYABLE(VariableEventStreamBuilder);
+public:
+ static constexpr bool verbose = false;
+
+ VariableEventStreamBuilder() = default;
+
+ void appendAndLog(const VariableEvent& event)
+ {
+ if (verbose)
+ logEvent(event);
+ m_stream.append(event);
+ }
+
+ unsigned size() const { return m_stream.size(); }
+
+ Vector<VariableEvent> finalize() { return WTFMove(m_stream); }
+
+private:
void logEvent(const VariableEvent&);
+
+ Vector<VariableEvent> m_stream;
};
} } // namespace JSC::DFG
Modified: trunk/Source/_javascript_Core/ftl/FTLLink.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/ftl/FTLLink.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/ftl/FTLLink.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -150,6 +150,7 @@
state.jitCode->initializeB3Code(b3CodeRef);
state.jitCode->initializeArityCheckEntrypoint(arityCheckCodeRef);
+ state.jitCode->common.m_jumpReplacements = WTFMove(state.jumpReplacements);
}
state.finalizer->entrypointLinkBuffer = WTFMove(linkBuffer);
Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (293628 => 293629)
--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp 2022-04-29 20:05:32 UTC (rev 293629)
@@ -11934,7 +11934,7 @@
JumpReplacement jumpReplacement(
linkBuffer.locationOf<JSInternalPtrTag>(label),
linkBuffer.locationOf<OSRExitPtrTag>(handle->label));
- jitCode->common.m_jumpReplacements.append(jumpReplacement);
+ state->jumpReplacements.append(jumpReplacement);
});
});
Modified: trunk/Source/_javascript_Core/ftl/FTLState.h (293628 => 293629)
--- trunk/Source/_javascript_Core/ftl/FTLState.h 2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/ftl/FTLState.h 2022-04-29 20:05:32 UTC (rev 293629)
@@ -30,6 +30,7 @@
#include "B3Procedure.h"
#include "DFGCommon.h"
#include "DFGGraph.h"
+#include "DFGJumpReplacement.h"
#include "FTLAbbreviatedTypes.h"
#include "FTLGeneratedFunction.h"
#include "FTLJITCode.h"
@@ -84,6 +85,7 @@
RefPtr<PatchpointExceptionHandle> defaultExceptionHandle;
Box<CCallHelpers::Label> exceptionHandler { Box<CCallHelpers::Label>::create() };
B3::Air::StackSlot* capturedValue { nullptr };
+ Vector<DFG::JumpReplacement> jumpReplacements;
};
} } // namespace JSC::FTL