Skip to content

Commit

Permalink
JIT: fix patchpoint offset encoding
Browse files Browse the repository at this point in the history
We can now have Tier0 locals at byte offsets, so rework how the offset
information is incoded in patchpoints to make this possible.

Closes dotnet#68194.
  • Loading branch information
AndyAyersMS committed Apr 19, 2022
1 parent 544f720 commit 469b538
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 15 deletions.
12 changes: 4 additions & 8 deletions src/coreclr/inc/patchpointinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,20 +149,15 @@ struct PatchpointInfo
return ((m_offsetAndExposureData[localNum] & EXPOSURE_MASK) != 0);
}

void SetIsExposed(unsigned localNum)
{
m_offsetAndExposureData[localNum] |= EXPOSURE_MASK;
}

// FP relative offset of this local in the original method
int Offset(unsigned localNum) const
{
return (m_offsetAndExposureData[localNum] & ~EXPOSURE_MASK);
return (m_offsetAndExposureData[localNum] >> OFFSET_SHIFT);
}

void SetOffset(unsigned localNum, int offset)
void SetOffsetAndExposure(unsigned localNum, int offset, bool isExposed)
{
m_offsetAndExposureData[localNum] = offset;
m_offsetAndExposureData[localNum] = (offset << OFFSET_SHIFT) | (isExposed ? EXPOSURE_MASK : 0);
}

// Callee save registers saved by the original method.
Expand All @@ -181,6 +176,7 @@ struct PatchpointInfo
private:
enum
{
OFFSET_SHIFT = 0x1,
EXPOSURE_MASK = 0x1
};

Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/jit/compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5298,14 +5298,10 @@ void Compiler::generatePatchpointInfo()
assert(varDsc->lvFramePointerBased);

// Record FramePtr relative offset (no localloc yet)
patchpointInfo->SetOffset(lclNum, varDsc->GetStackOffset() + offsetAdjust);

// Note if IL stream contained an address-of that potentially leads to exposure.
// This bit of IL may be skipped by OSR partial importation.
if (varDsc->lvHasLdAddrOp)
{
patchpointInfo->SetIsExposed(lclNum);
}
// That bit of IL might be skipped by OSR partial importation.
const bool isExposed = varDsc->lvHasLdAddrOp;
patchpointInfo->SetOffsetAndExposure(lclNum, varDsc->GetStackOffset() + offsetAdjust, isExposed);

JITDUMP("--OSR-- V%02u is at virtual offset %d%s%s\n", lclNum, patchpointInfo->Offset(lclNum),
patchpointInfo->IsExposed(lclNum) ? " (exposed)" : "", (varNum != lclNum) ? " (shadowed)" : "");
Expand Down

0 comments on commit 469b538

Please sign in to comment.