Skip to content

Commit 3105d87

Browse files
asavonicasl
authored andcommitted
Add diagnostics for read accessors
1 parent 9efc651 commit 3105d87

File tree

5 files changed

+23
-14
lines changed

5 files changed

+23
-14
lines changed

include/swift/AST/DiagnosticsSIL.def

+2
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,8 @@ NOTE(autodiff_cannot_differentiate_through_multiple_results,none,
592592
"cannot differentiate through multiple results", ())
593593
NOTE(autodiff_cannot_differentiate_through_inout_arguments,none,
594594
"cannot differentiate through 'inout' arguments", ())
595+
NOTE(autodiff_cannot_differentiate_through_direct_yield,none,
596+
"cannot differentiate through a direct yield result", ())
595597
NOTE(autodiff_enums_unsupported,none,
596598
"differentiating enum values is not yet supported", ())
597599
NOTE(autodiff_stored_property_parent_not_differentiable,none,

lib/SILOptimizer/Differentiation/VJPCloner.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,12 @@ class VJPCloner::Implementation final
564564
// We do not have a good way to differentiate direct yields
565565
if (yield.isAutoDiffSemanticResult())
566566
remappedResultType = yield.getSILStorageInterfaceType();
567+
else {
568+
context.emitNondifferentiabilityError(
569+
origCallee, invoker,
570+
diag::autodiff_cannot_differentiate_through_direct_yield);
571+
return true;
572+
}
567573
} else if (resultIndex >= firstSemanticParamResultIdx) {
568574
auto semanticResultArgIdx = resultIndex - firstSemanticParamResultIdx;
569575
auto semanticResultArg =

lib/SILOptimizer/Mandatory/Differentiation.cpp

+13-12
Original file line numberDiff line numberDiff line change
@@ -157,18 +157,18 @@ static bool diagnoseUnsupportedControlFlow(ADContext &context,
157157
isa<CheckedCastAddrBranchInst>(term) || isa<TryApplyInst>(term))
158158
continue;
159159

160-
// We can differentiate only indirect yields
160+
// We can differentiate only indirect yields.
161161
if (auto *yi = dyn_cast<YieldInst>(term)) {
162-
for (const auto &val : yi->getAllOperands())
163-
if (!yi->getYieldInfoForOperand(val).isAutoDiffSemanticResult()) {
164-
context.emitNondifferentiabilityError(
165-
term, invoker, diag::autodiff_control_flow_not_supported);
166-
return true;
167-
}
168-
162+
#ifndef NDEBUG
163+
for (const auto &val : yi->getAllOperands()) {
164+
// This should be diagnosed earlier in VJPCloner.
165+
assert(yi->getYieldInfoForOperand(val).isAutoDiffSemanticResult() &&
166+
"unsupported result");
167+
}
168+
#endif
169169
continue;
170170
}
171-
171+
172172
// If terminator is an unsupported branching terminator, emit an error.
173173
if (term->isBranch()) {
174174
context.emitNondifferentiabilityError(
@@ -562,9 +562,10 @@ emitDerivativeFunctionReference(
562562
if (resultIndex >= firstYieldResultIndex) {
563563
auto yieldResultIndex = resultIndex - firstYieldResultIndex;
564564
auto yield = originalFnTy->getYields()[yieldResultIndex];
565-
// We can only differentiate indirect yields
566-
if (yield.isAutoDiffSemanticResult())
567-
resultType = yield.getSILStorageInterfaceType();
565+
// We can only differentiate indirect yields. This should be diagnosed
566+
// earlier in VJPCloner.
567+
assert(yield.isAutoDiffSemanticResult() && "unsupported result");
568+
resultType = yield.getSILStorageInterfaceType();
568569
} else if (resultIndex >= firstSemanticParamResultIdx) {
569570
auto semanticResultParamIdx = resultIndex - firstSemanticParamResultIdx;
570571
auto semanticResultParam =

test/AutoDiff/SILOptimizer/activity_analysis.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ struct HasCoroutineModifyAccessors: Differentiable {
594594
// expected-note @+1 {{when differentiating this function definition}}
595595
func testAccessorCoroutinesRead(_ x: HasCoroutineReadAccessors) -> Float {
596596
// We do not support differentiation of _read accessors
597-
// expected-note @+1 {{cannot differentiate through a non-differentiable result; do you want to use 'withoutDerivative(at:)}}
597+
// expected-note @+1 {{cannot differentiate through a direct yield result}}
598598
return x.computed
599599
}
600600

test/AutoDiff/SILOptimizer/differentiation_diagnostics.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ struct HasModifyAccessors: Differentiable {
826826
// expected-note @+2 {{when differentiating this function definition}}
827827
@differentiable(reverse)
828828
func testReadAccessorCoroutines(_ x: HasReadAccessors) -> Float {
829-
// expected-note @+1 {{cannot differentiate through a non-differentiable result; do you want to use 'withoutDerivative(at:)'?}}
829+
// expected-note @+1 {{cannot differentiate through a direct yield result}}
830830
return x.computed
831831
}
832832

0 commit comments

Comments
 (0)