Skip to content

[SR-15201] [AutoDiff] Assertion failure when using a throwing function within gradient() #57523

@BradLarson

Description

@BradLarson
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 #&#8203;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 #&#8203;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 

Metadata

Metadata

Assignees

No one assigned

    Labels

    AutoDiffbugA deviation from expected or documented behavior. Also: expected but undesirable behavior.compilerThe Swift compiler itself

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions