swift
swift copied to clipboard
[SR-15201] [AutoDiff] Assertion failure when using a throwing function within `gradient()`
Previous ID | SR-15201 |
Radar | rdar://problem/83202385 |
Original Reporter | @BradLarson |
Type | Bug |
Additional Detail from JIRA
Votes | 0 |
Component/s | Compiler |
Labels | Bug, AutoDiff |
Assignee | None |
Priority | Medium |
md5: 58e7af91200f09a12afa7f4d5dd2f852
Issue Description:
When a throwing function is used within gradient(), as in the following simple reproducer:
import _Differentiation
enum E: Error {
case error
}
@differentiable(reverse)
func f(x: Double) throws -> Double {
if x < 0 {
throw E.error
}
else {
return x * x
}
}
print(gradient(at: 2.0, of: {x in try! f(x: x)}))
an assertion failure of "(!NodePtr->isKnownSentinel())" results. This seems closely related to TF-7, and may be another case of needing to add a diagnostic to catch this.
The full stack traces that results is as follows:
Assertion failed: (!NodePtr->isKnownSentinel()), function operator*, file /Users/bradlarson/Development/BradLarson2/swift-source/llvm-project/llvm/include/llvm/ADT/ilist_iterator.h, line 138.
Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the project and the crash backtrace.
Stack dump:
0. Program arguments: /Users/bradlarson/Development/BradLarson2/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Debug/bin/swift-frontend -frontend -c -primary-file ../../CompilerBugs/TryCrasher.swift -target x86_64-apple-macosx11.0 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk -color-diagnostics -new-driver-path /Users/bradlarson/Development/BradLarson2/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Debug/bin/swift-driver -resource-dir /Users/bradlarson/Development/BradLarson2/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Debug/lib/swift -module-name TryCrasher -target-sdk-version 11.3.0 -o /var/folders/1s/z_s04yq55wq2jvgqghm8zm7w0000gp/T/TemporaryDirectory.ugUkH0/TryCrasher-1.o
1. Swift version 5.6-dev (LLVM dc8233efdefef2a, Swift 7bc090907c169d0)
2. Compiling with the current language version
3. While evaluating request ExecuteSILPipelineRequest(Run pipelines { Mandatory Diagnostic Passes + Enabling Optimization Passes } on SIL for TryCrasher)
4. While running pass #​106 SILModuleTransform "Differentiation".
5. While canonicalizing `differentiable_function` SIL node %16 = differentiable_function [parameters 0] [results 0] %15 : $@callee_guaranteed (Double) -> Double // user: %17
6. While ...in SIL function "@main".
7. While processing // differentiability witness for closure #​1 in
sil_differentiability_witness private [reverse] [parameters 0] [results 0] @$s10TryCrasherS2dcfU_ : $@convention(thin) (Double) -> Double {
}
on SIL function "@$s10TryCrasherS2dcfU_".
for expression at [../../CompilerBugs/TryCrasher.swift:17:29 - line:17:47] RangeText="{x in try! f(x: x)"
8. While generating VJP for SIL function "@$s10TryCrasherS2dcfU_".
for expression at [../../CompilerBugs/TryCrasher.swift:17:29 - line:17:47] RangeText="{x in try! f(x: x)"
9. While generating pullback for SIL function "@$s10TryCrasherS2dcfU_".
for expression at [../../CompilerBugs/TryCrasher.swift:17:29 - line:17:47] RangeText="{x in try! f(x: x)"
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0 swift-frontend 0x000000010f5b28a7 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 39
1 swift-frontend 0x000000010f5b16c8 llvm::sys::RunSignalHandlers() + 248
2 swift-frontend 0x000000010f5b30f6 SignalHandler(int) + 262
3 libsystem_platform.dylib 0x00007fff204c0d7d _sigtramp + 29
4 swift-frontend 0x0000000111ca0000 (anonymous namespace)::DarwinX86AsmBackend::getCompactUnwindRegNum(unsigned int) const::CU64BitRegs + 250390
5 libsystem_c.dylib 0x00007fff203d0411 abort + 120
6 libsystem_c.dylib 0x00007fff203cf7e8 err + 0
7 swift-frontend 0x000000010809d6ff llvm::ilist_iterator<llvm::ilist_detail::node_options<swift::SILInstruction, true, false, void>, true, false>::operator*() const + 79
8 swift-frontend 0x000000010809d662 llvm::simple_ilist<swift::SILInstruction>::back() + 34
9 swift-frontend 0x000000010809c70e swift::SILBasicBlock::back() + 30
10 swift-frontend 0x00000001091147e6 swift::autodiff::PullbackCloner::Implementation::run() + 7926
11 swift-frontend 0x00000001091128ac swift::autodiff::PullbackCloner::run() + 28
12 swift-frontend 0x000000010915dbb5 swift::autodiff::VJPCloner::Implementation::run() + 869
13 swift-frontend 0x000000010915e3bc swift::autodiff::VJPCloner::run() + 28
14 swift-frontend 0x000000010941977d (anonymous namespace)::DifferentiationTransformer::canonicalizeDifferentiabilityWitness(swift::SILDifferentiabilityWitness*, swift::autodiff::DifferentiationInvoker, swift::IsSerialized_t) + 2045
15 swift-frontend 0x000000010942837e emitDerivativeFunctionReference((anonymous namespace)::DifferentiationTransformer&, swift::SILBuilder&, swift::AutoDiffConfig const&, swift::AutoDiffDerivativeFunctionKind, swift::SILValue, swift::autodiff::DifferentiationInvoker, llvm::SmallVectorImpl<swift::AllocStackInst*>&) + 3934
16 swift-frontend 0x000000010942524b (anonymous namespace)::DifferentiationTransformer::promoteToDifferentiableFunction(swift::DifferentiableFunctionInst*, swift::SILBuilder&, swift::SILLocation, swift::autodiff::DifferentiationInvoker) + 827
17 swift-frontend 0x0000000109419a6e (anonymous namespace)::DifferentiationTransformer::processDifferentiableFunctionInst(swift::DifferentiableFunctionInst*) + 526
18 swift-frontend 0x0000000109418889 (anonymous namespace)::Differentiation::run() + 2153
19 swift-frontend 0x00000001095033ac swift::SILPassManager::runModulePass(unsigned int) + 892
20 swift-frontend 0x00000001095069a5 swift::SILPassManager::execute() + 677
21 swift-frontend 0x00000001094ff37b swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) + 427
22 swift-frontend 0x00000001094ff155 swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const + 101
23 swift-frontend 0x000000010954e13a std::__1::tuple<> swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::__1::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::callDerived<0ul>(swift::Evaluator&, std::__1::integer_sequence<unsigned long, 0ul>) const + 138
24 swift-frontend 0x000000010954e060 swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::__1::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) + 32
25 swift-frontend 0x00000001095209dd llvm::Expected<swift::ExecuteSILPipelineRequest::OutputType> swift::Evaluator::getResultUncached<swift::ExecuteSILPipelineRequest>(swift::ExecuteSILPipelineRequest const&) + 317
26 swift-frontend 0x00000001094ff5cb llvm::Expected<swift::ExecuteSILPipelineRequest::OutputType> swift::Evaluator::operator()<swift::ExecuteSILPipelineRequest, (void*)0>(swift::ExecuteSILPipelineRequest const&) + 43
27 swift-frontend 0x00000001094ff45e swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) + 142
28 swift-frontend 0x0000000109546547 swift::runSILDiagnosticPasses(swift::SILModule&) + 119
29 swift-frontend 0x0000000107e3fa1e performMandatorySILPasses(swift::CompilerInvocation&, swift::SILModule*) + 94
30 swift-frontend 0x0000000107e3f88a swift::CompilerInstance::performSILProcessing(swift::SILModule*) + 42
31 swift-frontend 0x0000000107b7131b performCompileStepsPostSILGen(swift::CompilerInstance&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) + 811
32 swift-frontend 0x0000000107b70d00 performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 656
33 swift-frontend 0x0000000107b70a60 performAction(swift::CompilerInstance&, int&, swift::FrontendObserver*)::$_18::operator()(swift::CompilerInstance&) const + 144
34 swift-frontend 0x0000000107b709c0 bool llvm::function_ref<bool (swift::CompilerInstance&)>::callback_fn<performAction(swift::CompilerInstance&, int&, swift::FrontendObserver*)::$_18>(long, swift::CompilerInstance&) + 48
35 swift-frontend 0x0000000107b66acc llvm::function_ref<bool (swift::CompilerInstance&)>::operator()(swift::CompilerInstance&) const + 60
36 swift-frontend 0x0000000107b65212 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>) + 354
37 swift-frontend 0x0000000107b5e0d3 performAction(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 1059
38 swift-frontend 0x0000000107b4f982 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 290
39 swift-frontend 0x0000000107b4e7e5 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2613
40 swift-frontend 0x0000000107ab96b2 run_driver(llvm::StringRef, llvm::ArrayRef<char const*>) + 354
41 swift-frontend 0x0000000107ab8a19 swift::mainEntry(int, char const**) + 1737
42 swift-frontend 0x0000000107a8c7d2 main + 34
43 libdyld.dylib 0x00007fff20496f5d start + 1