Skip to content

Commit dd204e6

Browse files
committed
DSE: Use escape analysis for checking if memory locations are dead at the end of a function.
Currently NFC as local DSE is still disabled.
1 parent f963b5c commit dd204e6

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

lib/SILOptimizer/Transforms/DeadStoreElimination.cpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
#include "swift/SIL/SILBuilder.h"
7070
#include "swift/SIL/SILValueProjection.h"
7171
#include "swift/SILOptimizer/Analysis/AliasAnalysis.h"
72+
#include "swift/SILOptimizer/Analysis/EscapeAnalysis.h"
7273
#include "swift/SILOptimizer/Analysis/PostOrderAnalysis.h"
7374
#include "swift/SILOptimizer/Analysis/ValueTracking.h"
7475
#include "swift/SILOptimizer/PassManager/Passes.h"
@@ -301,6 +302,9 @@ class DSEContext {
301302
/// Alias Analysis.
302303
AliasAnalysis *AA;
303304

305+
/// Escape analysis.
306+
EscapeAnalysis *EA;
307+
304308
/// Type Expansion Analysis.
305309
TypeExpansionAnalysis *TE;
306310

@@ -408,8 +412,8 @@ class DSEContext {
408412
public:
409413
/// Constructor.
410414
DSEContext(SILFunction *F, SILModule *M, SILPassManager *PM,
411-
AliasAnalysis *AA, TypeExpansionAnalysis *TE)
412-
: Mod(M), F(F), PM(PM), AA(AA), TE(TE) {}
415+
AliasAnalysis *AA, EscapeAnalysis *EA, TypeExpansionAnalysis *TE)
416+
: Mod(M), F(F), PM(PM), AA(AA), EA(EA), TE(TE) {}
413417

414418
/// Entry point for dead store elimination.
415419
bool run();
@@ -516,10 +520,24 @@ void DSEContext::mergeSuccessorStates(SILBasicBlock *BB) {
516520
if (BB->succ_empty()) {
517521
if (DisableLocalStoreDSE)
518522
return;
523+
524+
auto *ConGraph = EA->getConnectionGraph(F);
525+
519526
for (unsigned i = 0; i < LocationVault.size(); ++i) {
520-
if (!LocationVault[i].isNonEscapingLocalLSLocation())
527+
SILValue Base = LocationVault[i].getBase();
528+
if (isa<AllocStackInst>(Base)) {
529+
// An alloc_stack is definitely dead at the end of the function.
530+
C->startTrackingLocation(C->BBWriteSetOut, i);
521531
continue;
522-
C->startTrackingLocation(C->BBWriteSetOut, i);
532+
}
533+
if (isa<AllocationInst>(Base)) {
534+
// For other allocations we ask escape analysis.
535+
auto *Node = ConGraph->getNodeOrNull(Base, EA);
536+
if (Node && !Node->escapes()) {
537+
C->startTrackingLocation(C->BBWriteSetOut, i);
538+
continue;
539+
}
540+
}
523541
}
524542
return;
525543
}
@@ -1009,11 +1027,12 @@ class DeadStoreElimination : public SILFunctionTransform {
10091027
/// The entry point to the transformation.
10101028
void run() override {
10111029
auto *AA = PM->getAnalysis<AliasAnalysis>();
1030+
auto *EA = PM->getAnalysis<EscapeAnalysis>();
10121031
auto *TE = PM->getAnalysis<TypeExpansionAnalysis>();
10131032
SILFunction *F = getFunction();
10141033
DEBUG(llvm::dbgs() << "*** DSE on function: " << F->getName() << " ***\n");
10151034

1016-
DSEContext DSE(F, &F->getModule(), PM, AA, TE);
1035+
DSEContext DSE(F, &F->getModule(), PM, AA, EA, TE);
10171036
if (DSE.run()) {
10181037
invalidateAnalysis(SILAnalysis::InvalidationKind::Instructions);
10191038
}

0 commit comments

Comments
 (0)