mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
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
This commit is contained in:
parent
801f10f716
commit
e5e771263a
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user