diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index 3c3ebe4d9e154f..3dacd2e5e837e0 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -2247,9 +2247,10 @@ void CodeGen::genCodeForStoreLclVar(GenTreeLclVar* tree) // enregistered locals need to be handled. LclVarDsc* varDsc = m_compiler->lvaGetDesc(tree); regNumber targetReg = tree->GetRegNum(); + var_types type = varDsc->GetRegisterType(tree); assert(genIsValidReg(targetReg) && varDsc->lvIsRegCandidate()); - GetEmitter()->emitIns_I(INS_local_set, emitTypeSize(tree), WasmRegToIndex(targetReg)); + GetEmitter()->emitIns_I(INS_local_set, emitTypeSize(type), WasmRegToIndex(targetReg)); genUpdateLifeStore(tree, targetReg, varDsc); } diff --git a/src/coreclr/jit/liveness.cpp b/src/coreclr/jit/liveness.cpp index 01e58a6eab3ea3..b0a5bc86eef185 100644 --- a/src/coreclr/jit/liveness.cpp +++ b/src/coreclr/jit/liveness.cpp @@ -2452,6 +2452,7 @@ void Liveness::ComputeLifeLIR(VARSET_TP& life, BasicBlock* block, VAR if (TryRemoveDeadStoreLIR(store, node->AsLclVarCommon(), block)) { + JITDUMP("Removing dead LclVar address:\n"); DISPNODE(node); blockRange.Remove(node); @@ -2463,6 +2464,24 @@ void Liveness::ComputeLifeLIR(VARSET_TP& life, BasicBlock* block, VAR { Lowering::TransformUnusedIndirection(data->AsIndir(), m_compiler, block); } + else if (data->OperIs(GT_LCL_VAR, GT_LCL_FLD)) + { + // The unused lcl_var or lcl_field on the rhs of a removed block store may be a + // struct which cannot always be loaded onto the Wasm evaluation stack or into + // native registers, so we need to make sure to remove the node. In some cases the + // node is after us in the iteration order and will be automatically removed, but we + // may have already iterated over it without removing it, so it's necessary to clean + // up here. + JITDUMP("Removing dead store data:\n"); + DISPNODE(data); + if (next == data) + { + next = data->gtPrev; + } + assert(end != data); + blockRange.Delete(m_compiler, block, data); + // fgStmtRemoved was already set by TryRemoveDeadStoreLIR + } } } }