diff --git a/lib/Backend/GlobOpt.cpp b/lib/Backend/GlobOpt.cpp index d134594903b..e19eed15127 100644 --- a/lib/Backend/GlobOpt.cpp +++ b/lib/Backend/GlobOpt.cpp @@ -1167,6 +1167,10 @@ void GlobOpt::InsertValueCompensation( IR::Instr *insertBeforeInstr = predecessor->GetLastInstr(); Func *const func = insertBeforeInstr->m_func; bool setLastInstrInPredecessor; + // If this is a loop back edge, and the successor has been completed, don't attempt to update its block data. + // The update is unnecessary, and the data has likely been freed. + bool updateSuccessorBlockData = !this->isPerformingLoopBackEdgeCompensation || successor->GetDataUseCount() > 0; + if(insertBeforeInstr->IsBranchInstr() || insertBeforeInstr->m_opcode == Js::OpCode::BailTarget) { // Don't insert code between the branch and the corresponding ByteCodeUses instructions @@ -1257,29 +1261,33 @@ void GlobOpt::InsertValueCompensation( // Merge the head segment length value Assert(predecessorBlockData.liveVarSyms->Test(predecessorHeadSegmentLengthSym->m_id)); predecessorBlockData.liveVarSyms->Set(mergedHeadSegmentLengthSym->m_id); - successorBlockData.liveVarSyms->Set(mergedHeadSegmentLengthSym->m_id); Value *const predecessorHeadSegmentLengthValue = predecessorBlockData.FindValue(predecessorHeadSegmentLengthSym); Assert(predecessorHeadSegmentLengthValue); predecessorBlockData.SetValue(predecessorHeadSegmentLengthValue, mergedHeadSegmentLengthSym); - Value *const mergedHeadSegmentLengthValue = successorBlockData.FindValue(mergedHeadSegmentLengthSym); - if(mergedHeadSegmentLengthValue) + + if (updateSuccessorBlockData) { - Assert(mergedHeadSegmentLengthValue->GetValueNumber() != predecessorHeadSegmentLengthValue->GetValueNumber()); - if(predecessorHeadSegmentLengthValue->GetValueInfo() != mergedHeadSegmentLengthValue->GetValueInfo()) + successorBlockData.liveVarSyms->Set(mergedHeadSegmentLengthSym->m_id); + Value *const mergedHeadSegmentLengthValue = successorBlockData.FindValue(mergedHeadSegmentLengthSym); + if(mergedHeadSegmentLengthValue) { - mergedHeadSegmentLengthValue->SetValueInfo( - ValueInfo::MergeLikelyIntValueInfo( - this->alloc, - mergedHeadSegmentLengthValue, - predecessorHeadSegmentLengthValue, - mergedHeadSegmentLengthValue->GetValueInfo()->Type() - .Merge(predecessorHeadSegmentLengthValue->GetValueInfo()->Type()))); + Assert(mergedHeadSegmentLengthValue->GetValueNumber() != predecessorHeadSegmentLengthValue->GetValueNumber()); + if(predecessorHeadSegmentLengthValue->GetValueInfo() != mergedHeadSegmentLengthValue->GetValueInfo()) + { + mergedHeadSegmentLengthValue->SetValueInfo( + ValueInfo::MergeLikelyIntValueInfo( + this->alloc, + mergedHeadSegmentLengthValue, + predecessorHeadSegmentLengthValue, + mergedHeadSegmentLengthValue->GetValueInfo()->Type() + .Merge(predecessorHeadSegmentLengthValue->GetValueInfo()->Type()))); + } + } + else + { + successorBlockData.SetValue(CopyValue(predecessorHeadSegmentLengthValue), mergedHeadSegmentLengthSym); } - } - else - { - successorBlockData.SetValue(CopyValue(predecessorHeadSegmentLengthValue), mergedHeadSegmentLengthSym); } } @@ -1300,27 +1308,31 @@ void GlobOpt::InsertValueCompensation( // Merge the length value Assert(predecessorBlockData.liveVarSyms->Test(predecessorLengthSym->m_id)); predecessorBlockData.liveVarSyms->Set(mergedLengthSym->m_id); - successorBlockData.liveVarSyms->Set(mergedLengthSym->m_id); Value *const predecessorLengthValue = predecessorBlockData.FindValue(predecessorLengthSym); Assert(predecessorLengthValue); predecessorBlockData.SetValue(predecessorLengthValue, mergedLengthSym); - Value *const mergedLengthValue = successorBlockData.FindValue(mergedLengthSym); - if(mergedLengthValue) + + if (updateSuccessorBlockData) { - Assert(mergedLengthValue->GetValueNumber() != predecessorLengthValue->GetValueNumber()); - if(predecessorLengthValue->GetValueInfo() != mergedLengthValue->GetValueInfo()) + successorBlockData.liveVarSyms->Set(mergedLengthSym->m_id); + Value *const mergedLengthValue = successorBlockData.FindValue(mergedLengthSym); + if(mergedLengthValue) { - mergedLengthValue->SetValueInfo( - ValueInfo::MergeLikelyIntValueInfo( - this->alloc, - mergedLengthValue, - predecessorLengthValue, - mergedLengthValue->GetValueInfo()->Type().Merge(predecessorLengthValue->GetValueInfo()->Type()))); + Assert(mergedLengthValue->GetValueNumber() != predecessorLengthValue->GetValueNumber()); + if(predecessorLengthValue->GetValueInfo() != mergedLengthValue->GetValueInfo()) + { + mergedLengthValue->SetValueInfo( + ValueInfo::MergeLikelyIntValueInfo( + this->alloc, + mergedLengthValue, + predecessorLengthValue, + mergedLengthValue->GetValueInfo()->Type().Merge(predecessorLengthValue->GetValueInfo()->Type()))); + } + } + else + { + successorBlockData.SetValue(CopyValue(predecessorLengthValue), mergedLengthSym); } - } - else - { - successorBlockData.SetValue(CopyValue(predecessorLengthValue), mergedLengthSym); } }