Commit 167b0529 authored by Florian Hahn's avatar Florian Hahn
Browse files

[Local] Simplify function removeUnreachableBlocks() to avoid (re-)computation.

Two small changes in llvm::removeUnreachableBlocks() to avoid unnecessary (re-)computation.

First, replace the use of count() with find(), which has better time complexity.

Second, because we have already computed the set of dead blocks, replace the second loop over all basic blocks to a loop only over the already computed dead blocks. This simplifies the loop and avoids recomputation.

Patch by Rodrigo Caetano Rocha <rcor.cs@gmail.com>

Reviewers: efriedma, spatel, fhahn, xbolva00

Reviewed By: fhahn, xbolva00

Differential Revision: https://reviews.llvm.org/D68191

llvm-svn: 373429
parent 1c571437
Loading
Loading
Loading
Loading
+10 −16
Original line number Diff line number Diff line
@@ -2226,11 +2226,11 @@ bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI,
  NumRemoved += F.size() - Reachable.size();

  SmallSetVector<BasicBlock *, 8> DeadBlockSet;
  for (Function::iterator I = ++F.begin(), E = F.end(); I != E; ++I) {
    auto *BB = &*I;
    if (Reachable.count(BB))
  for (BasicBlock &BB : F) {
    // Skip reachable basic blocks
    if (Reachable.find(&BB) != Reachable.end())
      continue;
    DeadBlockSet.insert(BB);
    DeadBlockSet.insert(&BB);
  }

  if (MSSAU)
@@ -2249,13 +2249,6 @@ bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI,
    if (LVI)
      LVI->eraseBlock(BB);
    BB->dropAllReferences();
  }
  for (Function::iterator I = ++F.begin(); I != F.end();) {
    auto *BB = &*I;
    if (Reachable.count(BB)) {
      ++I;
      continue;
    }
    if (DTU) {
      // Remove the terminator of BB to clear the successor list of BB.
      if (BB->getTerminator())
@@ -2263,9 +2256,6 @@ bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI,
      new UnreachableInst(BB->getContext(), BB);
      assert(succ_empty(BB) && "The successor list of BB isn't empty before "
                               "applying corresponding DTU updates.");
      ++I;
    } else {
      I = F.getBasicBlockList().erase(I);
    }
  }

@@ -2281,7 +2271,11 @@ bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI,
    }
    if (!Deleted)
      return false;
  } else {
    for (auto *BB : DeadBlockSet)
      BB->eraseFromParent();
  }

  return true;
}