Revert "Try inlining the LdGblAddr(Def) helpers" (commit bc1e471).
This used to look perf-neutral with a slight instruction win... after I actually landed it, it looks like a big, consistent negative for perf.
Esse commit está contido em:
@@ -4646,40 +4646,27 @@ void CodeGenerator::cgAKExists(IRInstruction* inst) {
|
||||
ArgGroup(m_regs).ssa(key).ssa(arr));
|
||||
}
|
||||
|
||||
HOT_FUNC_VM static TypedValue* ldGblAddrHelper(StringData* name) {
|
||||
return g_vmContext->m_globalVarEnv->lookup(name);
|
||||
}
|
||||
|
||||
HOT_FUNC_VM static TypedValue* ldGblAddrDefHelper(StringData* name) {
|
||||
TypedValue* r = g_vmContext->m_globalVarEnv->lookupAdd(name);
|
||||
decRefStr(name);
|
||||
return r;
|
||||
}
|
||||
|
||||
void CodeGenerator::cgLdGblAddr(IRInstruction* inst) {
|
||||
auto dstReg = m_regs[inst->getDst()].getReg();
|
||||
auto rEC = rScratch;
|
||||
// TODO(#2384005): If we create separate opcodes for loading the VM
|
||||
// context and the global variable environment we may find some CSE
|
||||
// opportunities that aren't currently exploited.
|
||||
emitGetGContext(m_as, rEC);
|
||||
m_as.loadq(rEC[offsetof(VMExecutionContext, m_globalVarEnv)], rEC);
|
||||
ArgGroup args = ArgGroup(m_regs)
|
||||
.reg(rEC)
|
||||
.ssa(inst->getSrc(0));
|
||||
cgCallHelper(m_as,
|
||||
(TCA)getMethodPtr(&VarEnv::lookup),
|
||||
dstReg,
|
||||
kNoSyncPoint,
|
||||
args);
|
||||
cgCallHelper(m_as, (TCA)ldGblAddrHelper, dstReg, kNoSyncPoint,
|
||||
ArgGroup(m_regs).ssa(inst->getSrc(0)));
|
||||
m_as.testq(dstReg, dstReg);
|
||||
emitFwdJcc(CC_Z, inst->getTaken());
|
||||
}
|
||||
|
||||
void CodeGenerator::cgLdGblAddrDef(IRInstruction* inst) {
|
||||
auto dstReg = m_regs[inst->getDst()].getReg();
|
||||
auto rEC = rScratch;
|
||||
// TODO(#2384005): see LdGblAddr
|
||||
emitGetGContext(m_as, rEC);
|
||||
m_as.loadq(rEC[offsetof(VMExecutionContext, m_globalVarEnv)], rEC);
|
||||
ArgGroup args = ArgGroup(m_regs)
|
||||
.reg(rEC)
|
||||
.ssa(inst->getSrc(0));
|
||||
cgCallHelper(m_as,
|
||||
(TCA)getMethodPtr(&VarEnv::lookupAdd),
|
||||
dstReg,
|
||||
kNoSyncPoint,
|
||||
args);
|
||||
cgCallHelper(m_as, (TCA)ldGblAddrDefHelper, inst->getDst(), kNoSyncPoint,
|
||||
ArgGroup(m_regs).ssa(inst->getSrc(0)));
|
||||
}
|
||||
|
||||
void CodeGenerator::cgJmpZeroHelper(IRInstruction* inst,
|
||||
|
||||
@@ -1199,10 +1199,7 @@ SSATmp* HhbcTranslator::emitLdGblAddr(const StringData* gblName, Block* block) {
|
||||
}
|
||||
|
||||
SSATmp* HhbcTranslator::emitLdGblAddrDef(const StringData* gblName) {
|
||||
SSATmp* name = getStrName(gblName);
|
||||
SSATmp* addr = gen(LdGblAddrDef, name);
|
||||
gen(DecRef, name);
|
||||
return addr;
|
||||
return gen(LdGblAddrDef, getStrName(gblName));
|
||||
}
|
||||
|
||||
void HhbcTranslator::emitIncDecS(bool pre, bool inc) {
|
||||
|
||||
@@ -890,7 +890,7 @@ void TranslatorX64::emitIncRefGeneric(PhysReg base, int disp) {
|
||||
emitIncRefGenericRegSafe(base, disp, r(tmpReg));
|
||||
}
|
||||
|
||||
void emitGetGContext(X64Assembler& a, PhysReg dest) {
|
||||
static void emitGetGContext(X64Assembler& a, PhysReg dest) {
|
||||
emitTLSLoad<ExecutionContext>(a, g_context, dest);
|
||||
}
|
||||
|
||||
|
||||
@@ -1202,8 +1202,6 @@ bool classIsUnique(const Class* cls);
|
||||
bool classIsUniqueOrCtxParent(const Class* cls);
|
||||
bool classIsUniqueNormalClass(const Class* cls);
|
||||
|
||||
void emitGetGContext(X64Assembler& a, PhysReg dest);
|
||||
|
||||
// SpaceRecorder is used in translator-x64.cpp and in hopt/irtranslator.cpp
|
||||
// RAII logger for TC space consumption.
|
||||
struct SpaceRecorder {
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário