Skip to content
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

[SR-14236] [AutoDiff] Differentiation transform: library evolution -> leaked owned value was never consumed #55179

Open
dan-zheng opened this issue May 5, 2020 · 0 comments
Labels
AutoDiff bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself

Comments

@dan-zheng
Copy link
Collaborator

Previous ID SR-14236
Radar None
Original Reporter @dan-zheng
Type Bug
Additional Detail from JIRA
Votes 0
Component/s Compiler
Labels Bug, AutoDiff
Assignee None
Priority Medium

md5: da968ebb3c198b9db21287b64ca43938

relates to:

  • TF-429 Differentiation transform does not support -enable-library-evolution

Issue Description:

import _Differentiation

public class Tracked<T> {}
extension Tracked: Differentiable where T: Differentiable {}

@differentiable
func callback(_ x: inout Tracked<Float>.TangentVector) {}

@differentiable
func caller(_ x: Tracked<Float>) -> Tracked<Float> {
  return x.withDerivative(callback)
}
$ swiftc -Osize -Xfrontend -enable-library-evolution deriv.swift
Error#: 0. Begin Error in Function: 'AD__$s5deriv6calleryAA7TrackedCySfGAEF__vjp_src_0_wrt_0'
Error! Found a leaked owned value that was never consumed.
Value:   %31 = partial_apply [callee_guaranteed] %30(%29) : $@convention(thin) (@guaranteed Tracked<Float>.TangentVector, @owned _AD__$s5deriv6calleryAA7TrackedCySfGAEF_bb0__PB__src_0_wrt_0) -> @owned Tracked<Float>.TangentVector

Error#: 0. End Error in Function: 'AD__$s5deriv6calleryAA7TrackedCySfGAEF__vjp_src_0_wrt_0'
Found ownership error?!
<unknown>:0: error: fatal error encountered during compilation; please file a bug report with your project and the crash log
<unknown>:0: note: triggering standard assertion failure routine
Stack dump:
...
1.  Swift version 5.3-dev (LLVM baefd3c477, Swift 2240dc8bf4)
2.  While evaluating request ExecuteSILPipelineRequest(Run pipelines { Guaranteed Passes } on SIL for deriv.deriv)
3.  While running pass #&#8203;228 SILModuleTransform "MandatoryInlining".
4.  While verifying SIL function "@AD__$s5deriv6calleryAA7TrackedCySfGAEF__vjp_src_0_wrt_0".
 for 'caller(_:)' (at deriv.swift:18:1)
