Skip to content

Commit

Permalink
Rename pInitRegModified ->pInitRegZeroed , fix a condition that deci…
Browse files Browse the repository at this point in the history
…des if initReg should be zero-initialized (dotnet#40148)

* Revert "Renamed pInitRegZeroed to pInitRegModified, initRegZeroed to initRegM… (dotnet#36321)"

This reverts commit e5516bb.

* Fix the condition that determines if initReg was used during function prolog generation

Also update the comments to make the use of initRegZeroed clear.

* Reworded some comments related to pInitRegZeroed

* Review comments

* reword a comment
  • Loading branch information
kunalspathak authored Jul 31, 2020
1 parent d0d704a commit 2ac6117
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 139 deletions.
16 changes: 8 additions & 8 deletions src/coreclr/src/jit/codegen.h
Original file line number Diff line number Diff line change
Expand Up @@ -341,12 +341,12 @@ class CodeGen final : public CodeGenInterface
void genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowestCalleeSavedOffset, int spDelta);
void genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, int lowestCalleeSavedOffset, int spDelta);

void genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegModified);
void genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed);
#else
void genPushCalleeSavedRegisters();
#endif

void genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegModified, regMaskTP maskArgRegsLiveIn);
void genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn);

#if defined(TARGET_ARM)

Expand Down Expand Up @@ -434,18 +434,18 @@ class CodeGen final : public CodeGenInterface

void genZeroInitFltRegs(const regMaskTP& initFltRegs, const regMaskTP& initDblRegs, const regNumber& initReg);

regNumber genGetZeroReg(regNumber initReg, bool* pInitRegModified);
regNumber genGetZeroReg(regNumber initReg, bool* pInitRegZeroed);

void genZeroInitFrame(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegModified);
void genZeroInitFrame(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed);

void genReportGenericContextArg(regNumber initReg, bool* pInitRegModified);
void genReportGenericContextArg(regNumber initReg, bool* pInitRegZeroed);

void genSetGSSecurityCookie(regNumber initReg, bool* pInitRegModified);
void genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed);

void genFinalizeFrame();

#ifdef PROFILING_SUPPORTED
void genProfilingEnterCallback(regNumber initReg, bool* pInitRegModified);
void genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed);
void genProfilingLeaveCallback(unsigned helper);
#endif // PROFILING_SUPPORTED

Expand Down Expand Up @@ -511,7 +511,7 @@ class CodeGen final : public CodeGenInterface
void genFuncletEpilog();
void genCaptureFuncletPrologEpilogInfo();

void genSetPSPSym(regNumber initReg, bool* pInitRegModified);
void genSetPSPSym(regNumber initReg, bool* pInitRegZeroed);

void genUpdateCurrentFunclet(BasicBlock* block);
#if defined(TARGET_ARM)
Expand Down
27 changes: 13 additions & 14 deletions src/coreclr/src/jit/codegenarm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// if caller knows for certain the constant will fit.
//
// Return Value:
// returns true if the immediate was too large and tmpReg was used and modified.
// returns true if the immediate was small enough to be encoded inside instruction. If not,
// returns false meaning the immediate was too large and tmpReg was used and modified.
//
bool CodeGen::genInstrWithConstant(
instruction ins, emitAttr attr, regNumber reg1, regNumber reg2, ssize_t imm, insFlags flags, regNumber tmpReg)
Expand Down Expand Up @@ -100,7 +101,8 @@ bool CodeGen::genInstrWithConstant(
// tmpReg - an available temporary register
//
// Return Value:
// true if `tmpReg` was used.
// returns true if the immediate was small enough to be encoded inside instruction. If not,
// returns false meaning the immediate was too large and tmpReg was used and modified.
//
bool CodeGen::genStackPointerAdjustment(ssize_t spDelta, regNumber tmpReg)
{
Expand Down Expand Up @@ -1650,14 +1652,14 @@ void CodeGen::genCodeForMulLong(GenTreeMultiRegOp* node)
// genProfilingEnterCallback: Generate the profiling function enter callback.
//
// Arguments:
// initReg - register to use as scratch register
// pInitRegModified - OUT parameter. *pInitRegModified set to 'true' if and only if
// this call sets 'initReg' to a non-zero value.
// initReg - register to use as scratch register
// pInitRegZeroed - OUT parameter. *pInitRegZeroed set to 'false' if 'initReg' is
// not zero after this call.
//
// Return Value:
// None
//
void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegModified)
void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed)
{
assert(compiler->compGeneratingProlog);

Expand Down Expand Up @@ -1690,7 +1692,7 @@ void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegModifie

if (initReg == argReg)
{
*pInitRegModified = true;
*pInitRegZeroed = false;
}
}

Expand Down Expand Up @@ -1820,17 +1822,14 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper)
// Arguments:
// frameSize - the size of the stack frame being allocated.
// initReg - register to use as a scratch register.
// pInitRegModified - OUT parameter. *pInitRegModified is set to 'true' if and only if
// pInitRegZeroed - OUT parameter. *pInitRegZeroed is set to 'false' if and only if
// this call sets 'initReg' to a non-zero value.
// maskArgRegsLiveIn - incoming argument registers that are currently live.
//
// Return value:
// None
//
void CodeGen::genAllocLclFrame(unsigned frameSize,
regNumber initReg,
bool* pInitRegModified,
regMaskTP maskArgRegsLiveIn)
void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn)
{
assert(compiler->compGeneratingProlog);

Expand Down Expand Up @@ -1860,7 +1859,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize,
}

regSet.verifyRegUsed(initReg);
*pInitRegModified = true;
*pInitRegZeroed = false; // The initReg does not contain zero

