Skip to content

[LoadableByAddr] unchecked_bitwise_cast error. #71744

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
fibrechannelscsi opened this issue Feb 20, 2024 · 6 comments · Fixed by #72617
Closed

[LoadableByAddr] unchecked_bitwise_cast error. #71744

fibrechannelscsi opened this issue Feb 20, 2024 · 6 comments · Fixed by #72617
Assignees
Labels
AutoDiff bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler itself crash Bug: A crash, i.e., an abnormal termination of software IRGen LLVM IR generation multiple modules Flag: An issue whose reproduction requires multiple modules optimized only Flag: An issue whose reproduction requires optimized compilation SILOptimizer Area → compiler: SIL optimization passes swift 6.0

Comments

@fibrechannelscsi
Copy link
Contributor

Description

The attached code fails to compile with certain nightly toolchains when the test is run in Release mode. It compiles and runs successfully in Debug mode.

This requires two internal Packages in addition to the actual test file. As such, this reproducer has been archived and attached.

uncheckedBitCast.zip

Reproduction

Extract the attached file into a new directory and run swift test in release mode. For example:
/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-01-30-a.xctoolchain/usr/bin/swift test -c release

Opening the enclosed attachment and building the test target in Release mode in Xcode will also work.

Upon building, this will generate about 50KB of SIL code as part of the error message (not attached). The test won't actually execute.

Expected behavior

The compilation should complete successfully, and the test should complete.

Environment

The 2024-01-30a and 2024-02-14a nightly toolchains generate this error message, but the 2024-01-22a toolchain does not.

Additional information

Stack trace (excluding the SIL-related error message):

1.	Apple Swift version 5.11-dev (LLVM aee6ede4f903b20, Swift 79fcb5e2e20760f)
2.	Compiling with the current language version
3.	While evaluating request ExecuteSILPipelineRequest(Run pipelines { IRGen Preparation } on SIL for ReproducerTests)
4.	While running pass #64 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           0x0000000109d67e40 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x0000000109d6660c llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x0000000109d68488 SignalHandler(int) + 304
3  libsystem_platform.dylib 0x000000018b12aa24 _sigtramp + 56
4  libsystem_pthread.dylib  0x000000018b0fbc28 pthread_kill + 288
5  libsystem_c.dylib        0x000000018b009ae8 abort + 180
6  swift-frontend           0x00000001049a504c PrettyStackTraceFrontend::~PrettyStackTraceFrontend() + 0
7  swift-frontend           0x0000000109ce7470 llvm::report_fatal_error(llvm::Twine const&, bool) + 256
8  swift-frontend           0x0000000109ce7370 llvm::report_fatal_error(llvm::Twine const&, bool) + 0
9  swift-frontend           0x0000000104f125d8 swift::SILInstructionVisitor<(anonymous namespace)::AssignAddressToDef, void>::visitUncheckedValueCastInst(swift::UncheckedValueCastInst*) + 0
10 swift-frontend           0x0000000104f0ef14 (anonymous namespace)::AssignAddressToDef::rewriteValue() + 7780
11 swift-frontend           0x0000000104ef77d0 runPeepholesAndReg2Mem(swift::SILPassManager*, swift::SILModule*, swift::irgen::IRGenModule*) + 4588
12 swift-frontend           0x0000000104ef6324 (anonymous namespace)::LoadableByAddress::run() + 13864
13 swift-frontend           0x0000000105358e74 swift::SILPassManager::runModulePass(unsigned int) + 848
14 swift-frontend           0x000000010535b118 swift::SILPassManager::execute() + 624
15 swift-frontend           0x0000000105355bf8 swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) + 72
16 swift-frontend           0x0000000105355b7c swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const + 68
17 swift-frontend           0x0000000105390c1c swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::__1::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) + 28
18 swift-frontend           0x0000000105371508 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
19 swift-frontend           0x0000000105355dd0 swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) + 64
20 swift-frontend           0x0000000104e788e0 swift::performIRGeneration(swift::ModuleDecl*, swift::IRGenOptions const&, swift::TBDGenOptions const&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule>>, llvm::StringRef, swift::PrimarySpecificPaths const&, llvm::ArrayRef<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, llvm::GlobalVariable**) + 1256
21 swift-frontend           0x00000001049a0da8 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>>>) + 272
22 swift-frontend           0x000000010499d3d0 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
23 swift-frontend           0x000000010499ca88 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 1184
24 swift-frontend           0x00000001049ad444 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 160
25 swift-frontend           0x000000010499ed78 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 708
26 swift-frontend           0x000000010499ddd4 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2336
27 swift-frontend           0x00000001047d7b50 swift::mainEntry(int, char const**) + 3096
28 dyld                     0x000000018ada3f28 start + 2236

Note that there are certain modifications to the code that will cause the compilation to succeed. For example, commenting out r += n["b"]![1.0]!; in T.swift. All three += operations are required to generate this error.

@fibrechannelscsi fibrechannelscsi added bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. triage needed This issue needs more specific labels labels Feb 20, 2024
@AnthonyLatsis AnthonyLatsis added compiler The Swift compiler itself optimized only Flag: An issue whose reproduction requires optimized compilation SILOptimizer Area → compiler: SIL optimization passes AutoDiff crash Bug: A crash, i.e., an abnormal termination of software swift 6.0 multiple modules Flag: An issue whose reproduction requires multiple modules and removed triage needed This issue needs more specific labels labels Feb 20, 2024
@asl asl self-assigned this Feb 22, 2024
@fibrechannelscsi
Copy link
Contributor Author

One other data point: if we go into
./Sources/InternalPackage/Sources/InternalPackage/User.swift
and comment out either
public var m: Int?
or
public var n: String?
then the compilation will succeed, and the test will run.

@asl
Copy link
Contributor

asl commented Mar 9, 2024

For some reason I cannot reproduce it (yet) with freshly-built swift / swiftpm from the repo. Likely there are some additional options that triggers some particular transformation. Anyway, I can reproduce it by latest nightly toolchain snapshot and working on smaller standalone reproducer.

We are hitting an unimplemented assert in https://github.com/apple/swift/blob/main/lib/IRGen/LoadableByAddress.cpp#L3579

on the following SIL instruction:

  %94 = unchecked_bitwise_cast %93 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned
 S<Double, Double>) to $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Doubl
e>) // users: %95, %96

@atrick @aschwaighofer Does this look familiar?

@asl
Copy link
Contributor

asl commented Mar 14, 2024

So, it is triggered only if --enable-testing is provided to original swift build invocation. And it's the generated test code that further processed via autodiff that is leading to assertion further down in optimization pipeline as some of the cases are not covered in LoadableByAddress.

Here is the original function:

Input SIL
// x #1 (n:) in A.testA()
sil private [ossa] @$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF : $@convention(thin) (F<Double, Double>) -> Double {
// %0 "n"                                         // users: %114, %65, %16, %1
bb0(%0 : $F<Double, Double>):
  debug_value %0 : $F<Double, Double>, let, name "n", argno 1 // id: %1
  %2 = alloc_stack $Double, var, name "r"         // users: %158, %7, %51, %100, %149, %155
  %3 = float_literal $Builtin.FPIEEE64, 0x0 // 0  // user: %6
  %4 = metatype $@thin Double.Type                // user: %6
  // function_ref Double.init(_builtinFloatLiteral:)
  %5 = function_ref @$sSd20_builtinFloatLiteralSdBf64__tcfC : $@convention(method) (Builtin.FPIEEE64, @thin Double.Type) -> Double // user: %6
  %6 = apply %5(%3, %4) : $@convention(method) (Builtin.FPIEEE64, @thin Double.Type) -> Double // user: %7
  store %6 to [trivial] %2 : $*Double             // id: %7
  %8 = metatype $@thin Double.Type                // user: %53
  %9 = string_literal utf8 "a"                    // user: %14
  %10 = integer_literal $Builtin.Word, 1          // user: %14
  %11 = integer_literal $Builtin.Int1, -1         // user: %14
  %12 = metatype $@thin String.Type               // user: %14
  // function_ref String.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:)
  %13 = function_ref @$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String // user: %14
  %14 = apply %13(%9, %10, %11, %12) : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String // users: %56, %16
  // function_ref F.subscript.getter
  %15 = function_ref @$s15InternalPackage1FVyAA1SVyxq_GSgSScig : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@guaranteed String, F<τ_0_0, τ_0_1>) -> @owned Optional<S<τ_0_0, τ_0_1>> // user: %16
  %16 = apply %15<Double, Double>(%14, %0) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@guaranteed String, F<τ_0_0, τ_0_1>) -> @owned Optional<S<τ_0_0, τ_0_1>> // user: %17
  switch_enum %16 : $Optional<S<Double, Double>>, case #Optional.some!enumelt: bb2, case #Optional.none!enumelt: bb1 // id: %17

bb1:                                              // Preds: bb0
  %18 = string_literal utf8 "ReproducerTests/T.swift" // user: %25
  %19 = integer_literal $Builtin.Word, 23         // user: %25
  %20 = integer_literal $Builtin.Int1, -1         // user: %25
  %21 = integer_literal $Builtin.Word, 5          // user: %25
  %22 = integer_literal $Builtin.Word, 24
  %23 = integer_literal $Builtin.Int1, 0          // user: %25
  // function_ref _diagnoseUnexpectedNilOptional(_filenameStart:_filenameLength:_filenameIsASCII:_line:_isImplicitUnwrap:)
  %24 = function_ref @$ss30_diagnoseUnexpectedNilOptional14_filenameStart01_E6Length01_E7IsASCII5_line17_isImplicitUnwrapyBp_BwBi1_BwBi1_tF : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> () // user: %25
  %25 = apply %24(%18, %19, %20, %21, %23) : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> ()
  unreachable                                     // id: %26

// %27                                            // users: %36, %39
bb2(%27 : @owned $S<Double, Double>):             // Preds: bb0
  %28 = float_literal $Builtin.FPIEEE64, 0x0 // 0 // user: %31
  %29 = metatype $@thin Double.Type               // user: %31
  // function_ref Double.init(_builtinFloatLiteral:)
  %30 = function_ref @$sSd20_builtinFloatLiteralSdBf64__tcfC : $@convention(method) (Builtin.FPIEEE64, @thin Double.Type) -> Double // user: %31
  %31 = apply %30(%28, %29) : $@convention(method) (Builtin.FPIEEE64, @thin Double.Type) -> Double // user: %34
  %32 = alloc_stack $Optional<Double>             // users: %55, %38, %36
  %33 = alloc_stack $Double                       // users: %37, %36, %34
  store %31 to [trivial] %33 : $*Double           // id: %34
  // function_ref S.subscript.getter
  %35 = function_ref @$s15InternalPackage1SVyq_Sgxcig : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@in_guaranteed τ_0_0, @guaranteed S<τ_0_0, τ_0_1>) -> @out Optional<τ_0_1> // user: %36
  %36 = apply %35<Double, Double>(%32, %33, %27) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@in_guaranteed τ_0_0, @guaranteed S<τ_0_0, τ_0_1>) -> @out Optional<τ_0_1>
  dealloc_stack %33 : $*Double                    // id: %37
  %38 = load [trivial] %32 : $*Optional<Double>   // user: %40
  destroy_value %27 : $S<Double, Double>          // id: %39
  switch_enum %38 : $Optional<Double>, case #Optional.some!enumelt: bb4, case #Optional.none!enumelt: bb3 // id: %40

bb3:                                              // Preds: bb2
  %41 = string_literal utf8 "ReproducerTests/T.swift" // user: %48
  %42 = integer_literal $Builtin.Word, 23         // user: %48
  %43 = integer_literal $Builtin.Int1, -1         // user: %48
  %44 = integer_literal $Builtin.Word, 5          // user: %48
  %45 = integer_literal $Builtin.Word, 30
  %46 = integer_literal $Builtin.Int1, 0          // user: %48
  // function_ref _diagnoseUnexpectedNilOptional(_filenameStart:_filenameLength:_filenameIsASCII:_line:_isImplicitUnwrap:)
  %47 = function_ref @$ss30_diagnoseUnexpectedNilOptional14_filenameStart01_E6Length01_E7IsASCII5_line17_isImplicitUnwrapyBp_BwBi1_BwBi1_tF : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> () // user: %48
  %48 = apply %47(%41, %42, %43, %44, %46) : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> ()
  unreachable                                     // id: %49

