Description
Description
We have seen other issues in the past that cause this assertion to fail, such as this one:
#72363
In some cases, the root cause is AutoDiff related, in others, it isn't. Below is another reproducer which causes the aforementioned assertion failure.
The full assertion failure (from the 2024-04-11a toolchain) is: Assertion failed: (srcAddr->getType() == destAddr->getType()), function createCopyAddr, file SILBuilder.h, line 1190.
Reproduction
Copy and paste this code into a single file and attempt to build in Debug mode.
import Foundation; import _Differentiation
struct O: Differentiable {var a: B.G; var b: Array<SIMD2<Float>>; var c: B.M; var d: B.M}
func w(y: B.M) -> B.M {return y}
@differentiable(reverse) func q(sd: Float, i: B.G, j: Array<SIMD2<Float>>, s: B.M, t: B.M) -> O {
let u1 = C(i.g4); let u2 = C(i.g2); let u3 = C(i.g3); let u4 = C(j)
var u5 = C(s.m4); var u6 = C(t.m4); var u7 = w(y: s); var u8 = w(y: t)
u6 = C(Array<Float>([0.0]))
u5 = u6
if sd > 0 {}
u7.m4 = u5.r
var u9 = i
u9.g1 = C(u9.g1).r
u9.g4 = u1.r
u9.g2 = u2.r
u9.g3 = u3.r
return O(a: u9, b: u4.r, c: u7, d: u8)
}
protocol N {}; protocol H: Differentiable {}
struct B: D, N, Differentiable
{
struct M: D, N, Differentiable {var m1 = Array<Float>(); var m2 = Array<SIMD2<Float>>(); var m3 = Array<SIMD2<Float>>(); var m4 = Array<Float>(); var m5 = Array<Float>()}
struct G: D, N, Differentiable {var g1 = Array<Float>(); var g2 = Array<Float>(); var g3 = Array<Float>(); var g4 = Array<Float>()}
}
protocol D: Differentiable & H & N where Self.TangentVector: N {}
struct C<E>: Differentiable, AdditiveArithmetic where E: Differentiable, E: AdditiveArithmetic {
typealias TangentVector = C<E.TangentVector>
var v: [E]; var a: E
@differentiable(reverse) init(_ c: [E], t: E = .zero) {self.v = c; self.a = .zero}
@differentiable(reverse) var r: [E] {return v}
@inlinable @derivative(of: init(_:t:))
static func vjpInit(_ values: [E], t: E = .zero) -> (value: C, pullback: (Self.TangentVector) -> ([E].TangentVector, E.TangentVector)) {(value: Self(values, t: t), pullback: {tangentVector in return ([E].TangentVector(tangentVector.v), tangentVector.a)})}
@inlinable @derivative(of: r) func vjpArray() -> (value: [E], pullback: ([E].TangentVector) -> Self.TangentVector) {(value: self.v, pullback: {_ in return Self.TangentVector([E.TangentVector](), t: E.TangentVector.zero)})}
mutating func move(by offset: Self.TangentVector) {}
static func + (lhs: Self, rhs: Self) -> Self {return lhs}
static func - (lhs: Self, rhs: Self) -> Self {return lhs}
static var zero: Self { Self([], t: .zero) }
}
Expected behavior
The compilation should succeed.
Environment
Nightly toolchains from 2024-04-01a to 2024-04-11a cause this issue.
M1 MacBook Pro, Xcode 15.1.
Additional information
There are several individual changes to the code above that can be made that can cause the compilation to succeed; each of these can be performed independently of any other. Note that this list is not exhaustive.
- Comment out line 9, which contains
if sd > 0 {}
. - In line 2, remove
var d: B.M
fromstruct O
, and in line 16, removed: u8
. (Note that adding a third instance ofB.M
to return here will cause the same crash.) - In line 21, removing
var m5 = Array<Float>()
, even though it isn't used anywhere. - Comment out line 15, which contains
u9.g3 = u3.r
. - Change line 14 to
u9.g2 = C(i.g2).r
and then deletelet u2 = C(i.g2);
from line 5.
The stack trace is as below:
1. Apple Swift version 6.0-dev (LLVM 40c342d107dc66e, Swift 22919a9039e20a1)
2. Compiling with effective version 5.10
3. While evaluating request IRGenRequest(IR Generation for file "/Users/user/project/main.swift")
4. While evaluating request ExecuteSILPipelineRequest(Run pipelines { IRGen Preparation } on SIL for boopursnoop)
5. While running pass #340 SILModuleTransform "LoadableByAddress".
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 0x0000000105dc5098 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1 swift-frontend 0x0000000105dc3864 llvm::sys::RunSignalHandlers() + 112
2 swift-frontend 0x0000000105dc56e0 SignalHandler(int) + 304
3 libsystem_platform.dylib 0x000000018b5d9a24 _sigtramp + 56
4 libsystem_pthread.dylib 0x000000018b5a9cc0 pthread_kill + 288
5 libsystem_c.dylib 0x000000018b4b5a40 abort + 180
6 libsystem_c.dylib 0x000000018b4b4d30 err + 0
7 swift-frontend 0x0000000105e9ac84 (anonymous namespace)::RewriteUser::rewrite() (.cold.66) + 0
8 swift-frontend 0x0000000100f06188 (anonymous namespace)::RewriteUser::rewrite() + 8760
9 swift-frontend 0x0000000100eec244 runPeepholesAndReg2Mem(swift::SILPassManager*, swift::SILModule*, swift::irgen::IRGenModule*) + 4660
10 swift-frontend 0x0000000100eead34 (anonymous namespace)::LoadableByAddress::run() + 14216
11 swift-frontend 0x0000000101356ec4 swift::SILPassManager::runModulePass(unsigned int) + 856
12 swift-frontend 0x0000000101359268 swift::SILPassManager::execute() + 624
13 swift-frontend 0x0000000101353c44 swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) + 72
14 swift-frontend 0x0000000101353bc4 swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const + 68
15 swift-frontend 0x000000010138f2f4 swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::__1::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) + 28
16 swift-frontend 0x000000010136f7dc 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'()) + 204
17 swift-frontend 0x0000000101353e20 swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) + 64
18 swift-frontend 0x0000000100e69214 swift::IRGenRequest::evaluate(swift::Evaluator&, swift::IRGenDescriptor) const + 2064
19 swift-frontend 0x0000000100eb699c swift::GeneratedModule swift::SimpleRequest<swift::IRGenRequest, swift::GeneratedModule (swift::IRGenDescriptor), (swift::RequestFlags)9>::callDerived<0ul>(swift::Evaluator&, std::__1::integer_sequence<unsigned long, 0ul>) const + 200
20 swift-frontend 0x0000000100e71ba0 swift::IRGenRequest::OutputType swift::Evaluator::getResultUncached<swift::IRGenRequest, swift::IRGenRequest::OutputType swift::evaluateOrFatal<swift::IRGenRequest>(swift::Evaluator&, swift::IRGenRequest)::'lambda'()>(swift::IRGenRequest const&, swift::IRGenRequest::OutputType swift::evaluateOrFatal<swift::IRGenRequest>(swift::Evaluator&, swift::IRGenRequest)::'lambda'()) + 212
21 swift-frontend 0x0000000100e6b2e4 swift::performIRGeneration(swift::FileUnit*, swift::IRGenOptions const&, swift::TBDGenOptions const&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule>>, llvm::StringRef, swift::PrimarySpecificPaths const&, llvm::StringRef, llvm::GlobalVariable**) + 208
22 swift-frontend 0x000000010097f91c generateIR(swift::IRGenOptions const&, swift::TBDGenOptions const&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule>>, swift::PrimarySpecificPaths const&, llvm::StringRef, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, llvm::GlobalVariable*&, llvm::ArrayRef<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>) + 156
23 swift-frontend 0x000000010097bbd4 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*) + 1416
24 swift-frontend 0x000000010097b07c swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 612
25 swift-frontend 0x000000010098c2b4 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 160
26 swift-frontend 0x000000010097d68c performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 708
27 swift-frontend 0x000000010097c5f8 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2368
28 swift-frontend 0x0000000100798448 swift::mainEntry(int, char const**) + 3096
29 dyld 0x000000018b2290e0 start + 2360
Note that if we remove the conformance to AdditiveArithmetic
in line 25, that is, we rewrite the line to look like this:
struct C<E>: Differentiable where E: Differentiable, E: AdditiveArithmetic
we get a different assertion failing:
Assertion failed: (!ActiveDiagnostic && "Already have an active diagnostic"), function diagnose, file DiagnosticEngine.h, line 1204.
This may come with additional diagnostic information:
main.swift:28:6: error: can only differentiate functions with results that conform to 'Differentiable', but 'C<E>' does not conform to 'Differentiable'
26 | typealias TangentVector = C<E.TangentVector>
27 | var v: [E]; var a: E
28 | @differentiable(reverse) init(_ c: [E], t: E = .zero) {self.v = c; self.a = .zero}
| `- error: can only differentiate functions with results that conform to 'Differentiable', but 'C<E>' does not conform to 'Differentiable'
29 | @differentiable(reverse) var r: [E] {return v}
30 | @inlinable @derivative(of: init(_:t:))
The stack trace for this modification looks like this:
1. Apple Swift version 6.0-dev (LLVM 40c342d107dc66e, Swift 22919a9039e20a1)
2. Compiling with effective version 5.10
3. While evaluating request TypeCheckSourceFileRequest(source_file "/Users/user/project/main.swift")
4. While type-checking 'C' (at /Users/user/project/main.swift:25:1)
5. While type-checking 'vjpInit(_:t:)' (at /Users/user/project/main.swift:31:5)
6. While evaluating request InterfaceTypeRequest(project.(file).C.vjpInit(_:t:)@/Users/user/project/main.swift:31:17)
7. While evaluating request ResultTypeRequest(project.(file).C.vjpInit(_:t:)@/Users/user/project/main.swift:31:17)
8. While evaluating request ResolveTypeRequest(while resolving type , (value: C, pullback: (`Self`.TangentVector) -> ([E].TangentVector, E.TangentVector)))
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 0x0000000105d19098 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1 swift-frontend 0x0000000105d17864 llvm::sys::RunSignalHandlers() + 112
2 swift-frontend 0x0000000105d196e0 SignalHandler(int) + 304
3 libsystem_platform.dylib 0x000000018b5d9a24 _sigtramp + 56
4 libsystem_pthread.dylib 0x000000018b5a9cc0 pthread_kill + 288
5 libsystem_c.dylib 0x000000018b4b5a40 abort + 180
6 libsystem_c.dylib 0x000000018b4b4d30 err + 0
7 swift-frontend 0x000000010621c8a8 swift::SimpleRequest<swift::InterfaceTypeRequest, swift::Type (swift::ValueDecl*), (swift::RequestFlags)4>::noteCycleStep(swift::DiagnosticEngine&) const (.cold.1) + 0
8 swift-frontend 0x0000000101f7efa4 swift::SimpleRequest<swift::InterfaceTypeRequest, swift::Type (swift::ValueDecl*), (swift::RequestFlags)4>::diagnoseCycle(swift::DiagnosticEngine&) const + 300
9 swift-frontend 0x00000001020628d4 swift::Evaluator::diagnoseCycle(swift::ActiveRequest const&) + 872
10 swift-frontend 0x0000000102062390 swift::Evaluator::checkDependency(swift::ActiveRequest const&) + 52
11 swift-frontend 0x0000000101f59744 swift::ValueDecl::getInterfaceType() const + 172
12 swift-frontend 0x0000000101ecd8e0 (anonymous namespace)::PrintAST::printFunctionParameters(swift::AbstractFunctionDecl*) + 44
13 swift-frontend 0x0000000101ed2164 void llvm::function_ref<void ()>::callback_fn<(anonymous namespace)::PrintAST::visitFuncDecl(swift::FuncDecl*)::$_66>(long) + 152
14 swift-frontend 0x0000000101ec24a0 swift::ASTVisitor<(anonymous namespace)::PrintAST, void, void, void, void, void, void>::visit(swift::Decl*) + 10024
15 swift-frontend 0x0000000101eba998 (anonymous namespace)::PrintAST::visit(swift::Decl*) + 564
16 swift-frontend 0x0000000101ec4944 (anonymous namespace)::PrintAST::printMembersOfDecl(swift::Decl*, bool, bool, bool, bool) + 2016
17 swift-frontend 0x0000000101ec2be8 swift::ASTVisitor<(anonymous namespace)::PrintAST, void, void, void, void, void, void>::visit(swift::Decl*) + 11888
18 swift-frontend 0x0000000101eba998 (anonymous namespace)::PrintAST::visit(swift::Decl*) + 564
19 swift-frontend 0x0000000101eba534 swift::Decl::print(swift::ASTPrinter&, swift::PrintOptions const&) const + 64
20 swift-frontend 0x00000001020344d8 swift::DiagnosticEngine::diagnosticInfoForDiagnostic(swift::Diagnostic const&) + 1948
21 swift-frontend 0x00000001020367d0 swift::DiagnosticEngine::emitDiagnostic(swift::Diagnostic const&) + 108
22 swift-frontend 0x0000000102036660 swift::DiagnosticEngine::handleDiagnostic(swift::Diagnostic&&) + 176
23 swift-frontend 0x00000001020348c4 swift::InFlightDiagnostic::flush() + 52
24 swift-frontend 0x0000000101bfabc4 diagnoseAmbiguousMemberType(swift::Type, swift::SourceRange, swift::DeclNameRef, swift::DeclNameLoc, swift::LookupTypeResult&) + 864
25 swift-frontend 0x0000000101bf5f5c (anonymous namespace)::TypeResolver::resolveDeclRefTypeReprRec(swift::DeclRefTypeRepr*, swift::TypeResolutionOptions) + 2792
26 swift-frontend 0x0000000101be970c (anonymous namespace)::TypeResolver::resolveType(swift::TypeRepr*, swift::TypeResolutionOptions) + 300
27 swift-frontend 0x0000000101beb950 (anonymous namespace)::TypeResolver::resolveASTFunctionType(swift::FunctionTypeRepr*, swift::TypeResolutionOptions, (anonymous namespace)::TypeAttrSet*) + 3792
28 swift-frontend 0x0000000101be98c4 (anonymous namespace)::TypeResolver::resolveType(swift::TypeRepr*, swift::TypeResolutionOptions) + 740
29 swift-frontend 0x0000000101bef334 (anonymous namespace)::TypeResolver::resolveTupleType(swift::TupleTypeRepr*, swift::TypeResolutionOptions) + 564
30 swift-frontend 0x0000000101be990c (anonymous namespace)::TypeResolver::resolveType(swift::TypeRepr*, swift::TypeResolutionOptions) + 812
31 swift-frontend 0x0000000101be83f4 evaluateTypeResolution(swift::TypeResolution const*, swift::TypeRepr*, swift::SILTypeResolutionContext*) + 88
32 swift-frontend 0x0000000101bfe1b8 swift::ResolveTypeRequest::OutputType swift::Evaluator::getResultUncached<swift::ResolveTypeRequest, swift::ResolveTypeRequest::OutputType swift::evaluateOrDefault<swift::ResolveTypeRequest>(swift::Evaluator&, swift::ResolveTypeRequest, swift::ResolveTypeRequest::OutputType)::'lambda'()>(swift::ResolveTypeRequest const&, swift::ResolveTypeRequest::OutputType swift::evaluateOrDefault<swift::ResolveTypeRequest>(swift::Evaluator&, swift::ResolveTypeRequest, swift::ResolveTypeRequest::OutputType)::'lambda'()) + 212
33 swift-frontend 0x0000000101be837c swift::TypeResolution::resolveType(swift::TypeRepr*, swift::SILTypeResolutionContext*) const + 92
34 swift-frontend 0x0000000101b00170 swift::ResultTypeRequest::evaluate(swift::Evaluator&, swift::ValueDecl*) const + 660
35 swift-frontend 0x0000000102004fd4 swift::ResultTypeRequest::OutputType swift::Evaluator::getResultUncached<swift::ResultTypeRequest, swift::ResultTypeRequest::OutputType swift::evaluateOrDefault<swift::ResultTypeRequest>(swift::Evaluator&, swift::ResultTypeRequest, swift::ResultTypeRequest::OutputType)::'lambda'()>(swift::ResultTypeRequest const&, swift::ResultTypeRequest::OutputType swift::evaluateOrDefault<swift::ResultTypeRequest>(swift::Evaluator&, swift::ResultTypeRequest, swift::ResultTypeRequest::OutputType)::'lambda'()) + 228
36 swift-frontend 0x0000000101f76594 swift::FuncDecl::getResultInterfaceType() const + 156
37 swift-frontend 0x0000000101b00d2c swift::InterfaceTypeRequest::evaluate(swift::Evaluator&, swift::ValueDecl*) const + 2228
38 swift-frontend 0x0000000101f597e0 swift::ValueDecl::getInterfaceType() const + 328
39 swift-frontend 0x0000000101b42198 (anonymous namespace)::DeclChecker::visitFuncDecl(swift::FuncDecl*) + 68
40 swift-frontend 0x0000000101b37b64 (anonymous namespace)::DeclChecker::visit(swift::Decl*) + 420
41 swift-frontend 0x0000000101b38c1c (anonymous namespace)::DeclChecker::visit(swift::Decl*) + 4700
42 swift-frontend 0x0000000101b379ac swift::TypeChecker::typeCheckDecl(swift::Decl*) + 136
43 swift-frontend 0x0000000101bff594 swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 176
44 swift-frontend 0x0000000101c01118 swift::TypeCheckSourceFileRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::'lambda'()>(swift::TypeCheckSourceFileRequest const&, swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::'lambda'()) + 232
45 swift-frontend 0x0000000101bff4bc swift::performTypeChecking(swift::SourceFile&) + 84
46 swift-frontend 0x0000000100b10b84 bool llvm::function_ref<bool (swift::SourceFile&)>::callback_fn<swift::CompilerInstance::performSema()::$_7>(long, swift::SourceFile&) + 16
47 swift-frontend 0x0000000100b0a63c swift::CompilerInstance::forEachFileToTypeCheck(llvm::function_ref<bool (swift::SourceFile&)>) + 156
48 swift-frontend 0x0000000100b0a580 swift::CompilerInstance::performSema() + 76
49 swift-frontend 0x00000001008e0250 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 60
50 swift-frontend 0x00000001008d168c performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 708
51 swift-frontend 0x00000001008d05f8 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2368
52 swift-frontend 0x00000001006ec448 swift::mainEntry(int, char const**) + 3096
53 dyld 0x000000018b2290e0 start + 2360