1
//===-- UnreachableBlockElim.cpp - Remove unreachable blocks for codegen --===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
// This pass is an extremely simple version of the SimplifyCFG pass. Its sole
11
// job is to delete LLVM basic blocks that are not reachable from the entry
12
// node. To do this, it performs a simple depth first traversal of the CFG,
13
// then deletes any unvisited nodes.
15
// Note that this pass is really a hack. In particular, the instruction
16
// selectors for various targets should just not generate code for unreachable
17
// blocks. Until LLVM has a more systematic way of defining instruction
18
// selectors, however, we cannot really expect them to handle additional
21
//===----------------------------------------------------------------------===//
23
#include "llvm/CodeGen/Passes.h"
24
#include "llvm/Constant.h"
25
#include "llvm/Instructions.h"
26
#include "llvm/Function.h"
27
#include "llvm/Pass.h"
28
#include "llvm/Type.h"
29
#include "llvm/Analysis/ProfileInfo.h"
30
#include "llvm/CodeGen/MachineDominators.h"
31
#include "llvm/CodeGen/MachineFunctionPass.h"
32
#include "llvm/CodeGen/MachineModuleInfo.h"
33
#include "llvm/CodeGen/MachineLoopInfo.h"
34
#include "llvm/CodeGen/MachineRegisterInfo.h"
35
#include "llvm/Support/CFG.h"
36
#include "llvm/Target/TargetInstrInfo.h"
37
#include "llvm/ADT/DepthFirstIterator.h"
38
#include "llvm/ADT/SmallPtrSet.h"
42
class UnreachableBlockElim : public FunctionPass {
43
virtual bool runOnFunction(Function &F);
45
static char ID; // Pass identification, replacement for typeid
46
UnreachableBlockElim() : FunctionPass(&ID) {}
48
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
49
AU.addPreserved<ProfileInfo>();
53
char UnreachableBlockElim::ID = 0;
54
static RegisterPass<UnreachableBlockElim>
55
X("unreachableblockelim", "Remove unreachable blocks from the CFG");
57
FunctionPass *llvm::createUnreachableBlockEliminationPass() {
58
return new UnreachableBlockElim();
61
bool UnreachableBlockElim::runOnFunction(Function &F) {
62
SmallPtrSet<BasicBlock*, 8> Reachable;
64
// Mark all reachable blocks.
65
for (df_ext_iterator<Function*, SmallPtrSet<BasicBlock*, 8> > I =
66
df_ext_begin(&F, Reachable), E = df_ext_end(&F, Reachable); I != E; ++I)
67
/* Mark all reachable blocks */;
69
// Loop over all dead blocks, remembering them and deleting all instructions
71
std::vector<BasicBlock*> DeadBlocks;
72
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
73
if (!Reachable.count(I)) {
75
DeadBlocks.push_back(BB);
76
while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) {
77
PN->replaceAllUsesWith(Constant::getNullValue(PN->getType()));
78
BB->getInstList().pop_front();
80
for (succ_iterator SI = succ_begin(BB), E = succ_end(BB); SI != E; ++SI)
81
(*SI)->removePredecessor(BB);
82
BB->dropAllReferences();
85
// Actually remove the blocks now.
86
ProfileInfo *PI = getAnalysisIfAvailable<ProfileInfo>();
87
for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i) {
88
if (PI) PI->removeBlock(DeadBlocks[i]);
89
DeadBlocks[i]->eraseFromParent();
92
return DeadBlocks.size();
97
class UnreachableMachineBlockElim : public MachineFunctionPass {
98
virtual bool runOnMachineFunction(MachineFunction &F);
99
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
100
MachineModuleInfo *MMI;
102
static char ID; // Pass identification, replacement for typeid
103
UnreachableMachineBlockElim() : MachineFunctionPass(&ID) {}
106
char UnreachableMachineBlockElim::ID = 0;
108
static RegisterPass<UnreachableMachineBlockElim>
109
Y("unreachable-mbb-elimination",
110
"Remove unreachable machine basic blocks");
112
const PassInfo *const llvm::UnreachableMachineBlockElimID = &Y;
114
void UnreachableMachineBlockElim::getAnalysisUsage(AnalysisUsage &AU) const {
115
AU.addPreserved<MachineLoopInfo>();
116
AU.addPreserved<MachineDominatorTree>();
117
MachineFunctionPass::getAnalysisUsage(AU);
120
bool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) {
121
SmallPtrSet<MachineBasicBlock*, 8> Reachable;
123
MMI = getAnalysisIfAvailable<MachineModuleInfo>();
124
MachineDominatorTree *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
125
MachineLoopInfo *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
127
// Mark all reachable blocks.
128
for (df_ext_iterator<MachineFunction*, SmallPtrSet<MachineBasicBlock*, 8> >
129
I = df_ext_begin(&F, Reachable), E = df_ext_end(&F, Reachable);
131
/* Mark all reachable blocks */;
133
// Loop over all dead blocks, remembering them and deleting all instructions
135
std::vector<MachineBasicBlock*> DeadBlocks;
136
for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
137
MachineBasicBlock *BB = I;
139
// Test for deadness.
140
if (!Reachable.count(BB)) {
141
DeadBlocks.push_back(BB);
143
// Update dominator and loop info.
144
if (MLI) MLI->removeBlock(BB);
145
if (MDT && MDT->getNode(BB)) MDT->eraseNode(BB);
147
while (BB->succ_begin() != BB->succ_end()) {
148
MachineBasicBlock* succ = *BB->succ_begin();
150
MachineBasicBlock::iterator start = succ->begin();
151
while (start != succ->end() && start->isPHI()) {
152
for (unsigned i = start->getNumOperands() - 1; i >= 2; i-=2)
153
if (start->getOperand(i).isMBB() &&
154
start->getOperand(i).getMBB() == BB) {
155
start->RemoveOperand(i);
156
start->RemoveOperand(i-1);
162
BB->removeSuccessor(BB->succ_begin());
167
// Actually remove the blocks now.
168
for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i) {
169
MachineBasicBlock *MBB = DeadBlocks[i];
170
// If there are any labels in the basic block, unregister them from
171
// MachineModuleInfo.
172
if (MMI && !MBB->empty()) {
173
for (MachineBasicBlock::iterator I = MBB->begin(),
174
E = MBB->end(); I != E; ++I) {
176
// The label ID # is always operand #0, an immediate.
177
MMI->InvalidateLabel(I->getOperand(0).getImm());
180
MBB->eraseFromParent();
183
// Cleanup PHI nodes.
184
for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
185
MachineBasicBlock *BB = I;
186
// Prune unneeded PHI entries.
187
SmallPtrSet<MachineBasicBlock*, 8> preds(BB->pred_begin(),
189
MachineBasicBlock::iterator phi = BB->begin();
190
while (phi != BB->end() && phi->isPHI()) {
191
for (unsigned i = phi->getNumOperands() - 1; i >= 2; i-=2)
192
if (!preds.count(phi->getOperand(i).getMBB())) {
193
phi->RemoveOperand(i);
194
phi->RemoveOperand(i-1);
197
if (phi->getNumOperands() == 3) {
198
unsigned Input = phi->getOperand(1).getReg();
199
unsigned Output = phi->getOperand(0).getReg();
201
MachineInstr* temp = phi;
203
temp->eraseFromParent();
206
F.getRegInfo().replaceRegWith(Output, Input);
217
return DeadBlocks.size();