Skip to content

Commit 0960615

Browse files
committed
merge array profile data with non array objects to prevent infinite bailouts
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.
1 parent b9227f4 commit 0960615

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
@@ -3427,22 +3427,40 @@ GlobOpt::OptSrc(IR::Opnd *opnd, IR::Instr * *pInstr, Value **indirIndexValRef, I
34273427
break;
34283428
}
34293429

3430-
if (profiledArrayType.IsLikelyObject() && profiledArrayType.GetObjectType() == valueType.GetObjectType())
3430+
if (profiledArrayType.IsLikelyObject())
34313431
{
34323432
// Ideally we want to use the most specialized type seen by this path, but when that causes bailouts use the least specialized type instead.
3433-
if (useAggressiveSpecialization && !valueType.IsLikelyNativeIntArray() &&
3434-
(profiledArrayType.HasIntElements() || (valueType.HasVarElements() && profiledArrayType.HasFloatElements())))
3433+
if (useAggressiveSpecialization &&
3434+
profiledArrayType.GetObjectType() == valueType.GetObjectType() &&
3435+
!valueType.IsLikelyNativeIntArray() &&
3436+
(
3437+
profiledArrayType.HasIntElements() || (valueType.HasVarElements() && profiledArrayType.HasFloatElements())
3438+
))
34353439
{
34363440
// use the more specialized type profiled by the instruction.
34373441
valueType = profiledArrayType.SetHasNoMissingValues(valueType.HasNoMissingValues());
34383442
ChangeValueType(this->currentBlock, CurrentBlockData()->FindValue(opnd->AsRegOpnd()->m_sym), valueType, false);
34393443
}
3440-
else if (!useAggressiveSpecialization && valueType.IsLikelyNativeArray() &&
3441-
(profiledArrayType.HasVarElements() || (valueType.HasIntElements() && profiledArrayType.HasFloatElements())))
3444+
else if (!useAggressiveSpecialization &&
3445+
(profiledArrayType.GetObjectType() != valueType.GetObjectType() ||
3446+
(
3447+
valueType.IsLikelyNativeArray() &&
3448+
(
3449+
profiledArrayType.HasVarElements() || (valueType.HasIntElements() && profiledArrayType.HasFloatElements())
3450+
)
3451+
)
3452+
))
34423453
{
34433454
// Merge array type we pulled from profile with type propagated by dataflow.
3444-
valueType = valueType.Merge(profiledArrayType).SetHasNoMissingValues(valueType.HasNoMissingValues());
3445-
ChangeValueType(this->currentBlock, CurrentBlockData()->FindValue(opnd->AsRegOpnd()->m_sym), valueType, false);
3455+
if (profiledArrayType.IsLikelyArray())
3456+
{
3457+
valueType = valueType.Merge(profiledArrayType).SetHasNoMissingValues(valueType.HasNoMissingValues());
3458+
}
3459+
else
3460+
{
3461+
valueType = valueType.Merge(profiledArrayType);
3462+
}
3463+
ChangeValueType(this->currentBlock, CurrentBlockData()->FindValue(opnd->AsRegOpnd()->m_sym), valueType, false, true);
34463464
}
34473465
}
34483466
}

0 commit comments

Comments
 (0)