|
|
@@ -599,6 +599,11 @@ GlobOpt::OptBlock(BasicBlock *block)
|
|
|
this->tempBv->And(liveOnBackEdge);
|
|
|
this->ToFloat64(this->tempBv, block->loop->landingPad);
|
|
|
|
|
|
+ if (block->loop->symsRequiringCompensationToMergedValueInfoMap)
|
|
|
+ {
|
|
|
+ InsertValueCompensation(block, block->loop->symsRequiringCompensationToMergedValueInfoMap);
|
|
|
+ }
|
|
|
+
|
|
|
// Now that we're done with the liveFields within this loop, trim the set to those syms
|
|
|
// that the backward pass told us were live out of the loop.
|
|
|
// This assumes we have no further need of the liveFields within the loop.
|
|
|
@@ -1151,10 +1156,10 @@ void GlobOpt::FieldPRE(Loop *loop)
|
|
|
|
|
|
void GlobOpt::InsertValueCompensation(
|
|
|
BasicBlock *const predecessor,
|
|
|
- const SymToValueInfoMap &symsRequiringCompensationToMergedValueInfoMap)
|
|
|
+ const SymToValueInfoMap *symsRequiringCompensationToMergedValueInfoMap)
|
|
|
{
|
|
|
Assert(predecessor);
|
|
|
- Assert(symsRequiringCompensationToMergedValueInfoMap.Count() != 0);
|
|
|
+ Assert(symsRequiringCompensationToMergedValueInfoMap->Count() != 0);
|
|
|
|
|
|
IR::Instr *insertBeforeInstr = predecessor->GetLastInstr();
|
|
|
Func *const func = insertBeforeInstr->m_func;
|
|
|
@@ -1193,7 +1198,7 @@ void GlobOpt::InsertValueCompensation(
|
|
|
}
|
|
|
};
|
|
|
JsUtil::List<DelayChangeValueInfo, ArenaAllocator> delayChangeValueInfo(alloc);
|
|
|
- for(auto it = symsRequiringCompensationToMergedValueInfoMap.GetIterator(); it.IsValid(); it.MoveNext())
|
|
|
+ for(auto it = symsRequiringCompensationToMergedValueInfoMap->GetIterator(); it.IsValid(); it.MoveNext())
|
|
|
{
|
|
|
const auto &entry = it.Current();
|
|
|
Sym *const sym = entry.Key();
|
|
|
@@ -1840,6 +1845,10 @@ GlobOpt::IsAllowedForMemOpt(IR::Instr* instr, bool isMemset, IR::RegOpnd *baseOp
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
if (!baseValueType.IsTypedArray())
|
|
|
{
|
|
|
@@ -2843,12 +2852,6 @@ GlobOpt::OptDst(
|
|
|
{
|
|
|
this->FinishOptPropOp(instr, opnd->AsPropertySymOpnd());
|
|
|
}
|
|
|
- else if (instr->m_opcode == Js::OpCode::StElemI_A ||
|
|
|
- instr->m_opcode == Js::OpCode::StElemI_A_Strict ||
|
|
|
- instr->m_opcode == Js::OpCode::InitComputedProperty)
|
|
|
- {
|
|
|
- this->KillObjectHeaderInlinedTypeSyms(this->currentBlock, false);
|
|
|
- }
|
|
|
|
|
|
if (opnd->IsIndirOpnd() && !this->IsLoopPrePass())
|
|
|
{
|
|
|
@@ -16854,6 +16857,9 @@ GlobOpt::EmitMemop(Loop * loop, LoopCount *loopCount, const MemOpEmitData* emitD
|
|
|
memopInstr->SetSrc2(sizeOpnd);
|
|
|
insertBeforeInstr->InsertBefore(memopInstr);
|
|
|
|
|
|
+
|
|
|
+ loop->memOpInfo->instr = memopInstr;
|
|
|
+
|
|
|
#if DBG_DUMP
|
|
|
if (DO_MEMOP_TRACE())
|
|
|
{
|