diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index f1be359862c..9cb7ed0c64f 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -39768,6 +39768,19 @@ bool X86TargetLowering::IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const { return Ld->getBasePtr() == St->getBasePtr(); }; + auto IsFoldableAtomicRMW = [](SDValue Load, SDValue Op) { + if (!Load.hasOneUse() || Load.getOpcode() != ISD::ATOMIC_LOAD) + return false; + if (!Op.hasOneUse()) + return false; + SDNode *User = *Op->use_begin(); + if (User->getOpcode() != ISD::ATOMIC_STORE) + return false; + auto *Ld = cast<AtomicSDNode>(Load); + auto *St = cast<AtomicSDNode>(User); + return Ld->getBasePtr() == St->getBasePtr(); + }; + bool Commute = false; switch (Op.getOpcode()) { default: return false; @@ -39802,6 +39815,9 @@ bool X86TargetLowering::IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const { ((Commute && !isa<ConstantSDNode>(N1)) || (Op.getOpcode() != ISD::MUL && IsFoldableRMW(N0, Op)))) return false; + if (IsFoldableAtomicRMW(N0, Op) || + (Commute && IsFoldableAtomicRMW(N1, Op))) + return false; } } |