Closed
Description
Description
While differentiableMap
exists (see https://github.com/swiftlang/swift/blob/54f0bf2/stdlib/public/Differentiation/ArrayDifferentiation.swift#L355-L405), one might mistakenly try to use regular non-differentiable map
for an Array
. This causes a fatal error, while a proper error message (for example, saying that map
is not differentiable) should be emitted.
/path/to/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/bin/swift-frontend -emit-sil crash.swift
Reproduction
import _Differentiation
@differentiable(reverse)
func mymap(_ a: [Float]) -> [Float] {
return a.map { $0 }
}
Stack dump
<unknown>:0: error: fatal error encountered during compilation; please submit a bug report (https://swift.org/contributing/#reporting-bugs)
<unknown>:0: note: do not know how to handle this incoming bb argument
Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
Stack dump:
0. Program arguments: /path/to/swift/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/bin/swift-frontend -emit-sil crash.swift
1. Swift version 6.2-dev (LLVM 94a95edd9aa32e1, Swift c4b0e97c11c5af6)
2. Compiling with effective version 5.10
3. While evaluating request ExecuteSILPipelineRequest(Run pipelines { Mandatory Diagnostic Passes + Enabling Optimization Passes } on SIL for crash)
4. While running pass #47 SILModuleTransform "Differentiation".
5. While processing // differentiability witness for mymap(_:)
sil_differentiability_witness hidden [reverse] [parameters 0] [results 0] @$s5crash5mymapySaySfGACF : $@convention(thin) (@guaranteed Array<Float>) -> @owned Array<Float> {
}
on SIL function "@$s5crash5mymapySaySfGACF".
for 'mymap(_:)' (at crash.swift:4:1)
6. While generating VJP for SIL function "@$s5crash5mymapySaySfGACF".
for 'mymap(_:)' (at crash.swift:4:1)
7. While generating pullback for SIL function "@$s5crash5mymapySaySfGACF".
for 'mymap(_:)' (at crash.swift:4:1)
#0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /path/to/swift/llvm-project/llvm/lib/Support/Unix/Signals.inc:728:13
#1 llvm::sys::RunSignalHandlers() /path/to/swift/llvm-project/llvm/lib/Support/Signals.cpp:106:18
#2 SignalHandler(int, siginfo_t*, void*) /path/to/swift/llvm-project/llvm/lib/Support/Unix/Signals.inc:0:3
#3 (/usr/lib/libc.so.6+0x3d600)
#4 __pthread_kill_implementation /usr/src/debug/glibc/glibc/nptl/pthread_kill.c:44:76
#5 raise /usr/src/debug/glibc/glibc/signal/../sysdeps/posix/raise.c:27:6
#6 abort /usr/src/debug/glibc/glibc/stdlib/abort.c:81:3
#7 llvm::ThreadSafeRefCountedBase<llvm::vfs::FileSystem>::Release() const /path/to/swift/llvm-project/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:135:5
#8 llvm::IntrusiveRefCntPtrInfo<llvm::vfs::FileSystem>::release(llvm::vfs::FileSystem*) /path/to/swift/llvm-project/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:164:38
#9 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>::release() /path/to/swift/llvm-project/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:233:7
#10 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>::~IntrusiveRefCntPtr() /path/to/swift/llvm-project/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:196:27
#11 swift::DiagnosticHelper::Implementation::diagnoseFatalError(char const*, bool) /path/to/swift/swift/lib/Frontend/DiagnosticHelper.cpp:484:17
#12 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::_M_data() const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/basic_string.h:239:28
#13 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::_M_is_local() const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/basic_string.h:280:6
#14 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::_M_dispose() /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/basic_string.h:298:7
#15 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string() /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/basic_string.h:896:9
#16 llvm::report_fatal_error(llvm::Twine const&, bool) /path/to/swift/llvm-project/llvm/lib/Support/ErrorHandling.cpp:104:5
#17 (/path/to/swift/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/bin/swift-frontend+0x823ef76)
#18 swift::autodiff::LinearMapInfo::lookUpBranchingTraceEnumElement(swift::SILBasicBlock*, swift::SILBasicBlock*) const /path/to/swift/swift/include/swift/SILOptimizer/Differentiation/LinearMapInfo.h:178:5
#19 swift::autodiff::PullbackCloner::Implementation::visitSILBasicBlock(swift::SILBasicBlock*) /path/to/swift/swift/lib/SILOptimizer/Differentiation/PullbackCloner.cpp:3147:27
#20 swift::autodiff::PullbackCloner::Implementation::run() /path/to/swift/swift/lib/SILOptimizer/Differentiation/PullbackCloner.cpp:2589:11
#21 swift::autodiff::PullbackCloner::run() /path/to/swift/swift/lib/SILOptimizer/Differentiation/PullbackCloner.cpp:2122:7
#22 swift::autodiff::VJPCloner::Implementation::run() /path/to/swift/swift/lib/SILOptimizer/Differentiation/VJPCloner.cpp:1445:7
#23 swift::autodiff::VJPCloner::run() /path/to/swift/swift/lib/SILOptimizer/Differentiation/VJPCloner.cpp:1455:7
#24 (anonymous namespace)::DifferentiationTransformer::canonicalizeDifferentiabilityWitness(swift::SILDifferentiabilityWitness*, swift::autodiff::DifferentiationInvoker, swift::SerializedKind_t) /path/to/swift/swift/lib/SILOptimizer/Mandatory/Differentiation.cpp:1070:19
#25 (anonymous namespace)::Differentiation::run() /path/to/swift/swift/lib/SILOptimizer/Mandatory/Differentiation.cpp:1494:21
#26 llvm::SmallVectorTemplateCommon<swift::SILAnalysis*, void>::begin() /path/to/swift/llvm-project/llvm/include/llvm/ADT/SmallVector.h:281:45
#27 swift::SILPassManager::analysesUnlocked() /path/to/swift/swift/lib/SILOptimizer/PassManager/PassManager.cpp:529:16
#28 swift::SILPassManager::runModulePass(unsigned int) /path/to/swift/swift/lib/SILOptimizer/PassManager/PassManager.cpp:907:3
#29 swift::SILPassManager::execute() /path/to/swift/swift/lib/SILOptimizer/PassManager/PassManager.cpp:1019:7
#30 __gnu_cxx::__normal_iterator<swift::SILPassPipeline const*, std::vector<swift::SILPassPipeline, std::allocator<swift::SILPassPipeline>>>::operator++() /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/stl_iterator.h:1103:2
#31 swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) /path/to/swift/swift/lib/SILOptimizer/PassManager/PassManager.cpp:974:40
#32 swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const /path/to/swift/swift/lib/SILOptimizer/PassManager/PassManager.cpp:384:1
#33 std::tuple<> swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::callDerived<0ul>(swift::Evaluator&, std::integer_sequence<unsigned long, 0ul>) const /path/to/swift/swift/include/swift/AST/SimpleRequest.h:287:24
#34 swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) /path/to/swift/swift/include/swift/AST/SimpleRequest.h:311:20
#35 swift::ExecuteSILPipelineRequest::OutputType swift::Evaluator::getResultUncached<swift::ExecuteSILPipelineRequest, swift::ExecuteSILPipelineRequest::OutputType swift::evaluateOrFatal<swift::ExecuteSILPipelineRequest>(swift::Evaluator&, swift::ExecuteSILPipelineRequest)::'lambda'()>(swift::ExecuteSILPipelineRequest const&, swift::ExecuteSILPipelineRequest::OutputType swift::evaluateOrFatal<swift::ExecuteSILPipelineRequest>(swift::Evaluator&, swift::ExecuteSILPipelineRequest)::'lambda'()) /path/to/swift/swift/include/swift/AST/Evaluator.h:0:19
#36 swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) /path/to/swift/swift/lib/SILOptimizer/PassManager/PassManager.cpp:393:1
#37 std::_Vector_base<swift::SILPassPipeline, std::allocator<swift::SILPassPipeline>>::~_Vector_base() /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/stl_vector.h:375:24
#38 std::vector<swift::SILPassPipeline, std::allocator<swift::SILPassPipeline>>::~vector() /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/stl_vector.h:805:7
#39 swift::SILPassPipelinePlan::~SILPassPipelinePlan() /path/to/swift/swift/include/swift/SILOptimizer/PassManager/PassPipeline.h:73:34
#40 swift::runSILDiagnosticPasses(swift::SILModule&) /path/to/swift/swift/lib/SILOptimizer/PassManager/Passes.cpp:64:3
#41 swift::CompilerInstance::performSILProcessing(swift::SILModule*) /path/to/swift/swift/lib/Frontend/Frontend.cpp:1852:56
#42 performCompileStepsPostSILGen(swift::CompilerInstance&, std::unique_ptr<swift::SILModule, std::default_delete<swift::SILModule>>, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) /path/to/swift/swift/lib/FrontendTool/FrontendTool.cpp:1750:7
#43 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) /path/to/swift/swift/lib/FrontendTool/FrontendTool.cpp:765:12
#44 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) /path/to/swift/swift/lib/FrontendTool/FrontendTool.cpp:1200:25
#45 performAction(swift::CompilerInstance&, int&, swift::FrontendObserver*) /path/to/swift/swift/lib/FrontendTool/FrontendTool.cpp:0:12
#46 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) /path/to/swift/swift/lib/FrontendTool/FrontendTool.cpp:1409:19
#47 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) /path/to/swift/swift/lib/FrontendTool/FrontendTool.cpp:0:19
#48 run_driver(llvm::StringRef, llvm::ArrayRef<char const*>, llvm::ArrayRef<char const*>) /path/to/swift/swift/lib/DriverTool/driver.cpp:0:0
#49 swift::mainEntry(int, char const**) /path/to/swift/swift/lib/DriverTool/driver.cpp:530:10
#50 __libc_start_call_main /usr/src/debug/glibc/glibc/csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#51 call_init /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:128:20
#52 __libc_start_main /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:347:5
#53 _start (/path/to/swift/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/bin/swift-frontend+0xcf4095)
Expected behavior
A proper error message (for example, saying that map
is not differentiable) should be emitted.
Environment
Swift version 6.2-dev (LLVM 94a95edd9aa32e1, Swift c4b0e97)
Target: x86_64-unknown-linux-gnu
Build config: +assertions
Additional information
No response