Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

JIT: Eliminate RegTracker (#18179) #18230

Merged
merged 11 commits into from
Jun 2, 2018
8 changes: 4 additions & 4 deletions src/jit/codegenarm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ void CodeGen::instGen_Set_Reg_To_Imm(emitAttr size, regNumber reg, ssize_t imm,
}
}

regTracker.rsTrackRegIntCns(reg, imm);
regSet.verifyRegUsed(reg);
}

//------------------------------------------------------------------------
Expand All @@ -143,7 +143,7 @@ void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTre
if (con->ImmedValNeedsReloc(compiler))
{
instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, targetReg, cnsVal);
regTracker.rsTrackRegTrash(targetReg);
regSet.verifyRegUsed(targetReg);
}
else
{
Expand Down Expand Up @@ -1599,7 +1599,7 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize,
else
{
getEmitter()->emitIns_R_AI(INS_ldr, EA_PTR_DSP_RELOC, callTargetReg, (ssize_t)pAddr);
regTracker.rsTrackRegTrash(callTargetReg);
regSet.verifyRegUsed(callTargetReg);
}

getEmitter()->emitIns_Call(emitter::EC_INDIR_R, compiler->eeFindHelper(helper),
Expand All @@ -1624,7 +1624,7 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize,
(CorInfoHelpFunc)helper == CORINFO_HELP_PROF_FCN_LEAVE);
}

regTracker.rsTrashRegSet(RBM_CALLEE_TRASH);
regSet.verifyRegistersUsed(RBM_CALLEE_TRASH);
}

//------------------------------------------------------------------------
Expand Down
12 changes: 6 additions & 6 deletions src/jit/codegenarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ bool CodeGen::genInstrWithConstant(instruction ins,

// first we load the immediate into tmpReg
instGen_Set_Reg_To_Imm(size, tmpReg, imm);
regTracker.rsTrackRegTrash(tmpReg);
regSet.verifyRegUsed(tmpReg);

// when we are in an unwind code region
// we record the extra instructions using unwindPadding()
Expand Down Expand Up @@ -1002,7 +1002,7 @@ void CodeGen::genFuncletProlog(BasicBlock* block)
// Load the CallerSP of the main function (stored in the PSP of the dynamically containing funclet or function)
genInstrWithConstant(ins_Load(TYP_I_IMPL), EA_PTRSIZE, REG_R1, REG_R1,
genFuncletInfo.fiCallerSP_to_PSP_slot_delta, REG_R2, false);
regTracker.rsTrackRegTrash(REG_R1);
regSet.verifyRegUsed(REG_R1);

// Store the PSP value (aka CallerSP)
genInstrWithConstant(ins_Store(TYP_I_IMPL), EA_PTRSIZE, REG_R1, REG_SPBASE,
Expand All @@ -1019,7 +1019,7 @@ void CodeGen::genFuncletProlog(BasicBlock* block)
// compute the CallerSP, given the frame pointer. x3 is scratch.
genInstrWithConstant(INS_add, EA_PTRSIZE, REG_R3, REG_FPBASE, -genFuncletInfo.fiFunction_CallerSP_to_FP_delta,
REG_R2, false);
regTracker.rsTrackRegTrash(REG_R3);
regSet.verifyRegUsed(REG_R3);

genInstrWithConstant(ins_Store(TYP_I_IMPL), EA_PTRSIZE, REG_R3, REG_SPBASE,
genFuncletInfo.fiSP_to_PSP_slot_delta, REG_R2, false);
Expand Down Expand Up @@ -1425,7 +1425,7 @@ void CodeGen::instGen_Set_Reg_To_Imm(emitAttr size, regNumber reg, ssize_t imm,
}
}

regTracker.rsTrackRegIntCns(reg, imm);
regSet.verifyRegUsed(reg);
}

/***********************************************************************************
Expand All @@ -1448,7 +1448,7 @@ void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTre
if (con->ImmedValNeedsReloc(compiler))
{
instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, targetReg, cnsVal);
regTracker.rsTrackRegTrash(targetReg);
regSet.verifyRegUsed(targetReg);
}
else
{
Expand Down Expand Up @@ -3663,7 +3663,7 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize,
emitter::emitNoGChelper(helper));

regMaskTP killMask = compiler->compHelperCallKillSet((CorInfoHelpFunc)helper);
regTracker.rsTrashRegSet(killMask);
regSet.verifyRegistersUsed(killMask);
}

#ifdef FEATURE_SIMD
Expand Down
61 changes: 30 additions & 31 deletions src/jit/codegencommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ CodeGen::CodeGen(Compiler* theCompiler) : CodeGenInterface(theCompiler)
maxNestedAlignment = 0;
#endif

regTracker.rsTrackInit(compiler, &regSet);
gcInfo.regSet = &regSet;
m_cgEmitter = new (compiler->getAllocator()) emitter();
m_cgEmitter->codeGen = this;
Expand Down Expand Up @@ -4173,8 +4172,8 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere
noway_assert(varDscDest->lvArgReg == varDscSrc->lvRegNum);

getEmitter()->emitIns_R_R(INS_xchg, size, varDscSrc->lvRegNum, varDscSrc->lvArgReg);
regTracker.rsTrackRegTrash(varDscSrc->lvRegNum);
regTracker.rsTrackRegTrash(varDscSrc->lvArgReg);
regSet.verifyRegUsed(varDscSrc->lvRegNum);
regSet.verifyRegUsed(varDscSrc->lvArgReg);

/* mark both arguments as processed */
regArgTab[destReg].processed = true;
Expand Down Expand Up @@ -4243,7 +4242,7 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere

getEmitter()->emitIns_R_R(insCopy, size, xtraReg, begRegNum);

regTracker.rsTrackRegCopy(xtraReg, begRegNum);
regSet.verifyRegUsed(xtraReg);

*pXtraRegClobbered = true;

Expand All @@ -4260,7 +4259,7 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere

getEmitter()->emitIns_R_R(insCopy, size, destRegNum, srcRegNum);

regTracker.rsTrackRegCopy(destRegNum, srcRegNum);
regSet.verifyRegUsed(destRegNum);

/* mark 'src' as processed */
noway_assert(srcReg < argMax);
Expand Down Expand Up @@ -4312,7 +4311,7 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere

getEmitter()->emitIns_R_R(insCopy, size, destRegNum, xtraReg);

regTracker.rsTrackRegCopy(destRegNum, xtraReg);
regSet.verifyRegUsed(destRegNum);

psiMoveToReg(varNumSrc);

Expand Down Expand Up @@ -4632,7 +4631,7 @@ void CodeGen::genEnregisterIncomingStackArgs()
assert(regNum != REG_STK);

getEmitter()->emitIns_R_S(ins_Load(type), emitTypeSize(type), regNum, varNum, 0);
regTracker.rsTrackRegTrash(regNum);
regSet.verifyRegUsed(regNum);

psiMoveToReg(varNum);
}
Expand Down Expand Up @@ -5328,7 +5327,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni
#if CPU_LOAD_STORE_ARCH
instGen_Set_Reg_To_Imm(EA_PTRSIZE, initReg, -(ssize_t)pageSize);
getEmitter()->emitIns_R_R_R(INS_ldr, EA_4BYTE, initReg, REG_SPBASE, initReg);
regTracker.rsTrackRegTrash(initReg);
regSet.verifyRegUsed(initReg);
*pInitRegZeroed = false; // The initReg does not contain zero
#else
getEmitter()->emitIns_AR_R(INS_TEST, EA_PTRSIZE, REG_EAX, REG_SPBASE, -(int)pageSize);
Expand All @@ -5339,7 +5338,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni
#if CPU_LOAD_STORE_ARCH
instGen_Set_Reg_To_Imm(EA_PTRSIZE, initReg, -2 * (ssize_t)pageSize);
getEmitter()->emitIns_R_R_R(INS_ldr, EA_4BYTE, initReg, REG_SPBASE, initReg);
regTracker.rsTrackRegTrash(initReg);
regSet.verifyRegUsed(initReg);
#else
getEmitter()->emitIns_AR_R(INS_TEST, EA_PTRSIZE, REG_EAX, REG_SPBASE, -2 * (int)pageSize);
#endif
Expand Down Expand Up @@ -5426,7 +5425,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni
noway_assert((ssize_t)(int)frameSize == (ssize_t)frameSize); // make sure framesize safely fits within an int
instGen_Set_Reg_To_Imm(EA_PTRSIZE, rLimit, -(int)frameSize);
getEmitter()->emitIns_R_R_R(INS_ldr, EA_4BYTE, rTemp, REG_SPBASE, rOffset);
regTracker.rsTrackRegTrash(rTemp);
regSet.verifyRegUsed(rTemp);
#if defined(_TARGET_ARM_)
getEmitter()->emitIns_R_I(INS_sub, EA_PTRSIZE, rOffset, pageSize);
#elif defined(_TARGET_ARM64_)
Expand Down Expand Up @@ -5540,7 +5539,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni
{
// pop eax
inst_RV(INS_pop, REG_SECRET_STUB_PARAM, TYP_I_IMPL);
regTracker.rsTrackRegTrash(REG_SECRET_STUB_PARAM);
regSet.verifyRegUsed(REG_SECRET_STUB_PARAM);
}
#endif // _TARGET_XARCH_

Expand Down Expand Up @@ -6454,29 +6453,29 @@ void CodeGen::genZeroInitFrame(int untrLclHi, int untrLclLo, regNumber initReg,
{
noway_assert(regSet.rsRegsModified(RBM_R12));
inst_RV_RV(INS_mov, REG_R12, REG_RCX);
regTracker.rsTrackRegTrash(REG_R12);
regSet.verifyRegUsed(REG_R12);
}

if (intRegState.rsCalleeRegArgMaskLiveIn & RBM_RDI)
{
noway_assert(regSet.rsRegsModified(RBM_R13));
inst_RV_RV(INS_mov, REG_R13, REG_RDI);
regTracker.rsTrackRegTrash(REG_R13);
regSet.verifyRegUsed(REG_R13);
}
#else // !UNIX_AMD64_ABI
// For register arguments we may have to save ECX
if (intRegState.rsCalleeRegArgMaskLiveIn & RBM_ECX)
{
noway_assert(regSet.rsRegsModified(RBM_ESI));
inst_RV_RV(INS_mov, REG_ESI, REG_ECX);
regTracker.rsTrackRegTrash(REG_ESI);
regSet.verifyRegUsed(REG_ESI);
}
#endif // !UNIX_AMD64_ABI

noway_assert((intRegState.rsCalleeRegArgMaskLiveIn & RBM_EAX) == 0);

getEmitter()->emitIns_R_AR(INS_lea, EA_PTRSIZE, REG_EDI, genFramePointerReg(), untrLclLo);
regTracker.rsTrackRegTrash(REG_EDI);
regSet.verifyRegUsed(REG_EDI);

inst_RV_IV(INS_mov, REG_ECX, (untrLclHi - untrLclLo) / sizeof(int), EA_4BYTE);
instGen_Set_Reg_To_Zero(EA_PTRSIZE, REG_EAX);
Expand Down Expand Up @@ -6670,7 +6669,7 @@ void CodeGen::genReportGenericContextArg(regNumber initReg, bool* pInitRegZeroed

// mov reg, [compiler->info.compTypeCtxtArg]
getEmitter()->emitIns_R_AR(ins_Load(TYP_I_IMPL), EA_PTRSIZE, reg, genFramePointerReg(), varDsc->lvStkOffs);
regTracker.rsTrackRegTrash(reg);
regSet.verifyRegUsed(reg);
}

#if CPU_LOAD_STORE_ARCH
Expand Down Expand Up @@ -6728,12 +6727,12 @@ void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed)
#if CPU_LOAD_STORE_ARCH
instGen_Set_Reg_To_Imm(EA_PTR_DSP_RELOC, reg, (ssize_t)compiler->gsGlobalSecurityCookieAddr);
getEmitter()->emitIns_R_R_I(ins_Load(TYP_I_IMPL), EA_PTRSIZE, reg, reg, 0);
regTracker.rsTrackRegTrash(reg);
regSet.verifyRegUsed(reg);
#else
// mov reg, dword ptr [compiler->gsGlobalSecurityCookieAddr]
// mov dword ptr [frame.GSSecurityCookie], reg
getEmitter()->emitIns_R_AI(INS_mov, EA_PTR_DSP_RELOC, reg, (ssize_t)compiler->gsGlobalSecurityCookieAddr);
regTracker.rsTrackRegTrash(reg);
regSet.verifyRegUsed(reg);
#endif
getEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, reg, compiler->lvaGSSecurityCookie, 0);
}
Expand Down Expand Up @@ -6986,7 +6985,7 @@ void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed)
if (compiler->compProfilerMethHndIndirected)
{
getEmitter()->emitIns_R_AI(INS_ldr, EA_PTR_DSP_RELOC, argReg, (ssize_t)compiler->compProfilerMethHnd);
regTracker.rsTrackRegTrash(argReg);
regSet.verifyRegUsed(argReg);
}
else
{
Expand Down Expand Up @@ -7260,15 +7259,15 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper /*= CORINFO_HELP_PROF_FC
}

getEmitter()->emitIns_R_R(INS_mov, attr, REG_PROFILER_RET_SCRATCH, REG_ARG_0);
regTracker.rsTrackRegTrash(REG_PROFILER_RET_SCRATCH);
regSet.verifyRegUsed(REG_PROFILER_RET_SCRATCH);
gcInfo.gcMarkRegSetNpt(RBM_ARG_0);
r0Trashed = true;
}

if (compiler->compProfilerMethHndIndirected)
{
getEmitter()->emitIns_R_AI(INS_ldr, EA_PTR_DSP_RELOC, REG_ARG_0, (ssize_t)compiler->compProfilerMethHnd);
regTracker.rsTrackRegTrash(REG_ARG_0);
regSet.verifyRegUsed(REG_ARG_0);
}
else
{
Expand All @@ -7283,7 +7282,7 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper /*= CORINFO_HELP_PROF_FC
if (r0Trashed)
{
getEmitter()->emitIns_R_R(INS_mov, attr, REG_ARG_0, REG_PROFILER_RET_SCRATCH);
regTracker.rsTrackRegTrash(REG_ARG_0);
regSet.verifyRegUsed(REG_ARG_0);
gcInfo.gcMarkRegSetNpt(RBM_PROFILER_RET_SCRATCH);
}

Expand Down Expand Up @@ -8249,7 +8248,7 @@ void CodeGen::genFnProlog()
if (compiler->compLocallocUsed)
{
getEmitter()->emitIns_R_R(INS_mov, EA_4BYTE, REG_SAVED_LOCALLOC_SP, REG_SPBASE);
regTracker.rsTrackRegTrash(REG_SAVED_LOCALLOC_SP);
regSet.verifyRegUsed(REG_SAVED_LOCALLOC_SP);
compiler->unwindSetFrameReg(REG_SAVED_LOCALLOC_SP, 0);
}
#endif // _TARGET_ARMARCH_
Expand Down Expand Up @@ -8544,7 +8543,7 @@ void CodeGen::genFnProlog()

// MOV EAX, <VARARGS HANDLE>
getEmitter()->emitIns_R_S(ins_Load(TYP_I_IMPL), EA_PTRSIZE, REG_EAX, compiler->info.compArgsCount - 1, 0);
regTracker.rsTrackRegTrash(REG_EAX);
regSet.verifyRegUsed(REG_EAX);

// MOV EAX, [EAX]
getEmitter()->emitIns_R_AR(ins_Load(TYP_I_IMPL), EA_PTRSIZE, REG_EAX, REG_EAX, 0);
Expand All @@ -8566,7 +8565,7 @@ void CodeGen::genFnProlog()
if (varDsc->lvRegNum != REG_EAX)
{
getEmitter()->emitIns_R_R(INS_mov, EA_PTRSIZE, varDsc->lvRegNum, REG_EAX);
regTracker.rsTrackRegTrash(varDsc->lvRegNum);
regSet.verifyRegUsed(varDsc->lvRegNum);
}
}
else
Expand Down Expand Up @@ -8769,7 +8768,7 @@ void CodeGen::genFnEpilog(BasicBlock* block)
if (addrInfo.accessType == IAT_PVALUE)
{
getEmitter()->emitIns_R_R_I(INS_ldr, EA_PTRSIZE, indCallReg, indCallReg, 0);
regTracker.rsTrackRegTrash(indCallReg);
regSet.verifyRegUsed(indCallReg);
}
break;

Expand Down Expand Up @@ -8941,7 +8940,7 @@ void CodeGen::genFnEpilog(BasicBlock* block)
if ((compiler->compLclFrameSize == TARGET_POINTER_SIZE) && !compiler->compJmpOpUsed)
{
inst_RV(INS_pop, REG_ECX, TYP_I_IMPL);
regTracker.rsTrackRegTrash(REG_ECX);
regSet.verifyRegUsed(REG_ECX);
}
else
#endif // _TARGET_X86
Expand Down Expand Up @@ -9012,7 +9011,7 @@ void CodeGen::genFnEpilog(BasicBlock* block)
{
// "pop ecx" will make ESP point to the callee-saved registers
inst_RV(INS_pop, REG_ECX, TYP_I_IMPL);
regTracker.rsTrackRegTrash(REG_ECX);
regSet.verifyRegUsed(REG_ECX);
}
#endif // _TARGET_X86
else
Expand Down Expand Up @@ -9353,7 +9352,7 @@ void CodeGen::genFuncletProlog(BasicBlock* block)

getEmitter()->emitIns_R_R_I(ins_Load(TYP_I_IMPL), EA_PTRSIZE, REG_R1, REG_R1,
genFuncletInfo.fiPSP_slot_CallerSP_offset);
regTracker.rsTrackRegTrash(REG_R1);
regSet.verifyRegUsed(REG_R1);
getEmitter()->emitIns_R_R_I(ins_Store(TYP_I_IMPL), EA_PTRSIZE, REG_R1, REG_SPBASE,
genFuncletInfo.fiPSP_slot_SP_offset);
getEmitter()->emitIns_R_R_I(INS_sub, EA_PTRSIZE, REG_FPBASE, REG_R1,
Expand All @@ -9364,7 +9363,7 @@ void CodeGen::genFuncletProlog(BasicBlock* block)
// This is a non-filter funclet
getEmitter()->emitIns_R_R_I(INS_add, EA_PTRSIZE, REG_R3, REG_FPBASE,
genFuncletInfo.fiFunctionCallerSPtoFPdelta);
regTracker.rsTrackRegTrash(REG_R3);
regSet.verifyRegUsed(REG_R3);
getEmitter()->emitIns_R_R_I(ins_Store(TYP_I_IMPL), EA_PTRSIZE, REG_R3, REG_SPBASE,
genFuncletInfo.fiPSP_slot_SP_offset);
}
Expand Down Expand Up @@ -9654,7 +9653,7 @@ void CodeGen::genFuncletProlog(BasicBlock* block)

getEmitter()->emitIns_R_AR(INS_mov, EA_PTRSIZE, REG_FPBASE, REG_ARG_0, genFuncletInfo.fiPSP_slot_InitialSP_offset);

regTracker.rsTrackRegTrash(REG_FPBASE);
regSet.verifyRegUsed(REG_FPBASE);

getEmitter()->emitIns_AR_R(INS_mov, EA_PTRSIZE, REG_FPBASE, REG_SPBASE, genFuncletInfo.fiPSP_slot_InitialSP_offset);

Expand Down
4 changes: 0 additions & 4 deletions src/jit/codegeninterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,6 @@ class CodeGenInterface
RegState intRegState;
RegState floatRegState;

// TODO-Cleanup: The only reason that regTracker needs to live in CodeGenInterface is that
// in RegSet::rsUnspillOneReg, it needs to mark the new register as "trash"
RegTracker regTracker;

protected:
Compiler* compiler;
bool m_genAlignLoops;
Expand Down
6 changes: 5 additions & 1 deletion src/jit/codegenlinear.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,11 @@ void CodeGen::genCodeForBBlist()

/* Mark the register as holding the variable */

regTracker.rsTrackRegLclVar(varDsc->lvRegNum, varNum);
assert(varDsc->lvRegNum != REG_STK);
if (!varDsc->lvAddrExposed)
{
regSet.verifyRegUsed(varDsc->lvRegNum);
}
}

unsigned finallyNesting = 0;
Expand Down