// %50                                            // user: %53
bb4(%50 : $Double):                               // Preds: bb2
  %51 = begin_access [modify] [static] %2 : $*Double // users: %54, %53
  // function_ref static Double.+= infix(_:_:)
  %52 = function_ref @$sSd2peoiyySdz_SdtFZ : $@convention(method) (@inout Double, Double, @thin Double.Type) -> () // user: %53
  %53 = apply %52(%51, %50, %8) : $@convention(method) (@inout Double, Double, @thin Double.Type) -> ()
  end_access %51 : $*Double                       // id: %54
  dealloc_stack %32 : $*Optional<Double>          // id: %55
  destroy_value %14 : $String                     // id: %56
  %57 = metatype $@thin Double.Type               // user: %102
  %58 = string_literal utf8 "b"                   // user: %63
  %59 = integer_literal $Builtin.Word, 1          // user: %63
  %60 = integer_literal $Builtin.Int1, -1         // user: %63
  %61 = metatype $@thin String.Type               // user: %63
  // function_ref String.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:)
  %62 = function_ref @$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String // user: %63
  %63 = apply %62(%58, %59, %60, %61) : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String // users: %105, %65
  // function_ref F.subscript.getter
  %64 = function_ref @$s15InternalPackage1FVyAA1SVyxq_GSgSScig : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@guaranteed String, F<τ_0_0, τ_0_1>) -> @owned Optional<S<τ_0_0, τ_0_1>> // user: %65
  %65 = apply %64<Double, Double>(%63, %0) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@guaranteed String, F<τ_0_0, τ_0_1>) -> @owned Optional<S<τ_0_0, τ_0_1>> // user: %66
  switch_enum %65 : $Optional<S<Double, Double>>, case #Optional.some!enumelt: bb6, case #Optional.none!enumelt: bb5 // id: %66

bb5:                                              // Preds: bb4
  %67 = string_literal utf8 "ReproducerTests/T.swift" // user: %74
  %68 = integer_literal $Builtin.Word, 23         // user: %74
  %69 = integer_literal $Builtin.Int1, -1         // user: %74
  %70 = integer_literal $Builtin.Word, 6          // user: %74
  %71 = integer_literal $Builtin.Word, 24
  %72 = integer_literal $Builtin.Int1, 0          // user: %74
  // function_ref _diagnoseUnexpectedNilOptional(_filenameStart:_filenameLength:_filenameIsASCII:_line:_isImplicitUnwrap:)
  %73 = function_ref @$ss30_diagnoseUnexpectedNilOptional14_filenameStart01_E6Length01_E7IsASCII5_line17_isImplicitUnwrapyBp_BwBi1_BwBi1_tF : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> () // user: %74
  %74 = apply %73(%67, %68, %69, %70, %72) : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> ()
  unreachable                                     // id: %75

// %76                                            // users: %85, %88
bb6(%76 : @owned $S<Double, Double>):             // Preds: bb4
  %77 = float_literal $Builtin.FPIEEE64, 0x3FF0000000000000 // 1 // user: %80
  %78 = metatype $@thin Double.Type               // user: %80
  // function_ref Double.init(_builtinFloatLiteral:)
  %79 = function_ref @$sSd20_builtinFloatLiteralSdBf64__tcfC : $@convention(method) (Builtin.FPIEEE64, @thin Double.Type) -> Double // user: %80
  %80 = apply %79(%77, %78) : $@convention(method) (Builtin.FPIEEE64, @thin Double.Type) -> Double // user: %83
  %81 = alloc_stack $Optional<Double>             // users: %104, %87, %85
  %82 = alloc_stack $Double                       // users: %86, %85, %83
  store %80 to [trivial] %82 : $*Double           // id: %83
  // function_ref S.subscript.getter
  %84 = function_ref @$s15InternalPackage1SVyq_Sgxcig : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@in_guaranteed τ_0_0, @guaranteed S<τ_0_0, τ_0_1>) -> @out Optional<τ_0_1> // user: %85
  %85 = apply %84<Double, Double>(%81, %82, %76) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@in_guaranteed τ_0_0, @guaranteed S<τ_0_0, τ_0_1>) -> @out Optional<τ_0_1>
  dealloc_stack %82 : $*Double                    // id: %86
  %87 = load [trivial] %81 : $*Optional<Double>   // user: %89
  destroy_value %76 : $S<Double, Double>          // id: %88
  switch_enum %87 : $Optional<Double>, case #Optional.some!enumelt: bb8, case #Optional.none!enumelt: bb7 // id: %89

bb7:                                              // Preds: bb6
  %90 = string_literal utf8 "ReproducerTests/T.swift" // user: %97
  %91 = integer_literal $Builtin.Word, 23         // user: %97
  %92 = integer_literal $Builtin.Int1, -1         // user: %97
  %93 = integer_literal $Builtin.Word, 6          // user: %97
  %94 = integer_literal $Builtin.Word, 30
  %95 = integer_literal $Builtin.Int1, 0          // user: %97
  // function_ref _diagnoseUnexpectedNilOptional(_filenameStart:_filenameLength:_filenameIsASCII:_line:_isImplicitUnwrap:)
  %96 = function_ref @$ss30_diagnoseUnexpectedNilOptional14_filenameStart01_E6Length01_E7IsASCII5_line17_isImplicitUnwrapyBp_BwBi1_BwBi1_tF : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> () // user: %97
  %97 = apply %96(%90, %91, %92, %93, %95) : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> ()
  unreachable                                     // id: %98

// %99                                            // user: %102
bb8(%99 : $Double):                               // Preds: bb6
  %100 = begin_access [modify] [static] %2 : $*Double // users: %103, %102
  // function_ref static Double.+= infix(_:_:)
  %101 = function_ref @$sSd2peoiyySdz_SdtFZ : $@convention(method) (@inout Double, Double, @thin Double.Type) -> () // user: %102
  %102 = apply %101(%100, %99, %57) : $@convention(method) (@inout Double, Double, @thin Double.Type) -> ()
  end_access %100 : $*Double                      // id: %103
  dealloc_stack %81 : $*Optional<Double>          // id: %104
  destroy_value %63 : $String                     // id: %105
  %106 = metatype $@thin Double.Type              // user: %151
  %107 = string_literal utf8 "c"                  // user: %112
  %108 = integer_literal $Builtin.Word, 1         // user: %112
  %109 = integer_literal $Builtin.Int1, -1        // user: %112
  %110 = metatype $@thin String.Type              // user: %112
  // function_ref String.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:)
  %111 = function_ref @$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String // user: %112
  %112 = apply %111(%107, %108, %109, %110) : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String // users: %154, %114
  // function_ref F.subscript.getter
  %113 = function_ref @$s15InternalPackage1FVyAA1SVyxq_GSgSScig : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@guaranteed String, F<τ_0_0, τ_0_1>) -> @owned Optional<S<τ_0_0, τ_0_1>> // user: %114
  %114 = apply %113<Double, Double>(%112, %0) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@guaranteed String, F<τ_0_0, τ_0_1>) -> @owned Optional<S<τ_0_0, τ_0_1>> // user: %115
  switch_enum %114 : $Optional<S<Double, Double>>, case #Optional.some!enumelt: bb10, case #Optional.none!enumelt: bb9 // id: %115

bb9:                                              // Preds: bb8
  %116 = string_literal utf8 "ReproducerTests/T.swift" // user: %123
  %117 = integer_literal $Builtin.Word, 23        // user: %123
  %118 = integer_literal $Builtin.Int1, -1        // user: %123
  %119 = integer_literal $Builtin.Word, 7         // user: %123
  %120 = integer_literal $Builtin.Word, 24
  %121 = integer_literal $Builtin.Int1, 0         // user: %123
  // function_ref _diagnoseUnexpectedNilOptional(_filenameStart:_filenameLength:_filenameIsASCII:_line:_isImplicitUnwrap:)
  %122 = function_ref @$ss30_diagnoseUnexpectedNilOptional14_filenameStart01_E6Length01_E7IsASCII5_line17_isImplicitUnwrapyBp_BwBi1_BwBi1_tF : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> () // user: %123
  %123 = apply %122(%116, %117, %118, %119, %121) : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> ()
  unreachable                                     // id: %124

// %125                                           // users: %134, %137
bb10(%125 : @owned $S<Double, Double>):           // Preds: bb8
  %126 = float_literal $Builtin.FPIEEE64, 0x0 // 0 // user: %129
  %127 = metatype $@thin Double.Type              // user: %129
  // function_ref Double.init(_builtinFloatLiteral:)
  %128 = function_ref @$sSd20_builtinFloatLiteralSdBf64__tcfC : $@convention(method) (Builtin.FPIEEE64, @thin Double.Type) -> Double // user: %129
  %129 = apply %128(%126, %127) : $@convention(method) (Builtin.FPIEEE64, @thin Double.Type) -> Double // user: %132
  %130 = alloc_stack $Optional<Double>            // users: %153, %136, %134
  %131 = alloc_stack $Double                      // users: %135, %134, %132
  store %129 to [trivial] %131 : $*Double         // id: %132
  // function_ref S.subscript.getter
  %133 = function_ref @$s15InternalPackage1SVyq_Sgxcig : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@in_guaranteed τ_0_0, @guaranteed S<τ_0_0, τ_0_1>) -> @out Optional<τ_0_1> // user: %134
  %134 = apply %133<Double, Double>(%130, %131, %125) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E> (@in_guaranteed τ_0_0, @guaranteed S<τ_0_0, τ_0_1>) -> @out Optional<τ_0_1>
  dealloc_stack %131 : $*Double                   // id: %135
  %136 = load [trivial] %130 : $*Optional<Double> // user: %138
  destroy_value %125 : $S<Double, Double>         // id: %137
  switch_enum %136 : $Optional<Double>, case #Optional.some!enumelt: bb12, case #Optional.none!enumelt: bb11 // id: %138

bb11:                                             // Preds: bb10
  %139 = string_literal utf8 "ReproducerTests/T.swift" // user: %146
  %140 = integer_literal $Builtin.Word, 23        // user: %146
  %141 = integer_literal $Builtin.Int1, -1        // user: %146
  %142 = integer_literal $Builtin.Word, 7         // user: %146
  %143 = integer_literal $Builtin.Word, 30
  %144 = integer_literal $Builtin.Int1, 0         // user: %146
  // function_ref _diagnoseUnexpectedNilOptional(_filenameStart:_filenameLength:_filenameIsASCII:_line:_isImplicitUnwrap:)
  %145 = function_ref @$ss30_diagnoseUnexpectedNilOptional14_filenameStart01_E6Length01_E7IsASCII5_line17_isImplicitUnwrapyBp_BwBi1_BwBi1_tF : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> () // user: %146
  %146 = apply %145(%139, %140, %141, %142, %144) : $@convention(thin) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, Builtin.Word, Builtin.Int1) -> ()
  unreachable                                     // id: %147

// %148                                           // user: %151
bb12(%148 : $Double):                             // Preds: bb10
  %149 = begin_access [modify] [static] %2 : $*Double // users: %152, %151
  // function_ref static Double.+= infix(_:_:)
  %150 = function_ref @$sSd2peoiyySdz_SdtFZ : $@convention(method) (@inout Double, Double, @thin Double.Type) -> () // user: %151
  %151 = apply %150(%149, %148, %106) : $@convention(method) (@inout Double, Double, @thin Double.Type) -> ()
  end_access %149 : $*Double                      // id: %152
  dealloc_stack %130 : $*Optional<Double>         // id: %153
  destroy_value %112 : $String                    // id: %154
  %155 = begin_access [read] [static] %2 : $*Double // users: %157, %156
  %156 = load [trivial] %155 : $*Double           // user: %159
  end_access %155 : $*Double                      // id: %157
  dealloc_stack %2 : $*Double                     // id: %158
  return %156 : $Double                           // id: %159
} // end sil function '$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF'

Here is generated pullback:

