83
83
#include " swift/SIL/MemAccessUtils.h"
84
84
#include " swift/SIL/SILFunction.h"
85
85
#include " swift/SILOptimizer/Analysis/AccessStorageAnalysis.h"
86
+ #include " swift/SILOptimizer/Analysis/DeadEndBlocksAnalysis.h"
86
87
#include " swift/SILOptimizer/Analysis/DominanceAnalysis.h"
87
88
#include " swift/SILOptimizer/Analysis/LoopRegionAnalysis.h"
88
89
#include " swift/SILOptimizer/PassManager/Transforms.h"
89
90
#include " swift/SILOptimizer/Utils/InstOptUtils.h"
91
+ #include " swift/SILOptimizer/Utils/OwnershipOptUtils.h"
90
92
#include " llvm/ADT/MapVector.h"
91
93
#include " llvm/ADT/SCCIterator.h"
92
94
@@ -1003,10 +1005,30 @@ canMerge(PostDominanceInfo *postDomTree,
1003
1005
return canMergeEnd (parentIns, childIns);
1004
1006
}
1005
1007
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
+
1006
1027
// / 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) {
1010
1032
1011
1033
if (mergePairs.empty ()) {
1012
1034
LLVM_DEBUG (llvm::dbgs () << " Skipping SCC Analysis...\n " );
@@ -1042,6 +1064,7 @@ static bool mergeAccesses(
1042
1064
// begin_access instruction. We store (begin_access %2 -> begin_access %1)
1043
1065
// to re-map a merged begin_access to it's replaced instruction.
1044
1066
llvm::DenseMap<BeginAccessInst *, BeginAccessInst *> oldToNewMap;
1067
+ InstructionDeleter deleter (callbacks);
1045
1068
1046
1069
while (!workPairs.empty ()) {
1047
1070
auto curr = workPairs.pop_back_val ();
@@ -1058,6 +1081,9 @@ static bool mergeAccesses(
1058
1081
if (!canMerge (postDomTree, blockToSCCMap, parentIns, childIns))
1059
1082
continue ;
1060
1083
1084
+ if (!extendOwnership (parentIns, childIns, deleter, deBlocks))
1085
+ return false ;
1086
+
1061
1087
LLVM_DEBUG (llvm::dbgs ()
1062
1088
<< " Merging " << *childIns << " into " << *parentIns << " \n " );
1063
1089
@@ -1084,8 +1110,9 @@ static bool mergeAccesses(
1084
1110
auto curr = oldToNewMap.begin ();
1085
1111
auto *oldIns = curr->getFirst ();
1086
1112
oldToNewMap.erase (oldIns);
1087
- oldIns-> eraseFromParent ( );
1113
+ deleter. forceDelete (oldIns );
1088
1114
}
1115
+ deleter.cleanupDeadInstructions ();
1089
1116
return changed;
1090
1117
}
1091
1118
@@ -1101,6 +1128,8 @@ struct AccessEnforcementOpts : public SILFunctionTransform {
1101
1128
1102
1129
LoopRegionFunctionInfo *LRFI = getAnalysis<LoopRegionAnalysis>()->get (F);
1103
1130
PostOrderFunctionInfo *PO = getAnalysis<PostOrderAnalysis>()->get (F);
1131
+ DeadEndBlocksAnalysis *deBlocksAnalysis =
1132
+ PM->getAnalysis <DeadEndBlocksAnalysis>();
1104
1133
AccessStorageAnalysis *ASA = getAnalysis<AccessStorageAnalysis>();
1105
1134
AccessConflictAndMergeAnalysis a (LRFI, PO, ASA);
1106
1135
if (!a.analyze ())
@@ -1132,7 +1161,9 @@ struct AccessEnforcementOpts : public SILFunctionTransform {
1132
1161
PostDominanceAnalysis *postDomAnalysis =
1133
1162
getAnalysis<PostDominanceAnalysis>();
1134
1163
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))
1136
1167
invalidateAnalysis (SILAnalysis::InvalidationKind::Instructions);
1137
1168
}
1138
1169
};
0 commit comments