summaryrefslogtreecommitdiff
path: root/src/jit
diff options
context:
space:
mode:
Diffstat (limited to 'src/jit')
-rw-r--r--src/jit/compiler.h13
-rw-r--r--src/jit/compiler.hpp5
-rw-r--r--src/jit/lclvars.cpp22
-rw-r--r--src/jit/liveness.cpp9
4 files changed, 30 insertions, 19 deletions
diff --git a/src/jit/compiler.h b/src/jit/compiler.h
index e5d4d67efe..570d8d9c8e 100644
--- a/src/jit/compiler.h
+++ b/src/jit/compiler.h
@@ -307,6 +307,9 @@ public:
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
@@ -604,6 +607,11 @@ private:
public:
unsigned short lvRefCnt() const
{
+ if (lvImplicitlyReferenced && (m_lvRefCnt == 0))
+ {
+ return 1;
+ }
+
return m_lvRefCnt;
}
@@ -627,6 +635,11 @@ public:
unsigned lvRefCntWtd() const
{
+ if (lvImplicitlyReferenced && (m_lvRefCntWtd == 0))
+ {
+ return BB_UNITY_WEIGHT;
+ }
+
return m_lvRefCntWtd;
}
diff --git a/src/jit/compiler.hpp b/src/jit/compiler.hpp
index c4a50c0fa9..da00abcd03 100644
--- a/src/jit/compiler.hpp
+++ b/src/jit/compiler.hpp
@@ -1797,9 +1797,8 @@ inline unsigned Compiler::lvaGrabTempWithImplicitUse(bool shortLifetime DEBUGARG
// 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;
}
diff --git a/src/jit/lclvars.cpp b/src/jit/lclvars.cpp
index e72ae11cf5..00110b0e6a 100644
--- a/src/jit/lclvars.cpp
+++ b/src/jit/lclvars.cpp
@@ -4026,10 +4026,8 @@ void Compiler::lvaMarkLocalVars()
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;
}
}
@@ -4148,16 +4146,16 @@ void Compiler::lvaMarkLocalVars()
}
#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;
@@ -4176,12 +4174,8 @@ void Compiler::lvaAllocOutgoingArgSpaceVar()
{
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);
diff --git a/src/jit/liveness.cpp b/src/jit/liveness.cpp
index 3c34681daa..9f8910f1e3 100644
--- a/src/jit/liveness.cpp
+++ b/src/jit/liveness.cpp
@@ -1047,9 +1047,14 @@ void Compiler::fgExtendDbgLifetimes()
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;
}
}