From d483f82cdc039ce129469cd3362d439841e62ef5 Mon Sep 17 00:00:00 2001 From: Steven He Date: Fri, 22 May 2026 23:04:19 +0900 Subject: [PATCH 1/3] Preserve class handle when split tree --- src/coreclr/jit/gentree.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index d91d1961bc2ba4..83732b857ad8d0 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -18679,10 +18679,28 @@ bool Compiler::gtSplitTree(BasicBlock* block, m_compiler->lvaGetDesc(lclNum)->lvIsMultiRegRet = true; } - GenTree* store = m_compiler->gtNewTempStore(lclNum, *use); - stmt = m_compiler->fgNewStmtFromTree(store, m_splitStmt->GetDebugInfo()); - *use = m_compiler->gtNewLclvNode(lclNum, genActualType(*use)); - MadeChanges = true; + GenTree* value = *use; + GenTree* store = m_compiler->gtNewTempStore(lclNum, value); + + LclVarDsc* const lclDsc = m_compiler->lvaGetDesc(lclNum); + assert(lclDsc->lvSingleDef == 0); + lclDsc->lvSingleDef = 1; + JITDUMP("Marked V%02u as a single def temp\n", lclNum); + + if (value->TypeIs(TYP_REF)) + { + bool isExact = false; + bool isNonNull = false; + CORINFO_CLASS_HANDLE clsHnd = m_compiler->gtGetClassHandle(value, &isExact, &isNonNull); + if (clsHnd != NO_CLASS_HANDLE) + { + m_compiler->lvaSetClass(lclNum, clsHnd, isExact); + } + } + + stmt = m_compiler->fgNewStmtFromTree(store, m_splitStmt->GetDebugInfo()); + *use = m_compiler->gtNewLclvNode(lclNum, genActualType(value)); + MadeChanges = true; } if (stmt != nullptr) From 29589f0d8bf700876abff375c6faa903407f2862 Mon Sep 17 00:00:00 2001 From: Steven He Date: Fri, 22 May 2026 23:08:38 +0900 Subject: [PATCH 2/3] Nit --- src/coreclr/jit/gentree.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 83732b857ad8d0..7477cd0cace2d0 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -18683,7 +18683,6 @@ bool Compiler::gtSplitTree(BasicBlock* block, GenTree* store = m_compiler->gtNewTempStore(lclNum, value); LclVarDsc* const lclDsc = m_compiler->lvaGetDesc(lclNum); - assert(lclDsc->lvSingleDef == 0); lclDsc->lvSingleDef = 1; JITDUMP("Marked V%02u as a single def temp\n", lclNum); From 3c2c4b8001b90ef02b0fcf1f3c924abf1e774054 Mon Sep 17 00:00:00 2001 From: Steven He Date: Fri, 22 May 2026 23:31:30 +0900 Subject: [PATCH 3/3] format jit --- src/coreclr/jit/gentree.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 7477cd0cace2d0..95bc433b0f9975 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -18683,7 +18683,7 @@ bool Compiler::gtSplitTree(BasicBlock* block, GenTree* store = m_compiler->gtNewTempStore(lclNum, value); LclVarDsc* const lclDsc = m_compiler->lvaGetDesc(lclNum); - lclDsc->lvSingleDef = 1; + lclDsc->lvSingleDef = 1; JITDUMP("Marked V%02u as a single def temp\n", lclNum); if (value->TypeIs(TYP_REF))