DeadStoreElimination.cpp revision 40ef630a4626365faeef8696f611e18d1a69f63a
1//===- DeadStoreElimination.cpp - Fast Dead Store Elimination -------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements a trivial dead store elimination that only considers
11// basic-block local redundant stores.
12//
13// FIXME: This should eventually be extended to be a post-dominator tree
14// traversal.  Doing so would be pretty trivial.
15//
16//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "dse"
19#include "llvm/Transforms/Scalar.h"
20#include "llvm/Constants.h"
21#include "llvm/Function.h"
22#include "llvm/Instructions.h"
23#include "llvm/IntrinsicInst.h"
24#include "llvm/Pass.h"
25#include "llvm/ADT/SmallPtrSet.h"
26#include "llvm/ADT/Statistic.h"
27#include "llvm/Analysis/AliasAnalysis.h"
28#include "llvm/Analysis/Dominators.h"
29#include "llvm/Analysis/MemoryDependenceAnalysis.h"
30#include "llvm/Target/TargetData.h"
31#include "llvm/Transforms/Utils/Local.h"
32using namespace llvm;
33
34STATISTIC(NumFastStores, "Number of stores deleted");
35STATISTIC(NumFastOther , "Number of other instrs removed");
36
37namespace {
38  struct DSE : public FunctionPass {
39    TargetData *TD;
40
41    static char ID; // Pass identification, replacement for typeid
42    DSE() : FunctionPass(&ID) {}
43
44    virtual bool runOnFunction(Function &F) {
45      bool Changed = false;
46      for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
47        Changed |= runOnBasicBlock(*I);
48      return Changed;
49    }
50
51    bool runOnBasicBlock(BasicBlock &BB);
52    bool handleFreeWithNonTrivialDependency(FreeInst *F, MemDepResult Dep);
53    bool handleEndBlock(BasicBlock &BB);
54    bool RemoveUndeadPointers(Value* Ptr, uint64_t killPointerSize,
55                              BasicBlock::iterator& BBI,
56                              SmallPtrSet<Value*, 64>& deadPointers);
57    void DeleteDeadInstruction(Instruction *I,
58                               SmallPtrSet<Value*, 64> *deadPointers = 0);
59
60
61    // getAnalysisUsage - We require post dominance frontiers (aka Control
62    // Dependence Graph)
63    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
64      AU.setPreservesCFG();
65      AU.addRequired<DominatorTree>();
66      AU.addRequired<AliasAnalysis>();
67      AU.addRequired<MemoryDependenceAnalysis>();
68      AU.addPreserved<DominatorTree>();
69      AU.addPreserved<AliasAnalysis>();
70      AU.addPreserved<MemoryDependenceAnalysis>();
71    }
72  };
73}
74
75char DSE::ID = 0;
76static RegisterPass<DSE> X("dse", "Dead Store Elimination");
77
78FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); }
79
80bool DSE::runOnBasicBlock(BasicBlock &BB) {
81  MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
82  TD = getAnalysisIfAvailable<TargetData>();
83
84  bool MadeChange = false;
85
86  // Do a top-down walk on the BB.
87  for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ) {
88    Instruction *Inst = BBI++;
89
90    // If we find a store or a free, get its memory dependence.
91    if (!isa<StoreInst>(Inst) && !isa<FreeInst>(Inst))
92      continue;
93
94    // Don't molest volatile stores or do queries that will return "clobber".
95    if (StoreInst *SI = dyn_cast<StoreInst>(Inst))
96      if (SI->isVolatile())
97        continue;
98
99    MemDepResult InstDep = MD.getDependency(Inst);
100
101    // Ignore non-local stores.
102    // FIXME: cross-block DSE would be fun. :)
103    if (InstDep.isNonLocal()) continue;
104
105    // Handle frees whose dependencies are non-trivial.
106    if (FreeInst *FI = dyn_cast<FreeInst>(Inst)) {
107      MadeChange |= handleFreeWithNonTrivialDependency(FI, InstDep);
108      continue;
109    }
110
111    StoreInst *SI = cast<StoreInst>(Inst);
112
113    // If not a definite must-alias dependency, ignore it.
114    if (!InstDep.isDef())
115      continue;
116
117    // If this is a store-store dependence, then the previous store is dead so
118    // long as this store is at least as big as it.
119    if (StoreInst *DepStore = dyn_cast<StoreInst>(InstDep.getInst()))
120      if (TD &&
121          TD->getTypeStoreSize(DepStore->getOperand(0)->getType()) <=
122          TD->getTypeStoreSize(SI->getOperand(0)->getType())) {
123        // Delete the store and now-dead instructions that feed it.
124        DeleteDeadInstruction(DepStore);
125        NumFastStores++;
126        MadeChange = true;
127
128        // DeleteDeadInstruction can delete the current instruction in loop
129        // cases, reset BBI.
130        BBI = Inst;
131        if (BBI != BB.begin())
132          --BBI;
133        continue;
134      }
135
136    // If we're storing the same value back to a pointer that we just
137    // loaded from, then the store can be removed.
138    if (LoadInst *DepLoad = dyn_cast<LoadInst>(InstDep.getInst())) {
139      if (SI->getPointerOperand() == DepLoad->getPointerOperand() &&
140          SI->getOperand(0) == DepLoad) {
141        // DeleteDeadInstruction can delete the current instruction.  Save BBI
142        // in case we need it.
143        WeakVH NextInst(BBI);
144
145        DeleteDeadInstruction(SI);
146
147        if (NextInst == 0)  // Next instruction deleted.
148          BBI = BB.begin();
149        else if (BBI != BB.begin())  // Revisit this instruction if possible.
150          --BBI;
151        NumFastStores++;
152        MadeChange = true;
153        continue;
154      }
155    }
156  }
157
158  // If this block ends in a return, unwind, or unreachable, all allocas are
159  // dead at its end, which means stores to them are also dead.
160  if (BB.getTerminator()->getNumSuccessors() == 0)
161    MadeChange |= handleEndBlock(BB);
162
163  return MadeChange;
164}
165
166/// handleFreeWithNonTrivialDependency - Handle frees of entire structures whose
167/// dependency is a store to a field of that structure.
168bool DSE::handleFreeWithNonTrivialDependency(FreeInst *F, MemDepResult Dep) {
169  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
170
171  StoreInst *Dependency = dyn_cast_or_null<StoreInst>(Dep.getInst());
172  if (!Dependency || Dependency->isVolatile())
173    return false;
174
175  Value *DepPointer = Dependency->getPointerOperand()->getUnderlyingObject();
176
177  // Check for aliasing.
178  if (AA.alias(F->getPointerOperand(), 1, DepPointer, 1) !=
179         AliasAnalysis::MustAlias)
180    return false;
181
182  // DCE instructions only used to calculate that store
183  DeleteDeadInstruction(Dependency);
184  NumFastStores++;
185  return true;
186}
187
188/// handleEndBlock - Remove dead stores to stack-allocated locations in the
189/// function end block.  Ex:
190/// %A = alloca i32
191/// ...
192/// store i32 1, i32* %A
193/// ret void
194bool DSE::handleEndBlock(BasicBlock &BB) {
195  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
196
197  bool MadeChange = false;
198
199  // Pointers alloca'd in this function are dead in the end block
200  SmallPtrSet<Value*, 64> deadPointers;
201
202  // Find all of the alloca'd pointers in the entry block.
203  BasicBlock *Entry = BB.getParent()->begin();
204  for (BasicBlock::iterator I = Entry->begin(), E = Entry->end(); I != E; ++I)
205    if (AllocaInst *AI = dyn_cast<AllocaInst>(I))
206      deadPointers.insert(AI);
207
208  // Treat byval arguments the same, stores to them are dead at the end of the
209  // function.
210  for (Function::arg_iterator AI = BB.getParent()->arg_begin(),
211       AE = BB.getParent()->arg_end(); AI != AE; ++AI)
212    if (AI->hasByValAttr())
213      deadPointers.insert(AI);
214
215  // Scan the basic block backwards
216  for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){
217    --BBI;
218
219    // If we find a store whose pointer is dead.
220    if (StoreInst* S = dyn_cast<StoreInst>(BBI)) {
221      if (!S->isVolatile()) {
222        // See through pointer-to-pointer bitcasts
223        Value* pointerOperand = S->getPointerOperand()->getUnderlyingObject();
224
225        // Alloca'd pointers or byval arguments (which are functionally like
226        // alloca's) are valid candidates for removal.
227        if (deadPointers.count(pointerOperand)) {
228          // DCE instructions only used to calculate that store.
229          BBI++;
230          DeleteDeadInstruction(S, &deadPointers);
231          NumFastStores++;
232          MadeChange = true;
233        }
234      }
235
236      continue;
237    }
238
239    // We can also remove memcpy's to local variables at the end of a function.
240    if (MemCpyInst *M = dyn_cast<MemCpyInst>(BBI)) {
241      Value *dest = M->getDest()->getUnderlyingObject();
242
243      if (deadPointers.count(dest)) {
244        BBI++;
245        DeleteDeadInstruction(M, &deadPointers);
246        NumFastOther++;
247        MadeChange = true;
248        continue;
249      }
250
251      // Because a memcpy is also a load, we can't skip it if we didn't remove
252      // it.
253    }
254
255    Value* killPointer = 0;
256    uint64_t killPointerSize = ~0UL;
257
258    // If we encounter a use of the pointer, it is no longer considered dead
259    if (LoadInst *L = dyn_cast<LoadInst>(BBI)) {
260      // However, if this load is unused and not volatile, we can go ahead and
261      // remove it, and not have to worry about it making our pointer undead!
262      if (L->use_empty() && !L->isVolatile()) {
263        BBI++;
264        DeleteDeadInstruction(L, &deadPointers);
265        NumFastOther++;
266        MadeChange = true;
267        continue;
268      }
269
270      killPointer = L->getPointerOperand();
271    } else if (VAArgInst* V = dyn_cast<VAArgInst>(BBI)) {
272      killPointer = V->getOperand(0);
273    } else if (isa<MemCpyInst>(BBI) &&
274               isa<ConstantInt>(cast<MemCpyInst>(BBI)->getLength())) {
275      killPointer = cast<MemCpyInst>(BBI)->getSource();
276      killPointerSize = cast<ConstantInt>(
277                            cast<MemCpyInst>(BBI)->getLength())->getZExtValue();
278    } else if (AllocaInst* A = dyn_cast<AllocaInst>(BBI)) {
279      deadPointers.erase(A);
280
281      // Dead alloca's can be DCE'd when we reach them
282      if (A->use_empty()) {
283        BBI++;
284        DeleteDeadInstruction(A, &deadPointers);
285        NumFastOther++;
286        MadeChange = true;
287      }
288
289      continue;
290    } else if (CallSite::get(BBI).getInstruction() != 0) {
291      // If this call does not access memory, it can't
292      // be undeadifying any of our pointers.
293      CallSite CS = CallSite::get(BBI);
294      if (AA.doesNotAccessMemory(CS))
295        continue;
296
297      unsigned modRef = 0;
298      unsigned other = 0;
299
300      // Remove any pointers made undead by the call from the dead set
301      std::vector<Value*> dead;
302      for (SmallPtrSet<Value*, 64>::iterator I = deadPointers.begin(),
303           E = deadPointers.end(); I != E; ++I) {
304        // HACK: if we detect that our AA is imprecise, it's not
305        // worth it to scan the rest of the deadPointers set.  Just
306        // assume that the AA will return ModRef for everything, and
307        // go ahead and bail.
308        if (modRef >= 16 && other == 0) {
309          deadPointers.clear();
310          return MadeChange;
311        }
312
313        // Get size information for the alloca
314        unsigned pointerSize = ~0U;
315        if (TD) {
316          if (AllocaInst* A = dyn_cast<AllocaInst>(*I)) {
317            if (ConstantInt* C = dyn_cast<ConstantInt>(A->getArraySize()))
318              pointerSize = C->getZExtValue() *
319                            TD->getTypeAllocSize(A->getAllocatedType());
320          } else {
321            const PointerType* PT = cast<PointerType>(
322                                                   cast<Argument>(*I)->getType());
323            pointerSize = TD->getTypeAllocSize(PT->getElementType());
324          }
325        }
326
327        // See if the call site touches it
328        AliasAnalysis::ModRefResult A = AA.getModRefInfo(CS, *I, pointerSize);
329
330        if (A == AliasAnalysis::ModRef)
331          modRef++;
332        else
333          other++;
334
335        if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref)
336          dead.push_back(*I);
337      }
338
339      for (std::vector<Value*>::iterator I = dead.begin(), E = dead.end();
340           I != E; ++I)
341        deadPointers.erase(*I);
342
343      continue;
344    } else if (isInstructionTriviallyDead(BBI)) {
345      // For any non-memory-affecting non-terminators, DCE them as we reach them
346      Instruction *Inst = BBI;
347      BBI++;
348      DeleteDeadInstruction(Inst, &deadPointers);
349      NumFastOther++;
350      MadeChange = true;
351      continue;
352    }
353
354    if (!killPointer)
355      continue;
356
357    killPointer = killPointer->getUnderlyingObject();
358
359    // Deal with undead pointers
360    MadeChange |= RemoveUndeadPointers(killPointer, killPointerSize, BBI,
361                                       deadPointers);
362  }
363
364  return MadeChange;
365}
366
367/// RemoveUndeadPointers - check for uses of a pointer that make it
368/// undead when scanning for dead stores to alloca's.
369bool DSE::RemoveUndeadPointers(Value* killPointer, uint64_t killPointerSize,
370                               BasicBlock::iterator &BBI,
371                               SmallPtrSet<Value*, 64>& deadPointers) {
372  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
373
374  // If the kill pointer can be easily reduced to an alloca,
375  // don't bother doing extraneous AA queries.
376  if (deadPointers.count(killPointer)) {
377    deadPointers.erase(killPointer);
378    return false;
379  }
380
381  // A global can't be in the dead pointer set.
382  if (isa<GlobalValue>(killPointer))
383    return false;
384
385  bool MadeChange = false;
386
387  SmallVector<Value*, 16> undead;
388
389  for (SmallPtrSet<Value*, 64>::iterator I = deadPointers.begin(),
390      E = deadPointers.end(); I != E; ++I) {
391    // Get size information for the alloca.
392    unsigned pointerSize = ~0U;
393    if (TD) {
394      if (AllocaInst* A = dyn_cast<AllocaInst>(*I)) {
395        if (ConstantInt* C = dyn_cast<ConstantInt>(A->getArraySize()))
396          pointerSize = C->getZExtValue() *
397                        TD->getTypeAllocSize(A->getAllocatedType());
398      } else {
399        const PointerType* PT = cast<PointerType>(cast<Argument>(*I)->getType());
400        pointerSize = TD->getTypeAllocSize(PT->getElementType());
401      }
402    }
403
404    // See if this pointer could alias it
405    AliasAnalysis::AliasResult A = AA.alias(*I, pointerSize,
406                                            killPointer, killPointerSize);
407
408    // If it must-alias and a store, we can delete it
409    if (isa<StoreInst>(BBI) && A == AliasAnalysis::MustAlias) {
410      StoreInst* S = cast<StoreInst>(BBI);
411
412      // Remove it!
413      BBI++;
414      DeleteDeadInstruction(S, &deadPointers);
415      NumFastStores++;
416      MadeChange = true;
417
418      continue;
419
420      // Otherwise, it is undead
421    } else if (A != AliasAnalysis::NoAlias)
422      undead.push_back(*I);
423  }
424
425  for (SmallVector<Value*, 16>::iterator I = undead.begin(), E = undead.end();
426       I != E; ++I)
427      deadPointers.erase(*I);
428
429  return MadeChange;
430}
431
432/// DeleteDeadInstruction - Delete this instruction.  Before we do, go through
433/// and zero out all the operands of this instruction.  If any of them become
434/// dead, delete them and the computation tree that feeds them.
435///
436/// If ValueSet is non-null, remove any deleted instructions from it as well.
437///
438void DSE::DeleteDeadInstruction(Instruction *I,
439                                SmallPtrSet<Value*, 64> *ValueSet) {
440  SmallVector<Instruction*, 32> NowDeadInsts;
441
442  NowDeadInsts.push_back(I);
443  --NumFastOther;
444
445  // Before we touch this instruction, remove it from memdep!
446  MemoryDependenceAnalysis &MDA = getAnalysis<MemoryDependenceAnalysis>();
447  while (!NowDeadInsts.empty()) {
448    Instruction *DeadInst = NowDeadInsts.back();
449    NowDeadInsts.pop_back();
450
451    ++NumFastOther;
452
453    // This instruction is dead, zap it, in stages.  Start by removing it from
454    // MemDep, which needs to know the operands and needs it to be in the
455    // function.
456    MDA.removeInstruction(DeadInst);
457
458    for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) {
459      Value *Op = DeadInst->getOperand(op);
460      DeadInst->setOperand(op, 0);
461
462      // If this operand just became dead, add it to the NowDeadInsts list.
463      if (!Op->use_empty()) continue;
464
465      if (Instruction *OpI = dyn_cast<Instruction>(Op))
466        if (isInstructionTriviallyDead(OpI))
467          NowDeadInsts.push_back(OpI);
468    }
469
470    DeadInst->eraseFromParent();
471
472    if (ValueSet) ValueSet->erase(DeadInst);
473  }
474}
475