Generated SIL
// pullback of x #1 (n:) in A.testA()
sil private [ossa] @$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tFTJpSpSr : $@convention(thin) (Double, @owned _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0, @owned @callee_guaranteed (@inout Double) -> Double) -> F<Double, Double>.TangentVector {
// %0                                             // user: %80
// %1                                             // user: %180
// %2                                             // users: %87, %86
bb0(%0 : $Double, %1 : @owned $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0, %2 : @owned $@callee_guaranteed (@inout Double) -> Double):
  %3 = alloc_stack $Optional<Double>.TangentVector // users: %576, %575, %173, %6
  %4 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %6
  %5 = metatype $@thick Optional<Double>.TangentVector.Type // user: %6
  %6 = apply %4<Optional<Double>.TangentVector>(%3, %5) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %7 = alloc_stack $Optional<Double>.TangentVector // users: %574, %573, %146, %10
  %8 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %10
  %9 = metatype $@thick Optional<Double>.TangentVector.Type // user: %10
  %10 = apply %8<Optional<Double>.TangentVector>(%7, %9) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %11 = alloc_stack $Optional<Double>.TangentVector // users: %572, %571, %119, %14
  %12 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %14
  %13 = metatype $@thick Optional<Double>.TangentVector.Type // user: %14
  %14 = apply %12<Optional<Double>.TangentVector>(%11, %13) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %15 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:7:13 (scope #12)" // users: %570, %569, %104, %86, %83, %18
  %16 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %18
  %17 = metatype $@thick Double.Type              // user: %18
  %18 = apply %16<Double>(%15, %17) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %19 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:4:41 (scope #0)" // users: %568, %567, %536, %533, %503, %22
  %20 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %22
  %21 = metatype $@thick Double.Type              // user: %22
  %22 = apply %20<Double>(%19, %21) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %23 = alloc_stack $Optional<Double>.TangentVector // users: %566, %565, %473, %468, %450, %26
  %24 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %26
  %25 = metatype $@thick Optional<Double>.TangentVector.Type // user: %26
  %26 = apply %24<Optional<Double>.TangentVector>(%23, %25) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %27 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:5:26 (scope #2)" // users: %564, %563, %503, %447, %30
  %28 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %30
  %29 = metatype $@thick Double.Type              // user: %30
  %30 = apply %28<Double>(%27, %29) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %31 = alloc_stack $Optional<Double>.TangentVector // users: %562, %561, %450, %382, %34
  %32 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %34
  %33 = metatype $@thick Optional<Double>.TangentVector.Type // user: %34
  %34 = apply %32<Optional<Double>.TangentVector>(%31, %33) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %35 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:5:13 (scope #4)" // users: %560, %559, %447, %420, %379, %38
  %36 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %38
  %37 = metatype $@thick Double.Type              // user: %38
  %38 = apply %36<Double>(%35, %37) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %39 = alloc_stack $Optional<Double>.TangentVector // users: %558, %557, %349, %344, %320, %42
  %40 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %42
  %41 = metatype $@thick Optional<Double>.TangentVector.Type // user: %42
  %42 = apply %40<Optional<Double>.TangentVector>(%39, %41) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %43 = alloc_stack $Optional<Double>.TangentVector // users: %556, %555, %382, %317, %46
  %44 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %46
  %45 = metatype $@thick Optional<Double>.TangentVector.Type // user: %46
  %46 = apply %44<Optional<Double>.TangentVector>(%43, %45) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %47 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:6:26 (scope #6)" // users: %554, %553, %379, %314, %50
  %48 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %50
  %49 = metatype $@thick Double.Type              // user: %50
  %50 = apply %48<Double>(%47, %49) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %51 = alloc_stack $Optional<Double>.TangentVector // users: %552, %551, %320, %243, %54
  %52 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %54
  %53 = metatype $@thick Optional<Double>.TangentVector.Type // user: %54
  %54 = apply %52<Optional<Double>.TangentVector>(%51, %53) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %55 = alloc_stack $Optional<Double>.TangentVector // users: %550, %549, %317, %240, %58
  %56 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %58
  %57 = metatype $@thick Optional<Double>.TangentVector.Type // user: %58
  %58 = apply %56<Optional<Double>.TangentVector>(%55, %57) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %59 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:6:13 (scope #8)" // users: %548, %547, %314, %287, %237, %62
  %60 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %62
  %61 = metatype $@thick Double.Type              // user: %62
  %62 = apply %60<Double>(%59, %61) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %63 = alloc_stack $Optional<Double>.TangentVector // users: %546, %545, %207, %202, %173, %66
  %64 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %66
  %65 = metatype $@thick Optional<Double>.TangentVector.Type // user: %66
  %66 = apply %64<Optional<Double>.TangentVector>(%63, %65) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %67 = alloc_stack $Optional<Double>.TangentVector // users: %544, %543, %243, %146, %70
  %68 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %70
  %69 = metatype $@thick Optional<Double>.TangentVector.Type // user: %70
  %70 = apply %68<Optional<Double>.TangentVector>(%67, %69) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %71 = alloc_stack $Optional<Double>.TangentVector // users: %542, %541, %240, %119, %74
  %72 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %74
  %73 = metatype $@thick Optional<Double>.TangentVector.Type // user: %74
  %74 = apply %72<Optional<Double>.TangentVector>(%71, %73) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %75 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:7:26 (scope #10)" // users: %540, %539, %237, %104, %78
  %76 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %78
  %77 = metatype $@thick Double.Type              // user: %78
  %78 = apply %76<Double>(%75, %77) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %79 = alloc_stack $Double                       // users: %85, %84, %83, %80
  store %0 to [trivial] %79 : $*Double            // id: %80
  %81 = witness_method $Double, #AdditiveArithmetic."+=" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (inout Self, Self) -> () : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@inout τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> () // user: %83
  %82 = metatype $@thick Double.Type              // user: %83
  %83 = apply %81<Double>(%15, %79, %82) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@inout τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> ()
  destroy_addr %79 : $*Double                     // id: %84
  dealloc_stack %79 : $*Double                    // id: %85
  %86 = apply %2(%15) : $@callee_guaranteed (@inout Double) -> Double // user: %90
  destroy_value %2 : $@callee_guaranteed (@inout Double) -> Double // id: %87
  %88 = alloc_stack $Optional<Double>.TangentVector // users: %97, %96, %94
  %89 = alloc_stack $Optional<Double>             // users: %95, %94, %91
  %90 = enum $Optional<Double>, #Optional.some!enumelt, %86 : $Double // user: %91
  store %90 to [trivial] %89 : $*Optional<Double> // id: %91
  // function_ref Optional<A>.TangentVector.init(_:)
  %92 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVyADyx_GACQzSgcfC : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // user: %94
  %93 = metatype $@thin Optional<Double>.TangentVector.Type // user: %94
  %94 = apply %92<Double>(%88, %89, %93) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %89 : $*Optional<Double>          // id: %95
  %96 = load [trivial] %88 : $*Optional<Double>.TangentVector // user: %182
  dealloc_stack %88 : $*Optional<Double>.TangentVector // id: %97
  %98 = alloc_stack $F<Double, Double>.TangentVector // users: %103, %102, %101
  %99 = witness_method $F<Double, Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %101
  %100 = metatype $@thick F<Double, Double>.TangentVector.Type // user: %101
  %101 = apply %99<F<Double, Double>.TangentVector>(%98, %100) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %102 = load [trivial] %98 : $*F<Double, Double>.TangentVector // user: %182
  dealloc_stack %98 : $*F<Double, Double>.TangentVector // id: %103
  copy_addr %15 to %75 : $*Double                 // id: %104
  %105 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %110, %109, %108
  %106 = witness_method $Optional<S<Double, Double>>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %108
  %107 = metatype $@thick Optional<S<Double, Double>>.TangentVector.Type // user: %108
  %108 = apply %106<Optional<S<Double, Double>>.TangentVector>(%105, %107) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %109 = load [take] %105 : $*Optional<S<Double, Double>>.TangentVector // users: %174, %111
  dealloc_stack %105 : $*Optional<S<Double, Double>>.TangentVector // id: %110
  %111 = copy_value %109 : $Optional<S<Double, Double>>.TangentVector // user: %182
  %112 = alloc_stack $S<Double, Double>           // users: %117, %116, %115
  %113 = witness_method $S<Double, Double>, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %115
  %114 = metatype $@thick S<Double, Double>.Type  // user: %115
  %115 = apply %113<S<Double, Double>>(%112, %114) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %116 = load [take] %112 : $*S<Double, Double>   // users: %175, %118
  dealloc_stack %112 : $*S<Double, Double>        // id: %117
  %118 = copy_value %116 : $S<Double, Double>     // user: %182
  copy_addr %11 to %71 : $*Optional<Double>.TangentVector // id: %119
  %120 = alloc_stack $Optional<Double>.TangentVector // users: %125, %124, %123
  %121 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %123
  %122 = metatype $@thick Optional<Double>.TangentVector.Type // user: %123
  %123 = apply %121<Optional<Double>.TangentVector>(%120, %122) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %124 = load [trivial] %120 : $*Optional<Double>.TangentVector // user: %182
  dealloc_stack %120 : $*Optional<Double>.TangentVector // id: %125
  %126 = alloc_stack $Double                      // users: %131, %130, %129
  %127 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %129
  %128 = metatype $@thick Double.Type             // user: %129
  %129 = apply %127<Double>(%126, %128) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %130 = load [trivial] %126 : $*Double           // user: %182
  dealloc_stack %126 : $*Double                   // id: %131
  %132 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %137, %136, %135
  %133 = witness_method $Optional<S<Double, Double>>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %135
  %134 = metatype $@thick Optional<S<Double, Double>>.TangentVector.Type // user: %135
  %135 = apply %133<Optional<S<Double, Double>>.TangentVector>(%132, %134) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %136 = load [take] %132 : $*Optional<S<Double, Double>>.TangentVector // users: %176, %138
  dealloc_stack %132 : $*Optional<S<Double, Double>>.TangentVector // id: %137
  %138 = copy_value %136 : $Optional<S<Double, Double>>.TangentVector // user: %182
  %139 = alloc_stack $S<Double, Double>           // users: %144, %143, %142
  %140 = witness_method $S<Double, Double>, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %142
  %141 = metatype $@thick S<Double, Double>.Type  // user: %142
  %142 = apply %140<S<Double, Double>>(%139, %141) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %143 = load [take] %139 : $*S<Double, Double>   // users: %177, %145
  dealloc_stack %139 : $*S<Double, Double>        // id: %144
  %145 = copy_value %143 : $S<Double, Double>     // user: %182
  copy_addr %7 to %67 : $*Optional<Double>.TangentVector // id: %146
  %147 = alloc_stack $Optional<Double>.TangentVector // users: %152, %151, %150
  %148 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %150
  %149 = metatype $@thick Optional<Double>.TangentVector.Type // user: %150
  %150 = apply %148<Optional<Double>.TangentVector>(%147, %149) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %151 = load [trivial] %147 : $*Optional<Double>.TangentVector // user: %182
  dealloc_stack %147 : $*Optional<Double>.TangentVector // id: %152
  %153 = alloc_stack $Double                      // users: %158, %157, %156
  %154 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %156
  %155 = metatype $@thick Double.Type             // user: %156
  %156 = apply %154<Double>(%153, %155) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %157 = load [trivial] %153 : $*Double           // user: %182
  dealloc_stack %153 : $*Double                   // id: %158
  %159 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %164, %163, %162
  %160 = witness_method $Optional<S<Double, Double>>.TangentVector, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %162
  %161 = metatype $@thick Optional<S<Double, Double>>.TangentVector.Type // user: %162
  %162 = apply %160<Optional<S<Double, Double>>.TangentVector>(%159, %161) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %163 = load [take] %159 : $*Optional<S<Double, Double>>.TangentVector // users: %178, %165
  dealloc_stack %159 : $*Optional<S<Double, Double>>.TangentVector // id: %164
  %165 = copy_value %163 : $Optional<S<Double, Double>>.TangentVector // user: %182
  %166 = alloc_stack $S<Double, Double>           // users: %171, %170, %169
  %167 = witness_method $S<Double, Double>, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %169
  %168 = metatype $@thick S<Double, Double>.Type  // user: %169
  %169 = apply %167<S<Double, Double>>(%166, %168) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  %170 = load [take] %166 : $*S<Double, Double>   // users: %179, %172
  dealloc_stack %166 : $*S<Double, Double>        // id: %171
  %172 = copy_value %170 : $S<Double, Double>     // user: %182
  copy_addr %3 to %63 : $*Optional<Double>.TangentVector // id: %173
  destroy_value %109 : $Optional<S<Double, Double>>.TangentVector // id: %174
  destroy_value %116 : $S<Double, Double>         // id: %175
  destroy_value %136 : $Optional<S<Double, Double>>.TangentVector // id: %176
  destroy_value %143 : $S<Double, Double>         // id: %177
  destroy_value %163 : $Optional<S<Double, Double>>.TangentVector // id: %178
  destroy_value %170 : $S<Double, Double>         // id: %179
  switch_enum %1 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0, case #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0.bb10!enumelt: bb1 // id: %180

// %181                                           // user: %182
bb1(%181 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)): // Preds: bb0
  br bb2(%102 : $F<Double, Double>.TangentVector, %111 : $Optional<S<Double, Double>>.TangentVector, %118 : $S<Double, Double>, %124 : $Optional<Double>.TangentVector, %130 : $Double, %138 : $Optional<S<Double, Double>>.TangentVector, %145 : $S<Double, Double>, %151 : $Optional<Double>.TangentVector, %157 : $Double, %165 : $Optional<S<Double, Double>>.TangentVector, %172 : $S<Double, Double>, %96 : $Optional<Double>.TangentVector, %181 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)) // id: %182

// %183                                           // users: %256, %236
// %184                                           // users: %245, %238
// %185                                           // users: %246, %239
// %186                                           // user: %256
// %187                                           // user: %256
// %188                                           // users: %247, %241
// %189                                           // users: %248, %242
// %190                                           // user: %256
// %191                                           // user: %256
// %192                                           // user: %249
// %193                                           // users: %250, %209
// %194                                           // user: %199
// %195                                           // user: %196
bb2(%183 : $F<Double, Double>.TangentVector, %184 : @owned $Optional<S<Double, Double>>.TangentVector, %185 : @owned $S<Double, Double>, %186 : $Optional<Double>.TangentVector, %187 : $Double, %188 : @owned $Optional<S<Double, Double>>.TangentVector, %189 : @owned $S<Double, Double>, %190 : $Optional<Double>.TangentVector, %191 : $Double, %192 : @owned $Optional<S<Double, Double>>.TangentVector, %193 : @owned $S<Double, Double>, %194 : $Optional<Double>.TangentVector, %195 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)): // Preds: bb1
  (%196, %197) = destructure_tuple %195 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) // users: %254, %206
  %198 = alloc_stack $Optional<Double>.TangentVector // users: %204, %203, %202, %199
  store %194 to [trivial] %198 : $*Optional<Double>.TangentVector // id: %199
  %200 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic."+=" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (inout Self, Self) -> () : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@inout τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> () // user: %202
  %201 = metatype $@thick Optional<Double>.TangentVector.Type // user: %202
  %202 = apply %200<Optional<Double>.TangentVector>(%63, %198, %201) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@inout τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> ()
  destroy_addr %198 : $*Optional<Double>.TangentVector // id: %203
  dealloc_stack %198 : $*Optional<Double>.TangentVector // id: %204
  // function_ref thunk for @escaping @callee_guaranteed (@unowned Double?<A>.TangentVector) -> (@owned S<Double, Double>)
  %205 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVySd_G15InternalPackage1SVyS2dGIegyo_AeIIegno_TR : $@convention(thin) (@in_guaranteed Optional<Double>.TangentVector, @guaranteed @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) -> @owned S<Double, Double> // user: %206
  %206 = partial_apply [callee_guaranteed] %205(%197) : $@convention(thin) (@in_guaranteed Optional<Double>.TangentVector, @guaranteed @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) -> @owned S<Double, Double> // users: %208, %207
  %207 = apply %206(%63) : $@callee_guaranteed (@in_guaranteed Optional<Double>.TangentVector) -> @owned S<Double, Double> // users: %251, %210
  destroy_value %206 : $@callee_guaranteed (@in_guaranteed Optional<Double>.TangentVector) -> @owned S<Double, Double> // id: %208
  %209 = copy_value %193 : $S<Double, Double>     // user: %214
  %210 = copy_value %207 : $S<Double, Double>     // user: %215
  %211 = alloc_stack $S<Double, Double>           // users: %224, %223, %218
  %212 = alloc_stack $S<Double, Double>           // users: %222, %219, %218, %214
  %213 = alloc_stack $S<Double, Double>           // users: %221, %220, %218, %215
  store %209 to [init] %212 : $*S<Double, Double> // id: %214
  store %210 to [init] %213 : $*S<Double, Double> // id: %215
  %216 = witness_method $S<Double, Double>, #AdditiveArithmetic."+" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (Self, Self) -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0 // user: %218
  %217 = metatype $@thick S<Double, Double>.Type  // user: %218
  %218 = apply %216<S<Double, Double>>(%211, %213, %212, %217) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0
  destroy_addr %212 : $*S<Double, Double>         // id: %219
  destroy_addr %213 : $*S<Double, Double>         // id: %220
  dealloc_stack %213 : $*S<Double, Double>        // id: %221
  dealloc_stack %212 : $*S<Double, Double>        // id: %222
  %223 = load [take] %211 : $*S<Double, Double>   // users: %252, %225
  dealloc_stack %211 : $*S<Double, Double>        // id: %224
  %225 = copy_value %223 : $S<Double, Double>     // user: %228
  %226 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %235, %234, %232
  %227 = alloc_stack $Optional<S<Double, Double>> // users: %233, %232, %229
  %228 = enum $Optional<S<Double, Double>>, #Optional.some!enumelt, %225 : $S<Double, Double> // user: %229
  store %228 to [init] %227 : $*Optional<S<Double, Double>> // id: %229
  // function_ref Optional<A>.TangentVector.init(_:)
  %230 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVyADyx_GACQzSgcfC : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // user: %232
  %231 = metatype $@thin Optional<S<Double, Double>>.TangentVector.Type // user: %232
  %232 = apply %230<S<Double, Double>>(%226, %227, %231) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %227 : $*Optional<S<Double, Double>> // id: %233
  %234 = load [take] %226 : $*Optional<S<Double, Double>>.TangentVector // users: %253, %244
  dealloc_stack %226 : $*Optional<S<Double, Double>>.TangentVector // id: %235
  debug_value %183 : $F<Double, Double>.TangentVector, let, name "n", argno 1 // id: %236
  copy_addr %75 to %59 : $*Double                 // id: %237
  %238 = copy_value %184 : $Optional<S<Double, Double>>.TangentVector // user: %256
  %239 = copy_value %185 : $S<Double, Double>     // user: %256
  copy_addr %71 to %55 : $*Optional<Double>.TangentVector // id: %240
  %241 = copy_value %188 : $Optional<S<Double, Double>>.TangentVector // user: %256
  %242 = copy_value %189 : $S<Double, Double>     // user: %256
  copy_addr %67 to %51 : $*Optional<Double>.TangentVector // id: %243
  %244 = copy_value %234 : $Optional<S<Double, Double>>.TangentVector // user: %256
  destroy_value %184 : $Optional<S<Double, Double>>.TangentVector // id: %245
  destroy_value %185 : $S<Double, Double>         // id: %246
  destroy_value %188 : $Optional<S<Double, Double>>.TangentVector // id: %247
  destroy_value %189 : $S<Double, Double>         // id: %248
  destroy_value %192 : $Optional<S<Double, Double>>.TangentVector // id: %249
  destroy_value %193 : $S<Double, Double>         // id: %250
  destroy_value %207 : $S<Double, Double>         // id: %251
  destroy_value %223 : $S<Double, Double>         // id: %252
  destroy_value %234 : $Optional<S<Double, Double>>.TangentVector // id: %253
  switch_enum %196 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, case #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0.bb8!enumelt: bb3 // id: %254

// %255                                           // user: %256
bb3(%255 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)): // Preds: bb2
  br bb4(%183 : $F<Double, Double>.TangentVector, %238 : $Optional<S<Double, Double>>.TangentVector, %239 : $S<Double, Double>, %186 : $Optional<Double>.TangentVector, %187 : $Double, %241 : $Optional<S<Double, Double>>.TangentVector, %242 : $S<Double, Double>, %190 : $Optional<Double>.TangentVector, %191 : $Double, %244 : $Optional<S<Double, Double>>.TangentVector, %255 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)) // id: %256

// %257                                           // user: %276
// %258                                           // users: %321, %315
// %259                                           // users: %322, %316
// %260                                           // user: %328
// %261                                           // user: %328
// %262                                           // users: %323, %318
// %263                                           // users: %324, %319
// %265                                           // user: %292
// %266                                           // users: %325, %271
// %267                                           // user: %268
bb4(%257 : $F<Double, Double>.TangentVector, %258 : @owned $Optional<S<Double, Double>>.TangentVector, %259 : @owned $S<Double, Double>, %260 : $Optional<Double>.TangentVector, %261 : $Double, %262 : @owned $Optional<S<Double, Double>>.TangentVector, %263 : @owned $S<Double, Double>, %264 : $Optional<Double>.TangentVector, %265 : $Double, %266 : @owned $Optional<S<Double, Double>>.TangentVector, %267 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)): // Preds: bb3
  (%268, %269, %270) = destructure_tuple %267 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) // users: %326, %288, %287, %272, %271
  %271 = apply %270(%266) : $@callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector // user: %277
  destroy_value %270 : $@callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector // id: %272
  %273 = alloc_stack $F<Double, Double>.TangentVector // users: %286, %285, %280
  %274 = alloc_stack $F<Double, Double>.TangentVector // users: %284, %281, %280, %276
  %275 = alloc_stack $F<Double, Double>.TangentVector // users: %283, %282, %280, %277
  store %257 to [trivial] %274 : $*F<Double, Double>.TangentVector // id: %276
  store %271 to [trivial] %275 : $*F<Double, Double>.TangentVector // id: %277
  %278 = witness_method $F<Double, Double>.TangentVector, #AdditiveArithmetic."+" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (Self, Self) -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0 // user: %280
  %279 = metatype $@thick F<Double, Double>.TangentVector.Type // user: %280
  %280 = apply %278<F<Double, Double>.TangentVector>(%273, %275, %274, %279) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0
  destroy_addr %274 : $*F<Double, Double>.TangentVector // id: %281
  destroy_addr %275 : $*F<Double, Double>.TangentVector // id: %282
  dealloc_stack %275 : $*F<Double, Double>.TangentVector // id: %283
  dealloc_stack %274 : $*F<Double, Double>.TangentVector // id: %284
  %285 = load [trivial] %273 : $*F<Double, Double>.TangentVector // users: %328, %313
  dealloc_stack %273 : $*F<Double, Double>.TangentVector // id: %286
  %287 = apply %269(%59) : $@callee_guaranteed (@inout Double) -> Double // user: %293
  destroy_value %269 : $@callee_guaranteed (@inout Double) -> Double // id: %288
  %289 = alloc_stack $Double                      // users: %302, %301, %296
  %290 = alloc_stack $Double                      // users: %300, %297, %296, %292
  %291 = alloc_stack $Double                      // users: %299, %298, %296, %293
  store %265 to [trivial] %290 : $*Double         // id: %292
  store %287 to [trivial] %291 : $*Double         // id: %293
  %294 = witness_method $Double, #AdditiveArithmetic."+" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (Self, Self) -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0 // user: %296
  %295 = metatype $@thick Double.Type             // user: %296
  %296 = apply %294<Double>(%289, %291, %290, %295) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0
  destroy_addr %290 : $*Double                    // id: %297
  destroy_addr %291 : $*Double                    // id: %298
  dealloc_stack %291 : $*Double                   // id: %299
  dealloc_stack %290 : $*Double                   // id: %300
  %301 = load [trivial] %289 : $*Double           // user: %305
  dealloc_stack %289 : $*Double                   // id: %302
  %303 = alloc_stack $Optional<Double>.TangentVector // users: %312, %311, %309
  %304 = alloc_stack $Optional<Double>            // users: %310, %309, %306
  %305 = enum $Optional<Double>, #Optional.some!enumelt, %301 : $Double // user: %306
  store %305 to [trivial] %304 : $*Optional<Double> // id: %306
  // function_ref Optional<A>.TangentVector.init(_:)
  %307 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVyADyx_GACQzSgcfC : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // user: %309
  %308 = metatype $@thin Optional<Double>.TangentVector.Type // user: %309
  %309 = apply %307<Double>(%303, %304, %308) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %304 : $*Optional<Double>         // id: %310
  %311 = load [trivial] %303 : $*Optional<Double>.TangentVector // user: %328
  dealloc_stack %303 : $*Optional<Double>.TangentVector // id: %312
  debug_value %285 : $F<Double, Double>.TangentVector, let, name "n", argno 1 // id: %313
  copy_addr %59 to %47 : $*Double                 // id: %314
  %315 = copy_value %258 : $Optional<S<Double, Double>>.TangentVector // user: %328
  %316 = copy_value %259 : $S<Double, Double>     // user: %328
  copy_addr %55 to %43 : $*Optional<Double>.TangentVector // id: %317
  %318 = copy_value %262 : $Optional<S<Double, Double>>.TangentVector // user: %328
  %319 = copy_value %263 : $S<Double, Double>     // user: %328
  copy_addr %51 to %39 : $*Optional<Double>.TangentVector // id: %320
  destroy_value %258 : $Optional<S<Double, Double>>.TangentVector // id: %321
  destroy_value %259 : $S<Double, Double>         // id: %322
  destroy_value %262 : $Optional<S<Double, Double>>.TangentVector // id: %323
  destroy_value %263 : $S<Double, Double>         // id: %324
  destroy_value %266 : $Optional<S<Double, Double>>.TangentVector // id: %325
  switch_enum %268 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, case #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0.bb6!enumelt: bb5 // id: %326

