Skip to content

Commit 248de97

Browse files
committed
OpaqueArchetypeSpecializer: Fix casting of types that contain an object type
rdar://50592605
1 parent 54d28ce commit 248de97

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
@@ -349,17 +349,18 @@ class OpaqueSpecializerCloner
349349
loc, opd, type, /*withoutActuallyEscaping*/ false);
350350
} else if (opd->getType().isTrivial(CurFn)) {
351351
return getBuilder().createUncheckedTrivialBitCast(loc, opd, type);
352-
} else if (opd->getType().isObject()) {
352+
} else if (opd->getType().canRefCast(opd->getType(), type,
353+
CurFn.getModule())) {
353354
return getBuilder().createUncheckedRefCast(loc, opd, type);
354355
} else {
355356
// This could be improved upon by recursively recomposing the type.
356357
auto *stackLoc = getBuilder().createAllocStack(loc, type);
357-
auto *addr =
358-
getBuilder().createUncheckedAddrCast(loc, stackLoc, opd->getType());
359-
getBuilder().createTrivialStoreOr(loc, addr, opd,
360-
StoreOwnershipQualifier::Init);
358+
auto *addr = getBuilder().createUncheckedAddrCast(
359+
loc, stackLoc, opd->getType().getAddressType());
360+
getBuilder().createTrivialStoreOr(loc, opd, addr,
361+
StoreOwnershipQualifier::Init, true);
361362
SILValue res = getBuilder().createTrivialLoadOr(
362-
loc, addr, LoadOwnershipQualifier::Take);
363+
loc, stackLoc, LoadOwnershipQualifier::Take, true);
363364
getBuilder().createDeallocStack(loc, stackLoc);
364365
return res;
365366
}

0 commit comments

Comments
 (0)