| // 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{{( 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 |
| } |