xref: /llvm-project/llvm/lib/Transforms/Scalar/DCE.cpp (revision 7e0d6e05ac0cd09d7f7dcbb4efe62d66b9a66a70)
1 //===- DCE.cpp - Code to perform dead code elimination --------------------===//
2 //
3 // This file implements dead code elimination and basic block merging.
4 //
5 // Specifically, this:
6 //   * removes definitions with no uses (including unused constants)
7 //   * removes basic blocks with no predecessors
8 //   * merges a basic block into its predecessor if there is only one and the
9 //     predecessor only has one successor.
10 //   * Eliminates PHI nodes for basic blocks with a single predecessor
11 //   * Eliminates a basic block that only contains an unconditional branch
12 //
13 // TODO: This should REALLY be recursive instead of iterative.  Right now, we
14 // scan linearly through values, removing unused ones as we go.  The problem is
15 // that this may cause other earlier values to become unused.  To make sure that
16 // we get them all, we iterate until things stop changing.  Instead, when
17 // removing a value, recheck all of its operands to see if they are now unused.
18 // Piece of cake, and more efficient as well.
19 //
20 //===----------------------------------------------------------------------===//
21 
22 #include "llvm/Module.h"
23 #include "llvm/Method.h"
24 #include "llvm/BasicBlock.h"
25 #include "llvm/iTerminators.h"
26 #include "llvm/iOther.h"
27 #include "llvm/Opt/AllOpts.h"
28 #include "llvm/Assembly/Writer.h"
29 #include "llvm/CFG.h"
30 
31 struct ConstPoolDCE {
32   enum { EndOffs = 0 };
33   static bool isDCEable(const Value *) { return true; }
34 };
35 
36 struct BasicBlockDCE {
37   enum { EndOffs = 1 };
38   static bool isDCEable(const Instruction *I) {
39     return !I->hasSideEffects();
40   }
41 };
42 
43 
44 template<class ValueSubclass, class ItemParentType, class DCEController>
45 static bool RemoveUnusedDefs(ValueHolder<ValueSubclass, ItemParentType> &Vals,
46 			     DCEController DCEControl) {
47   bool Changed = false;
48   typedef ValueHolder<ValueSubclass, ItemParentType> Container;
49 
50   int Offset = DCEController::EndOffs;
51   for (Container::iterator DI = Vals.begin(); DI != Vals.end()-Offset; ) {
52     // Look for un"used" definitions...
53     if ((*DI)->use_empty() && DCEController::isDCEable(*DI)) {
54       // Bye bye
55       //cerr << "Removing: " << *DI;
56       delete Vals.remove(DI);
57       Changed = true;
58     } else {
59       DI++;
60     }
61   }
62   return Changed;
63 }
64 
65 // RemoveSingularPHIs - This removes PHI nodes from basic blocks that have only
66 // a single predecessor.  This means that the PHI node must only have a single
67 // RHS value and can be eliminated.
68 //
69 // This routine is very simple because we know that PHI nodes must be the first
70 // things in a basic block, if they are present.
71 //
72 static bool RemoveSingularPHIs(BasicBlock *BB) {
73   pred_iterator PI(pred_begin(BB));
74   if (PI == pred_end(BB) || ++PI != pred_end(BB))
75     return false;   // More than one predecessor...
76 
77   Instruction *I = BB->getInstList().front();
78   if (I->getInstType() != Instruction::PHINode) return false;  // No PHI nodes
79 
80   cerr << "Killing PHIs from " << BB;
81   cerr << "Pred #0 = " << *pred_begin(BB);
82 
83   cerr << "Method == " << BB->getParent();
84 
85   do {
86     PHINode *PN = (PHINode*)I;
87     assert(PN->getOperand(1) == 0 && "PHI node should only have one value!");
88     Value *V = PN->getOperand(0);
89 
90     PN->replaceAllUsesWith(V);      // Replace PHI node with its single value.
91     delete BB->getInstList().remove(BB->getInstList().begin());
92 
93     I = BB->getInstList().front();
94   } while (I->getInstType() == Instruction::PHINode);
95 
96   return true;  // Yes, we nuked at least one phi node
97 }
98 
99 bool DoRemoveUnusedConstants(SymTabValue *S) {
100   bool Changed = false;
101   ConstantPool &CP = S->getConstantPool();
102   for (ConstantPool::plane_iterator PI = CP.begin(); PI != CP.end(); ++PI)
103     Changed |= RemoveUnusedDefs(**PI, ConstPoolDCE());
104   return Changed;
105 }
106 
107 static void ReplaceUsesWithConstant(Instruction *I) {
108   // Get the method level constant pool
109   ConstantPool &CP = I->getParent()->getParent()->getConstantPool();
110 
111   ConstPoolVal *CPV = 0;
112   ConstantPool::PlaneType *P;
113   if (!CP.getPlane(I->getType(), P)) {  // Does plane exist?
114     // Yes, is it empty?
115     if (!P->empty()) CPV = P->front();
116   }
117 
118   if (CPV == 0) { // We don't have an existing constant to reuse.  Just add one.
119     CPV = ConstPoolVal::getNullConstant(I->getType());  // Create a new constant
120 
121     // Add the new value to the constant pool...
122     CP.insert(CPV);
123   }
124 
125   // Make all users of this instruction reference the constant instead
126   I->replaceAllUsesWith(CPV);
127 }
128 
129 // RemovePredecessorFromBlock - This function is called when we are about
130 // to remove a predecessor from a basic block.  This function takes care of
131 // removing the predecessor from the PHI nodes in BB so that after the pred
132 // is removed, the number of PHI slots per bb is equal to the number of
133 // predecessors.
134 //
135 static void RemovePredecessorFromBlock(BasicBlock *BB, BasicBlock *Pred) {
136   pred_iterator PI(pred_begin(BB)), EI(pred_end(BB));
137   unsigned pred_idx = 0, max_idx;
138 
139   cerr << "RPFB: " << Pred << "From Block: " << BB;
140 
141   // Find out what index the predecessor is...
142   for (; *PI != BB; ++PI, ++pred_idx) {
143     assert(PI != EI && "Pred is not a predecessor of BB!");
144   }
145 
146   // Loop over the rest of the predecssors until we run out, or until we find
147   // out that there are more than 2 predecessors.
148   for (max_idx = pred_idx; PI != EI && max_idx < 2; ++PI, ++max_idx) /*empty*/;
149 
150   // If there are exactly two predecessors, then we want to nuke the PHI nodes
151   // altogether.
152   bool NukePHIs = max_idx == 1;
153 
154   // Okay, now we know that we need to remove predecessor #pred_idx from all
155   // PHI nodes.  Iterate over each PHI node fixing them up
156   BasicBlock::InstListType::iterator II(BB->getInstList().begin());
157   for (; (*II)->getInstType() == Instruction::PHINode; ++II) {
158     PHINode *PN = (PHINode*)*II;
159     PN->removeIncomingValue(pred_idx);
160 
161     if (NukePHIs) {  // Destroy the PHI altogether??
162       assert(PN->getOperand(1) == 0 && "PHI node should only have one value!");
163       Value *V = PN->getOperand(0);
164 
165       PN->replaceAllUsesWith(V);      // Replace PHI node with its single value.
166       delete BB->getInstList().remove(II);
167     }
168   }
169 }
170 
171 // PropogatePredecessors - This gets "Succ" ready to have the predecessors from
172 // "BB".  This is a little tricky because "Succ" has PHI nodes, which need to
173 // have extra slots added to them to hold the merge edges from BB's
174 // predecessors.
175 //
176 // Assumption: BB is the single predecessor of Succ.
177 //
178 static void PropogatePredecessorsForPHIs(BasicBlock *BB, BasicBlock *Succ) {
179   assert(BB && Succ && *pred_begin(Succ) == BB && "BB is only pred of Succ" &&
180 	 ++pred_begin(Succ) == pred_end(Succ));
181 
182   // If there is more than one predecessor, and there are PHI nodes in
183   // the successor, then we need to add incoming edges for the PHI nodes
184   pred_iterator PI(pred_begin(BB));
185   for (; PI != pred_end(BB); ++PI) {
186     // TODO:
187   }
188 }
189 
190 static bool DoDCEPass(Method *M) {
191   Method::BasicBlocksType &BBs = M->getBasicBlocks();
192   Method::BasicBlocksType::iterator BBIt, BBEnd = BBs.end();
193   if (BBs.begin() == BBEnd) return false;  // Nothing to do
194   bool Changed = false;
195 
196   // Loop through now and remove instructions that have no uses...
197   for (BBIt = BBs.begin(); BBIt != BBEnd; BBIt++) {
198     Changed |= RemoveUnusedDefs((*BBIt)->getInstList(), BasicBlockDCE());
199     Changed |= RemoveSingularPHIs(*BBIt);
200   }
201 
202   // Loop over all of the basic blocks (except the first one) and remove them
203   // if they are unneeded...
204   //
205   for (BBIt = BBs.begin(), ++BBIt; BBIt != BBs.end(); ++BBIt) {
206     BasicBlock *BB = *BBIt;
207     assert(BB->getTerminator() && "Degenerate basic block encountered!");
208 
209 #if 0
210     // Remove basic blocks that have no predecessors... which are unreachable.
211     if (pred_begin(BB) == pred_end(BB) &&
212 	!BB->hasConstantPoolReferences() && 0) {
213       cerr << "Removing BB: \n" << BB;
214 
215       // Loop through all of our successors and make sure they know that one
216       // of their predecessors is going away.
217       for (succ_iterator SI = succ_begin(BB), EI = succ_end(BB); SI != EI; ++SI)
218 	RemovePredecessorFromBlock(*SI, BB);
219 
220       while (!BB->getInstList().empty()) {
221 	Instruction *I = BB->getInstList().front();
222 	// If this instruction is used, replace uses with an arbitrary
223 	// constant value.  Because control flow can't get here, we don't care
224 	// what we replace the value with.
225 	if (!I->use_empty()) ReplaceUsesWithConstant(I);
226 
227 	// Remove the instruction from the basic block
228 	delete BB->getInstList().remove(BB->getInstList().begin());
229       }
230       delete BBs.remove(BBIt);
231       --BBIt;  // remove puts use on the next block, we want the previous one
232       Changed = true;
233       continue;
234     }
235 
236     // Check to see if this block has no instructions and only a single
237     // successor.  If so, replace block references with successor.
238     succ_iterator SI(succ_begin(BB));
239     if (SI != succ_end(BB) && ++SI == succ_end(BB)) {  // One succ?
240       Instruction *I = BB->getInstList().front();
241       if (I->isTerminator()) {   // Terminator is the only instruction!
242 
243 	if (Succ->getInstList().front()->getInstType() == Instruction::PHINode){
244 	  // Add entries to the PHI nodes so that the PHI nodes have the right
245 	  // number of entries...
246 	  PropogatePredecessorsForPHIs(BB, Succ);
247 	}
248 
249 	BasicBlock *Succ = *succ_begin(BB); // There is exactly one successor
250 	BB->replaceAllUsesWith(Succ);
251 	cerr << "Killing Trivial BB: \n" << BB;
252 
253 	BB = BBs.remove(BBIt);
254 	--BBIt; // remove puts use on the next block, we want the previous one
255 
256 	if (BB->hasName() && !Succ->hasName())  // Transfer name if we can
257 	  Succ->setName(BB->getName());
258 	delete BB;                              // Delete basic block
259 
260 	cerr << "Method after removal: \n" << M;
261 	Changed = true;
262 	continue;
263       }
264     }
265 #endif
266 
267     // Merge basic blocks into their predecessor if there is only one pred,
268     // and if there is only one successor of the predecessor.
269     pred_iterator PI(pred_begin(BB));
270     if (PI != pred_end(BB) && *PI != BB &&    // Not empty?  Not same BB?
271 	++PI == pred_end(BB) && !BB->hasConstantPoolReferences()) {
272       BasicBlock *Pred = *pred_begin(BB);
273       TerminatorInst *Term = Pred->getTerminator();
274       assert(Term != 0 && "malformed basic block without terminator!");
275 
276       // Does the predecessor block only have a single successor?
277       succ_iterator SI(succ_begin(Pred));
278       if (++SI == succ_end(Pred)) {
279 	//cerr << "Merging: " << BB << "into: " << Pred;
280 
281 	// Delete the unconditianal branch from the predecessor...
282 	BasicBlock::InstListType::iterator DI = Pred->getInstList().end();
283 	assert(Pred->getTerminator() &&
284 	       "Degenerate basic block encountered!");  // Empty bb???
285 	delete Pred->getInstList().remove(--DI);
286 
287 	// Move all definitions in the succecessor to the predecessor...
288 	while (!BB->getInstList().empty()) {
289 	  DI = BB->getInstList().begin();
290 	  Instruction *Def = BB->getInstList().remove(DI); // Remove from front
291 	  Pred->getInstList().push_back(Def);              // Add to end...
292 	}
293 
294 	// Remove basic block from the method... and advance iterator to the
295 	// next valid block...
296 	BB = BBs.remove(BBIt);
297 	--BBIt;  // remove puts us on the NEXT bb.  We want the prev BB
298 	Changed = true;
299 
300 	// Inherit predecessors name if it exists...
301 	if (BB->hasName() && !Pred->hasName()) Pred->setName(BB->getName());
302 
303 	// You ARE the weakest link... goodbye
304 	delete BB;
305       }
306     }
307   }
308 
309   // Remove unused constants
310   Changed |= DoRemoveUnusedConstants(M);
311   return Changed;
312 }
313 
314 
315 // It is possible that we may require multiple passes over the code to fully
316 // eliminate dead code.  Iterate until we are done.
317 //
318 bool DoDeadCodeElimination(Method *M) {
319   bool Changed = false;
320   while (DoDCEPass(M)) Changed = true;
321   return Changed;
322 }
323 
324 bool DoDeadCodeElimination(Module *C) {
325   bool Val = ApplyOptToAllMethods(C, DoDeadCodeElimination);
326   while (DoRemoveUnusedConstants(C)) Val = true;
327   return Val;
328 }
329