Skip to content

Commit e3f0fe0

Browse files
author
Sergey Andreenko
committed
Add zero field offsets where it was missed.
And don't add it as `ADD(,0)` in another.
1 parent 04a9f02 commit e3f0fe0

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

src/coreclr/src/jit/morph.cpp

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10347,11 +10347,20 @@ GenTree* Compiler::fgMorphCopyBlock(GenTree* tree)
1034710347
CORINFO_CLASS_HANDLE classHnd = srcVarDsc->lvVerTypeInfo.GetClassHandle();
1034810348
CORINFO_FIELD_HANDLE fieldHnd =
1034910349
info.compCompHnd->getFieldInClass(classHnd, srcFieldVarDsc->lvFldOrdinal);
10350-
FieldSeqNode* curFieldSeq = GetFieldSeqStore()->CreateSingleton(fieldHnd);
10351-
unsigned srcFieldOffset = lvaGetDesc(srcFieldLclNum)->lvFldOffset;
10352-
GenTree* fieldOffsetNode = gtNewIconNode(srcFieldVarDsc->lvFldOffset, curFieldSeq);
10350+
FieldSeqNode* curFieldSeq = GetFieldSeqStore()->CreateSingleton(fieldHnd);
10351+
10352+
unsigned srcFieldOffset = lvaGetDesc(srcFieldLclNum)->lvFldOffset;
10353+
10354+
if (srcFieldOffset == 0)
10355+
{
10356+
fgAddFieldSeqForZeroOffset(dstFld, curFieldSeq);
10357+
}
10358+
else
10359+
{
10360+
GenTree* fieldOffsetNode = gtNewIconNode(srcFieldVarDsc->lvFldOffset, curFieldSeq);
10361+
dstFld = gtNewOperNode(GT_ADD, TYP_BYREF, dstFld, fieldOffsetNode);
10362+
}
1035310363

10354-
dstFld = gtNewOperNode(GT_ADD, TYP_BYREF, dstFld, fieldOffsetNode);
1035510364
dstFld = gtNewIndir(srcFieldVarDsc->TypeGet(), dstFld);
1035610365

1035710366
// !!! The destination could be on stack. !!!
@@ -10427,15 +10436,18 @@ GenTree* Compiler::fgMorphCopyBlock(GenTree* tree)
1042710436
}
1042810437
}
1042910438
}
10430-
else // if (lvaGetDesc(fieldLclNum)->lvFldOffset != 0)
10431-
{
10432-
srcFld = gtNewOperNode(GT_ADD, TYP_BYREF, srcFld,
10433-
new (this, GT_CNS_INT)
10434-
GenTreeIntCon(TYP_I_IMPL, lvaGetDesc(dstFieldLclNum)->lvFldOffset,
10435-
curFieldSeq));
10436-
}
1043710439
if (!done)
1043810440
{
10441+
unsigned fldOffset = lvaGetDesc(dstFieldLclNum)->lvFldOffset;
10442+
if (fldOffset == 0)
10443+
{
10444+
fgAddFieldSeqForZeroOffset(srcFld, curFieldSeq);
10445+
}
10446+
else
10447+
{
10448+
GenTreeIntCon* fldOffsetNode = gtNewIconNode(fldOffset, curFieldSeq);
10449+
srcFld = gtNewOperNode(GT_ADD, TYP_BYREF, srcFld, fldOffsetNode);
10450+
}
1043910451
srcFld = gtNewIndir(destType, srcFld);
1044010452
}
1044110453
}

0 commit comments

Comments
 (0)