8383#include " swift/SIL/MemAccessUtils.h"
8484#include " swift/SIL/SILFunction.h"
8585#include " swift/SILOptimizer/Analysis/AccessStorageAnalysis.h"
86+ #include " swift/SILOptimizer/Analysis/DeadEndBlocksAnalysis.h"
8687#include " swift/SILOptimizer/Analysis/DominanceAnalysis.h"
8788#include " swift/SILOptimizer/Analysis/LoopRegionAnalysis.h"
8889#include " swift/SILOptimizer/PassManager/Transforms.h"
8990#include " swift/SILOptimizer/Utils/InstOptUtils.h"
91+ #include " swift/SILOptimizer/Utils/OwnershipOptUtils.h"
9092#include " llvm/ADT/MapVector.h"
9193#include " llvm/ADT/SCCIterator.h"
9294
@@ -1003,10 +1005,30 @@ canMerge(PostDominanceInfo *postDomTree,
10031005 return canMergeEnd (parentIns, childIns);
10041006}
10051007
1008+ static bool extendOwnership (BeginAccessInst *parentInst,
1009+ BeginAccessInst *childInst,
1010+ InstructionDeleter &deleter,
1011+ DeadEndBlocks &deBlocks) {
1012+ GuaranteedOwnershipExtension extension (deleter, deBlocks);
1013+ auto status = extension.checkAddressOwnership (parentInst, childInst);
1014+ switch (status) {
1015+ case GuaranteedOwnershipExtension::Invalid:
1016+ return false ;
1017+ case GuaranteedOwnershipExtension::Valid:
1018+ return true ;
1019+ case GuaranteedOwnershipExtension::ExtendLifetime:
1020+ case GuaranteedOwnershipExtension::ExtendBorrow:
1021+ break ;
1022+ }
1023+ extension.transform (status);
1024+ return true ;
1025+ }
1026+
10061027// / Perform access merging.
1007- static bool mergeAccesses (
1008- SILFunction *F, PostDominanceInfo *postDomTree,
1009- const AccessConflictAndMergeAnalysis::MergeablePairs &mergePairs) {
1028+ static bool
1029+ mergeAccesses (SILFunction *F, PostDominanceInfo *postDomTree,
1030+ const AccessConflictAndMergeAnalysis::MergeablePairs &mergePairs,
1031+ InstModCallbacks &callbacks, DeadEndBlocks &deBlocks) {
10101032
10111033 if (mergePairs.empty ()) {
10121034 LLVM_DEBUG (llvm::dbgs () << " Skipping SCC Analysis...\n " );
@@ -1042,6 +1064,7 @@ static bool mergeAccesses(
10421064 // begin_access instruction. We store (begin_access %2 -> begin_access %1)
10431065 // to re-map a merged begin_access to it's replaced instruction.
10441066 llvm::DenseMap<BeginAccessInst *, BeginAccessInst *> oldToNewMap;
1067+ InstructionDeleter deleter (callbacks);
10451068
10461069 while (!workPairs.empty ()) {
10471070 auto curr = workPairs.pop_back_val ();
@@ -1058,6 +1081,9 @@ static bool mergeAccesses(
10581081 if (!canMerge (postDomTree, blockToSCCMap, parentIns, childIns))
10591082 continue ;
10601083
1084+ if (!extendOwnership (parentIns, childIns, deleter, deBlocks))
1085+ return false ;
1086+
10611087 LLVM_DEBUG (llvm::dbgs ()
10621088 << " Merging " << *childIns << " into " << *parentIns << " \n " );
10631089
@@ -1084,8 +1110,9 @@ static bool mergeAccesses(
10841110 auto curr = oldToNewMap.begin ();
10851111 auto *oldIns = curr->getFirst ();
10861112 oldToNewMap.erase (oldIns);
1087- oldIns-> eraseFromParent ( );
1113+ deleter. forceDelete (oldIns );
10881114 }
1115+ deleter.cleanupDeadInstructions ();
10891116 return changed;
10901117}
10911118
@@ -1101,6 +1128,8 @@ struct AccessEnforcementOpts : public SILFunctionTransform {
11011128
11021129 LoopRegionFunctionInfo *LRFI = getAnalysis<LoopRegionAnalysis>()->get (F);
11031130 PostOrderFunctionInfo *PO = getAnalysis<PostOrderAnalysis>()->get (F);
1131+ DeadEndBlocksAnalysis *deBlocksAnalysis =
1132+ PM->getAnalysis <DeadEndBlocksAnalysis>();
11041133 AccessStorageAnalysis *ASA = getAnalysis<AccessStorageAnalysis>();
11051134 AccessConflictAndMergeAnalysis a (LRFI, PO, ASA);
11061135 if (!a.analyze ())
@@ -1132,7 +1161,9 @@ struct AccessEnforcementOpts : public SILFunctionTransform {
11321161 PostDominanceAnalysis *postDomAnalysis =
11331162 getAnalysis<PostDominanceAnalysis>();
11341163 PostDominanceInfo *postDomTree = postDomAnalysis->get (F);
1135- if (mergeAccesses (F, postDomTree, result.mergePairs ))
1164+ DeadEndBlocks *deBlocks = deBlocksAnalysis->get (F);
1165+ InstModCallbacks callbacks;
1166+ if (mergeAccesses (F, postDomTree, result.mergePairs , callbacks, *deBlocks))
11361167 invalidateAnalysis (SILAnalysis::InvalidationKind::Instructions);
11371168 }
11381169};
0 commit comments