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 #include "llvm/Transforms/Scalar/DeadStoreElimination.h" 19 #include "llvm/ADT/DenseMap.h" 20 #include "llvm/ADT/STLExtras.h" 21 #include "llvm/ADT/SetVector.h" 22 #include "llvm/ADT/Statistic.h" 23 #include "llvm/Analysis/AliasAnalysis.h" 24 #include "llvm/Analysis/CaptureTracking.h" 25 #include "llvm/Analysis/GlobalsModRef.h" 26 #include "llvm/Analysis/MemoryBuiltins.h" 27 #include "llvm/Analysis/MemoryDependenceAnalysis.h" 28 #include "llvm/Analysis/TargetLibraryInfo.h" 29 #include "llvm/Analysis/ValueTracking.h" 30 #include "llvm/IR/Constants.h" 31 #include "llvm/IR/DataLayout.h" 32 #include "llvm/IR/Dominators.h" 33 #include "llvm/IR/Function.h" 34 #include "llvm/IR/GlobalVariable.h" 35 #include "llvm/IR/Instructions.h" 36 #include "llvm/IR/IntrinsicInst.h" 37 #include "llvm/Pass.h" 38 #include "llvm/Support/CommandLine.h" 39 #include "llvm/Support/Debug.h" 40 #include "llvm/Support/raw_ostream.h" 41 #include "llvm/Transforms/Scalar.h" 42 #include "llvm/Transforms/Utils/Local.h" 43 #include <map> 44 using namespace llvm; 45 46 #define DEBUG_TYPE "dse" 47 48 STATISTIC(NumRedundantStores, "Number of redundant stores deleted"); 49 STATISTIC(NumFastStores, "Number of stores deleted"); 50 STATISTIC(NumFastOther , "Number of other instrs removed"); 51 STATISTIC(NumCompletePartials, "Number of stores dead by later partials"); 52 53 static cl::opt<bool> 54 EnablePartialOverwriteTracking("enable-dse-partial-overwrite-tracking", 55 cl::init(true), cl::Hidden, 56 cl::desc("Enable partial-overwrite tracking in DSE")); 57 58 59 //===----------------------------------------------------------------------===// 60 // Helper functions 61 //===----------------------------------------------------------------------===// 62 63 /// Delete this instruction. Before we do, go through and zero out all the 64 /// operands of this instruction. If any of them become dead, delete them and 65 /// the computation tree that feeds them. 66 /// If ValueSet is non-null, remove any deleted instructions from it as well. 67 static void 68 deleteDeadInstruction(Instruction *I, MemoryDependenceResults &MD, 69 const TargetLibraryInfo &TLI, 70 SmallSetVector<Value *, 16> *ValueSet = nullptr) { 71 SmallVector<Instruction*, 32> NowDeadInsts; 72 73 NowDeadInsts.push_back(I); 74 --NumFastOther; 75 76 // Before we touch this instruction, remove it from memdep! 77 do { 78 Instruction *DeadInst = NowDeadInsts.pop_back_val(); 79 ++NumFastOther; 80 81 // This instruction is dead, zap it, in stages. Start by removing it from 82 // MemDep, which needs to know the operands and needs it to be in the 83 // function. 84 MD.removeInstruction(DeadInst); 85 86 for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) { 87 Value *Op = DeadInst->getOperand(op); 88 DeadInst->setOperand(op, nullptr); 89 90 // If this operand just became dead, add it to the NowDeadInsts list. 91 if (!Op->use_empty()) continue; 92 93 if (Instruction *OpI = dyn_cast<Instruction>(Op)) 94 if (isInstructionTriviallyDead(OpI, &TLI)) 95 NowDeadInsts.push_back(OpI); 96 } 97 98 DeadInst->eraseFromParent(); 99 100 if (ValueSet) ValueSet->remove(DeadInst); 101 } while (!NowDeadInsts.empty()); 102 } 103 104 /// Does this instruction write some memory? This only returns true for things 105 /// that we can analyze with other helpers below. 106 static bool hasMemoryWrite(Instruction *I, const TargetLibraryInfo &TLI) { 107 if (isa<StoreInst>(I)) 108 return true; 109 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) { 110 switch (II->getIntrinsicID()) { 111 default: 112 return false; 113 case Intrinsic::memset: 114 case Intrinsic::memmove: 115 case Intrinsic::memcpy: 116 case Intrinsic::init_trampoline: 117 case Intrinsic::lifetime_end: 118 return true; 119 } 120 } 121 if (auto CS = CallSite(I)) { 122 if (Function *F = CS.getCalledFunction()) { 123 StringRef FnName = F->getName(); 124 if (TLI.has(LibFunc::strcpy) && FnName == TLI.getName(LibFunc::strcpy)) 125 return true; 126 if (TLI.has(LibFunc::strncpy) && FnName == TLI.getName(LibFunc::strncpy)) 127 return true; 128 if (TLI.has(LibFunc::strcat) && FnName == TLI.getName(LibFunc::strcat)) 129 return true; 130 if (TLI.has(LibFunc::strncat) && FnName == TLI.getName(LibFunc::strncat)) 131 return true; 132 } 133 } 134 return false; 135 } 136 137 /// Return a Location stored to by the specified instruction. If isRemovable 138 /// returns true, this function and getLocForRead completely describe the memory 139 /// operations for this instruction. 140 static MemoryLocation getLocForWrite(Instruction *Inst, AliasAnalysis &AA) { 141 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) 142 return MemoryLocation::get(SI); 143 144 if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(Inst)) { 145 // memcpy/memmove/memset. 146 MemoryLocation Loc = MemoryLocation::getForDest(MI); 147 return Loc; 148 } 149 150 IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst); 151 if (!II) 152 return MemoryLocation(); 153 154 switch (II->getIntrinsicID()) { 155 default: 156 return MemoryLocation(); // Unhandled intrinsic. 157 case Intrinsic::init_trampoline: 158 // FIXME: We don't know the size of the trampoline, so we can't really 159 // handle it here. 160 return MemoryLocation(II->getArgOperand(0)); 161 case Intrinsic::lifetime_end: { 162 uint64_t Len = cast<ConstantInt>(II->getArgOperand(0))->getZExtValue(); 163 return MemoryLocation(II->getArgOperand(1), Len); 164 } 165 } 166 } 167 168 /// Return the location read by the specified "hasMemoryWrite" instruction if 169 /// any. 170 static MemoryLocation getLocForRead(Instruction *Inst, 171 const TargetLibraryInfo &TLI) { 172 assert(hasMemoryWrite(Inst, TLI) && "Unknown instruction case"); 173 174 // The only instructions that both read and write are the mem transfer 175 // instructions (memcpy/memmove). 176 if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(Inst)) 177 return MemoryLocation::getForSource(MTI); 178 return MemoryLocation(); 179 } 180 181 /// If the value of this instruction and the memory it writes to is unused, may 182 /// we delete this instruction? 183 static bool isRemovable(Instruction *I) { 184 // Don't remove volatile/atomic stores. 185 if (StoreInst *SI = dyn_cast<StoreInst>(I)) 186 return SI->isUnordered(); 187 188 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) { 189 switch (II->getIntrinsicID()) { 190 default: llvm_unreachable("doesn't pass 'hasMemoryWrite' predicate"); 191 case Intrinsic::lifetime_end: 192 // Never remove dead lifetime_end's, e.g. because it is followed by a 193 // free. 194 return false; 195 case Intrinsic::init_trampoline: 196 // Always safe to remove init_trampoline. 197 return true; 198 199 case Intrinsic::memset: 200 case Intrinsic::memmove: 201 case Intrinsic::memcpy: 202 // Don't remove volatile memory intrinsics. 203 return !cast<MemIntrinsic>(II)->isVolatile(); 204 } 205 } 206 207 if (auto CS = CallSite(I)) 208 return CS.getInstruction()->use_empty(); 209 210 return false; 211 } 212 213 214 /// Returns true if the end of this instruction can be safely shortened in 215 /// length. 216 static bool isShortenableAtTheEnd(Instruction *I) { 217 // Don't shorten stores for now 218 if (isa<StoreInst>(I)) 219 return false; 220 221 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) { 222 switch (II->getIntrinsicID()) { 223 default: return false; 224 case Intrinsic::memset: 225 case Intrinsic::memcpy: 226 // Do shorten memory intrinsics. 227 // FIXME: Add memmove if it's also safe to transform. 228 return true; 229 } 230 } 231 232 // Don't shorten libcalls calls for now. 233 234 return false; 235 } 236 237 /// Returns true if the beginning of this instruction can be safely shortened 238 /// in length. 239 static bool isShortenableAtTheBeginning(Instruction *I) { 240 // FIXME: Handle only memset for now. Supporting memcpy/memmove should be 241 // easily done by offsetting the source address. 242 IntrinsicInst *II = dyn_cast<IntrinsicInst>(I); 243 return II && II->getIntrinsicID() == Intrinsic::memset; 244 } 245 246 /// Return the pointer that is being written to. 247 static Value *getStoredPointerOperand(Instruction *I) { 248 if (StoreInst *SI = dyn_cast<StoreInst>(I)) 249 return SI->getPointerOperand(); 250 if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I)) 251 return MI->getDest(); 252 253 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) { 254 switch (II->getIntrinsicID()) { 255 default: llvm_unreachable("Unexpected intrinsic!"); 256 case Intrinsic::init_trampoline: 257 return II->getArgOperand(0); 258 } 259 } 260 261 CallSite CS(I); 262 // All the supported functions so far happen to have dest as their first 263 // argument. 264 return CS.getArgument(0); 265 } 266 267 static uint64_t getPointerSize(const Value *V, const DataLayout &DL, 268 const TargetLibraryInfo &TLI) { 269 uint64_t Size; 270 if (getObjectSize(V, Size, DL, &TLI)) 271 return Size; 272 return MemoryLocation::UnknownSize; 273 } 274 275 namespace { 276 enum OverwriteResult { 277 OverwriteBegin, 278 OverwriteComplete, 279 OverwriteEnd, 280 OverwriteUnknown 281 }; 282 } 283 284 typedef DenseMap<Instruction *, 285 std::map<int64_t, int64_t>> InstOverlapIntervalsTy; 286 287 /// Return 'OverwriteComplete' if a store to the 'Later' location completely 288 /// overwrites a store to the 'Earlier' location, 'OverwriteEnd' if the end of 289 /// the 'Earlier' location is completely overwritten by 'Later', 290 /// 'OverwriteBegin' if the beginning of the 'Earlier' location is overwritten 291 /// by 'Later', or 'OverwriteUnknown' if nothing can be determined. 292 static OverwriteResult isOverwrite(const MemoryLocation &Later, 293 const MemoryLocation &Earlier, 294 const DataLayout &DL, 295 const TargetLibraryInfo &TLI, 296 int64_t &EarlierOff, int64_t &LaterOff, 297 Instruction *DepWrite, 298 InstOverlapIntervalsTy &IOL) { 299 // If we don't know the sizes of either access, then we can't do a comparison. 300 if (Later.Size == MemoryLocation::UnknownSize || 301 Earlier.Size == MemoryLocation::UnknownSize) 302 return OverwriteUnknown; 303 304 const Value *P1 = Earlier.Ptr->stripPointerCasts(); 305 const Value *P2 = Later.Ptr->stripPointerCasts(); 306 307 // If the start pointers are the same, we just have to compare sizes to see if 308 // the later store was larger than the earlier store. 309 if (P1 == P2) { 310 // Make sure that the Later size is >= the Earlier size. 311 if (Later.Size >= Earlier.Size) 312 return OverwriteComplete; 313 } 314 315 // Check to see if the later store is to the entire object (either a global, 316 // an alloca, or a byval/inalloca argument). If so, then it clearly 317 // overwrites any other store to the same object. 318 const Value *UO1 = GetUnderlyingObject(P1, DL), 319 *UO2 = GetUnderlyingObject(P2, DL); 320 321 // If we can't resolve the same pointers to the same object, then we can't 322 // analyze them at all. 323 if (UO1 != UO2) 324 return OverwriteUnknown; 325 326 // If the "Later" store is to a recognizable object, get its size. 327 uint64_t ObjectSize = getPointerSize(UO2, DL, TLI); 328 if (ObjectSize != MemoryLocation::UnknownSize) 329 if (ObjectSize == Later.Size && ObjectSize >= Earlier.Size) 330 return OverwriteComplete; 331 332 // Okay, we have stores to two completely different pointers. Try to 333 // decompose the pointer into a "base + constant_offset" form. If the base 334 // pointers are equal, then we can reason about the two stores. 335 EarlierOff = 0; 336 LaterOff = 0; 337 const Value *BP1 = GetPointerBaseWithConstantOffset(P1, EarlierOff, DL); 338 const Value *BP2 = GetPointerBaseWithConstantOffset(P2, LaterOff, DL); 339 340 // If the base pointers still differ, we have two completely different stores. 341 if (BP1 != BP2) 342 return OverwriteUnknown; 343 344 // The later store completely overlaps the earlier store if: 345 // 346 // 1. Both start at the same offset and the later one's size is greater than 347 // or equal to the earlier one's, or 348 // 349 // |--earlier--| 350 // |-- later --| 351 // 352 // 2. The earlier store has an offset greater than the later offset, but which 353 // still lies completely within the later store. 354 // 355 // |--earlier--| 356 // |----- later ------| 357 // 358 // We have to be careful here as *Off is signed while *.Size is unsigned. 359 if (EarlierOff >= LaterOff && 360 Later.Size >= Earlier.Size && 361 uint64_t(EarlierOff - LaterOff) + Earlier.Size <= Later.Size) 362 return OverwriteComplete; 363 364 // We may now overlap, although the overlap is not complete. There might also 365 // be other incomplete overlaps, and together, they might cover the complete 366 // earlier write. 367 // Note: The correctness of this logic depends on the fact that this function 368 // is not even called providing DepWrite when there are any intervening reads. 369 if (EnablePartialOverwriteTracking && 370 LaterOff < int64_t(EarlierOff + Earlier.Size) && 371 int64_t(LaterOff + Later.Size) >= EarlierOff) { 372 373 // Insert our part of the overlap into the map. 374 auto &IM = IOL[DepWrite]; 375 DEBUG(dbgs() << "DSE: Partial overwrite: Earlier [" << EarlierOff << ", " << 376 int64_t(EarlierOff + Earlier.Size) << ") Later [" << 377 LaterOff << ", " << int64_t(LaterOff + Later.Size) << ")\n"); 378 379 // Make sure that we only insert non-overlapping intervals and combine 380 // adjacent intervals. The intervals are stored in the map with the ending 381 // offset as the key (in the half-open sense) and the starting offset as 382 // the value. 383 int64_t LaterIntStart = LaterOff, LaterIntEnd = LaterOff + Later.Size; 384 385 // Find any intervals ending at, or after, LaterIntStart which start 386 // before LaterIntEnd. 387 auto ILI = IM.lower_bound(LaterIntStart); 388 if (ILI != IM.end() && ILI->second < LaterIntEnd) { 389 // This existing interval ends in the middle of 390 // [LaterIntStart, LaterIntEnd), erase it adjusting our start. 391 LaterIntStart = std::min(LaterIntStart, ILI->second); 392 LaterIntEnd = std::max(LaterIntEnd, ILI->first); 393 ILI = IM.erase(ILI); 394 395 while (ILI != IM.end() && ILI->first <= LaterIntEnd) 396 ILI = IM.erase(ILI); 397 398 if (ILI != IM.end() && ILI->second < LaterIntEnd) 399 LaterIntEnd = std::max(LaterIntEnd, ILI->first); 400 } 401 402 IM[LaterIntEnd] = LaterIntStart; 403 404 ILI = IM.begin(); 405 if (ILI->second <= EarlierOff && 406 ILI->first >= int64_t(EarlierOff + Earlier.Size)) { 407 DEBUG(dbgs() << "DSE: Full overwrite from partials: Earlier [" << 408 EarlierOff << ", " << 409 int64_t(EarlierOff + Earlier.Size) << 410 ") Composite Later [" << 411 ILI->second << ", " << ILI->first << ")\n"); 412 ++NumCompletePartials; 413 return OverwriteComplete; 414 } 415 } 416 417 // Another interesting case is if the later store overwrites the end of the 418 // earlier store. 419 // 420 // |--earlier--| 421 // |-- later --| 422 // 423 // In this case we may want to trim the size of earlier to avoid generating 424 // writes to addresses which will definitely be overwritten later 425 if (LaterOff > EarlierOff && 426 LaterOff < int64_t(EarlierOff + Earlier.Size) && 427 int64_t(LaterOff + Later.Size) >= int64_t(EarlierOff + Earlier.Size)) 428 return OverwriteEnd; 429 430 // Finally, we also need to check if the later store overwrites the beginning 431 // of the earlier store. 432 // 433 // |--earlier--| 434 // |-- later --| 435 // 436 // In this case we may want to move the destination address and trim the size 437 // of earlier to avoid generating writes to addresses which will definitely 438 // be overwritten later. 439 if (LaterOff <= EarlierOff && int64_t(LaterOff + Later.Size) > EarlierOff) { 440 assert (int64_t(LaterOff + Later.Size) < int64_t(EarlierOff + Earlier.Size) 441 && "Expect to be handled as OverwriteComplete" ); 442 return OverwriteBegin; 443 } 444 // Otherwise, they don't completely overlap. 445 return OverwriteUnknown; 446 } 447 448 /// If 'Inst' might be a self read (i.e. a noop copy of a 449 /// memory region into an identical pointer) then it doesn't actually make its 450 /// input dead in the traditional sense. Consider this case: 451 /// 452 /// memcpy(A <- B) 453 /// memcpy(A <- A) 454 /// 455 /// In this case, the second store to A does not make the first store to A dead. 456 /// The usual situation isn't an explicit A<-A store like this (which can be 457 /// trivially removed) but a case where two pointers may alias. 458 /// 459 /// This function detects when it is unsafe to remove a dependent instruction 460 /// because the DSE inducing instruction may be a self-read. 461 static bool isPossibleSelfRead(Instruction *Inst, 462 const MemoryLocation &InstStoreLoc, 463 Instruction *DepWrite, 464 const TargetLibraryInfo &TLI, 465 AliasAnalysis &AA) { 466 // Self reads can only happen for instructions that read memory. Get the 467 // location read. 468 MemoryLocation InstReadLoc = getLocForRead(Inst, TLI); 469 if (!InstReadLoc.Ptr) return false; // Not a reading instruction. 470 471 // If the read and written loc obviously don't alias, it isn't a read. 472 if (AA.isNoAlias(InstReadLoc, InstStoreLoc)) return false; 473 474 // Okay, 'Inst' may copy over itself. However, we can still remove a the 475 // DepWrite instruction if we can prove that it reads from the same location 476 // as Inst. This handles useful cases like: 477 // memcpy(A <- B) 478 // memcpy(A <- B) 479 // Here we don't know if A/B may alias, but we do know that B/B are must 480 // aliases, so removing the first memcpy is safe (assuming it writes <= # 481 // bytes as the second one. 482 MemoryLocation DepReadLoc = getLocForRead(DepWrite, TLI); 483 484 if (DepReadLoc.Ptr && AA.isMustAlias(InstReadLoc.Ptr, DepReadLoc.Ptr)) 485 return false; 486 487 // If DepWrite doesn't read memory or if we can't prove it is a must alias, 488 // then it can't be considered dead. 489 return true; 490 } 491 492 493 /// Returns true if the memory which is accessed by the second instruction is not 494 /// modified between the first and the second instruction. 495 /// Precondition: Second instruction must be dominated by the first 496 /// instruction. 497 static bool memoryIsNotModifiedBetween(Instruction *FirstI, 498 Instruction *SecondI, 499 AliasAnalysis *AA) { 500 SmallVector<BasicBlock *, 16> WorkList; 501 SmallPtrSet<BasicBlock *, 8> Visited; 502 BasicBlock::iterator FirstBBI(FirstI); 503 ++FirstBBI; 504 BasicBlock::iterator SecondBBI(SecondI); 505 BasicBlock *FirstBB = FirstI->getParent(); 506 BasicBlock *SecondBB = SecondI->getParent(); 507 MemoryLocation MemLoc = MemoryLocation::get(SecondI); 508 509 // Start checking the store-block. 510 WorkList.push_back(SecondBB); 511 bool isFirstBlock = true; 512 513 // Check all blocks going backward until we reach the load-block. 514 while (!WorkList.empty()) { 515 BasicBlock *B = WorkList.pop_back_val(); 516 517 // Ignore instructions before LI if this is the FirstBB. 518 BasicBlock::iterator BI = (B == FirstBB ? FirstBBI : B->begin()); 519 520 BasicBlock::iterator EI; 521 if (isFirstBlock) { 522 // Ignore instructions after SI if this is the first visit of SecondBB. 523 assert(B == SecondBB && "first block is not the store block"); 524 EI = SecondBBI; 525 isFirstBlock = false; 526 } else { 527 // It's not SecondBB or (in case of a loop) the second visit of SecondBB. 528 // In this case we also have to look at instructions after SI. 529 EI = B->end(); 530 } 531 for (; BI != EI; ++BI) { 532 Instruction *I = &*BI; 533 if (I->mayWriteToMemory() && I != SecondI) { 534 auto Res = AA->getModRefInfo(I, MemLoc); 535 if (Res != MRI_NoModRef) 536 return false; 537 } 538 } 539 if (B != FirstBB) { 540 assert(B != &FirstBB->getParent()->getEntryBlock() && 541 "Should not hit the entry block because SI must be dominated by LI"); 542 for (auto PredI = pred_begin(B), PE = pred_end(B); PredI != PE; ++PredI) { 543 if (!Visited.insert(*PredI).second) 544 continue; 545 WorkList.push_back(*PredI); 546 } 547 } 548 } 549 return true; 550 } 551 552 /// Find all blocks that will unconditionally lead to the block BB and append 553 /// them to F. 554 static void findUnconditionalPreds(SmallVectorImpl<BasicBlock *> &Blocks, 555 BasicBlock *BB, DominatorTree *DT) { 556 for (pred_iterator I = pred_begin(BB), E = pred_end(BB); I != E; ++I) { 557 BasicBlock *Pred = *I; 558 if (Pred == BB) continue; 559 TerminatorInst *PredTI = Pred->getTerminator(); 560 if (PredTI->getNumSuccessors() != 1) 561 continue; 562 563 if (DT->isReachableFromEntry(Pred)) 564 Blocks.push_back(Pred); 565 } 566 } 567 568 /// Handle frees of entire structures whose dependency is a store 569 /// to a field of that structure. 570 static bool handleFree(CallInst *F, AliasAnalysis *AA, 571 MemoryDependenceResults *MD, DominatorTree *DT, 572 const TargetLibraryInfo *TLI) { 573 bool MadeChange = false; 574 575 MemoryLocation Loc = MemoryLocation(F->getOperand(0)); 576 SmallVector<BasicBlock *, 16> Blocks; 577 Blocks.push_back(F->getParent()); 578 const DataLayout &DL = F->getModule()->getDataLayout(); 579 580 while (!Blocks.empty()) { 581 BasicBlock *BB = Blocks.pop_back_val(); 582 Instruction *InstPt = BB->getTerminator(); 583 if (BB == F->getParent()) InstPt = F; 584 585 MemDepResult Dep = 586 MD->getPointerDependencyFrom(Loc, false, InstPt->getIterator(), BB); 587 while (Dep.isDef() || Dep.isClobber()) { 588 Instruction *Dependency = Dep.getInst(); 589 if (!hasMemoryWrite(Dependency, *TLI) || !isRemovable(Dependency)) 590 break; 591 592 Value *DepPointer = 593 GetUnderlyingObject(getStoredPointerOperand(Dependency), DL); 594 595 // Check for aliasing. 596 if (!AA->isMustAlias(F->getArgOperand(0), DepPointer)) 597 break; 598 599 auto Next = ++Dependency->getIterator(); 600 601 // DCE instructions only used to calculate that store. 602 deleteDeadInstruction(Dependency, *MD, *TLI); 603 ++NumFastStores; 604 MadeChange = true; 605 606 // Inst's old Dependency is now deleted. Compute the next dependency, 607 // which may also be dead, as in 608 // s[0] = 0; 609 // s[1] = 0; // This has just been deleted. 610 // free(s); 611 Dep = MD->getPointerDependencyFrom(Loc, false, Next, BB); 612 } 613 614 if (Dep.isNonLocal()) 615 findUnconditionalPreds(Blocks, BB, DT); 616 } 617 618 return MadeChange; 619 } 620 621 /// Check to see if the specified location may alias any of the stack objects in 622 /// the DeadStackObjects set. If so, they become live because the location is 623 /// being loaded. 624 static void removeAccessedObjects(const MemoryLocation &LoadedLoc, 625 SmallSetVector<Value *, 16> &DeadStackObjects, 626 const DataLayout &DL, AliasAnalysis *AA, 627 const TargetLibraryInfo *TLI) { 628 const Value *UnderlyingPointer = GetUnderlyingObject(LoadedLoc.Ptr, DL); 629 630 // A constant can't be in the dead pointer set. 631 if (isa<Constant>(UnderlyingPointer)) 632 return; 633 634 // If the kill pointer can be easily reduced to an alloca, don't bother doing 635 // extraneous AA queries. 636 if (isa<AllocaInst>(UnderlyingPointer) || isa<Argument>(UnderlyingPointer)) { 637 DeadStackObjects.remove(const_cast<Value*>(UnderlyingPointer)); 638 return; 639 } 640 641 // Remove objects that could alias LoadedLoc. 642 DeadStackObjects.remove_if([&](Value *I) { 643 // See if the loaded location could alias the stack location. 644 MemoryLocation StackLoc(I, getPointerSize(I, DL, *TLI)); 645 return !AA->isNoAlias(StackLoc, LoadedLoc); 646 }); 647 } 648 649 /// Remove dead stores to stack-allocated locations in the function end block. 650 /// Ex: 651 /// %A = alloca i32 652 /// ... 653 /// store i32 1, i32* %A 654 /// ret void 655 static bool handleEndBlock(BasicBlock &BB, AliasAnalysis *AA, 656 MemoryDependenceResults *MD, 657 const TargetLibraryInfo *TLI) { 658 bool MadeChange = false; 659 660 // Keep track of all of the stack objects that are dead at the end of the 661 // function. 662 SmallSetVector<Value*, 16> DeadStackObjects; 663 664 // Find all of the alloca'd pointers in the entry block. 665 BasicBlock &Entry = BB.getParent()->front(); 666 for (Instruction &I : Entry) { 667 if (isa<AllocaInst>(&I)) 668 DeadStackObjects.insert(&I); 669 670 // Okay, so these are dead heap objects, but if the pointer never escapes 671 // then it's leaked by this function anyways. 672 else if (isAllocLikeFn(&I, TLI) && !PointerMayBeCaptured(&I, true, true)) 673 DeadStackObjects.insert(&I); 674 } 675 676 // Treat byval or inalloca arguments the same, stores to them are dead at the 677 // end of the function. 678 for (Argument &AI : BB.getParent()->args()) 679 if (AI.hasByValOrInAllocaAttr()) 680 DeadStackObjects.insert(&AI); 681 682 const DataLayout &DL = BB.getModule()->getDataLayout(); 683 684 // Scan the basic block backwards 685 for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){ 686 --BBI; 687 688 // If we find a store, check to see if it points into a dead stack value. 689 if (hasMemoryWrite(&*BBI, *TLI) && isRemovable(&*BBI)) { 690 // See through pointer-to-pointer bitcasts 691 SmallVector<Value *, 4> Pointers; 692 GetUnderlyingObjects(getStoredPointerOperand(&*BBI), Pointers, DL); 693 694 // Stores to stack values are valid candidates for removal. 695 bool AllDead = true; 696 for (Value *Pointer : Pointers) 697 if (!DeadStackObjects.count(Pointer)) { 698 AllDead = false; 699 break; 700 } 701 702 if (AllDead) { 703 Instruction *Dead = &*BBI++; 704 705 DEBUG(dbgs() << "DSE: Dead Store at End of Block:\n DEAD: " 706 << *Dead << "\n Objects: "; 707 for (SmallVectorImpl<Value *>::iterator I = Pointers.begin(), 708 E = Pointers.end(); I != E; ++I) { 709 dbgs() << **I; 710 if (std::next(I) != E) 711 dbgs() << ", "; 712 } 713 dbgs() << '\n'); 714 715 // DCE instructions only used to calculate that store. 716 deleteDeadInstruction(Dead, *MD, *TLI, &DeadStackObjects); 717 ++NumFastStores; 718 MadeChange = true; 719 continue; 720 } 721 } 722 723 // Remove any dead non-memory-mutating instructions. 724 if (isInstructionTriviallyDead(&*BBI, TLI)) { 725 Instruction *Inst = &*BBI++; 726 deleteDeadInstruction(Inst, *MD, *TLI, &DeadStackObjects); 727 ++NumFastOther; 728 MadeChange = true; 729 continue; 730 } 731 732 if (isa<AllocaInst>(BBI)) { 733 // Remove allocas from the list of dead stack objects; there can't be 734 // any references before the definition. 735 DeadStackObjects.remove(&*BBI); 736 continue; 737 } 738 739 if (auto CS = CallSite(&*BBI)) { 740 // Remove allocation function calls from the list of dead stack objects; 741 // there can't be any references before the definition. 742 if (isAllocLikeFn(&*BBI, TLI)) 743 DeadStackObjects.remove(&*BBI); 744 745 // If this call does not access memory, it can't be loading any of our 746 // pointers. 747 if (AA->doesNotAccessMemory(CS)) 748 continue; 749 750 // If the call might load from any of our allocas, then any store above 751 // the call is live. 752 DeadStackObjects.remove_if([&](Value *I) { 753 // See if the call site touches the value. 754 ModRefInfo A = AA->getModRefInfo(CS, I, getPointerSize(I, DL, *TLI)); 755 756 return A == MRI_ModRef || A == MRI_Ref; 757 }); 758 759 // If all of the allocas were clobbered by the call then we're not going 760 // to find anything else to process. 761 if (DeadStackObjects.empty()) 762 break; 763 764 continue; 765 } 766 767 MemoryLocation LoadedLoc; 768 769 // If we encounter a use of the pointer, it is no longer considered dead 770 if (LoadInst *L = dyn_cast<LoadInst>(BBI)) { 771 if (!L->isUnordered()) // Be conservative with atomic/volatile load 772 break; 773 LoadedLoc = MemoryLocation::get(L); 774 } else if (VAArgInst *V = dyn_cast<VAArgInst>(BBI)) { 775 LoadedLoc = MemoryLocation::get(V); 776 } else if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(BBI)) { 777 LoadedLoc = MemoryLocation::getForSource(MTI); 778 } else if (!BBI->mayReadFromMemory()) { 779 // Instruction doesn't read memory. Note that stores that weren't removed 780 // above will hit this case. 781 continue; 782 } else { 783 // Unknown inst; assume it clobbers everything. 784 break; 785 } 786 787 // Remove any allocas from the DeadPointer set that are loaded, as this 788 // makes any stores above the access live. 789 removeAccessedObjects(LoadedLoc, DeadStackObjects, DL, AA, TLI); 790 791 // If all of the allocas were clobbered by the access then we're not going 792 // to find anything else to process. 793 if (DeadStackObjects.empty()) 794 break; 795 } 796 797 return MadeChange; 798 } 799 800 static bool eliminateDeadStores(BasicBlock &BB, AliasAnalysis *AA, 801 MemoryDependenceResults *MD, DominatorTree *DT, 802 const TargetLibraryInfo *TLI) { 803 const DataLayout &DL = BB.getModule()->getDataLayout(); 804 bool MadeChange = false; 805 806 // A map of interval maps representing partially-overwritten value parts. 807 InstOverlapIntervalsTy IOL; 808 809 // Do a top-down walk on the BB. 810 for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ) { 811 Instruction *Inst = &*BBI++; 812 813 // Handle 'free' calls specially. 814 if (CallInst *F = isFreeCall(Inst, TLI)) { 815 MadeChange |= handleFree(F, AA, MD, DT, TLI); 816 continue; 817 } 818 819 // If we find something that writes memory, get its memory dependence. 820 if (!hasMemoryWrite(Inst, *TLI)) 821 continue; 822 823 // If we're storing the same value back to a pointer that we just 824 // loaded from, then the store can be removed. 825 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) { 826 827 auto RemoveDeadInstAndUpdateBBI = [&](Instruction *DeadInst) { 828 // deleteDeadInstruction can delete the current instruction. Save BBI 829 // in case we need it. 830 WeakVH NextInst(&*BBI); 831 832 deleteDeadInstruction(DeadInst, *MD, *TLI); 833 834 if (!NextInst) // Next instruction deleted. 835 BBI = BB.begin(); 836 else if (BBI != BB.begin()) // Revisit this instruction if possible. 837 --BBI; 838 ++NumRedundantStores; 839 MadeChange = true; 840 }; 841 842 if (LoadInst *DepLoad = dyn_cast<LoadInst>(SI->getValueOperand())) { 843 if (SI->getPointerOperand() == DepLoad->getPointerOperand() && 844 isRemovable(SI) && 845 memoryIsNotModifiedBetween(DepLoad, SI, AA)) { 846 847 DEBUG(dbgs() << "DSE: Remove Store Of Load from same pointer:\n " 848 << "LOAD: " << *DepLoad << "\n STORE: " << *SI << '\n'); 849 850 RemoveDeadInstAndUpdateBBI(SI); 851 continue; 852 } 853 } 854 855 // Remove null stores into the calloc'ed objects 856 Constant *StoredConstant = dyn_cast<Constant>(SI->getValueOperand()); 857 858 if (StoredConstant && StoredConstant->isNullValue() && 859 isRemovable(SI)) { 860 Instruction *UnderlyingPointer = dyn_cast<Instruction>( 861 GetUnderlyingObject(SI->getPointerOperand(), DL)); 862 863 if (UnderlyingPointer && isCallocLikeFn(UnderlyingPointer, TLI) && 864 memoryIsNotModifiedBetween(UnderlyingPointer, SI, AA)) { 865 DEBUG(dbgs() 866 << "DSE: Remove null store to the calloc'ed object:\n DEAD: " 867 << *Inst << "\n OBJECT: " << *UnderlyingPointer << '\n'); 868 869 RemoveDeadInstAndUpdateBBI(SI); 870 continue; 871 } 872 } 873 } 874 875 MemDepResult InstDep = MD->getDependency(Inst); 876 877 // Ignore any store where we can't find a local dependence. 878 // FIXME: cross-block DSE would be fun. :) 879 if (!InstDep.isDef() && !InstDep.isClobber()) 880 continue; 881 882 // Figure out what location is being stored to. 883 MemoryLocation Loc = getLocForWrite(Inst, *AA); 884 885 // If we didn't get a useful location, fail. 886 if (!Loc.Ptr) 887 continue; 888 889 while (InstDep.isDef() || InstDep.isClobber()) { 890 // Get the memory clobbered by the instruction we depend on. MemDep will 891 // skip any instructions that 'Loc' clearly doesn't interact with. If we 892 // end up depending on a may- or must-aliased load, then we can't optimize 893 // away the store and we bail out. However, if we depend on something 894 // that overwrites the memory location we *can* potentially optimize it. 895 // 896 // Find out what memory location the dependent instruction stores. 897 Instruction *DepWrite = InstDep.getInst(); 898 MemoryLocation DepLoc = getLocForWrite(DepWrite, *AA); 899 // If we didn't get a useful location, or if it isn't a size, bail out. 900 if (!DepLoc.Ptr) 901 break; 902 903 // If we find a write that is a) removable (i.e., non-volatile), b) is 904 // completely obliterated by the store to 'Loc', and c) which we know that 905 // 'Inst' doesn't load from, then we can remove it. 906 if (isRemovable(DepWrite) && 907 !isPossibleSelfRead(Inst, Loc, DepWrite, *TLI, *AA)) { 908 int64_t InstWriteOffset, DepWriteOffset; 909 OverwriteResult OR = 910 isOverwrite(Loc, DepLoc, DL, *TLI, DepWriteOffset, InstWriteOffset, 911 DepWrite, IOL); 912 if (OR == OverwriteComplete) { 913 DEBUG(dbgs() << "DSE: Remove Dead Store:\n DEAD: " 914 << *DepWrite << "\n KILLER: " << *Inst << '\n'); 915 916 // Delete the store and now-dead instructions that feed it. 917 deleteDeadInstruction(DepWrite, *MD, *TLI); 918 ++NumFastStores; 919 MadeChange = true; 920 921 // deleteDeadInstruction can delete the current instruction in loop 922 // cases, reset BBI. 923 BBI = Inst->getIterator(); 924 auto BBBegin = BB.begin(); 925 while (BBI != BBBegin && isa<DbgInfoIntrinsic>(*(--BBI))) 926 ; 927 break; 928 } else if ((OR == OverwriteEnd && isShortenableAtTheEnd(DepWrite)) || 929 ((OR == OverwriteBegin && 930 isShortenableAtTheBeginning(DepWrite)))) { 931 // TODO: base this on the target vector size so that if the earlier 932 // store was too small to get vector writes anyway then its likely 933 // a good idea to shorten it 934 // Power of 2 vector writes are probably always a bad idea to optimize 935 // as any store/memset/memcpy is likely using vector instructions so 936 // shortening it to not vector size is likely to be slower 937 MemIntrinsic *DepIntrinsic = cast<MemIntrinsic>(DepWrite); 938 unsigned DepWriteAlign = DepIntrinsic->getAlignment(); 939 bool IsOverwriteEnd = (OR == OverwriteEnd); 940 if (!IsOverwriteEnd) 941 InstWriteOffset = int64_t(InstWriteOffset + Loc.Size); 942 943 if ((llvm::isPowerOf2_64(InstWriteOffset) && 944 DepWriteAlign <= InstWriteOffset) || 945 ((DepWriteAlign != 0) && InstWriteOffset % DepWriteAlign == 0)) { 946 947 DEBUG(dbgs() << "DSE: Remove Dead Store:\n OW " 948 << (IsOverwriteEnd ? "END" : "BEGIN") << ": " 949 << *DepWrite << "\n KILLER (offset " 950 << InstWriteOffset << ", " << DepLoc.Size << ")" 951 << *Inst << '\n'); 952 953 int64_t NewLength = 954 IsOverwriteEnd 955 ? InstWriteOffset - DepWriteOffset 956 : DepLoc.Size - (InstWriteOffset - DepWriteOffset); 957 958 Value *DepWriteLength = DepIntrinsic->getLength(); 959 Value *TrimmedLength = 960 ConstantInt::get(DepWriteLength->getType(), NewLength); 961 DepIntrinsic->setLength(TrimmedLength); 962 963 if (!IsOverwriteEnd) { 964 int64_t OffsetMoved = (InstWriteOffset - DepWriteOffset); 965 Value *Indices[1] = { 966 ConstantInt::get(DepWriteLength->getType(), OffsetMoved)}; 967 GetElementPtrInst *NewDestGEP = GetElementPtrInst::CreateInBounds( 968 DepIntrinsic->getRawDest(), Indices, "", DepWrite); 969 DepIntrinsic->setDest(NewDestGEP); 970 } 971 MadeChange = true; 972 } 973 } 974 } 975 976 // If this is a may-aliased store that is clobbering the store value, we 977 // can keep searching past it for another must-aliased pointer that stores 978 // to the same location. For example, in: 979 // store -> P 980 // store -> Q 981 // store -> P 982 // we can remove the first store to P even though we don't know if P and Q 983 // alias. 984 if (DepWrite == &BB.front()) break; 985 986 // Can't look past this instruction if it might read 'Loc'. 987 if (AA->getModRefInfo(DepWrite, Loc) & MRI_Ref) 988 break; 989 990 InstDep = MD->getPointerDependencyFrom(Loc, false, 991 DepWrite->getIterator(), &BB); 992 } 993 } 994 995 // If this block ends in a return, unwind, or unreachable, all allocas are 996 // dead at its end, which means stores to them are also dead. 997 if (BB.getTerminator()->getNumSuccessors() == 0) 998 MadeChange |= handleEndBlock(BB, AA, MD, TLI); 999 1000 return MadeChange; 1001 } 1002 1003 static bool eliminateDeadStores(Function &F, AliasAnalysis *AA, 1004 MemoryDependenceResults *MD, DominatorTree *DT, 1005 const TargetLibraryInfo *TLI) { 1006 bool MadeChange = false; 1007 for (BasicBlock &BB : F) 1008 // Only check non-dead blocks. Dead blocks may have strange pointer 1009 // cycles that will confuse alias analysis. 1010 if (DT->isReachableFromEntry(&BB)) 1011 MadeChange |= eliminateDeadStores(BB, AA, MD, DT, TLI); 1012 return MadeChange; 1013 } 1014 1015 //===----------------------------------------------------------------------===// 1016 // DSE Pass 1017 //===----------------------------------------------------------------------===// 1018 PreservedAnalyses DSEPass::run(Function &F, FunctionAnalysisManager &AM) { 1019 AliasAnalysis *AA = &AM.getResult<AAManager>(F); 1020 DominatorTree *DT = &AM.getResult<DominatorTreeAnalysis>(F); 1021 MemoryDependenceResults *MD = &AM.getResult<MemoryDependenceAnalysis>(F); 1022 const TargetLibraryInfo *TLI = &AM.getResult<TargetLibraryAnalysis>(F); 1023 1024 if (!eliminateDeadStores(F, AA, MD, DT, TLI)) 1025 return PreservedAnalyses::all(); 1026 PreservedAnalyses PA; 1027 PA.preserve<DominatorTreeAnalysis>(); 1028 PA.preserve<GlobalsAA>(); 1029 PA.preserve<MemoryDependenceAnalysis>(); 1030 return PA; 1031 } 1032 1033 /// A legacy pass for the legacy pass manager that wraps \c DSEPass. 1034 class DSELegacyPass : public FunctionPass { 1035 public: 1036 DSELegacyPass() : FunctionPass(ID) { 1037 initializeDSELegacyPassPass(*PassRegistry::getPassRegistry()); 1038 } 1039 1040 bool runOnFunction(Function &F) override { 1041 if (skipFunction(F)) 1042 return false; 1043 1044 DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); 1045 AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults(); 1046 MemoryDependenceResults *MD = 1047 &getAnalysis<MemoryDependenceWrapperPass>().getMemDep(); 1048 const TargetLibraryInfo *TLI = 1049 &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(); 1050 1051 return eliminateDeadStores(F, AA, MD, DT, TLI); 1052 } 1053 1054 void getAnalysisUsage(AnalysisUsage &AU) const override { 1055 AU.setPreservesCFG(); 1056 AU.addRequired<DominatorTreeWrapperPass>(); 1057 AU.addRequired<AAResultsWrapperPass>(); 1058 AU.addRequired<MemoryDependenceWrapperPass>(); 1059 AU.addRequired<TargetLibraryInfoWrapperPass>(); 1060 AU.addPreserved<DominatorTreeWrapperPass>(); 1061 AU.addPreserved<GlobalsAAWrapperPass>(); 1062 AU.addPreserved<MemoryDependenceWrapperPass>(); 1063 } 1064 1065 static char ID; // Pass identification, replacement for typeid 1066 }; 1067 1068 char DSELegacyPass::ID = 0; 1069 INITIALIZE_PASS_BEGIN(DSELegacyPass, "dse", "Dead Store Elimination", false, 1070 false) 1071 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 1072 INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) 1073 INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass) 1074 INITIALIZE_PASS_DEPENDENCY(MemoryDependenceWrapperPass) 1075 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) 1076 INITIALIZE_PASS_END(DSELegacyPass, "dse", "Dead Store Elimination", false, 1077 false) 1078 1079 FunctionPass *llvm::createDeadStoreEliminationPass() { 1080 return new DSELegacyPass(); 1081 } 1082