diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2020-01-12 15:54:09 -0500 |
---|---|---|
committer | Matt Arsenault <arsenm2@gmail.com> | 2020-01-16 13:49:43 -0500 |
commit | d0943537e10e25281164bb27df843e283dc6666c (patch) | |
tree | 9b4941099a4c64377873469b20a51a02d1e9642a /llvm/lib/CodeGen/TargetLoweringBase.cpp | |
parent | 0d0fce42b0ea7c7ce18cd0191f95204a0b800b15 (diff) | |
download | llvm-d0943537e10e25281164bb27df843e283dc6666c.zip llvm-d0943537e10e25281164bb27df843e283dc6666c.tar.gz llvm-d0943537e10e25281164bb27df843e283dc6666c.tar.bz2 |
GlobalISel: Apply target MMO flags to atomics
Unify MMO flag handling with SelectionDAG like with loads and stores.
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringBase.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 25173d6..db077bb 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -2042,3 +2042,22 @@ TargetLoweringBase::getStoreMemOperandFlags(const StoreInst &SI, Flags |= getTargetMMOFlags(SI); return Flags; } + +MachineMemOperand::Flags +TargetLoweringBase::getAtomicMemOperandFlags(const Instruction &AI, + const DataLayout &DL) const { + auto Flags = MachineMemOperand::MOLoad | MachineMemOperand::MOStore; + + if (const AtomicRMWInst *RMW = dyn_cast<AtomicRMWInst>(&AI)) { + if (RMW->isVolatile()) + Flags |= MachineMemOperand::MOVolatile; + } else if (const AtomicCmpXchgInst *CmpX = dyn_cast<AtomicCmpXchgInst>(&AI)) { + if (CmpX->isVolatile()) + Flags |= MachineMemOperand::MOVolatile; + } else + llvm_unreachable("not an atomic instruction"); + + // FIXME: Not preserving dereferenceable + Flags |= getTargetMMOFlags(AI); + return Flags; +} |