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