mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 22:26:14 +00:00
Don't move normal loads across volatile/atomic loads.
It is technically allowed to move a normal load across a volatile load, but probably not a good idea. It is not allowed to move a load across an atomic load with Ordering > Monotonic, and we model those with MOVolatile as well. I recently removed the mayStore flag from atomic load instructions, so they don't need a pseudo-opcode. This patch makes up for the difference. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162857 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
688c1cd6c9
commit
0d75858395
@ -1343,7 +1343,12 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII,
|
|||||||
AliasAnalysis *AA,
|
AliasAnalysis *AA,
|
||||||
bool &SawStore) const {
|
bool &SawStore) const {
|
||||||
// Ignore stuff that we obviously can't move.
|
// Ignore stuff that we obviously can't move.
|
||||||
if (mayStore() || isCall()) {
|
//
|
||||||
|
// Treat volatile loads as stores. This is not strictly necessary for
|
||||||
|
// volatiles, but it is required for atomic loads. It is now allowed to move
|
||||||
|
// a load across an atomic load with Ordering > Monotonic.
|
||||||
|
if (mayStore() || isCall() ||
|
||||||
|
(mayLoad() && hasVolatileMemoryRef())) {
|
||||||
SawStore = true;
|
SawStore = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1359,8 +1364,8 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII,
|
|||||||
// load.
|
// load.
|
||||||
if (mayLoad() && !isInvariantLoad(AA))
|
if (mayLoad() && !isInvariantLoad(AA))
|
||||||
// Otherwise, this is a real load. If there is a store between the load and
|
// Otherwise, this is a real load. If there is a store between the load and
|
||||||
// end of block, or if the load is volatile, we can't move it.
|
// end of block, we can't move it.
|
||||||
return !SawStore && !hasVolatileMemoryRef();
|
return !SawStore;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user