Skip to content

Commit 8e33487

Browse files
committed
DeinitDevirtualizer: de-virtualize deinits of builtin "destroyArray"
1 parent 49d3960 commit 8e33487

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/DeinitDevirtualizer.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ let deinitDevirtualizer = FunctionPass(name: "deinit-devirtualizer") {
2727
_ = devirtualizeDeinits(of: destroyValue, context)
2828
case let destroyAddr as DestroyAddrInst:
2929
_ = devirtualizeDeinits(of: destroyAddr, context)
30+
case let builtin as BuiltinInst:
31+
_ = devirtualizeDeinits(of: builtin, context)
3032
default:
3133
break
3234
}

test/SILOptimizer/devirt_deinits.sil

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,34 @@ bb0(%0 : $*S1):
304304
return %r : $()
305305
}
306306

307+
// CHECK-LABEL: sil [ossa] @test_destroyArray :
308+
// CHECK: [[ZERO:%.*]] = integer_literal $Builtin.Word, 0
309+
// CHECK: [[ONE:%.*]] = integer_literal $Builtin.Word, 1
310+
// CHECK: [[FALSE:%.*]] = integer_literal $Builtin.Int1, 0
311+
// CHECK: [[PTA:%.*]] = pointer_to_address %0 : $Builtin.RawPointer to [strict] $*S1
312+
// CHECK: br bb1([[ZERO]] : $Builtin.Word)
313+
// CHECK: bb1([[IV:%.*]] : $Builtin.Word):
314+
// CHECK: [[CMP:%.*]] = builtin "cmp_slt_Word"([[IV]] : $Builtin.Word, %1 : $Builtin.Word)
315+
// CHECK: cond_br [[CMP]], bb2, bb3
316+
// CHECK: bb2:
317+
// CHECK: [[ADDR:%.*]] = index_addr [[PTA]] : $*S1, [[IV]]
318+
// CHECK: [[DEINIT:%.*]] = function_ref @s1_deinit :
319+
// CHECK: [[ELEMENT:%.*]] = load [take] [[ADDR]]
320+
// CHECK: apply [[DEINIT]]([[ELEMENT]])
321+
// CHECK: [[ADD:%.*]] = builtin "sadd_with_overflow_Word"([[IV]] : $Builtin.Word, [[ONE]] : $Builtin.Word, [[FALSE]] : $Builtin.Int1)
322+
// CHECK: [[INCR:%.*]] = tuple_extract [[ADD]] : $(Builtin.Word, Builtin.Int1), 0
323+
// CHECK: br bb1([[INCR]] : $Builtin.Word)
324+
// CHECKL bb3:
325+
// CHECK: } // end sil function 'test_destroyArray'
326+
sil [ossa] @test_destroyArray : $@convention(thin) (Builtin.RawPointer, Builtin.Word) -> () {
327+
bb0(%0 : $Builtin.RawPointer, %1 : $Builtin.Word):
328+
%2 = metatype $@thin S1.Type // user: %10
329+
%3 = builtin "destroyArray"<S1>(%2, %0, %1) : $()
330+
%r = tuple ()
331+
return %r
332+
}
333+
334+
307335
sil @s1_deinit : $@convention(method) (@owned S1) -> ()
308336
sil @s2_deinit : $@convention(method) (@owned S2) -> ()
309337
sil @s3_deinit : $@convention(method) <T> (@in S3<T>) -> ()

test/SILOptimizer/devirt_deinits.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ struct S3: ~Copyable {
5151
}
5252
}
5353

54+
struct S4: ~Copyable {
55+
var x: Int
56+
57+
@inline(never)
58+
deinit {
59+
print(x)
60+
}
61+
}
62+
63+
5464
enum EnumWithDeinit: ~Copyable {
5565
case A(Int)
5666
case B
@@ -136,6 +146,18 @@ func testNestedDeinit(_ s: consuming S3) {
136146
log("### testNestedDeinit")
137147
}
138148

149+
// CHECK-LABEL: sil hidden [noinline] @$s4test0A12DestroyArrayyySryAA2S4VGF :
150+
// CHECK-NOT: "destroyArray"
151+
// CHECK: [[D:%.*]] = function_ref @$s4test2S4VfD :
152+
// CHECK: apply [[D]]
153+
// CHECK-NOT: "destroyArray"
154+
// CHECK: } // end sil function '$s4test0A12DestroyArrayyySryAA2S4VGF'
155+
@inline(never)
156+
func testDestroyArray(_ p: UnsafeMutableBufferPointer<S4>) {
157+
p.deinitialize()
158+
}
159+
160+
139161
@main
140162
struct Main {
141163
static func main() {
@@ -182,6 +204,21 @@ struct Main {
182204
// CHECK-OUTPUT-NEXT: ---
183205
testNestedDeinit(S3())
184206
log("---")
207+
208+
let b = UnsafeMutableBufferPointer<S4>.allocate(capacity: 3)
209+
for i in 0..<3 {
210+
b.initializeElement(at: i, to: S4(x: i))
211+
}
212+
213+
// CHECK-OUTPUT-LABEL: ### testDestroyArray
214+
// CHECK-OUTPUT-NEXT: 0
215+
// CHECK-OUTPUT-NEXT: 1
216+
// CHECK-OUTPUT-NEXT: 2
217+
// CHECK-OUTPUT-NEXT: ---
218+
log("### testDestroyArray")
219+
testDestroyArray(b)
220+
b.deallocate()
221+
log("---")
185222
}
186223
}
187224

0 commit comments

Comments
 (0)