Skip to content

Commit d563d0e

Browse files
authored
JIT: Make a quirk in block morphing more explicit (#92292)
Block morphing would create oddly typed trees (mixing up TYP_BYREF/TYP_I_IMPL, e.g. creating LCL_VAR<I_IMPL> for a TYP_BYREF typed local). The only effect of this was that it would avoid some constant propagation. Make this more explicit by setting GTF_DONT_CSE instead.
1 parent a54ccf3 commit d563d0e

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

src/coreclr/jit/morphblock.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,8 +1183,7 @@ GenTree* MorphCopyBlockHelper::CopyFieldByField()
11831183
addrSpillTemp = m_comp->lvaGrabTemp(true DEBUGARG("BlockOp address local"));
11841184

11851185
LclVarDsc* addrSpillDsc = m_comp->lvaGetDesc(addrSpillTemp);
1186-
addrSpillDsc->lvType = addrSpill->TypeIs(TYP_REF) ? TYP_REF : TYP_BYREF; // TODO-ASG: zero-diff quirk, delete.
1187-
addrSpillStore = m_comp->gtNewTempStore(addrSpillTemp, addrSpill);
1186+
addrSpillStore = m_comp->gtNewTempStore(addrSpillTemp, addrSpill);
11881187
}
11891188

11901189
auto grabAddr = [=, &result](unsigned offs) {
@@ -1227,7 +1226,12 @@ GenTree* MorphCopyBlockHelper::CopyFieldByField()
12271226
// handling.
12281227
GenTreeIntCon* fldOffsetNode = m_comp->gtNewIconNode(fullOffs, TYP_I_IMPL);
12291228
fldOffsetNode->gtFieldSeq = addrBaseOffsFldSeq;
1230-
addrClone = m_comp->gtNewOperNode(GT_ADD, TYP_BYREF, addrClone, fldOffsetNode);
1229+
addrClone = m_comp->gtNewOperNode(GT_ADD, varTypeIsGC(addrClone) ? TYP_BYREF : TYP_I_IMPL, addrClone,
1230+
fldOffsetNode);
1231+
// Avoid constant prop propagating each field access with a large
1232+
// constant address. TODO-Cleanup: We should tune constant prop to
1233+
// have better heuristics around this.
1234+
addrClone->gtFlags |= GTF_DONT_CSE;
12311235
}
12321236

12331237
return addrClone;

0 commit comments

Comments
 (0)