Skip to content

Commit 3dad08d

Browse files
authored
Merge pull request swiftlang#37784 from BradLarson/SR-14625
[AutoDiff] [SR-14625] Fix for subset parameters thunk over-consume
2 parents 3d36bde + 2e73e70 commit 3dad08d

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

lib/SILOptimizer/Differentiation/Thunk.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,8 @@ getOrCreateSubsetParametersThunkForLinearMap(
610610
};
611611

612612
// Build a `.zero` argument for the given `Differentiable`-conforming type.
613-
auto buildZeroArgument = [&](SILType zeroSILType) {
613+
auto buildZeroArgument = [&](SILParameterInfo zeroSILParameter) {
614+
auto zeroSILType = zeroSILParameter.getSILStorageInterfaceType();
614615
auto zeroSILObjType = zeroSILType.getObjectType();
615616
auto zeroType = zeroSILType.getASTType();
616617
auto *swiftMod = parentThunk->getModule().getSwiftModule();
@@ -623,13 +624,17 @@ getOrCreateSubsetParametersThunkForLinearMap(
623624
localAllocations.push_back(buf);
624625
builder.emitZeroIntoBuffer(loc, buf, IsInitialization);
625626
if (zeroSILType.isAddress()) {
626-
valuesToCleanup.push_back(buf);
627627
arguments.push_back(buf);
628+
if (zeroSILParameter.isGuaranteed()) {
629+
valuesToCleanup.push_back(buf);
630+
}
628631
} else {
629632
auto arg = builder.emitLoadValueOperation(loc, buf,
630633
LoadOwnershipQualifier::Take);
631-
valuesToCleanup.push_back(arg);
632634
arguments.push_back(arg);
635+
if (zeroSILParameter.isGuaranteed()) {
636+
valuesToCleanup.push_back(arg);
637+
}
633638
}
634639
break;
635640
}
@@ -687,10 +692,9 @@ getOrCreateSubsetParametersThunkForLinearMap(
687692
}
688693
// Otherwise, construct and use a zero argument.
689694
else {
690-
auto zeroSILType =
691-
linearMapType->getParameters()[mapOriginalParameterIndex(i)]
692-
.getSILStorageInterfaceType();
693-
buildZeroArgument(zeroSILType);
695+
auto zeroSILParameter =
696+
linearMapType->getParameters()[mapOriginalParameterIndex(i)];
697+
buildZeroArgument(zeroSILParameter);
694698
}
695699
}
696700
break;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: %target-build-swift %s
2+
3+
// SR-14625: An over-consume in a subset parameters thunk detected after
4+
// enabling OSSA.
5+
6+
import _Differentiation
7+
8+
struct Type2: Differentiable {
9+
var test1: Double
10+
11+
@differentiable(reverse)
12+
public init(test1: Double) {
13+
self.test1 = test1
14+
}
15+
}
16+
17+
struct Type1: Differentiable {
18+
var test1: Double
19+
var test3: [Type2]
20+
21+
@differentiable(reverse)
22+
public init(test1: Double, test3: [Type2]) {
23+
self.test1 = test1
24+
self.test3 = test3
25+
}
26+
}
27+
28+
@differentiable(reverse)
29+
func ingestValue(val1: Double, val2: Double) -> Type1 {
30+
return Type1(test1: val1 * val2, test3: [])
31+
}

0 commit comments

Comments
 (0)