Skip to content

Commit 4a342e0

Browse files
committed
[MERGE #5012 @sigatrev] merge array profile data with non array objects to prevent infinite bailouts
Merge pull request #5012 from sigatrev:objectArrayBailouts This commit changed the logic for merging instruction level profile data for array opcodes to merge in object data for non conventional arrays when aggressive specialization is off. This prevents infinite bailouts when a function alternates between convensional arrays and typed arrays or other objects.
2 parents 319256d + 0960615 commit 4a342e0

File tree

1 file changed

+25
-7
lines changed

1 file changed

+25
-7
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3414,22 +3414,40 @@ GlobOpt::OptSrc(IR::Opnd *opnd, IR::Instr * *pInstr, Value **indirIndexValRef, I
34143414
break;
34153415
}
34163416

3417-
if (profiledArrayType.IsLikelyObject() && profiledArrayType.GetObjectType() == valueType.GetObjectType())
3417+
if (profiledArrayType.IsLikelyObject())
34183418
{
34193419
// Ideally we want to use the most specialized type seen by this path, but when that causes bailouts use the least specialized type instead.
3420-
if (useAggressiveSpecialization && !valueType.IsLikelyNativeIntArray() &&
3421-
(profiledArrayType.HasIntElements() || (valueType.HasVarElements() && profiledArrayType.HasFloatElements())))
3420+
if (useAggressiveSpecialization &&
3421+
profiledArrayType.GetObjectType() == valueType.GetObjectType() &&
3422+
!valueType.IsLikelyNativeIntArray() &&
3423+
(
3424+
profiledArrayType.HasIntElements() || (valueType.HasVarElements() && profiledArrayType.HasFloatElements())
3425+
))
34223426
{
34233427
// use the more specialized type profiled by the instruction.
34243428
valueType = profiledArrayType.SetHasNoMissingValues(valueType.HasNoMissingValues());
34253429
ChangeValueType(this->currentBlock, CurrentBlockData()->FindValue(opnd->AsRegOpnd()->m_sym), valueType, false);
34263430
}
3427-
else if (!useAggressiveSpecialization && valueType.IsLikelyNativeArray() &&
3428-
(profiledArrayType.HasVarElements() || (valueType.HasIntElements() && profiledArrayType.HasFloatElements())))
3431+
else if (!useAggressiveSpecialization &&
3432+
(profiledArrayType.GetObjectType() != valueType.GetObjectType() ||
3433+
(
3434+
valueType.IsLikelyNativeArray() &&
3435+
(
3436+
profiledArrayType.HasVarElements() || (valueType.HasIntElements() && profiledArrayType.HasFloatElements())
3437+
)
3438+
)
3439+
))
34293440
{
34303441
// Merge array type we pulled from profile with type propagated by dataflow.
3431-
valueType = valueType.Merge(profiledArrayType).SetHasNoMissingValues(valueType.HasNoMissingValues());
3432-
ChangeValueType(this->currentBlock, CurrentBlockData()->FindValue(opnd->AsRegOpnd()->m_sym), valueType, false);
3442+
if (profiledArrayType.IsLikelyArray())
3443+
{
3444+
valueType = valueType.Merge(profiledArrayType).SetHasNoMissingValues(valueType.HasNoMissingValues());
3445+
}
3446+
else
3447+
{
3448+
valueType = valueType.Merge(profiledArrayType);
3449+
}
3450+
ChangeValueType(this->currentBlock, CurrentBlockData()->FindValue(opnd->AsRegOpnd()->m_sym), valueType, false, true);
34333451
}
34343452
}
34353453
}

0 commit comments

Comments
 (0)