blob: cee4979db7f53714328d71bf62e2a8d365b95e2a [file] [log] [blame]
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s
import Builtin
protocol P {}
// CHECK-LABEL: define{{( protected)?}} void @join_init_existential_copy_addr(%P27fixed_size_buffer_peepholes1P_* noalias nocapture sret, %swift.opaque* noalias nocapture, %swift.type* %T, i8** %T.P)
// CHECK: [[BUFFER:%.*]] = getelementptr inbounds %P27fixed_size_buffer_peepholes1P_, %P27fixed_size_buffer_peepholes1P_* %0, i32 0, i32 0
// CHECK: call %swift.opaque* %initializeBufferWithTake([[BUFFER_TYPE:\[.* x i8\]]]* [[BUFFER]], %swift.opaque* %1
sil @join_init_existential_copy_addr : $@convention(thin) <T: P> (@in T) -> @out P {
entry(%p : $*P, %x: $*T):
%y = init_existential_addr %p : $*P, $T
copy_addr [take] %x to [initialization] %y : $*T
return undef : $()
}
// CHECK-LABEL: define{{( protected)?}} void @dont_crash(
// CHECK: [[TYPE_ADDR:%.*]] = getelementptr inbounds %P27fixed_size_buffer_peepholes1P_, %P27fixed_size_buffer_peepholes1P_* %0, i32 0, i32 1
// CHECK: [[TYPE:%.*]] = load %swift.type*, %swift.type** [[TYPE_ADDR]]
// CHECK: [[PTR:%.*]] = bitcast %swift.type* [[TYPE]] to i8***
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[PTR]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], {{(i64|i32)}} 2
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ADDR]]
// CHECK: [[PROJECTBUFFER:%.*]] = bitcast i8* [[WITNESS]]
// CHECK: call %swift.opaque* [[PROJECTBUFFER]](
// CHECK: [[PTR:%.*]] = bitcast %swift.type* [[TYPE]] to i8***
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[PTR]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], {{(i64|i32)}} 5
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ADDR]]
// CHECK: [[INITBUFFERWITHCOPY:%.*]] = bitcast i8* [[WITNESS]] to %swift.opaque* ([{{.*}} x i8]*, %swift.opaque*, %swift.type*)*
// CHECK: call %swift.opaque* [[INITBUFFERWITHCOPY]](
sil @dont_crash : $@convention(thin) (@in P) -> () {
entry(%p : $*P):
%0 = alloc_stack $P
%1 = open_existential_addr %p : $*P to $*@opened("4E4E7668-C798-11E6-9B9F-685B3589058E") P
%2 = init_existential_addr %0 : $*P, $@opened("4E4E7668-C798-11E6-9B9F-685B3589058E") P
copy_addr %1 to [initialization] %2 : $*@opened("4E4E7668-C798-11E6-9B9F-685B3589058E") P
destroy_addr %2 : $*@opened("4E4E7668-C798-11E6-9B9F-685B3589058E") P
deinit_existential_addr %0 : $*P
dealloc_stack %0 : $*P
return undef: $()
}