blob: 398957d63fb8fa8822adde90590f263747c2a8ba [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(32)
struct HugeAlignment {
var x, y, z, w, v: Builtin.Word
}
// TODO: could be the context param
// CHECK-LABEL: define{{( protected)?}} void @huge_method(%V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}))
// CHECK: [[TMP:%.*]] = alloca
// CHECK: call void @huge_method(%V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}) [[TMP]])
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)?}} void @huge_param(%V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}))
// CHECK: [[TMP:%.*]] = alloca
// CHECK: call void @huge_param(%V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}) [[TMP]])
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)?}} void @huge_alignment_param(%V17indirect_argument13HugeAlignment* noalias nocapture dereferenceable({{.*}}))
// CHECK: [[TMP:%.*]] = alloca
// CHECK: call void @huge_alignment_param(%V17indirect_argument13HugeAlignment* noalias nocapture dereferenceable({{.*}}) [[TMP]])
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)?}} void @huge_param_and_return(%V17indirect_argument4Huge* noalias nocapture sret, %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}))
// CHECK: [[TMP_ARG:%.*]] = alloca
// CHECK: [[TMP_RET:%.*]] = alloca
// CHECK: call void @huge_param_and_return(%V17indirect_argument4Huge* noalias nocapture sret [[TMP_RET]], %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}) [[TMP_ARG]])
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)?}} void @huge_param_and_indirect_return(%V17indirect_argument4Huge* noalias nocapture sret, %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}))
// CHECK: [[TMP_ARG:%.*]] = alloca
// CHECK: call void @huge_param_and_indirect_return(%V17indirect_argument4Huge* noalias nocapture sret %0, %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}) [[TMP_ARG]])
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)?}} void @huge_partial_application(%V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}), %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}))
// CHECK: [[TMP_ARG:%.*]] = alloca
// CHECK: [[CLOSURE:%.*]] = call noalias %swift.refcounted* @rt_swift_allocObject
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %V17indirect_argument4Huge }>*
// CHECK: call void @_TPA_huge_partial_application(%V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}) [[TMP_ARG]], %swift.refcounted* [[CLOSURE]])
// CHECK: define internal void @_TPA_huge_partial_application(%V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}), %swift.refcounted*)
// CHECK: [[TMP_ARG:%.*]] = alloca
// CHECK-NOT: tail
// CHECK: call void @huge_partial_application(%V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}) %0, %V17indirect_argument4Huge* 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)?}} void @huge_partial_application_stret(%V17indirect_argument4Huge* noalias nocapture sret, %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}), %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}))
// CHECK: [[TMP_ARG:%.*]] = alloca
// CHECK: [[TMP_RET:%.*]] = alloca
// CHECK: [[CLOSURE:%.*]] = call noalias %swift.refcounted* @rt_swift_allocObject
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %V17indirect_argument4Huge }>*
// CHECK: call void @_TPA_huge_partial_application_stret(%V17indirect_argument4Huge* noalias nocapture sret [[TMP_RET]], %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}) [[TMP_ARG]], %swift.refcounted* [[CLOSURE]])
// CHECK: define internal void @_TPA_huge_partial_application_stret(%V17indirect_argument4Huge* noalias nocapture sret, %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}), %swift.refcounted*)
// CHECK: [[TMP_ARG:%.*]] = alloca
// CHECK-NOT: tail
// CHECK: call void @huge_partial_application_stret(%V17indirect_argument4Huge* noalias nocapture sret %0, %V17indirect_argument4Huge* noalias nocapture dereferenceable({{.*}}) %1, %V17indirect_argument4Huge* 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
}