Skip to content

Commit

Permalink
JIT: Make a quirk in block morphing more explicit (dotnet#92292)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jakobbotsch authored Sep 22, 2023
1 parent a54ccf3 commit d563d0e
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/coreclr/jit/morphblock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1183,8 +1183,7 @@ GenTree* MorphCopyBlockHelper::CopyFieldByField()
addrSpillTemp = m_comp->lvaGrabTemp(true DEBUGARG("BlockOp address local"));

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

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

return addrClone;
Expand Down

0 comments on commit d563d0e

Please sign in to comment.