blob: ae5e727899be38b6e2834492a0a691b88c6887e5 [file] [log] [blame]
Owen Andersone3590582007-08-02 18:11:11 +00001//===- DeadStoreElimination.cpp - Fast Dead Store Elimination -------------===//
Owen Anderson5e72db32007-07-11 00:46:18 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Owen Anderson5e72db32007-07-11 00:46:18 +00007//
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
Owen Anderson10e52ed2007-08-01 06:36:51 +000018#define DEBUG_TYPE "dse"
Owen Anderson5e72db32007-07-11 00:46:18 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson32c4a052007-07-12 21:41:30 +000020#include "llvm/Constants.h"
Owen Anderson5e72db32007-07-11 00:46:18 +000021#include "llvm/Function.h"
Chris Lattner903add82010-11-30 23:43:23 +000022#include "llvm/GlobalVariable.h"
Owen Anderson5e72db32007-07-11 00:46:18 +000023#include "llvm/Instructions.h"
Owen Anderson48d37802008-01-29 06:18:36 +000024#include "llvm/IntrinsicInst.h"
Owen Anderson5e72db32007-07-11 00:46:18 +000025#include "llvm/Pass.h"
Owen Anderson5e72db32007-07-11 00:46:18 +000026#include "llvm/ADT/SmallPtrSet.h"
27#include "llvm/ADT/Statistic.h"
Owen Andersonaa071722007-07-11 23:19:17 +000028#include "llvm/Analysis/AliasAnalysis.h"
Owen Anderson3f338972008-07-28 16:14:26 +000029#include "llvm/Analysis/Dominators.h"
Victor Hernandezf390e042009-10-27 20:05:49 +000030#include "llvm/Analysis/MemoryBuiltins.h"
Owen Anderson5e72db32007-07-11 00:46:18 +000031#include "llvm/Analysis/MemoryDependenceAnalysis.h"
Chris Lattnerc0f33792010-11-30 23:05:20 +000032#include "llvm/Analysis/ValueTracking.h"
Owen Andersonaa071722007-07-11 23:19:17 +000033#include "llvm/Target/TargetData.h"
Owen Anderson5e72db32007-07-11 00:46:18 +000034#include "llvm/Transforms/Utils/Local.h"
Owen Anderson5e72db32007-07-11 00:46:18 +000035using namespace llvm;
36
37STATISTIC(NumFastStores, "Number of stores deleted");
38STATISTIC(NumFastOther , "Number of other instrs removed");
39
40namespace {
Chris Lattner2dd09db2009-09-02 06:11:42 +000041 struct DSE : public FunctionPass {
Chris Lattner51c28a92010-11-30 19:34:42 +000042 AliasAnalysis *AA;
43 MemoryDependenceAnalysis *MD;
44
Owen Anderson5e72db32007-07-11 00:46:18 +000045 static char ID; // Pass identification, replacement for typeid
Chris Lattner51c28a92010-11-30 19:34:42 +000046 DSE() : FunctionPass(ID), AA(0), MD(0) {
Owen Anderson6c18d1a2010-10-19 17:21:58 +000047 initializeDSEPass(*PassRegistry::getPassRegistry());
48 }
Owen Anderson5e72db32007-07-11 00:46:18 +000049
50 virtual bool runOnFunction(Function &F) {
Chris Lattner51c28a92010-11-30 19:34:42 +000051 AA = &getAnalysis<AliasAnalysis>();
52 MD = &getAnalysis<MemoryDependenceAnalysis>();
Chris Lattnerc053cbb2010-02-11 05:11:54 +000053 DominatorTree &DT = getAnalysis<DominatorTree>();
54
Chris Lattner51c28a92010-11-30 19:34:42 +000055 bool Changed = false;
Owen Anderson5e72db32007-07-11 00:46:18 +000056 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
Chris Lattnerc053cbb2010-02-11 05:11:54 +000057 // Only check non-dead blocks. Dead blocks may have strange pointer
58 // cycles that will confuse alias analysis.
59 if (DT.isReachableFromEntry(I))
60 Changed |= runOnBasicBlock(*I);
Chris Lattner51c28a92010-11-30 19:34:42 +000061
62 AA = 0; MD = 0;
Owen Anderson5e72db32007-07-11 00:46:18 +000063 return Changed;
64 }
Chris Lattnerde04e112008-11-29 01:43:36 +000065
Owen Anderson5e72db32007-07-11 00:46:18 +000066 bool runOnBasicBlock(BasicBlock &BB);
Chris Lattner9d179d92010-11-30 01:28:33 +000067 bool HandleFree(CallInst *F);
Chris Lattner1adb6752008-11-28 00:27:14 +000068 bool handleEndBlock(BasicBlock &BB);
Chris Lattner51d67ce2010-11-30 21:47:58 +000069 void RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc,
70 SmallPtrSet<Value*, 16> &DeadStackObjects);
Chris Lattner1adb6752008-11-28 00:27:14 +000071
Owen Anderson5e72db32007-07-11 00:46:18 +000072
73 // getAnalysisUsage - We require post dominance frontiers (aka Control
74 // Dependence Graph)
75 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
76 AU.setPreservesCFG();
Owen Anderson3f338972008-07-28 16:14:26 +000077 AU.addRequired<DominatorTree>();
Owen Andersonaa071722007-07-11 23:19:17 +000078 AU.addRequired<AliasAnalysis>();
Owen Anderson5e72db32007-07-11 00:46:18 +000079 AU.addRequired<MemoryDependenceAnalysis>();
Chris Lattner51c28a92010-11-30 19:34:42 +000080 AU.addPreserved<AliasAnalysis>();
Owen Anderson3f338972008-07-28 16:14:26 +000081 AU.addPreserved<DominatorTree>();
Owen Anderson5e72db32007-07-11 00:46:18 +000082 AU.addPreserved<MemoryDependenceAnalysis>();
83 }
84 };
Owen Anderson5e72db32007-07-11 00:46:18 +000085}
86
Dan Gohmand78c4002008-05-13 00:00:25 +000087char DSE::ID = 0;
Owen Anderson8ac477f2010-10-12 19:48:12 +000088INITIALIZE_PASS_BEGIN(DSE, "dse", "Dead Store Elimination", false, false)
89INITIALIZE_PASS_DEPENDENCY(DominatorTree)
90INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
91INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
92INITIALIZE_PASS_END(DSE, "dse", "Dead Store Elimination", false, false)
Dan Gohmand78c4002008-05-13 00:00:25 +000093
Owen Anderson10e52ed2007-08-01 06:36:51 +000094FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); }
Owen Anderson5e72db32007-07-11 00:46:18 +000095
Chris Lattner67122512010-11-30 21:58:14 +000096//===----------------------------------------------------------------------===//
97// Helper functions
98//===----------------------------------------------------------------------===//
99
100/// DeleteDeadInstruction - Delete this instruction. Before we do, go through
101/// and zero out all the operands of this instruction. If any of them become
102/// dead, delete them and the computation tree that feeds them.
103///
104/// If ValueSet is non-null, remove any deleted instructions from it as well.
105///
106static void DeleteDeadInstruction(Instruction *I,
107 MemoryDependenceAnalysis &MD,
108 SmallPtrSet<Value*, 16> *ValueSet = 0) {
109 SmallVector<Instruction*, 32> NowDeadInsts;
110
111 NowDeadInsts.push_back(I);
112 --NumFastOther;
113
114 // Before we touch this instruction, remove it from memdep!
115 do {
116 Instruction *DeadInst = NowDeadInsts.pop_back_val();
117 ++NumFastOther;
118
119 // This instruction is dead, zap it, in stages. Start by removing it from
120 // MemDep, which needs to know the operands and needs it to be in the
121 // function.
122 MD.removeInstruction(DeadInst);
123
124 for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) {
125 Value *Op = DeadInst->getOperand(op);
126 DeadInst->setOperand(op, 0);
127
128 // If this operand just became dead, add it to the NowDeadInsts list.
129 if (!Op->use_empty()) continue;
130
131 if (Instruction *OpI = dyn_cast<Instruction>(Op))
132 if (isInstructionTriviallyDead(OpI))
133 NowDeadInsts.push_back(OpI);
134 }
135
136 DeadInst->eraseFromParent();
137
138 if (ValueSet) ValueSet->erase(DeadInst);
139 } while (!NowDeadInsts.empty());
140}
141
142
Chris Lattner2227a8a2010-11-30 01:37:52 +0000143/// hasMemoryWrite - Does this instruction write some memory? This only returns
144/// true for things that we can analyze with other helpers below.
145static bool hasMemoryWrite(Instruction *I) {
Nick Lewycky90271472009-11-10 06:46:40 +0000146 if (isa<StoreInst>(I))
147 return true;
148 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
149 switch (II->getIntrinsicID()) {
Chris Lattner2764b4d2009-12-02 06:35:55 +0000150 default:
151 return false;
152 case Intrinsic::memset:
153 case Intrinsic::memmove:
154 case Intrinsic::memcpy:
155 case Intrinsic::init_trampoline:
156 case Intrinsic::lifetime_end:
157 return true;
Nick Lewycky90271472009-11-10 06:46:40 +0000158 }
159 }
160 return false;
161}
162
Chris Lattner58b779e2010-11-30 07:23:21 +0000163/// getLocForWrite - Return a Location stored to by the specified instruction.
164static AliasAnalysis::Location
165getLocForWrite(Instruction *Inst, AliasAnalysis &AA) {
166 if (StoreInst *SI = dyn_cast<StoreInst>(Inst))
167 return AA.getLocation(SI);
168
169 if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(Inst)) {
170 // memcpy/memmove/memset.
171 AliasAnalysis::Location Loc = AA.getLocationForDest(MI);
172 // If we don't have target data around, an unknown size in Location means
173 // that we should use the size of the pointee type. This isn't valid for
174 // memset/memcpy, which writes more than an i8.
175 if (Loc.Size == AliasAnalysis::UnknownSize && AA.getTargetData() == 0)
176 return AliasAnalysis::Location();
177 return Loc;
178 }
179
180 IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst);
181 if (II == 0) return AliasAnalysis::Location();
182
183 switch (II->getIntrinsicID()) {
184 default: return AliasAnalysis::Location(); // Unhandled intrinsic.
185 case Intrinsic::init_trampoline:
186 // If we don't have target data around, an unknown size in Location means
187 // that we should use the size of the pointee type. This isn't valid for
188 // init.trampoline, which writes more than an i8.
189 if (AA.getTargetData() == 0) return AliasAnalysis::Location();
190
191 // FIXME: We don't know the size of the trampoline, so we can't really
192 // handle it here.
193 return AliasAnalysis::Location(II->getArgOperand(0));
194 case Intrinsic::lifetime_end: {
195 uint64_t Len = cast<ConstantInt>(II->getArgOperand(0))->getZExtValue();
196 return AliasAnalysis::Location(II->getArgOperand(1), Len);
197 }
198 }
199}
200
Chris Lattner94fbdf32010-12-06 01:48:06 +0000201/// getLocForRead - Return the location read by the specified "hasMemoryWrite"
202/// instruction if any.
203static AliasAnalysis::Location
204getLocForRead(Instruction *Inst, AliasAnalysis &AA) {
205 assert(hasMemoryWrite(Inst) && "Unknown instruction case");
206
207 // The only instructions that both read and write are the mem transfer
208 // instructions (memcpy/memmove).
209 if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(Inst))
210 return AA.getLocationForSource(MTI);
211 return AliasAnalysis::Location();
212}
213
214
Chris Lattner3590ef82010-11-30 05:30:45 +0000215/// isRemovable - If the value of this instruction and the memory it writes to
216/// is unused, may we delete this instruction?
217static bool isRemovable(Instruction *I) {
Chris Lattnerb63ba732010-11-30 19:12:10 +0000218 // Don't remove volatile stores.
Nick Lewycky90271472009-11-10 06:46:40 +0000219 if (StoreInst *SI = dyn_cast<StoreInst>(I))
220 return !SI->isVolatile();
Chris Lattnerb63ba732010-11-30 19:12:10 +0000221
222 IntrinsicInst *II = cast<IntrinsicInst>(I);
223 switch (II->getIntrinsicID()) {
224 default: assert(0 && "doesn't pass 'hasMemoryWrite' predicate");
225 case Intrinsic::lifetime_end:
226 // Never remove dead lifetime_end's, e.g. because it is followed by a
227 // free.
228 return false;
229 case Intrinsic::init_trampoline:
230 // Always safe to remove init_trampoline.
231 return true;
232
233 case Intrinsic::memset:
234 case Intrinsic::memmove:
235 case Intrinsic::memcpy:
236 // Don't remove volatile memory intrinsics.
237 return !cast<MemIntrinsic>(II)->isVolatile();
238 }
Nick Lewycky90271472009-11-10 06:46:40 +0000239}
240
Chris Lattner67122512010-11-30 21:58:14 +0000241/// getStoredPointerOperand - Return the pointer that is being written to.
242static Value *getStoredPointerOperand(Instruction *I) {
Nick Lewycky90271472009-11-10 06:46:40 +0000243 if (StoreInst *SI = dyn_cast<StoreInst>(I))
244 return SI->getPointerOperand();
245 if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I))
Chris Lattner67122512010-11-30 21:58:14 +0000246 return MI->getDest();
Gabor Greif91f95892010-06-24 12:03:56 +0000247
248 IntrinsicInst *II = cast<IntrinsicInst>(I);
249 switch (II->getIntrinsicID()) {
Chris Lattner2764b4d2009-12-02 06:35:55 +0000250 default: assert(false && "Unexpected intrinsic!");
251 case Intrinsic::init_trampoline:
Gabor Greif91f95892010-06-24 12:03:56 +0000252 return II->getArgOperand(0);
Duncan Sands1925d3a2009-11-10 13:49:50 +0000253 }
Nick Lewycky90271472009-11-10 06:46:40 +0000254}
255
Chris Lattner51c28a92010-11-30 19:34:42 +0000256static uint64_t getPointerSize(Value *V, AliasAnalysis &AA) {
257 const TargetData *TD = AA.getTargetData();
258 if (TD == 0)
259 return AliasAnalysis::UnknownSize;
260
261 if (AllocaInst *A = dyn_cast<AllocaInst>(V)) {
262 // Get size information for the alloca
263 if (ConstantInt *C = dyn_cast<ConstantInt>(A->getArraySize()))
264 return C->getZExtValue() * TD->getTypeAllocSize(A->getAllocatedType());
265 return AliasAnalysis::UnknownSize;
266 }
267
268 assert(isa<Argument>(V) && "Expected AllocaInst or Argument!");
269 const PointerType *PT = cast<PointerType>(V->getType());
270 return TD->getTypeAllocSize(PT->getElementType());
271}
272
Chris Lattner903add82010-11-30 23:43:23 +0000273/// isObjectPointerWithTrustworthySize - Return true if the specified Value* is
274/// pointing to an object with a pointer size we can trust.
275static bool isObjectPointerWithTrustworthySize(const Value *V) {
276 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V))
277 return !AI->isArrayAllocation();
278 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
279 return !GV->isWeakForLinker();
280 if (const Argument *A = dyn_cast<Argument>(V))
281 return A->hasByValAttr();
282 return false;
283}
Chris Lattner51c28a92010-11-30 19:34:42 +0000284
Chris Lattner58b779e2010-11-30 07:23:21 +0000285/// isCompleteOverwrite - Return true if a store to the 'Later' location
286/// completely overwrites a store to the 'Earlier' location.
287static bool isCompleteOverwrite(const AliasAnalysis::Location &Later,
288 const AliasAnalysis::Location &Earlier,
Chris Lattner77d79fa2010-11-30 19:28:23 +0000289 AliasAnalysis &AA) {
Chris Lattnerc0f33792010-11-30 23:05:20 +0000290 const Value *P1 = Earlier.Ptr->stripPointerCasts();
291 const Value *P2 = Later.Ptr->stripPointerCasts();
Chris Lattner58b779e2010-11-30 07:23:21 +0000292
Chris Lattnerc0f33792010-11-30 23:05:20 +0000293 // If the start pointers are the same, we just have to compare sizes to see if
294 // the later store was larger than the earlier store.
295 if (P1 == P2) {
296 // If we don't know the sizes of either access, then we can't do a
297 // comparison.
298 if (Later.Size == AliasAnalysis::UnknownSize ||
299 Earlier.Size == AliasAnalysis::UnknownSize) {
300 // If we have no TargetData information around, then the size of the store
301 // is inferrable from the pointee type. If they are the same type, then
302 // we know that the store is safe.
303 if (AA.getTargetData() == 0)
304 return Later.Ptr->getType() == Earlier.Ptr->getType();
305 return false;
306 }
307
308 // Make sure that the Later size is >= the Earlier size.
309 if (Later.Size < Earlier.Size)
310 return false;
311 return true;
Chris Lattner77d79fa2010-11-30 19:28:23 +0000312 }
Chris Lattner58b779e2010-11-30 07:23:21 +0000313
Chris Lattnerc0f33792010-11-30 23:05:20 +0000314 // Otherwise, we have to have size information, and the later store has to be
315 // larger than the earlier one.
316 if (Later.Size == AliasAnalysis::UnknownSize ||
317 Earlier.Size == AliasAnalysis::UnknownSize ||
Chris Lattner903add82010-11-30 23:43:23 +0000318 Later.Size <= Earlier.Size || AA.getTargetData() == 0)
Chris Lattner58b779e2010-11-30 07:23:21 +0000319 return false;
320
Chris Lattner903add82010-11-30 23:43:23 +0000321 // Check to see if the later store is to the entire object (either a global,
322 // an alloca, or a byval argument). If so, then it clearly overwrites any
323 // other store to the same object.
Chris Lattnerc0f33792010-11-30 23:05:20 +0000324 const TargetData &TD = *AA.getTargetData();
325
Chris Lattner903add82010-11-30 23:43:23 +0000326 const Value *UO1 = P1->getUnderlyingObject(), *UO2 = P2->getUnderlyingObject();
327
328 // If we can't resolve the same pointers to the same object, then we can't
329 // analyze them at all.
330 if (UO1 != UO2)
331 return false;
332
333 // If the "Later" store is to a recognizable object, get its size.
334 if (isObjectPointerWithTrustworthySize(UO2)) {
335 uint64_t ObjectSize =
336 TD.getTypeAllocSize(cast<PointerType>(UO2->getType())->getElementType());
337 if (ObjectSize == Later.Size)
338 return true;
339 }
340
Chris Lattnerc0f33792010-11-30 23:05:20 +0000341 // Okay, we have stores to two completely different pointers. Try to
342 // decompose the pointer into a "base + constant_offset" form. If the base
343 // pointers are equal, then we can reason about the two stores.
344 int64_t Off1 = 0, Off2 = 0;
345 const Value *BP1 = GetPointerBaseWithConstantOffset(P1, Off1, TD);
346 const Value *BP2 = GetPointerBaseWithConstantOffset(P2, Off2, TD);
347
348 // If the base pointers still differ, we have two completely different stores.
349 if (BP1 != BP2)
350 return false;
351
352 // Otherwise, we might have a situation like:
353 // store i16 -> P + 1 Byte
354 // store i32 -> P
355 // In this case, we see if the later store completely overlaps all bytes
356 // stored by the previous store.
357 if (Off1 < Off2 || // Earlier starts before Later.
358 Off1+Earlier.Size > Off2+Later.Size) // Earlier goes beyond Later.
359 return false;
360 // Otherwise, we have complete overlap.
Chris Lattner58b779e2010-11-30 07:23:21 +0000361 return true;
Nick Lewycky90271472009-11-10 06:46:40 +0000362}
363
Chris Lattner94fbdf32010-12-06 01:48:06 +0000364/// isPossibleSelfRead - If 'Inst' might be a self read (i.e. a noop copy of a
365/// memory region into an identical pointer) then it doesn't actually make its
366/// input dead in the traditional sense. Consider this case:
367///
368/// memcpy(A <- B)
369/// memcpy(A <- A)
370///
371/// In this case, the second store to A does not make the first store to A dead.
372/// The usual situation isn't an explicit A<-A store like this (which can be
373/// trivially removed) but a case where two pointers may alias.
374///
375/// This function detects when it is unsafe to remove a dependent instruction
376/// because the DSE inducing instruction may be a self-read.
377static bool isPossibleSelfRead(Instruction *Inst,
378 const AliasAnalysis::Location &InstStoreLoc,
379 Instruction *DepWrite, AliasAnalysis &AA) {
380 // Self reads can only happen for instructions that read memory. Get the
381 // location read.
382 AliasAnalysis::Location InstReadLoc = getLocForRead(Inst, AA);
383 if (InstReadLoc.Ptr == 0) return false; // Not a reading instruction.
384
385 // If the read and written loc obviously don't alias, it isn't a read.
386 if (AA.isNoAlias(InstReadLoc, InstStoreLoc)) return false;
387
388 // Okay, 'Inst' may copy over itself. However, we can still remove a the
389 // DepWrite instruction if we can prove that it reads from the same location
390 // as Inst. This handles useful cases like:
391 // memcpy(A <- B)
392 // memcpy(A <- B)
393 // Here we don't know if A/B may alias, but we do know that B/B are must
394 // aliases, so removing the first memcpy is safe (assuming it writes <= #
395 // bytes as the second one.
396 AliasAnalysis::Location DepReadLoc = getLocForRead(DepWrite, AA);
397
398 if (DepReadLoc.Ptr && AA.isMustAlias(InstReadLoc.Ptr, DepReadLoc.Ptr))
399 return false;
400
401 // If DepWrite doesn't read memory or if we can't prove it is a must alias,
402 // then it can't be considered dead.
403 return true;
404}
405
Chris Lattner67122512010-11-30 21:58:14 +0000406
407//===----------------------------------------------------------------------===//
408// DSE Pass
409//===----------------------------------------------------------------------===//
410
Owen Anderson10e52ed2007-08-01 06:36:51 +0000411bool DSE::runOnBasicBlock(BasicBlock &BB) {
Owen Anderson5e72db32007-07-11 00:46:18 +0000412 bool MadeChange = false;
413
Chris Lattner49162672009-09-02 06:31:02 +0000414 // Do a top-down walk on the BB.
Chris Lattnerf2a8ba42008-11-28 21:29:52 +0000415 for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ) {
416 Instruction *Inst = BBI++;
417
Chris Lattner9d179d92010-11-30 01:28:33 +0000418 // Handle 'free' calls specially.
419 if (CallInst *F = isFreeCall(Inst)) {
420 MadeChange |= HandleFree(F);
421 continue;
422 }
423
Chris Lattner2227a8a2010-11-30 01:37:52 +0000424 // If we find something that writes memory, get its memory dependence.
425 if (!hasMemoryWrite(Inst))
Owen Anderson0aecf0e2007-08-08 04:52:29 +0000426 continue;
Chris Lattnerd4f10902010-11-30 00:01:19 +0000427
Chris Lattner51c28a92010-11-30 19:34:42 +0000428 MemDepResult InstDep = MD->getDependency(Inst);
Chris Lattnerf2a8ba42008-11-28 21:29:52 +0000429
Chris Lattnerd4f10902010-11-30 00:01:19 +0000430 // Ignore non-local store liveness.
Chris Lattner57e91ea2008-12-06 00:53:22 +0000431 // FIXME: cross-block DSE would be fun. :)
Chris Lattner58b779e2010-11-30 07:23:21 +0000432 if (InstDep.isNonLocal() ||
433 // Ignore self dependence, which happens in the entry block of the
434 // function.
435 InstDep.getInst() == Inst)
436 continue;
Chris Lattner9d179d92010-11-30 01:28:33 +0000437
Chris Lattner57e91ea2008-12-06 00:53:22 +0000438 // If we're storing the same value back to a pointer that we just
439 // loaded from, then the store can be removed.
Nick Lewycky90271472009-11-10 06:46:40 +0000440 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
441 if (LoadInst *DepLoad = dyn_cast<LoadInst>(InstDep.getInst())) {
442 if (SI->getPointerOperand() == DepLoad->getPointerOperand() &&
Chris Lattnerc3c754f2010-11-30 00:12:39 +0000443 SI->getOperand(0) == DepLoad && !SI->isVolatile()) {
Nick Lewycky90271472009-11-10 06:46:40 +0000444 // DeleteDeadInstruction can delete the current instruction. Save BBI
445 // in case we need it.
446 WeakVH NextInst(BBI);
447
Chris Lattner67122512010-11-30 21:58:14 +0000448 DeleteDeadInstruction(SI, *MD);
Nick Lewycky90271472009-11-10 06:46:40 +0000449
450 if (NextInst == 0) // Next instruction deleted.
451 BBI = BB.begin();
452 else if (BBI != BB.begin()) // Revisit this instruction if possible.
453 --BBI;
Dan Gohmand2d1ae12010-06-22 15:08:57 +0000454 ++NumFastStores;
Nick Lewycky90271472009-11-10 06:46:40 +0000455 MadeChange = true;
456 continue;
457 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000458 }
Owen Anderson5e72db32007-07-11 00:46:18 +0000459 }
Chris Lattner3590ef82010-11-30 05:30:45 +0000460
Chris Lattner58b779e2010-11-30 07:23:21 +0000461 // Figure out what location is being stored to.
Chris Lattner51c28a92010-11-30 19:34:42 +0000462 AliasAnalysis::Location Loc = getLocForWrite(Inst, *AA);
Chris Lattner58b779e2010-11-30 07:23:21 +0000463
464 // If we didn't get a useful location, fail.
465 if (Loc.Ptr == 0)
466 continue;
467
468 while (!InstDep.isNonLocal()) {
469 // Get the memory clobbered by the instruction we depend on. MemDep will
470 // skip any instructions that 'Loc' clearly doesn't interact with. If we
471 // end up depending on a may- or must-aliased load, then we can't optimize
472 // away the store and we bail out. However, if we depend on on something
473 // that overwrites the memory location we *can* potentially optimize it.
474 //
475 // Find out what memory location the dependant instruction stores.
476 Instruction *DepWrite = InstDep.getInst();
Chris Lattner51c28a92010-11-30 19:34:42 +0000477 AliasAnalysis::Location DepLoc = getLocForWrite(DepWrite, *AA);
Chris Lattner58b779e2010-11-30 07:23:21 +0000478 // If we didn't get a useful location, or if it isn't a size, bail out.
479 if (DepLoc.Ptr == 0)
480 break;
481
Chris Lattner94fbdf32010-12-06 01:48:06 +0000482 // If we find a write that is a) removable (i.e., non-volatile), b) is
483 // completely obliterated by the store to 'Loc', and c) which we know that
484 // 'Inst' doesn't load from, then we can remove it.
485 if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, *AA) &&
486 !isPossibleSelfRead(Inst, Loc, DepWrite, *AA)) {
Chris Lattner58b779e2010-11-30 07:23:21 +0000487 // Delete the store and now-dead instructions that feed it.
Chris Lattner67122512010-11-30 21:58:14 +0000488 DeleteDeadInstruction(DepWrite, *MD);
Chris Lattner58b779e2010-11-30 07:23:21 +0000489 ++NumFastStores;
490 MadeChange = true;
491
492 // DeleteDeadInstruction can delete the current instruction in loop
493 // cases, reset BBI.
494 BBI = Inst;
495 if (BBI != BB.begin())
496 --BBI;
497 break;
498 }
499
Chris Lattnerd4f10902010-11-30 00:01:19 +0000500 // If this is a may-aliased store that is clobbering the store value, we
501 // can keep searching past it for another must-aliased pointer that stores
502 // to the same location. For example, in:
503 // store -> P
504 // store -> Q
505 // store -> P
506 // we can remove the first store to P even though we don't know if P and Q
507 // alias.
Chris Lattner58b779e2010-11-30 07:23:21 +0000508 if (DepWrite == &BB.front()) break;
509
510 // Can't look past this instruction if it might read 'Loc'.
Chris Lattner51c28a92010-11-30 19:34:42 +0000511 if (AA->getModRefInfo(DepWrite, Loc) & AliasAnalysis::Ref)
Chris Lattner58b779e2010-11-30 07:23:21 +0000512 break;
Chris Lattner3590ef82010-11-30 05:30:45 +0000513
Chris Lattner51c28a92010-11-30 19:34:42 +0000514 InstDep = MD->getPointerDependencyFrom(Loc, false, DepWrite, &BB);
Owen Anderson2b2bd282009-10-28 07:05:35 +0000515 }
Owen Anderson5e72db32007-07-11 00:46:18 +0000516 }
517
Chris Lattnerf2a8ba42008-11-28 21:29:52 +0000518 // If this block ends in a return, unwind, or unreachable, all allocas are
519 // dead at its end, which means stores to them are also dead.
Owen Anderson32c4a052007-07-12 21:41:30 +0000520 if (BB.getTerminator()->getNumSuccessors() == 0)
Chris Lattner1adb6752008-11-28 00:27:14 +0000521 MadeChange |= handleEndBlock(BB);
Owen Anderson5e72db32007-07-11 00:46:18 +0000522
523 return MadeChange;
524}
525
Chris Lattner9d179d92010-11-30 01:28:33 +0000526/// HandleFree - Handle frees of entire structures whose dependency is a store
527/// to a field of that structure.
528bool DSE::HandleFree(CallInst *F) {
Chris Lattner51c28a92010-11-30 19:34:42 +0000529 MemDepResult Dep = MD->getDependency(F);
Dan Gohmand4b7fff2010-11-12 02:19:17 +0000530 do {
Chris Lattner9d179d92010-11-30 01:28:33 +0000531 if (Dep.isNonLocal()) return false;
532
Dan Gohmand4b7fff2010-11-12 02:19:17 +0000533 Instruction *Dependency = Dep.getInst();
Chris Lattner3590ef82010-11-30 05:30:45 +0000534 if (!hasMemoryWrite(Dependency) || !isRemovable(Dependency))
Dan Gohmand4b7fff2010-11-12 02:19:17 +0000535 return false;
Owen Andersond4451de2007-07-12 18:08:51 +0000536
Chris Lattner67122512010-11-30 21:58:14 +0000537 Value *DepPointer =
538 getStoredPointerOperand(Dependency)->getUnderlyingObject();
Duncan Sandsfe3bef02008-01-20 10:49:23 +0000539
Dan Gohmand4b7fff2010-11-12 02:19:17 +0000540 // Check for aliasing.
Chris Lattner94fbdf32010-12-06 01:48:06 +0000541 if (!AA->isMustAlias(F->getArgOperand(0), DepPointer))
Dan Gohmand4b7fff2010-11-12 02:19:17 +0000542 return false;
Owen Andersonaa071722007-07-11 23:19:17 +0000543
Dan Gohmand4b7fff2010-11-12 02:19:17 +0000544 // DCE instructions only used to calculate that store
Chris Lattner67122512010-11-30 21:58:14 +0000545 DeleteDeadInstruction(Dependency, *MD);
Dan Gohmand4b7fff2010-11-12 02:19:17 +0000546 ++NumFastStores;
547
548 // Inst's old Dependency is now deleted. Compute the next dependency,
549 // which may also be dead, as in
550 // s[0] = 0;
551 // s[1] = 0; // This has just been deleted.
552 // free(s);
Chris Lattner51c28a92010-11-30 19:34:42 +0000553 Dep = MD->getDependency(F);
Dan Gohmand4b7fff2010-11-12 02:19:17 +0000554 } while (!Dep.isNonLocal());
Chris Lattner9d179d92010-11-30 01:28:33 +0000555
Chris Lattner1adb6752008-11-28 00:27:14 +0000556 return true;
Owen Andersonaa071722007-07-11 23:19:17 +0000557}
558
Owen Andersone3590582007-08-02 18:11:11 +0000559/// handleEndBlock - Remove dead stores to stack-allocated locations in the
Owen Anderson52aaabf2007-08-08 17:50:09 +0000560/// function end block. Ex:
561/// %A = alloca i32
562/// ...
563/// store i32 1, i32* %A
564/// ret void
Chris Lattner1adb6752008-11-28 00:27:14 +0000565bool DSE::handleEndBlock(BasicBlock &BB) {
Owen Anderson32c4a052007-07-12 21:41:30 +0000566 bool MadeChange = false;
567
Chris Lattner7fe08b62010-11-30 21:32:12 +0000568 // Keep track of all of the stack objects that are dead at the end of the
569 // function.
570 SmallPtrSet<Value*, 16> DeadStackObjects;
Owen Anderson32c4a052007-07-12 21:41:30 +0000571
Chris Lattner1adb6752008-11-28 00:27:14 +0000572 // Find all of the alloca'd pointers in the entry block.
Owen Anderson32c4a052007-07-12 21:41:30 +0000573 BasicBlock *Entry = BB.getParent()->begin();
574 for (BasicBlock::iterator I = Entry->begin(), E = Entry->end(); I != E; ++I)
575 if (AllocaInst *AI = dyn_cast<AllocaInst>(I))
Chris Lattner7fe08b62010-11-30 21:32:12 +0000576 DeadStackObjects.insert(AI);
Chris Lattner1adb6752008-11-28 00:27:14 +0000577
578 // Treat byval arguments the same, stores to them are dead at the end of the
579 // function.
Owen Anderson48d37802008-01-29 06:18:36 +0000580 for (Function::arg_iterator AI = BB.getParent()->arg_begin(),
581 AE = BB.getParent()->arg_end(); AI != AE; ++AI)
582 if (AI->hasByValAttr())
Chris Lattner7fe08b62010-11-30 21:32:12 +0000583 DeadStackObjects.insert(AI);
Owen Anderson32c4a052007-07-12 21:41:30 +0000584
585 // Scan the basic block backwards
586 for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){
587 --BBI;
588
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000589 // If we find a store, check to see if it points into a dead stack value.
590 if (hasMemoryWrite(BBI) && isRemovable(BBI)) {
591 // See through pointer-to-pointer bitcasts
Chris Lattner67122512010-11-30 21:58:14 +0000592 Value *Pointer = getStoredPointerOperand(BBI)->getUnderlyingObject();
Duncan Sandsd65a4da2008-10-01 15:25:41 +0000593
Chris Lattner67122512010-11-30 21:58:14 +0000594 // Stores to stack values are valid candidates for removal.
Chris Lattner7fe08b62010-11-30 21:32:12 +0000595 if (DeadStackObjects.count(Pointer)) {
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000596 // DCE instructions only used to calculate that store.
597 Instruction *Dead = BBI++;
Chris Lattner67122512010-11-30 21:58:14 +0000598 DeleteDeadInstruction(Dead, *MD, &DeadStackObjects);
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000599 ++NumFastStores;
600 MadeChange = true;
Owen Anderson48d37802008-01-29 06:18:36 +0000601 continue;
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000602 }
Owen Anderson52aaabf2007-08-08 17:50:09 +0000603 }
604
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000605 // Remove any dead non-memory-mutating instructions.
606 if (isInstructionTriviallyDead(BBI)) {
607 Instruction *Inst = BBI++;
Chris Lattner67122512010-11-30 21:58:14 +0000608 DeleteDeadInstruction(Inst, *MD, &DeadStackObjects);
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000609 ++NumFastOther;
610 MadeChange = true;
611 continue;
612 }
613
614 if (AllocaInst *A = dyn_cast<AllocaInst>(BBI)) {
Chris Lattner7fe08b62010-11-30 21:32:12 +0000615 DeadStackObjects.erase(A);
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000616 continue;
617 }
618
Chris Lattner127818d2010-11-30 21:18:46 +0000619 if (CallSite CS = cast<Value>(BBI)) {
620 // If this call does not access memory, it can't be loading any of our
621 // pointers.
622 if (AA->doesNotAccessMemory(CS))
623 continue;
624
625 unsigned NumModRef = 0, NumOther = 0;
626
627 // If the call might load from any of our allocas, then any store above
628 // the call is live.
629 SmallVector<Value*, 8> LiveAllocas;
Chris Lattner7fe08b62010-11-30 21:32:12 +0000630 for (SmallPtrSet<Value*, 16>::iterator I = DeadStackObjects.begin(),
631 E = DeadStackObjects.end(); I != E; ++I) {
Chris Lattner127818d2010-11-30 21:18:46 +0000632 // If we detect that our AA is imprecise, it's not worth it to scan the
633 // rest of the DeadPointers set. Just assume that the AA will return
634 // ModRef for everything, and go ahead and bail out.
635 if (NumModRef >= 16 && NumOther == 0)
636 return MadeChange;
637
638 // See if the call site touches it.
639 AliasAnalysis::ModRefResult A =
640 AA->getModRefInfo(CS, *I, getPointerSize(*I, *AA));
641
642 if (A == AliasAnalysis::ModRef)
643 ++NumModRef;
644 else
645 ++NumOther;
646
647 if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref)
648 LiveAllocas.push_back(*I);
649 }
650
651 for (SmallVector<Value*, 8>::iterator I = LiveAllocas.begin(),
652 E = LiveAllocas.end(); I != E; ++I)
Chris Lattner7fe08b62010-11-30 21:32:12 +0000653 DeadStackObjects.erase(*I);
Chris Lattner127818d2010-11-30 21:18:46 +0000654
655 // If all of the allocas were clobbered by the call then we're not going
656 // to find anything else to process.
Chris Lattner7fe08b62010-11-30 21:32:12 +0000657 if (DeadStackObjects.empty())
Chris Lattner127818d2010-11-30 21:18:46 +0000658 return MadeChange;
659
660 continue;
661 }
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000662
Chris Lattner51d67ce2010-11-30 21:47:58 +0000663 AliasAnalysis::Location LoadedLoc;
Owen Anderson32c4a052007-07-12 21:41:30 +0000664
665 // If we encounter a use of the pointer, it is no longer considered dead
Chris Lattner1adb6752008-11-28 00:27:14 +0000666 if (LoadInst *L = dyn_cast<LoadInst>(BBI)) {
Chris Lattner51d67ce2010-11-30 21:47:58 +0000667 LoadedLoc = AA->getLocation(L);
Nick Lewycky475d3d12010-01-03 04:39:07 +0000668 } else if (VAArgInst *V = dyn_cast<VAArgInst>(BBI)) {
Chris Lattner51d67ce2010-11-30 21:47:58 +0000669 LoadedLoc = AA->getLocation(V);
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000670 } else if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(BBI)) {
Chris Lattner51d67ce2010-11-30 21:47:58 +0000671 LoadedLoc = AA->getLocationForSource(MTI);
Chris Lattner60a8b3d2010-11-30 19:48:15 +0000672 } else {
673 // Not a loading instruction.
Chris Lattner1adb6752008-11-28 00:27:14 +0000674 continue;
Owen Anderson32c4a052007-07-12 21:41:30 +0000675 }
Duncan Sandsd65a4da2008-10-01 15:25:41 +0000676
Chris Lattner7fe08b62010-11-30 21:32:12 +0000677 // Remove any allocas from the DeadPointer set that are loaded, as this
678 // makes any stores above the access live.
Chris Lattner51d67ce2010-11-30 21:47:58 +0000679 RemoveAccessedObjects(LoadedLoc, DeadStackObjects);
Duncan Sandsd65a4da2008-10-01 15:25:41 +0000680
Chris Lattner7fe08b62010-11-30 21:32:12 +0000681 // If all of the allocas were clobbered by the access then we're not going
682 // to find anything else to process.
683 if (DeadStackObjects.empty())
684 break;
Owen Anderson32c4a052007-07-12 21:41:30 +0000685 }
686
687 return MadeChange;
688}
689
Chris Lattner7fe08b62010-11-30 21:32:12 +0000690/// RemoveAccessedObjects - Check to see if the specified location may alias any
691/// of the stack objects in the DeadStackObjects set. If so, they become live
692/// because the location is being loaded.
Chris Lattner51d67ce2010-11-30 21:47:58 +0000693void DSE::RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc,
Chris Lattner7fe08b62010-11-30 21:32:12 +0000694 SmallPtrSet<Value*, 16> &DeadStackObjects) {
Chris Lattner51d67ce2010-11-30 21:47:58 +0000695 const Value *UnderlyingPointer = LoadedLoc.Ptr->getUnderlyingObject();
Chris Lattner7fe08b62010-11-30 21:32:12 +0000696
697 // A constant can't be in the dead pointer set.
698 if (isa<Constant>(UnderlyingPointer))
Chris Lattnerf80b3992010-11-30 21:38:30 +0000699 return;
Chris Lattner7fe08b62010-11-30 21:32:12 +0000700
701 // If the kill pointer can be easily reduced to an alloca, don't bother doing
702 // extraneous AA queries.
Chris Lattnerf80b3992010-11-30 21:38:30 +0000703 if (isa<AllocaInst>(UnderlyingPointer) || isa<Argument>(UnderlyingPointer)) {
Chris Lattner51d67ce2010-11-30 21:47:58 +0000704 DeadStackObjects.erase(const_cast<Value*>(UnderlyingPointer));
Chris Lattnerf80b3992010-11-30 21:38:30 +0000705 return;
Owen Andersonddf4aee2007-08-08 18:38:28 +0000706 }
707
Chris Lattner7fe08b62010-11-30 21:32:12 +0000708 SmallVector<Value*, 16> NowLive;
Chris Lattner7fe08b62010-11-30 21:32:12 +0000709 for (SmallPtrSet<Value*, 16>::iterator I = DeadStackObjects.begin(),
710 E = DeadStackObjects.end(); I != E; ++I) {
Chris Lattner51d67ce2010-11-30 21:47:58 +0000711 // See if the loaded location could alias the stack location.
712 AliasAnalysis::Location StackLoc(*I, getPointerSize(*I, *AA));
713 if (!AA->isNoAlias(StackLoc, LoadedLoc))
Chris Lattner7fe08b62010-11-30 21:32:12 +0000714 NowLive.push_back(*I);
Owen Anderson32c4a052007-07-12 21:41:30 +0000715 }
716
Chris Lattner7fe08b62010-11-30 21:32:12 +0000717 for (SmallVector<Value*, 16>::iterator I = NowLive.begin(), E = NowLive.end();
Owen Anderson32c4a052007-07-12 21:41:30 +0000718 I != E; ++I)
Chris Lattner7fe08b62010-11-30 21:32:12 +0000719 DeadStackObjects.erase(*I);
Owen Anderson32c4a052007-07-12 21:41:30 +0000720}
721