blob: 69df495826f5901c24c374577ef2445a8cbf5172 [file] [log] [blame]
// RUN: %target-swift-frontend %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(16)
struct HugeAlignment {
var x, y, z, w, v: Builtin.Word
}
// TODO: could be the context param
// CHECK-LABEL: define{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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_allocObject
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %T17indirect_argument4HugeV }>*
// CHECK: call swiftcc void @"$s24huge_partial_applicationTA"(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %0, %swift.refcounted* swiftself [[CLOSURE]])
// CHECK: define internal swiftcc void @"$s24huge_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{{( dllexport)?}}{{( 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_allocObject
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %T17indirect_argument4HugeV }>*
// CHECK: call swiftcc void @"$s30huge_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 @"$s30huge_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
}