// %327                                           // user: %328
bb5(%327 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)): // Preds: bb4
  br bb6(%285 : $F<Double, Double>.TangentVector, %315 : $Optional<S<Double, Double>>.TangentVector, %316 : $S<Double, Double>, %260 : $Optional<Double>.TangentVector, %261 : $Double, %318 : $Optional<S<Double, Double>>.TangentVector, %319 : $S<Double, Double>, %311 : $Optional<Double>.TangentVector, %327 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)) // id: %328

// %329                                           // users: %393, %378
// %330                                           // users: %384, %380
// %331                                           // users: %385, %381
// %332                                           // user: %393
// %333                                           // user: %393
// %334                                           // user: %386
// %335                                           // users: %387, %351
// %336                                           // user: %341
// %337                                           // user: %338
bb6(%329 : $F<Double, Double>.TangentVector, %330 : @owned $Optional<S<Double, Double>>.TangentVector, %331 : @owned $S<Double, Double>, %332 : $Optional<Double>.TangentVector, %333 : $Double, %334 : @owned $Optional<S<Double, Double>>.TangentVector, %335 : @owned $S<Double, Double>, %336 : $Optional<Double>.TangentVector, %337 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)): // Preds: bb5
  (%338, %339) = destructure_tuple %337 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) // users: %391, %348
  %340 = alloc_stack $Optional<Double>.TangentVector // users: %346, %345, %344, %341
  store %336 to [trivial] %340 : $*Optional<Double>.TangentVector // id: %341
  %342 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic."+=" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (inout Self, Self) -> () : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@inout τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> () // user: %344
  %343 = metatype $@thick Optional<Double>.TangentVector.Type // user: %344
  %344 = apply %342<Optional<Double>.TangentVector>(%39, %340, %343) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@inout τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> ()
  destroy_addr %340 : $*Optional<Double>.TangentVector // id: %345
  dealloc_stack %340 : $*Optional<Double>.TangentVector // id: %346
  // function_ref thunk for @escaping @callee_guaranteed (@unowned Double?<A>.TangentVector) -> (@owned S<Double, Double>)
  %347 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVySd_G15InternalPackage1SVyS2dGIegyo_AeIIegno_TR : $@convention(thin) (@in_guaranteed Optional<Double>.TangentVector, @guaranteed @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) -> @owned S<Double, Double> // user: %348
  %348 = partial_apply [callee_guaranteed] %347(%339) : $@convention(thin) (@in_guaranteed Optional<Double>.TangentVector, @guaranteed @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) -> @owned S<Double, Double> // users: %350, %349
  %349 = apply %348(%39) : $@callee_guaranteed (@in_guaranteed Optional<Double>.TangentVector) -> @owned S<Double, Double> // users: %388, %352
  destroy_value %348 : $@callee_guaranteed (@in_guaranteed Optional<Double>.TangentVector) -> @owned S<Double, Double> // id: %350
  %351 = copy_value %335 : $S<Double, Double>     // user: %356
  %352 = copy_value %349 : $S<Double, Double>     // user: %357
  %353 = alloc_stack $S<Double, Double>           // users: %366, %365, %360
  %354 = alloc_stack $S<Double, Double>           // users: %364, %361, %360, %356
  %355 = alloc_stack $S<Double, Double>           // users: %363, %362, %360, %357
  store %351 to [init] %354 : $*S<Double, Double> // id: %356
  store %352 to [init] %355 : $*S<Double, Double> // id: %357
  %358 = witness_method $S<Double, Double>, #AdditiveArithmetic."+" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (Self, Self) -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0 // user: %360
  %359 = metatype $@thick S<Double, Double>.Type  // user: %360
  %360 = apply %358<S<Double, Double>>(%353, %355, %354, %359) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0
  destroy_addr %354 : $*S<Double, Double>         // id: %361
  destroy_addr %355 : $*S<Double, Double>         // id: %362
  dealloc_stack %355 : $*S<Double, Double>        // id: %363
  dealloc_stack %354 : $*S<Double, Double>        // id: %364
  %365 = load [take] %353 : $*S<Double, Double>   // users: %389, %367
  dealloc_stack %353 : $*S<Double, Double>        // id: %366
  %367 = copy_value %365 : $S<Double, Double>     // user: %370
  %368 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %377, %376, %374
  %369 = alloc_stack $Optional<S<Double, Double>> // users: %375, %374, %371
  %370 = enum $Optional<S<Double, Double>>, #Optional.some!enumelt, %367 : $S<Double, Double> // user: %371
  store %370 to [init] %369 : $*Optional<S<Double, Double>> // id: %371
  // function_ref Optional<A>.TangentVector.init(_:)
  %372 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVyADyx_GACQzSgcfC : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // user: %374
  %373 = metatype $@thin Optional<S<Double, Double>>.TangentVector.Type // user: %374
  %374 = apply %372<S<Double, Double>>(%368, %369, %373) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %369 : $*Optional<S<Double, Double>> // id: %375
  %376 = load [take] %368 : $*Optional<S<Double, Double>>.TangentVector // users: %390, %383
  dealloc_stack %368 : $*Optional<S<Double, Double>>.TangentVector // id: %377
  debug_value %329 : $F<Double, Double>.TangentVector, let, name "n", argno 1 // id: %378
  copy_addr %47 to %35 : $*Double                 // id: %379
  %380 = copy_value %330 : $Optional<S<Double, Double>>.TangentVector // user: %393
  %381 = copy_value %331 : $S<Double, Double>     // user: %393
  copy_addr %43 to %31 : $*Optional<Double>.TangentVector // id: %382
  %383 = copy_value %376 : $Optional<S<Double, Double>>.TangentVector // user: %393
  destroy_value %330 : $Optional<S<Double, Double>>.TangentVector // id: %384
  destroy_value %331 : $S<Double, Double>         // id: %385
  destroy_value %334 : $Optional<S<Double, Double>>.TangentVector // id: %386
  destroy_value %335 : $S<Double, Double>         // id: %387
  destroy_value %349 : $S<Double, Double>         // id: %388
  destroy_value %365 : $S<Double, Double>         // id: %389
  destroy_value %376 : $Optional<S<Double, Double>>.TangentVector // id: %390
  switch_enum %338 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, case #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0.bb4!enumelt: bb7 // id: %391

