DeadStoreElimination.cpp revision 1582e7f1e255c19595f82cb447e52869196dec58
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/GlobalVariable.h" 23#include "llvm/Instructions.h" 24#include "llvm/IntrinsicInst.h" 25#include "llvm/Pass.h" 26#include "llvm/Analysis/AliasAnalysis.h" 27#include "llvm/Analysis/Dominators.h" 28#include "llvm/Analysis/MemoryBuiltins.h" 29#include "llvm/Analysis/MemoryDependenceAnalysis.h" 30#include "llvm/Analysis/ValueTracking.h" 31#include "llvm/Target/TargetData.h" 32#include "llvm/Transforms/Utils/Local.h" 33#include "llvm/Support/Debug.h" 34#include "llvm/ADT/SmallPtrSet.h" 35#include "llvm/ADT/Statistic.h" 36using namespace llvm; 37 38STATISTIC(NumFastStores, "Number of stores deleted"); 39STATISTIC(NumFastOther , "Number of other instrs removed"); 40 41namespace { 42 struct DSE : public FunctionPass { 43 AliasAnalysis *AA; 44 MemoryDependenceAnalysis *MD; 45 46 static char ID; // Pass identification, replacement for typeid 47 DSE() : FunctionPass(ID), AA(0), MD(0) { 48 initializeDSEPass(*PassRegistry::getPassRegistry()); 49 } 50 51 virtual bool runOnFunction(Function &F) { 52 AA = &getAnalysis<AliasAnalysis>(); 53 MD = &getAnalysis<MemoryDependenceAnalysis>(); 54 DominatorTree &DT = getAnalysis<DominatorTree>(); 55 56 bool Changed = false; 57 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 58 // Only check non-dead blocks. Dead blocks may have strange pointer 59 // cycles that will confuse alias analysis. 60 if (DT.isReachableFromEntry(I)) 61 Changed |= runOnBasicBlock(*I); 62 63 AA = 0; MD = 0; 64 return Changed; 65 } 66 67 bool runOnBasicBlock(BasicBlock &BB); 68 bool HandleFree(CallInst *F); 69 bool handleEndBlock(BasicBlock &BB); 70 void RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc, 71 SmallPtrSet<Value*, 16> &DeadStackObjects); 72 73 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 74 AU.setPreservesCFG(); 75 AU.addRequired<DominatorTree>(); 76 AU.addRequired<AliasAnalysis>(); 77 AU.addRequired<MemoryDependenceAnalysis>(); 78 AU.addPreserved<AliasAnalysis>(); 79 AU.addPreserved<DominatorTree>(); 80 AU.addPreserved<MemoryDependenceAnalysis>(); 81 } 82 }; 83} 84 85char DSE::ID = 0; 86INITIALIZE_PASS_BEGIN(DSE, "dse", "Dead Store Elimination", false, false) 87INITIALIZE_PASS_DEPENDENCY(DominatorTree) 88INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis) 89INITIALIZE_AG_DEPENDENCY(AliasAnalysis) 90INITIALIZE_PASS_END(DSE, "dse", "Dead Store Elimination", false, false) 91 92FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); } 93 94//===----------------------------------------------------------------------===// 95// Helper functions 96//===----------------------------------------------------------------------===// 97 98/// DeleteDeadInstruction - Delete this instruction. Before we do, go through 99/// and zero out all the operands of this instruction. If any of them become 100/// dead, delete them and the computation tree that feeds them. 101/// 102/// If ValueSet is non-null, remove any deleted instructions from it as well. 103/// 104static void DeleteDeadInstruction(Instruction *I, 105 MemoryDependenceAnalysis &MD, 106 SmallPtrSet<Value*, 16> *ValueSet = 0) { 107 SmallVector<Instruction*, 32> NowDeadInsts; 108 109 NowDeadInsts.push_back(I); 110 --NumFastOther; 111 112 // Before we touch this instruction, remove it from memdep! 113 do { 114 Instruction *DeadInst = NowDeadInsts.pop_back_val(); 115 ++NumFastOther; 116 117 // This instruction is dead, zap it, in stages. Start by removing it from 118 // MemDep, which needs to know the operands and needs it to be in the 119 // function. 120 MD.removeInstruction(DeadInst); 121 122 for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) { 123 Value *Op = DeadInst->getOperand(op); 124 DeadInst->setOperand(op, 0); 125 126 // If this operand just became dead, add it to the NowDeadInsts list. 127 if (!Op->use_empty()) continue; 128 129 if (Instruction *OpI = dyn_cast<Instruction>(Op)) 130 if (isInstructionTriviallyDead(OpI)) 131 NowDeadInsts.push_back(OpI); 132 } 133 134 DeadInst->eraseFromParent(); 135 136 if (ValueSet) ValueSet->erase(DeadInst); 137 } while (!NowDeadInsts.empty()); 138} 139 140 141/// hasMemoryWrite - Does this instruction write some memory? This only returns 142/// true for things that we can analyze with other helpers below. 143static bool hasMemoryWrite(Instruction *I) { 144 if (isa<StoreInst>(I)) 145 return true; 146 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) { 147 switch (II->getIntrinsicID()) { 148 default: 149 return false; 150 case Intrinsic::memset: 151 case Intrinsic::memmove: 152 case Intrinsic::memcpy: 153 case Intrinsic::init_trampoline: 154 case Intrinsic::lifetime_end: 155 return true; 156 } 157 } 158 return false; 159} 160 161/// getLocForWrite - Return a Location stored to by the specified instruction. 162/// If isRemovable returns true, this function and getLocForRead completely 163/// describe the memory operations for this 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 201/// 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 215/// 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) { 218 // Don't remove volatile/atomic stores. 219 if (StoreInst *SI = dyn_cast<StoreInst>(I)) 220 return SI->isUnordered(); 221 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 } 239} 240 241/// getStoredPointerOperand - Return the pointer that is being written to. 242static Value *getStoredPointerOperand(Instruction *I) { 243 if (StoreInst *SI = dyn_cast<StoreInst>(I)) 244 return SI->getPointerOperand(); 245 if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I)) 246 return MI->getDest(); 247 248 IntrinsicInst *II = cast<IntrinsicInst>(I); 249 switch (II->getIntrinsicID()) { 250 default: assert(false && "Unexpected intrinsic!"); 251 case Intrinsic::init_trampoline: 252 return II->getArgOperand(0); 253 } 254} 255 256static 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 PointerType *PT = cast<PointerType>(V->getType()); 270 return TD->getTypeAllocSize(PT->getElementType()); 271} 272 273/// 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->mayBeOverridden(); 280 if (const Argument *A = dyn_cast<Argument>(V)) 281 return A->hasByValAttr(); 282 return false; 283} 284 285/// 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, 289 AliasAnalysis &AA) { 290 const Value *P1 = Earlier.Ptr->stripPointerCasts(); 291 const Value *P2 = Later.Ptr->stripPointerCasts(); 292 293 // 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; 312 } 313 314 // 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 || 318 Later.Size <= Earlier.Size || AA.getTargetData() == 0) 319 return false; 320 321 // 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. 324 const TargetData &TD = *AA.getTargetData(); 325 326 const Value *UO1 = GetUnderlyingObject(P1, &TD), 327 *UO2 = GetUnderlyingObject(P2, &TD); 328 329 // If we can't resolve the same pointers to the same object, then we can't 330 // analyze them at all. 331 if (UO1 != UO2) 332 return false; 333 334 // If the "Later" store is to a recognizable object, get its size. 335 if (isObjectPointerWithTrustworthySize(UO2)) { 336 uint64_t ObjectSize = 337 TD.getTypeAllocSize(cast<PointerType>(UO2->getType())->getElementType()); 338 if (ObjectSize == Later.Size) 339 return true; 340 } 341 342 // Okay, we have stores to two completely different pointers. Try to 343 // decompose the pointer into a "base + constant_offset" form. If the base 344 // pointers are equal, then we can reason about the two stores. 345 int64_t EarlierOff = 0, LaterOff = 0; 346 const Value *BP1 = GetPointerBaseWithConstantOffset(P1, EarlierOff, TD); 347 const Value *BP2 = GetPointerBaseWithConstantOffset(P2, LaterOff, TD); 348 349 // If the base pointers still differ, we have two completely different stores. 350 if (BP1 != BP2) 351 return false; 352 353 // The later store completely overlaps the earlier store if: 354 // 355 // 1. Both start at the same offset and the later one's size is greater than 356 // or equal to the earlier one's, or 357 // 358 // |--earlier--| 359 // |-- later --| 360 // 361 // 2. The earlier store has an offset greater than the later offset, but which 362 // still lies completely within the later store. 363 // 364 // |--earlier--| 365 // |----- later ------| 366 // 367 // We have to be careful here as *Off is signed while *.Size is unsigned. 368 if (EarlierOff >= LaterOff && 369 uint64_t(EarlierOff - LaterOff) + Earlier.Size <= Later.Size) 370 return true; 371 372 // Otherwise, they don't completely overlap. 373 return false; 374} 375 376/// isPossibleSelfRead - If 'Inst' might be a self read (i.e. a noop copy of a 377/// memory region into an identical pointer) then it doesn't actually make its 378/// input dead in the traditional sense. Consider this case: 379/// 380/// memcpy(A <- B) 381/// memcpy(A <- A) 382/// 383/// In this case, the second store to A does not make the first store to A dead. 384/// The usual situation isn't an explicit A<-A store like this (which can be 385/// trivially removed) but a case where two pointers may alias. 386/// 387/// This function detects when it is unsafe to remove a dependent instruction 388/// because the DSE inducing instruction may be a self-read. 389static bool isPossibleSelfRead(Instruction *Inst, 390 const AliasAnalysis::Location &InstStoreLoc, 391 Instruction *DepWrite, AliasAnalysis &AA) { 392 // Self reads can only happen for instructions that read memory. Get the 393 // location read. 394 AliasAnalysis::Location InstReadLoc = getLocForRead(Inst, AA); 395 if (InstReadLoc.Ptr == 0) return false; // Not a reading instruction. 396 397 // If the read and written loc obviously don't alias, it isn't a read. 398 if (AA.isNoAlias(InstReadLoc, InstStoreLoc)) return false; 399 400 // Okay, 'Inst' may copy over itself. However, we can still remove a the 401 // DepWrite instruction if we can prove that it reads from the same location 402 // as Inst. This handles useful cases like: 403 // memcpy(A <- B) 404 // memcpy(A <- B) 405 // Here we don't know if A/B may alias, but we do know that B/B are must 406 // aliases, so removing the first memcpy is safe (assuming it writes <= # 407 // bytes as the second one. 408 AliasAnalysis::Location DepReadLoc = getLocForRead(DepWrite, AA); 409 410 if (DepReadLoc.Ptr && AA.isMustAlias(InstReadLoc.Ptr, DepReadLoc.Ptr)) 411 return false; 412 413 // If DepWrite doesn't read memory or if we can't prove it is a must alias, 414 // then it can't be considered dead. 415 return true; 416} 417 418 419//===----------------------------------------------------------------------===// 420// DSE Pass 421//===----------------------------------------------------------------------===// 422 423bool DSE::runOnBasicBlock(BasicBlock &BB) { 424 bool MadeChange = false; 425 426 // Do a top-down walk on the BB. 427 for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ) { 428 Instruction *Inst = BBI++; 429 430 // Handle 'free' calls specially. 431 if (CallInst *F = isFreeCall(Inst)) { 432 MadeChange |= HandleFree(F); 433 continue; 434 } 435 436 // If we find something that writes memory, get its memory dependence. 437 if (!hasMemoryWrite(Inst)) 438 continue; 439 440 MemDepResult InstDep = MD->getDependency(Inst); 441 442 // Ignore any store where we can't find a local dependence. 443 // FIXME: cross-block DSE would be fun. :) 444 if (InstDep.isNonLocal() || InstDep.isUnknown()) 445 continue; 446 447 // If we're storing the same value back to a pointer that we just 448 // loaded from, then the store can be removed. 449 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) { 450 if (LoadInst *DepLoad = dyn_cast<LoadInst>(InstDep.getInst())) { 451 if (SI->getPointerOperand() == DepLoad->getPointerOperand() && 452 SI->getOperand(0) == DepLoad && isRemovable(SI)) { 453 DEBUG(dbgs() << "DSE: Remove Store Of Load from same pointer:\n " 454 << "LOAD: " << *DepLoad << "\n STORE: " << *SI << '\n'); 455 456 // DeleteDeadInstruction can delete the current instruction. Save BBI 457 // in case we need it. 458 WeakVH NextInst(BBI); 459 460 DeleteDeadInstruction(SI, *MD); 461 462 if (NextInst == 0) // Next instruction deleted. 463 BBI = BB.begin(); 464 else if (BBI != BB.begin()) // Revisit this instruction if possible. 465 --BBI; 466 ++NumFastStores; 467 MadeChange = true; 468 continue; 469 } 470 } 471 } 472 473 // Figure out what location is being stored to. 474 AliasAnalysis::Location Loc = getLocForWrite(Inst, *AA); 475 476 // If we didn't get a useful location, fail. 477 if (Loc.Ptr == 0) 478 continue; 479 480 while (!InstDep.isNonLocal() && !InstDep.isUnknown()) { 481 // Get the memory clobbered by the instruction we depend on. MemDep will 482 // skip any instructions that 'Loc' clearly doesn't interact with. If we 483 // end up depending on a may- or must-aliased load, then we can't optimize 484 // away the store and we bail out. However, if we depend on on something 485 // that overwrites the memory location we *can* potentially optimize it. 486 // 487 // Find out what memory location the dependent instruction stores. 488 Instruction *DepWrite = InstDep.getInst(); 489 AliasAnalysis::Location DepLoc = getLocForWrite(DepWrite, *AA); 490 // If we didn't get a useful location, or if it isn't a size, bail out. 491 if (DepLoc.Ptr == 0) 492 break; 493 494 // If we find a write that is a) removable (i.e., non-volatile), b) is 495 // completely obliterated by the store to 'Loc', and c) which we know that 496 // 'Inst' doesn't load from, then we can remove it. 497 if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, *AA) && 498 !isPossibleSelfRead(Inst, Loc, DepWrite, *AA)) { 499 DEBUG(dbgs() << "DSE: Remove Dead Store:\n DEAD: " 500 << *DepWrite << "\n KILLER: " << *Inst << '\n'); 501 502 // Delete the store and now-dead instructions that feed it. 503 DeleteDeadInstruction(DepWrite, *MD); 504 ++NumFastStores; 505 MadeChange = true; 506 507 // DeleteDeadInstruction can delete the current instruction in loop 508 // cases, reset BBI. 509 BBI = Inst; 510 if (BBI != BB.begin()) 511 --BBI; 512 break; 513 } 514 515 // If this is a may-aliased store that is clobbering the store value, we 516 // can keep searching past it for another must-aliased pointer that stores 517 // to the same location. For example, in: 518 // store -> P 519 // store -> Q 520 // store -> P 521 // we can remove the first store to P even though we don't know if P and Q 522 // alias. 523 if (DepWrite == &BB.front()) break; 524 525 // Can't look past this instruction if it might read 'Loc'. 526 if (AA->getModRefInfo(DepWrite, Loc) & AliasAnalysis::Ref) 527 break; 528 529 InstDep = MD->getPointerDependencyFrom(Loc, false, DepWrite, &BB); 530 } 531 } 532 533 // If this block ends in a return, unwind, or unreachable, all allocas are 534 // dead at its end, which means stores to them are also dead. 535 if (BB.getTerminator()->getNumSuccessors() == 0) 536 MadeChange |= handleEndBlock(BB); 537 538 return MadeChange; 539} 540 541/// HandleFree - Handle frees of entire structures whose dependency is a store 542/// to a field of that structure. 543bool DSE::HandleFree(CallInst *F) { 544 bool MadeChange = false; 545 546 MemDepResult Dep = MD->getDependency(F); 547 548 while (!Dep.isNonLocal() && !Dep.isUnknown()) { 549 Instruction *Dependency = Dep.getInst(); 550 if (!hasMemoryWrite(Dependency) || !isRemovable(Dependency)) 551 return MadeChange; 552 553 Value *DepPointer = 554 GetUnderlyingObject(getStoredPointerOperand(Dependency)); 555 556 // Check for aliasing. 557 if (!AA->isMustAlias(F->getArgOperand(0), DepPointer)) 558 return MadeChange; 559 560 // DCE instructions only used to calculate that store 561 DeleteDeadInstruction(Dependency, *MD); 562 ++NumFastStores; 563 MadeChange = true; 564 565 // Inst's old Dependency is now deleted. Compute the next dependency, 566 // which may also be dead, as in 567 // s[0] = 0; 568 // s[1] = 0; // This has just been deleted. 569 // free(s); 570 Dep = MD->getDependency(F); 571 }; 572 573 return MadeChange; 574} 575 576/// handleEndBlock - Remove dead stores to stack-allocated locations in the 577/// function end block. Ex: 578/// %A = alloca i32 579/// ... 580/// store i32 1, i32* %A 581/// ret void 582bool DSE::handleEndBlock(BasicBlock &BB) { 583 bool MadeChange = false; 584 585 // Keep track of all of the stack objects that are dead at the end of the 586 // function. 587 SmallPtrSet<Value*, 16> DeadStackObjects; 588 589 // Find all of the alloca'd pointers in the entry block. 590 BasicBlock *Entry = BB.getParent()->begin(); 591 for (BasicBlock::iterator I = Entry->begin(), E = Entry->end(); I != E; ++I) 592 if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) 593 DeadStackObjects.insert(AI); 594 595 // Treat byval arguments the same, stores to them are dead at the end of the 596 // function. 597 for (Function::arg_iterator AI = BB.getParent()->arg_begin(), 598 AE = BB.getParent()->arg_end(); AI != AE; ++AI) 599 if (AI->hasByValAttr()) 600 DeadStackObjects.insert(AI); 601 602 // Scan the basic block backwards 603 for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){ 604 --BBI; 605 606 // If we find a store, check to see if it points into a dead stack value. 607 if (hasMemoryWrite(BBI) && isRemovable(BBI)) { 608 // See through pointer-to-pointer bitcasts 609 Value *Pointer = GetUnderlyingObject(getStoredPointerOperand(BBI)); 610 611 // Stores to stack values are valid candidates for removal. 612 if (DeadStackObjects.count(Pointer)) { 613 Instruction *Dead = BBI++; 614 615 DEBUG(dbgs() << "DSE: Dead Store at End of Block:\n DEAD: " 616 << *Dead << "\n Object: " << *Pointer << '\n'); 617 618 // DCE instructions only used to calculate that store. 619 DeleteDeadInstruction(Dead, *MD, &DeadStackObjects); 620 ++NumFastStores; 621 MadeChange = true; 622 continue; 623 } 624 } 625 626 // Remove any dead non-memory-mutating instructions. 627 if (isInstructionTriviallyDead(BBI)) { 628 Instruction *Inst = BBI++; 629 DeleteDeadInstruction(Inst, *MD, &DeadStackObjects); 630 ++NumFastOther; 631 MadeChange = true; 632 continue; 633 } 634 635 if (AllocaInst *A = dyn_cast<AllocaInst>(BBI)) { 636 DeadStackObjects.erase(A); 637 continue; 638 } 639 640 if (CallSite CS = cast<Value>(BBI)) { 641 // If this call does not access memory, it can't be loading any of our 642 // pointers. 643 if (AA->doesNotAccessMemory(CS)) 644 continue; 645 646 // If the call might load from any of our allocas, then any store above 647 // the call is live. 648 SmallVector<Value*, 8> LiveAllocas; 649 for (SmallPtrSet<Value*, 16>::iterator I = DeadStackObjects.begin(), 650 E = DeadStackObjects.end(); I != E; ++I) { 651 // See if the call site touches it. 652 AliasAnalysis::ModRefResult A = 653 AA->getModRefInfo(CS, *I, getPointerSize(*I, *AA)); 654 655 if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref) 656 LiveAllocas.push_back(*I); 657 } 658 659 for (SmallVector<Value*, 8>::iterator I = LiveAllocas.begin(), 660 E = LiveAllocas.end(); I != E; ++I) 661 DeadStackObjects.erase(*I); 662 663 // If all of the allocas were clobbered by the call then we're not going 664 // to find anything else to process. 665 if (DeadStackObjects.empty()) 666 return MadeChange; 667 668 continue; 669 } 670 671 AliasAnalysis::Location LoadedLoc; 672 673 // If we encounter a use of the pointer, it is no longer considered dead 674 if (LoadInst *L = dyn_cast<LoadInst>(BBI)) { 675 if (!L->isUnordered()) // Be conservative with atomic/volatile load 676 break; 677 LoadedLoc = AA->getLocation(L); 678 } else if (VAArgInst *V = dyn_cast<VAArgInst>(BBI)) { 679 LoadedLoc = AA->getLocation(V); 680 } else if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(BBI)) { 681 LoadedLoc = AA->getLocationForSource(MTI); 682 } else if (!BBI->mayReadFromMemory()) { 683 // Instruction doesn't read memory. Note that stores that weren't removed 684 // above will hit this case. 685 continue; 686 } else { 687 // Unknown inst; assume it clobbers everything. 688 break; 689 } 690 691 // Remove any allocas from the DeadPointer set that are loaded, as this 692 // makes any stores above the access live. 693 RemoveAccessedObjects(LoadedLoc, DeadStackObjects); 694 695 // If all of the allocas were clobbered by the access then we're not going 696 // to find anything else to process. 697 if (DeadStackObjects.empty()) 698 break; 699 } 700 701 return MadeChange; 702} 703 704/// RemoveAccessedObjects - Check to see if the specified location may alias any 705/// of the stack objects in the DeadStackObjects set. If so, they become live 706/// because the location is being loaded. 707void DSE::RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc, 708 SmallPtrSet<Value*, 16> &DeadStackObjects) { 709 const Value *UnderlyingPointer = GetUnderlyingObject(LoadedLoc.Ptr); 710 711 // A constant can't be in the dead pointer set. 712 if (isa<Constant>(UnderlyingPointer)) 713 return; 714 715 // If the kill pointer can be easily reduced to an alloca, don't bother doing 716 // extraneous AA queries. 717 if (isa<AllocaInst>(UnderlyingPointer) || isa<Argument>(UnderlyingPointer)) { 718 DeadStackObjects.erase(const_cast<Value*>(UnderlyingPointer)); 719 return; 720 } 721 722 SmallVector<Value*, 16> NowLive; 723 for (SmallPtrSet<Value*, 16>::iterator I = DeadStackObjects.begin(), 724 E = DeadStackObjects.end(); I != E; ++I) { 725 // See if the loaded location could alias the stack location. 726 AliasAnalysis::Location StackLoc(*I, getPointerSize(*I, *AA)); 727 if (!AA->isNoAlias(StackLoc, LoadedLoc)) 728 NowLive.push_back(*I); 729 } 730 731 for (SmallVector<Value*, 16>::iterator I = NowLive.begin(), E = NowLive.end(); 732 I != E; ++I) 733 DeadStackObjects.erase(*I); 734} 735 736