blob: ad297d80ae1c6bac4ced388094d956341803d629 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-sil-opt %s -emit-sib -o %t/tmp.sib -module-name differentiable_func_type
// RUN: %target-sil-opt %t/tmp.sib -o %t/tmp.2.sib -module-name differentiable_func_type
// RUN: %target-sil-opt %t/tmp.2.sib -module-name differentiable_func_type | %FileCheck %s -check-prefix=CHECK-SIL
// RUN: %target-swift-frontend %s -emit-ir -module-name differentiable_func_type | %FileCheck %s -check-prefix=CHECK-LLVM
sil_stage raw
import Swift
sil @takeAndReturnLinear : $@convention(thin) (@differentiable(linear) (Float) -> Float) -> @differentiable(linear) (Float) -> Float {
bb0(%0 : $@differentiable(linear) (Float) -> Float):
return %0 : $@differentiable(linear) (Float) -> Float
}
// CHECK-SIL-LABEL: sil @takeAndReturnLinear : $@convention(thin) (@differentiable(linear) (Float) -> Float) -> @differentiable(linear) (Float) -> Float {
// CHECK-SIL: bb0([[ARG:%.*]] : $@differentiable(linear) (Float) -> Float):
// CHECK-SIL: return [[ARG]] : $@differentiable(linear) (Float) -> Float
// CHECK-SIL: }
// CHECK-LLVM-LABEL: define{{.*}} swiftcc { i8*, %swift.refcounted*, i8*, %swift.refcounted* } @takeAndReturnLinear(i8* %0, %swift.refcounted* %1, i8* %2, %swift.refcounted* %3) #0 {
// CHECK-LLVM: entry:
// CHECK-LLVM: %4 = insertvalue { i8*, %swift.refcounted*, i8*, %swift.refcounted* } undef, i8* %0, 0
// CHECK-LLVM: %5 = insertvalue { i8*, %swift.refcounted*, i8*, %swift.refcounted* } %4, %swift.refcounted* %1, 1
// CHECK-LLVM: %6 = insertvalue { i8*, %swift.refcounted*, i8*, %swift.refcounted* } %5, i8* %2, 2
// CHECK-LLVM: %7 = insertvalue { i8*, %swift.refcounted*, i8*, %swift.refcounted* } %6, %swift.refcounted* %3, 3
// CHECK-LLVM: ret { i8*, %swift.refcounted*, i8*, %swift.refcounted* } %7
// CHECK-LLVM: }
sil @takeAndReturnDifferentiable : $@convention(thin) (@differentiable (Float) -> Float) -> @differentiable (Float) -> Float {
bb0(%0 : $@differentiable (Float) -> Float):
return %0 : $@differentiable (Float) -> Float
}
// CHECK-SIL-LABEL: sil @takeAndReturnDifferentiable : $@convention(thin) (@differentiable (Float) -> Float) -> @differentiable (Float) -> Float {
// CHECK-SIL: bb0([[ARG:%.*]] : $@differentiable (Float) -> Float):
// CHECK-SIL: return [[ARG]] : $@differentiable (Float) -> Float
// CHECK-SIL: }
// CHECK-LLVM-LABEL: define{{.*}} swiftcc void @takeAndReturnDifferentiable(<{ %swift.function, %swift.function, %swift.function }>* noalias nocapture sret %0, <{ %swift.function, %swift.function, %swift.function }>* noalias nocapture dereferenceable(48) %1) #0 {
// CHECK-LLVM: entry:
// CHECK-LLVM: %.original = getelementptr inbounds <{ %swift.function, %swift.function, %swift.function }>, <{ %swift.function, %swift.function, %swift.function }>* %1, i32 0, i32 0
// CHECK-LLVM: %.original.fn = getelementptr inbounds %swift.function, %swift.function* %.original, i32 0, i32 0
// CHECK-LLVM: %2 = load i8*, i8** %.original.fn, align 8
// CHECK-LLVM: %.original.data = getelementptr inbounds %swift.function, %swift.function* %.original, i32 0, i32 1
// CHECK-LLVM: %3 = load %swift.refcounted*, %swift.refcounted** %.original.data, align 8
// CHECK-LLVM: %.jvp = getelementptr inbounds <{ %swift.function, %swift.function, %swift.function }>, <{ %swift.function, %swift.function, %swift.function }>* %1, i32 0, i32 1
// CHECK-LLVM: %.jvp.fn = getelementptr inbounds %swift.function, %swift.function* %.jvp, i32 0, i32 0
// CHECK-LLVM: %4 = load i8*, i8** %.jvp.fn, align 8
// CHECK-LLVM: %.jvp.data = getelementptr inbounds %swift.function, %swift.function* %.jvp, i32 0, i32 1
// CHECK-LLVM: %5 = load %swift.refcounted*, %swift.refcounted** %.jvp.data, align 8
// CHECK-LLVM: %.vjp = getelementptr inbounds <{ %swift.function, %swift.function, %swift.function }>, <{ %swift.function, %swift.function, %swift.function }>* %1, i32 0, i32 2
// CHECK-LLVM: %.vjp.fn = getelementptr inbounds %swift.function, %swift.function* %.vjp, i32 0, i32 0
// CHECK-LLVM: %6 = load i8*, i8** %.vjp.fn, align 8
// CHECK-LLVM: %.vjp.data = getelementptr inbounds %swift.function, %swift.function* %.vjp, i32 0, i32 1
// CHECK-LLVM: %7 = load %swift.refcounted*, %swift.refcounted** %.vjp.data, align 8
// CHECK-LLVM: %.original1 = getelementptr inbounds <{ %swift.function, %swift.function, %swift.function }>, <{ %swift.function, %swift.function, %swift.function }>* %0, i32 0, i32 0
// CHECK-LLVM: %.original1.fn = getelementptr inbounds %swift.function, %swift.function* %.original1, i32 0, i32 0
// CHECK-LLVM: store i8* %2, i8** %.original1.fn, align 8
// CHECK-LLVM: %.original1.data = getelementptr inbounds %swift.function, %swift.function* %.original1, i32 0, i32 1
// CHECK-LLVM: store %swift.refcounted* %3, %swift.refcounted** %.original1.data, align 8
// CHECK-LLVM: %.jvp2 = getelementptr inbounds <{ %swift.function, %swift.function, %swift.function }>, <{ %swift.function, %swift.function, %swift.function }>* %0, i32 0, i32 1
// CHECK-LLVM: %.jvp2.fn = getelementptr inbounds %swift.function, %swift.function* %.jvp2, i32 0, i32 0
// CHECK-LLVM: store i8* %4, i8** %.jvp2.fn, align 8
// CHECK-LLVM: %.jvp2.data = getelementptr inbounds %swift.function, %swift.function* %.jvp2, i32 0, i32 1
// CHECK-LLVM: store %swift.refcounted* %5, %swift.refcounted** %.jvp2.data, align 8
// CHECK-LLVM: %.vjp3 = getelementptr inbounds <{ %swift.function, %swift.function, %swift.function }>, <{ %swift.function, %swift.function, %swift.function }>* %0, i32 0, i32 2
// CHECK-LLVM: %.vjp3.fn = getelementptr inbounds %swift.function, %swift.function* %.vjp3, i32 0, i32 0
// CHECK-LLVM: store i8* %6, i8** %.vjp3.fn, align 8
// CHECK-LLVM: %.vjp3.data = getelementptr inbounds %swift.function, %swift.function* %.vjp3, i32 0, i32 1
// CHECK-LLVM: store %swift.refcounted* %7, %swift.refcounted** %.vjp3.data, align 8
// CHECK-LLVM: ret void
// CHECK-LLVM: }