mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
98 lines
6.4 KiB
Plaintext
98 lines
6.4 KiB
Plaintext
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -emit-ir | %FileCheck -check-prefix=CHECK -check-prefix=CHECK-%target-ptrsize %s
|
|
import Swift
|
|
import Builtin
|
|
|
|
struct Huge {
|
|
var x, y, z, w, v: Builtin.Word
|
|
}
|
|
|
|
@_alignment(32)
|
|
struct HugeAlignment {
|
|
var x, y, z, w, v: Builtin.Word
|
|
}
|
|
|
|
// TODO: could be the context param
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc void @huge_method(%T17indirect_argument4HugeV* noalias nocapture swiftself dereferenceable({{.*}}))
|
|
// CHECK-NOT: alloca
|
|
// CHECK: call swiftcc void @huge_method(%T17indirect_argument4HugeV* noalias nocapture swiftself dereferenceable({{.*}}) %0)
|
|
sil @huge_method : $@convention(method) Huge -> () {
|
|
entry(%x : $Huge):
|
|
%f = function_ref @huge_method : $@convention(method) Huge -> ()
|
|
%z = apply %f(%x) : $@convention(method) Huge -> ()
|
|
return %z : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc void @huge_param(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}))
|
|
// CHECK-NOT: alloca
|
|
// CHECK: call swiftcc void @huge_param(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %0)
|
|
sil @huge_param : $@convention(thin) Huge -> () {
|
|
entry(%x : $Huge):
|
|
%f = function_ref @huge_param : $@convention(thin) Huge -> ()
|
|
%z = apply %f(%x) : $@convention(thin) Huge -> ()
|
|
return %z : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc void @huge_alignment_param(%T17indirect_argument13HugeAlignmentV* noalias nocapture dereferenceable({{.*}}))
|
|
// CHECK-NOT: alloca
|
|
// CHECK: call swiftcc void @huge_alignment_param(%T17indirect_argument13HugeAlignmentV* noalias nocapture dereferenceable({{.*}}) %0)
|
|
sil @huge_alignment_param : $@convention(thin) HugeAlignment -> () {
|
|
entry(%x : $HugeAlignment):
|
|
%f = function_ref @huge_alignment_param : $@convention(thin) HugeAlignment -> ()
|
|
%z = apply %f(%x) : $@convention(thin) HugeAlignment -> ()
|
|
return %z : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc void @huge_param_and_return(%T17indirect_argument4HugeV* noalias nocapture sret, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}))
|
|
// CHECK: [[TMP_RET:%.*]] = alloca
|
|
// CHECK: call swiftcc void @huge_param_and_return(%T17indirect_argument4HugeV* noalias nocapture sret [[TMP_RET]], %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %1)
|
|
sil @huge_param_and_return : $@convention(thin) Huge -> Huge {
|
|
entry(%x : $Huge):
|
|
%f = function_ref @huge_param_and_return : $@convention(thin) Huge -> Huge
|
|
%z = apply %f(%x) : $@convention(thin) Huge -> Huge
|
|
return %z : $Huge
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc void @huge_param_and_indirect_return(%T17indirect_argument4HugeV* noalias nocapture sret, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}))
|
|
// CHECK-NOT: alloca
|
|
// CHECK: call swiftcc void @huge_param_and_indirect_return(%T17indirect_argument4HugeV* noalias nocapture sret %0, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %1)
|
|
sil @huge_param_and_indirect_return : $@convention(thin) (Huge) -> @out Huge {
|
|
entry(%o : $*Huge, %x : $Huge):
|
|
%f = function_ref @huge_param_and_indirect_return : $@convention(thin) (Huge) -> @out Huge
|
|
%z = apply %f(%o, %x) : $@convention(thin) (Huge) -> @out Huge
|
|
return %z : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc void @huge_partial_application(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}), %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}))
|
|
// CHECK-NOT: alloca
|
|
// CHECK: [[CLOSURE:%.*]] = call noalias %swift.refcounted* @swift_rt_swift_allocObject
|
|
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %T17indirect_argument4HugeV }>*
|
|
// CHECK: call swiftcc void @_T024huge_partial_applicationTA(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %0, %swift.refcounted* swiftself [[CLOSURE]])
|
|
// CHECK: define internal swiftcc void @_T024huge_partial_applicationTA(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}), %swift.refcounted* swiftself)
|
|
// CHECK: [[TMP_ARG:%.*]] = alloca
|
|
// CHECK-NOT: tail
|
|
// CHECK: call swiftcc void @huge_partial_application(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %0, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) [[TMP_ARG]])
|
|
sil @huge_partial_application : $@convention(thin) (Huge, Huge) -> () {
|
|
entry(%x : $Huge, %y : $Huge):
|
|
%f = function_ref @huge_partial_application : $@convention(thin) (Huge, Huge) -> ()
|
|
%a = partial_apply %f(%y) : $@convention(thin) (Huge, Huge) -> ()
|
|
%z = apply %a(%x) : $@convention(thick) @callee_owned (Huge) -> ()
|
|
return %z : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc void @huge_partial_application_stret(%T17indirect_argument4HugeV* noalias nocapture sret, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}), %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}))
|
|
// CHECK: [[TMP_RET:%.*]] = alloca
|
|
// CHECK: [[CLOSURE:%.*]] = call noalias %swift.refcounted* @swift_rt_swift_allocObject
|
|
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %T17indirect_argument4HugeV }>*
|
|
// CHECK: call swiftcc void @_T030huge_partial_application_stretTA(%T17indirect_argument4HugeV* noalias nocapture sret [[TMP_RET]], %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %1, %swift.refcounted* swiftself [[CLOSURE]])
|
|
// CHECK: define internal swiftcc void @_T030huge_partial_application_stretTA(%T17indirect_argument4HugeV* noalias nocapture sret, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}), %swift.refcounted* swiftself)
|
|
// CHECK: [[TMP_ARG:%.*]] = alloca
|
|
// CHECK-NOT: tail
|
|
// CHECK: call swiftcc void @huge_partial_application_stret(%T17indirect_argument4HugeV* noalias nocapture sret %0, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %1, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) [[TMP_ARG]])
|
|
sil @huge_partial_application_stret : $@convention(thin) (Huge, Huge) -> Huge {
|
|
entry(%x : $Huge, %y : $Huge):
|
|
%f = function_ref @huge_partial_application_stret : $@convention(thin) (Huge, Huge) -> Huge
|
|
%a = partial_apply %f(%y) : $@convention(thin) (Huge, Huge) -> Huge
|
|
%z = apply %a(%x) : $@convention(thick) @callee_owned (Huge) -> Huge
|
|
return %z : $Huge
|
|
}
|