diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2011-08-15 21:00:18 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2011-08-15 21:00:18 +0000 |
commit | e5e771263a71536ab2794ae726f43e7ccd2720ac (patch) | |
tree | 72c3d4c691f4d12950b35851e9ee6c9485082129 | |
parent | 801f10f7164367f109c6954eb4988ba53a31bda6 (diff) |
Fix predicates methods on Instruction to handle atomic load/store correctly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137652 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/VMCore/Instruction.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/lib/VMCore/Instruction.cpp b/lib/VMCore/Instruction.cpp index eadcd098b1..22656f3353 100644 --- a/lib/VMCore/Instruction.cpp +++ b/lib/VMCore/Instruction.cpp @@ -196,10 +196,14 @@ bool Instruction::isIdenticalToWhenDefined(const Instruction *I) const { // Check special state that is a part of some instructions. if (const LoadInst *LI = dyn_cast<LoadInst>(this)) return LI->isVolatile() == cast<LoadInst>(I)->isVolatile() && - LI->getAlignment() == cast<LoadInst>(I)->getAlignment(); + LI->getAlignment() == cast<LoadInst>(I)->getAlignment() && + LI->getOrdering() == cast<LoadInst>(I)->getOrdering() && + LI->getSynchScope() == cast<LoadInst>(I)->getSynchScope(); if (const StoreInst *SI = dyn_cast<StoreInst>(this)) return SI->isVolatile() == cast<StoreInst>(I)->isVolatile() && - SI->getAlignment() == cast<StoreInst>(I)->getAlignment(); + SI->getAlignment() == cast<StoreInst>(I)->getAlignment() && + SI->getOrdering() == cast<StoreInst>(I)->getOrdering() && + SI->getSynchScope() == cast<StoreInst>(I)->getSynchScope(); if (const CmpInst *CI = dyn_cast<CmpInst>(this)) return CI->getPredicate() == cast<CmpInst>(I)->getPredicate(); if (const CallInst *CI = dyn_cast<CallInst>(this)) @@ -247,10 +251,14 @@ bool Instruction::isSameOperationAs(const Instruction *I) const { // Check special state that is a part of some instructions. if (const LoadInst *LI = dyn_cast<LoadInst>(this)) return LI->isVolatile() == cast<LoadInst>(I)->isVolatile() && - LI->getAlignment() == cast<LoadInst>(I)->getAlignment(); + LI->getAlignment() == cast<LoadInst>(I)->getAlignment() && + LI->getOrdering() == cast<LoadInst>(I)->getOrdering() && + LI->getSynchScope() == cast<LoadInst>(I)->getSynchScope(); if (const StoreInst *SI = dyn_cast<StoreInst>(this)) return SI->isVolatile() == cast<StoreInst>(I)->isVolatile() && - SI->getAlignment() == cast<StoreInst>(I)->getAlignment(); + SI->getAlignment() == cast<StoreInst>(I)->getAlignment() && + SI->getOrdering() == cast<StoreInst>(I)->getOrdering() && + SI->getSynchScope() == cast<StoreInst>(I)->getSynchScope(); if (const CmpInst *CI = dyn_cast<CmpInst>(this)) return CI->getPredicate() == cast<CmpInst>(I)->getPredicate(); if (const CallInst *CI = dyn_cast<CallInst>(this)) @@ -318,7 +326,7 @@ bool Instruction::mayReadFromMemory() const { case Instruction::Invoke: return !cast<InvokeInst>(this)->doesNotAccessMemory(); case Instruction::Store: - return cast<StoreInst>(this)->isVolatile(); + return !cast<StoreInst>(this)->isUnordered(); } } @@ -338,7 +346,7 @@ bool Instruction::mayWriteToMemory() const { case Instruction::Invoke: return !cast<InvokeInst>(this)->onlyReadsMemory(); case Instruction::Load: - return cast<LoadInst>(this)->isVolatile(); + return !cast<LoadInst>(this)->isUnordered(); } } @@ -407,7 +415,7 @@ bool Instruction::isSafeToSpeculativelyExecute() const { } case Load: { const LoadInst *LI = cast<LoadInst>(this); - if (LI->isVolatile()) + if (!LI->isUnordered()) return false; return LI->getPointerOperand()->isDereferenceablePointer(); } |