diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-04-01 06:29:28 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-04-01 06:29:28 +0000 |
| commit | db6caabccc8314fee9199aca0bbbc189fbada5f7 (patch) | |
| tree | 070e3220f9be998f5c81121e3efe47f91c74997e /llvm/lib | |
| parent | 3998041e800335a62fdcb7e547b82f080e3e157a (diff) | |
| download | bcm5719-llvm-db6caabccc8314fee9199aca0bbbc189fbada5f7.tar.gz bcm5719-llvm-db6caabccc8314fee9199aca0bbbc189fbada5f7.zip | |
[X86] Check if the load and store are to the same pointer before preventing i16 RMW shifts and subtracts from being promoted.
llvm-svn: 328930
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c39be22b927..85366eebbe2 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -38717,6 +38717,17 @@ bool X86TargetLowering::IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const { if (VT != MVT::i16) return false; + auto IsFoldableRMW = [](SDValue Load, SDValue Op) { + if (!Op.hasOneUse()) + return false; + SDNode *User = *Op->use_begin(); + if (!ISD::isNormalStore(User)) + return false; + auto *Ld = cast<LoadSDNode>(Load); + auto *St = cast<StoreSDNode>(User); + return Ld->getBasePtr() == St->getBasePtr(); + }; + bool Commute = false; switch (Op.getOpcode()) { default: return false; @@ -38728,7 +38739,7 @@ bool X86TargetLowering::IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const { case ISD::SRL: { SDValue N0 = Op.getOperand(0); // Look out for (store (shl (load), x)). - if (MayFoldLoad(N0) && MayFoldIntoStore(Op)) + if (MayFoldLoad(N0) && IsFoldableRMW(N0, Op)) return false; break; } @@ -38744,10 +38755,10 @@ bool X86TargetLowering::IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const { SDValue N1 = Op.getOperand(1); // Avoid disabling potential load folding opportunities. if (MayFoldLoad(N1) && - (!Commute || !isa<ConstantSDNode>(N0) || MayFoldIntoStore(Op))) + (!Commute || !isa<ConstantSDNode>(N0) || IsFoldableRMW(N1, Op))) return false; if (MayFoldLoad(N0) && - ((Commute && !isa<ConstantSDNode>(N1)) || MayFoldIntoStore(Op))) + ((Commute && !isa<ConstantSDNode>(N1)) || IsFoldableRMW(N0, Op))) return false; } } |

