Skip to content

Commit 2e82db8

Browse files
committed
ClosureLifetimeFixup; emit mark_dependence [nonescaping].
It is safe to do so because the on_stack transformation already checks that the closure has a single known apply use.
1 parent e77fff3 commit 2e82db8

File tree

4 files changed

+11
-6
lines changed

4 files changed

+11
-6
lines changed

lib/SILOptimizer/Mandatory/ClosureLifetimeFixup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ static SILValue insertMarkDependenceForCapturedArguments(PartialApplyInst *pai,
406406
if (m->hasGuaranteedInitialKind())
407407
continue;
408408
curr = b.createMarkDependence(pai->getLoc(), curr, arg.get(),
409-
MarkDependenceKind::Escaping);
409+
MarkDependenceKind::NonEscaping);
410410
}
411411

412412
return curr;

lib/SILOptimizer/Utils/LoopUtils.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,12 @@ bool swift::canDuplicateLoopInstruction(SILLoop *L, SILInstruction *I) {
260260
return false;
261261
}
262262
}
263-
263+
// Like partial_apply [onstack], mark_dependence [nonescaping] creates a
264+
// borrow scope. We currently assume that a set of dominated scope-ending uses
265+
// can be found.
266+
if (auto *MD = dyn_cast<MarkDependenceInst>(I)) {
267+
return !MD->isNonEscaping();
268+
}
264269
// CodeGen can't build ssa for objc methods.
265270
if (auto *Method = dyn_cast<MethodInst>(I)) {
266271
if (Method->getMember().isForeign) {

test/SILOptimizer/closure-lifetime-fixup.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ bb3:
272272
// CHECK: [[SUCCESS_1]]
273273
// CHECK: copy_addr [[INSTANCE]] to [init] [[STACK]] : $*Self, {{.*}} scope [[STACK_SCOPE:[0-9]+]]
274274
// CHECK: [[CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] undef<Self>([[STACK]])
275-
// CHECK: [[DEPENDENCY:%[^,]+]] = mark_dependence [[CLOSURE]] {{.*}} on [[STACK]]
275+
// CHECK: [[DEPENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[CLOSURE]] {{.*}} on [[STACK]]
276276
// CHECK: try_apply undef([[DEPENDENCY]]) {{.*}}, normal [[SUCCESS_2:bb[0-9]+]], error [[FAILURE_2:bb[0-9]+]]
277277
// CHECK: [[SUCCESS_2]]
278278
// CHECK: destroy_value [[DEPENDENCY]]

test/SILOptimizer/opaque_values_Onone.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func doit<T>(_ f: () -> T) -> T {
7373
// CHECK: [[DUPLICATE_CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone10duplicate15valuex_xtx_tlFx_xtyXEfU_
7474
// CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
7575
// CHECK: [[DUPLICATE_INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[DUPLICATE_CLOSURE]]<Value>([[INSTANCE_ADDR]])
76-
// CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (Value, Value) on [[INSTANCE_ADDR]] : $*Value
76+
// CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (Value, Value) on [[INSTANCE_ADDR]] : $*Value
7777
// CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENDENCY]]
7878
// CHECK: apply {{%[^,]+}}<(Value, Value)>([[OUTPUT_TUPLE_ADDR]], [[CONVERTED]])
7979
// CHECK-LABEL: } // end sil function 'duplicate1'
@@ -97,7 +97,7 @@ func duplicate1<Value>(value: Value) -> (Value, Value) {
9797
// CHECK: [[DUPLICATE_CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone10duplicate25valuex3one_x3twotx_tlFxAD_xAEtyXEfU_
9898
// CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
9999
// CHECK: [[DUPLICATE_INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[DUPLICATE_CLOSURE]]<Value>([[INSTANCE_ADDR]])
100-
// CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (one: Value, two: Value) on [[INSTANCE_ADDR]] : $*Value
100+
// CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (one: Value, two: Value) on [[INSTANCE_ADDR]] : $*Value
101101
// CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENDENCY]]
102102
// CHECK: apply {{%[^,]+}}<(one: Value, two: Value)>([[OUTPUT_TUPLE_ADDR]], [[CONVERTED]])
103103
// CHECK-LABEL: } // end sil function 'duplicate2'
@@ -133,7 +133,7 @@ func duplicate_with_int2<Value>(value: Value) -> ((Value, Value), Int) {
133133
// CHECK: [[CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone19duplicate_with_int35valueSi_x_x_x_SitxttSitx_tlFSi_x_x_x_SitxttSityXEfU_
134134
// CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
135135
// CHECK: [[INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[CLOSURE]]<Value>([[INSTANCE_ADDR]])
136-
// CHECK: [[DEPENDENCY:%[^,]+]] = mark_dependence [[INSTANCE_CLOSURE]]
136+
// CHECK: [[DEPENDENCY:%[^,]+]] = mark_dependence [nonescaping] [[INSTANCE_CLOSURE]]
137137
// CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENCY]]
138138
// CHECK: apply {{%[^,]+}}<(Int, (Value, (Value, (Value, Int), Value)), Int)>({{%[^,]+}}, [[CONVERTED]])
139139
// CHECK-LABEL: } // end sil function 'duplicate_with_int3'

0 commit comments

Comments
 (0)