blob: afc24f95f11b0658aad8368d37ab2f449214c511 [file] [log] [blame]
Chris Lattnerea54ab92002-05-07 22:11:39 +00001//===- ADCE.cpp - Code to perform aggressive dead code elimination --------===//
John Criswellb576c942003-10-20 19:43:21 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattner02e90d52001-06-30 06:39:11 +00009//
Chris Lattnerea54ab92002-05-07 22:11:39 +000010// This file implements "aggressive" dead code elimination. ADCE is DCe where
Chris Lattner02e90d52001-06-30 06:39:11 +000011// values are assumed to be dead until proven otherwise. This is similar to
12// SCCP, except applied to the liveness of values.
13//
14//===----------------------------------------------------------------------===//
15
Chris Lattner022103b2002-05-07 20:03:00 +000016#include "llvm/Transforms/Scalar.h"
Chris Lattnerd9036a12002-05-22 21:32:16 +000017#include "llvm/Constant.h"
Chris Lattnerede6ac62004-04-10 06:53:09 +000018#include "llvm/Instructions.h"
19#include "llvm/Type.h"
20#include "llvm/Analysis/AliasAnalysis.h"
21#include "llvm/Analysis/PostDominators.h"
Chris Lattner221d6882002-02-12 21:07:25 +000022#include "llvm/Support/CFG.h"
Chris Lattnerbd1a90e2003-12-19 09:08:34 +000023#include "llvm/Transforms/Utils/BasicBlockUtils.h"
24#include "llvm/Transforms/Utils/Local.h"
25#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
Chris Lattner6806f562003-08-01 22:15:03 +000026#include "Support/Debug.h"
Chris Lattnercee8f9a2001-11-27 00:03:19 +000027#include "Support/DepthFirstIterator.h"
Chris Lattnera92f6962002-10-01 22:38:41 +000028#include "Support/Statistic.h"
Chris Lattner6806f562003-08-01 22:15:03 +000029#include "Support/STLExtras.h"
Chris Lattner72f1e992001-07-08 18:38:36 +000030#include <algorithm>
Chris Lattnerbd1a90e2003-12-19 09:08:34 +000031using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000032
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000033namespace {
Chris Lattnera92f6962002-10-01 22:38:41 +000034 Statistic<> NumBlockRemoved("adce", "Number of basic blocks removed");
35 Statistic<> NumInstRemoved ("adce", "Number of instructions removed");
Chris Lattnerede6ac62004-04-10 06:53:09 +000036 Statistic<> NumCallRemoved ("adce", "Number of calls and invokes removed");
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000037
Chris Lattner02e90d52001-06-30 06:39:11 +000038//===----------------------------------------------------------------------===//
39// ADCE Class
40//
Chris Lattnerea54ab92002-05-07 22:11:39 +000041// This class does all of the work of Aggressive Dead Code Elimination.
Chris Lattner02e90d52001-06-30 06:39:11 +000042// It's public interface consists of a constructor and a doADCE() method.
43//
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000044class ADCE : public FunctionPass {
45 Function *Func; // The function that we are working on
Chris Lattnerede6ac62004-04-10 06:53:09 +000046 AliasAnalysis *AA; // Current AliasAnalysis object
Chris Lattner697954c2002-01-20 22:54:45 +000047 std::vector<Instruction*> WorkList; // Instructions that just became live
48 std::set<Instruction*> LiveSet; // The set of live instructions
Chris Lattner02e90d52001-06-30 06:39:11 +000049
50 //===--------------------------------------------------------------------===//
51 // The public interface for this class
52 //
53public:
Chris Lattnerd9036a12002-05-22 21:32:16 +000054 // Execute the Aggressive Dead Code Elimination Algorithm
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000055 //
Chris Lattner7e708292002-06-25 16:13:24 +000056 virtual bool runOnFunction(Function &F) {
57 Func = &F;
Chris Lattnerede6ac62004-04-10 06:53:09 +000058 AA = &getAnalysis<AliasAnalysis>();
Chris Lattnerd9036a12002-05-22 21:32:16 +000059 bool Changed = doADCE();
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000060 assert(WorkList.empty());
61 LiveSet.clear();
Chris Lattnerd9036a12002-05-22 21:32:16 +000062 return Changed;
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000063 }
64 // getAnalysisUsage - We require post dominance frontiers (aka Control
65 // Dependence Graph)
66 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattnerbd1a90e2003-12-19 09:08:34 +000067 // We require that all function nodes are unified, because otherwise code
68 // can be marked live that wouldn't necessarily be otherwise.
69 AU.addRequired<UnifyFunctionExitNodes>();
Chris Lattnerede6ac62004-04-10 06:53:09 +000070 AU.addRequired<AliasAnalysis>();
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000071 AU.addRequired<PostDominatorTree>();
72 AU.addRequired<PostDominanceFrontier>();
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000073 }
Chris Lattner02e90d52001-06-30 06:39:11 +000074
Chris Lattner02e90d52001-06-30 06:39:11 +000075
76 //===--------------------------------------------------------------------===//
77 // The implementation of this class
78 //
79private:
Chris Lattnerea54ab92002-05-07 22:11:39 +000080 // doADCE() - Run the Aggressive Dead Code Elimination algorithm, returning
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000081 // true if the function was modified.
82 //
Chris Lattnerd9036a12002-05-22 21:32:16 +000083 bool doADCE();
84
85 void markBlockAlive(BasicBlock *BB);
Chris Lattnerdfe81ab2002-05-06 17:27:57 +000086
Chris Lattner446698b2002-07-30 00:22:34 +000087
88 // dropReferencesOfDeadInstructionsInLiveBlock - Loop over all of the
89 // instructions in the specified basic block, dropping references on
90 // instructions that are dead according to LiveSet.
91 bool dropReferencesOfDeadInstructionsInLiveBlock(BasicBlock *BB);
92
Chris Lattner837e42c2003-06-24 23:02:45 +000093 TerminatorInst *convertToUnconditionalBranch(TerminatorInst *TI);
94
Chris Lattner02e90d52001-06-30 06:39:11 +000095 inline void markInstructionLive(Instruction *I) {
96 if (LiveSet.count(I)) return;
Chris Lattnerde579f12003-05-22 22:00:07 +000097 DEBUG(std::cerr << "Insn Live: " << I);
Chris Lattner02e90d52001-06-30 06:39:11 +000098 LiveSet.insert(I);
99 WorkList.push_back(I);
100 }
101
Chris Lattner72f1e992001-07-08 18:38:36 +0000102 inline void markTerminatorLive(const BasicBlock *BB) {
Chris Lattner545a76c2003-09-10 20:38:14 +0000103 DEBUG(std::cerr << "Terminator Live: " << BB->getTerminator());
104 markInstructionLive(const_cast<TerminatorInst*>(BB->getTerminator()));
Chris Lattner72f1e992001-07-08 18:38:36 +0000105 }
Chris Lattner02e90d52001-06-30 06:39:11 +0000106};
107
Chris Lattnera6275cc2002-07-26 21:12:46 +0000108 RegisterOpt<ADCE> X("adce", "Aggressive Dead Code Elimination");
Chris Lattnerdfe81ab2002-05-06 17:27:57 +0000109} // End of anonymous namespace
110
Chris Lattnerbd1a90e2003-12-19 09:08:34 +0000111Pass *llvm::createAggressiveDCEPass() { return new ADCE(); }
Chris Lattnerd9036a12002-05-22 21:32:16 +0000112
Chris Lattnerd9036a12002-05-22 21:32:16 +0000113void ADCE::markBlockAlive(BasicBlock *BB) {
114 // Mark the basic block as being newly ALIVE... and mark all branches that
Misha Brukmanef6a6a62003-08-21 22:14:26 +0000115 // this block is control dependent on as being alive also...
Chris Lattnerd9036a12002-05-22 21:32:16 +0000116 //
Chris Lattnerce6ef112002-07-26 18:40:14 +0000117 PostDominanceFrontier &CDG = getAnalysis<PostDominanceFrontier>();
Chris Lattnerd9036a12002-05-22 21:32:16 +0000118
Chris Lattnerce6ef112002-07-26 18:40:14 +0000119 PostDominanceFrontier::const_iterator It = CDG.find(BB);
Chris Lattnerd9036a12002-05-22 21:32:16 +0000120 if (It != CDG.end()) {
Misha Brukmanef6a6a62003-08-21 22:14:26 +0000121 // Get the blocks that this node is control dependent on...
Chris Lattnerce6ef112002-07-26 18:40:14 +0000122 const PostDominanceFrontier::DomSetType &CDB = It->second;
Chris Lattnerd9036a12002-05-22 21:32:16 +0000123 for_each(CDB.begin(), CDB.end(), // Mark all their terminators as live
124 bind_obj(this, &ADCE::markTerminatorLive));
125 }
126
Chris Lattner99c91e02003-06-24 21:49:45 +0000127 // If this basic block is live, and it ends in an unconditional branch, then
128 // the branch is alive as well...
129 if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator()))
130 if (BI->isUnconditional())
131 markTerminatorLive(BB);
Chris Lattnerdfe81ab2002-05-06 17:27:57 +0000132}
Chris Lattner02e90d52001-06-30 06:39:11 +0000133
Chris Lattner446698b2002-07-30 00:22:34 +0000134// dropReferencesOfDeadInstructionsInLiveBlock - Loop over all of the
135// instructions in the specified basic block, dropping references on
136// instructions that are dead according to LiveSet.
137bool ADCE::dropReferencesOfDeadInstructionsInLiveBlock(BasicBlock *BB) {
138 bool Changed = false;
139 for (BasicBlock::iterator I = BB->begin(), E = --BB->end(); I != E; )
140 if (!LiveSet.count(I)) { // Is this instruction alive?
141 I->dropAllReferences(); // Nope, drop references...
Chris Lattnere408e252003-04-23 16:37:45 +0000142 if (PHINode *PN = dyn_cast<PHINode>(I)) {
Chris Lattner446698b2002-07-30 00:22:34 +0000143 // We don't want to leave PHI nodes in the program that have
144 // #arguments != #predecessors, so we remove them now.
145 //
146 PN->replaceAllUsesWith(Constant::getNullValue(PN->getType()));
147
148 // Delete the instruction...
149 I = BB->getInstList().erase(I);
150 Changed = true;
Chris Lattnere400a092004-02-01 05:15:07 +0000151 ++NumInstRemoved;
Chris Lattner446698b2002-07-30 00:22:34 +0000152 } else {
153 ++I;
154 }
155 } else {
156 ++I;
157 }
158 return Changed;
159}
160
Chris Lattner02e90d52001-06-30 06:39:11 +0000161
Chris Lattner837e42c2003-06-24 23:02:45 +0000162/// convertToUnconditionalBranch - Transform this conditional terminator
163/// instruction into an unconditional branch because we don't care which of the
164/// successors it goes to. This eliminate a use of the condition as well.
165///
166TerminatorInst *ADCE::convertToUnconditionalBranch(TerminatorInst *TI) {
167 BranchInst *NB = new BranchInst(TI->getSuccessor(0), TI);
168 BasicBlock *BB = TI->getParent();
169
170 // Remove entries from PHI nodes to avoid confusing ourself later...
171 for (unsigned i = 1, e = TI->getNumSuccessors(); i != e; ++i)
172 TI->getSuccessor(i)->removePredecessor(BB);
173
174 // Delete the old branch itself...
175 BB->getInstList().erase(TI);
176 return NB;
177}
178
179
Chris Lattnerea54ab92002-05-07 22:11:39 +0000180// doADCE() - Run the Aggressive Dead Code Elimination algorithm, returning
Chris Lattnerf57b8452002-04-27 06:56:12 +0000181// true if the function was modified.
Chris Lattner02e90d52001-06-30 06:39:11 +0000182//
Chris Lattnerd9036a12002-05-22 21:32:16 +0000183bool ADCE::doADCE() {
184 bool MadeChanges = false;
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000185
Chris Lattnerf57b8452002-04-27 06:56:12 +0000186 // Iterate over all of the instructions in the function, eliminating trivially
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000187 // dead instructions, and marking instructions live that are known to be
188 // needed. Perform the walk in depth first order so that we avoid marking any
189 // instructions live in basic blocks that are unreachable. These blocks will
190 // be eliminated later, along with the instructions inside.
191 //
Chris Lattnerdfe81ab2002-05-06 17:27:57 +0000192 for (df_iterator<Function*> BBI = df_begin(Func), BBE = df_end(Func);
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000193 BBI != BBE; ++BBI) {
194 BasicBlock *BB = *BBI;
195 for (BasicBlock::iterator II = BB->begin(), EI = BB->end(); II != EI; ) {
Chris Lattnerede6ac62004-04-10 06:53:09 +0000196 Instruction *I = II++;
197 if (CallInst *CI = dyn_cast<CallInst>(I)) {
198 Function *F = CI->getCalledFunction();
199 if (F && AA->onlyReadsMemory(F)) {
200 if (CI->use_empty()) {
201 BB->getInstList().erase(CI);
202 ++NumCallRemoved;
203 }
204 } else {
205 markInstructionLive(I);
206 }
207 } else if (InvokeInst *II = dyn_cast<InvokeInst>(I)) {
208 Function *F = II->getCalledFunction();
209 if (F && AA->onlyReadsMemory(F)) {
210 // The function cannot unwind. Convert it to a call with a branch
211 // after it to the normal destination.
212 std::vector<Value*> Args(II->op_begin()+1, II->op_end());
213 std::string Name = II->getName(); II->setName("");
214 Instruction *NewCall = new CallInst(F, Args, Name, II);
215 II->replaceAllUsesWith(NewCall);
216 new BranchInst(II->getNormalDest(), II);
217 BB->getInstList().erase(II);
218
219 if (NewCall->use_empty()) {
220 BB->getInstList().erase(NewCall);
221 ++NumCallRemoved;
222 }
223 } else {
224 markInstructionLive(I);
225 }
226 } else if (I->mayWriteToMemory() || isa<ReturnInst>(I) ||
227 isa<UnwindInst>(I)) {
228 markInstructionLive(I);
229 } else if (isInstructionTriviallyDead(I)) {
Chris Lattnerea54ab92002-05-07 22:11:39 +0000230 // Remove the instruction from it's basic block...
Chris Lattnerede6ac62004-04-10 06:53:09 +0000231 BB->getInstList().erase(I);
Chris Lattnerd9036a12002-05-22 21:32:16 +0000232 ++NumInstRemoved;
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000233 }
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000234 }
235 }
236
Chris Lattner34e353e2003-06-16 12:10:45 +0000237 // Check to ensure we have an exit node for this CFG. If we don't, we won't
238 // have any post-dominance information, thus we cannot perform our
239 // transformations safely.
240 //
241 PostDominatorTree &DT = getAnalysis<PostDominatorTree>();
Chris Lattner02a3be02003-09-20 14:39:18 +0000242 if (DT[&Func->getEntryBlock()] == 0) {
Chris Lattner34e353e2003-06-16 12:10:45 +0000243 WorkList.clear();
244 return MadeChanges;
245 }
246
Chris Lattnerfaa45ce2003-11-16 21:39:27 +0000247 // Scan the function marking blocks without post-dominance information as
248 // live. Blocks without post-dominance information occur when there is an
249 // infinite loop in the program. Because the infinite loop could contain a
250 // function which unwinds, exits or has side-effects, we don't want to delete
251 // the infinite loop or those blocks leading up to it.
252 for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I)
253 if (DT[I] == 0)
254 for (pred_iterator PI = pred_begin(I), E = pred_end(I); PI != E; ++PI)
255 markInstructionLive((*PI)->getTerminator());
256
257
258
Chris Lattnerde579f12003-05-22 22:00:07 +0000259 DEBUG(std::cerr << "Processing work list\n");
Chris Lattner02e90d52001-06-30 06:39:11 +0000260
Chris Lattner72f1e992001-07-08 18:38:36 +0000261 // AliveBlocks - Set of basic blocks that we know have instructions that are
262 // alive in them...
263 //
Chris Lattner697954c2002-01-20 22:54:45 +0000264 std::set<BasicBlock*> AliveBlocks;
Chris Lattner72f1e992001-07-08 18:38:36 +0000265
Chris Lattner02e90d52001-06-30 06:39:11 +0000266 // Process the work list of instructions that just became live... if they
Misha Brukman5560c9d2003-08-18 14:43:39 +0000267 // became live, then that means that all of their operands are necessary as
Chris Lattner02e90d52001-06-30 06:39:11 +0000268 // well... make them live as well.
269 //
270 while (!WorkList.empty()) {
Chris Lattner72f1e992001-07-08 18:38:36 +0000271 Instruction *I = WorkList.back(); // Get an instruction that became live...
Chris Lattner02e90d52001-06-30 06:39:11 +0000272 WorkList.pop_back();
273
Chris Lattner72f1e992001-07-08 18:38:36 +0000274 BasicBlock *BB = I->getParent();
Chris Lattnerd9036a12002-05-22 21:32:16 +0000275 if (!AliveBlocks.count(BB)) { // Basic block not alive yet...
276 AliveBlocks.insert(BB); // Block is now ALIVE!
277 markBlockAlive(BB); // Make it so now!
Chris Lattner72f1e992001-07-08 18:38:36 +0000278 }
279
Chris Lattnerd9036a12002-05-22 21:32:16 +0000280 // PHI nodes are a special case, because the incoming values are actually
281 // defined in the predecessor nodes of this block, meaning that the PHI
282 // makes the predecessors alive.
283 //
284 if (PHINode *PN = dyn_cast<PHINode>(I))
285 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI)
286 if (!AliveBlocks.count(*PI)) {
287 AliveBlocks.insert(BB); // Block is now ALIVE!
288 markBlockAlive(*PI);
289 }
290
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000291 // Loop over all of the operands of the live instruction, making sure that
292 // they are known to be alive as well...
293 //
Chris Lattnerea54ab92002-05-07 22:11:39 +0000294 for (unsigned op = 0, End = I->getNumOperands(); op != End; ++op)
Chris Lattner9636a912001-10-01 16:18:37 +0000295 if (Instruction *Operand = dyn_cast<Instruction>(I->getOperand(op)))
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000296 markInstructionLive(Operand);
Chris Lattner02e90d52001-06-30 06:39:11 +0000297 }
298
Chris Lattnerde579f12003-05-22 22:00:07 +0000299 DEBUG(
300 std::cerr << "Current Function: X = Live\n";
Chris Lattner34e353e2003-06-16 12:10:45 +0000301 for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I){
302 std::cerr << I->getName() << ":\t"
303 << (AliveBlocks.count(I) ? "LIVE\n" : "DEAD\n");
Chris Lattner7e708292002-06-25 16:13:24 +0000304 for (BasicBlock::iterator BI = I->begin(), BE = I->end(); BI != BE; ++BI){
Chris Lattnerde579f12003-05-22 22:00:07 +0000305 if (LiveSet.count(BI)) std::cerr << "X ";
306 std::cerr << *BI;
Chris Lattnerf016ea42002-05-22 17:17:27 +0000307 }
Chris Lattner34e353e2003-06-16 12:10:45 +0000308 });
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000309
Chris Lattnerd9036a12002-05-22 21:32:16 +0000310 // Find the first postdominator of the entry node that is alive. Make it the
311 // new entry node...
Chris Lattner02e90d52001-06-30 06:39:11 +0000312 //
Chris Lattner446698b2002-07-30 00:22:34 +0000313 if (AliveBlocks.size() == Func->size()) { // No dead blocks?
Chris Lattner837e42c2003-06-24 23:02:45 +0000314 for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I) {
Chris Lattner446698b2002-07-30 00:22:34 +0000315 // Loop over all of the instructions in the function, telling dead
316 // instructions to drop their references. This is so that the next sweep
317 // over the program can safely delete dead instructions without other dead
Misha Brukmancf00c4a2003-10-10 17:57:28 +0000318 // instructions still referring to them.
Chris Lattner446698b2002-07-30 00:22:34 +0000319 //
320 dropReferencesOfDeadInstructionsInLiveBlock(I);
Chris Lattner837e42c2003-06-24 23:02:45 +0000321
322 // Check to make sure the terminator instruction is live. If it isn't,
323 // this means that the condition that it branches on (we know it is not an
324 // unconditional branch), is not needed to make the decision of where to
325 // go to, because all outgoing edges go to the same place. We must remove
326 // the use of the condition (because it's probably dead), so we convert
327 // the terminator to a conditional branch.
328 //
329 TerminatorInst *TI = I->getTerminator();
330 if (!LiveSet.count(TI))
331 convertToUnconditionalBranch(TI);
332 }
Chris Lattner446698b2002-07-30 00:22:34 +0000333
334 } else { // If there are some blocks dead...
Chris Lattnerdb6e4d62002-08-14 21:35:02 +0000335 // If the entry node is dead, insert a new entry node to eliminate the entry
336 // node as a special case.
337 //
338 if (!AliveBlocks.count(&Func->front())) {
339 BasicBlock *NewEntry = new BasicBlock();
Chris Lattner108e4ab2003-11-21 16:52:05 +0000340 new BranchInst(&Func->front(), NewEntry);
Chris Lattnerdb6e4d62002-08-14 21:35:02 +0000341 Func->getBasicBlockList().push_front(NewEntry);
342 AliveBlocks.insert(NewEntry); // This block is always alive!
Chris Lattner99c91e02003-06-24 21:49:45 +0000343 LiveSet.insert(NewEntry->getTerminator()); // The branch is live
Chris Lattnerdb6e4d62002-08-14 21:35:02 +0000344 }
Chris Lattnerd9036a12002-05-22 21:32:16 +0000345
346 // Loop over all of the alive blocks in the function. If any successor
347 // blocks are not alive, we adjust the outgoing branches to branch to the
348 // first live postdominator of the live block, adjusting any PHI nodes in
349 // the block to reflect this.
350 //
351 for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I)
Chris Lattner7e708292002-06-25 16:13:24 +0000352 if (AliveBlocks.count(I)) {
353 BasicBlock *BB = I;
Chris Lattnerd9036a12002-05-22 21:32:16 +0000354 TerminatorInst *TI = BB->getTerminator();
355
Chris Lattner99c91e02003-06-24 21:49:45 +0000356 // If the terminator instruction is alive, but the block it is contained
357 // in IS alive, this means that this terminator is a conditional branch
358 // on a condition that doesn't matter. Make it an unconditional branch
359 // to ONE of the successors. This has the side effect of dropping a use
360 // of the conditional value, which may also be dead.
Chris Lattner837e42c2003-06-24 23:02:45 +0000361 if (!LiveSet.count(TI))
362 TI = convertToUnconditionalBranch(TI);
Chris Lattner99c91e02003-06-24 21:49:45 +0000363
Chris Lattner011de072002-07-29 22:31:39 +0000364 // Loop over all of the successors, looking for ones that are not alive.
365 // We cannot save the number of successors in the terminator instruction
366 // here because we may remove them if we don't have a postdominator...
367 //
368 for (unsigned i = 0; i != TI->getNumSuccessors(); ++i)
Chris Lattnerd9036a12002-05-22 21:32:16 +0000369 if (!AliveBlocks.count(TI->getSuccessor(i))) {
370 // Scan up the postdominator tree, looking for the first
371 // postdominator that is alive, and the last postdominator that is
372 // dead...
373 //
Chris Lattnerce6ef112002-07-26 18:40:14 +0000374 PostDominatorTree::Node *LastNode = DT[TI->getSuccessor(i)];
Chris Lattner011de072002-07-29 22:31:39 +0000375
376 // There is a special case here... if there IS no post-dominator for
377 // the block we have no owhere to point our branch to. Instead,
378 // convert it to a return. This can only happen if the code
379 // branched into an infinite loop. Note that this may not be
380 // desirable, because we _are_ altering the behavior of the code.
381 // This is a well known drawback of ADCE, so in the future if we
382 // choose to revisit the decision, this is where it should be.
Chris Lattnerd9036a12002-05-22 21:32:16 +0000383 //
Chris Lattner011de072002-07-29 22:31:39 +0000384 if (LastNode == 0) { // No postdominator!
385 // Call RemoveSuccessor to transmogrify the terminator instruction
386 // to not contain the outgoing branch, or to create a new
Misha Brukmancf00c4a2003-10-10 17:57:28 +0000387 // terminator if the form fundamentally changes (i.e.,
388 // unconditional branch to return). Note that this will change a
389 // branch into an infinite loop into a return instruction!
Chris Lattner011de072002-07-29 22:31:39 +0000390 //
391 RemoveSuccessor(TI, i);
392
393 // RemoveSuccessor may replace TI... make sure we have a fresh
394 // pointer... and e variable.
395 //
396 TI = BB->getTerminator();
397
398 // Rescan this successor...
399 --i;
400 } else {
401 PostDominatorTree::Node *NextNode = LastNode->getIDom();
402
Chris Lattnerc444a422003-09-11 16:26:13 +0000403 while (!AliveBlocks.count(NextNode->getBlock())) {
Chris Lattner011de072002-07-29 22:31:39 +0000404 LastNode = NextNode;
405 NextNode = NextNode->getIDom();
406 }
407
408 // Get the basic blocks that we need...
Chris Lattnerc444a422003-09-11 16:26:13 +0000409 BasicBlock *LastDead = LastNode->getBlock();
410 BasicBlock *NextAlive = NextNode->getBlock();
Chris Lattner011de072002-07-29 22:31:39 +0000411
412 // Make the conditional branch now go to the next alive block...
413 TI->getSuccessor(i)->removePredecessor(BB);
414 TI->setSuccessor(i, NextAlive);
415
416 // If there are PHI nodes in NextAlive, we need to add entries to
417 // the PHI nodes for the new incoming edge. The incoming values
418 // should be identical to the incoming values for LastDead.
419 //
420 for (BasicBlock::iterator II = NextAlive->begin();
Chris Lattner619f8252003-04-25 22:53:27 +0000421 PHINode *PN = dyn_cast<PHINode>(II); ++II)
422 if (LiveSet.count(PN)) { // Only modify live phi nodes
423 // Get the incoming value for LastDead...
424 int OldIdx = PN->getBasicBlockIndex(LastDead);
425 assert(OldIdx != -1 &&"LastDead is not a pred of NextAlive!");
426 Value *InVal = PN->getIncomingValue(OldIdx);
427
428 // Add an incoming value for BB now...
429 PN->addIncoming(InVal, BB);
430 }
Chris Lattnerd9036a12002-05-22 21:32:16 +0000431 }
432 }
Chris Lattner55547272002-05-10 15:37:35 +0000433
Chris Lattnerd9036a12002-05-22 21:32:16 +0000434 // Now loop over all of the instructions in the basic block, telling
435 // dead instructions to drop their references. This is so that the next
436 // sweep over the program can safely delete dead instructions without
Misha Brukmancf00c4a2003-10-10 17:57:28 +0000437 // other dead instructions still referring to them.
Chris Lattnerd9036a12002-05-22 21:32:16 +0000438 //
Chris Lattner446698b2002-07-30 00:22:34 +0000439 dropReferencesOfDeadInstructionsInLiveBlock(BB);
Chris Lattnerd9036a12002-05-22 21:32:16 +0000440 }
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000441 }
442
Chris Lattnerd7f268d2003-01-23 02:12:18 +0000443 // We make changes if there are any dead blocks in the function...
444 if (unsigned NumDeadBlocks = Func->size() - AliveBlocks.size()) {
445 MadeChanges = true;
446 NumBlockRemoved += NumDeadBlocks;
447 }
448
449 // Loop over all of the basic blocks in the function, removing control flow
450 // edges to live blocks (also eliminating any entries in PHI functions in
451 // referenced blocks).
Chris Lattnerd9036a12002-05-22 21:32:16 +0000452 //
Chris Lattnerd7f268d2003-01-23 02:12:18 +0000453 for (Function::iterator BB = Func->begin(), E = Func->end(); BB != E; ++BB)
Chris Lattner84369b32002-05-28 21:38:16 +0000454 if (!AliveBlocks.count(BB)) {
Chris Lattnerd9036a12002-05-22 21:32:16 +0000455 // Remove all outgoing edges from this basic block and convert the
456 // terminator into a return instruction.
Chris Lattnerde579f12003-05-22 22:00:07 +0000457 std::vector<BasicBlock*> Succs(succ_begin(BB), succ_end(BB));
Chris Lattnerd9036a12002-05-22 21:32:16 +0000458
459 if (!Succs.empty()) {
460 // Loop over all of the successors, removing this block from PHI node
461 // entries that might be in the block...
462 while (!Succs.empty()) {
463 Succs.back()->removePredecessor(BB);
464 Succs.pop_back();
465 }
466
467 // Delete the old terminator instruction...
Chris Lattnerc8ecd222003-11-22 02:13:08 +0000468 const Type *TermTy = BB->getTerminator()->getType();
469 if (TermTy != Type::VoidTy)
470 BB->getTerminator()->replaceAllUsesWith(
471 Constant::getNullValue(TermTy));
Chris Lattner7e708292002-06-25 16:13:24 +0000472 BB->getInstList().pop_back();
Chris Lattnerd9036a12002-05-22 21:32:16 +0000473 const Type *RetTy = Func->getReturnType();
Chris Lattnerf8485c62003-11-20 18:25:24 +0000474 new ReturnInst(RetTy != Type::VoidTy ?
475 Constant::getNullValue(RetTy) : 0, BB);
Chris Lattnerd9036a12002-05-22 21:32:16 +0000476 }
Chris Lattnerd9036a12002-05-22 21:32:16 +0000477 }
Chris Lattnerd7f268d2003-01-23 02:12:18 +0000478
479
480 // Loop over all of the basic blocks in the function, dropping references of
481 // the dead basic blocks. We must do this after the previous step to avoid
482 // dropping references to PHIs which still have entries...
483 //
484 for (Function::iterator BB = Func->begin(), E = Func->end(); BB != E; ++BB)
485 if (!AliveBlocks.count(BB))
486 BB->dropAllReferences();
Chris Lattner55547272002-05-10 15:37:35 +0000487
Chris Lattner84369b32002-05-28 21:38:16 +0000488 // Now loop through all of the blocks and delete the dead ones. We can safely
489 // do this now because we know that there are no references to dead blocks
490 // (because they have dropped all of their references... we also remove dead
491 // instructions from alive blocks.
Chris Lattnerb8259dd2001-09-09 22:26:47 +0000492 //
Chris Lattnerd9036a12002-05-22 21:32:16 +0000493 for (Function::iterator BI = Func->begin(); BI != Func->end(); )
Chris Lattner446698b2002-07-30 00:22:34 +0000494 if (!AliveBlocks.count(BI)) { // Delete dead blocks...
Chris Lattner7e708292002-06-25 16:13:24 +0000495 BI = Func->getBasicBlockList().erase(BI);
Chris Lattner446698b2002-07-30 00:22:34 +0000496 } else { // Scan alive blocks...
Chris Lattner7e708292002-06-25 16:13:24 +0000497 for (BasicBlock::iterator II = BI->begin(); II != --BI->end(); )
498 if (!LiveSet.count(II)) { // Is this instruction alive?
Chris Lattner84369b32002-05-28 21:38:16 +0000499 // Nope... remove the instruction from it's basic block...
Chris Lattner7e708292002-06-25 16:13:24 +0000500 II = BI->getInstList().erase(II);
Chris Lattner84369b32002-05-28 21:38:16 +0000501 ++NumInstRemoved;
502 MadeChanges = true;
503 } else {
504 ++II;
505 }
506
Chris Lattnerd9036a12002-05-22 21:32:16 +0000507 ++BI; // Increment iterator...
Chris Lattner84369b32002-05-28 21:38:16 +0000508 }
Chris Lattner55547272002-05-10 15:37:35 +0000509
Chris Lattnerd9036a12002-05-22 21:32:16 +0000510 return MadeChanges;
Chris Lattner02e90d52001-06-30 06:39:11 +0000511}