Skip to content

Commit

Permalink
[JSC] Baseline JIT IC should not have ability to change stubInfoGPR
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=260645
rdar://114364991

Reviewed by Mark Lam.

This patch refactors Baseline Data IC so that we ensure that we are always using predefined stubInfoGPR.
This is important to introduce handler IC where IC has strong assumptions on register use.

* Source/JavaScriptCore/jit/JITCall.cpp:
(JSC::JIT::emit_op_iterator_open):
(JSC::JIT::emit_op_iterator_next):
* Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp:
(JSC::JITGetByIdGenerator::generateBaselineDataICFastPath):
(JSC::JITGetByIdWithThisGenerator::generateBaselineDataICFastPath):
(JSC::JITPutByIdGenerator::generateBaselineDataICFastPath):
(JSC::JITDelByValGenerator::generateBaselineDataICFastPath):
(JSC::JITDelByIdGenerator::generateBaselineDataICFastPath):
(JSC::JITInByValGenerator::generateBaselineDataICFastPath):
(JSC::JITInByIdGenerator::generateBaselineDataICFastPath):
(JSC::JITInstanceOfGenerator::generateBaselineDataICFastPath):
(JSC::JITGetByValGenerator::generateBaselineDataICFastPath):
(JSC::JITGetByValWithThisGenerator::generateBaselineDataICFastPath):
(JSC::JITPutByValGenerator::generateBaselineDataICFastPath):
(JSC::JITPrivateBrandAccessGenerator::generateBaselineDataICFastPath):
* Source/JavaScriptCore/jit/JITInlineCacheGenerator.h:
* Source/JavaScriptCore/jit/JITOpcodes.cpp:
(JSC::JIT::emit_op_instanceof):
* Source/JavaScriptCore/jit/JITPropertyAccess.cpp:
(JSC::JIT::emit_op_get_by_val):
(JSC::JIT::emit_op_get_private_name):
(JSC::JIT::emit_op_set_private_brand):
(JSC::JIT::emit_op_check_private_brand):
(JSC::JIT::emit_op_put_by_val):
(JSC::JIT::emit_op_put_private_name):
(JSC::JIT::emit_op_del_by_id):
(JSC::JIT::emit_op_del_by_val):
(JSC::JIT::emit_op_try_get_by_id):
(JSC::JIT::emit_op_get_by_id_direct):
(JSC::JIT::emit_op_get_by_id):
(JSC::JIT::emit_op_get_by_id_with_this):
(JSC::JIT::emit_op_put_by_id):
(JSC::JIT::emit_op_in_by_id):
(JSC::JIT::emit_op_in_by_val):
(JSC::JIT::emitHasPrivate):
(JSC::JIT::emit_op_get_by_val_with_this):
(JSC::JIT::emit_op_enumerator_get_by_val):
(JSC::JIT::emit_op_enumerator_put_by_val):

Canonical link: https://commits.webkit.org/267220@main
  • Loading branch information
Constellation committed Aug 24, 2023
1 parent 4cb726f commit 51e8e5e
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 48 deletions.
6 changes: 3 additions & 3 deletions Source/JavaScriptCore/jit/JITCall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@ void JIT::emit_op_iterator_open(const JSInstruction* instruction)
CacheableIdentifier::createFromImmortalIdentifier(ident->impl()), baseJSR, resultJSR, stubInfoGPR, AccessType::GetById);
gen.m_unlinkedStubInfoConstantIndex = stubInfoIndex;

gen.generateBaselineDataICFastPath(*this, stubInfoIndex, stubInfoGPR);
gen.generateBaselineDataICFastPath(*this, stubInfoIndex);
resetSP(); // We might OSR exit here, so we need to conservatively reset SP
addSlowCase();
m_getByIds.append(gen);
Expand Down Expand Up @@ -576,7 +576,7 @@ void JIT::emit_op_iterator_next(const JSInstruction* instruction)
CacheableIdentifier::createFromImmortalIdentifier(vm().propertyNames->done.impl()), returnValueJSR, doneJSR, stubInfoGPR, AccessType::GetById);
gen.m_unlinkedStubInfoConstantIndex = stubInfoIndex;

