@@ -344,17 +344,18 @@ class OpaqueSpecializerCloner
344
344
loc, opd, type, /* withoutActuallyEscaping*/ false );
345
345
} else if (opd->getType ().isTrivial (CurFn)) {
346
346
return getBuilder ().createUncheckedTrivialBitCast (loc, opd, type);
347
- } else if (opd->getType ().isObject ()) {
347
+ } else if (opd->getType ().canRefCast (opd->getType (), type,
348
+ CurFn.getModule ())) {
348
349
return getBuilder ().createUncheckedRefCast (loc, opd, type);
349
350
} else {
350
351
// This could be improved upon by recursively recomposing the type.
351
352
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 );
356
357
SILValue res = getBuilder ().createTrivialLoadOr (
357
- loc, addr , LoadOwnershipQualifier::Take);
358
+ loc, stackLoc , LoadOwnershipQualifier::Take, true );
358
359
getBuilder ().createDeallocStack (loc, stackLoc);
359
360
return res;
360
361
}
0 commit comments