summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-04-01 06:29:28 +0000
committerCraig Topper <craig.topper@intel.com>2018-04-01 06:29:28 +0000
commitdb6caabccc8314fee9199aca0bbbc189fbada5f7 (patch)
tree070e3220f9be998f5c81121e3efe47f91c74997e /llvm/lib
parent3998041e800335a62fdcb7e547b82f080e3e157a (diff)
downloadbcm5719-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.cpp17
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;
}
}
OpenPOWER on IntegriCloud