blob: 7da22977078245dff44fb05cca53258df76a2adc [file] [log] [blame]
// 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-64: define{{( protected)?}} swiftcc void @huge_method(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}))
// CHECK-LABEL-32: define{{( protected)?}} swiftcc void @huge_method(%T17indirect_argument4HugeV* noalias nocapture swiftself dereferenceable({{.*}}))
// CHECK: call swiftcc void @huge_method(%T17indirect_argument4HugeV* noalias nocapture swiftself dereferenceable({{.*}})
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: 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: 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:%.*]] = alloca
// CHECK: call swiftcc void @huge_param_and_return(%T17indirect_argument4HugeV* noalias nocapture sret [[TMP]], %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: 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-32: [[CLOSURE:%.*]] = call noalias %swift.refcounted* @swift_rt_swift_allocObject
// CHECK-64: [[CLOSURE:%.*]] = call noalias %swift.refcounted* @swift_rt_swift_allocObject
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %T17indirect_argument4HugeV }>*
// CHECK: call void @llvm.memcpy
// CHECK-64: call swiftcc void @_T024huge_partial_applicationTA(%T17indirect_argument4HugeV* noalias nocapture dereferenceable(40) %0, %swift.refcounted* swiftself [[CLOSURE]])
// CHECK-32: call swiftcc void @_T024huge_partial_applicationTA(%T17indirect_argument4HugeV* noalias nocapture dereferenceable(20) %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:%.*]] = 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]], %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
}