diff --git a/src/coreclr/jit/liveness.cpp b/src/coreclr/jit/liveness.cpp index 0e415743f561db..f2c31907d4dab9 100644 --- a/src/coreclr/jit/liveness.cpp +++ b/src/coreclr/jit/liveness.cpp @@ -93,28 +93,23 @@ void Compiler::fgMarkUseDef(GenTreeLclVarCommon* tree) if (promotionType != PROMOTION_TYPE_NONE) { - VARSET_TP bitMask(VarSetOps::MakeEmpty(this)); - for (unsigned i = varDsc->lvFieldLclStart; i < varDsc->lvFieldLclStart + varDsc->lvFieldCnt; ++i) { - noway_assert(lvaTable[i].lvIsStructField); - if (lvaTable[i].lvTracked) + if (!lvaTable[i].lvTracked) { - noway_assert(lvaTable[i].lvVarIndex < lvaTrackedCount); - VarSetOps::AddElemD(this, bitMask, lvaTable[i].lvVarIndex); + continue; } - } - // For pure defs (i.e. not an "update" def which is also a use), add to the (all) def set. - if (!isUse) - { - assert(isDef); - VarSetOps::UnionD(this, fgCurDefSet, bitMask); - } - else if (!VarSetOps::IsSubset(this, bitMask, fgCurDefSet)) - { - // Mark as used any struct fields that are not yet defined. - VarSetOps::UnionD(this, fgCurUseSet, bitMask); + unsigned varIndex = lvaTable[i].lvVarIndex; + if (isUse && !VarSetOps::IsMember(this, fgCurDefSet, varIndex)) + { + VarSetOps::AddElemD(this, fgCurUseSet, varIndex); + } + + if (isDef) + { + VarSetOps::AddElemD(this, fgCurDefSet, varIndex); + } } } }