1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
// 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 ptr @swift_allocObject(ptr {{.*}} [[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_DATA:%.*]] = getelementptr inbounds [[POD_8_8_LAYOUT:<\{ %swift.refcounted, \[8 x i8\] \}>]], ptr [[BOX]], i32 0, i32 1
%b = project_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.Int64>, 0
// CHECK: call void @swift_deallocUninitializedObject(ptr [[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 ptr @swift_allocObject(ptr {{.*}} [[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_DATA:%.*]] = getelementptr inbounds [[POD_8_8_LAYOUT]], ptr [[BOX]], i32 0, i32 1
%b = project_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.FPIEEE64>, 0
// CHECK: call void @swift_deallocUninitializedObject(ptr [[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 ptr @swift_allocObject(ptr {{.*}} [[POD_32_16_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 48, [[WORD]] 15)
%a = alloc_box $<τ_0_0> { var τ_0_0 } <OverAligned>
// CHECK-32: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_32_16_LAYOUT:<\{ %swift.refcounted, \[8 x i8\], \[32 x i8\] \}>]], ptr [[BOX]], i32 0, i32 2
%b = project_box %a : $<τ_0_0> { var τ_0_0 } <OverAligned>, 0
// CHECK: call void @swift_deallocUninitializedObject(ptr [[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 ptr @swift_allocObject(ptr {{.*}} [[NATIVE_RC_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 12, [[WORD]] 3)
// CHECK-64: [[BOX:%.*]] = call noalias ptr @swift_allocObject(ptr {{.*}} [[NATIVE_RC_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 24, [[WORD]] 7)
%a = alloc_box $<τ_0_0> { var τ_0_0 } <C>
%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 ptr @swift_allocObject(ptr {{.*}} [[NATIVE_RC_METADATA]], {{.*}} [[WORD]] 12, [[WORD]] 3)
// CHECK-64: [[BOX:%.*]] = call noalias ptr @swift_allocObject(ptr {{.*}} [[NATIVE_RC_METADATA]], {{.*}} [[WORD]] 24, [[WORD]] 7)
%a = alloc_box $<τ_0_0> { var τ_0_0 } <D>
%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 ptr @swift_allocObject(ptr {{.*}} [[UNKNOWN_RC_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 12, [[WORD]] 3)
// CHECK-64: [[BOX:%.*]] = call noalias ptr @swift_allocObject(ptr {{.*}} [[UNKNOWN_RC_METADATA:@metadata[0-9.]*]], {{.*}} [[WORD]] 24, [[WORD]] 7)
%a = alloc_box $<τ_0_0> { var τ_0_0 } <Builtin.AnyObject>
%b = project_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.AnyObject>, 0
dealloc_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.AnyObject>
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, ptr %T)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: [[ALLOC:%.*]] = call swiftcc { ptr, ptr } @swift_allocBox(ptr [[METADATA]])
// CHECK: [[BOX:%.*]] = extractvalue { ptr, ptr } [[ALLOC]], 0
// CHECK: [[PTR:%.*]] = extractvalue { ptr, ptr } [[ALLOC]], 1
%a = alloc_box $<τ_0_0> { var τ_0_0 } <Dyn<T>>
%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(ptr {{[^,]*}} [[PTR]], {{.*}})
%t = apply %f<T>(%b) : $@convention(thin) <T> (@in Dyn<T>) -> ()
// CHECK: call void @swift_deallocBox(ptr [[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 { ptr, ptr } @swift_allocBox(ptr %T)
// CHECK: [[BOX:%.*]] = extractvalue { ptr, ptr } [[ALLOC]], 0
// CHECK: [[PTR:%.*]] = extractvalue { ptr, ptr } [[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(ptr {{[^,]*}} [[PTR]], {{.*}})
%t = apply %f<T>(%b) : $@convention(thin) <T> (@in T) -> ()
// CHECK: call void @swift_deallocBox(ptr [[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_DATA:%.*]] = getelementptr inbounds [[POD_8_8_LAYOUT]], ptr %0, i32 0, i32 1
%p = project_box %0 : $<τ_0_0> { var τ_0_0 } <Builtin.Int64>, 0
// CHECK: [[R:%.*]] = load i64, ptr [[BOX_DATA]]
%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 ptr @swift_projectBox(ptr %0)
%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(ptr {{[^,]*}} [[PTR]], {{.*}})
%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 ptr @swift_projectBox(ptr %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(ptr {{[^,]*}} [[PTR]], {{.*}})
%t = apply %f<T>(%p) : $@convention(thin) <T> (@in T) -> ()
return undef : $()
}
|