gen.generateBaselineDataICFastPath(*this, stubInfoIndex, stubInfoGPR);
gen.generateBaselineDataICFastPath(*this, stubInfoIndex);
resetSP(); // We might OSR exit here, so we need to conservatively reset SP
addSlowCase();
m_getByIds.append(gen);
Expand Down Expand Up @@ -604,7 +604,7 @@ void JIT::emit_op_iterator_next(const JSInstruction* instruction)
CacheableIdentifier::createFromImmortalIdentifier(vm().propertyNames->value.impl()), baseJSR, resultJSR, stubInfoGPR, AccessType::GetById);
gen.m_unlinkedStubInfoConstantIndex = stubInfoIndex;

gen.generateBaselineDataICFastPath(*this, stubInfoIndex, stubInfoGPR);
gen.generateBaselineDataICFastPath(*this, stubInfoIndex);
resetSP(); // We might OSR exit here, so we need to conservatively reset SP
addSlowCase();
m_getByIds.append(gen);
Expand Down
75 changes: 62 additions & 13 deletions Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,12 +160,13 @@ void JITGetByIdGenerator::generateFastPath(CCallHelpers& jit, GPRReg scratchGPR)
m_done = jit.label();
}

void JITGetByIdGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo, GPRReg stubInfoGPR)
void JITGetByIdGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
m_start = jit.label();

using BaselineJITRegisters::GetById::baseJSR;
using BaselineJITRegisters::GetById::resultJSR;
using BaselineJITRegisters::GetById::FastPath::stubInfoGPR;
using BaselineJITRegisters::GetById::FastPath::scratchGPR;

jit.loadConstant(stubInfo, stubInfoGPR);
Expand Down Expand Up @@ -210,12 +211,13 @@ void JITGetByIdWithThisGenerator::generateFastPath(CCallHelpers& jit, GPRReg scr
m_done = jit.label();
}

void JITGetByIdWithThisGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo, GPRReg stubInfoGPR)
void JITGetByIdWithThisGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
m_start = jit.label();

using BaselineJITRegisters::GetByIdWithThis::baseJSR;
using BaselineJITRegisters::GetByIdWithThis::resultJSR;
using BaselineJITRegisters::GetByIdWithThis::FastPath::stubInfoGPR;
using BaselineJITRegisters::GetByIdWithThis::FastPath::scratchGPR;

jit.loadConstant(stubInfo, stubInfoGPR);
Expand Down Expand Up @@ -255,17 +257,16 @@ static void generatePutByIdInlineAccess(CCallHelpers& jit, GPRReg stubInfoGPR, J
jit.storeProperty(valueJSR, baseJSR.payloadGPR(), scratchGPR, scratch2GPR);
}

void JITPutByIdGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo, GPRReg stubInfoGPR)
void JITPutByIdGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
m_start = jit.label();

jit.loadConstant(stubInfo, stubInfoGPR);

using BaselineJITRegisters::PutById::baseJSR;
using BaselineJITRegisters::PutById::valueJSR;
using BaselineJITRegisters::PutById::FastPath::stubInfoGPR;
using BaselineJITRegisters::PutById::FastPath::scratchGPR;
using BaselineJITRegisters::PutById::FastPath::scratch2GPR;

m_start = jit.label();
jit.loadConstant(stubInfo, stubInfoGPR);
generatePutByIdInlineAccess(jit, stubInfoGPR, baseJSR, valueJSR, scratchGPR, scratch2GPR);
m_done = jit.label();
}
Expand Down Expand Up @@ -343,6 +344,12 @@ void JITDelByValGenerator::generateFastPath(CCallHelpers& jit)
m_done = jit.label();
}

void JITDelByValGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
using BaselineJITRegisters::DelByVal::FastPath::stubInfoGPR;
JITInlineCacheGenerator::generateBaselineDataICFastPath(jit, stubInfo, stubInfoGPR);
}

