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
@@ -733,6 +734,12 @@ bool DCE::removeDead() {
733
734
InstModCallbacks ()
734
735
.onCreateNewInst ([&](auto *inst) { markInstructionLive (inst); })
735
736
.onDelete ([&](auto *inst) {
737
+ for (auto result : inst->getResults ()) {
738
+ result = lookThroughBorrowedFromDef (result);
739
+ if (valuesToComplete.count (result)) {
740
+ valuesToComplete.erase (result);
741
+ }
742
+ }
736
743
inst->replaceAllUsesOfAllResultsWithUndef ();
737
744
if (isa<ApplyInst>(inst))
738
745
CallsChanged = true ;
@@ -787,6 +794,12 @@ bool DCE::removeDead() {
787
794
}
788
795
}
789
796
}
797
+ for (auto result : Inst->getResults ()) {
798
+ result = lookThroughBorrowedFromDef (result);
799
+ if (valuesToComplete.count (result)) {
800
+ valuesToComplete.erase (result);
801
+ }
802
+ }
790
803
Inst->replaceAllUsesOfAllResultsWithUndef ();
791
804
792
805
if (isa<ApplyInst>(Inst))
@@ -799,7 +812,9 @@ bool DCE::removeDead() {
799
812
800
813
OSSALifetimeCompletion completion (F, DT, *deadEndBlocks);
801
814
for (auto value : valuesToComplete) {
802
- completion.completeOSSALifetime (value,
815
+ if (!value.has_value ())
816
+ continue ;
817
+ completion.completeOSSALifetime (*value,
803
818
OSSALifetimeCompletion::Boundary::Liveness);
804
819
}
805
820
@@ -856,9 +871,9 @@ void DCE::computeLevelNumbers(PostDomTreeNode *root) {
856
871
auto entry = workList.pop_back_val ();
857
872
PostDomTreeNode *node = entry.first ;
858
873
unsigned level = entry.second ;
859
-
874
+
860
875
insertControllingInfo (node->getBlock (), level);
861
-
876
+
862
877
for (PostDomTreeNode *child : *node) {
863
878
workList.push_back ({child, level + 1 });
864
879
}
0 commit comments