@@ -174,7 +174,8 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
174174 if (!succBB->getNumArguments ())
175175 return ;
176176 args.push_back (newEdgeBB->createPhiArgument (
177- succBB->getArgument (0 )->getType (), OwnershipKind::Owned));
177+ succBB->getArgument (0 )->getType (),
178+ succBB->getArgument (0 )->getOwnershipKind ()));
178179 return ;
179180 }
180181
@@ -186,7 +187,8 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
186187 if (!succBB->getNumArguments ())
187188 return ;
188189 args.push_back (newEdgeBB->createPhiArgument (
189- succBB->getArgument (0 )->getType (), OwnershipKind::Owned));
190+ succBB->getArgument (0 )->getType (),
191+ succBB->getArgument (0 )->getOwnershipKind ()));
190192 return ;
191193 }
192194
@@ -366,6 +368,15 @@ void swift::mergeBasicBlockWithSingleSuccessor(SILBasicBlock *BB,
366368// DeadEndBlocks
367369// ===----------------------------------------------------------------------===//
368370
371+ // Propagate the reachability up the control flow graph.
372+ void DeadEndBlocks::propagateNewlyReachableBlocks (unsigned startIdx) {
373+ for (unsigned idx = startIdx; idx < reachableBlocks.size (); ++idx) {
374+ const SILBasicBlock *bb = reachableBlocks[idx];
375+ for (SILBasicBlock *predBB : bb->getPredecessorBlocks ())
376+ reachableBlocks.insert (predBB);
377+ }
378+ }
379+
369380void DeadEndBlocks::compute () {
370381 assert (reachableBlocks.empty () && " Computed twice" );
371382
@@ -377,13 +388,19 @@ void DeadEndBlocks::compute() {
377388 if (TI->isFunctionExiting ())
378389 reachableBlocks.insert (&BB);
379390 }
380- // Propagate the reachability up the control flow graph.
381- unsigned Idx = 0 ;
382- while (Idx < reachableBlocks.size ()) {
383- const SILBasicBlock *BB = reachableBlocks[Idx++];
384- for (SILBasicBlock *Pred : BB->getPredecessorBlocks ())
385- reachableBlocks.insert (Pred);
391+ propagateNewlyReachableBlocks (0 );
392+ }
393+
394+ void DeadEndBlocks::updateForReachableBlock (SILBasicBlock *reachableBB) {
395+ if (!didComputeValue)
396+ return ;
397+
398+ assert (reachableBlocks.count (reachableBB));
399+ unsigned numReachable = reachableBlocks.size ();
400+ for (SILBasicBlock *predBB : reachableBB->getPredecessorBlocks ()) {
401+ reachableBlocks.insert (predBB);
386402 }
403+ propagateNewlyReachableBlocks (numReachable);
387404}
388405
389406bool DeadEndBlocks::triviallyEndsInUnreachable (SILBasicBlock *block) {
0 commit comments