void JITDelByValGenerator::finalize(LinkBuffer& fastPath, LinkBuffer& slowPath)
{
ASSERT(m_stubInfo);
Expand Down Expand Up @@ -375,6 +382,12 @@ void JITDelByIdGenerator::generateFastPath(CCallHelpers& jit)
m_done = jit.label();
}

void JITDelByIdGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
using BaselineJITRegisters::DelById::FastPath::stubInfoGPR;
JITInlineCacheGenerator::generateBaselineDataICFastPath(jit, stubInfo, stubInfoGPR);
}

void JITDelByIdGenerator::finalize(LinkBuffer& fastPath, LinkBuffer& slowPath)
{
ASSERT(m_stubInfo);
Expand Down Expand Up @@ -403,6 +416,12 @@ void JITInByValGenerator::generateFastPath(CCallHelpers& jit)
m_done = jit.label();
}

void JITInByValGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
using BaselineJITRegisters::InByVal::stubInfoGPR;
JITInlineCacheGenerator::generateBaselineDataICFastPath(jit, stubInfo, stubInfoGPR);
}

void JITInByValGenerator::finalize(
LinkBuffer& fastPath, LinkBuffer& slowPath)
{
Expand Down Expand Up @@ -454,18 +473,16 @@ void JITInByIdGenerator::generateFastPath(CCallHelpers& jit, GPRReg scratchGPR)
m_done = jit.label();
}

void JITInByIdGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo, GPRReg stubInfoGPR)
void JITInByIdGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
m_start = jit.label();

jit.loadConstant(stubInfo, stubInfoGPR);

using BaselineJITRegisters::InById::baseJSR;
using BaselineJITRegisters::InById::resultJSR;
using BaselineJITRegisters::InById::stubInfoGPR;
using BaselineJITRegisters::InById::scratchGPR;

m_start = jit.label();
jit.loadConstant(stubInfo, stubInfoGPR);
generateInByIdInlineAccess(jit, stubInfoGPR, baseJSR, scratchGPR, resultJSR);

m_done = jit.label();
}

Expand Down Expand Up @@ -502,6 +519,12 @@ void JITInstanceOfGenerator::generateFastPath(CCallHelpers& jit)
m_done = jit.label();
}

void JITInstanceOfGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
using BaselineJITRegisters::Instanceof::FastPath::stubInfoGPR;
JITInlineCacheGenerator::generateBaselineDataICFastPath(jit, stubInfo, stubInfoGPR);
}

void JITInstanceOfGenerator::finalize(LinkBuffer& fastPath, LinkBuffer& slowPath)
{
ASSERT(m_stubInfo);
Expand Down Expand Up @@ -532,6 +555,12 @@ void JITGetByValGenerator::generateFastPath(CCallHelpers& jit)
m_done = jit.label();
}

void JITGetByValGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
using BaselineJITRegisters::GetByVal::FastPath::stubInfoGPR;
JITInlineCacheGenerator::generateBaselineDataICFastPath(jit, stubInfo, stubInfoGPR);
}

void JITGetByValGenerator::generateEmptyPath(CCallHelpers& jit)
{
m_start = jit.label();
Expand Down Expand Up @@ -568,6 +597,14 @@ void JITGetByValWithThisGenerator::generateFastPath(CCallHelpers& jit)
m_done = jit.label();
}

#if USE(JSVALUE64)
void JITGetByValWithThisGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
using BaselineJITRegisters::GetByValWithThis::FastPath::stubInfoGPR;
JITInlineCacheGenerator::generateBaselineDataICFastPath(jit, stubInfo, stubInfoGPR);
}
#endif

void JITGetByValWithThisGenerator::generateEmptyPath(CCallHelpers& jit)
{
m_start = jit.label();
Expand Down Expand Up @@ -604,6 +641,12 @@ void JITPutByValGenerator::generateFastPath(CCallHelpers& jit)
m_done = jit.label();
}

void JITPutByValGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
using BaselineJITRegisters::PutByVal::stubInfoGPR;
JITInlineCacheGenerator::generateBaselineDataICFastPath(jit, stubInfo, stubInfoGPR);
}

