DeadStoreElimination.cpp revision a56c34f90bec3e46ff81d6af54a2d0d309a81c4d
1//===- FastDSE.cpp - Fast Dead Store Elimination --------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by Owen Anderson and is distributed under
6// the University of Illinois Open Source 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 "fdse"
19#include "llvm/Transforms/Scalar.h"
20#include "llvm/Constants.h"
21#include "llvm/Function.h"
22#include "llvm/Instructions.h"
23#include "llvm/Pass.h"
24#include "llvm/ADT/SetVector.h"
25#include "llvm/ADT/SmallPtrSet.h"
26#include "llvm/ADT/Statistic.h"
27#include "llvm/Analysis/AliasAnalysis.h"
28#include "llvm/Analysis/MemoryDependenceAnalysis.h"
29#include "llvm/Target/TargetData.h"
30#include "llvm/Transforms/Utils/Local.h"
31#include "llvm/Support/Compiler.h"
32using namespace llvm;
33
34STATISTIC(NumFastStores, "Number of stores deleted");
35STATISTIC(NumFastOther , "Number of other instrs removed");
36
37namespace {
38  struct VISIBILITY_HIDDEN FDSE : public FunctionPass {
39    static char ID; // Pass identification, replacement for typeid
40    FDSE() : FunctionPass((intptr_t)&ID) {}
41
42    virtual bool runOnFunction(Function &F) {
43      bool Changed = false;
44      for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
45        Changed |= runOnBasicBlock(*I);
46      return Changed;
47    }
48
49    bool runOnBasicBlock(BasicBlock &BB);
50    bool handleFreeWithNonTrivialDependency(FreeInst* F, Instruction* dependency,
51                                            SetVector<Instruction*>& possiblyDead);
52    bool handleEndBlock(BasicBlock& BB, SetVector<Instruction*>& possiblyDead);
53    bool RemoveUndeadPointers(Value* pointer, unsigned pointerSize,
54                              BasicBlock::iterator& BBI,
55                              SmallPtrSet<AllocaInst*, 4>& deadPointers,
56                              SetVector<Instruction*>& possiblyDead);
57    void DeleteDeadInstructionChains(Instruction *I,
58                                     SetVector<Instruction*> &DeadInsts);
59    void TranslatePointerBitCasts(Value*& v) {
60      assert(isa<PointerType>(v->getType()) && "Translating a non-pointer type?");
61
62      // See through pointer-to-pointer bitcasts
63      while (isa<BitCastInst>(v) || isa<GetElementPtrInst>(v))
64        if (BitCastInst* C = dyn_cast<BitCastInst>(v))
65          v = C->getOperand(0);
66        else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(v))
67          v = G->getOperand(0);
68    }
69
70    // getAnalysisUsage - We require post dominance frontiers (aka Control
71    // Dependence Graph)
72    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
73      AU.setPreservesCFG();
74      AU.addRequired<TargetData>();
75      AU.addRequired<AliasAnalysis>();
76      AU.addRequired<MemoryDependenceAnalysis>();
77      AU.addPreserved<AliasAnalysis>();
78      AU.addPreserved<MemoryDependenceAnalysis>();
79    }
80  };
81  char FDSE::ID = 0;
82  RegisterPass<FDSE> X("fdse", "Fast Dead Store Elimination");
83}
84
85FunctionPass *llvm::createFastDeadStoreEliminationPass() { return new FDSE(); }
86
87bool FDSE::runOnBasicBlock(BasicBlock &BB) {
88  MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
89
90  // Record the last-seen store to this pointer
91  DenseMap<Value*, StoreInst*> lastStore;
92  // Record instructions possibly made dead by deleting a store
93  SetVector<Instruction*> possiblyDead;
94
95  bool MadeChange = false;
96
97  // Do a top-down walk on the BB
98  for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ++BBI) {
99    // If we find a store or a free...
100    if (isa<StoreInst>(BBI) || isa<FreeInst>(BBI)) {
101      Value* pointer = 0;
102      if (StoreInst* S = dyn_cast<StoreInst>(BBI))
103        pointer = S->getPointerOperand();
104      else if (FreeInst* F = dyn_cast<FreeInst>(BBI))
105        pointer = F->getPointerOperand();
106
107      assert(pointer && "Not a free or a store?");
108
109      StoreInst*& last = lastStore[pointer];
110      bool deletedStore = false;
111
112      // ... to a pointer that has been stored to before...
113      if (last) {
114
115        Instruction* dep = MD.getDependency(BBI);
116
117        // ... and no other memory dependencies are between them....
118        while (dep != MemoryDependenceAnalysis::None &&
119               dep != MemoryDependenceAnalysis::NonLocal &&
120               isa<StoreInst>(dep)) {
121          if (dep == last) {
122
123            // Remove it!
124            MD.removeInstruction(last);
125
126            // DCE instructions only used to calculate that store
127            if (Instruction* D = dyn_cast<Instruction>(last->getOperand(0)))
128              possiblyDead.insert(D);
129            if (Instruction* D = dyn_cast<Instruction>(last->getOperand(1)))
130              possiblyDead.insert(D);
131
132            last->eraseFromParent();
133            NumFastStores++;
134            deletedStore = true;
135            MadeChange = true;
136
137            break;
138          } else {
139            dep = MD.getDependency(BBI, dep);
140          }
141        }
142      }
143
144      // Handle frees whose dependencies are non-trivial
145      if (FreeInst* F = dyn_cast<FreeInst>(BBI))
146        if (!deletedStore)
147          MadeChange |= handleFreeWithNonTrivialDependency(F, MD.getDependency(F),
148                                                           possiblyDead);
149
150      // Update our most-recent-store map
151      if (StoreInst* S = dyn_cast<StoreInst>(BBI))
152        last = S;
153      else
154        last = 0;
155    }
156  }
157
158  // If this block ends in a return, unwind, unreachable, and eventually
159  // tailcall, then all allocas are dead at its end.
160  if (BB.getTerminator()->getNumSuccessors() == 0)
161    MadeChange |= handleEndBlock(BB, possiblyDead);
162
163  // Do a trivial DCE
164  while (!possiblyDead.empty()) {
165    Instruction *I = possiblyDead.back();
166    possiblyDead.pop_back();
167    DeleteDeadInstructionChains(I, possiblyDead);
168  }
169
170  return MadeChange;
171}
172
173/// handleFreeWithNonTrivialDependency - Handle frees of entire structures whose
174/// dependency is a store to a field of that structure
175bool FDSE::handleFreeWithNonTrivialDependency(FreeInst* F, Instruction* dep,
176                                              SetVector<Instruction*>& possiblyDead) {
177  TargetData &TD = getAnalysis<TargetData>();
178  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
179  MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
180
181  if (dep == MemoryDependenceAnalysis::None ||
182      dep == MemoryDependenceAnalysis::NonLocal)
183    return false;
184
185  StoreInst* dependency = dyn_cast<StoreInst>(dep);
186  if (!dependency)
187    return false;
188
189  Value* depPointer = dependency->getPointerOperand();
190  unsigned depPointerSize = TD.getTypeSize(dependency->getOperand(0)->getType());
191
192  // Check for aliasing
193  AliasAnalysis::AliasResult A = AA.alias(F->getPointerOperand(), ~0UL,
194                                          depPointer, depPointerSize);
195
196  if (A == AliasAnalysis::MustAlias) {
197    // Remove it!
198    MD.removeInstruction(dependency);
199
200    // DCE instructions only used to calculate that store
201    if (Instruction* D = dyn_cast<Instruction>(dependency->getOperand(0)))
202      possiblyDead.insert(D);
203    if (Instruction* D = dyn_cast<Instruction>(dependency->getOperand(1)))
204      possiblyDead.insert(D);
205
206    dependency->eraseFromParent();
207    NumFastStores++;
208    return true;
209  }
210
211  return false;
212}
213
214/// handleEndBlock - Remove dead stores to stack-allocated locations in the function
215/// end block
216bool FDSE::handleEndBlock(BasicBlock& BB, SetVector<Instruction*>& possiblyDead) {
217  TargetData &TD = getAnalysis<TargetData>();
218  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
219  MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
220
221  bool MadeChange = false;
222
223  // Pointers alloca'd in this function are dead in the end block
224  SmallPtrSet<AllocaInst*, 4> deadPointers;
225
226  // Find all of the alloca'd pointers in the entry block
227  BasicBlock *Entry = BB.getParent()->begin();
228  for (BasicBlock::iterator I = Entry->begin(), E = Entry->end(); I != E; ++I)
229    if (AllocaInst *AI = dyn_cast<AllocaInst>(I))
230      deadPointers.insert(AI);
231
232  // Scan the basic block backwards
233  for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){
234    --BBI;
235
236    if (deadPointers.empty())
237      break;
238
239    Value* killPointer = 0;
240    unsigned killPointerSize = 0;
241
242    // If we find a store whose pointer is dead...
243    if (StoreInst* S = dyn_cast<StoreInst>(BBI)) {
244      Value* pointerOperand = S->getPointerOperand();
245      // See through pointer-to-pointer bitcasts
246      TranslatePointerBitCasts(pointerOperand);
247
248      if (deadPointers.count(pointerOperand)){
249        // Remove it!
250        MD.removeInstruction(S);
251
252        // DCE instructions only used to calculate that store
253        if (Instruction* D = dyn_cast<Instruction>(S->getOperand(0)))
254          possiblyDead.insert(D);
255        if (Instruction* D = dyn_cast<Instruction>(S->getOperand(1)))
256          possiblyDead.insert(D);
257
258        BBI++;
259        S->eraseFromParent();
260        NumFastStores++;
261        MadeChange = true;
262      }
263
264    // If we encounter a use of the pointer, it is no longer considered dead
265    } else if (LoadInst* L = dyn_cast<LoadInst>(BBI)) {
266      killPointer = L->getPointerOperand();
267      killPointerSize = TD.getTypeSize(L->getType());
268    } else if (VAArgInst* V = dyn_cast<VAArgInst>(BBI)) {
269      killPointer = V->getOperand(0);
270      killPointerSize = TD.getTypeSize(V->getType());
271    } else if (FreeInst* F = dyn_cast<FreeInst>(BBI)) {
272      killPointer = F->getPointerOperand();
273      killPointerSize = ~0UL;
274    } else if (AllocaInst* A = dyn_cast<AllocaInst>(BBI)) {
275      deadPointers.erase(A);
276      continue;
277    } else if (CallSite::get(BBI).getInstruction() != 0) {
278      // Remove any pointers made undead by the call from the dead set
279      std::vector<Instruction*> dead;
280      for (SmallPtrSet<AllocaInst*, 4>::iterator I = deadPointers.begin(),
281           E = deadPointers.end(); I != E; ++I) {
282        // Get size information for the alloca
283        unsigned pointerSize = ~0UL;
284        if (ConstantInt* C = dyn_cast<ConstantInt>((*I)->getArraySize()))
285          pointerSize = C->getZExtValue() * TD.getTypeSize((*I)->getAllocatedType());
286
287        // See if the call site touches it
288        AliasAnalysis::ModRefResult A = AA.getModRefInfo(CallSite::get(BBI),
289                                                         *I, pointerSize);
290        if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref)
291          dead.push_back(*I);
292      }
293
294      for (std::vector<Instruction*>::iterator I = dead.begin(), E = dead.end();
295           I != E; ++I)
296        deadPointers.erase(*I);
297
298      continue;
299    }
300
301    if (!killPointer)
302      continue;
303
304    // Deal with undead pointers
305    MadeChange |= RemoveUndeadPointers(killPointer, killPointerSize, BBI,
306                                       deadPointers, possiblyDead);
307  }
308
309  return MadeChange;
310}
311
312bool FDSE::RemoveUndeadPointers(Value* killPointer, unsigned killPointerSize,
313                                BasicBlock::iterator& BBI,
314                                SmallPtrSet<AllocaInst*, 4>& deadPointers,
315                                SetVector<Instruction*>& possiblyDead) {
316  TargetData &TD = getAnalysis<TargetData>();
317  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
318  MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
319
320  bool MadeChange = false;
321
322  std::vector<Instruction*> undead;
323
324  for (SmallPtrSet<AllocaInst*, 4>::iterator I = deadPointers.begin(),
325      E = deadPointers.end(); I != E; ++I) {
326    // Get size information for the alloca
327    unsigned pointerSize = ~0UL;
328    if (ConstantInt* C = dyn_cast<ConstantInt>((*I)->getArraySize()))
329      pointerSize = C->getZExtValue() * TD.getTypeSize((*I)->getAllocatedType());
330
331    // See if this pointer could alias it
332    AliasAnalysis::AliasResult A = AA.alias(*I, pointerSize, killPointer, killPointerSize);
333
334    // If it must-alias and a store, we can delete it
335    if (isa<StoreInst>(BBI) && A == AliasAnalysis::MustAlias) {
336      StoreInst* S = cast<StoreInst>(BBI);
337
338      // Remove it!
339      MD.removeInstruction(S);
340
341      // DCE instructions only used to calculate that store
342      if (Instruction* D = dyn_cast<Instruction>(S->getOperand(0)))
343        possiblyDead.insert(D);
344      if (Instruction* D = dyn_cast<Instruction>(S->getOperand(1)))
345        possiblyDead.insert(D);
346
347      BBI++;
348      S->eraseFromParent();
349      NumFastStores++;
350      MadeChange = true;
351
352      continue;
353
354      // Otherwise, it is undead
355      } else if (A != AliasAnalysis::NoAlias)
356        undead.push_back(*I);
357  }
358
359  for (std::vector<Instruction*>::iterator I = undead.begin(), E = undead.end();
360       I != E; ++I)
361    deadPointers.erase(*I);
362
363  return MadeChange;
364}
365
366void FDSE::DeleteDeadInstructionChains(Instruction *I,
367                                      SetVector<Instruction*> &DeadInsts) {
368  // Instruction must be dead.
369  if (!I->use_empty() || !isInstructionTriviallyDead(I)) return;
370
371  // Let the memory dependence know
372  getAnalysis<MemoryDependenceAnalysis>().removeInstruction(I);
373
374  // See if this made any operands dead.  We do it this way in case the
375  // instruction uses the same operand twice.  We don't want to delete a
376  // value then reference it.
377  for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
378    if (I->getOperand(i)->hasOneUse())
379      if (Instruction* Op = dyn_cast<Instruction>(I->getOperand(i)))
380        DeadInsts.insert(Op);      // Attempt to nuke it later.
381
382    I->setOperand(i, 0);         // Drop from the operand list.
383  }
384
385  I->eraseFromParent();
386  ++NumFastOther;
387}
388