mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-22 03:28:35 +00:00
Don't DSe volatile stores.
llvm-svn: 41456
This commit is contained in:
parent
2ceade197b
commit
f660f11ec4
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user