void JITPutByValGenerator::finalize(LinkBuffer& fastPath, LinkBuffer& slowPath)
{
ASSERT(m_stubInfo);
Expand Down Expand Up @@ -633,6 +676,12 @@ void JITPrivateBrandAccessGenerator::generateFastPath(CCallHelpers& jit)
m_done = jit.label();
}

void JITPrivateBrandAccessGenerator::generateBaselineDataICFastPath(JIT& jit, unsigned stubInfo)
{
using BaselineJITRegisters::PrivateBrand::FastPath::stubInfoGPR;
JITInlineCacheGenerator::generateBaselineDataICFastPath(jit, stubInfo, stubInfoGPR);
}

void JITPrivateBrandAccessGenerator::finalize(LinkBuffer& fastPath, LinkBuffer& slowPath)
{
ASSERT(m_stubInfo);
Expand Down
19 changes: 14 additions & 5 deletions Source/JavaScriptCore/jit/JITInlineCacheGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ class JITInlineCacheGenerator {
LinkBuffer& fastPathLinkBuffer, LinkBuffer& slowPathLinkBuffer,
CodeLocationLabel<JITStubRoutinePtrTag> start);

void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant, GPRReg stubInfoGPR);
#if ENABLE(DFG_JIT)
void generateDFGDataICFastPath(DFG::JITCompiler&, unsigned stubInfoConstant, GPRReg stubInfoGPR);
#endif
Expand All @@ -99,6 +98,8 @@ class JITInlineCacheGenerator {
}

protected:
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant, GPRReg stubInfoGPR);

StructureStubInfo* m_stubInfo { nullptr };
AccessType m_accessType;

Expand Down Expand Up @@ -171,7 +172,7 @@ class JITGetByIdGenerator final : public JITByIdGenerator {
JSValueRegs base, JSValueRegs value, GPRReg stubInfoGPR, AccessType);

void generateFastPath(CCallHelpers&, GPRReg scratchGPR);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant, GPRReg stubInfoGPR);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);
#if ENABLE(DFG_JIT)
void generateDFGDataICFastPath(DFG::JITCompiler&, unsigned stubInfoConstant, JSValueRegs baseJSR, JSValueRegs resultJSR, GPRReg stubInfoGPR, GPRReg scratchGPR);
#endif
Expand All @@ -197,7 +198,7 @@ class JITGetByIdWithThisGenerator final : public JITByIdGenerator {
JSValueRegs value, JSValueRegs base, JSValueRegs thisRegs, GPRReg stubInfoGPR);

void generateFastPath(CCallHelpers&, GPRReg scratchGPR);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant, GPRReg stubInfoGPR);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);
#if ENABLE(DFG_JIT)
void generateDFGDataICFastPath(DFG::JITCompiler&, unsigned stubInfoConstant, JSValueRegs baseJSR, JSValueRegs resultJSR, GPRReg stubInfoGPR, GPRReg scratchGPR);
#endif
Expand Down Expand Up @@ -227,7 +228,7 @@ class JITPutByIdGenerator final : public JITByIdGenerator {
JSValueRegs base, JSValueRegs value, GPRReg stubInfoGPR, GPRReg scratch, ECMAMode, AccessType);

void generateFastPath(CCallHelpers&, GPRReg scratchGPR, GPRReg scratch2GPR);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant, GPRReg stubInfoGPR);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);
#if ENABLE(DFG_JIT)
void generateDFGDataICFastPath(DFG::JITCompiler&, unsigned stubInfoConstant, JSValueRegs baseJSR, JSValueRegs valueJSR, GPRReg stubInfoGPR, GPRReg scratchGPR, GPRReg scratch2GPR);
#endif
Expand Down Expand Up @@ -269,6 +270,7 @@ class JITPutByValGenerator final : public JITInlineCacheGenerator {
void finalize(LinkBuffer& fastPathLinkBuffer, LinkBuffer& slowPathLinkBuffer);

void generateFastPath(CCallHelpers&);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);

