Skip to content

Commit 9f616e5

Browse files
committed
DeadFunctionElimination: rename the pass and some other refactoring
The main change is to rename DeadFunctionElimination -> DeadFunctionAndGlobalElimination, because the pass is now also doing dead-global elimination. A second change is to remove the FunctionLivenessComputation base class. It’s not used anywhere else.
1 parent ee8cdac commit 9f616e5

File tree

4 files changed

+32
-60
lines changed

4 files changed

+32
-60
lines changed

include/swift/SILOptimizer/PassManager/Passes.def

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ PASS(DCE, "dce",
140140
"Dead Code Elimination")
141141
PASS(DeadArgSignatureOpt, "dead-arg-signature-opt",
142142
"Dead Argument Elimination via Function Specialization")
143-
PASS(DeadFunctionElimination, "sil-deadfuncelim",
144-
"Dead Function Elimination")
143+
PASS(DeadFunctionAndGlobalElimination, "sil-deadfuncelim",
144+
"Dead Function and Global Variable Elimination")
145145
PASS(DeadObjectElimination, "deadobject-elim",
146146
"Dead Object Elimination for Classes with Trivial Destruction")
147147
PASS(DefiniteInitialization, "definite-init",
@@ -220,8 +220,8 @@ PASS(LICM, "licm",
220220
"Loop Invariant Code Motion")
221221
PASS(LateCodeMotion, "late-codemotion",
222222
"Late Code Motion with Release Hoisting")
223-
PASS(LateDeadFunctionElimination, "late-deadfuncelim",
224-
"Late Dead Function Elimination")
223+
PASS(LateDeadFunctionAndGlobalElimination, "late-deadfuncelim",
224+
"Late Dead Function and Global Elimination")
225225
PASS(LateInliner, "late-inline",
226226
"Late Function Inlining")
227227
PASS(LoopCanonicalizer, "loop-canonicalizer",

lib/SILOptimizer/IPO/DeadFunctionElimination.cpp

Lines changed: 23 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===--- DeadFunctionElimination.cpp - Eliminate dead functions -----------===//
1+
//===- DeadFunctionElimination.cpp - Eliminate dead functions and globals -===//
22
//
33
// This source file is part of the Swift.org open source project
44
//
@@ -31,12 +31,7 @@ STATISTIC(NumDeadGlobals, "Number of dead global variables eliminated");
3131

3232
namespace {
3333

34-
/// This is a base class for passes that are based on function liveness
35-
/// computations like e.g. dead function elimination.
36-
/// It provides a common logic for computing live (i.e. reachable) functions.
37-
class FunctionLivenessComputation {
38-
protected:
39-
34+
class DeadFunctionAndGlobalElimination {
4035
/// Represents a function which is implementing a vtable or witness table
4136
/// method.
4237
struct FuncImpl {
@@ -402,9 +397,6 @@ class FunctionLivenessComputation {
402397
return false;
403398
}
404399

405-
/// Find anchors in vtables and witness tables, if required.
406-
virtual void findAnchorsInTables() = 0;
407-
408400
/// Find all functions which are alive from the beginning.
409401
/// For example, functions which may be referenced externally.
410402
void findAnchors() {
@@ -435,12 +427,6 @@ class FunctionLivenessComputation {
435427
}
436428
}
437429

438-
public:
439-
FunctionLivenessComputation(SILModule *module,
440-
bool keepExternalWitnessTablesAlive) :
441-
Module(module),
442-
keepExternalWitnessTablesAlive(keepExternalWitnessTablesAlive) {}
443-
444430
/// The main entry point of the optimization.
445431
bool findAliveFunctions() {
446432

@@ -461,19 +447,6 @@ class FunctionLivenessComputation {
461447
return false;
462448
}
463449

464-
virtual ~FunctionLivenessComputation() {}
465-
};
466-
467-
} // end anonymous namespace
468-
469-
//===----------------------------------------------------------------------===//
470-
// DeadFunctionElimination
471-
//===----------------------------------------------------------------------===//
472-
473-
namespace {
474-
475-
class DeadFunctionElimination : FunctionLivenessComputation {
476-
477450
void collectMethodImplementations() {
478451
// Collect vtable method implementations.
479452
for (auto &vTable : Module->getVTables()) {
@@ -528,10 +501,9 @@ class DeadFunctionElimination : FunctionLivenessComputation {
528501
}
529502
}
530503

531-
/// DeadFunctionElimination pass takes functions
532-
/// reachable via vtables and witness_tables into account
504+
/// Take functions reachable via vtables and witness_tables into account
533505
/// when computing a function liveness information.
534-
void findAnchorsInTables() override {
506+
void findAnchorsInTables() {
535507

536508
collectMethodImplementations();
537509

@@ -688,11 +660,13 @@ class DeadFunctionElimination : FunctionLivenessComputation {
688660
}
689661

690662
public:
691-
DeadFunctionElimination(SILModule *module, bool keepExternalWitnessTablesAlive)
692-
: FunctionLivenessComputation(module, keepExternalWitnessTablesAlive) {}
663+
DeadFunctionAndGlobalElimination(SILModule *module,
664+
bool keepExternalWitnessTablesAlive) :
665+
Module(module),
666+
keepExternalWitnessTablesAlive(keepExternalWitnessTablesAlive) {}
693667

694668
/// The main entry point of the optimization.
695-
void eliminateFunctions(SILModuleTransform *DFEPass) {
669+
void eliminateFunctionsAndGlobals(SILModuleTransform *DFEPass) {
696670

697671
LLVM_DEBUG(llvm::dbgs() << "running dead function elimination\n");
698672
findAliveFunctions();
@@ -730,15 +704,12 @@ class DeadFunctionElimination : FunctionLivenessComputation {
730704
}
731705

732706
// Last step: delete all dead functions.
733-
while (!DeadFunctions.empty()) {
734-
SILFunction *F = DeadFunctions.back();
735-
DeadFunctions.pop_back();
736-
737-
LLVM_DEBUG(llvm::dbgs() << " erase dead function " << F->getName()
707+
for (SILFunction *deadFunc : DeadFunctions) {
708+
LLVM_DEBUG(llvm::dbgs() << " erase dead function " << deadFunc->getName()
738709
<< "\n");
739710
++NumDeadFunc;
740-
DFEPass->notifyWillDeleteFunction(F);
741-
Module->eraseFunction(F);
711+
DFEPass->notifyWillDeleteFunction(deadFunc);
712+
Module->eraseFunction(deadFunc);
742713
}
743714
for (SILGlobalVariable *deadGlobal : DeadGlobals) {
744715
++NumDeadGlobals;
@@ -758,13 +729,13 @@ class DeadFunctionElimination : FunctionLivenessComputation {
758729

759730
namespace {
760731

761-
class SILDeadFuncElimination : public SILModuleTransform {
732+
class DeadFunctionAndGlobalEliminationPass : public SILModuleTransform {
762733

763734
private:
764735
bool isLateDFE;
765736

766737
public:
767-
SILDeadFuncElimination(bool isLateDFE) : isLateDFE(isLateDFE) { }
738+
DeadFunctionAndGlobalEliminationPass(bool isLateDFE) : isLateDFE(isLateDFE) {}
768739

769740
void run() override {
770741
LLVM_DEBUG(llvm::dbgs() << "Running DeadFuncElimination\n");
@@ -776,24 +747,25 @@ class SILDeadFuncElimination : public SILModuleTransform {
776747
// can eliminate such functions.
777748
getModule()->invalidateSILLoaderCaches();
778749

779-
DeadFunctionElimination deadFunctionElimination(getModule(),
750+
DeadFunctionAndGlobalElimination deadFunctionElimination(getModule(),
780751
/*keepExternalWitnessTablesAlive*/ !isLateDFE);
781-
deadFunctionElimination.eliminateFunctions(this);
752+
deadFunctionElimination.eliminateFunctionsAndGlobals(this);
782753
}
783754
};
784755

785756
} // end anonymous namespace
786757

787-
SILTransform *swift::createDeadFunctionElimination() {
788-
return new SILDeadFuncElimination(/*isLateDFE*/ false);
758+
SILTransform *swift::createDeadFunctionAndGlobalElimination() {
759+
return new DeadFunctionAndGlobalEliminationPass(/*isLateDFE*/ false);
789760
}
790761

791-
SILTransform *swift::createLateDeadFunctionElimination() {
792-
return new SILDeadFuncElimination(/*isLateDFE*/ true);
762+
SILTransform *swift::createLateDeadFunctionAndGlobalElimination() {
763+
return new DeadFunctionAndGlobalEliminationPass(/*isLateDFE*/ true);
793764
}
794765

795766
void swift::performSILDeadFunctionElimination(SILModule *M) {
796-
llvm::SmallVector<PassKind, 1> Pass = {PassKind::DeadFunctionElimination};
767+
llvm::SmallVector<PassKind, 1> Pass =
768+
{PassKind::DeadFunctionAndGlobalElimination};
797769
auto &opts = M->getOptions();
798770
auto plan = SILPassPipelinePlan::getPassPipelineForKinds(opts, Pass);
799771
executePassPipelinePlan(M, plan);

lib/SILOptimizer/PassManager/PassPipeline.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ static void addPerfEarlyModulePassPipeline(SILPassPipelinePlan &P) {
451451

452452
// Get rid of apparently dead functions as soon as possible so that
453453
// we do not spend time optimizing them.
454-
P.addDeadFunctionElimination();
454+
P.addDeadFunctionAndGlobalElimination();
455455

456456
// Cleanup after SILGen: remove trivial copies to temporaries.
457457
P.addTempRValueOpt();
@@ -525,7 +525,7 @@ static void addHighLevelFunctionPipeline(SILPassPipelinePlan &P) {
525525
// one round of module passes.
526526
static void addHighLevelModulePipeline(SILPassPipelinePlan &P) {
527527
P.startPipeline("HighLevel,Module+StackPromote");
528-
P.addDeadFunctionElimination();
528+
P.addDeadFunctionAndGlobalElimination();
529529
P.addPerformanceSILLinker();
530530
P.addDeadObjectElimination();
531531
P.addGlobalPropertyOpt();
@@ -572,7 +572,7 @@ static void addMidLevelFunctionPipeline(SILPassPipelinePlan &P) {
572572

573573
static void addClosureSpecializePassPipeline(SILPassPipelinePlan &P) {
574574
P.startPipeline("ClosureSpecialize");
575-
P.addDeadFunctionElimination();
575+
P.addDeadFunctionAndGlobalElimination();
576576
P.addDeadStoreElimination();
577577
P.addDeadObjectElimination();
578578

@@ -639,7 +639,7 @@ static void addLateLoopOptPassPipeline(SILPassPipelinePlan &P) {
639639
// Delete dead code and drop the bodies of shared functions.
640640
// Also, remove externally available witness tables. They are not needed
641641
// anymore after the last devirtualizer run.
642-
P.addLateDeadFunctionElimination();
642+
P.addLateDeadFunctionAndGlobalElimination();
643643

644644
// Perform the final lowering transformations.
645645
P.addCodeSinking();

test/SILOptimizer/existential_specializer_indirect_class.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-sil-opt -O -wmo -enable-sil-verify-all -sil-disable-pass=DeadFunctionElimination %s | %FileCheck %s
1+
// RUN: %target-sil-opt -O -wmo -enable-sil-verify-all -sil-disable-pass=DeadFunctionAndGlobalElimination %s | %FileCheck %s
22

33
sil_stage canonical
44

0 commit comments

Comments
 (0)