unsigned char lvClassInfoUpdated : 1; // true if this var has updated class handle or exactness
#endif
+ unsigned char lvImplicitlyReferenced : 1; // true if there are non-IR references to this local (prolog, epilog, gc,
+ // eh)
+
union {
unsigned lvFieldLclStart; // The index of the local var representing the first field in the promoted struct
// local. For implicit byref parameters, this gets hijacked between
public:
unsigned short lvRefCnt() const
{
+ if (lvImplicitlyReferenced && (m_lvRefCnt == 0))
+ {
+ return 1;
+ }
+
return m_lvRefCnt;
}
unsigned lvRefCntWtd() const
{
+ if (lvImplicitlyReferenced && (m_lvRefCntWtd == 0))
+ {
+ return BB_UNITY_WEIGHT;
+ }
+
return m_lvRefCntWtd;
}
// address-exposed -- DoNotEnregister should suffice?
lvaSetVarAddrExposed(lclNum);
- // We need lvRefCnt to be non-zero to prevent various asserts from firing.
- varDsc->setLvRefCnt(1);
- varDsc->setLvRefCntWtd(BB_UNITY_WEIGHT);
+ // Note the implicit use
+ varDsc->lvImplicitlyReferenced = 1;
return lclNum;
}
lvaTable[info.compLvFrameListRoot].lvType = TYP_I_IMPL;
- /* Set the refCnt, it is used in the prolog and return block(s) */
-
- lvaTable[info.compLvFrameListRoot].setLvRefCnt(2);
- lvaTable[info.compLvFrameListRoot].setLvRefCntWtd(2 * BB_UNITY_WEIGHT);
+ // This local has implicit prolog and epilog references
+ lvaTable[info.compLvFrameListRoot].lvImplicitlyReferenced = 1;
}
}
}
#endif
- if (lvaKeepAliveAndReportThis() && lvaTable[0].lvRefCnt() == 0)
+ if (lvaKeepAliveAndReportThis())
{
- lvaTable[0].setLvRefCnt(1);
+ lvaTable[0].lvImplicitlyReferenced = 1;
// This isn't strictly needed as we will make a copy of the param-type-arg
// in the prolog. However, this ensures that the LclVarDsc corresponding to
// info.compTypeCtxtArg is valid.
}
- else if (lvaReportParamTypeArg() && lvaTable[info.compTypeCtxtArg].lvRefCnt() == 0)
+ else if (lvaReportParamTypeArg())
{
- lvaTable[info.compTypeCtxtArg].setLvRefCnt(1);
+ lvaTable[info.compTypeCtxtArg].lvImplicitlyReferenced = 1;
}
lvaLocalVarRefCounted = true;
{
lvaOutgoingArgSpaceVar = lvaGrabTemp(false DEBUGARG("OutgoingArgSpace"));
- lvaTable[lvaOutgoingArgSpaceVar].lvType = TYP_LCLBLK;
-
- /* Set the refCnts */
-
- lvaTable[lvaOutgoingArgSpaceVar].setLvRefCnt(1);
- lvaTable[lvaOutgoingArgSpaceVar].setLvRefCntWtd(BB_UNITY_WEIGHT);
+ lvaTable[lvaOutgoingArgSpaceVar].lvType = TYP_LCLBLK;
+ lvaTable[lvaOutgoingArgSpaceVar].lvImplicitlyReferenced = 1;
}
noway_assert(lvaOutgoingArgSpaceVar >= info.compLocalsCount && lvaOutgoingArgSpaceVar < lvaCount);
unsigned lclNum = 0;
for (LclVarDsc *varDsc = lvaTable; lclNum < lvaCount; lclNum++, varDsc++)
{
- if (varDsc->lvRefCnt() == 0 && varDsc->lvIsRegArg)
+ if (lclNum >= info.compArgsCount)
{
- varDsc->setLvRefCnt(1);
+ break; // early exit for loop
+ }
+
+ if (varDsc->lvIsRegArg)
+ {
+ varDsc->lvImplicitlyReferenced = true;
}
}