[SilOpt] Add new layout type _TrivialStride and add pre-specialization suppport for it (#70308)

rdar://119329771

This layout allows adding pre-specializations for trivial types that have a different size, but the same stride. This is especially useful for collections, where the stride is the important factor.
This commit is contained in:
Dario Rexin
2023-12-09 08:13:50 -08:00
committed by GitHub
parent 568b682243
commit 36dd2c9450
19 changed files with 114 additions and 21 deletions

View File

@@ -1480,6 +1480,8 @@ void Serializer::serializeGenericRequirements(
if (layout->isKnownSizeTrivial()) {
size = layout->getTrivialSizeInBits();
alignment = layout->getAlignmentInBits();
} else if (layout->isTrivialStride()) {
size = layout->getTrivialStrideInBits();
}
LayoutRequirementKind rawKind = LayoutRequirementKind::UnknownLayout;
switch (layout->getKind()) {
@@ -1510,6 +1512,9 @@ void Serializer::serializeGenericRequirements(
case LayoutConstraintKind::BridgeObject:
rawKind = LayoutRequirementKind::BridgeObject;
break;
case LayoutConstraintKind::TrivialStride:
rawKind = LayoutRequirementKind::TrivialStride;
break;
}
scratch.push_back(rawKind);
scratch.push_back(addTypeRef(req.getFirstType()));