@@ -943,7 +943,7 @@ void CanonicalizeOSSALifetime::findExtendedBoundary(
943
943
// / record it as a final consume.
944
944
static void
945
945
insertDestroyBeforeInstruction (SILInstruction *nextInstruction,
946
- SILValue currentDef, IsDeadEnd_t isDeadEnd,
946
+ SILValue currentDef,
947
947
CanonicalOSSAConsumeInfo &consumes,
948
948
SmallVectorImpl<DestroyValueInst *> &destroys,
949
949
InstModCallbacks &callbacks) {
@@ -974,63 +974,13 @@ insertDestroyBeforeInstruction(SILInstruction *nextInstruction,
974
974
SILBuilderWithScope builder (nextInstruction);
975
975
auto loc =
976
976
RegularLocation::getAutoGeneratedLocation (nextInstruction->getLoc ());
977
- auto *dvi =
978
- builder.createDestroyValue (loc, currentDef, DontPoisonRefs, isDeadEnd);
977
+ auto *dvi = builder.createDestroyValue (loc, currentDef);
979
978
callbacks.createdNewInst (dvi);
980
979
consumes.recordFinalConsume (dvi);
981
980
++NumDestroysGenerated;
982
981
destroys.push_back (dvi);
983
982
}
984
983
985
- // / Whether a destroy created at \p inst should be marked [dead_end].
986
- // /
987
- // / It should be if
988
- // / (1) \p inst is itself in a dead-end region
989
- // / (2) all destroys after \p inst are [dead_end]
990
- static IsDeadEnd_t
991
- isDeadEndDestroy (SILInstruction *inst,
992
- SmallPtrSetVector<SILInstruction *, 8 > const &destroys,
993
- BasicBlockSet &semanticDestroysBlocks,
994
- DeadEndBlocks *deadEnds) {
995
- auto *parent = inst->getParent ();
996
- if (!deadEnds->isDeadEnd (parent)) {
997
- // Only destroys in dead-ends can be non-meaningful (aka "dead end").
998
- return IsntDeadEnd;
999
- }
1000
- if (semanticDestroysBlocks.contains (parent)) {
1001
- // `parent` has a semantic destroy somewhere. Is it after `inst`?
1002
- for (auto *i = inst; i; i = i->getNextInstruction ()) {
1003
- if (!destroys.contains (i)) {
1004
- continue ;
1005
- }
1006
- auto *dvi = cast<DestroyValueInst>(i);
1007
- if (!dvi->isDeadEnd ()) {
1008
- // Some subsequent destroy within `parent` was meaningful, so one
1009
- // created at `inst` must be too.
1010
- return IsntDeadEnd;
1011
- }
1012
- }
1013
- }
1014
- // Walk the portion of the dead-end region after `parent` to check that all
1015
- // destroys are non-meaningful.
1016
- BasicBlockWorklist worklist (inst->getFunction ());
1017
- for (auto *successor : parent->getSuccessorBlocks ()) {
1018
- worklist.push (successor);
1019
- }
1020
- while (auto *block = worklist.pop ()) {
1021
- assert (deadEnds->isDeadEnd (block));
1022
- if (semanticDestroysBlocks.contains (block)) {
1023
- // Some subsequent destroy was meaningful, so one created at `inst`
1024
- // must be too.
1025
- return IsntDeadEnd;
1026
- }
1027
- for (auto *successor : block->getSuccessorBlocks ()) {
1028
- worklist.pushIfNotVisited (successor);
1029
- }
1030
- }
1031
- return IsDeadEnd;
1032
- }
1033
-
1034
984
// / Inserts destroys along the boundary where needed and records all final
1035
985
// / consuming uses.
1036
986
// /
@@ -1042,18 +992,6 @@ isDeadEndDestroy(SILInstruction *inst,
1042
992
void CanonicalizeOSSALifetime::insertDestroysOnBoundary (
1043
993
PrunedLivenessBoundary const &boundary,
1044
994
SmallVectorImpl<DestroyValueInst *> &newDestroys) {
1045
- BasicBlockSet semanticDestroyBlocks (getCurrentDef ()->getFunction ());
1046
- for (auto *destroy : destroys) {
1047
- if (!cast<DestroyValueInst>(destroy)->isDeadEnd ()) {
1048
- semanticDestroyBlocks.insert (destroy->getParent ());
1049
- }
1050
- }
1051
- auto isDeadEnd = [&semanticDestroyBlocks,
1052
- this ](SILInstruction *inst) -> IsDeadEnd_t {
1053
- return isDeadEndDestroy (
1054
- inst, destroys, semanticDestroyBlocks,
1055
- deadEndBlocksAnalysis->get (getCurrentDef ()->getFunction ()));
1056
- };
1057
995
BasicBlockSet seenMergePoints (getCurrentDef ()->getFunction ());
1058
996
for (auto *instruction : boundary.lastUsers ) {
1059
997
if (destroys.contains (instruction)) {
@@ -1075,8 +1013,7 @@ void CanonicalizeOSSALifetime::insertDestroysOnBoundary(
1075
1013
}
1076
1014
auto *insertionPoint = &*successor->begin ();
1077
1015
insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1078
- isDeadEnd (insertionPoint), consumes,
1079
- newDestroys, getCallbacks ());
1016
+ consumes, newDestroys, getCallbacks ());
1080
1017
LLVM_DEBUG (llvm::dbgs () << " Destroy after terminator "
1081
1018
<< *instruction << " at beginning of " ;
1082
1019
successor->printID (llvm::dbgs (), false );
@@ -1085,8 +1022,7 @@ void CanonicalizeOSSALifetime::insertDestroysOnBoundary(
1085
1022
continue ;
1086
1023
}
1087
1024
auto *insertionPoint = instruction->getNextInstruction ();
1088
- insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1089
- isDeadEnd (insertionPoint), consumes,
1025
+ insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (), consumes,
1090
1026
newDestroys, getCallbacks ());
1091
1027
LLVM_DEBUG (llvm::dbgs ()
1092
1028
<< " Destroy at last use " << insertionPoint << " \n " );
@@ -1095,25 +1031,22 @@ void CanonicalizeOSSALifetime::insertDestroysOnBoundary(
1095
1031
}
1096
1032
for (auto *edgeDestination : boundary.boundaryEdges ) {
1097
1033
auto *insertionPoint = &*edgeDestination->begin ();
1098
- insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1099
- isDeadEnd (insertionPoint), consumes,
1034
+ insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (), consumes,
1100
1035
newDestroys, getCallbacks ());
1101
1036
LLVM_DEBUG (llvm::dbgs () << " Destroy on edge " << edgeDestination << " \n " );
1102
1037
}
1103
1038
for (auto *def : boundary.deadDefs ) {
1104
1039
if (auto *arg = dyn_cast<SILArgument>(def)) {
1105
1040
auto *insertionPoint = &*arg->getParent ()->begin ();
1106
- insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1107
- isDeadEnd (insertionPoint), consumes,
1041
+ insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (), consumes,
1108
1042
newDestroys, getCallbacks ());
1109
1043
LLVM_DEBUG (llvm::dbgs ()
1110
1044
<< " Destroy after dead def arg " << arg << " \n " );
1111
1045
} else {
1112
1046
auto *instruction = cast<SILInstruction>(def);
1113
1047
auto *insertionPoint = instruction->getNextInstruction ();
1114
1048
assert (insertionPoint && " def instruction was a terminator?!" );
1115
- insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1116
- isDeadEnd (insertionPoint), consumes,
1049
+ insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (), consumes,
1117
1050
newDestroys, getCallbacks ());
1118
1051
LLVM_DEBUG (llvm::dbgs ()
1119
1052
<< " Destroy after dead def inst " << instruction << " \n " );
0 commit comments