// %392                                           // user: %393
bb7(%392 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)): // Preds: bb6
  br bb8(%329 : $F<Double, Double>.TangentVector, %380 : $Optional<S<Double, Double>>.TangentVector, %381 : $S<Double, Double>, %332 : $Optional<Double>.TangentVector, %333 : $Double, %383 : $Optional<S<Double, Double>>.TangentVector, %392 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)) // id: %393

// %394                                           // user: %409
// %395                                           // users: %451, %448
// %396                                           // users: %452, %449
// %398                                           // user: %425
// %399                                           // users: %453, %404
// %400                                           // user: %401
bb8(%394 : $F<Double, Double>.TangentVector, %395 : @owned $Optional<S<Double, Double>>.TangentVector, %396 : @owned $S<Double, Double>, %397 : $Optional<Double>.TangentVector, %398 : $Double, %399 : @owned $Optional<S<Double, Double>>.TangentVector, %400 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)): // Preds: bb7
  (%401, %402, %403) = destructure_tuple %400 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) // users: %454, %421, %420, %405, %404
  %404 = apply %403(%399) : $@callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector // user: %410
  destroy_value %403 : $@callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector // id: %405
  %406 = alloc_stack $F<Double, Double>.TangentVector // users: %419, %418, %413
  %407 = alloc_stack $F<Double, Double>.TangentVector // users: %417, %414, %413, %409
  %408 = alloc_stack $F<Double, Double>.TangentVector // users: %416, %415, %413, %410
  store %394 to [trivial] %407 : $*F<Double, Double>.TangentVector // id: %409
  store %404 to [trivial] %408 : $*F<Double, Double>.TangentVector // id: %410
  %411 = witness_method $F<Double, Double>.TangentVector, #AdditiveArithmetic."+" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (Self, Self) -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0 // user: %413
  %412 = metatype $@thick F<Double, Double>.TangentVector.Type // user: %413
  %413 = apply %411<F<Double, Double>.TangentVector>(%406, %408, %407, %412) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0
  destroy_addr %407 : $*F<Double, Double>.TangentVector // id: %414
  destroy_addr %408 : $*F<Double, Double>.TangentVector // id: %415
  dealloc_stack %408 : $*F<Double, Double>.TangentVector // id: %416
  dealloc_stack %407 : $*F<Double, Double>.TangentVector // id: %417
  %418 = load [trivial] %406 : $*F<Double, Double>.TangentVector // users: %456, %446
  dealloc_stack %406 : $*F<Double, Double>.TangentVector // id: %419
  %420 = apply %402(%35) : $@callee_guaranteed (@inout Double) -> Double // user: %426
  destroy_value %402 : $@callee_guaranteed (@inout Double) -> Double // id: %421
  %422 = alloc_stack $Double                      // users: %435, %434, %429
  %423 = alloc_stack $Double                      // users: %433, %430, %429, %425
  %424 = alloc_stack $Double                      // users: %432, %431, %429, %426
  store %398 to [trivial] %423 : $*Double         // id: %425
  store %420 to [trivial] %424 : $*Double         // id: %426
  %427 = witness_method $Double, #AdditiveArithmetic."+" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (Self, Self) -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0 // user: %429
  %428 = metatype $@thick Double.Type             // user: %429
  %429 = apply %427<Double>(%422, %424, %423, %428) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0
  destroy_addr %423 : $*Double                    // id: %430
  destroy_addr %424 : $*Double                    // id: %431
  dealloc_stack %424 : $*Double                   // id: %432
  dealloc_stack %423 : $*Double                   // id: %433
  %434 = load [trivial] %422 : $*Double           // user: %438
  dealloc_stack %422 : $*Double                   // id: %435
  %436 = alloc_stack $Optional<Double>.TangentVector // users: %445, %444, %442
  %437 = alloc_stack $Optional<Double>            // users: %443, %442, %439
  %438 = enum $Optional<Double>, #Optional.some!enumelt, %434 : $Double // user: %439
  store %438 to [trivial] %437 : $*Optional<Double> // id: %439
  // function_ref Optional<A>.TangentVector.init(_:)
  %440 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVyADyx_GACQzSgcfC : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // user: %442
  %441 = metatype $@thin Optional<Double>.TangentVector.Type // user: %442
  %442 = apply %440<Double>(%436, %437, %441) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %437 : $*Optional<Double>         // id: %443
  %444 = load [trivial] %436 : $*Optional<Double>.TangentVector // user: %456
  dealloc_stack %436 : $*Optional<Double>.TangentVector // id: %445
  debug_value %418 : $F<Double, Double>.TangentVector, let, name "n", argno 1 // id: %446
  copy_addr %35 to %27 : $*Double                 // id: %447
  %448 = copy_value %395 : $Optional<S<Double, Double>>.TangentVector // user: %456
  %449 = copy_value %396 : $S<Double, Double>     // user: %456
  copy_addr %31 to %23 : $*Optional<Double>.TangentVector // id: %450
  destroy_value %395 : $Optional<S<Double, Double>>.TangentVector // id: %451
  destroy_value %396 : $S<Double, Double>         // id: %452
  destroy_value %399 : $Optional<S<Double, Double>>.TangentVector // id: %453
  switch_enum %401 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, case #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0.bb2!enumelt: bb9 // id: %454

// %455                                           // user: %456
bb9(%455 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)): // Preds: bb8
  br bb10(%418 : $F<Double, Double>.TangentVector, %448 : $Optional<S<Double, Double>>.TangentVector, %449 : $S<Double, Double>, %444 : $Optional<Double>.TangentVector, %455 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)) // id: %456

// %457                                           // users: %512, %502
// %458                                           // user: %505
// %459                                           // users: %506, %475
// %460                                           // user: %465
// %461                                           // user: %462
bb10(%457 : $F<Double, Double>.TangentVector, %458 : @owned $Optional<S<Double, Double>>.TangentVector, %459 : @owned $S<Double, Double>, %460 : $Optional<Double>.TangentVector, %461 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)): // Preds: bb9
  (%462, %463) = destructure_tuple %461 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) // users: %510, %472
  %464 = alloc_stack $Optional<Double>.TangentVector // users: %470, %469, %468, %465
  store %460 to [trivial] %464 : $*Optional<Double>.TangentVector // id: %465
  %466 = witness_method $Optional<Double>.TangentVector, #AdditiveArithmetic."+=" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (inout Self, Self) -> () : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@inout τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> () // user: %468
  %467 = metatype $@thick Optional<Double>.TangentVector.Type // user: %468
  %468 = apply %466<Optional<Double>.TangentVector>(%23, %464, %467) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@inout τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> ()
  destroy_addr %464 : $*Optional<Double>.TangentVector // id: %469
  dealloc_stack %464 : $*Optional<Double>.TangentVector // id: %470
  // function_ref thunk for @escaping @callee_guaranteed (@unowned Double?<A>.TangentVector) -> (@owned S<Double, Double>)
  %471 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVySd_G15InternalPackage1SVyS2dGIegyo_AeIIegno_TR : $@convention(thin) (@in_guaranteed Optional<Double>.TangentVector, @guaranteed @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) -> @owned S<Double, Double> // user: %472
  %472 = partial_apply [callee_guaranteed] %471(%463) : $@convention(thin) (@in_guaranteed Optional<Double>.TangentVector, @guaranteed @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) -> @owned S<Double, Double> // users: %474, %473
  %473 = apply %472(%23) : $@callee_guaranteed (@in_guaranteed Optional<Double>.TangentVector) -> @owned S<Double, Double> // users: %507, %476
  destroy_value %472 : $@callee_guaranteed (@in_guaranteed Optional<Double>.TangentVector) -> @owned S<Double, Double> // id: %474
  %475 = copy_value %459 : $S<Double, Double>     // user: %480
  %476 = copy_value %473 : $S<Double, Double>     // user: %481
  %477 = alloc_stack $S<Double, Double>           // users: %490, %489, %484
  %478 = alloc_stack $S<Double, Double>           // users: %488, %485, %484, %480
  %479 = alloc_stack $S<Double, Double>           // users: %487, %486, %484, %481
  store %475 to [init] %478 : $*S<Double, Double> // id: %480
  store %476 to [init] %479 : $*S<Double, Double> // id: %481
  %482 = witness_method $S<Double, Double>, #AdditiveArithmetic."+" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (Self, Self) -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0 // user: %484
  %483 = metatype $@thick S<Double, Double>.Type  // user: %484
  %484 = apply %482<S<Double, Double>>(%477, %479, %478, %483) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0
  destroy_addr %478 : $*S<Double, Double>         // id: %485
  destroy_addr %479 : $*S<Double, Double>         // id: %486
  dealloc_stack %479 : $*S<Double, Double>        // id: %487
  dealloc_stack %478 : $*S<Double, Double>        // id: %488
  %489 = load [take] %477 : $*S<Double, Double>   // users: %508, %491
  dealloc_stack %477 : $*S<Double, Double>        // id: %490
  %491 = copy_value %489 : $S<Double, Double>     // user: %494
  %492 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %501, %500, %498
  %493 = alloc_stack $Optional<S<Double, Double>> // users: %499, %498, %495
  %494 = enum $Optional<S<Double, Double>>, #Optional.some!enumelt, %491 : $S<Double, Double> // user: %495
  store %494 to [init] %493 : $*Optional<S<Double, Double>> // id: %495
  // function_ref Optional<A>.TangentVector.init(_:)
  %496 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVyADyx_GACQzSgcfC : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // user: %498
  %497 = metatype $@thin Optional<S<Double, Double>>.TangentVector.Type // user: %498
  %498 = apply %496<S<Double, Double>>(%492, %493, %497) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %493 : $*Optional<S<Double, Double>> // id: %499
  %500 = load [take] %492 : $*Optional<S<Double, Double>>.TangentVector // users: %509, %504
  dealloc_stack %492 : $*Optional<S<Double, Double>>.TangentVector // id: %501
  debug_value %457 : $F<Double, Double>.TangentVector, let, name "n", argno 1 // id: %502
  copy_addr %27 to %19 : $*Double                 // id: %503
  %504 = copy_value %500 : $Optional<S<Double, Double>>.TangentVector // user: %512
  destroy_value %458 : $Optional<S<Double, Double>>.TangentVector // id: %505
  destroy_value %459 : $S<Double, Double>         // id: %506
  destroy_value %473 : $S<Double, Double>         // id: %507
  destroy_value %489 : $S<Double, Double>         // id: %508
  destroy_value %500 : $Optional<S<Double, Double>>.TangentVector // id: %509
  switch_enum %462 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, case #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0.bb0!enumelt: bb11 // id: %510

