swift icon indicating copy to clipboard operation
swift copied to clipboard

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

Open BradLarson opened this issue 2 years ago • 3 comments

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

BradLarson avatar Sep 16 '21 15:09 BradLarson