instGen_Set_Reg_To_Imm(EA_PTRSIZE, initReg, frameSize);
compiler->unwindPadding();
Expand All @@ -1880,7 +1879,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize,
if ((genRegMask(initReg) & (RBM_STACK_PROBE_HELPER_ARG | RBM_STACK_PROBE_HELPER_CALL_TARGET |
RBM_STACK_PROBE_HELPER_TRASH)) != RBM_NONE)
{
*pInitRegModified = true;
*pInitRegZeroed = false;
}
}

Expand Down
35 changes: 17 additions & 18 deletions src/coreclr/src/jit/codegenarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ void CodeGen::genStackPointerAdjustment(ssize_t spDelta, regNumber tmpReg, bool*
// Even though INS_add is specified here, the encoder will choose either
// an INS_add or an INS_sub and encode the immediate as a positive value
//
if (genInstrWithConstant(INS_add, EA_PTRSIZE, REG_SPBASE, REG_SPBASE, spDelta, tmpReg, true))
bool wasTempRegisterUsedForImm =
!genInstrWithConstant(INS_add, EA_PTRSIZE, REG_SPBASE, REG_SPBASE, spDelta, tmpReg, true);
if (wasTempRegisterUsedForImm)
{
if (pTmpRegIsZero != nullptr)
{
Expand Down Expand Up @@ -4810,14 +4812,14 @@ void CodeGen::genStoreLclTypeSIMD12(GenTree* treeNode)
// genProfilingEnterCallback: Generate the profiling function enter callback.
//
// Arguments:
// initReg - register to use as scratch register
// pInitRegModified - OUT parameter. *pInitRegModified set to 'true' if 'initReg' is
// not zero after this call.
// initReg - register to use as scratch register
// pInitRegZeroed - OUT parameter. *pInitRegZeroed set to 'false' if 'initReg' is
// set to non-zero value after this call.
//
// Return Value:
// None
//
void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegModified)
void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed)
{
assert(compiler->compGeneratingProlog);

Expand Down Expand Up @@ -4845,7 +4847,7 @@ void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegModifie

if ((genRegMask(initReg) & RBM_PROFILER_ENTER_TRASH) != RBM_NONE)
{
*pInitRegModified = true;
*pInitRegZeroed = false;
}
}

Expand Down Expand Up @@ -9592,19 +9594,16 @@ void CodeGen::genArm64EmitterUnitTests()
// on Windows as well just to be consistent, even though it should not be necessary.
//
// Arguments:
// frameSize - the size of the stack frame being allocated.
// initReg - register to use as a scratch register.
// pInitRegModified - OUT parameter. *pInitRegModified is set to 'true' if and only if
// this call sets 'initReg' to a non-zero value.
// maskArgRegsLiveIn - incoming argument registers that are currently live.
// frameSize - the size of the stack frame being allocated.
// initReg - register to use as a scratch register.
// pInitRegZeroed - OUT parameter. *pInitRegZeroed is set to 'false' if and only if
// this call sets 'initReg' to a non-zero value. Otherwise, it is unchanged.
// maskArgRegsLiveIn - incoming argument registers that are currently live.
//
// Return value:
// None
//
void CodeGen::genAllocLclFrame(unsigned frameSize,
regNumber initReg,
bool* pInitRegModified,
regMaskTP maskArgRegsLiveIn)
void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn)
{
assert(compiler->compGeneratingProlog);

Expand Down Expand Up @@ -9641,7 +9640,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize,
instGen_Set_Reg_To_Imm(EA_PTRSIZE, initReg, -(ssize_t)probeOffset);
GetEmitter()->emitIns_R_R_R(INS_ldr, EA_4BYTE, REG_ZR, REG_SPBASE, initReg);
regSet.verifyRegUsed(initReg);
*pInitRegModified = true;
*pInitRegZeroed = false; // The initReg does not contain zero

lastTouchDelta -= pageSize;
}
Expand Down Expand Up @@ -9701,7 +9700,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize,
GetEmitter()->emitIns_R_R(INS_cmp, EA_PTRSIZE, rLimit, rOffset); // If equal, we need to probe again
GetEmitter()->emitIns_J(INS_bls, NULL, -4);

*pInitRegModified = true;
*pInitRegZeroed = false; // The initReg does not contain zero

compiler->unwindPadding();

Expand All @@ -9716,7 +9715,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize,
compiler->unwindPadding();

regSet.verifyRegUsed(initReg);
*pInitRegModified = true;
*pInitRegZeroed = false; // The initReg does not contain zero
}
}

Expand Down
10 changes: 5 additions & 5 deletions src/coreclr/src/jit/codegenarmarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -561,14 +561,14 @@ void CodeGen::genSetRegToIcon(regNumber reg, ssize_t val, var_types type, insFla
// genSetGSSecurityCookie: Set the "GS" security cookie in the prolog.
//
// Arguments:
// initReg - register to use as a scratch register
// pInitRegModified - OUT parameter. *pInitRegModified is set to 'true' if and only if
// this call sets 'initReg' to a non-zero value.
// initReg - register to use as a scratch register
// pInitRegZeroed - OUT parameter. *pInitRegZeroed is set to 'false' if and only if
// this call sets 'initReg' to a non-zero value.
//
// Return Value:
// None
//
void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegModified)
void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed)
{
assert(compiler->compGeneratingProlog);

Expand All @@ -593,7 +593,7 @@ void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegModified)
GetEmitter()->emitIns_S_R(INS_str, EA_PTRSIZE, initReg, compiler->lvaGSSecurityCookie, 0);
}

*pInitRegModified = true;
*pInitRegZeroed = false;
}

//---------------------------------------------------------------------
Expand Down
Loading

0 comments on commit 2ac6117

Please sign in to comment.