Skip to content

Commit b4a0cea

Browse files
committed
Add PruneVTables to the performance optimizer passes.
1 parent 9f4a653 commit b4a0cea

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

lib/SILOptimizer/PassManager/PassPipeline.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,8 @@ static void addLastChanceOptPassPipeline(SILPassPipelinePlan &P) {
663663

664664
// Only has an effect if opt-remark is enabled.
665665
P.addOptRemarkGenerator();
666+
667+
P.addPruneVTables();
666668
}
667669

668670
static void addSILDebugInfoGeneratorPipeline(SILPassPipelinePlan &P) {

lib/SILOptimizer/Transforms/PruneVTables.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
#include "swift/SILOptimizer/PassManager/Transforms.h"
2121
#include "swift/SILOptimizer/Utils/InstOptUtils.h"
2222

23+
STATISTIC(NumNonoverriddenVTableEntries,
24+
"# of vtable entries marked non-overridden");
25+
2326
using namespace swift;
2427

2528
namespace {
@@ -61,6 +64,7 @@ class PruneVTables : public SILModuleTransform {
6164
if (methodDecl->isOverridden())
6265
continue;
6366
}
67+
++NumNonoverriddenVTableEntries;
6468
entry.setNonOverridden(true);
6569
}
6670
}

test/IRGen/vtable_non_overridden.sil

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,18 @@ sil_vtable InternalB {
6666
// CHECK-NOT: @InternalA_foo
6767
// CHECK-SAME: @InternalB_bar
6868
// CHECK-NOT: @InternalA_bas
69+
70+
// CHECK-LABEL: define {{.*}}@non_overridable_invocation
71+
sil @non_overridable_invocation : $@convention(thin) (@guaranteed InternalA, @guaranteed InternalB) -> () {
72+
entry(%a : $InternalA, %b : $InternalB):
73+
// CHECK: call swiftcc void @InternalA_foo
74+
%am = class_method %a : $InternalA, #InternalA.foo, $@convention(method) (@guaranteed InternalA) -> ()
75+
apply %am(%a) : $@convention(method) (@guaranteed InternalA) -> ()
76+
77+
// CHECK: call swiftcc void @InternalA_foo
78+
%bm = class_method %b : $InternalB, #InternalA.foo, $@convention(method) (@guaranteed InternalA) -> ()
79+
%ba = upcast %b : $InternalB to $InternalA
80+
apply %bm(%ba) : $@convention(method) (@guaranteed InternalA) -> ()
81+
82+
return undef : $()
83+
}

test/SILOptimizer/prune-vtables.sil

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ private class PrivateB: PrivateA {
3434

3535
sil @PrivateB_yesOverrides : $@convention(method) (@guaranteed PrivateB) -> ()
3636

37+
// NOWMO-LABEL: sil_vtable PrivateB {
38+
// NOWMO: #PrivateA.noOverrides{{.*}} [nonoverridden]
39+
// NOWMO-NOT: #PrivateA.yesOverrides{{.*}} [nonoverridden]
40+
// NOWMO: #PrivateA.isFinal{{.*}} [nonoverridden]
41+
42+
// WMO-LABEL: sil_vtable PrivateB {
43+
// WMO: #PrivateA.noOverrides{{.*}} [nonoverridden]
44+
// WMO-NOT: #PrivateA.yesOverrides{{.*}} [nonoverridden]
45+
// WMO: #PrivateA.isFinal{{.*}} [nonoverridden]
3746
sil_vtable PrivateB {
3847
#PrivateA.noOverrides: @PrivateA_noOverrides [inherited]
3948
#PrivateA.yesOverrides: @PrivateB_yesOverrides [override]
@@ -71,6 +80,15 @@ internal class InternalB: InternalA {
7180

7281
sil @InternalB_yesOverrides : $@convention(method) (@guaranteed InternalB) -> ()
7382

83+
// NOWMO-LABEL: sil_vtable InternalB {
84+
// NOWMO-NOT: #InternalA.noOverrides{{.*}} [nonoverridden]
85+
// NOWMO-NOT: #InternalA.yesOverrides{{.*}} [nonoverridden]
86+
// NOWMO: #InternalA.isFinal{{.*}} [nonoverridden]
87+
88+
// WMO-LABEL: sil_vtable InternalB {
89+
// WMO: #InternalA.noOverrides{{.*}} [nonoverridden]
90+
// WMO-NOT: #InternalA.yesOverrides{{.*}} [nonoverridden]
91+
// WMO: #InternalA.isFinal{{.*}} [nonoverridden]
7492
sil_vtable InternalB {
7593
#InternalA.noOverrides: @InternalA_noOverrides [inherited]
7694
#InternalA.yesOverrides: @InternalB_yesOverrides [override]
@@ -108,6 +126,15 @@ public class PublicB: PublicA {
108126

109127
sil @PublicB_yesOverrides : $@convention(method) (@guaranteed PublicB) -> ()
110128

129+
// NOWMO-LABEL: sil_vtable PublicB {
130+
// NOWMO-NOT: #PublicA.noOverrides{{.*}} [nonoverridden]
131+
// NOWMO-NOT: #PublicA.yesOverrides{{.*}} [nonoverridden]
132+
// NOWMO: #PublicA.isFinal{{.*}} [nonoverridden]
133+
134+
// WMO-LABEL: sil_vtable PublicB {
135+
// WMO: #PublicA.noOverrides{{.*}} [nonoverridden]
136+
// WMO-NOT: #PublicA.yesOverrides{{.*}} [nonoverridden]
137+
// WMO: #PublicA.isFinal{{.*}} [nonoverridden]
111138
sil_vtable PublicB {
112139
#PublicA.noOverrides: @PublicA_noOverrides [inherited]
113140
#PublicA.yesOverrides: @PublicB_yesOverrides [override]
@@ -145,6 +172,15 @@ open class OpenB: OpenA {
145172

146173
sil @OpenB_yesOverrides : $@convention(method) (@guaranteed OpenB) -> ()
147174

175+
// NOWMO-LABEL: sil_vtable OpenB {
176+
// NOWMO-NOT: #OpenA.noOverrides{{.*}} [nonoverridden]
177+
// NOWMO-NOT: #OpenA.yesOverrides{{.*}} [nonoverridden]
178+
// NOWMO: #OpenA.isFinal{{.*}} [nonoverridden]
179+
180+
// WMO-LABEL: sil_vtable OpenB {
181+
// WMO-NOT: #OpenA.noOverrides{{.*}} [nonoverridden]
182+
// WMO-NOT: #OpenA.yesOverrides{{.*}} [nonoverridden]
183+
// WMO: #OpenA.isFinal{{.*}} [nonoverridden]
148184
sil_vtable OpenB {
149185
#OpenA.noOverrides: @PublicA_noOverrides [inherited]
150186
#OpenA.yesOverrides: @OpenB_yesOverrides [override]

0 commit comments

Comments
 (0)