Skip to content

Commit 333358a

Browse files
committed
Enable copy elimination of captures for all types in ClosureLifetimeFixup
rdar://130026658
1 parent 4dfc1c0 commit 333358a

File tree

5 files changed

+43
-30
lines changed

5 files changed

+43
-30
lines changed

lib/SILOptimizer/Mandatory/ClosureLifetimeFixup.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -760,14 +760,7 @@ static SILValue tryRewriteToPartialApplyStack(
760760
LLVM_DEBUG(llvm::dbgs() << "-- not an alloc_stack\n");
761761
continue;
762762
}
763-
764-
// This would be a nice optimization to attempt for all types, but for now,
765-
// limit the effect to move-only types.
766-
if (!copy->getType().isMoveOnly()) {
767-
LLVM_DEBUG(llvm::dbgs() << "-- not move-only\n");
768-
continue;
769-
}
770-
763+
771764
// Is the capture a borrow?
772765

773766
auto paramIndex = i + appliedArgStartIdx;

test/SILOptimizer/closure-lifetime-fixup.sil

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,22 +267,16 @@ bb3:
267267

268268
// CHECK-LABEL: sil [ossa] @test_alloc_stack_arg_with_frontier_outside_try_apply_successors : $@convention(thin) <Self> (@in_guaranteed Self) -> @error any Error {
269269
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] :
270-
// CHECK: [[STACK:%[^,]+]] = alloc_stack $Self
271270
// CHECK: try_apply undef() {{.*}}, normal [[SUCCESS_1:bb[0-9]+]], error [[FAILURE_1:bb[0-9]+]]
272271
// CHECK: [[SUCCESS_1]]
273-
// CHECK: copy_addr [[INSTANCE]] to [init] [[STACK]] : $*Self, {{.*}} scope [[STACK_SCOPE:[0-9]+]]
274-
// CHECK: [[CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] undef<Self>([[STACK]])
275-
// CHECK: [[DEPENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[CLOSURE]] {{.*}} on [[STACK]]
272+
// CHECK: [[CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] undef<Self>([[INSTANCE]])
273+
// CHECK: [[DEPENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[CLOSURE]] {{.*}} on [[INSTANCE]]
276274
// CHECK: try_apply undef([[DEPENDENCY]]) {{.*}}, normal [[SUCCESS_2:bb[0-9]+]], error [[FAILURE_2:bb[0-9]+]]
277275
// CHECK: [[SUCCESS_2]]
278276
// CHECK: destroy_value [[DEPENDENCY]]
279-
// CHECK: destroy_addr [[STACK]]
280-
// CHECK: dealloc_stack [[STACK]] : $*Self, {{.*}} scope [[STACK_SCOPE]]
281277
// CHECK: [[FAILURE_1]]
282-
// CHECK: dealloc_stack [[STACK]] : $*Self, {{.*}} scope [[STACK_SCOPE]]
283278
// CHECK: throw
284279
// CHECK: [[FAILURE_2]]
285-
// CHECK-NOT: dealloc_stack
286280
// CHECK: unreachable
287281
// CHECK-LABEL: } // end sil function 'test_alloc_stack_arg_with_frontier_outside_try_apply_successors'
288282
sil [ossa] @test_alloc_stack_arg_with_frontier_outside_try_apply_successors : $@convention(thin) <Self> (@in_guaranteed Self) -> (@error any Error) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// RUN: %target-swift-frontend -emit-sil %s -O| %FileCheck %s
2+
3+
public enum Foo {
4+
case bar
5+
case baz(Int)
6+
}
7+
8+
public protocol Frob {
9+
func foo(_ x: Int) -> Foo
10+
}
11+
12+
public struct Nicate {
13+
public var frob: any Frob
14+
public var isInitializing: Bool
15+
16+
// CHECK-LABEL: sil @$s31closure_lifetime_fixup_copyelim6NicateV4slowyS2iF :
17+
// CHECK-NOT: copy_addr
18+
// CHECK-LABEL: } // end sil function '$s31closure_lifetime_fixup_copyelim6NicateV4slowyS2iF'
19+
public func slow(_ x: Int) -> Int {
20+
let foo = frob.foo(x)
21+
switch foo {
22+
case .bar:
23+
return 10
24+
case .baz(let y):
25+
if y == 0 && isInitializing {
26+
return foos[x]
27+
} else {
28+
return y
29+
}
30+
}
31+
}
32+
}
33+
34+
private let foos = [1, 2, 3]

test/SILOptimizer/moveonly_closure_lifetime_fixup_address_only_borrowed_captures.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ func borrow<T>(_: borrowing E<T>) {}
2121
func borrow<T>(_: borrowing C<T>) {}
2222

