12
12
13
13
#define DEBUG_TYPE " sil-dce"
14
14
#include " swift/Basic/Assertions.h"
15
+ #include " swift/Basic/BlotSetVector.h"
15
16
#include " swift/SIL/BasicBlockBits.h"
16
17
#include " swift/SIL/DebugUtils.h"
17
18
#include " swift/SIL/MemAccessUtils.h"
18
19
#include " swift/SIL/NodeBits.h"
20
+ #include " swift/SIL/OSSALifetimeCompletion.h"
19
21
#include " swift/SIL/OwnershipUtils.h"
20
22
#include " swift/SIL/SILArgument.h"
21
23
#include " swift/SIL/SILBasicBlock.h"
22
24
#include " swift/SIL/SILBuilder.h"
23
25
#include " swift/SIL/SILFunction.h"
24
26
#include " swift/SIL/SILUndef.h"
25
- #include " swift/SIL/OSSALifetimeCompletion.h"
26
- #include " swift/SILOptimizer/Analysis/DominanceAnalysis.h"
27
27
#include " swift/SILOptimizer/Analysis/DeadEndBlocksAnalysis.h"
28
+ #include " swift/SILOptimizer/Analysis/DominanceAnalysis.h"
28
29
#include " swift/SILOptimizer/PassManager/Passes.h"
29
30
#include " swift/SILOptimizer/PassManager/Transforms.h"
30
31
#include " swift/SILOptimizer/Utils/BasicBlockOptUtils.h"
@@ -94,7 +95,7 @@ static bool seemsUseful(SILInstruction *I) {
94
95
if (isa<DebugValueInst>(I))
95
96
return isa<SILFunctionArgument>(I->getOperand (0 ))
96
97
|| isa<SILUndef>(I->getOperand (0 ));
97
-
98
+
98
99
99
100
// Don't delete allocation instructions in DCE.
100
101
if (isa<AllocRefInst>(I) || isa<AllocRefDynamicInst>(I)) {
@@ -131,7 +132,7 @@ class DCE {
131
132
DominanceInfo *DT;
132
133
DeadEndBlocks *deadEndBlocks;
133
134
llvm::DenseMap<SILBasicBlock *, ControllingInfo> ControllingInfoMap;
134
- llvm::SmallVector <SILValue> valuesToComplete;
135
+ SmallBlotSetVector <SILValue, 8 > valuesToComplete;
135
136
136
137
// Maps instructions which produce a failing condition (like overflow
137
138
// builtins) to the actual cond_fail instructions which handle the failure.
@@ -212,7 +213,7 @@ class DCE {
212
213
markLive ();
213
214
return removeDead ();
214
215
}
215
-
216
+
216
217
bool mustInvalidateCalls () const { return CallsChanged; }
217
218
bool mustInvalidateBranches () const { return BranchesChanged; }
218
219
};
@@ -637,7 +638,7 @@ void DCE::endLifetimeOfLiveValue(Operand *op, SILInstruction *insertPt) {
637
638
// If DCE is going to delete the block in which we have to insert a
638
639
// compensating lifetime end, let complete lifetimes utility handle it.
639
640
if (!LiveBlocks.contains (insertPt->getParent ())) {
640
- valuesToComplete.push_back (lookThroughBorrowedFromDef (value));
641
+ valuesToComplete.insert (lookThroughBorrowedFromDef (value));
641
642
return ;
642
643
}
643
644
@@ -736,6 +737,12 @@ bool DCE::removeDead() {
736
737
InstModCallbacks ()
737
738
.onCreateNewInst ([&](auto *inst) { markInstructionLive (inst); })
738
739
.onDelete ([&](auto *inst) {
740
+ for (auto result : inst->getResults ()) {
741
+ result = lookThroughBorrowedFromDef (result);
742
+ if (valuesToComplete.count (result)) {
743
+ valuesToComplete.erase (result);
744
+ }
745
+ }
739
746
inst->replaceAllUsesOfAllResultsWithUndef ();
740
747
if (isa<ApplyInst>(inst))
741
748
CallsChanged = true ;
@@ -790,6 +797,12 @@ bool DCE::removeDead() {
790
797
}
791
798
}
792
799
}
800
+ for (auto result : Inst->getResults ()) {
801
+ result = lookThroughBorrowedFromDef (result);
802
+ if (valuesToComplete.count (result)) {
803
+ valuesToComplete.erase (result);
804
+ }
805
+ }
793
806
Inst->replaceAllUsesOfAllResultsWithUndef ();
794
807
795
808
if (isa<ApplyInst>(Inst))
@@ -802,7 +815,9 @@ bool DCE::removeDead() {
802
815
803
816
OSSALifetimeCompletion completion (F, DT, *deadEndBlocks);
804
817
for (auto value : valuesToComplete) {
805
- completion.completeOSSALifetime (value,
818
+ if (!value.has_value ())
819
+ continue ;
820
+ completion.completeOSSALifetime (*value,
806
821
OSSALifetimeCompletion::Boundary::Liveness);
807
822
}
808
823
@@ -859,9 +874,9 @@ void DCE::computeLevelNumbers(PostDomTreeNode *root) {
859
874
auto entry = workList.pop_back_val ();
860
875
PostDomTreeNode *node = entry.first ;
861
876
unsigned level = entry.second ;
862
-
877
+
863
878
insertControllingInfo (node->getBlock (), level);
864
-
879
+
865
880
for (PostDomTreeNode *child : *node) {
866
881
workList.push_back ({child, level + 1 });
867
882
}
0 commit comments