| // 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: $() |
| } |