blob: d3b7992f32097b3accba28e772db893cdcb05af0 [file] [log] [blame]
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
sil_stage canonical
import Builtin
// CHECK-LABEL: define{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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(16)
struct OverAligned {
var x, y, z, w: Builtin.Int64
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @pod_box_32_16
sil @pod_box_32_16 : $@convention(thin) () -> () {
entry:
// CHECK: [[BOX:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* {{.*}} [[POD_32_16_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 48, [[WORD]] 15)
%a = alloc_box $_0_0> { var τ_0_0 } <OverAligned>
// CHECK-32: [[BOX_RAW:%.*]] = bitcast %swift.refcounted* [[BOX]] to [[POD_32_16_LAYOUT:<\{ %swift.refcounted, \[8 x i8\], \[32 x i8\] \}>]]*
// CHECK-32: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_32_16_LAYOUT]], [[POD_32_16_LAYOUT]]* [[BOX_RAW]], i32 0, i32 2
// CHECK-64: [[BOX_RAW:%.*]] = bitcast %swift.refcounted* [[BOX]] to [[POD_32_16_LAYOUT:<\{ %swift.refcounted, \[32 x i8\] \}>]]*
// CHECK-64: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_32_16_LAYOUT]], [[POD_32_16_LAYOUT]]* [[BOX_RAW]], i32 0, i32 1
// 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]] 48, [[WORD]] 15)
dealloc_box %a : $_0_0> { var τ_0_0 } <OverAligned>
return undef : $()
}
class C {}
sil_vtable C {}
class D {}
sil_vtable D {}
// CHECK-LABEL: define{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( protected)?}} swiftcc void @dyn_box_a
sil @dyn_box_a : $@convention(thin) <T> () -> () {
entry:
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s11typed_boxes3DynVMa"([[INT]] 0, %swift.type* %T)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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{{( dllexport)?}}{{( 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 : $()
}