@@ -324,7 +324,8 @@ static void copyParameterArgumentsForApply(
324
324
// Objects are to be retained.
325
325
if (arg->getType ().isObject ()) {
326
326
auto newArg = arg;
327
- if (newArg.getOwnershipKind () != OwnershipKind::None)
327
+ if (!copyBuilder.hasOwnership () ||
328
+ newArg.getOwnershipKind () != OwnershipKind::None)
328
329
newArg = copyBuilder.emitCopyValueOperation (loc, arg);
329
330
collectNewArg (newArg);
330
331
continue ;
@@ -500,7 +501,8 @@ emitDerivativeFunctionReference(
500
501
builder.emitBeginBorrowOperation (original.getLoc (), original);
501
502
SILValue derivativeFn = builder.createDifferentiableFunctionExtract (
502
503
borrowedDiffFunc.getLoc (), kind, borrowedDiffFunc);
503
- if (derivativeFn.getOwnershipKind () != OwnershipKind::None)
504
+ if (!builder.hasOwnership () ||
505
+ derivativeFn.getOwnershipKind () != OwnershipKind::None)
504
506
derivativeFn =
505
507
builder.emitCopyValueOperation (original.getLoc (), derivativeFn);
506
508
builder.emitEndBorrowOperation (original.getLoc (), borrowedDiffFunc);
@@ -867,7 +869,8 @@ static void emitFatalError(ADContext &context, SILFunction *f,
867
869
auto loc = f->getLocation ();
868
870
// Destroy all owned arguments to pass ownership verification.
869
871
for (auto *arg : entry->getArguments ())
870
- if (arg->getOwnershipKind () == OwnershipKind::Owned)
872
+ if (!builder.hasOwnership () ||
873
+ arg->getOwnershipKind () == OwnershipKind::Owned)
871
874
builder.emitDestroyOperation (loc, arg);
872
875
// Fatal error with a nice message.
873
876
auto neverResultInfo =
@@ -1213,7 +1216,8 @@ SILValue DifferentiationTransformer::promoteToDifferentiableFunction(
1213
1216
builder.createDeallocStack (loc, buf);
1214
1217
1215
1218
// If our original copy does not have none ownership, copy it.
1216
- if (origFnOperand.getOwnershipKind () != OwnershipKind::None)
1219
+ if (!builder.hasOwnership () ||
1220
+ origFnOperand.getOwnershipKind () != OwnershipKind::None)
1217
1221
origFnOperand = builder.emitCopyValueOperation (loc, origFnOperand);
1218
1222
auto *newDiffFn = context.createDifferentiableFunction (
1219
1223
builder, loc, parameterIndices, resultIndices, origFnOperand,
@@ -1229,7 +1233,8 @@ SILValue DifferentiationTransformer::promoteToLinearFunction(
1229
1233
// with an undef transpose function operand. Eventually, a legitimate
1230
1234
// transpose function operand should be created and used.
1231
1235
auto origFnOperand = lfi->getOriginalFunction ();
1232
- if (origFnOperand.getOwnershipKind () != OwnershipKind::None)
1236
+ if (!builder.hasOwnership () ||
1237
+ origFnOperand.getOwnershipKind () != OwnershipKind::None)
1233
1238
origFnOperand = builder.emitCopyValueOperation (loc, origFnOperand);
1234
1239
auto *parameterIndices = lfi->getParameterIndices ();
1235
1240
auto originalType = origFnOperand->getType ().castTo <SILFunctionType>();
0 commit comments