// %511                                           // user: %512
bb11(%511 : @owned $(_: @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)): // Preds: bb10
  br bb12(%457 : $F<Double, Double>.TangentVector, %504 : $Optional<S<Double, Double>>.TangentVector, %511 : $(_: @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)) // id: %512

// %513                                           // user: %522
// %514                                           // users: %538, %517
// %515                                           // user: %516
bb12(%513 : $F<Double, Double>.TangentVector, %514 : @owned $Optional<S<Double, Double>>.TangentVector, %515 : @owned $(_: @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector)): // Preds: bb11
  %516 = destructure_tuple %515 : $(_: @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) // users: %518, %517
  %517 = apply %516(%514) : $@callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector // user: %523
  destroy_value %516 : $@callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector // id: %518
  %519 = alloc_stack $F<Double, Double>.TangentVector // users: %532, %531, %526
  %520 = alloc_stack $F<Double, Double>.TangentVector // users: %530, %527, %526, %522
  %521 = alloc_stack $F<Double, Double>.TangentVector // users: %529, %528, %526, %523
  store %513 to [trivial] %520 : $*F<Double, Double>.TangentVector // id: %522
  store %517 to [trivial] %521 : $*F<Double, Double>.TangentVector // id: %523
  %524 = witness_method $F<Double, Double>.TangentVector, #AdditiveArithmetic."+" : <Self where Self : AdditiveArithmetic> (Self.Type) -> (Self, Self) -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0 // user: %526
  %525 = metatype $@thick F<Double, Double>.TangentVector.Type // user: %526
  %526 = apply %524<F<Double, Double>.TangentVector>(%519, %521, %520, %525) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, @thick τ_0_0.Type) -> @out τ_0_0
  destroy_addr %520 : $*F<Double, Double>.TangentVector // id: %527
  destroy_addr %521 : $*F<Double, Double>.TangentVector // id: %528
  dealloc_stack %521 : $*F<Double, Double>.TangentVector // id: %529
  dealloc_stack %520 : $*F<Double, Double>.TangentVector // id: %530
  %531 = load [trivial] %519 : $*F<Double, Double>.TangentVector // users: %577, %537
  dealloc_stack %519 : $*F<Double, Double>.TangentVector // id: %532
  %533 = load [trivial] %19 : $*Double
  %534 = witness_method $Double, #AdditiveArithmetic.zero!getter : <Self where Self : AdditiveArithmetic> (Self.Type) -> () -> Self : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0 // user: %536
  %535 = metatype $@thick Double.Type             // user: %536
  %536 = apply %534<Double>(%19, %535) : $@convention(witness_method: AdditiveArithmetic) <τ_0_0 where τ_0_0 : AdditiveArithmetic> (@thick τ_0_0.Type) -> @out τ_0_0
  debug_value %531 : $F<Double, Double>.TangentVector, let, name "n", argno 1 // id: %537
  destroy_value %514 : $Optional<S<Double, Double>>.TangentVector // id: %538
  destroy_addr %75 : $*Double                     // id: %539
  dealloc_stack %75 : $*Double                    // id: %540
  destroy_addr %71 : $*Optional<Double>.TangentVector // id: %541
  dealloc_stack %71 : $*Optional<Double>.TangentVector // id: %542
  destroy_addr %67 : $*Optional<Double>.TangentVector // id: %543
  dealloc_stack %67 : $*Optional<Double>.TangentVector // id: %544
  destroy_addr %63 : $*Optional<Double>.TangentVector // id: %545
  dealloc_stack %63 : $*Optional<Double>.TangentVector // id: %546
  destroy_addr %59 : $*Double                     // id: %547
  dealloc_stack %59 : $*Double                    // id: %548
  destroy_addr %55 : $*Optional<Double>.TangentVector // id: %549
  dealloc_stack %55 : $*Optional<Double>.TangentVector // id: %550
  destroy_addr %51 : $*Optional<Double>.TangentVector // id: %551
  dealloc_stack %51 : $*Optional<Double>.TangentVector // id: %552
  destroy_addr %47 : $*Double                     // id: %553
  dealloc_stack %47 : $*Double                    // id: %554
  destroy_addr %43 : $*Optional<Double>.TangentVector // id: %555
  dealloc_stack %43 : $*Optional<Double>.TangentVector // id: %556
  destroy_addr %39 : $*Optional<Double>.TangentVector // id: %557
  dealloc_stack %39 : $*Optional<Double>.TangentVector // id: %558
  destroy_addr %35 : $*Double                     // id: %559
  dealloc_stack %35 : $*Double                    // id: %560
  destroy_addr %31 : $*Optional<Double>.TangentVector // id: %561
  dealloc_stack %31 : $*Optional<Double>.TangentVector // id: %562
  destroy_addr %27 : $*Double                     // id: %563
  dealloc_stack %27 : $*Double                    // id: %564
  destroy_addr %23 : $*Optional<Double>.TangentVector // id: %565
  dealloc_stack %23 : $*Optional<Double>.TangentVector // id: %566
  destroy_addr %19 : $*Double                     // id: %567
  dealloc_stack %19 : $*Double                    // id: %568
  destroy_addr %15 : $*Double                     // id: %569
  dealloc_stack %15 : $*Double                    // id: %570
  destroy_addr %11 : $*Optional<Double>.TangentVector // id: %571
  dealloc_stack %11 : $*Optional<Double>.TangentVector // id: %572
  destroy_addr %7 : $*Optional<Double>.TangentVector // id: %573
  dealloc_stack %7 : $*Optional<Double>.TangentVector // id: %574
  destroy_addr %3 : $*Optional<Double>.TangentVector // id: %575
  dealloc_stack %3 : $*Optional<Double>.TangentVector // id: %576
  return %531 : $F<Double, Double>.TangentVector  // id: %577
} // end sil function '$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tFTJpSpSr'

Here is the optimized code on input of LoadableByAddress:

