@@ -326,8 +326,19 @@ class OpaqueSpecializerCloner
326
326
loc, opd, type, /* withoutActuallyEscaping*/ false );
327
327
} else if (opd->getType ().isTrivial (CurFn)) {
328
328
return getBuilder ().createUncheckedTrivialBitCast (loc, opd, type);
329
- } else {
329
+ } else if (opd-> getType (). isObject ()) {
330
330
return getBuilder ().createUncheckedRefCast (loc, opd, type);
331
+ } else {
332
+ // This could be improved upon by recursively recomposing the type.
333
+ auto *stackLoc = getBuilder ().createAllocStack (loc, type);
334
+ auto *addr =
335
+ getBuilder ().createUncheckedAddrCast (loc, stackLoc, opd->getType ());
336
+ getBuilder ().createTrivialStoreOr (loc, addr, opd,
337
+ StoreOwnershipQualifier::Init);
338
+ SILValue res = getBuilder ().createTrivialLoadOr (
339
+ loc, addr, LoadOwnershipQualifier::Take);
340
+ getBuilder ().createDeallocStack (loc, stackLoc);
341
+ return res;
331
342
}
332
343
}
333
344
@@ -394,24 +405,7 @@ void OpaqueSpecializerCloner::insertOpaqueToConcreteAddressCasts(
394
405
auto argIdx = apply.getCalleeArgIndex (opd);
395
406
auto argType = substConv.getSILArgumentType (argIdx);
396
407
if (argType.getASTType () != opd.get ()->getType ().getASTType ()) {
397
- if (argConv.isIndirectConvention ()) {
398
- auto cast = getBuilder ().createUncheckedAddrCast (apply.getLoc (),
399
- opd.get (), argType);
400
- opd.set (cast);
401
- } else if (argType.is <SILFunctionType>()) {
402
- auto cast = getBuilder ().createConvertFunction (
403
- apply.getLoc (), opd.get (), argType,
404
- /* withoutActuallyEscaping*/ false );
405
- opd.set (cast);
406
- } else if (argType.isTrivial (getBuilder ().getFunction ())) {
407
- auto cast = getBuilder ().createUncheckedTrivialBitCast (
408
- apply.getLoc (), opd.get (), argType);
409
- opd.set (cast);
410
- } else {
411
- auto cast = getBuilder ().createUncheckedRefCast (apply.getLoc (),
412
- opd.get (), argType);
413
- opd.set (cast);
414
- }
408
+ opd.set (createCast (apply.getLoc (), opd.get (), argType));
415
409
}
416
410
++idx;
417
411
}
0 commit comments