Skip to content

Commit d50c8f6

Browse files
committed
[SIL-opaque] avoid handling operands past 64k
1 parent 71175f7 commit d50c8f6

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

lib/SILOptimizer/Mandatory/AddressLowering.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,11 @@ void ValueStorageMap::recordComposingUseProjection(Operand *oper,
840840
auto &storage = getStorage(oper->get());
841841
assert(!storage.isAllocated());
842842
storage.projectedStorageID = getOrdinal(userValue);
843+
843844
storage.projectedOperandNum = oper->getOperandNumber();
845+
assert(storage.projectedOperandNum == oper->getOperandNumber() &&
846+
"operand overflow");
847+
844848
storage.isUseProjection = true;
845849

846850
if (EnumDecl *enumDecl = userValue->getType().getEnumOrBoundGenericEnum()) {
@@ -1011,6 +1015,10 @@ bool OpaqueStorageAllocation::findProjectionIntoUseImpl(
10111015
assert(!getProjectedDefOperand(userValue)
10121016
&& "storage cannot project in two directions.");
10131017

1018+
// Avoid handling preposterous types.
1019+
if (use->getOperandNumber() > UINT16_MAX)
1020+
continue;
1021+
10141022
// Recurse through all storage projections to find the uniquely allocated
10151023
// storage. Enum storage cannot be reused across multiple subobjects because
10161024
// it must be initialized via a single init_enum_data_addr instruction.

0 commit comments

Comments
 (0)