Input SIL
// pullback of x #1 (n:) in A.testA()
sil private @$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tFTJpSpSr : $@convention(thin) (Double, @in _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0, @owned @callee_guaranteed (@inout Double) -> Double) -> F<Double, Double>.TangentVector {
[%1: noescape v**, read **, write **, copy **, destroy **]
[%2: noescape v**, read v**.c*.v**, write v**.c*.v**, copy v**.c*.v**, destroy v**.c*.v**]
[global: read,write,copy,destroy,allocate,deinit_barrier]
// %0                                             // users: %56, %55
// %1                                             // user: %15
// %2                                             // users: %61, %60
bb0(%0 : $Double, %1 : $*_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0, %2 : $@callee_guaranteed (@inout Double) -> Double):
  %3 = alloc_stack $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 // users: %109, %108
  %4 = alloc_stack $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 // users: %108, %16
  %5 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %149, %150, %141, %292
  %6 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %207, %208, %199, %291
  %7 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %258, %259, %253, %290
  %8 = alloc_stack $Array<Optional<Double>>       // users: %131, %130, %289
  %9 = alloc_stack $Optional<String>              // users: %134, %133, %288
  %10 = alloc_stack $Array<Optional<Double>>      // users: %189, %188, %287
  %11 = alloc_stack $Optional<String>             // users: %192, %191, %286
  %12 = alloc_stack $Array<Optional<Double>>      // users: %243, %242, %285
  %13 = alloc_stack $Optional<String>             // users: %246, %245, %284
  %14 = alloc_stack $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 // users: %16, %17, %283, %15
  copy_addr [take] %1 to [init] %14 : $*_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 // id: %15
  copy_addr [take] %14 to [init] %4 : $*_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 // id: %16
  %17 = load %14 : $*_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 // user: %110
  %18 = alloc_stack $S<Double, Double>            // users: %239, %238, %282
  %19 = alloc_stack $S<Double, Double>            // users: %185, %184, %281
  %20 = alloc_stack $S<Double, Double>            // users: %127, %126, %280
  %21 = alloc_stack $S<Double, Double>            // users: %106, %129, %132, %279
  %22 = alloc_stack $S<Double, Double>            // users: %95, %187, %190, %278
  %23 = alloc_stack $S<Double, Double>            // users: %84, %241, %244, %277
  %24 = alloc_stack $Optional<Double>.TangentVector // users: %107, %27, %276
  %25 = metatype $@thin Optional<Double>.TangentVector.Type // users: %233, %219, %179, %164, %121, %98, %87, %67, %54, %52, %50, %47, %45, %43, %41, %38, %36, %31, %29, %27
  // function_ref static Optional<A>.TangentVector.zero.getter
  %26 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorV4zeroADyx_GvgZ : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // users: %101, %98, %90, %87, %77, %54, %52, %50, %47, %45, %43, %41, %38, %36, %31, %29, %27
  %27 = apply %26<Double>(%24, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %28 = alloc_stack $Optional<Double>.TangentVector // users: %96, %29, %275
  %29 = apply %26<Double>(%28, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %30 = alloc_stack $Optional<Double>.TangentVector // users: %85, %31, %274
  %31 = apply %26<Double>(%30, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %32 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:7:13 (scope #12)" // users: %74, %59, %273, %60
  %33 = integer_literal $Builtin.Int64, 0         // user: %34
  %34 = builtin "sitofp_Int64_FPIEEE64"(%33 : $Builtin.Int64) : $Builtin.FPIEEE64 // users: %158, %213, %57
  %35 = alloc_stack [lexical] $Optional<Double>.TangentVector // users: %36, %272
  %36 = apply %26<Double>(%35, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %37 = alloc_stack $Optional<Double>.TangentVector // users: %38, %271
  %38 = apply %26<Double>(%37, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %39 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:5:13 (scope #4)" // users: %201, %270, %210
  %40 = alloc_stack [lexical] $Optional<Double>.TangentVector // users: %41, %269
  %41 = apply %26<Double>(%40, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %42 = alloc_stack $Optional<Double>.TangentVector // users: %43, %268
  %43 = apply %26<Double>(%42, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %44 = alloc_stack $Optional<Double>.TangentVector // users: %45, %267
  %45 = apply %26<Double>(%44, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %46 = alloc_stack $Optional<Double>.TangentVector // users: %47, %266
  %47 = apply %26<Double>(%46, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %48 = alloc_stack $Double, var, name "derivative of 'r' in scope at /Users/asl/Projects/swift-project/build/Ninja-RelWithDebInfoAssert/swift-macosx-arm64/bin/uncheckedBitCast/Tests/ReproducerTests/T.swift:6:13 (scope #8)" // users: %168, %143, %265, %155
  %49 = alloc_stack [lexical] $Optional<Double>.TangentVector // users: %50, %264
  %50 = apply %26<Double>(%49, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %51 = alloc_stack $Optional<Double>.TangentVector // users: %52, %263
  %52 = apply %26<Double>(%51, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %53 = alloc_stack $Optional<Double>.TangentVector // users: %54, %262
  %54 = apply %26<Double>(%53, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %55 = struct_extract %0 : $Double, #Double._value // user: %57
  debug_value %0 : $Double                        // id: %56
  %57 = builtin "fadd_FPIEEE64"(%34 : $Builtin.FPIEEE64, %55 : $Builtin.FPIEEE64) : $Builtin.FPIEEE64 // user: %58
  %58 = struct $Double (%57 : $Builtin.FPIEEE64)  // user: %59
  store %58 to %32 : $*Double                     // id: %59
  %60 = apply %2(%32) : $@callee_guaranteed (@inout Double) -> Double // user: %64
  strong_release %2 : $@callee_guaranteed (@inout Double) -> Double // id: %61
  %62 = alloc_stack $Optional<Double>.TangentVector // users: %69, %70, %67
  %63 = alloc_stack $Optional<Double>             // users: %65, %68, %67
  %64 = enum $Optional<Double>, #Optional.some!enumelt, %60 : $Double // user: %65
  store %64 to %63 : $*Optional<Double>           // id: %65
  // function_ref Optional<A>.TangentVector.init(_:)
  %66 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorVyADyx_GACQzSgcfC : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // users: %251, %219, %197, %164, %139, %67
  %67 = apply %66<Double>(%62, %63, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %63 : $*Optional<Double>          // id: %68
  %69 = load %62 : $*Optional<Double>.TangentVector // users: %114, %119
  dealloc_stack %62 : $*Optional<Double>.TangentVector // id: %70
  %71 = metatype $@thin F<Double, Double>.TangentVector.Type // users: %154, %73
  // function_ref static F<>.TangentVector.zero.getter
  %72 = function_ref @$s15InternalPackage1FVAA07AnotheraB01ZR_13TangentVector16_Differentiation14DifferentiablePQy_Rs_rlEAFV4zeroAKyxq__GvgZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E, τ_0_1 : Z, τ_0_1 == τ_0_1.TangentVector> (@thin F<τ_0_0, τ_0_1>.TangentVector.Type) -> F<τ_0_0, τ_0_1>.TangentVector // user: %73
  %73 = apply %72<Double, Double>(%71) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E, τ_0_1 : Z, τ_0_1 == τ_0_1.TangentVector> (@thin F<τ_0_0, τ_0_1>.TangentVector.Type) -> F<τ_0_0, τ_0_1>.TangentVector
  %74 = load %32 : $*Double                       // user: %143
  %75 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %78, %77, %81
  %76 = metatype $@thin Optional<S<Double, Double>>.TangentVector.Type // users: %251, %197, %139, %101, %90, %77
  %77 = apply %26<S<Double, Double>>(%75, %76) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %78 = struct_element_addr %75 : $*Optional<S<Double, Double>>.TangentVector, #Optional.TangentVector.value // user: %79
  %79 = load %78 : $*Optional<S<Double, Double>>  // user: %80
  release_value %79 : $Optional<S<Double, Double>> // id: %80
  dealloc_stack %75 : $*Optional<S<Double, Double>>.TangentVector // id: %81
  %82 = metatype $@thin S<Double, Double>.Type    // users: %106, %95, %84
  // function_ref static S<>.zero.getter
  %83 = function_ref @$s15InternalPackage1SVAAs18AdditiveArithmeticR_rlE4zeroACyxq_GvgZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E, τ_0_1 : AdditiveArithmetic> (@thin S<τ_0_0, τ_0_1>.Type) -> @out S<τ_0_0, τ_0_1> // users: %106, %95, %84
  %84 = apply %83<Double, Double>(%23, %82) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E, τ_0_1 : AdditiveArithmetic> (@thin S<τ_0_0, τ_0_1>.Type) -> @out S<τ_0_0, τ_0_1>
  %85 = load %30 : $*Optional<Double>.TangentVector // user: %230
  %86 = alloc_stack $Optional<Double>.TangentVector // users: %87, %88
  %87 = apply %26<Double>(%86, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %86 : $*Optional<Double>.TangentVector // id: %88
  %89 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %91, %90, %94
  %90 = apply %26<S<Double, Double>>(%89, %76) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %91 = struct_element_addr %89 : $*Optional<S<Double, Double>>.TangentVector, #Optional.TangentVector.value // user: %92
  %92 = load %91 : $*Optional<S<Double, Double>>  // user: %93
  release_value %92 : $Optional<S<Double, Double>> // id: %93
  dealloc_stack %89 : $*Optional<S<Double, Double>>.TangentVector // id: %94
  %95 = apply %83<Double, Double>(%22, %82) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E, τ_0_1 : AdditiveArithmetic> (@thin S<τ_0_0, τ_0_1>.Type) -> @out S<τ_0_0, τ_0_1>
  %96 = load %28 : $*Optional<Double>.TangentVector // user: %176
  %97 = alloc_stack $Optional<Double>.TangentVector // users: %98, %99
  %98 = apply %26<Double>(%97, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %97 : $*Optional<Double>.TangentVector // id: %99
  %100 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %102, %101, %105
  %101 = apply %26<S<Double, Double>>(%100, %76) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %102 = struct_element_addr %100 : $*Optional<S<Double, Double>>.TangentVector, #Optional.TangentVector.value // user: %103
  %103 = load %102 : $*Optional<S<Double, Double>> // user: %104
  release_value %103 : $Optional<S<Double, Double>> // id: %104
  dealloc_stack %100 : $*Optional<S<Double, Double>>.TangentVector // id: %105
  %106 = apply %83<Double, Double>(%21, %82) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E, τ_0_1 : AdditiveArithmetic> (@thin S<τ_0_0, τ_0_1>.Type) -> @out S<τ_0_0, τ_0_1>
  %107 = load %24 : $*Optional<Double>.TangentVector // user: %117
  copy_addr [take] %4 to [init] %3 : $*_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 // id: %108
  %109 = unchecked_take_enum_data_addr %3 : $*_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0, #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0.bb10!enumelt
  %110 = unchecked_enum_data %17 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0, #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0.bb10!enumelt // user: %111
  %111 = unchecked_bitwise_cast %110 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) to $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>) // users: %112, %113
  %112 = tuple_extract %111 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>), 0 // user: %144
  %113 = tuple_extract %111 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>), 1 // users: %126, %128
  debug_value %69 : $Optional<Double>.TangentVector // id: %114
  %115 = alloc_stack $Optional<Double>.TangentVector // users: %122, %125, %121
  %116 = alloc_stack $Optional<Double>.TangentVector // users: %124, %121, %117
  store %107 to %116 : $*Optional<Double>.TangentVector // id: %117
  %118 = alloc_stack $Optional<Double>.TangentVector // users: %123, %121, %119
  store %69 to %118 : $*Optional<Double>.TangentVector // id: %119
  // function_ref static Optional<A>.TangentVector.+ infix(_:_:)
  %120 = function_ref @$sSq16_DifferentiationAA14DifferentiableRzlE13TangentVectorV1poiyADyx_GAF_AFtFZ : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in_guaranteed Optional<τ_0_0>.TangentVector, @in_guaranteed Optional<τ_0_0>.TangentVector, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector // users: %233, %179, %121
  %121 = apply %120<Double>(%115, %116, %118, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in_guaranteed Optional<τ_0_0>.TangentVector, @in_guaranteed Optional<τ_0_0>.TangentVector, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %122 = load %115 : $*Optional<Double>.TangentVector // user: %126
  dealloc_stack %118 : $*Optional<Double>.TangentVector // id: %123
  dealloc_stack %116 : $*Optional<Double>.TangentVector // id: %124
  dealloc_stack %115 : $*Optional<Double>.TangentVector // id: %125
  %126 = apply %113(%20, %122) : $@callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>
  %127 = load %20 : $*S<Double, Double>           // user: %137
  strong_release %113 : $@callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double> // id: %128
  %129 = struct_element_addr %21 : $*S<Double, Double>, #S.d // user: %130
  copy_addr [take] %129 to [init] %8 : $*Array<Optional<Double>> // id: %130
  release_value_addr %8 : $*Array<Optional<Double>> // id: %131
  %132 = struct_element_addr %21 : $*S<Double, Double>, #S.n // user: %133
  copy_addr [take] %132 to [init] %9 : $*Optional<String> // id: %133
  release_value_addr %9 : $*Optional<String>      // id: %134
  %135 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %141, %142, %139
  %136 = alloc_stack $Optional<S<Double, Double>> // users: %138, %140, %139
  %137 = enum $Optional<S<Double, Double>>, #Optional.some!enumelt, %127 : $S<Double, Double> // user: %138
  store %137 to %136 : $*Optional<S<Double, Double>> // id: %138
  %139 = apply %66<S<Double, Double>>(%135, %136, %76) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %136 : $*Optional<S<Double, Double>> // id: %140
  copy_addr [take] %135 to [init] %5 : $*Optional<S<Double, Double>>.TangentVector // id: %141
  dealloc_stack %135 : $*Optional<S<Double, Double>>.TangentVector // id: %142
  store %74 to %48 : $*Double                     // id: %143
  %144 = unchecked_enum_data %112 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0.bb8!enumelt // user: %145
  %145 = unchecked_bitwise_cast %144 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) to $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) // users: %146, %147, %148
  %146 = tuple_extract %145 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector), 0 // user: %169
  %147 = tuple_extract %145 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector), 1 // users: %156, %155
  %148 = tuple_extract %145 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector), 2 // users: %149, %151
  %149 = apply %148(%5) : $@callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector
  release_value_addr %5 : $*Optional<S<Double, Double>>.TangentVector // id: %150
  strong_release %148 : $@callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector // id: %151
  %152 = struct $F<Double, Double>.TangentVector () // users: %293, %261, %154, %154
  // function_ref static F<>.TangentVector.+ infix(_:_:)
  %153 = function_ref @$s15InternalPackage1FVAA07AnotheraB01ZR_13TangentVector16_Differentiation14DifferentiablePQy_Rs_rlEAFV1poiyAKyxq__GAM_AMtFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E, τ_0_1 : Z, τ_0_1 == τ_0_1.TangentVector> (F<τ_0_0, τ_0_1>.TangentVector, F<τ_0_0, τ_0_1>.TangentVector, @thin F<τ_0_0, τ_0_1>.TangentVector.Type) -> F<τ_0_0, τ_0_1>.TangentVector // user: %154
  %154 = apply %153<Double, Double>(%152, %152, %71) : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : E, τ_0_1 : Z, τ_0_1 == τ_0_1.TangentVector> (F<τ_0_0, τ_0_1>.TangentVector, F<τ_0_0, τ_0_1>.TangentVector, @thin F<τ_0_0, τ_0_1>.TangentVector.Type) -> F<τ_0_0, τ_0_1>.TangentVector
  %155 = apply %147(%48) : $@callee_guaranteed (@inout Double) -> Double // user: %157
  strong_release %147 : $@callee_guaranteed (@inout Double) -> Double // id: %156
  %157 = struct_extract %155 : $Double, #Double._value // user: %158
  %158 = builtin "fadd_FPIEEE64"(%157 : $Builtin.FPIEEE64, %34 : $Builtin.FPIEEE64) : $Builtin.FPIEEE64 // user: %159
  %159 = struct $Double (%158 : $Builtin.FPIEEE64) // user: %162
  %160 = alloc_stack $Optional<Double>.TangentVector // users: %166, %167, %164
  %161 = alloc_stack $Optional<Double>            // users: %163, %165, %164
  %162 = enum $Optional<Double>, #Optional.some!enumelt, %159 : $Double // user: %163
  store %162 to %161 : $*Optional<Double>         // id: %163
  %164 = apply %66<Double>(%160, %161, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %161 : $*Optional<Double>         // id: %165
  %166 = load %160 : $*Optional<Double>.TangentVector // users: %173, %178
  dealloc_stack %160 : $*Optional<Double>.TangentVector // id: %167
  %168 = load %48 : $*Double                      // user: %201
  %169 = unchecked_enum_data %146 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0, #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb8__Pred__src_0_wrt_0.bb6!enumelt // user: %170
  %170 = unchecked_bitwise_cast %169 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) to $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>) // users: %171, %172
  %171 = tuple_extract %170 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>), 0 // user: %202
  %172 = tuple_extract %170 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>), 1 // users: %184, %186
  debug_value %166 : $Optional<Double>.TangentVector // id: %173
  %174 = alloc_stack $Optional<Double>.TangentVector // users: %180, %183, %179
  %175 = alloc_stack $Optional<Double>.TangentVector // users: %182, %179, %176
  store %96 to %175 : $*Optional<Double>.TangentVector // id: %176
  %177 = alloc_stack $Optional<Double>.TangentVector // users: %181, %179, %178
  store %166 to %177 : $*Optional<Double>.TangentVector // id: %178
  %179 = apply %120<Double>(%174, %175, %177, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in_guaranteed Optional<τ_0_0>.TangentVector, @in_guaranteed Optional<τ_0_0>.TangentVector, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %180 = load %174 : $*Optional<Double>.TangentVector // user: %184
  dealloc_stack %177 : $*Optional<Double>.TangentVector // id: %181
  dealloc_stack %175 : $*Optional<Double>.TangentVector // id: %182
  dealloc_stack %174 : $*Optional<Double>.TangentVector // id: %183
  %184 = apply %172(%19, %180) : $@callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>
  %185 = load %19 : $*S<Double, Double>           // user: %195
  strong_release %172 : $@callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double> // id: %186
  %187 = struct_element_addr %22 : $*S<Double, Double>, #S.d // user: %188
  copy_addr [take] %187 to [init] %10 : $*Array<Optional<Double>> // id: %188
  release_value_addr %10 : $*Array<Optional<Double>> // id: %189
  %190 = struct_element_addr %22 : $*S<Double, Double>, #S.n // user: %191
  copy_addr [take] %190 to [init] %11 : $*Optional<String> // id: %191
  release_value_addr %11 : $*Optional<String>     // id: %192
  %193 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %199, %200, %197
  %194 = alloc_stack $Optional<S<Double, Double>> // users: %196, %198, %197
  %195 = enum $Optional<S<Double, Double>>, #Optional.some!enumelt, %185 : $S<Double, Double> // user: %196
  store %195 to %194 : $*Optional<S<Double, Double>> // id: %196
  %197 = apply %66<S<Double, Double>>(%193, %194, %76) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %194 : $*Optional<S<Double, Double>> // id: %198
  copy_addr [take] %193 to [init] %6 : $*Optional<S<Double, Double>>.TangentVector // id: %199
  dealloc_stack %193 : $*Optional<S<Double, Double>>.TangentVector // id: %200
  store %168 to %39 : $*Double                    // id: %201
  %202 = unchecked_enum_data %171 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0, #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb6__Pred__src_0_wrt_0.bb4!enumelt // user: %203
  %203 = unchecked_bitwise_cast %202 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) to $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) // users: %204, %205, %206
  %204 = tuple_extract %203 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector), 0 // user: %223
  %205 = tuple_extract %203 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector), 1 // users: %211, %210
  %206 = tuple_extract %203 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, @callee_guaranteed (@inout Double) -> Double, @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector), 2 // users: %207, %209
  %207 = apply %206(%6) : $@callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector
  release_value_addr %6 : $*Optional<S<Double, Double>>.TangentVector // id: %208
  strong_release %206 : $@callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector // id: %209
  %210 = apply %205(%39) : $@callee_guaranteed (@inout Double) -> Double // user: %212
  strong_release %205 : $@callee_guaranteed (@inout Double) -> Double // id: %211
  %212 = struct_extract %210 : $Double, #Double._value // user: %213
  %213 = builtin "fadd_FPIEEE64"(%212 : $Builtin.FPIEEE64, %34 : $Builtin.FPIEEE64) : $Builtin.FPIEEE64 // user: %214
  %214 = struct $Double (%213 : $Builtin.FPIEEE64) // user: %217
  %215 = alloc_stack $Optional<Double>.TangentVector // users: %221, %222, %219
  %216 = alloc_stack $Optional<Double>            // users: %218, %220, %219
  %217 = enum $Optional<Double>, #Optional.some!enumelt, %214 : $Double // user: %218
  store %217 to %216 : $*Optional<Double>         // id: %218
  %219 = apply %66<Double>(%215, %216, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %216 : $*Optional<Double>         // id: %220
  %221 = load %215 : $*Optional<Double>.TangentVector // users: %227, %232
  dealloc_stack %215 : $*Optional<Double>.TangentVector // id: %222
  %223 = unchecked_enum_data %204 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0, #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb4__Pred__src_0_wrt_0.bb2!enumelt // user: %224
  %224 = unchecked_bitwise_cast %223 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) to $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>) // users: %225, %226
  %225 = tuple_extract %224 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>), 0 // users: %255, %260
  %226 = tuple_extract %224 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>), 1 // users: %238, %240
  debug_value %221 : $Optional<Double>.TangentVector // id: %227
  %228 = alloc_stack $Optional<Double>.TangentVector // users: %234, %237, %233
  %229 = alloc_stack $Optional<Double>.TangentVector // users: %236, %233, %230
  store %85 to %229 : $*Optional<Double>.TangentVector // id: %230
  %231 = alloc_stack $Optional<Double>.TangentVector // users: %235, %233, %232
  store %221 to %231 : $*Optional<Double>.TangentVector // id: %232
  %233 = apply %120<Double>(%228, %229, %231, %25) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in_guaranteed Optional<τ_0_0>.TangentVector, @in_guaranteed Optional<τ_0_0>.TangentVector, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  %234 = load %228 : $*Optional<Double>.TangentVector // user: %238
  dealloc_stack %231 : $*Optional<Double>.TangentVector // id: %235
  dealloc_stack %229 : $*Optional<Double>.TangentVector // id: %236
  dealloc_stack %228 : $*Optional<Double>.TangentVector // id: %237
  %238 = apply %226(%18, %234) : $@callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>
  %239 = load %18 : $*S<Double, Double>           // user: %249
  strong_release %226 : $@callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double> // id: %240
  %241 = struct_element_addr %23 : $*S<Double, Double>, #S.d // user: %242
  copy_addr [take] %241 to [init] %12 : $*Array<Optional<Double>> // id: %242
  release_value_addr %12 : $*Array<Optional<Double>> // id: %243
  %244 = struct_element_addr %23 : $*S<Double, Double>, #S.n // user: %245
  copy_addr [take] %244 to [init] %13 : $*Optional<String> // id: %245
  release_value_addr %13 : $*Optional<String>     // id: %246
  %247 = alloc_stack $Optional<S<Double, Double>>.TangentVector // users: %253, %254, %251
  %248 = alloc_stack $Optional<S<Double, Double>> // users: %250, %252, %251
  %249 = enum $Optional<S<Double, Double>>, #Optional.some!enumelt, %239 : $S<Double, Double> // user: %250
  store %249 to %248 : $*Optional<S<Double, Double>> // id: %250
  %251 = apply %66<S<Double, Double>>(%247, %248, %76) : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@in Optional<τ_0_0.TangentVector>, @thin Optional<τ_0_0>.TangentVector.Type) -> @out Optional<τ_0_0>.TangentVector
  dealloc_stack %248 : $*Optional<S<Double, Double>> // id: %252
  copy_addr [take] %247 to [init] %7 : $*Optional<S<Double, Double>>.TangentVector // id: %253
  dealloc_stack %247 : $*Optional<S<Double, Double>>.TangentVector // id: %254
  %255 = unchecked_enum_data %225 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0, #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0.bb0!enumelt // user: %256
  %256 = unchecked_bitwise_cast %255 : $(_: @callee_guaranteed (@guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) to $(_: @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector) // user: %257
  %257 = tuple_extract %256 : $(_: @callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector), 0 // user: %258
  %258 = apply %257(%7) : $@callee_guaranteed (@in_guaranteed Optional<S<Double, Double>>.TangentVector) -> F<Double, Double>.TangentVector
  release_value_addr %7 : $*Optional<S<Double, Double>>.TangentVector // id: %259
  release_value %225 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb2__Pred__src_0_wrt_0 // id: %260
  debug_value %152 : $F<Double, Double>.TangentVector, let, name "n", argno 1 // id: %261
  dealloc_stack %53 : $*Optional<Double>.TangentVector // id: %262
  dealloc_stack %51 : $*Optional<Double>.TangentVector // id: %263
  dealloc_stack %49 : $*Optional<Double>.TangentVector // id: %264
  dealloc_stack %48 : $*Double                    // id: %265
  dealloc_stack %46 : $*Optional<Double>.TangentVector // id: %266
  dealloc_stack %44 : $*Optional<Double>.TangentVector // id: %267
  dealloc_stack %42 : $*Optional<Double>.TangentVector // id: %268
  dealloc_stack %40 : $*Optional<Double>.TangentVector // id: %269
  dealloc_stack %39 : $*Double                    // id: %270
  dealloc_stack %37 : $*Optional<Double>.TangentVector // id: %271
  dealloc_stack %35 : $*Optional<Double>.TangentVector // id: %272
  dealloc_stack %32 : $*Double                    // id: %273
  dealloc_stack %30 : $*Optional<Double>.TangentVector // id: %274
  dealloc_stack %28 : $*Optional<Double>.TangentVector // id: %275
  dealloc_stack %24 : $*Optional<Double>.TangentVector // id: %276
  dealloc_stack %23 : $*S<Double, Double>         // id: %277
  dealloc_stack %22 : $*S<Double, Double>         // id: %278
  dealloc_stack %21 : $*S<Double, Double>         // id: %279
  dealloc_stack %20 : $*S<Double, Double>         // id: %280
  dealloc_stack %19 : $*S<Double, Double>         // id: %281
  dealloc_stack %18 : $*S<Double, Double>         // id: %282
  dealloc_stack %14 : $*_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 // id: %283
  dealloc_stack %13 : $*Optional<String>          // id: %284
  dealloc_stack %12 : $*Array<Optional<Double>>   // id: %285
  dealloc_stack %11 : $*Optional<String>          // id: %286
  dealloc_stack %10 : $*Array<Optional<Double>>   // id: %287
  dealloc_stack %9 : $*Optional<String>           // id: %288
  dealloc_stack %8 : $*Array<Optional<Double>>    // id: %289
  dealloc_stack %7 : $*Optional<S<Double, Double>>.TangentVector // id: %290
  dealloc_stack %6 : $*Optional<S<Double, Double>>.TangentVector // id: %291
  dealloc_stack %5 : $*Optional<S<Double, Double>>.TangentVector // id: %292
  return %152 : $F<Double, Double>.TangentVector  // id: %293
} // end sil function '$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tFTJpSpSr'

