teach DSE to use GetPointerBaseWithConstantOffset to analyze
[oota-llvm.git] / lib / Transforms / Scalar / DeadStoreElimination.cpp
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/MemoryBuiltins.h"
30 #include "llvm/Analysis/MemoryDependenceAnalysis.h"
31 #include "llvm/Analysis/ValueTracking.h"
32 #include "llvm/Target/TargetData.h"
33 #include "llvm/Transforms/Utils/Local.h"
34 using namespace llvm;
35
36 STATISTIC(NumFastStores, "Number of stores deleted");
37 STATISTIC(NumFastOther , "Number of other instrs removed");
38
39 namespace {
40   struct DSE : public FunctionPass {
41     AliasAnalysis *AA;
42     MemoryDependenceAnalysis *MD;
43
44     static char ID; // Pass identification, replacement for typeid
45     DSE() : FunctionPass(ID), AA(0), MD(0) {
46       initializeDSEPass(*PassRegistry::getPassRegistry());
47     }
48
49     virtual bool runOnFunction(Function &F) {
50       AA = &getAnalysis<AliasAnalysis>();
51       MD = &getAnalysis<MemoryDependenceAnalysis>();
52       DominatorTree &DT = getAnalysis<DominatorTree>();
53       
54       bool Changed = false;
55       for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
56         // Only check non-dead blocks.  Dead blocks may have strange pointer
57         // cycles that will confuse alias analysis.
58         if (DT.isReachableFromEntry(I))
59           Changed |= runOnBasicBlock(*I);
60       
61       AA = 0; MD = 0;
62       return Changed;
63     }
64     
65     bool runOnBasicBlock(BasicBlock &BB);
66     bool HandleFree(CallInst *F);
67     bool handleEndBlock(BasicBlock &BB);
68     void RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc,
69                                SmallPtrSet<Value*, 16> &DeadStackObjects);
70     
71
72     // getAnalysisUsage - We require post dominance frontiers (aka Control
73     // Dependence Graph)
74     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
75       AU.setPreservesCFG();
76       AU.addRequired<DominatorTree>();
77       AU.addRequired<AliasAnalysis>();
78       AU.addRequired<MemoryDependenceAnalysis>();
79       AU.addPreserved<AliasAnalysis>();
80       AU.addPreserved<DominatorTree>();
81       AU.addPreserved<MemoryDependenceAnalysis>();
82     }
83   };
84 }
85
86 char DSE::ID = 0;
87 INITIALIZE_PASS_BEGIN(DSE, "dse", "Dead Store Elimination", false, false)
88 INITIALIZE_PASS_DEPENDENCY(DominatorTree)
89 INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
90 INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
91 INITIALIZE_PASS_END(DSE, "dse", "Dead Store Elimination", false, false)
92
93 FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); }
94
95 //===----------------------------------------------------------------------===//
96 // Helper functions
97 //===----------------------------------------------------------------------===//
98
99 /// DeleteDeadInstruction - Delete this instruction.  Before we do, go through
100 /// and zero out all the operands of this instruction.  If any of them become
101 /// dead, delete them and the computation tree that feeds them.
102 ///
103 /// If ValueSet is non-null, remove any deleted instructions from it as well.
104 ///
105 static void DeleteDeadInstruction(Instruction *I,
106                                   MemoryDependenceAnalysis &MD,
107                                   SmallPtrSet<Value*, 16> *ValueSet = 0) {
108   SmallVector<Instruction*, 32> NowDeadInsts;
109   
110   NowDeadInsts.push_back(I);
111   --NumFastOther;
112   
113   // Before we touch this instruction, remove it from memdep!
114   do {
115     Instruction *DeadInst = NowDeadInsts.pop_back_val();
116     ++NumFastOther;
117     
118     // This instruction is dead, zap it, in stages.  Start by removing it from
119     // MemDep, which needs to know the operands and needs it to be in the
120     // function.
121     MD.removeInstruction(DeadInst);
122     
123     for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) {
124       Value *Op = DeadInst->getOperand(op);
125       DeadInst->setOperand(op, 0);
126       
127       // If this operand just became dead, add it to the NowDeadInsts list.
128       if (!Op->use_empty()) continue;
129       
130       if (Instruction *OpI = dyn_cast<Instruction>(Op))
131         if (isInstructionTriviallyDead(OpI))
132           NowDeadInsts.push_back(OpI);
133     }
134     
135     DeadInst->eraseFromParent();
136     
137     if (ValueSet) ValueSet->erase(DeadInst);
138   } while (!NowDeadInsts.empty());
139 }
140
141
142 /// hasMemoryWrite - Does this instruction write some memory?  This only returns
143 /// true for things that we can analyze with other helpers below.
144 static bool hasMemoryWrite(Instruction *I) {
145   if (isa<StoreInst>(I))
146     return true;
147   if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
148     switch (II->getIntrinsicID()) {
149     default:
150       return false;
151     case Intrinsic::memset:
152     case Intrinsic::memmove:
153     case Intrinsic::memcpy:
154     case Intrinsic::init_trampoline:
155     case Intrinsic::lifetime_end:
156       return true;
157     }
158   }
159   return false;
160 }
161
162 /// getLocForWrite - Return a Location stored to by the specified instruction.
163 static AliasAnalysis::Location
164 getLocForWrite(Instruction *Inst, AliasAnalysis &AA) {
165   if (StoreInst *SI = dyn_cast<StoreInst>(Inst))
166     return AA.getLocation(SI);
167   
168   if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(Inst)) {
169     // memcpy/memmove/memset.
170     AliasAnalysis::Location Loc = AA.getLocationForDest(MI);
171     // If we don't have target data around, an unknown size in Location means
172     // that we should use the size of the pointee type.  This isn't valid for
173     // memset/memcpy, which writes more than an i8.
174     if (Loc.Size == AliasAnalysis::UnknownSize && AA.getTargetData() == 0)
175       return AliasAnalysis::Location();
176     return Loc;
177   }
178   
179   IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst);
180   if (II == 0) return AliasAnalysis::Location();
181   
182   switch (II->getIntrinsicID()) {
183   default: return AliasAnalysis::Location(); // Unhandled intrinsic.
184   case Intrinsic::init_trampoline:
185     // If we don't have target data around, an unknown size in Location means
186     // that we should use the size of the pointee type.  This isn't valid for
187     // init.trampoline, which writes more than an i8.
188     if (AA.getTargetData() == 0) return AliasAnalysis::Location();
189       
190     // FIXME: We don't know the size of the trampoline, so we can't really
191     // handle it here.
192     return AliasAnalysis::Location(II->getArgOperand(0));
193   case Intrinsic::lifetime_end: {
194     uint64_t Len = cast<ConstantInt>(II->getArgOperand(0))->getZExtValue();
195     return AliasAnalysis::Location(II->getArgOperand(1), Len);
196   }
197   }
198 }
199
200 /// isRemovable - If the value of this instruction and the memory it writes to
201 /// is unused, may we delete this instruction?
202 static bool isRemovable(Instruction *I) {
203   // Don't remove volatile stores.
204   if (StoreInst *SI = dyn_cast<StoreInst>(I))
205     return !SI->isVolatile();
206   
207   IntrinsicInst *II = cast<IntrinsicInst>(I);
208   switch (II->getIntrinsicID()) {
209   default: assert(0 && "doesn't pass 'hasMemoryWrite' predicate");
210   case Intrinsic::lifetime_end:
211     // Never remove dead lifetime_end's, e.g. because it is followed by a
212     // free.
213     return false;
214   case Intrinsic::init_trampoline:
215     // Always safe to remove init_trampoline.
216     return true;
217     
218   case Intrinsic::memset:
219   case Intrinsic::memmove:
220   case Intrinsic::memcpy:
221     // Don't remove volatile memory intrinsics.
222     return !cast<MemIntrinsic>(II)->isVolatile();
223   }
224 }
225
226 /// getStoredPointerOperand - Return the pointer that is being written to.
227 static Value *getStoredPointerOperand(Instruction *I) {
228   if (StoreInst *SI = dyn_cast<StoreInst>(I))
229     return SI->getPointerOperand();
230   if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I))
231     return MI->getDest();
232
233   IntrinsicInst *II = cast<IntrinsicInst>(I);
234   switch (II->getIntrinsicID()) {
235   default: assert(false && "Unexpected intrinsic!");
236   case Intrinsic::init_trampoline:
237     return II->getArgOperand(0);
238   }
239 }
240
241 static uint64_t getPointerSize(Value *V, AliasAnalysis &AA) {
242   const TargetData *TD = AA.getTargetData();
243   if (TD == 0)
244     return AliasAnalysis::UnknownSize;
245   
246   if (AllocaInst *A = dyn_cast<AllocaInst>(V)) {
247     // Get size information for the alloca
248     if (ConstantInt *C = dyn_cast<ConstantInt>(A->getArraySize()))
249       return C->getZExtValue() * TD->getTypeAllocSize(A->getAllocatedType());
250     return AliasAnalysis::UnknownSize;
251   }
252   
253   assert(isa<Argument>(V) && "Expected AllocaInst or Argument!");
254   const PointerType *PT = cast<PointerType>(V->getType());
255   return TD->getTypeAllocSize(PT->getElementType());
256 }
257
258
259 /// isCompleteOverwrite - Return true if a store to the 'Later' location
260 /// completely overwrites a store to the 'Earlier' location.
261 static bool isCompleteOverwrite(const AliasAnalysis::Location &Later,
262                                 const AliasAnalysis::Location &Earlier,
263                                 AliasAnalysis &AA) {
264   const Value *P1 = Earlier.Ptr->stripPointerCasts();
265   const Value *P2 = Later.Ptr->stripPointerCasts();
266   
267   // If the start pointers are the same, we just have to compare sizes to see if
268   // the later store was larger than the earlier store.
269   if (P1 == P2) {
270     // If we don't know the sizes of either access, then we can't do a
271     // comparison.
272     if (Later.Size == AliasAnalysis::UnknownSize ||
273         Earlier.Size == AliasAnalysis::UnknownSize) {
274       // If we have no TargetData information around, then the size of the store
275       // is inferrable from the pointee type.  If they are the same type, then
276       // we know that the store is safe.
277       if (AA.getTargetData() == 0)
278         return Later.Ptr->getType() == Earlier.Ptr->getType();
279       return false;
280     }
281     
282     // Make sure that the Later size is >= the Earlier size.
283     if (Later.Size < Earlier.Size)
284       return false;
285     return true;
286   }
287   
288   // Otherwise, we have to have size information, and the later store has to be
289   // larger than the earlier one.
290   if (Later.Size == AliasAnalysis::UnknownSize ||
291       Earlier.Size == AliasAnalysis::UnknownSize ||
292       Later.Size <= Earlier.Size ||
293       AA.getTargetData() == 0)
294     return false;
295   
296   const TargetData &TD = *AA.getTargetData();
297   
298   // Okay, we have stores to two completely different pointers.  Try to
299   // decompose the pointer into a "base + constant_offset" form.  If the base
300   // pointers are equal, then we can reason about the two stores.
301   int64_t Off1 = 0, Off2 = 0;
302   const Value *BP1 = GetPointerBaseWithConstantOffset(P1, Off1, TD);
303   const Value *BP2 = GetPointerBaseWithConstantOffset(P2, Off2, TD);
304   
305   // If the base pointers still differ, we have two completely different stores.
306   if (BP1 != BP2)
307     return false;
308   
309   // Otherwise, we might have a situation like:
310   //  store i16 -> P + 1 Byte
311   //  store i32 -> P
312   // In this case, we see if the later store completely overlaps all bytes
313   // stored by the previous store.
314   if (Off1 < Off2 ||                       // Earlier starts before Later.
315       Off1+Earlier.Size > Off2+Later.Size) // Earlier goes beyond Later.
316     return false;
317   // Otherwise, we have complete overlap.
318   return true;
319 }
320
321
322 //===----------------------------------------------------------------------===//
323 // DSE Pass
324 //===----------------------------------------------------------------------===//
325
326 bool DSE::runOnBasicBlock(BasicBlock &BB) {
327   bool MadeChange = false;
328   
329   // Do a top-down walk on the BB.
330   for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ) {
331     Instruction *Inst = BBI++;
332     
333     // Handle 'free' calls specially.
334     if (CallInst *F = isFreeCall(Inst)) {
335       MadeChange |= HandleFree(F);
336       continue;
337     }
338     
339     // If we find something that writes memory, get its memory dependence.
340     if (!hasMemoryWrite(Inst))
341       continue;
342
343     MemDepResult InstDep = MD->getDependency(Inst);
344     
345     // Ignore non-local store liveness.
346     // FIXME: cross-block DSE would be fun. :)
347     if (InstDep.isNonLocal() || 
348         // Ignore self dependence, which happens in the entry block of the
349         // function.
350         InstDep.getInst() == Inst)
351       continue;
352      
353     // If we're storing the same value back to a pointer that we just
354     // loaded from, then the store can be removed.
355     if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
356       if (LoadInst *DepLoad = dyn_cast<LoadInst>(InstDep.getInst())) {
357         if (SI->getPointerOperand() == DepLoad->getPointerOperand() &&
358             SI->getOperand(0) == DepLoad && !SI->isVolatile()) {
359           // DeleteDeadInstruction can delete the current instruction.  Save BBI
360           // in case we need it.
361           WeakVH NextInst(BBI);
362           
363           DeleteDeadInstruction(SI, *MD);
364           
365           if (NextInst == 0)  // Next instruction deleted.
366             BBI = BB.begin();
367           else if (BBI != BB.begin())  // Revisit this instruction if possible.
368             --BBI;
369           ++NumFastStores;
370           MadeChange = true;
371           continue;
372         }
373       }
374     }
375     
376     // Figure out what location is being stored to.
377     AliasAnalysis::Location Loc = getLocForWrite(Inst, *AA);
378
379     // If we didn't get a useful location, fail.
380     if (Loc.Ptr == 0)
381       continue;
382     
383     while (!InstDep.isNonLocal()) {
384       // Get the memory clobbered by the instruction we depend on.  MemDep will
385       // skip any instructions that 'Loc' clearly doesn't interact with.  If we
386       // end up depending on a may- or must-aliased load, then we can't optimize
387       // away the store and we bail out.  However, if we depend on on something
388       // that overwrites the memory location we *can* potentially optimize it.
389       //
390       // Find out what memory location the dependant instruction stores.
391       Instruction *DepWrite = InstDep.getInst();
392       AliasAnalysis::Location DepLoc = getLocForWrite(DepWrite, *AA);
393       // If we didn't get a useful location, or if it isn't a size, bail out.
394       if (DepLoc.Ptr == 0)
395         break;
396
397       // If we find a removable write that is completely obliterated by the
398       // store to 'Loc' then we can remove it.
399       if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, *AA)) {
400         // Delete the store and now-dead instructions that feed it.
401         DeleteDeadInstruction(DepWrite, *MD);
402         ++NumFastStores;
403         MadeChange = true;
404         
405         // DeleteDeadInstruction can delete the current instruction in loop
406         // cases, reset BBI.
407         BBI = Inst;
408         if (BBI != BB.begin())
409           --BBI;
410         break;
411       }
412       
413       // If this is a may-aliased store that is clobbering the store value, we
414       // can keep searching past it for another must-aliased pointer that stores
415       // to the same location.  For example, in:
416       //   store -> P
417       //   store -> Q
418       //   store -> P
419       // we can remove the first store to P even though we don't know if P and Q
420       // alias.
421       if (DepWrite == &BB.front()) break;
422       
423       // Can't look past this instruction if it might read 'Loc'.
424       if (AA->getModRefInfo(DepWrite, Loc) & AliasAnalysis::Ref)
425         break;
426         
427       InstDep = MD->getPointerDependencyFrom(Loc, false, DepWrite, &BB);
428     }
429   }
430   
431   // If this block ends in a return, unwind, or unreachable, all allocas are
432   // dead at its end, which means stores to them are also dead.
433   if (BB.getTerminator()->getNumSuccessors() == 0)
434     MadeChange |= handleEndBlock(BB);
435   
436   return MadeChange;
437 }
438
439 /// HandleFree - Handle frees of entire structures whose dependency is a store
440 /// to a field of that structure.
441 bool DSE::HandleFree(CallInst *F) {
442   MemDepResult Dep = MD->getDependency(F);
443   do {
444     if (Dep.isNonLocal()) return false;
445     
446     Instruction *Dependency = Dep.getInst();
447     if (!hasMemoryWrite(Dependency) || !isRemovable(Dependency))
448       return false;
449   
450     Value *DepPointer =
451       getStoredPointerOperand(Dependency)->getUnderlyingObject();
452
453     // Check for aliasing.
454     if (AA->alias(F->getArgOperand(0), 1, DepPointer, 1) !=
455           AliasAnalysis::MustAlias)
456       return false;
457   
458     // DCE instructions only used to calculate that store
459     DeleteDeadInstruction(Dependency, *MD);
460     ++NumFastStores;
461
462     // Inst's old Dependency is now deleted. Compute the next dependency,
463     // which may also be dead, as in
464     //    s[0] = 0;
465     //    s[1] = 0; // This has just been deleted.
466     //    free(s);
467     Dep = MD->getDependency(F);
468   } while (!Dep.isNonLocal());
469   
470   return true;
471 }
472
473 /// handleEndBlock - Remove dead stores to stack-allocated locations in the
474 /// function end block.  Ex:
475 /// %A = alloca i32
476 /// ...
477 /// store i32 1, i32* %A
478 /// ret void
479 bool DSE::handleEndBlock(BasicBlock &BB) {
480   bool MadeChange = false;
481   
482   // Keep track of all of the stack objects that are dead at the end of the
483   // function.
484   SmallPtrSet<Value*, 16> DeadStackObjects;
485   
486   // Find all of the alloca'd pointers in the entry block.
487   BasicBlock *Entry = BB.getParent()->begin();
488   for (BasicBlock::iterator I = Entry->begin(), E = Entry->end(); I != E; ++I)
489     if (AllocaInst *AI = dyn_cast<AllocaInst>(I))
490       DeadStackObjects.insert(AI);
491   
492   // Treat byval arguments the same, stores to them are dead at the end of the
493   // function.
494   for (Function::arg_iterator AI = BB.getParent()->arg_begin(),
495        AE = BB.getParent()->arg_end(); AI != AE; ++AI)
496     if (AI->hasByValAttr())
497       DeadStackObjects.insert(AI);
498   
499   // Scan the basic block backwards
500   for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){
501     --BBI;
502     
503     // If we find a store, check to see if it points into a dead stack value.
504     if (hasMemoryWrite(BBI) && isRemovable(BBI)) {
505       // See through pointer-to-pointer bitcasts
506       Value *Pointer = getStoredPointerOperand(BBI)->getUnderlyingObject();
507
508       // Stores to stack values are valid candidates for removal.
509       if (DeadStackObjects.count(Pointer)) {
510         // DCE instructions only used to calculate that store.
511         Instruction *Dead = BBI++;
512         DeleteDeadInstruction(Dead, *MD, &DeadStackObjects);
513         ++NumFastStores;
514         MadeChange = true;
515         continue;
516       }
517     }
518     
519     // Remove any dead non-memory-mutating instructions.
520     if (isInstructionTriviallyDead(BBI)) {
521       Instruction *Inst = BBI++;
522       DeleteDeadInstruction(Inst, *MD, &DeadStackObjects);
523       ++NumFastOther;
524       MadeChange = true;
525       continue;
526     }
527     
528     if (AllocaInst *A = dyn_cast<AllocaInst>(BBI)) {
529       DeadStackObjects.erase(A);
530       continue;
531     }
532     
533     if (CallSite CS = cast<Value>(BBI)) {
534       // If this call does not access memory, it can't be loading any of our
535       // pointers.
536       if (AA->doesNotAccessMemory(CS))
537         continue;
538       
539       unsigned NumModRef = 0, NumOther = 0;
540       
541       // If the call might load from any of our allocas, then any store above
542       // the call is live.
543       SmallVector<Value*, 8> LiveAllocas;
544       for (SmallPtrSet<Value*, 16>::iterator I = DeadStackObjects.begin(),
545            E = DeadStackObjects.end(); I != E; ++I) {
546         // If we detect that our AA is imprecise, it's not worth it to scan the
547         // rest of the DeadPointers set.  Just assume that the AA will return
548         // ModRef for everything, and go ahead and bail out.
549         if (NumModRef >= 16 && NumOther == 0)
550           return MadeChange;
551
552         // See if the call site touches it.
553         AliasAnalysis::ModRefResult A = 
554           AA->getModRefInfo(CS, *I, getPointerSize(*I, *AA));
555         
556         if (A == AliasAnalysis::ModRef)
557           ++NumModRef;
558         else
559           ++NumOther;
560         
561         if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref)
562           LiveAllocas.push_back(*I);
563       }
564       
565       for (SmallVector<Value*, 8>::iterator I = LiveAllocas.begin(),
566            E = LiveAllocas.end(); I != E; ++I)
567         DeadStackObjects.erase(*I);
568       
569       // If all of the allocas were clobbered by the call then we're not going
570       // to find anything else to process.
571       if (DeadStackObjects.empty())
572         return MadeChange;
573       
574       continue;
575     }
576     
577     AliasAnalysis::Location LoadedLoc;
578     
579     // If we encounter a use of the pointer, it is no longer considered dead
580     if (LoadInst *L = dyn_cast<LoadInst>(BBI)) {
581       LoadedLoc = AA->getLocation(L);
582     } else if (VAArgInst *V = dyn_cast<VAArgInst>(BBI)) {
583       LoadedLoc = AA->getLocation(V);
584     } else if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(BBI)) {
585       LoadedLoc = AA->getLocationForSource(MTI);
586     } else {
587       // Not a loading instruction.
588       continue;
589     }
590
591     // Remove any allocas from the DeadPointer set that are loaded, as this
592     // makes any stores above the access live.
593     RemoveAccessedObjects(LoadedLoc, DeadStackObjects);
594
595     // If all of the allocas were clobbered by the access then we're not going
596     // to find anything else to process.
597     if (DeadStackObjects.empty())
598       break;
599   }
600   
601   return MadeChange;
602 }
603
604 /// RemoveAccessedObjects - Check to see if the specified location may alias any
605 /// of the stack objects in the DeadStackObjects set.  If so, they become live
606 /// because the location is being loaded.
607 void DSE::RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc,
608                                 SmallPtrSet<Value*, 16> &DeadStackObjects) {
609   const Value *UnderlyingPointer = LoadedLoc.Ptr->getUnderlyingObject();
610
611   // A constant can't be in the dead pointer set.
612   if (isa<Constant>(UnderlyingPointer))
613     return;
614   
615   // If the kill pointer can be easily reduced to an alloca, don't bother doing
616   // extraneous AA queries.
617   if (isa<AllocaInst>(UnderlyingPointer) || isa<Argument>(UnderlyingPointer)) {
618     DeadStackObjects.erase(const_cast<Value*>(UnderlyingPointer));
619     return;
620   }
621   
622   SmallVector<Value*, 16> NowLive;
623   for (SmallPtrSet<Value*, 16>::iterator I = DeadStackObjects.begin(),
624        E = DeadStackObjects.end(); I != E; ++I) {
625     // See if the loaded location could alias the stack location.
626     AliasAnalysis::Location StackLoc(*I, getPointerSize(*I, *AA));
627     if (!AA->isNoAlias(StackLoc, LoadedLoc))
628       NowLive.push_back(*I);
629   }
630
631   for (SmallVector<Value*, 16>::iterator I = NowLive.begin(), E = NowLive.end();
632        I != E; ++I)
633     DeadStackObjects.erase(*I);
634 }
635