Skip to content
Merged
3 changes: 2 additions & 1 deletion src/coreclr/jit/codegenwasm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
19 changes: 19 additions & 0 deletions src/coreclr/jit/liveness.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2452,6 +2452,7 @@ void Liveness<TLiveness>::ComputeLifeLIR(VARSET_TP& life, BasicBlock* block, VAR

if (TryRemoveDeadStoreLIR(store, node->AsLclVarCommon(), block))
{

JITDUMP("Removing dead LclVar address:\n");
DISPNODE(node);
blockRange.Remove(node);
Expand All @@ -2463,6 +2464,24 @@ void Liveness<TLiveness>::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
}
}
}
}
Expand Down
Loading