2323
func testMultiCapture<T>(_ e: borrowing E<T>, _ c: C<T>) {
24-
// CHECK: [[C_STK:%.*]] = alloc_stack $C<T>
25-
// CHECK: copy_addr %1 to [init] [[C_STK]] : $*C<T>
26-
// CHECK: partial_apply {{.*}}[on_stack] {{.*}}([[C_STK]], %0) :
24+
// CHECK: partial_apply {{.*}}[on_stack] {{.*}}(%1, %0) :
2725
nonescaping {
2826
borrow(c)
2927
borrow(e)

test/SILOptimizer/opaque_values_Onone.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,10 @@ func doit<T>(_ f: () -> T) -> T {
6868
}
6969
// CHECK-LABEL: sil hidden @duplicate1 : {{.*}} {
7070
// CHECK: {{bb[0-9]+}}({{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, [[INSTANCE_ADDR_IN:%[^,]+]] : $*Value):
71-
// CHECK: [[INSTANCE_ADDR:%[^,]+]] = alloc_stack $Value
7271
// CHECK: [[OUTPUT_TUPLE_ADDR:%[^,]+]] = alloc_stack $(Value, Value)
7372
// CHECK: [[DUPLICATE_CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone10duplicate15valuex_xtx_tlFx_xtyXEfU_
74-
// CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
75-
// CHECK: [[DUPLICATE_INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[DUPLICATE_CLOSURE]]<Value>([[INSTANCE_ADDR]])
76-
// CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (Value, Value) on [[INSTANCE_ADDR]] : $*Value
73+
// CHECK: [[DUPLICATE_INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[DUPLICATE_CLOSURE]]<Value>([[INSTANCE_ADDR_IN]])
74+
// CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (Value, Value) on [[INSTANCE_ADDR_IN]] : $*Value
7775
// CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENDENCY]]
7876
// CHECK: apply {{%[^,]+}}<(Value, Value)>([[OUTPUT_TUPLE_ADDR]], [[CONVERTED]])
7977
// CHECK-LABEL: } // end sil function 'duplicate1'
@@ -92,12 +90,10 @@ func duplicate1<Value>(value: Value) -> (Value, Value) {
9290
}
9391
// CHECK-LABEL: sil hidden @duplicate2 : {{.*}} {
9492
// CHECK: {{bb[0-9]+}}({{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, [[INSTANCE_ADDR_IN:%[^,]+]] : $*Value):
95-
// CHECK: [[INSTANCE_ADDR:%[^,]+]] = alloc_stack $Value
9693
// CHECK: [[OUTPUT_TUPLE_ADDR:%[^,]+]] = alloc_stack $(one: Value, two: Value)
9794
// CHECK: [[DUPLICATE_CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone10duplicate25valuex3one_x3twotx_tlFxAD_xAEtyXEfU_
98-
// CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
99-
// CHECK: [[DUPLICATE_INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[DUPLICATE_CLOSURE]]<Value>([[INSTANCE_ADDR]])
100-
// CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (one: Value, two: Value) on [[INSTANCE_ADDR]] : $*Value
95+
// CHECK: [[DUPLICATE_INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[DUPLICATE_CLOSURE]]<Value>([[INSTANCE_ADDR_IN]])
96+
// CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (one: Value, two: Value) on [[INSTANCE_ADDR_IN]] : $*Value
10197
// CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENDENCY]]
10298
// CHECK: apply {{%[^,]+}}<(one: Value, two: Value)>([[OUTPUT_TUPLE_ADDR]], [[CONVERTED]])
10399
// CHECK-LABEL: } // end sil function 'duplicate2'
@@ -129,10 +125,8 @@ func duplicate_with_int2<Value>(value: Value) -> ((Value, Value), Int) {
129125

130126
// CHECK-LABEL: sil hidden @duplicate_with_int3 : {{.*}} {
131127
// CHECK: {{bb[0-9]+}}({{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, [[INSTANCE_ADDR_IN:%[^,]+]] : $*Value):
132-
// CHECK: [[INSTANCE_ADDR:%[^,]+]] = alloc_stack $Value
133128
// CHECK: [[CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone19duplicate_with_int35valueSi_x_x_x_SitxttSitx_tlFSi_x_x_x_SitxttSityXEfU_
134-
// CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
135-
// CHECK: [[INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[CLOSURE]]<Value>([[INSTANCE_ADDR]])
129+
// CHECK: [[INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[CLOSURE]]<Value>([[INSTANCE_ADDR_IN]])
136130
// CHECK: [[DEPENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[INSTANCE_CLOSURE]]
137131
// CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENCY]]
138132
// CHECK: apply {{%[^,]+}}<(Int, (Value, (Value, (Value, Int), Value)), Int)>({{%[^,]+}}, [[CONVERTED]])

0 commit comments

Comments
 (0)