Skip to content

Commit 95b3e34

Browse files
pleathMikeHolman
authored andcommitted
1 parent fe8f981 commit 95b3e34

File tree

1 file changed

+43
-31
lines changed

1 file changed

+43
-31
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,6 +1167,10 @@ void GlobOpt::InsertValueCompensation(
11671167
IR::Instr *insertBeforeInstr = predecessor->GetLastInstr();
11681168
Func *const func = insertBeforeInstr->m_func;
11691169
bool setLastInstrInPredecessor;
1170+
// If this is a loop back edge, and the successor has been completed, don't attempt to update its block data.
1171+
// The update is unnecessary, and the data has likely been freed.
1172+
bool updateSuccessorBlockData = !this->isPerformingLoopBackEdgeCompensation || successor->GetDataUseCount() > 0;
1173+
11701174
if(insertBeforeInstr->IsBranchInstr() || insertBeforeInstr->m_opcode == Js::OpCode::BailTarget)
11711175
{
11721176
// Don't insert code between the branch and the corresponding ByteCodeUses instructions
@@ -1257,29 +1261,33 @@ void GlobOpt::InsertValueCompensation(
12571261
// Merge the head segment length value
12581262
Assert(predecessorBlockData.liveVarSyms->Test(predecessorHeadSegmentLengthSym->m_id));
12591263
predecessorBlockData.liveVarSyms->Set(mergedHeadSegmentLengthSym->m_id);
1260-
successorBlockData.liveVarSyms->Set(mergedHeadSegmentLengthSym->m_id);
12611264
Value *const predecessorHeadSegmentLengthValue =
12621265
predecessorBlockData.FindValue(predecessorHeadSegmentLengthSym);
12631266
Assert(predecessorHeadSegmentLengthValue);
12641267
predecessorBlockData.SetValue(predecessorHeadSegmentLengthValue, mergedHeadSegmentLengthSym);
1265-
Value *const mergedHeadSegmentLengthValue = successorBlockData.FindValue(mergedHeadSegmentLengthSym);
1266-
if(mergedHeadSegmentLengthValue)
1268+
1269+
if (updateSuccessorBlockData)
12671270
{
1268-
Assert(mergedHeadSegmentLengthValue->GetValueNumber() != predecessorHeadSegmentLengthValue->GetValueNumber());
1269-
if(predecessorHeadSegmentLengthValue->GetValueInfo() != mergedHeadSegmentLengthValue->GetValueInfo())
1271+
successorBlockData.liveVarSyms->Set(mergedHeadSegmentLengthSym->m_id);
1272+
Value *const mergedHeadSegmentLengthValue = successorBlockData.FindValue(mergedHeadSegmentLengthSym);
1273+
if(mergedHeadSegmentLengthValue)
12701274
{
1271-
mergedHeadSegmentLengthValue->SetValueInfo(
1272-
ValueInfo::MergeLikelyIntValueInfo(
1273-
this->alloc,
1274-
mergedHeadSegmentLengthValue,
1275-
predecessorHeadSegmentLengthValue,
1276-
mergedHeadSegmentLengthValue->GetValueInfo()->Type()
1277-
.Merge(predecessorHeadSegmentLengthValue->GetValueInfo()->Type())));
1275+
Assert(mergedHeadSegmentLengthValue->GetValueNumber() != predecessorHeadSegmentLengthValue->GetValueNumber());
1276+
if(predecessorHeadSegmentLengthValue->GetValueInfo() != mergedHeadSegmentLengthValue->GetValueInfo())
1277+
{
1278+
mergedHeadSegmentLengthValue->SetValueInfo(
1279+
ValueInfo::MergeLikelyIntValueInfo(
1280+
this->alloc,
1281+
mergedHeadSegmentLengthValue,
1282+
predecessorHeadSegmentLengthValue,
1283+
mergedHeadSegmentLengthValue->GetValueInfo()->Type()
1284+
.Merge(predecessorHeadSegmentLengthValue->GetValueInfo()->Type())));
1285+
}
1286+
}
1287+
else
1288+
{
1289+
successorBlockData.SetValue(CopyValue(predecessorHeadSegmentLengthValue), mergedHeadSegmentLengthSym);
12781290
}
1279-
}
1280-
else
1281-
{
1282-
successorBlockData.SetValue(CopyValue(predecessorHeadSegmentLengthValue), mergedHeadSegmentLengthSym);
12831291
}
12841292
}
12851293

@@ -1300,27 +1308,31 @@ void GlobOpt::InsertValueCompensation(
13001308
// Merge the length value
13011309
Assert(predecessorBlockData.liveVarSyms->Test(predecessorLengthSym->m_id));
13021310
predecessorBlockData.liveVarSyms->Set(mergedLengthSym->m_id);
1303-
successorBlockData.liveVarSyms->Set(mergedLengthSym->m_id);
13041311
Value *const predecessorLengthValue = predecessorBlockData.FindValue(predecessorLengthSym);
13051312
Assert(predecessorLengthValue);
13061313
predecessorBlockData.SetValue(predecessorLengthValue, mergedLengthSym);
1307-
Value *const mergedLengthValue = successorBlockData.FindValue(mergedLengthSym);
1308-
if(mergedLengthValue)
1314+
1315+
if (updateSuccessorBlockData)
13091316
{
1310-
Assert(mergedLengthValue->GetValueNumber() != predecessorLengthValue->GetValueNumber());
1311-
if(predecessorLengthValue->GetValueInfo() != mergedLengthValue->GetValueInfo())
1317+
successorBlockData.liveVarSyms->Set(mergedLengthSym->m_id);
1318+
Value *const mergedLengthValue = successorBlockData.FindValue(mergedLengthSym);
1319+
if(mergedLengthValue)
13121320
{
1313-
mergedLengthValue->SetValueInfo(
1314-
ValueInfo::MergeLikelyIntValueInfo(
1315-
this->alloc,
1316-
mergedLengthValue,
1317-
predecessorLengthValue,
1318-
mergedLengthValue->GetValueInfo()->Type().Merge(predecessorLengthValue->GetValueInfo()->Type())));
1321+
Assert(mergedLengthValue->GetValueNumber() != predecessorLengthValue->GetValueNumber());
1322+
if(predecessorLengthValue->GetValueInfo() != mergedLengthValue->GetValueInfo())
1323+
{
1324+
mergedLengthValue->SetValueInfo(
1325+
ValueInfo::MergeLikelyIntValueInfo(
1326+
this->alloc,
1327+
mergedLengthValue,
1328+
predecessorLengthValue,
1329+
mergedLengthValue->GetValueInfo()->Type().Merge(predecessorLengthValue->GetValueInfo()->Type())));
1330+
}
1331+
}
1332+
else
1333+
{
1334+
successorBlockData.SetValue(CopyValue(predecessorLengthValue), mergedLengthSym);
13191335
}
1320-
}
1321-
else
1322-
{
1323-
successorBlockData.SetValue(CopyValue(predecessorLengthValue), mergedLengthSym);
13241336
}
13251337
}
13261338

0 commit comments

Comments
 (0)