[PATCH] D59064: [CodeGen] Reuse BlockUtils for -unreachableblockelim pass (NFC)

Brian Gesiak via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 6 17:35:28 PST 2019


modocache created this revision.
modocache added reviewers: mkazantsev, wmi, davidxl, silvas, davide.
Herald added a project: LLVM.

The logic in the -unreachableblockelim pass does the following:

1. It traverses the function it's given in depth-first order and creates a set of basic blocks that are unreachable from the function's entry node.
2. It iterates over each of those unreachable blocks and (1) removes any successors' references to the dead block, and (2) replaces any uses of instructions from the dead block with null.

The logic in (2) above is identical to what the `llvm::DeleteDeadBlocks`
function from `BasicBlockUtils.h` does. The only difference is that
`llvm::DeleteDeadBlocks` replaces uses of instructions from dead blocks
not with null, but with undef.

Replace the duplicate logic in the -unreachableblockelim pass with a
call to `llvm::DeleteDeadBlocks`. This results in less code but no
functional change (NFC).


Repository:
  rL LLVM

https://reviews.llvm.org/D59064

Files:
  lib/CodeGen/UnreachableBlockElim.cpp


Index: lib/CodeGen/UnreachableBlockElim.cpp
===================================================================
--- lib/CodeGen/UnreachableBlockElim.cpp
+++ lib/CodeGen/UnreachableBlockElim.cpp
@@ -37,6 +37,7 @@
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/Type.h"
 #include "llvm/Pass.h"
+#include "llvm/Transforms/Utils/BasicBlockUtils.h"
 using namespace llvm;
 
 static bool eliminateUnreachableBlock(Function &F) {
@@ -46,26 +47,16 @@
   for (BasicBlock *BB : depth_first_ext(&F, Reachable))
     (void)BB/* Mark all reachable blocks */;
 
-  // Loop over all dead blocks, remembering them and deleting all instructions
-  // in them.
+  // Collect all dead blocks.
   std::vector<BasicBlock*> DeadBlocks;
   for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
     if (!Reachable.count(&*I)) {
       BasicBlock *BB = &*I;
       DeadBlocks.push_back(BB);
-      while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) {
-        PN->replaceAllUsesWith(Constant::getNullValue(PN->getType()));
-        BB->getInstList().pop_front();
-      }
-      for (succ_iterator SI = succ_begin(BB), E = succ_end(BB); SI != E; ++SI)
-        (*SI)->removePredecessor(BB);
-      BB->dropAllReferences();
     }
 
-  // Actually remove the blocks now.
-  for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i) {
-    DeadBlocks[i]->eraseFromParent();
-  }
+  // Delete the dead blocks.
+  DeleteDeadBlocks(DeadBlocks);
 
   return !DeadBlocks.empty();
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D59064.189626.patch
Type: text/x-patch
Size: 1470 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190307/11c9d478/attachment.bin>


More information about the llvm-commits mailing list