@@ -943,7 +943,7 @@ void CanonicalizeOSSALifetime::findExtendedBoundary(
943943// / record it as a final consume.
944944static void
945945insertDestroyBeforeInstruction (SILInstruction *nextInstruction,
946- SILValue currentDef, IsDeadEnd_t isDeadEnd,
946+ SILValue currentDef,
947947 CanonicalOSSAConsumeInfo &consumes,
948948 SmallVectorImpl<DestroyValueInst *> &destroys,
949949 InstModCallbacks &callbacks) {
@@ -974,63 +974,13 @@ insertDestroyBeforeInstruction(SILInstruction *nextInstruction,
974974 SILBuilderWithScope builder (nextInstruction);
975975 auto loc =
976976 RegularLocation::getAutoGeneratedLocation (nextInstruction->getLoc ());
977- auto *dvi =
978- builder.createDestroyValue (loc, currentDef, DontPoisonRefs, isDeadEnd);
977+ auto *dvi = builder.createDestroyValue (loc, currentDef);
979978 callbacks.createdNewInst (dvi);
980979 consumes.recordFinalConsume (dvi);
981980 ++NumDestroysGenerated;
982981 destroys.push_back (dvi);
983982}
984983
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-
1034984// / Inserts destroys along the boundary where needed and records all final
1035985// / consuming uses.
1036986// /
@@ -1042,18 +992,6 @@ isDeadEndDestroy(SILInstruction *inst,
1042992void CanonicalizeOSSALifetime::insertDestroysOnBoundary (
1043993 PrunedLivenessBoundary const &boundary,
1044994 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- };
1057995 BasicBlockSet seenMergePoints (getCurrentDef ()->getFunction ());
1058996 for (auto *instruction : boundary.lastUsers ) {
1059997 if (destroys.contains (instruction)) {
@@ -1075,8 +1013,7 @@ void CanonicalizeOSSALifetime::insertDestroysOnBoundary(
10751013 }
10761014 auto *insertionPoint = &*successor->begin ();
10771015 insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1078- isDeadEnd (insertionPoint), consumes,
1079- newDestroys, getCallbacks ());
1016+ consumes, newDestroys, getCallbacks ());
10801017 LLVM_DEBUG (llvm::dbgs () << " Destroy after terminator "
10811018 << *instruction << " at beginning of " ;
10821019 successor->printID (llvm::dbgs (), false );
@@ -1085,8 +1022,7 @@ void CanonicalizeOSSALifetime::insertDestroysOnBoundary(
10851022 continue ;
10861023 }
10871024 auto *insertionPoint = instruction->getNextInstruction ();
1088- insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1089- isDeadEnd (insertionPoint), consumes,
1025+ insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (), consumes,
10901026 newDestroys, getCallbacks ());
10911027 LLVM_DEBUG (llvm::dbgs ()
10921028 << " Destroy at last use " << insertionPoint << " \n " );
@@ -1095,25 +1031,22 @@ void CanonicalizeOSSALifetime::insertDestroysOnBoundary(
10951031 }
10961032 for (auto *edgeDestination : boundary.boundaryEdges ) {
10971033 auto *insertionPoint = &*edgeDestination->begin ();
1098- insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1099- isDeadEnd (insertionPoint), consumes,
1034+ insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (), consumes,
11001035 newDestroys, getCallbacks ());
11011036 LLVM_DEBUG (llvm::dbgs () << " Destroy on edge " << edgeDestination << " \n " );
11021037 }
11031038 for (auto *def : boundary.deadDefs ) {
11041039 if (auto *arg = dyn_cast<SILArgument>(def)) {
11051040 auto *insertionPoint = &*arg->getParent ()->begin ();
1106- insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1107- isDeadEnd (insertionPoint), consumes,
1041+ insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (), consumes,
11081042 newDestroys, getCallbacks ());
11091043 LLVM_DEBUG (llvm::dbgs ()
11101044 << " Destroy after dead def arg " << arg << " \n " );
11111045 } else {
11121046 auto *instruction = cast<SILInstruction>(def);
11131047 auto *insertionPoint = instruction->getNextInstruction ();
11141048 assert (insertionPoint && " def instruction was a terminator?!" );
1115- insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (),
1116- isDeadEnd (insertionPoint), consumes,
1049+ insertDestroyBeforeInstruction (insertionPoint, getCurrentDef (), consumes,
11171050 newDestroys, getCallbacks ());
11181051 LLVM_DEBUG (llvm::dbgs ()
11191052 << " Destroy after dead def inst " << instruction << " \n " );
0 commit comments