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:
Bert Maher
2013-05-14 16:50:02 -07:00
commit de Sara Golemon
commit ed5d3150e3
4 arquivos alterados com 16 adições e 34 exclusões
+14 -27
Ver Arquivo
@@ -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) {
+1 -1
Ver Arquivo
@@ -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 {