| // RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize |
| sil_stage canonical |
| |
| import Builtin |
| |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @pod_box_8_8_a |
| sil @pod_box_8_8_a : $@convention(thin) () -> () { |
| entry: |
| // CHECK: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[POD_8_8_METADATA:@metadata[0-9.]*]], i32 0, i32 2), [[WORD:i[0-9]+]] [[POD_8_8_SIZE:[0-9]+]], [[WORD]] 7) |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <Builtin.Int64> |
| // CHECK: [[BOX_RAW:%.*]] = bitcast %swift.refcounted* [[BOX]] to [[POD_8_8_LAYOUT:<\{ %swift.refcounted, \[8 x i8\] \}>]]* |
| // CHECK: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_8_8_LAYOUT]], [[POD_8_8_LAYOUT]]* [[BOX_RAW]], i32 0, i32 1 |
| // CHECK: [[BOX_DATA_1:%.*]] = bitcast [8 x i8]* [[BOX_DATA]] to i64* |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.Int64>, 0 |
| // CHECK: call void @swift_deallocUninitializedObject(%swift.refcounted* [[BOX]], [[WORD]] [[POD_8_8_SIZE]], [[WORD]] 7) |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.Int64> |
| return undef : $() |
| } |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @pod_box_8_8_b |
| sil @pod_box_8_8_b : $@convention(thin) () -> () { |
| entry: |
| // CHECK: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[POD_8_8_METADATA]], i32 0, i32 2), [[WORD]] [[POD_8_8_SIZE]], [[WORD]] 7) |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <Builtin.FPIEEE64> |
| // CHECK: [[BOX_RAW:%.*]] = bitcast %swift.refcounted* [[BOX]] to [[POD_8_8_LAYOUT:<\{ %swift.refcounted, \[8 x i8\] \}>]]* |
| // CHECK: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_8_8_LAYOUT]], [[POD_8_8_LAYOUT]]* [[BOX_RAW]], i32 0, i32 1 |
| // CHECK: [[BOX_DATA_1:%.*]] = bitcast [8 x i8]* [[BOX_DATA]] to double* |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.FPIEEE64>, 0 |
| // CHECK: call void @swift_deallocUninitializedObject(%swift.refcounted* [[BOX]], [[WORD]] [[POD_8_8_SIZE]], [[WORD]] 7) |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.FPIEEE64> |
| return undef : $() |
| } |
| |
| @_alignment(32) |
| struct OverAligned { |
| var x, y, z, w: Builtin.Int64 |
| } |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @pod_box_32_32 |
| sil @pod_box_32_32 : $@convention(thin) () -> () { |
| entry: |
| // CHECK: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[POD_32_32_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 64, [[WORD]] 31) |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <OverAligned> |
| // CHECK-32: [[BOX_RAW:%.*]] = bitcast %swift.refcounted* [[BOX]] to [[POD_32_32_LAYOUT:<\{ %swift.refcounted, \[24 x i8\], \[32 x i8\] \}>]]* |
| // CHECK-64: [[BOX_RAW:%.*]] = bitcast %swift.refcounted* [[BOX]] to [[POD_32_32_LAYOUT:<\{ %swift.refcounted, \[16 x i8\], \[32 x i8\] \}>]]* |
| // CHECK: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_32_32_LAYOUT]], [[POD_32_32_LAYOUT]]* [[BOX_RAW]], i32 0, i32 2 |
| // CHECK: [[BOX_DATA_1:%.*]] = bitcast [32 x i8]* [[BOX_DATA]] to %T11typed_boxes11OverAlignedV* |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <OverAligned>, 0 |
| // CHECK: call void @swift_deallocUninitializedObject(%swift.refcounted* [[BOX]], [[WORD]] 64, [[WORD]] 31) |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <OverAligned> |
| return undef : $() |
| } |
| |
| class C {} |
| sil_vtable C {} |
| |
| class D {} |
| sil_vtable D {} |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @rc_box_a |
| sil @rc_box_a : $@convention(thin) () -> () { |
| entry: |
| // CHECK-32: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[NATIVE_RC_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 12, [[WORD]] 3) |
| // CHECK-64: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[NATIVE_RC_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 24, [[WORD]] 7) |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <C> |
| // CHECK: bitcast %swift.refcounted** {{%.*}} to %T11typed_boxes1CC** |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <C>, 0 |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <C> |
| return undef : $() |
| } |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @rc_box_b |
| sil @rc_box_b : $@convention(thin) () -> () { |
| entry: |
| // TODO: Should reuse metadata |
| // CHECK-32: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[NATIVE_RC_METADATA]], {{.*}} [[WORD]] 12, [[WORD]] 3) |
| // CHECK-64: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[NATIVE_RC_METADATA]], {{.*}} [[WORD]] 24, [[WORD]] 7) |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <D> |
| // CHECK: bitcast %swift.refcounted** {{%.*}} to %T11typed_boxes1DC** |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <D>, 0 |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <D> |
| return undef : $() |
| } |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @unknown_rc_box |
| sil @unknown_rc_box : $@convention(thin) () -> () { |
| entry: |
| // CHECK-32: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[UNKNOWN_RC_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 12, [[WORD]] 3) |
| // CHECK-64: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[UNKNOWN_RC_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 24, [[WORD]] 7) |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <Builtin.UnknownObject> |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.UnknownObject>, 0 |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.UnknownObject> |
| return undef : $() |
| } |
| |
| struct Fixed { |
| var c: C |
| var d: D |
| var i: Builtin.Int64 |
| } |
| |
| sil @fixed_box : $@convention(thin) () -> () { |
| entry: |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <Fixed> |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <Fixed>, 0 |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <Fixed> |
| return undef : $() |
| } |
| |
| struct Dyn<T> { |
| var c: C |
| var d: D |
| var x: T |
| } |
| |
| sil @take_dyn : $@convention(thin) <T> (@in Dyn<T>) -> () |
| sil @take_t : $@convention(thin) <T> (@in T) -> () |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @dyn_box_a |
| sil @dyn_box_a : $@convention(thin) <T> () -> () { |
| entry: |
| // CHECK: [[METADATA:%.*]] = call %swift.type* @"$S11typed_boxes3DynVMa"(%swift.type* %T) |
| // CHECK: [[ALLOC:%.*]] = call swiftcc { %swift.refcounted*, %swift.opaque* } @swift_allocBox(%swift.type* [[METADATA]]) |
| // CHECK: [[BOX:%.*]] = extractvalue { %swift.refcounted*, %swift.opaque* } [[ALLOC]], 0 |
| // CHECK: [[PTR:%.*]] = extractvalue { %swift.refcounted*, %swift.opaque* } [[ALLOC]], 1 |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <Dyn<T>> |
| // CHECK: [[CAST_PTR:%.*]] = bitcast %swift.opaque* [[PTR]] to %T11typed_boxes3DynV* |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <Dyn<T>>, 0 |
| %f = function_ref @take_dyn : $@convention(thin) <T> (@in Dyn<T>) -> () |
| // CHECK: call swiftcc void @take_dyn(%T11typed_boxes3DynV* {{[^,]*}} [[CAST_PTR]], {{.*}}) |
| %t = apply %f<T>(%b) : $@convention(thin) <T> (@in Dyn<T>) -> () |
| // CHECK: call void @swift_deallocBox(%swift.refcounted* [[BOX]]) |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <Dyn<T>> |
| return undef : $() |
| } |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @dyn_box_b |
| sil @dyn_box_b : $@convention(thin) <T> () -> () { |
| entry: |
| // CHECK: [[ALLOC:%.*]] = call swiftcc { %swift.refcounted*, %swift.opaque* } @swift_allocBox(%swift.type* %T) |
| // CHECK: [[BOX:%.*]] = extractvalue { %swift.refcounted*, %swift.opaque* } [[ALLOC]], 0 |
| // CHECK: [[PTR:%.*]] = extractvalue { %swift.refcounted*, %swift.opaque* } [[ALLOC]], 1 |
| %a = alloc_box $<τ_0_0> { var τ_0_0 } <T> |
| %b = project_box %a : $<τ_0_0> { var τ_0_0 } <T>, 0 |
| %f = function_ref @take_t : $@convention(thin) <T> (@in T) -> () |
| // CHECK: call swiftcc void @take_t(%swift.opaque* {{[^,]*}} [[PTR]], {{.*}}) |
| %t = apply %f<T>(%b) : $@convention(thin) <T> (@in T) -> () |
| // CHECK: call void @swift_deallocBox(%swift.refcounted* [[BOX]]) |
| dealloc_box %a : $<τ_0_0> { var τ_0_0 } <T> |
| return undef : $() |
| } |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc i64 @proj_box |
| sil @proj_box : $@convention(thin) (<τ_0_0> { var τ_0_0 } <Builtin.Int64>) -> Builtin.Int64 { |
| entry(%0 : $<τ_0_0> { var τ_0_0 } <Builtin.Int64>): |
| // CHECK: [[BOX_RAW:%.*]] = bitcast %swift.refcounted* %0 to [[POD_8_8_LAYOUT:<\{ %swift.refcounted, \[8 x i8\] \}>]]* |
| // CHECK: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_8_8_LAYOUT]], [[POD_8_8_LAYOUT]]* [[BOX_RAW]], i32 0, i32 1 |
| // CHECK: [[BOX_DATA_1:%.*]] = bitcast [8 x i8]* [[BOX_DATA]] to i64* |
| %p = project_box %0 : $<τ_0_0> { var τ_0_0 } <Builtin.Int64>, 0 |
| // CHECK: [[R:%.*]] = load i64, i64* [[BOX_DATA_1]] |
| %l = load %p : $*Builtin.Int64 |
| // CHECK: ret i64 [[R]] |
| return %l : $Builtin.Int64 |
| } |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @dyn_proj_box_a |
| sil @dyn_proj_box_a : $@convention(thin) <T> (<τ_0_0> { var τ_0_0 } <Dyn<T>>) -> () { |
| entry(%0 : $<τ_0_0> { var τ_0_0 } <Dyn<T>>): |
| // CHECK: [[PTR:%.*]] = call %swift.opaque* @swift_projectBox(%swift.refcounted* %0) |
| // CHECK: [[BOX_DATA_1:%.*]] = bitcast %swift.opaque* [[PTR]] to %T11typed_boxes3DynV* |
| %p = project_box %0 : $<τ_0_0> { var τ_0_0 } <Dyn<T>>, 0 |
| %f = function_ref @take_dyn : $@convention(thin) <T> (@in Dyn<T>) -> () |
| // CHECK: call swiftcc void @take_dyn(%T11typed_boxes3DynV* {{[^,]*}} [[BOX_DATA_1]], {{.*}}) |
| %t = apply %f<T>(%p) : $@convention(thin) <T> (@in Dyn<T>) -> () |
| return undef : $() |
| } |
| |
| |
| // CHECK-LABEL: define{{( protected)?}} swiftcc void @dyn_proj_box_b |
| sil @dyn_proj_box_b : $@convention(thin) <T> (<τ_0_0> { var τ_0_0 } <T>) -> () { |
| entry(%0 : $<τ_0_0> { var τ_0_0 } <T>): |
| // CHECK: [[PTR:%.*]] = call %swift.opaque* @swift_projectBox(%swift.refcounted* %0) |
| %p = project_box %0 : $<τ_0_0> { var τ_0_0 } <T>, 0 |
| %f = function_ref @take_t : $@convention(thin) <T> (@in T) -> () |
| // CHECK: call swiftcc void @take_t(%swift.opaque* {{[^,]*}} [[PTR]], {{.*}}) |
| %t = apply %f<T>(%p) : $@convention(thin) <T> (@in T) -> () |
| return undef : $() |
| } |