0  swift                    0x000000011368ba48 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 40
1  swift                    0x000000011368a9c8 llvm::sys::RunSignalHandlers() + 248
2  swift                    0x000000011368c03d SignalHandler(int) + 285
3  libsystem_platform.dylib 0x00007fff6ef8f5fd _sigtramp + 29
4  libsystem_platform.dylib 000000000000000000 _sigtramp + 18446603338654353952
5  libsystem_c.dylib        0x00007fff6ee65808 abort + 120
6  swift                    0x000000010f0f0ad7 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*)::$_1::__invoke(void*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) + 711
7  swift                    0x00000001135f423b llvm::report_fatal_error(llvm::Twine const&, bool) + 251
8  swift                    0x00000001135f4132 llvm::report_fatal_error(char const*, bool) + 50
9  swift                    0x000000010fbffe01 swift::LinearLifetimeChecker::ErrorBuilder::handleError(llvm::function_ref<void ()>&&, bool) const + 721
10 swift                    0x000000010fbff41d swift::SILValueOwnershipChecker::checkValueWithoutLifetimeEndingUses() + 461
11 swift                    0x000000010fbfd5db swift::SILValueOwnershipChecker::checkUses() + 203
12 swift                    0x000000010fbfd294 swift::SILValueOwnershipChecker::check() + 180
// AD__$s4main6calleryAA7TrackedCySfGAEF__vjp_src_0_wrt_0
sil hidden [ossa] @AD__$s4main6calleryAA7TrackedCySfGAEF__vjp_src_0_wrt_0 : $@convention(thin) (@guaranteed Tracked<Float>) -> (@owned Tracked<Float>, @owned @callee_guaranteed (@in_guaranteed Tracked<Float>.TangentVector) -> @out Tracked<Float>.TangentVector) {
// %0                                             // users: %4, %1
bb0(%0 : @guaranteed $Tracked<Float>):
  debug_value %0 : $Tracked<Float>, let, name "x", argno 1 // id: %1
  %2 = alloc_stack $Tracked<Float>                // users: %28, %27, %22
  %3 = alloc_stack $Tracked<Float>                // users: %26, %22, %4
  %4 = store_borrow %0 to %3 : $*Tracked<Float>
  // function_ref callback(_:)
  %5 = function_ref @$s4main8callbackyyAA7TrackedCAA16_Differentiation14DifferentiableRzlE13TangentVectorVySf_GzF : $@convention(thin) (@inout Tracked<Float>.TangentVector) -> () // user: %6
  %6 = thin_to_thick_function %5 : $@convention(thin) (@inout Tracked<Float>.TangentVector) -> () to $@callee_guaranteed (@inout Tracked<Float>.TangentVector) -> () // user: %7
  %7 = convert_function %6 : $@callee_guaranteed (@inout Tracked<Float>.TangentVector) -> () to $@callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector> // users: %25, %22
  // function_ref Differentiable.withDerivative(_:)
  %8 = function_ref @$s16_Differentiation14DifferentiablePAAE14withDerivativeyxy13TangentVectorQzzcF : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <τ_0_0.TangentVector>, @in_guaranteed τ_0_0) -> @out τ_0_0 // user: %9
  %9 = partial_apply [callee_guaranteed] %8<Tracked<Float>>() : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <τ_0_0.TangentVector>, @in_guaranteed τ_0_0) -> @out τ_0_0 // users: %16, %14
  %10 = differentiability_witness_function [jvp] [parameters 1] [results 0] <Self where Self : Differentiable> @$s16_Differentiation14DifferentiablePAAE14withDerivativeyxy13TangentVectorQzzcF : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <τ_0_0.TangentVector>, @in_guaranteed τ_0_0) -> @out τ_0_0 // user: %11
  %11 = partial_apply [callee_guaranteed] %10<Tracked<Float>>() : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <τ_0_0.TangentVector>, @in_guaranteed τ_0_0) -> (@out τ_0_0, @owned @callee_guaranteed @substituted <τ_0_0, τ_0_1> (@in_guaranteed τ_0_0) -> @out τ_0_1 for <τ_0_0.TangentVector, τ_0_0.TangentVector>) // user: %15
  %12 = differentiability_witness_function [vjp] [parameters 1] [results 0] <Self where Self : Differentiable> @$s16_Differentiation14DifferentiablePAAE14withDerivativeyxy13TangentVectorQzzcF : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <τ_0_0.TangentVector>, @in_guaranteed τ_0_0) -> @out τ_0_0 // user: %13
  %13 = partial_apply [callee_guaranteed] %12<Tracked<Float>>() : $@convention(method) <τ_0_0 where τ_0_0 : Differentiable> (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <τ_0_0.TangentVector>, @in_guaranteed τ_0_0) -> (@out τ_0_0, @owned @callee_guaranteed @substituted <τ_0_0, τ_0_1> (@in_guaranteed τ_0_0) -> @out τ_0_1 for <τ_0_0.TangentVector, τ_0_0.TangentVector>) // user: %15
  %14 = copy_value %9 : $@callee_guaranteed (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> @out Tracked<Float> // user: %15
  %15 = differentiable_function [parameters 1] %14 : $@callee_guaranteed (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> @out Tracked<Float> with_derivative {%11 : $@callee_guaranteed (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> (@out Tracked<Float>, @owned @callee_guaranteed @substituted <τ_0_0, τ_0_1> (@in_guaranteed τ_0_0) -> @out τ_0_1 for <Tracked<Float>.TangentVector, Tracked<Float>.TangentVector>), %13 : $@callee_guaranteed (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> (@out Tracked<Float>, @owned @callee_guaranteed @substituted <τ_0_0, τ_0_1> (@in_guaranteed τ_0_0) -> @out τ_0_1 for <Tracked<Float>.TangentVector, Tracked<Float>.TangentVector>)} // users: %17, %21
  destroy_value %9 : $@callee_guaranteed (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> @out Tracked<Float> // id: %16
  %17 = begin_borrow %15 : $@differentiable @callee_guaranteed (@noDerivative @guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> @out Tracked<Float> // users: %20, %18
  %18 = differentiable_function_extract [vjp] %17 : $@differentiable @callee_guaranteed (@noDerivative @guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> @out Tracked<Float> // user: %19
  %19 = copy_value %18 : $@callee_guaranteed (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> (@out Tracked<Float>, @owned @callee_guaranteed (@in_guaranteed Tracked<Float>.TangentVector) -> @out Tracked<Float>.TangentVector) // users: %23, %22
  end_borrow %17 : $@differentiable @callee_guaranteed (@noDerivative @guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> @out Tracked<Float> // id: %20
  destroy_value %15 : $@differentiable @callee_guaranteed (@noDerivative @guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> @out Tracked<Float> // id: %21
  %22 = apply %19(%2, %7, %3) : $@callee_guaranteed (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> (@out Tracked<Float>, @owned @callee_guaranteed (@in_guaranteed Tracked<Float>.TangentVector) -> @out Tracked<Float>.TangentVector) // user: %29
  destroy_value %19 : $@callee_guaranteed (@guaranteed @callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector>, @in_guaranteed Tracked<Float>) -> (@out Tracked<Float>, @owned @callee_guaranteed (@in_guaranteed Tracked<Float>.TangentVector) -> @out Tracked<Float>.TangentVector) // id: %23
  %24 = tuple ()
  destroy_value %7 : $@callee_guaranteed @substituted <τ_0_0> (@inout τ_0_0) -> () for <Tracked<Float>.TangentVector> // id: %25
  dealloc_stack %3 : $*Tracked<Float>             // id: %26
  %27 = load [take] %2 : $*Tracked<Float>         // user: %32
  dealloc_stack %2 : $*Tracked<Float>             // id: %28
  %29 = struct $_AD__$s4main6calleryAA7TrackedCySfGAEF_bb0__PB__src_0_wrt_0 (%22 : $@callee_guaranteed (@in_guaranteed Tracked<Float>.TangentVector) -> @out Tracked<Float>.TangentVector) // user: %31
  // function_ref AD__$s4main6calleryAA7TrackedCySfGAEF__pullback_src_0_wrt_0
  %30 = function_ref @AD__$s4main6calleryAA7TrackedCySfGAEF__pullback_src_0_wrt_0 : $@convention(thin) (@guaranteed Tracked<Float>.TangentVector, @owned _AD__$s4main6calleryAA7TrackedCySfGAEF_bb0__PB__src_0_wrt_0) -> @owned Tracked<Float>.TangentVector // user: %31
  %31 = partial_apply [callee_guaranteed] %30(%29) : $@convention(thin) (@guaranteed Tracked<Float>.TangentVector, @owned _AD__$s4main6calleryAA7TrackedCySfGAEF_bb0__PB__src_0_wrt_0) -> @owned Tracked<Float>.TangentVector
  %32 = tuple (%27 : $Tracked<Float>, undef : $@callee_guaranteed (@in_guaranteed Tracked<Float>.TangentVector) -> @out Tracked<Float>.TangentVector) // user: %33
  return %32 : $(Tracked<Float>, @callee_guaranteed (@in_guaranteed Tracked<Float>.TangentVector) -> @out Tracked<Float>.TangentVector) // id: %33
} // end sil function 'AD__$s4main6calleryAA7TrackedCySfGAEF__vjp_src_0_wrt_0'
@swift-ci swift-ci transferred this issue from apple/swift-issues Apr 25, 2022
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 in itself
Projects
None yet
Development

No branches or pull requests

1 participant