Skip to content

Commit 23a0422

Browse files
committed
[CallerAnalysis] foundAllCallers reqs nonexternal.
Previously, CallerAnalysis::FunctionInfo.foundAllCallers(), which is documented to return true only when specialization of a function will not require a thunk, returned true for functions which are possibly used externally. Now, that member function only returns false for functions which may be used externally since dead code elimination will not be able to remove them.
1 parent c99f12f commit 23a0422

File tree

3 files changed

+28
-21
lines changed

3 files changed

+28
-21
lines changed

include/swift/SILOptimizer/Analysis/CallerAnalysis.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,10 @@ class CallerAnalysis::FunctionInfo {
278278
/// visibility of a protocol conformance or class.
279279
bool mayHaveIndirectCallers : 1;
280280

281+
/// Whether the function is sufficiently visible to be called by a different
282+
/// module.
283+
bool mayHaveExternalCallers : 1;
284+
281285
public:
282286
FunctionInfo(SILFunction *f);
283287

@@ -289,7 +293,8 @@ class CallerAnalysis::FunctionInfo {
289293
/// function (e.g. a specialized function) without needing to introduce a
290294
/// thunk since we can rewrite all of the callers to call the new function.
291295
bool foundAllCallers() const {
292-
return hasOnlyCompleteDirectCallerSets() && !mayHaveIndirectCallers;
296+
return hasOnlyCompleteDirectCallerSets() && !mayHaveIndirectCallers &&
297+
!mayHaveExternalCallers;
293298
}
294299

295300
/// Returns true if this function has at least one direct caller.

lib/SILOptimizer/Analysis/CallerAnalysis.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ CallerAnalysis::FunctionInfo::FunctionInfo(SILFunction *f)
3333
// TODO: Make this more aggressive by considering
3434
// final/visibility/etc.
3535
mayHaveIndirectCallers(f->getDynamicallyReplacedFunction() ||
36-
canBeCalledIndirectly(f->getRepresentation())) {}
36+
canBeCalledIndirectly(f->getRepresentation())),
37+
mayHaveExternalCallers(f->isPossiblyUsedExternally() ||
38+
f->isAvailableExternally()) {}
3739

3840
//===----------------------------------------------------------------------===//
3941
// CallerAnalysis::ApplySiteFinderVisitor

test/SILOptimizer/caller_analysis.sil

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Builtin
1212
// CHECK-NEXT: partialAppliers:
1313
// CHECK-NEXT: fullAppliers:
1414
// CHECK-NEXT: ...
15-
sil hidden @dead_func : $@convention(thin) () -> () {
15+
sil private @dead_func : $@convention(thin) () -> () {
1616
%2 = tuple ()
1717
return %2 : $()
1818
}
@@ -25,7 +25,7 @@ sil hidden @dead_func : $@convention(thin) () -> () {
2525
// CHECK-NEXT: partialAppliers:
2626
// CHECK-NEXT: fullAppliers:
2727
// CHECK-NEXT: ...
28-
sil hidden @call_top : $@convention(thin) () -> () {
28+
sil private @call_top : $@convention(thin) () -> () {
2929
bb0:
3030
%0 = function_ref @call_middle : $@convention(thin) () -> ()
3131
%1 = apply %0() : $@convention(thin) () -> ()
@@ -42,7 +42,7 @@ bb0:
4242
// CHECK-NEXT: fullAppliers:
4343
// CHECK-NEXT: - call_top
4444
// CHECK-NEXT: ...
45-
sil hidden @call_middle : $@convention(thin) () -> () {
45+
sil private @call_middle : $@convention(thin) () -> () {
4646
bb0:
4747
%0 = function_ref @call_bottom : $@convention(thin) () -> ()
4848
%1 = apply %0() : $@convention(thin) () -> ()
@@ -59,7 +59,7 @@ bb0:
5959
// CHECK-NEXT: fullAppliers:
6060
// CHECK-NEXT: - call_middle
6161
// CHECK-NEXT: ...
62-
sil hidden @call_bottom : $@convention(thin) () -> () {
62+
sil private @call_bottom : $@convention(thin) () -> () {
6363
bb0:
6464
%0 = tuple ()
6565
return %0 : $()
@@ -74,7 +74,7 @@ bb0:
7474
// CHECK-NEXT: fullAppliers:
7575
// CHECK-NEXT: - self_recursive_func
7676
// CHECK-NEXT: ...
77-
sil hidden @self_recursive_func : $@convention(thin) () -> () {
77+
sil private @self_recursive_func : $@convention(thin) () -> () {
7878
bb0:
7979
%0 = function_ref @self_recursive_func : $@convention(thin) () -> ()
8080
%1 = apply %0() : $@convention(thin) () -> ()
@@ -91,7 +91,7 @@ bb0:
9191
// CHECK-NEXT: fullAppliers:
9292
// CHECK-NEXT: - mutual_recursive_func2
9393
// CHECK-NEXT: ...
94-
sil hidden @mutual_recursive_func1 : $@convention(thin) () -> () {
94+
sil private @mutual_recursive_func1 : $@convention(thin) () -> () {
9595
bb0:
9696
%0 = function_ref @mutual_recursive_func2 : $@convention(thin) () -> ()
9797
%1 = apply %0() : $@convention(thin) () -> ()
@@ -108,7 +108,7 @@ bb0:
108108
// CHECK-NEXT: fullAppliers:
109109
// CHECK-NEXT: - mutual_recursive_func1
110110
// CHECK-NEXT: ...
111-
sil hidden @mutual_recursive_func2 : $@convention(thin) () -> () {
111+
sil private @mutual_recursive_func2 : $@convention(thin) () -> () {
112112
bb0:
113113
%0 = function_ref @mutual_recursive_func1 : $@convention(thin) () -> ()
114114
%1 = apply %0() : $@convention(thin) () -> ()
@@ -125,7 +125,7 @@ bb0:
125125
// CHECK-NEXT: fullAppliers:
126126
// CHECK-NEXT: - multi_calles
127127
// CHECK-NEXT: ...
128-
sil hidden @multi_called : $@convention(thin) () -> () {
128+
sil private @multi_called : $@convention(thin) () -> () {
129129
bb0:
130130
%2 = tuple ()
131131
return %2 : $()
@@ -139,7 +139,7 @@ bb0:
139139
// CHECK-NEXT: partialAppliers:
140140
// CHECK-NEXT: fullAppliers:
141141
// CHECK-NEXT: ...
142-
sil hidden @multi_calles : $@convention(thin) () -> () {
142+
sil private @multi_calles : $@convention(thin) () -> () {
143143
bb0:
144144
%0 = function_ref @multi_called : $@convention(thin) () -> ()
145145
%1 = apply %0() : $@convention(thin) () -> ()
@@ -165,7 +165,7 @@ bb3:
165165
// CHECK-NEXT: - multi_caller1
166166
// CHECK-NEXT: - multi_caller2
167167
// CHECK-NEXT: ...
168-
sil hidden @multi_callers : $@convention(thin) () -> () {
168+
sil private @multi_callers : $@convention(thin) () -> () {
169169
bb0:
170170
%2 = tuple ()
171171
return %2 : $()
@@ -179,7 +179,7 @@ bb0:
179179
// CHECK-NEXT: partialAppliers:
180180
// CHECK-NEXT: fullAppliers:
181181
// CHECK-NEXT: ...
182-
sil hidden @multi_caller1 : $@convention(thin) () -> () {
182+
sil private @multi_caller1 : $@convention(thin) () -> () {
183183
bb0:
184184
%0 = function_ref @multi_callers : $@convention(thin) () -> ()
185185
%1 = apply %0() : $@convention(thin) () -> ()
@@ -195,7 +195,7 @@ bb0:
195195
// CHECK-NEXT: partialAppliers:
196196
// CHECK-NEXT: fullAppliers:
197197
// CHECK-NEXT: ...
198-
sil hidden @multi_caller2 : $@convention(thin) () -> () {
198+
sil private @multi_caller2 : $@convention(thin) () -> () {
199199
bb0:
200200
%0 = function_ref @multi_callers : $@convention(thin) () -> ()
201201
%1 = apply %0() : $@convention(thin) () -> ()
@@ -243,7 +243,7 @@ bb0(%0 : $Builtin.Int32, %1 : $Builtin.Int32):
243243
// CHECK-NEXT: partialAppliers:
244244
// CHECK-NEXT: fullAppliers:
245245
// CHECK-NEXT: ...
246-
sil @partial_apply_one_arg : $@convention(thin) (Builtin.Int32) -> @owned @callee_owned (Builtin.Int32) -> Builtin.Int32 {
246+
sil private @partial_apply_one_arg : $@convention(thin) (Builtin.Int32) -> @owned @callee_owned (Builtin.Int32) -> Builtin.Int32 {
247247
bb0(%0 : $Builtin.Int32):
248248
%1 = function_ref @closure1 : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32
249249
%2 = partial_apply %1(%0) : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32
@@ -258,7 +258,7 @@ bb0(%0 : $Builtin.Int32):
258258
// CHECK-NEXT: partialAppliers:
259259
// CHECK-NEXT: fullAppliers:
260260
// CHECK-NEXT: ...
261-
sil @partial_apply_two_args1 : $@convention(thin) (Builtin.Int32) -> @owned @callee_owned () -> Builtin.Int32 {
261+
sil private @partial_apply_two_args1 : $@convention(thin) (Builtin.Int32) -> @owned @callee_owned () -> Builtin.Int32 {
262262
bb0(%0 : $Builtin.Int32):
263263
%1 = function_ref @closure1 : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32
264264
%2 = partial_apply %1(%0, %0) : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32
@@ -273,7 +273,7 @@ bb0(%0 : $Builtin.Int32):
273273
// CHECK-NEXT: partialAppliers:
274274
// CHECK-NEXT: fullAppliers:
275275
// CHECK-NEXT: ...
276-
sil @partial_apply_two_args2 : $@convention(thin) (Builtin.Int32) -> @owned @callee_owned () -> Builtin.Int32 {
276+
sil private @partial_apply_two_args2 : $@convention(thin) (Builtin.Int32) -> @owned @callee_owned () -> Builtin.Int32 {
277277
bb0(%0 : $Builtin.Int32):
278278
%1 = function_ref @closure2 : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32
279279
%2 = partial_apply %1(%0, %0) : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32
@@ -290,7 +290,7 @@ bb0(%0 : $Builtin.Int32):
290290
// CHECK-NEXT: fullAppliers:
291291
// CHECK-NEXT: - partial_apply_that_is_applied
292292
// CHECK-NEXT: ...
293-
sil @called_closure : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32 {
293+
sil private @called_closure : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32 {
294294
bb0(%0 : $Builtin.Int32, %1 : $Builtin.Int32):
295295
return %0 : $Builtin.Int32
296296
}
@@ -317,7 +317,7 @@ bb0(%0 : $Builtin.Int32):
317317
// CHECK-NEXT: fullAppliers:
318318
// CHECK-NEXT: - partial_apply_that_is_applied
319319
// CHECK-NEXT: ...
320-
sil @called_closure_then_destroy : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32 {
320+
sil private @called_closure_then_destroy : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32 {
321321
bb0(%0 : $Builtin.Int32, %1 : $Builtin.Int32):
322322
return %0 : $Builtin.Int32
323323
}
@@ -367,7 +367,7 @@ bb0(%0 : $Builtin.Int32):
367367
// CHECK-NEXT: fullAppliers:
368368
// CHECK-NEXT: - partial_apply_that_is_applied
369369
// CHECK-NEXT: ...
370-
sil @called_closure_then_copy_destroy : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32 {
370+
sil private @called_closure_then_copy_destroy : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> Builtin.Int32 {
371371
bb0(%0 : $Builtin.Int32, %1 : $Builtin.Int32):
372372
return %0 : $Builtin.Int32
373373
}
@@ -414,7 +414,7 @@ bb0(%0 : $Builtin.Int32, %1 : $Builtin.Int32):
414414
// CHECK-NEXT: - partial_apply_that_is_applied_and_passed_noescape
415415
// CHECK-NEXT: - thin_to_thick_is_applied_and_passed_noescape
416416
// CHECK-NEXT: ...
417-
sil @noescape_caller : $@convention(thin) (@noescape @callee_owned () -> Builtin.Int32) -> () {
417+
sil private @noescape_caller : $@convention(thin) (@noescape @callee_owned () -> Builtin.Int32) -> () {
418418
bb0(%0 : $@noescape @callee_owned () -> Builtin.Int32):
419419
%1 = apply %0() : $@noescape @callee_owned () -> Builtin.Int32
420420
%9999 = tuple()

0 commit comments

Comments
 (0)