Skip to content

Commit 4888e27

Browse files
committed
[MERGE #778] MemOp StElemI_A_Strict
Merge pull request #778 from Cellule:memop/stelem_strict Add StElemI_A_Strict as a valid opcode for memop. Currently not much (if any) perf impact, mostly due to the bounds check opt in memop. Expects to accept more memcopy/memset than before. This opcode should have been there from the start, it was simply an overlook.
2 parents d1984c4 + fa155ea commit 4888e27

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4399,7 +4399,7 @@ GlobOpt::CollectMemOpLdElementI(IR::Instr *instr, Loop *loop)
43994399
bool
44004400
GlobOpt::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)
2074120742
void
2074220743
GlobOpt::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
2081120812
void
2081220813
GlobOpt::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

Comments
 (0)