Skip to content

[SR-13250] AutoDiff test failure: test/AutoDiff/validation-test/differentiable_protocol_requirements.swift #55690

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

Open
dan-zheng opened this issue Jul 18, 2020 · 6 comments
Labels
AutoDiff compiler The Swift compiler itself crash Bug: A crash, i.e., an abnormal termination of software SILOptimizer Area → compiler: SIL optimization passes swift 6.0

Comments

@dan-zheng
Copy link
Contributor

Previous ID SR-13250
Radar rdar://problem/74094125
Original Reporter @dan-zheng
Type Task
Additional Detail from JIRA
Votes 0
Component/s Compiler
Labels Task, AutoDiff
Assignee None
Priority Medium

md5: 24a514bc4a5ba11871c72f5b0d01ec85

Issue Description:

Test failure reported here: #32948 (comment)

07:40:40 ******************** TEST 'Swift(linux-x86_64) :: AutoDiff/validation-test/differentiable_protocol_requirements.swift' FAILED ********************
07:40:40 Script:
07:40:40 --
07:40:40 : 'RUN: at line 1';   rm -rf "/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/test-linux-x86_64/AutoDiff/validation-test/Output/differentiable_protocol_requirements.swift.tmp" && mkdir -p "/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/test-linux-x86_64/AutoDiff/validation-test/Output/differentiable_protocol_requirements.swift.tmp" && /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swiftc -target x86_64-unknown-linux-gnu -toolchain-stdlib-rpath  -module-cache-path '/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/swift-test-results/x86_64-unknown-linux-gnu/clang-module-cache' -swift-version 4  -Xfrontend -ignore-module-source-info -O -module-cache-path '/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/swift-test-results/x86_64-unknown-linux-gnu/clang-module-cache' /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/swift/test/AutoDiff/validation-test/differentiable_protocol_requirements.swift -o /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/test-linux-x86_64/AutoDiff/validation-test/Output/differentiable_protocol_requirements.swift.tmp/a.out -module-name main  && echo /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/test-linux-x86_64/AutoDiff/validation-test/Output/differentiable_protocol_requirements.swift.tmp/a.out && /usr/bin/env DYLD_LIBRARY_PATH='/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/lib/swift/linux/x86_64' LD_LIBRARY_PATH='/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/lib/swift/linux/x86_64:/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/libdispatch-linux-x86_64' SIMCTL_CHILD_DYLD_LIBRARY_PATH='/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/lib/swift/linux/x86_64'  /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/test-linux-x86_64/AutoDiff/validation-test/Output/differentiable_protocol_requirements.swift.tmp/a.out
07:40:40 --
07:40:40 Exit Code: 254
07:40:40 
07:40:40 Command Output (stderr):
07:40:40 --
07:40:40 swift-frontend: /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/swift/lib/SIL/IR/SILInstructions.cpp:2436: static swift::ConvertFunctionInst *swift::ConvertFunctionInst::create(swift::SILDebugLocation, swift::SILValue, swift::SILType, swift::SILFunction &, swift::SILOpenedArchetypesState &, bool): Assertion `opTI->isABICompatibleWith(resTI, F).isCompatible() && "Can not convert in between ABI incompatible function types"' failed.
07:40:40 Stack dump:
07:40:40 0. Program arguments: /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend -frontend -c -primary-file /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/swift/test/AutoDiff/validation-test/differentiable_protocol_requirements.swift -target x86_64-unknown-linux-gnu -disable-objc-interop -module-cache-path /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/swift-test-results/x86_64-unknown-linux-gnu/clang-module-cache -swift-version 4 -O -ignore-module-source-info -module-name main -o /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/tmp/differentiable_protocol_requirements-b9935d.o 
07:40:40 1. Swift version 5.3-dev (LLVM e3586932cc1c511, Swift 71f6797c8fc2c27)
07:40:40 2. While evaluating request ExecuteSILPipelineRequest(Run pipelines { PrepareOptimizationPasses, EarlyModulePasses, HighLevel,Function+EarlyLoopOpt, HighLevel,Module+StackPromote, Serialize, MidLevel,Function, ClosureSpecialize, LowLevel,Function, LateLoopOpt, SIL Debug Info Generator } on SIL for main.main)
07:40:40 3. While running pass #​17491 SILFunctionTransform "Devirtualizer" on SILFunction "@$s0131AD__$s4main11derivatives2at2in23DifferentiationUnittest7TrackedVySfG_A3HtAH_xmtAA12FunctionsOfXRzlFA2HcfU___vjp_src_0_wrt_0_4main12mnO04main04TestmN1XV_Tg5".
07:40:40  for expression at [/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/swift/test/AutoDiff/validation-test/differentiable_protocol_requirements.swift:104:30 - line:104:47] RangeText="{ x in F(x: x).x "
07:40:40  #​0 0x000000000573a7f4 PrintStackTraceSignalHandler(void*) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x573a7f4)
07:40:40  #​1 0x00000000057382f0 llvm::sys::RunSignalHandlers() (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x57382f0)
07:40:40  #​2 0x000000000573aaea SignalHandler(int) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x573aaea)
07:40:40  #​3 0x00007ff57e877390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
07:40:40  #​4 0x00007ff57d1dc428 raise (/lib/x86_64-linux-gnu/libc.so.6+0x35428)
07:40:40  #​5 0x00007ff57d1de02a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a)
07:40:40  #​6 0x00007ff57d1d4bd7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dbd7)
07:40:40  #​7 0x00007ff57d1d4c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
07:40:40  #​8 0x0000000001144967 swift::ConvertFunctionInst::create(swift::SILDebugLocation, swift::SILValue, swift::SILType, swift::SILFunction&, swift::SILOpenedArchetypesState&, bool) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x1144967)
07:40:40  #​9 0x0000000000ca0542 swift::castValueToABICompatibleType(swift::SILBuilder*, swift::SILLocation, swift::SILValue, swift::SILType, swift::SILType) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xca0542)
07:40:40 #&#8203;10 0x0000000000c80b41 replaceApplySite(swift::SILBuilder&, swift::SILLocation, swift::ApplySite, swift::SILValue, swift::SubstitutionMap, llvm::ArrayRef<swift::SILValue>, swift::SILFunctionConventions, llvm::ArrayRef<swift::SILValue>) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xc80b41)
07:40:40 #&#8203;11 0x0000000000c819b9 swift::tryDevirtualizeWitnessMethod(swift::ApplySite, swift::OptRemark::Emitter*) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xc819b9)
07:40:40 #&#8203;12 0x0000000000c820dd swift::tryDevirtualizeApply(swift::ApplySite, swift::ClassHierarchyAnalysis*, swift::OptRemark::Emitter*) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xc820dd)
07:40:40 #&#8203;13 0x0000000000b81ac2 (anonymous namespace)::Devirtualizer::run() (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xb81ac2)
07:40:40 #&#8203;14 0x0000000000abb564 swift::SILPassManager::runPassOnFunction(unsigned int, swift::SILFunction*) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xabb564)
07:40:40 #&#8203;15 0x0000000000abc3fb swift::SILPassManager::runFunctionPasses(unsigned int, unsigned int) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xabc3fb)
07:40:40 #&#8203;16 0x0000000000abf4ee swift::SILPassManager::execute() (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xabf4ee)
07:40:40 #&#8203;17 0x0000000000ab9788 swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xab9788)
07:40:40 #&#8203;18 0x0000000000ab974c swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xab974c)
07:40:40 #&#8203;19 0x0000000000ad593b swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xad593b)
07:40:40 #&#8203;20 0x0000000000ac4641 llvm::Expected<swift::ExecuteSILPipelineRequest::OutputType> swift::Evaluator::getResultUncached<swift::ExecuteSILPipelineRequest>(swift::ExecuteSILPipelineRequest const&) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xac4641)
07:40:40 #&#8203;21 0x0000000000ab9955 swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xab9955)
07:40:40 #&#8203;22 0x0000000000ac7588 swift::runSILOptimizationPasses(swift::SILModule&) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0xac7588)
07:40:40 #&#8203;23 0x00000000006838db swift::CompilerInstance::performSILProcessing(swift::SILModule*) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x6838db)
07:40:40 #&#8203;24 0x000000000050e6ef performCompileStepsPostSILGen(swift::CompilerInstance&, std::unique_ptr<swift::SILModule, std::default_delete<swift::SILModule> >, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x50e6ef)
07:40:40 #&#8203;25 0x00000000004ffd5d swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x4ffd5d)
07:40:40 #&#8203;26 0x000000000047cf9b main (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x47cf9b)
07:40:40 #&#8203;27 0x00007ff57d1c7830 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x20830)
07:40:40 #&#8203;28 0x000000000047ca59 _start (/home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/build/buildbot_linux/swift-linux-x86_64/bin/swift-frontend+0x47ca59)
07:40:40 
<unknown>:0: error: unable to execute command: Aborted
07:40:40 <unknown>:0: error: compile command failed due to signal 6 (use -v to see invocation)
07:40:40 
07:40:40 --
07:40:40 
07:40:40 ********************
@rxwei
Copy link
Contributor

rxwei commented Feb 8, 2021

@swift-ci create

@swift-ci swift-ci transferred this issue from apple/swift-issues Apr 25, 2022
@kovdan01
Copy link
Contributor

kovdan01 commented Dec 27, 2024

A minimized reproducer based on test/AutoDiff/validation-test/differentiable_protocol_requirements.swift:

import DifferentiationUnittest

protocol FunctionsOfX: Differentiable {
  @differentiable(reverse)
  init(x: Tracked<Float>)
  @differentiable(reverse)
  var x: Tracked<Float> { get }
}

struct TestFunctionsOfX: FunctionsOfX {
  @differentiable(reverse)
  init(x: Tracked<Float>) { self.x = x }
  var x: Tracked<Float>
}

// This causes a crash
func derivatives<F: FunctionsOfX>(at x: Tracked<Float>, of: F.Type)
  -> Tracked<Float> { return gradient(at: x) { x in F(x: x).x } }
derivatives(at: 2.0, of: TestFunctionsOfX.self)

// This compiles OK
let x = Tracked<Float>(42)
gradient(at: x) { x in TestFunctionsOfX(x: x).x }

Note that it is crucial to have Tracked<Float>, with just Float the code compiles normally.

Tagging @asl

@asl
Copy link
Contributor

asl commented Dec 27, 2024

Only reproduced with -O, the assertion is

Assertion failed: ((!F || opTI->isABICompatibleWith(resTI, *F).isCompatible()) && "Can not convert in between ABI incompatible function types"), function create, file SILInstructions.cpp, line 2817.

Happens in tryDevirtualizeApply:

 for expression at [tracked.swift:18:46 - line:18:63] RangeText="{ x in F(x: x).x "
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  swift-frontend           0x0000000109fd5cdc llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x0000000109fd442c llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x0000000109fd6320 SignalHandler(int) + 292
3  libsystem_platform.dylib 0x000000019cff0184 _sigtramp + 56
4  libsystem_pthread.dylib  0x000000019cfbaf70 pthread_kill + 288
5  libsystem_c.dylib        0x000000019cec7908 abort + 128
6  libsystem_c.dylib        0x000000019cec6c1c err + 0
7  swift-frontend           0x000000010a0b7f70 swift::ConvertFunctionInst::create(swift::SILDebugLocation, swift::SILValue, swift::SILType, swift::SILModule&, swift::SILFunction*, bool, swift::ValueOwnershipKind) (.cold.5) + 0
8  swift-frontend           0x0000000105ba2b50 swift::ConvertFunctionInst::onlyConvertsSubstitutions() const + 0
9  swift-frontend           0x00000001055d0d50 swift::SILBuilder::createConvertFunction(swift::SILLocation, swift::SILValue, swift::SILType, bool) + 132
10 swift-frontend           0x00000001059577a0 swift::castValueToABICompatibleType(swift::SILBuilder*, swift::SILPassManager*, swift::SILLocation, swift::SILValue, swift::SILType, swift::SILType, llvm::ArrayRef<swift::SILInstruction*>) + 1120
11 swift-frontend           0x0000000105902d64 replaceApplySite(swift::SILBuilder&, swift::SILPassManager*, swift::SILLocation, swift::ApplySite, swift::SILValue, swift::SubstitutionMap, llvm::ArrayRef<swift::SILValue>, swift::SILFunctionConventions, llvm::ArrayRef<swift::SILValue>) + 288
12 swift-frontend           0x00000001059040e8 swift::tryDevirtualizeWitnessMethod(swift::SILPassManager*, swift::ApplySite, swift::OptRemark::Emitter*, bool) + 1644
13 swift-frontend           0x000000010590498c swift::tryDevirtualizeApply(swift::SILPassManager*, swift::ApplySite, swift::ClassHierarchyAnalysis*, swift::OptRemark::Emitter*, bool) + 232

@asl asl added SILOptimizer Area → compiler: SIL optimization passes crash Bug: A crash, i.e., an abnormal termination of software and removed compiler The Swift compiler itself task labels Dec 27, 2024
@asl
Copy link
Contributor

asl commented Dec 27, 2024

So, devirtualizer wants to convert @callee_guaranteed (@in Tracked<Float>, @thick TestFunctionsOfX.Type) -> (@out TestFunctionsOfX, @owned @callee_guaranteed @substituted <τ_0_0> (@in_guaranteed Tracked<Float>) -> @out τ_0_0 for <TestFunctionsOfX.TangentVector> to @callee_guaranteed (@in Tracked<Float>, @thick TestFunctionsOfX.Type) -> (@out TestFunctionsOfX, @owned @callee_guaranteed @substituted <τ_0_0> (@in Tracked<Float>) -> @out τ_0_0 for <TestFunctionsOfX.TangentVector> hence the assertion.

The original instruction is

  %12 = partial_apply [callee_guaranteed] %9<TestFunctionsOfX>() : $@convention(witness_method: FunctionsOfX) <τ_0_0 where τ_0_0 : FunctionsOfX> (@in Tracked<Float>, @thick τ_0_0.Type) -> (@out τ_0_0, @owned @callee_guaranteed @substituted <τ_0_0> (@in Tracked<Float>) -> @out τ_0_0 for <τ_0_0.TangentVector>) // user: %15

The devirtualized one:

  %11 = partial_apply [callee_guaranteed] %10() : $@convention(witness_method: FunctionsOfX) (@in Tracked<Float>, @thick TestFunctionsOfX.Type) -> (@out TestFunctionsOfX, @owned @callee_guaranteed @substituted <τ_0_0> (@in_guaranteed Tracked<Float>) -> @out τ_0_0 for <TestFunctionsOfX.TangentVector>)

And the thunk we're calling is

sil private [transparent] [thunk] [ossa] @AD__$s7tracked16TestFunctionsOfXVAA0cD1XA2aDP1xx23DifferentiationUnittest7TrackedVySfG_tcfCTW_jvp_SU : $@convention(witness_method: FunctionsOfX) (@in Tracked<Float>, @thick TestFunctionsOfX.Type) -> (@out TestFunctionsOfX, @owned @callee_guaranteed @substituted <τ_0_0> (@in_guaranteed Tracked<Float>) -> @out τ_0_0 for <TestFunctionsOfX.TangentVector>) {

(note the @in vs @in_guaranteed difference).

Here is the original code in

  %9 = witness_method $τ_0_0, #FunctionsOfX.init!allocator.jvp.SU.<Self where Self : FunctionsOfX> : <Self where Self : FunctionsOfX> (Self.Type) -> (Tracked<Float>) -> Self : $@convention(witness_method: FunctionsOfX) <τ_0_0 where τ_0_0 : FunctionsOfX> (@in Tracked<Float>, @thick τ_0_0.Type) -> (@out τ_0_0, @owned @callee_guaranteed @substituted <τ_0_0> (@in Tracked<Float>) -> @out τ_0_0 for <τ_0_0.TangentVector>) // user: %10
  %10 = partial_apply [callee_guaranteed] %9<τ_0_0>() : $@convention(witness_method: FunctionsOfX) <τ_0_0 where τ_0_0 : FunctionsOfX> (@in Tracked<Float>, @thick τ_0_0.Type) -> (@out τ_0_0, @owned @callee_guaranteed @substituted <τ_0_0> (@in Tracked<Float>) -> @out τ_0_0 for <τ_0_0.TangentVector>) // user: %13

Here is the part of witness table:

sil_witness_table hidden TestFunctionsOfX: FunctionsOfX module tracked {
  base_protocol Differentiable: TestFunctionsOfX: Differentiable module tracked
  method #FunctionsOfX.init!allocator: <Self where Self : FunctionsOfX> (Self.Type) -> (Tracked<Float>) -> Self : @$s7tracked16TestFunctionsOfXVAA0cD1XA2aDP1xx23DifferentiationUnittest7TrackedVySfG_tcfCTW    // protocol witness for FunctionsOfX.init(x:) in conformance TestFunctionsOfX
  method #FunctionsOfX.init!allocator.jvp.SU.<Self where Self : FunctionsOfX>: <Self where Self : FunctionsOfX> (Self.Type) -> (Tracked<Float>) -> Self : @AD__$s7tracked16TestFunctionsOfXVAA0cD1XA2aDP1xx23DifferentiationUnittest7TrackedVySfG_tcfCTW_jvp_SU // AD__$s7tracked16TestFunctionsOfXVAA0cD1XA2aDP1xx23DifferentiationUnittest7TrackedVySfG_tcfCTW_jvp_SU

And we are having thunk with @in vs @in_guaranteed difference:

sil private [transparent] [thunk] @AD__$s7tracked16TestFunctionsOfXVAA0cD1XA2aDP1xx23DifferentiationUnittest7TrackedVySfG_tcfCTW_jvp_SU : $@convention(witness_method: FunctionsOfX) (@in Tracked<Float>, @thick TestFunctionsOfX.Type) -> (@out TestFunctionsOfX, @owned @callee_guaranteed @substituted <τ_0_0> (@in_guaranteed Tracked<Float>) -> @out τ_0_0 for <TestFunctionsOfX.TangentVector>) {

@asl
Copy link
Contributor

asl commented Dec 27, 2024

Tagging @JaapWijnen

@AnthonyLatsis AnthonyLatsis added compiler The Swift compiler itself swift 6.0 labels Dec 30, 2024
@kovdan01
Copy link
Contributor

Some additional context:

The function type of witness table entry has @in_guaranteed for its argument. This convention is applied at SILGenModule::emitProtocolWitness->auto witnessSILFnType = getNativeSILFunctionType(/*...*/). We call getSILFunctionTypeForConventions(DefaultConventions(NormalParameterConvention::Guaranteed)) there, that's the reason why we have guaranteed (DefaultConvention::getIndirectParameter() == ParameterConvention::Indirect_In_Guaranteed).

On the other hand, in SILFunctionType::getAutoDiffDerivativeFunctionType->getAutoDiffDifferentialType we have diffParams with the same conventions which params from the original function (@in for this particular case).

In getAutoDiffPullbackType (and in VJPCloner) we have several places where Indirect_In_Guaranteed is applied explicitly. Obviously, a dummy attempt to apply In_Guaranteed for entries of diffParams if param.getConvention() == ParameterConvention::Indirect_In leads to tests failing with assertions in verifier (due to attempt of mutating @in_guaranteed). It looks like that pullback cloner is built with @in_guaranteed in mind, and probably the same should be done for forward-mode.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
AutoDiff compiler The Swift compiler itself crash Bug: A crash, i.e., an abnormal termination of software SILOptimizer Area → compiler: SIL optimization passes swift 6.0
Projects
None yet
Development

No branches or pull requests

5 participants