diff options
author | Owen Anderson <resistor@mac.com> | 2007-08-26 21:14:47 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-08-26 21:14:47 +0000 |
commit | 2b9ec7ff338c8a616f64d59d3f67df16994bd430 (patch) | |
tree | 5a9abcdea4ebd67153568e57a841da75743ccc79 /llvm/lib/Transforms | |
parent | dd9a319158fa75b218f09276012274cb21482c60 (diff) | |
download | bcm5719-llvm-2b9ec7ff338c8a616f64d59d3f67df16994bd430.tar.gz bcm5719-llvm-2b9ec7ff338c8a616f64d59d3f67df16994bd430.zip |
Don't DSe volatile stores.
llvm-svn: 41456
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp index 283fcbc97a1..1e5381db9af 100644 --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -111,9 +111,12 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { continue; Value* pointer = 0; - if (StoreInst* S = dyn_cast<StoreInst>(BBI)) - pointer = S->getPointerOperand(); - else + if (StoreInst* S = dyn_cast<StoreInst>(BBI)) { + if (!S->isVolatile()) + pointer = S->getPointerOperand(); + else + continue; + } else pointer = cast<FreeInst>(BBI)->getPointerOperand(); StoreInst*& last = lastStore[pointer]; @@ -194,6 +197,8 @@ bool DSE::handleFreeWithNonTrivialDependency(FreeInst* F, Instruction* dep, StoreInst* dependency = dyn_cast<StoreInst>(dep); if (!dependency) return false; + else if (dependency->isVolatile()) + return false; Value* depPointer = dependency->getPointerOperand(); const Type* depType = dependency->getOperand(0)->getType(); @@ -253,24 +258,26 @@ bool DSE::handleEndBlock(BasicBlock& BB, // If we find a store whose pointer is dead... if (StoreInst* S = dyn_cast<StoreInst>(BBI)) { - Value* pointerOperand = S->getPointerOperand(); - // See through pointer-to-pointer bitcasts - TranslatePointerBitCasts(pointerOperand); + if (!S->isVolatile()) { + Value* pointerOperand = S->getPointerOperand(); + // See through pointer-to-pointer bitcasts + TranslatePointerBitCasts(pointerOperand); - if (deadPointers.count(pointerOperand)){ - // Remove it! - MD.removeInstruction(S); + if (deadPointers.count(pointerOperand)){ + // Remove it! + MD.removeInstruction(S); - // DCE instructions only used to calculate that store - if (Instruction* D = dyn_cast<Instruction>(S->getOperand(0))) - possiblyDead.insert(D); - if (Instruction* D = dyn_cast<Instruction>(S->getOperand(1))) - possiblyDead.insert(D); + // DCE instructions only used to calculate that store + if (Instruction* D = dyn_cast<Instruction>(S->getOperand(0))) + possiblyDead.insert(D); + if (Instruction* D = dyn_cast<Instruction>(S->getOperand(1))) + possiblyDead.insert(D); - BBI++; - S->eraseFromParent(); - NumFastStores++; - MadeChange = true; + BBI++; + S->eraseFromParent(); + NumFastStores++; + MadeChange = true; + } } continue; |