summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorNirav Dave <niravd@google.com>2017-12-12 18:25:48 +0000
committerNirav Dave <niravd@google.com>2017-12-12 18:25:48 +0000
commit28ea9743f6196ea74f728cdb9d74d4f922bad1e8 (patch)
tree9ed44e680c2a73a60b43d5c4f6690400d2f3243d /lib
parent68f6731be39f859d621a217588a94e406f0b9823 (diff)
[X86] Cleanup type conversion of 64-bit load-store pairs.
Summary: Simplify and generalize chain handling and search for 64-bit load-store pairs. Nontemporal test now converts 64-bit integer load-store into f64 which it realizes directly instead of splitting into two i32 pairs. Reviewers: craig.topper, spatel Reviewed By: craig.topper Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D40918 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320505 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp55
1 files changed, 14 insertions, 41 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 0ab6c106cd0..cb98850133a 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -34474,28 +34474,10 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
isa<LoadSDNode>(St->getValue()) &&
!cast<LoadSDNode>(St->getValue())->isVolatile() &&
St->getChain().hasOneUse() && !St->isVolatile()) {
- SDNode* LdVal = St->getValue().getNode();
- LoadSDNode *Ld = nullptr;
- int TokenFactorIndex = -1;
+ LoadSDNode *Ld = cast<LoadSDNode>(St->getValue().getNode());
SmallVector<SDValue, 8> Ops;
- SDNode* ChainVal = St->getChain().getNode();
- // Must be a store of a load. We currently handle two cases: the load
- // is a direct child, and it's under an intervening TokenFactor. It is
- // possible to dig deeper under nested TokenFactors.
- if (ChainVal == LdVal)
- Ld = cast<LoadSDNode>(St->getChain());
- else if (St->getValue().hasOneUse() &&
- ChainVal->getOpcode() == ISD::TokenFactor) {
- for (unsigned i = 0, e = ChainVal->getNumOperands(); i != e; ++i) {
- if (ChainVal->getOperand(i).getNode() == LdVal) {
- TokenFactorIndex = i;
- Ld = cast<LoadSDNode>(St->getValue());
- } else
- Ops.push_back(ChainVal->getOperand(i));
- }
- }
- if (!Ld || !ISD::isNormalLoad(Ld))
+ if (!ISD::isNormalLoad(Ld))
return SDValue();
// If this is not the MMX case, i.e. we are just turning i64 load/store
@@ -34512,17 +34494,12 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
if (Subtarget.is64Bit() || F64IsLegal) {
MVT LdVT = Subtarget.is64Bit() ? MVT::i64 : MVT::f64;
SDValue NewLd = DAG.getLoad(LdVT, LdDL, Ld->getChain(), Ld->getBasePtr(),
- Ld->getPointerInfo(), Ld->getAlignment(),
- Ld->getMemOperand()->getFlags());
+ Ld->getMemOperand());
+
// Make sure new load is placed in same chain order.
- SDValue NewChain = DAG.makeEquivalentMemoryOrdering(Ld, NewLd);
- if (TokenFactorIndex >= 0) {
- Ops.push_back(NewChain);
- NewChain = DAG.getNode(ISD::TokenFactor, LdDL, MVT::Other, Ops);
- }
- return DAG.getStore(NewChain, StDL, NewLd, St->getBasePtr(),
- St->getPointerInfo(), St->getAlignment(),
- St->getMemOperand()->getFlags());
+ DAG.makeEquivalentMemoryOrdering(Ld, NewLd);
+ return DAG.getStore(St->getChain(), StDL, NewLd, St->getBasePtr(),
+ St->getMemOperand());
}
// Otherwise, lower to two pairs of 32-bit loads / stores.
@@ -34537,23 +34514,19 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
MinAlign(Ld->getAlignment(), 4),
Ld->getMemOperand()->getFlags());
// Make sure new loads are placed in same chain order.
- SDValue NewChain = DAG.makeEquivalentMemoryOrdering(Ld, LoLd);
- NewChain = DAG.makeEquivalentMemoryOrdering(Ld, HiLd);
-
- if (TokenFactorIndex >= 0) {
- Ops.push_back(NewChain);
- NewChain = DAG.getNode(ISD::TokenFactor, LdDL, MVT::Other, Ops);
- }
+ DAG.makeEquivalentMemoryOrdering(Ld, LoLd);
+ DAG.makeEquivalentMemoryOrdering(Ld, HiLd);
LoAddr = St->getBasePtr();
HiAddr = DAG.getMemBasePlusOffset(LoAddr, 4, StDL);
SDValue LoSt =
- DAG.getStore(NewChain, StDL, LoLd, LoAddr, St->getPointerInfo(),
+ DAG.getStore(St->getChain(), StDL, LoLd, LoAddr, St->getPointerInfo(),
St->getAlignment(), St->getMemOperand()->getFlags());
- SDValue HiSt = DAG.getStore(
- NewChain, StDL, HiLd, HiAddr, St->getPointerInfo().getWithOffset(4),
- MinAlign(St->getAlignment(), 4), St->getMemOperand()->getFlags());
+ SDValue HiSt = DAG.getStore(St->getChain(), StDL, HiLd, HiAddr,
+ St->getPointerInfo().getWithOffset(4),
+ MinAlign(St->getAlignment(), 4),
+ St->getMemOperand()->getFlags());
return DAG.getNode(ISD::TokenFactor, StDL, MVT::Other, LoSt, HiSt);
}