100100#include " swift/Basic/SmallPtrSetVector.h"
101101#include " swift/SIL/PrunedLiveness.h"
102102#include " swift/SIL/SILInstruction.h"
103+ #include " swift/SILOptimizer/Analysis/DeadEndBlocksAnalysis.h"
103104#include " swift/SILOptimizer/Analysis/DominanceAnalysis.h"
104105#include " swift/SILOptimizer/Analysis/NonLocalAccessBlockAnalysis.h"
105106#include " swift/SILOptimizer/Utils/InstructionDeleter.h"
@@ -247,6 +248,8 @@ class CanonicalizeOSSALifetime final {
247248 // extendLivenessThroughOverlappingAccess is invoked.
248249 NonLocalAccessBlocks *accessBlocks = nullptr ;
249250
251+ DeadEndBlocksAnalysis *deadEndBlocksAnalysis;
252+
250253 DominanceInfo *domTree = nullptr ;
251254
252255 BasicCalleeAnalysis *calleeAnalysis;
@@ -326,27 +329,22 @@ class CanonicalizeOSSALifetime final {
326329 }
327330 };
328331
329- CanonicalizeOSSALifetime (PruneDebugInsts_t pruneDebugMode,
330- MaximizeLifetime_t maximizeLifetime,
331- SILFunction *function,
332- NonLocalAccessBlockAnalysis *accessBlockAnalysis,
333- DominanceInfo *domTree,
334- BasicCalleeAnalysis *calleeAnalysis,
335- InstructionDeleter &deleter)
332+ CanonicalizeOSSALifetime (
333+ PruneDebugInsts_t pruneDebugMode, MaximizeLifetime_t maximizeLifetime,
334+ SILFunction *function, NonLocalAccessBlockAnalysis *accessBlockAnalysis,
335+ DeadEndBlocksAnalysis *deadEndBlocksAnalysis, DominanceInfo *domTree,
336+ BasicCalleeAnalysis *calleeAnalysis, InstructionDeleter &deleter)
336337 : pruneDebugMode(pruneDebugMode), maximizeLifetime(maximizeLifetime),
337- accessBlockAnalysis(accessBlockAnalysis), domTree(domTree),
338+ accessBlockAnalysis(accessBlockAnalysis),
339+ deadEndBlocksAnalysis(deadEndBlocksAnalysis), domTree(domTree),
338340 calleeAnalysis(calleeAnalysis), deleter(deleter) {}
339341
340342 SILValue getCurrentDef () const { return currentDef; }
341343
342344 void initializeLiveness (SILValue def,
343345 ArrayRef<SILInstruction *> lexicalLifetimeEnds) {
344346 assert (consumingBlocks.empty () && debugValues.empty ());
345- // Clear the cached analysis pointer just in case the client invalidates the
346- // analysis, freeing its memory.
347- accessBlocks = nullptr ;
348- consumes.clear ();
349- destroys.clear ();
347+ clear ();
350348
351349 currentDef = def;
352350 currentLexicalLifetimeEnds = lexicalLifetimeEnds;
@@ -358,9 +356,18 @@ class CanonicalizeOSSALifetime final {
358356 }
359357
360358 void clear () {
359+ // Clear the access blocks analysis pointer in case the client invalidates
360+ // the analysis. If the client did, the analysis will be recomputed in
361+ // extendLivenessThroughOverlappingAccess; if it didn't, the analysis
362+ // pointer will just be set back to its old value when the analysis' cache
363+ // is consulted in extendLivenessThroughOverlappingAccess.
364+ accessBlocks = nullptr ;
365+
361366 consumingBlocks.clear ();
362367 debugValues.clear ();
363368 discoveredBlocks.clear ();
369+ consumes.clear ();
370+ destroys.clear ();
364371 }
365372
366373 // / Top-Level API: rewrites copies and destroys within \p def's extended
@@ -472,7 +479,7 @@ class CanonicalizeOSSALifetime final {
472479 void findExtendedBoundary (PrunedLivenessBoundary const &originalBoundary,
473480 PrunedLivenessBoundary &boundary);
474481
475- void findDestroysOutsideBoundary (SmallVectorImpl<SILInstruction *> &destroys );
482+ void extendLivenessToDeadEnds ( );
476483 void extendLivenessToDeinitBarriers ();
477484
478485 void extendUnconsumedLiveness (PrunedLivenessBoundary const &boundary);
@@ -481,9 +488,10 @@ class CanonicalizeOSSALifetime final {
481488 llvm::function_ref<void (SILInstruction *, PrunedLiveness::LifetimeEnding)>
482489 visitor);
483490
484- void insertDestroysOnBoundary (PrunedLivenessBoundary const &boundary);
491+ void insertDestroysOnBoundary (PrunedLivenessBoundary const &boundary,
492+ SmallVectorImpl<DestroyValueInst *> &destroys);
485493
486- void rewriteCopies ();
494+ void rewriteCopies (SmallVectorImpl<DestroyValueInst *> const &destroys );
487495};
488496
489497} // end namespace swift
0 commit comments