| // RUN: %target-sil-opt %s | %target-sil-opt | %FileCheck %s |
| |
| // Test `differentiable_function_extract` and |
| // `differentiability_witness_function` with explicit lowered type. |
| // SIL generated via `%target-sil-opt -loadable-address %s`. |
| // Note: SIL serialization/deserialization does not support lowered SIL. |
| |
| sil_stage lowered |
| |
| import Swift |
| import Builtin |
| |
| struct Large : Differentiable { |
| @_hasStorage @noDerivative let a: Float { get } |
| @_hasStorage @noDerivative let b: Float { get } |
| @_hasStorage @noDerivative let c: Float { get } |
| @_hasStorage @noDerivative let d: Float { get } |
| @_hasStorage @noDerivative let e: Float { get } |
| init(a: Float, b: Float, c: Float, d: Float, e: Float) |
| struct TangentVector : Differentiable, AdditiveArithmetic { |
| init() |
| typealias TangentVector = Large.TangentVector |
| static var zero: Large.TangentVector { get } |
| static func + (lhs: Large.TangentVector, rhs: Large.TangentVector) -> Large.TangentVector |
| static func - (lhs: Large.TangentVector, rhs: Large.TangentVector) -> Large.TangentVector |
| @_implements(Equatable, ==(_:_:)) static func __derived_struct_equals(_ a: Large.TangentVector, _ b: Large.TangentVector) -> Bool |
| } |
| mutating func move(along direction: Large.TangentVector) |
| } |
| |
| sil_differentiability_witness [parameters 0 1 2] [results 0] @examplefunc : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| |
| sil @examplefunc : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| sil @examplemethod : $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| |
| // CHECK-LABEL: sil @test |
| sil @test : $@convention(thin) () -> () { |
| bb0: |
| %func = function_ref @examplefunc : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| %func_jvpwitness_wrt_012 = differentiability_witness_function [jvp] [parameters 0 1 2] [results 0] @examplefunc : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large as $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector, Large.TangentVector, Large.TangentVector) -> Large.TangentVector) |
| %func_vjpwitness_wrt_012 = differentiability_witness_function [vjp] [parameters 0 1 2] [results 0] @examplefunc : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large as $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> (Large.TangentVector, Large.TangentVector, Large.TangentVector)) |
| %func_diff_wrt_012 = differentiable_function [parameters 0 1 2] [results 0] %func : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large with_derivative {%func_jvpwitness_wrt_012 : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector, Large.TangentVector, Large.TangentVector) -> Large.TangentVector), %func_vjpwitness_wrt_012 : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> (Large.TangentVector, Large.TangentVector, Large.TangentVector))} |
| %func_vjp_wrt_012 = differentiable_function_extract [vjp] %func_diff_wrt_012 : $@differentiable @convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large as $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> (Large.TangentVector, Large.TangentVector, Large.TangentVector)) |
| |
| // CHECK: [[FUNC_REF:%.*]] = function_ref @examplefunc |
| // CHECK: [[DIFF_WRT_012:%.*]] = differentiable_function [parameters 0 1 2] [results 0] [[FUNC_REF]] : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| // CHECK: [[VJP_WRT_012:%.*]] = differentiable_function_extract [vjp] [[DIFF_WRT_012]] : $@differentiable @convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large as $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> (Large.TangentVector, Large.TangentVector, Large.TangentVector)) |
| |
| %func_diff_wrt_0 = differentiable_function [parameters 0] [results 0] %func : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| %func_vjp_wrt_0 = differentiable_function_extract [vjp] %func_diff_wrt_0 : $@differentiable @convention(thin) (@in_constant Large, @noDerivative @in_constant Large, @noDerivative @in_constant Large) -> @out Large as $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> Large.TangentVector) |
| |
| // CHECK: [[DIFF_WRT_0:%.*]] = differentiable_function [parameters 0] [results 0] [[FUNC_REF]] : $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| // CHECK: [[VJP_WRT_0:%.*]] = differentiable_function_extract [vjp] [[DIFF_WRT_0]] : $@differentiable @convention(thin) (@in_constant Large, @noDerivative @in_constant Large, @noDerivative @in_constant Large) -> @out Large as $@convention(thin) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> Large.TangentVector) |
| |
| %method = function_ref @examplemethod : $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| %method_diff_wrt_0123 = differentiable_function [parameters 0 1 2] [results 0] %method : $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| %7 = differentiable_function_extract [vjp] %method_diff_wrt_0123 : $@differentiable @convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large as $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> (Large.TangentVector, Large.TangentVector, Large.TangentVector)) |
| |
| // CHECK: [[METHOD_REF:%.*]] = function_ref @examplemethod |
| // CHECK: [[DIFF_WRT_0123:%.*]] = differentiable_function [parameters 0 1 2] [results 0] [[METHOD_REF]] : $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| // CHECK: [[VJP_WRT_0123:%.*]] = differentiable_function_extract [vjp] [[DIFF_WRT_0123]] : $@differentiable @convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large as $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> (Large.TangentVector, Large.TangentVector, Large.TangentVector)) |
| |
| %method_diff_wrt_0 = differentiable_function [parameters 0] [results 0] %method : $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| %method_vjp_wrt_0 = differentiable_function_extract [vjp] %method_diff_wrt_0 : $@differentiable @convention(method) (@in_constant Large, @noDerivative @in_constant Large, @noDerivative @in_constant Large) -> @out Large as $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> Large.TangentVector) |
| |
| // CHECK: [[DIFF_WRT_0:%.*]] = differentiable_function [parameters 0] [results 0] [[METHOD_REF]] : $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> @out Large |
| // CHECK: [[VJP_WRT_0:%.*]] = differentiable_function_extract [vjp] [[DIFF_WRT_0]] : $@differentiable @convention(method) (@in_constant Large, @noDerivative @in_constant Large, @noDerivative @in_constant Large) -> @out Large as $@convention(method) (@in_constant Large, @in_constant Large, @in_constant Large) -> (Large, @owned @callee_guaranteed (Large.TangentVector) -> Large.TangentVector) |
| |
| %10 = tuple () |
| return %10 : $() |
| } |