Skip to content

Commit 76ea5c0

Browse files
committed
OpaqueArchetypeSpecializer: Fix casting of types that contain an object type
rdar://50592605
1 parent 6966f12 commit 76ea5c0

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

lib/SILOptimizer/Transforms/SpecializeOpaqueArchetypes.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -344,17 +344,18 @@ class OpaqueSpecializerCloner
344344
loc, opd, type, /*withoutActuallyEscaping*/ false);
345345
} else if (opd->getType().isTrivial(CurFn)) {
346346
return getBuilder().createUncheckedTrivialBitCast(loc, opd, type);
347-
} else if (opd->getType().isObject()) {
347+
} else if (opd->getType().canRefCast(opd->getType(), type,
348+
CurFn.getModule())) {
348349
return getBuilder().createUncheckedRefCast(loc, opd, type);
349350
} else {
350351
// This could be improved upon by recursively recomposing the type.
351352
auto *stackLoc = getBuilder().createAllocStack(loc, type);
352-
auto *addr =
353-
getBuilder().createUncheckedAddrCast(loc, stackLoc, opd->getType());
354-
getBuilder().createTrivialStoreOr(loc, addr, opd,
355-
StoreOwnershipQualifier::Init);
353+
auto *addr = getBuilder().createUncheckedAddrCast(
354+
loc, stackLoc, opd->getType().getAddressType());
355+
getBuilder().createTrivialStoreOr(loc, opd, addr,
356+
StoreOwnershipQualifier::Init, true);
356357
SILValue res = getBuilder().createTrivialLoadOr(
357-
loc, addr, LoadOwnershipQualifier::Take);
358+
loc, stackLoc, LoadOwnershipQualifier::Take, true);
358359
getBuilder().createDeallocStack(loc, stackLoc);
359360
return res;
360361
}

0 commit comments

Comments
 (0)