Skip to content

Commit

Permalink
Revert "JIT: Disallow implicit byref args and return buffers from ali…
Browse files Browse the repository at this point in the history
…asing (dotnet#104616)"

This reverts commit 6c55362.
  • Loading branch information
matouskozak committed Jul 11, 2024
1 parent 572014a commit 6b4fb84
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 35 deletions.
14 changes: 7 additions & 7 deletions src/coreclr/jit/gentree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17974,14 +17974,11 @@ GenTreeLclVarCommon* GenTree::IsImplicitByrefParameterValuePreMorph(Compiler* co
// compiler - compiler instance
// addr - [out] tree representing the address computation on top of the implicit byref.
// Will be the same as the return value if the whole implicit byref is used, for example.
// offset - [out] Offset that "addr" is adding on top of the returned local.
//
// Return Value:
// Node for the local, or nullptr.
//
GenTreeLclVar* GenTree::IsImplicitByrefParameterValuePostMorph(Compiler* compiler,
GenTree** addr,
target_ssize_t* offset)
GenTreeLclVar* GenTree::IsImplicitByrefParameterValuePostMorph(Compiler* compiler, GenTree** addr)
{
#if FEATURE_IMPLICIT_BYREFS && !defined(TARGET_LOONGARCH64) // TODO-LOONGARCH64-CQ: enable this.

Expand All @@ -17990,10 +17987,13 @@ GenTreeLclVar* GenTree::IsImplicitByrefParameterValuePostMorph(Compiler* c
return nullptr;
}

*addr = AsIndir()->Addr();

*addr = AsIndir()->Addr();
GenTree* innerAddr = *addr;
compiler->gtPeelOffsets(&innerAddr, offset);

while (innerAddr->OperIs(GT_ADD) && innerAddr->gtGetOp2()->IsCnsIntOrI())
{
innerAddr = innerAddr->gtGetOp1();
}

if (innerAddr->OperIs(GT_LCL_VAR))
{
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/gentree.h
Original file line number Diff line number Diff line change
Expand Up @@ -1972,7 +1972,7 @@ struct GenTree
unsigned* pSize = nullptr);

GenTreeLclVarCommon* IsImplicitByrefParameterValuePreMorph(Compiler* compiler);
GenTreeLclVar* IsImplicitByrefParameterValuePostMorph(Compiler* compiler, GenTree** addr, target_ssize_t* offset);
GenTreeLclVar* IsImplicitByrefParameterValuePostMorph(Compiler* compiler, GenTree** addr);

unsigned IsLclVarUpdateTree(GenTree** otherTree, genTreeOps* updateOper);

Expand Down
29 changes: 2 additions & 27 deletions src/coreclr/jit/morph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3157,15 +3157,13 @@ void Compiler::fgMakeOutgoingStructArgCopy(GenTreeCall* call, CallArg* arg)
if (opts.OptimizationEnabled() && arg->AbiInfo.PassedByRef)
{
GenTree* implicitByRefLclAddr;
target_ssize_t implicitByRefLclOffs;
GenTreeLclVarCommon* implicitByRefLcl =
argx->IsImplicitByrefParameterValuePostMorph(this, &implicitByRefLclAddr, &implicitByRefLclOffs);
argx->IsImplicitByrefParameterValuePostMorph(this, &implicitByRefLclAddr);

GenTreeLclVarCommon* lcl = implicitByRefLcl;
if ((lcl == nullptr) && argx->OperIsLocal())
{
lcl = argx->AsLclVarCommon();
implicitByRefLclOffs = lcl->GetLclOffs();
lcl = argx->AsLclVarCommon();
}

if (lcl != nullptr)
Expand Down Expand Up @@ -3193,28 +3191,6 @@ void Compiler::fgMakeOutgoingStructArgCopy(GenTreeCall* call, CallArg* arg)
!varDsc->lvPromoted && !varDsc->lvIsStructField && ((lcl->gtFlags & GTF_VAR_DEATH) != 0);
}

// Disallow the argument from potentially aliasing the return
// buffer.
if (omitCopy)
{
GenTreeLclVarCommon* retBuffer = gtCallGetDefinedRetBufLclAddr(call);
if ((retBuffer != nullptr) && (retBuffer->GetLclNum() == varNum))
{
unsigned retBufferSize = typGetObjLayout(call->gtRetClsHnd)->GetSize();
target_ssize_t retBufferStart = retBuffer->GetLclOffs();
target_ssize_t retBufferEnd = retBufferStart + static_cast<target_ssize_t>(retBufferSize);

unsigned argSize = arg->GetSignatureType() == TYP_STRUCT
? typGetObjLayout(arg->GetSignatureClassHandle())->GetSize()
: genTypeSize(arg->GetSignatureType());
target_ssize_t implByrefStart = implicitByRefLclOffs;
target_ssize_t implByrefEnd = implByrefStart + static_cast<target_ssize_t>(argSize);

bool disjoint = (retBufferEnd <= implByrefStart) || (implByrefEnd <= retBufferStart);
omitCopy = disjoint;
}
}

if (omitCopy)
{
if (implicitByRefLcl != nullptr)
Expand Down Expand Up @@ -3242,7 +3218,6 @@ void Compiler::fgMakeOutgoingStructArgCopy(GenTreeCall* call, CallArg* arg)
#endif

JITDUMP("making an outgoing copy for struct arg\n");
assert(!call->IsTailCall() || !arg->AbiInfo.PassedByRef);

CORINFO_CLASS_HANDLE copyBlkClass = arg->GetSignatureClassHandle();
unsigned tmp = 0;
Expand Down

0 comments on commit 6b4fb84

Please sign in to comment.