Skip to content

Commit 9d93b71

Browse files
committed
[AutoDiff] Fix crasher on property getter in library evolution mode.
`SILBuilder::createAllocStack` expects a debug variable when the location is a `VarDecl`. Since we are in pullbacks, there's no debug variables so we pass an empty one. General support for debug-info-in-pullbacks will be added as part of SR-13535. Also add negative tests for SR-13866. Resolves SR-13865.
1 parent 36090fa commit 9d93b71

File tree

3 files changed

+124
-1
lines changed

3 files changed

+124
-1
lines changed

lib/SILOptimizer/Differentiation/PullbackCloner.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1445,7 +1445,7 @@ class PullbackCloner::Implementation final
14451445
auto adjVal = materializeAdjointDirect(getAdjointValue(bb, inst), loc);
14461446
// Allocate a local buffer and store the adjoint value. This buffer will
14471447
// be used for accumulation into the adjoint buffer.
1448-
auto adjBuf = builder.createAllocStack(loc, adjVal->getType());
1448+
auto adjBuf = builder.createAllocStack(loc, adjVal->getType(), SILDebugVariable());
14491449
auto copy = builder.emitCopyValueOperation(loc, adjVal);
14501450
builder.emitStoreValueOperation(loc, copy, adjBuf,
14511451
StoreOwnershipQualifier::Init);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// RUN: not --crash %target-swift-frontend -c -enable-library-evolution %s
2+
// REQUIRES: asserts
3+
4+
// SR-13865: AutoDiff crasher on property derivatives in library evolution mode.
5+
6+
import _Differentiation
7+
8+
public protocol P: Differentiable {
9+
@differentiable(wrt: self)
10+
func foo(_ input: Float) -> Float
11+
}
12+
13+
// TBDGen duplicate symbol: ...
14+
// Assertion failed: (false && "TBDGen symbol appears twice"), function addSymbolInternal, file .../swift/lib/TBDGen/TBDGen.cpp, line 79.
15+
// Stack dump:
16+
// 0. Program arguments: swift-frontend -c test.swift -enable-library-evolution
17+
// 1. Swift version 5.3-dev (LLVM 618cb952e0f199a, Swift db830811093c5d2)
18+
// 2. While evaluating request PublicSymbolsRequest(Generate TBD for module test.test)
19+
// 0 swift-frontend 0x000000010d5fb0e5 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37
20+
// 1 swift-frontend 0x000000010d5fa028 llvm::sys::RunSignalHandlers() + 248
21+
// 2 swift-frontend 0x000000010d5fb6c6 SignalHandler(int) + 262
22+
// 3 libsystem_platform.dylib 0x00007fff203dad7d _sigtramp + 29
23+
// 4 libsystem_platform.dylib 000000000000000000 _sigtramp + 18446603339975250592
24+
// 5 libsystem_c.dylib 0x00007fff202e9720 abort + 120
25+
// 6 libsystem_c.dylib 0x00007fff202e89d6 err + 0
26+
// 7 swift-frontend 0x000000010d76f5d7 swift::tbdgen::TBDGenVisitor::addSymbolInternal(llvm::StringRef, llvm::MachO::SymbolKind, swift::SymbolSource) (.cold.1) + 87
27+
// 8 swift-frontend 0x00000001090e084f swift::tbdgen::TBDGenVisitor::addSymbolInternal(llvm::StringRef, llvm::MachO::SymbolKind, swift::SymbolSource) + 111
28+
// 9 swift-frontend 0x00000001090e3287 swift::tbdgen::TBDGenVisitor::addSymbol(llvm::StringRef, swift::SymbolSource, llvm::MachO::SymbolKind) + 119
29+
// 10 swift-frontend 0x00000001090e34f0 swift::tbdgen::TBDGenVisitor::addDispatchThunk(swift::SILDeclRef) + 272
30+
// 11 swift-frontend 0x00000001090ea556 swift::SILWitnessVisitor<swift::tbdgen::TBDGenVisitor::visitProtocolDecl(swift::ProtocolDecl*)::WitnessVisitor>::addAutoDiffDerivativeMethodsIfRequired(swift::AbstractFunctionDecl*, swift::SILDeclRef::Kind) + 326
31+
// 12 swift-frontend 0x00000001090ea086 swift::SILWitnessVisitor<swift::tbdgen::TBDGenVisitor::visitProtocolDecl(swift::ProtocolDecl*)::WitnessVisitor>::visitProtocolDecl(swift::ProtocolDecl*) + 934
32+
// 13 swift-frontend 0x00000001090e786b swift::tbdgen::TBDGenVisitor::visitProtocolDecl(swift::ProtocolDecl*) + 283
33+
// 14 swift-frontend 0x00000001090e6c82 swift::tbdgen::TBDGenVisitor::visit(swift::Decl*) + 274
34+
// 15 swift-frontend 0x00000001090e7e7b swift::tbdgen::TBDGenVisitor::visitFile(swift::FileUnit*) + 283
35+
// 16 swift-frontend 0x00000001090e817c swift::tbdgen::TBDGenVisitor::visit(swift::TBDGenDescriptor const&) + 620
36+
// 17 swift-frontend 0x00000001090e88ca swift::PublicSymbolsRequest::evaluate(swift::Evaluator&, swift::TBDGenDescriptor) const + 250
37+
// 18 swift-frontend 0x00000001090ef0ed swift::SimpleRequest<swift::PublicSymbolsRequest, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > (swift::TBDGenDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::PublicSymbolsRequest const&, swift::Evaluator&) + 77
38+
// 19 swift-frontend 0x00000001090ebeee llvm::Expected<swift::PublicSymbolsRequest::OutputType> swift::Evaluator::getResultUncached<swift::PublicSymbolsRequest>(swift::PublicSymbolsRequest const&) + 494
39+
// 20 swift-frontend 0x00000001090e8977 swift::getPublicSymbols(swift::TBDGenDescriptor) + 135
40+
// 21 swift-frontend 0x0000000108d98481 swift::validateTBD(swift::ModuleDecl*, llvm::Module const&, swift::TBDGenOptions const&, bool) + 97
41+
// 22 swift-frontend 0x0000000108d8362d 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*) + 2925
42+
// 23 swift-frontend 0x0000000108d8289c performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 636
43+
// 24 swift-frontend 0x0000000108d7ae31 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 4625
44+
// 25 swift-frontend 0x0000000108d127fe main + 846
45+
// 26 libdyld.dylib 0x00007fff203b1631 start + 1
46+
// [1] 77664 abort xcrun $SWIFT_NINJA_BUILD_DIR/bin/swift-frontend -c test.swift
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// RUN: %target-swift-frontend -c -enable-library-evolution %s
2+
// REQUIRES: asserts
3+
4+
// SR-13865: AutoDiff crasher on property derivatives in library evolution mode.
5+
6+
import _Differentiation
7+
8+
public struct Struct: Differentiable {
9+
var stored: Float
10+
11+
// Test property.
12+
@differentiable
13+
public var property: Float {
14+
stored
15+
}
16+
17+
@differentiable
18+
public var property2: Float {
19+
stored + stored
20+
}
21+
22+
@differentiable
23+
public var property3: Float {
24+
stored.squareRoot()
25+
}
26+
}
27+
28+
// Original crasher:
29+
// Assertion failed: ((!dyn_cast_or_null<VarDecl>(Loc.getAsASTNode<Decl>()) || Var) && "location is a VarDecl, but SILDebugVariable is empty"), function createAllocStack, file .../swift/include/swift/SIL/SILBuilder.h, line 418.
30+
// Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the project and the crash backtrace.
31+
// Stack dump:
32+
// 0. Program arguments: swift-frontend -c test2.swift -enable-library-evolution
33+
// 1. Swift version 5.3-dev (LLVM f681f671e2e9538, Swift 36090faaded56c2)
34+
// 2. While evaluating request ExecuteSILPipelineRequest(Run pipelines { Mandatory Diagnostic Passes + Enabling Optimization Passes } on SIL for test2.test2)
35+
// 3. While running pass #157 SILModuleTransform "Differentiation".
36+
// 4. While processing // differentiability witness for Struct.property.getter
37+
// sil_differentiability_witness [serialized] [parameters 0] [results 0] @$s5test26StructV8propertySfvg : $@convention(method) (@in_guaranteed Struct) -> Float {
38+
// }
39+
//
40+
// on SIL function "@$s5test26StructV8propertySfvg".
41+
// for getter for property (at test2.swift:8:14)
42+
// 5. While generating VJP for SIL function "@$s5test26StructV8propertySfvg".
43+
// for getter for property (at test2.swift:8:14)
44+
// 6. While generating pullback for SIL function "@$s5test26StructV8propertySfvg".
45+
// for getter for property (at test2.swift:8:14)
46+
// 0 swift-frontend 0x000000010de4a185 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37
47+
// 1 swift-frontend 0x000000010de490c8 llvm::sys::RunSignalHandlers() + 248
48+
// 2 swift-frontend 0x000000010de4a766 SignalHandler(int) + 262
49+
// 3 libsystem_platform.dylib 0x00007fff2035bd7d _sigtramp + 29
50+
// 4 libsystem_platform.dylib 000000000000000000 _sigtramp + 18446603339975770784
51+
// 5 libsystem_c.dylib 0x00007fff2026c741 abort + 120
52+
// 6 libsystem_c.dylib 0x00007fff2026bb18 err + 0
53+
// 7 swift-frontend 0x000000010e1cb063 swift::SILBuilder::createAllocStack(swift::SILLocation, swift::SILType, llvm::Optional<swift::SILDebugVariable>, bool) (.cold.2) + 35
54+
// 8 swift-frontend 0x000000010a06716b swift::SILBuilder::createAllocStack(swift::SILLocation, swift::SILType, llvm::Optional<swift::SILDebugVariable>, bool) + 315
55+
// 9 swift-frontend 0x0000000109af96d3 swift::autodiff::PullbackCloner::Implementation::visitLoadOperation(swift::SingleValueInstruction*) + 275
56+
// 10 swift-frontend 0x0000000109aec37b swift::autodiff::PullbackCloner::Implementation::visit(swift::SILInstruction*) + 203
57+
// 11 swift-frontend 0x0000000109ae8196 swift::autodiff::PullbackCloner::Implementation::visitSILBasicBlock(swift::SILBasicBlock*) + 838
58+
// 12 swift-frontend 0x0000000109ae5504 swift::autodiff::PullbackCloner::Implementation::run() + 7268
59+
// 13 swift-frontend 0x0000000109b077d3 swift::autodiff::VJPCloner::Implementation::run() + 1539
60+
// 14 swift-frontend 0x0000000109c4e0b4 (anonymous namespace)::DifferentiationTransformer::canonicalizeDifferentiabilityWitness(swift::SILFunction*, swift::SILDifferentiabilityWitness*, swift::autodiff::DifferentiationInvoker, swift::IsSerialized_t) + 7172
61+
// 15 swift-frontend 0x0000000109c4bafa (anonymous namespace)::Differentiation::run() + 1530
62+
// 16 swift-frontend 0x0000000109c9c86e swift::SILPassManager::runModulePass(unsigned int) + 558
63+
// 17 swift-frontend 0x0000000109ca144a swift::SILPassManager::execute() + 666
64+
// 18 swift-frontend 0x0000000109c996a8 swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) + 72
65+
// 19 swift-frontend 0x0000000109c99643 swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const + 51
66+
// 20 swift-frontend 0x0000000109cbc83d swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::__1::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) + 29
67+
// 21 swift-frontend 0x0000000109ca3a37 llvm::Expected<swift::ExecuteSILPipelineRequest::OutputType> swift::Evaluator::getResultUncached<swift::ExecuteSILPipelineRequest>(swift::ExecuteSILPipelineRequest const&) + 375
68+
// 22 swift-frontend 0x0000000109c998d4 swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) + 68
69+
// 23 swift-frontend 0x0000000109ca6507 swift::runSILDiagnosticPasses(swift::SILModule&) + 87
70+
// 24 swift-frontend 0x00000001096dd7bc swift::CompilerInstance::performSILProcessing(swift::SILModule*) + 60
71+
// 25 swift-frontend 0x00000001095c4aa5 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*) + 901
72+
// 26 swift-frontend 0x00000001095c44fc performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 636
73+
// 27 swift-frontend 0x00000001095ba328 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 4632
74+
// 28 swift-frontend 0x0000000109551fee main + 846
75+
// 29 libdyld.dylib 0x00007fff20332689 start + 1
76+
// 30 libdyld.dylib 0x0000000000000004 start + 18446603339975940476
77+
// [1] 21458 abort xcrun $SWIFT_NINJA_BUILD_DIR/bin/swift-frontend -c test2.swift

0 commit comments

Comments
 (0)