summaryrefslogtreecommitdiff
path: root/lib/CodeGen/UnreachableBlockElim.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-08-01 00:34:30 +0000
committerDan Gohman <gohman@apple.com>2009-08-01 00:34:30 +0000
commit4f3cfba575bceadcb3c2f66e83080751edcbcea6 (patch)
tree5bed45e7edbd208953b33a942ea735db74376938 /lib/CodeGen/UnreachableBlockElim.cpp
parent92aa4045d27fa50c02488f8d5131322c19329795 (diff)
downloadllvm-4f3cfba575bceadcb3c2f66e83080751edcbcea6.tar.gz
llvm-4f3cfba575bceadcb3c2f66e83080751edcbcea6.tar.bz2
llvm-4f3cfba575bceadcb3c2f66e83080751edcbcea6.tar.xz
Make UnreachableMachineBlockElim preserve MachineDominatorTree and
MachineLoopInfo. llc now runs MachineLoopInfo and MachineDominatorTree only twice, instead of three times. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77759 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/UnreachableBlockElim.cpp')
-rw-r--r--lib/CodeGen/UnreachableBlockElim.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/CodeGen/UnreachableBlockElim.cpp b/lib/CodeGen/UnreachableBlockElim.cpp
index c3b213cebe..8fe1554342 100644
--- a/lib/CodeGen/UnreachableBlockElim.cpp
+++ b/lib/CodeGen/UnreachableBlockElim.cpp
@@ -26,8 +26,10 @@
#include "llvm/Function.h"
#include "llvm/Pass.h"
#include "llvm/Type.h"
+#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
+#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/Support/CFG.h"
#include "llvm/Support/Compiler.h"
@@ -88,6 +90,7 @@ namespace {
class VISIBILITY_HIDDEN UnreachableMachineBlockElim :
public MachineFunctionPass {
virtual bool runOnMachineFunction(MachineFunction &F);
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const;
MachineModuleInfo *MMI;
public:
static char ID; // Pass identification, replacement for typeid
@@ -102,10 +105,18 @@ Y("unreachable-mbb-elimination",
const PassInfo *const llvm::UnreachableMachineBlockElimID = &Y;
+void UnreachableMachineBlockElim::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addPreserved<MachineLoopInfo>();
+ AU.addPreserved<MachineDominatorTree>();
+ MachineFunctionPass::getAnalysisUsage(AU);
+}
+
bool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) {
SmallPtrSet<MachineBasicBlock*, 8> Reachable;
MMI = getAnalysisIfAvailable<MachineModuleInfo>();
+ MachineDominatorTree *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
+ MachineLoopInfo *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
// Mark all reachable blocks.
for (df_ext_iterator<MachineFunction*, SmallPtrSet<MachineBasicBlock*, 8> >
@@ -123,6 +134,10 @@ bool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) {
if (!Reachable.count(BB)) {
DeadBlocks.push_back(BB);
+ // Update dominator and loop info.
+ if (MLI) MLI->removeBlock(BB);
+ if (MDT && MDT->getNode(BB)) MDT->eraseNode(BB);
+
while (BB->succ_begin() != BB->succ_end()) {
MachineBasicBlock* succ = *BB->succ_begin();