diff options
author | Chris Lattner <sabre@nondot.org> | 2010-11-30 19:12:10 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-11-30 19:12:10 +0000 |
commit | 55ee75d57114c17460d364121a2ec3a5cf40e1d2 (patch) | |
tree | 6600ba9840712413875e33b42cff9468a47bc257 /lib/Transforms | |
parent | 12822af16ae2218e5cdfdf4976e66d81417edda6 (diff) | |
download | llvm-55ee75d57114c17460d364121a2ec3a5cf40e1d2.tar.gz llvm-55ee75d57114c17460d364121a2ec3a5cf40e1d2.tar.bz2 llvm-55ee75d57114c17460d364121a2ec3a5cf40e1d2.tar.xz |
enhance isRemovable to refuse to delete volatile mem transfers
now that DSE hacks on them. This fixes a regression I introduced,
by generalizing DSE to hack on transfers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120445 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/DeadStoreElimination.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index cb4d482a63..d05f57f0d0 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -152,12 +152,27 @@ getLocForWrite(Instruction *Inst, AliasAnalysis &AA) { /// isRemovable - If the value of this instruction and the memory it writes to /// is unused, may we delete this instruction? static bool isRemovable(Instruction *I) { - assert(hasMemoryWrite(I)); - if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) - return II->getIntrinsicID() != Intrinsic::lifetime_end; + // Don't remove volatile stores. if (StoreInst *SI = dyn_cast<StoreInst>(I)) return !SI->isVolatile(); - return true; + + IntrinsicInst *II = cast<IntrinsicInst>(I); + switch (II->getIntrinsicID()) { + default: assert(0 && "doesn't pass 'hasMemoryWrite' predicate"); + case Intrinsic::lifetime_end: + // Never remove dead lifetime_end's, e.g. because it is followed by a + // free. + return false; + case Intrinsic::init_trampoline: + // Always safe to remove init_trampoline. + return true; + + case Intrinsic::memset: + case Intrinsic::memmove: + case Intrinsic::memcpy: + // Don't remove volatile memory intrinsics. + return !cast<MemIntrinsic>(II)->isVolatile(); + } } /// getPointerOperand - Return the pointer that is being written to. |