@@ -4399,7 +4399,7 @@ GlobOpt::CollectMemOpLdElementI(IR::Instr *instr, Loop *loop)
43994399bool
44004400GlobOpt::CollectMemOpStElementI(IR::Instr *instr, Loop *loop)
44014401{
4402- Assert(instr->m_opcode == Js::OpCode::StElemI_A);
4402+ Assert(instr->m_opcode == Js::OpCode::StElemI_A || instr->m_opcode == Js::OpCode::StElemI_A_Strict );
44034403 Assert(instr->GetSrc1());
44044404 return (!PHASE_OFF(Js::MemSetPhase, this->func) && CollectMemsetStElementI(instr, loop)) ||
44054405 (!PHASE_OFF(Js::MemCopyPhase, this->func) && CollectMemcopyStElementI(instr, loop));
@@ -4429,6 +4429,7 @@ GlobOpt::CollectMemOpInfo(IR::Instr *instr, Value *src1Val, Value *src2Val)
44294429 switch (instr->m_opcode)
44304430 {
44314431 case Js::OpCode::StElemI_A:
4432+ case Js::OpCode::StElemI_A_Strict:
44324433 if (!CollectMemOpStElementI(instr, loop))
44334434 {
44344435 loop->memOpInfo->doMemOp = false;
@@ -20741,10 +20742,10 @@ GlobOpt::FindArraySegmentLoadInstr(IR::Instr* fromInstr)
2074120742void
2074220743GlobOpt::RemoveMemOpSrcInstr(IR::Instr* memopInstr, IR::Instr* srcInstr, BasicBlock* block)
2074320744{
20744- Assert(srcInstr && (srcInstr->m_opcode == Js::OpCode::LdElemI_A || srcInstr->m_opcode == Js::OpCode::StElemI_A));
20745+ Assert(srcInstr && (srcInstr->m_opcode == Js::OpCode::LdElemI_A || srcInstr->m_opcode == Js::OpCode::StElemI_A || srcInstr->m_opcode == Js::OpCode::StElemI_A_Strict ));
2074520746 Assert(memopInstr && (memopInstr->m_opcode == Js::OpCode::Memcopy || memopInstr->m_opcode == Js::OpCode::Memset));
2074620747 Assert(block);
20747- const bool isDst = srcInstr->m_opcode == Js::OpCode::StElemI_A;
20748+ const bool isDst = srcInstr->m_opcode == Js::OpCode::StElemI_A || srcInstr->m_opcode == Js::OpCode::StElemI_A_Strict ;
2074820749 IR::RegOpnd* opnd = (isDst ? memopInstr->GetDst() : memopInstr->GetSrc1())->AsIndirOpnd()->GetBaseOpnd();
2074920750 IR::ArrayRegOpnd* arrayOpnd = opnd->IsArrayRegOpnd() ? opnd->AsArrayRegOpnd() : nullptr;
2075020751
@@ -20811,7 +20812,7 @@ GlobOpt::RemoveMemOpSrcInstr(IR::Instr* memopInstr, IR::Instr* srcInstr, BasicBl
2081120812void
2081220813GlobOpt::GetMemOpSrcInfo(Loop* loop, IR::Instr* instr, IR::RegOpnd*& base, IR::RegOpnd*& index, IRType& arrayType)
2081320814{
20814- Assert(instr && (instr->m_opcode == Js::OpCode::LdElemI_A || instr->m_opcode == Js::OpCode::StElemI_A));
20815+ Assert(instr && (instr->m_opcode == Js::OpCode::LdElemI_A || instr->m_opcode == Js::OpCode::StElemI_A || instr->m_opcode == Js::OpCode::StElemI_A_Strict ));
2081520816 IR::Opnd* arrayOpnd = instr->m_opcode == Js::OpCode::LdElemI_A ? instr->GetSrc1() : instr->GetDst();
2081620817 Assert(arrayOpnd->IsIndirOpnd());
2081720818
@@ -20833,7 +20834,7 @@ GlobOpt::EmitMemop(Loop * loop, LoopCount *loopCount, const MemOpEmitData* emitD
2083320834 Assert(emitData);
2083420835 Assert(emitData->candidate);
2083520836 Assert(emitData->stElemInstr);
20836- Assert(emitData->stElemInstr->m_opcode == Js::OpCode::StElemI_A);
20837+ Assert(emitData->stElemInstr->m_opcode == Js::OpCode::StElemI_A || emitData->stElemInstr->m_opcode == Js::OpCode::StElemI_A_Strict );
2083720838 IR::BailOutKind bailOutKind = emitData->bailOutKind;
2083820839
2083920840 const byte unroll = emitData->inductionVar.unroll;
@@ -20993,7 +20994,7 @@ GlobOpt::InspectInstrForMemSetCandidate(Loop* loop, IR::Instr* instr, MemSetEmit
2099320994{
2099420995 Assert(emitData && emitData->candidate && emitData->candidate->IsMemSet());
2099520996 Loop::MemSetCandidate* candidate = (Loop::MemSetCandidate*)emitData->candidate;
20996- if (instr->m_opcode == Js::OpCode::StElemI_A)
20997+ if (instr->m_opcode == Js::OpCode::StElemI_A || instr->m_opcode == Js::OpCode::StElemI_A_Strict )
2099720998 {
2099820999 if (instr->GetDst()->IsIndirOpnd()
2099921000 && (GetVarSymID(instr->GetDst()->AsIndirOpnd()->GetBaseOpnd()->GetStackSym()) == candidate->base)
@@ -21021,7 +21022,7 @@ GlobOpt::InspectInstrForMemCopyCandidate(Loop* loop, IR::Instr* instr, MemCopyEm
2102121022{
2102221023 Assert(emitData && emitData->candidate && emitData->candidate->IsMemCopy());
2102321024 Loop::MemCopyCandidate* candidate = (Loop::MemCopyCandidate*)emitData->candidate;
21024- if (instr->m_opcode == Js::OpCode::StElemI_A)
21025+ if (instr->m_opcode == Js::OpCode::StElemI_A || instr->m_opcode == Js::OpCode::StElemI_A_Strict )
2102521026 {
2102621027 if (
2102721028 instr->GetDst()->IsIndirOpnd() &&
0 commit comments