Assertion is triggerred on:

111 = unchecked_bitwise_cast %110 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) to $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @out S<Double, Double>) // users: %112, %113

Original raw SIL is as follows:

// %181                                           // user: %182
bb1(%181 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)): // Preds: bb0
  br bb2(%102 : $F<Double, Double>.TangentVector, %111 : $Optional<S<Double, Double>>.TangentVector, %118 : $S<Double, Double>, %124 : $Optional<Double>.TangentVector, %130 : $Double, %138 : $Optional<S<Double, Double>>.TangentVector, %145 : $S<Double, Double>, %151 : $Optional<Double>.TangentVector, %157 : $Double, %165 : $Optional<S<Double, Double>>.TangentVector, %172 : $S<Double, Double>, %96 : $Optional<Double>.TangentVector, %181 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)) // id: %182

// %183                                           // users: %256, %236
// %184                                           // users: %245, %238
// %185                                           // users: %246, %239
// %186                                           // user: %256
// %187                                           // user: %256
// %188                                           // users: %247, %241
// %189                                           // users: %248, %242
// %190                                           // user: %256
// %191                                           // user: %256
// %192                                           // user: %249
// %193                                           // users: %250, %209
// %194                                           // user: %199
// %195                                           // user: %196
bb2(%183 : $F<Double, Double>.TangentVector, %184 : @owned $Optional<S<Double, Double>>.TangentVector, %185 : @owned $S<Double, Double>, %186 : $Optional<Double>.TangentVector, %187 : $Double, %188 : @owned $Optional<S<Double, Double>>.TangentVector, %189 : @owned $S<Double, Double>, %190 : $Optional<Double>.TangentVector, %191 : $Double, %192 : @owned $Optional<S<Double, Double>>.TangentVector, %193 : @owned $S<Double, Double>, %194 : $Optional<Double>.TangentVector, %195 : @owned $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>)): // Preds: bb1
  (%196, %197) = destructure_tuple %195 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>) // users: %254, %206

After some optimizations we end with:

  %87 = unchecked_enum_data %1 : $_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0, #_AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0.bb10!enumelt // users: %89, %88
  %88 = tuple_extract %87 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>), 0 // user: %117
  %89 = tuple_extract %87 : $(predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, @callee_guaranteed (Optional<Double>.TangentVector) -> @owned S<Double, Double>), 1 // users: %103, %102

where the enum payload is:

enum _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb12__Pred__src_0_wrt_0 {
  case bb10((predecessor: _AD__$s15ReproducerTests1AC5testAyyKF1xL_1nSd15InternalPackage1FVyS2dG_tF_bb10__Pred__src_0_wrt_0, (Optional<Double>.TangentVector) -> S<Double, Double>))
}

@asl
Copy link
Contributor

asl commented Mar 15, 2024

The test started to fail after 5e2144b

Tagging @aschwaighofer

@asl
Copy link
Contributor

asl commented Mar 15, 2024

Current workaround is to use -disable-large-loadable-types-reg2mem option. @fibrechannelscsi will you please check if it fixes the original unreduced code issue?

@asl asl changed the title [AutoDiff] unchecked_bitwise_cast error. [LoadableByAddr] unchecked_bitwise_cast error. Mar 15, 2024
@fibrechannelscsi
Copy link
Contributor Author

Yes, if I run the above reduced example, or the original package, with
/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-01-30-a.xctoolchain/usr/bin/swift test -c release -Xswiftc -disable-large-loadable-types-reg2mem
then the compilation succeeds. That said, there are a few dozen instances of a warning message that says:
warning: save unknown driver flag -disable-large-loadable-types-reg2mem as additional swift-frontend flag.
Perhaps I'm not passing in the flag in an optimal manner.

As a side issue, I'm running into a runtime segfault with the original, unreduced package, now that the compilation succeeds. I'll investigate and post a separate issue if needed.

Thanks for taking a look!

asl added a commit that referenced this issue Mar 27, 2024
@asl asl added the IRGen LLVM IR generation label Mar 27, 2024
asl added a commit that referenced this issue Mar 27, 2024
aschwaighofer pushed a commit to aschwaighofer/swift that referenced this issue Sep 4, 2024
aschwaighofer pushed a commit to aschwaighofer/swift that referenced this issue Sep 13, 2024
clackary pushed a commit to clackary/swift that referenced this issue Oct 18, 2024
clackary pushed a commit to clackary/swift that referenced this issue Nov 5, 2024
Fixes swiftlang#71744

(cherry picked from commit a63078f)
(cherry picked from commit 2250314)
clackary pushed a commit to clackary/swift that referenced this issue Nov 5, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
AutoDiff bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler itself crash Bug: A crash, i.e., an abnormal termination of software IRGen LLVM IR generation multiple modules Flag: An issue whose reproduction requires multiple modules optimized only Flag: An issue whose reproduction requires optimized compilation SILOptimizer Area → compiler: SIL optimization passes swift 6.0
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants