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