|
| 1 | +// RUN: %target-swift-emit-irgen -O \ |
| 2 | +// RUN: -parse-sil \ |
| 3 | +// RUN: -disable-type-layout \ |
| 4 | +// RUN: %s \ |
| 5 | +// RUN: -enable-experimental-feature RawLayout \ |
| 6 | +// RUN: | \ |
| 7 | +// RUN: %IRGenFileCheck %s |
| 8 | + |
| 9 | +import Builtin |
| 10 | +import Swift |
| 11 | + |
| 12 | +@usableFromInline |
| 13 | +@frozen @_rawLayout(like: Value, movesAsLike) internal struct _Cell<Value> : ~Copyable where Value : ~Copyable { |
| 14 | + @_alwaysEmitIntoClient @inlinable deinit |
| 15 | +} |
| 16 | + |
| 17 | +sil @$sSp12deinitialize5countSvSi_tF : $@convention(method) <τ_0_0 where τ_0_0 : ~Copyable> (Int, UnsafeMutablePointer<τ_0_0>) -> UnsafeMutableRawPointer |
| 18 | + |
| 19 | +// CHECK-LABEL: define swiftcc void @"$s15Synchronization5_CellVAARi_zrlEfD"( |
| 20 | +// CHECK-SAME: ptr %"_Cell<Value>", |
| 21 | +// CHECK-SAME: ptr noalias swiftself [[SOURCE:%[0-9]+]] |
| 22 | +// CHECK-SAME: ) |
| 23 | +// CHECK-SAME: { |
| 24 | +// CHECK: entry: |
| 25 | +// CHECK: [[CELL_VWT_ADDR:%[^,]+]] = getelementptr inbounds ptr, ptr %"_Cell<Value>", i64 -1 |
| 26 | +// CHECK: %"_Cell<Value>.valueWitnesses" = load ptr, ptr [[CELL_VWT_ADDR]] |
| 27 | +// CHECK: [[CELL_SIZE_ADDR:%[^,]+]] = getelementptr inbounds %swift.vwtable, ptr %"_Cell<Value>.valueWitnesses", i32 0, i32 8 |
| 28 | +// CHECK: %size = load i64, ptr [[CELL_SIZE_ADDR]] |
| 29 | +// CHECK: [[DEST:%[^,]+]] = alloca i8, i64 %size |
| 30 | +// CHECK: call void @llvm.lifetime.start.p0(i64 -1, ptr [[DEST]]) |
| 31 | +// CHECK: [[VALUE_METADATA_ADDR:%[^,]+]] = getelementptr inbounds ptr, ptr %"_Cell<Value>", i64 2 |
| 32 | +// CHECK: %Value = load ptr, ptr [[VALUE_METADATA_ADDR]] |
| 33 | +// CHECK: [[VALUE_VWT_ADDR:%[^,]+]] = getelementptr inbounds ptr, ptr %Value, i64 -1 |
| 34 | +// CHECK: %Value.valueWitnesses = load ptr, ptr [[VALUE_VWT_ADDR]] |
| 35 | +// CHECK: [[VALUE_INIT_WITH_TAKE_ADDR:%[^,]+]] = getelementptr inbounds ptr, ptr %Value.valueWitnesses, i32 4 |
| 36 | +// CHECK: %InitializeWithTake = load ptr, ptr [[VALUE_INIT_WITH_TAKE_ADDR]] |
| 37 | +// CHECK: call ptr %InitializeWithTake(ptr noalias [[DEST]], ptr noalias [[SOURCE]], ptr %Value) |
| 38 | +// CHECK: call swiftcc ptr @"$sSp12deinitialize5countSvSi_tF"(i64 1, ptr [[DEST]], ptr %Value) |
| 39 | +// CHECK: call void @llvm.lifetime.end.p0(i64 -1, ptr [[DEST]]) |
| 40 | +// CHECK: } |
| 41 | +sil @$s15Synchronization5_CellVAARi_zrlEfD : $@convention(method) <Value where Value : ~Copyable> (@in _Cell<Value>) -> () { |
| 42 | +bb0(%0 : $*_Cell<Value>): |
| 43 | + %1 = alloc_stack $_Cell<Value> |
| 44 | + copy_addr [take] %0 to [init] %1 : $*_Cell<Value> |
| 45 | + %7 = builtin "addressOfRawLayout"<_Cell<Value>>(%1 : $*_Cell<Value>) : $Builtin.RawPointer |
| 46 | + %8 = struct $UnsafeMutablePointer<Value> (%7 : $Builtin.RawPointer) |
| 47 | + %9 = integer_literal $Builtin.Int64, 1 |
| 48 | + %10 = struct $Int (%9 : $Builtin.Int64) |
| 49 | + %11 = function_ref @$sSp12deinitialize5countSvSi_tF : $@convention(method) <τ_0_0 where τ_0_0 : ~Copyable> (Int, UnsafeMutablePointer<τ_0_0>) -> UnsafeMutableRawPointer |
| 50 | + %12 = apply %11<Value>(%10, %8) : $@convention(method) <τ_0_0 where τ_0_0 : ~Copyable> (Int, UnsafeMutablePointer<τ_0_0>) -> UnsafeMutableRawPointer |
| 51 | + %13 = tuple () |
| 52 | + dealloc_stack %1 : $*_Cell<Value> |
| 53 | + return %13 : $() |
| 54 | +} |
0 commit comments