mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-20 10:24:12 +00:00
MemoryDependenceAnalysis: Don't miscompile atomics
r216771 introduced a change to MemoryDependenceAnalysis that allowed it to reason about acquire/release operations. However, this change does not ensure that the acquire/release operations pair. Unfortunately, this leads to miscompiles as we won't see an acquire load as properly memory effecting. This largely reverts r216771. This fixes PR22708. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232889 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -407,7 +407,6 @@ getPointerDependencyFrom(const AliasAnalysis::Location &MemLoc, bool isLoad,
|
||||
// by every program that can detect any optimisation of that kind: either
|
||||
// it is racy (undefined) or there is a release followed by an acquire
|
||||
// between the pair of accesses under consideration.
|
||||
bool HasSeenAcquire = false;
|
||||
|
||||
if (isLoad && QueryInst) {
|
||||
LoadInst *LI = dyn_cast<LoadInst>(QueryInst);
|
||||
@ -468,12 +467,12 @@ getPointerDependencyFrom(const AliasAnalysis::Location &MemLoc, bool isLoad,
|
||||
|
||||
// Atomic loads have complications involved.
|
||||
// A Monotonic (or higher) load is OK if the query inst is itself not atomic.
|
||||
// An Acquire (or higher) load sets the HasSeenAcquire flag, so that any
|
||||
// release store will know to return getClobber.
|
||||
// FIXME: This is overly conservative.
|
||||
if (LI->isAtomic() && LI->getOrdering() > Unordered) {
|
||||
if (!QueryInst)
|
||||
return MemDepResult::getClobber(LI);
|
||||
if (LI->getOrdering() != Monotonic)
|
||||
return MemDepResult::getClobber(LI);
|
||||
if (auto *QueryLI = dyn_cast<LoadInst>(QueryInst)) {
|
||||
if (!QueryLI->isSimple())
|
||||
return MemDepResult::getClobber(LI);
|
||||
@ -483,9 +482,6 @@ getPointerDependencyFrom(const AliasAnalysis::Location &MemLoc, bool isLoad,
|
||||
} else if (QueryInst->mayReadOrWriteMemory()) {
|
||||
return MemDepResult::getClobber(LI);
|
||||
}
|
||||
|
||||
if (isAtLeastAcquire(LI->getOrdering()))
|
||||
HasSeenAcquire = true;
|
||||
}
|
||||
|
||||
AliasAnalysis::Location LoadLoc = AA->getLocation(LI);
|
||||
@ -545,12 +541,12 @@ getPointerDependencyFrom(const AliasAnalysis::Location &MemLoc, bool isLoad,
|
||||
if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
||||
// Atomic stores have complications involved.
|
||||
// A Monotonic store is OK if the query inst is itself not atomic.
|
||||
// A Release (or higher) store further requires that no acquire load
|
||||
// has been seen.
|
||||
// FIXME: This is overly conservative.
|
||||
if (!SI->isUnordered()) {
|
||||
if (!QueryInst)
|
||||
return MemDepResult::getClobber(SI);
|
||||
if (SI->getOrdering() != Monotonic)
|
||||
return MemDepResult::getClobber(SI);
|
||||
if (auto *QueryLI = dyn_cast<LoadInst>(QueryInst)) {
|
||||
if (!QueryLI->isSimple())
|
||||
return MemDepResult::getClobber(SI);
|
||||
@ -560,9 +556,6 @@ getPointerDependencyFrom(const AliasAnalysis::Location &MemLoc, bool isLoad,
|
||||
} else if (QueryInst->mayReadOrWriteMemory()) {
|
||||
return MemDepResult::getClobber(SI);
|
||||
}
|
||||
|
||||
if (HasSeenAcquire && isAtLeastRelease(SI->getOrdering()))
|
||||
return MemDepResult::getClobber(SI);
|
||||
}
|
||||
|
||||
// FIXME: this is overly conservative.
|
||||
|
Reference in New Issue
Block a user