From d11612c2ddaea77556366f060f3e81e787831237 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Thu, 20 May 2021 15:07:26 -0700 Subject: [PATCH] Ensure ReplaceWithLclVar lowers the created LclVar and assignment --- src/coreclr/jit/lir.cpp | 7 ++++++- src/coreclr/jit/lir.h | 2 +- src/coreclr/jit/lower.h | 11 ++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/coreclr/jit/lir.cpp b/src/coreclr/jit/lir.cpp index beac0b069e2142..6bcc97b3ea2ea9 100644 --- a/src/coreclr/jit/lir.cpp +++ b/src/coreclr/jit/lir.cpp @@ -246,10 +246,11 @@ void LIR::Use::ReplaceWith(Compiler* compiler, GenTree* replacement) // lclNum - The local to use for temporary storage. If BAD_VAR_NUM (the // default) is provided, this method will create and use a new // local var. +// assign - On return, if non null, contains the created assignment node // // Return Value: The number of the local var used for temporary storage. // -unsigned LIR::Use::ReplaceWithLclVar(Compiler* compiler, unsigned lclNum) +unsigned LIR::Use::ReplaceWithLclVar(Compiler* compiler, unsigned lclNum, GenTree** assign) { assert(IsInitialized()); assert(compiler != nullptr); @@ -277,6 +278,10 @@ unsigned LIR::Use::ReplaceWithLclVar(Compiler* compiler, unsigned lclNum) JITDUMP("ReplaceWithLclVar created store :\n"); DISPNODE(store); + if (assign != nullptr) + { + *assign = store; + } return lclNum; } diff --git a/src/coreclr/jit/lir.h b/src/coreclr/jit/lir.h index 5348b9ed920e9b..e174482be6b36e 100644 --- a/src/coreclr/jit/lir.h +++ b/src/coreclr/jit/lir.h @@ -74,7 +74,7 @@ class LIR final bool IsDummyUse() const; void ReplaceWith(Compiler* compiler, GenTree* replacement); - unsigned ReplaceWithLclVar(Compiler* compiler, unsigned lclNum = BAD_VAR_NUM); + unsigned ReplaceWithLclVar(Compiler* compiler, unsigned lclNum = BAD_VAR_NUM, GenTree** assign = nullptr); }; //------------------------------------------------------------------------ diff --git a/src/coreclr/jit/lower.h b/src/coreclr/jit/lower.h index bc061bf7548f06..7f7c9d3760aa14 100644 --- a/src/coreclr/jit/lower.h +++ b/src/coreclr/jit/lower.h @@ -217,9 +217,18 @@ class Lowering final : public Phase GenTree* oldUseNode = use.Def(); if ((oldUseNode->gtOper != GT_LCL_VAR) || (tempNum != BAD_VAR_NUM)) { - use.ReplaceWithLclVar(comp, tempNum); + GenTree* assign; + use.ReplaceWithLclVar(comp, tempNum, &assign); + GenTree* newUseNode = use.Def(); ContainCheckRange(oldUseNode->gtNext, newUseNode); + + // We need to lower the LclVar and assignment since there may be certain + // types or scenarios, such as TYP_SIMD12, that need special handling + + LowerNode(assign); + LowerNode(newUseNode); + return newUseNode->AsLclVar(); } return oldUseNode->AsLclVar();