template<typename StubInfo>
static void setUpStubInfo(StubInfo& stubInfo,
Expand Down Expand Up @@ -329,6 +331,7 @@ class JITDelByValGenerator final : public JITInlineCacheGenerator {
LinkBuffer& fastPathLinkBuffer, LinkBuffer& slowPathLinkBuffer);

void generateFastPath(CCallHelpers&);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);

template<typename StubInfo>
static void setUpStubInfo(StubInfo& stubInfo,
Expand Down Expand Up @@ -377,6 +380,7 @@ class JITDelByIdGenerator final : public JITInlineCacheGenerator {
LinkBuffer& fastPathLinkBuffer, LinkBuffer& slowPathLinkBuffer);

void generateFastPath(CCallHelpers&);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);

template<typename StubInfo>
static void setUpStubInfo(StubInfo& stubInfo,
Expand Down Expand Up @@ -424,6 +428,7 @@ class JITInByValGenerator : public JITInlineCacheGenerator {
LinkBuffer& fastPathLinkBuffer, LinkBuffer& slowPathLinkBuffer);

void generateFastPath(CCallHelpers&);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);

template<typename StubInfo>
static void setUpStubInfo(StubInfo& stubInfo,
Expand Down Expand Up @@ -462,7 +467,7 @@ class JITInByIdGenerator final : public JITByIdGenerator {
JSValueRegs base, JSValueRegs value, GPRReg stubInfoGPR);

void generateFastPath(CCallHelpers&, GPRReg scratchGPR);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant, GPRReg stubInfoGPR);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);
#if ENABLE(DFG_JIT)
void generateDFGDataICFastPath(DFG::JITCompiler&, unsigned stubInfoConstant, JSValueRegs baseJSR, JSValueRegs resultJSR, GPRReg stubInfoGPR, GPRReg scratchGPR);
#endif
Expand All @@ -487,6 +492,7 @@ class JITInstanceOfGenerator final : public JITInlineCacheGenerator {
bool prototypeIsKnownObject = false);

void generateFastPath(CCallHelpers&);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);

CCallHelpers::Jump slowPathJump() const
{
Expand Down Expand Up @@ -545,6 +551,7 @@ class JITGetByValGenerator final : public JITInlineCacheGenerator {
LinkBuffer& fastPathLinkBuffer, LinkBuffer& slowPathLinkBuffer);

void generateFastPath(CCallHelpers&);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);

void generateEmptyPath(CCallHelpers&);

Expand Down Expand Up @@ -597,6 +604,7 @@ class JITGetByValWithThisGenerator final : public JITInlineCacheGenerator {
void finalize(LinkBuffer& fastPathLinkBuffer, LinkBuffer& slowPathLinkBuffer);

void generateFastPath(CCallHelpers&);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);

void generateEmptyPath(CCallHelpers&);

Expand Down Expand Up @@ -653,6 +661,7 @@ class JITPrivateBrandAccessGenerator final : public JITInlineCacheGenerator {
LinkBuffer& fastPathLinkBuffer, LinkBuffer& slowPathLinkBuffer);

void generateFastPath(CCallHelpers&);
void generateBaselineDataICFastPath(JIT&, unsigned stubInfoConstant);

template<typename StubInfo>
static void setUpStubInfo(StubInfo& stubInfo,
Expand Down
2 changes: 1 addition & 1 deletion Source/JavaScriptCore/jit/JITOpcodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ void JIT::emit_op_instanceof(const JSInstruction* currentInstruction)
stubInfoGPR);
gen.m_unlinkedStubInfoConstantIndex = stubInfoIndex;

gen.generateBaselineDataICFastPath(*this, stubInfoIndex, stubInfoGPR);
gen.generateBaselineDataICFastPath(*this, stubInfoIndex);
#if USE(JSVALUE32_64)
boxBoolean(resultJSR.payloadGPR(), resultJSR);
#endif
Expand Down
Loading

0 comments on commit 51e8e5e

Please sign in to comment.