mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[DAG] add helper to bind memop chains; NFCI
This step is just intended to reduce code duplication rather than change any functionality. A follow-up would be to replace PPCTargetLowering::spliceIntoChain() usage with this new helper. Differential Revision: https://reviews.llvm.org/D33649 llvm-svn: 305192
This commit is contained in:
parent
d56de0dbb2
commit
21f1293d28
@ -1217,6 +1217,12 @@ public:
|
||||
void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
|
||||
unsigned Num);
|
||||
|
||||
/// If an existing load has uses of its chain, create a token factor node with
|
||||
/// that chain and the new memory node's chain and update users of the old
|
||||
/// chain to the token factor. This ensures that the new memory node will have
|
||||
/// the same relative memory dependency position as the old load.
|
||||
void makeEquivalentMemoryOrdering(LoadSDNode *Old, SDValue New);
|
||||
|
||||
/// Topological-sort the AllNodes list and a
|
||||
/// assign a unique node id for each node in the DAG based on their
|
||||
/// topological order. Returns the number of nodes.
|
||||
|
@ -14693,21 +14693,7 @@ static SDValue narrowExtractedVectorLoad(SDNode *Extract, SelectionDAG &DAG) {
|
||||
MachineMemOperand *MMO = MF.getMachineMemOperand(Ld->getMemOperand(), Offset,
|
||||
VT.getStoreSize());
|
||||
SDValue NewLd = DAG.getLoad(VT, DL, Ld->getChain(), NewAddr, MMO);
|
||||
|
||||
// The new load must have the same position as the old load in terms of memory
|
||||
// dependency. Create a TokenFactor for Ld and NewLd and update uses of Ld's
|
||||
// output chain to use that TokenFactor.
|
||||
// TODO: This code is based on a similar sequence in x86 lowering. It should
|
||||
// be moved to a helper function, so it can be shared and reused.
|
||||
if (Ld->hasAnyUseOfValue(1)) {
|
||||
SDValue OldChain = SDValue(Ld, 1);
|
||||
SDValue NewChain = SDValue(NewLd.getNode(), 1);
|
||||
SDValue TokenFactor = DAG.getNode(ISD::TokenFactor, DL, MVT::Other,
|
||||
OldChain, NewChain);
|
||||
DAG.ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
|
||||
DAG.UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewChain);
|
||||
}
|
||||
|
||||
DAG.makeEquivalentMemoryOrdering(Ld, NewLd);
|
||||
return NewLd;
|
||||
}
|
||||
|
||||
|
@ -7244,6 +7244,24 @@ void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) {
|
||||
AddDbgValue(I, ToNode, false);
|
||||
}
|
||||
|
||||
void SelectionDAG::makeEquivalentMemoryOrdering(LoadSDNode *OldLoad,
|
||||
SDValue NewMemOp) {
|
||||
assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
|
||||
if (!OldLoad->hasAnyUseOfValue(1))
|
||||
return;
|
||||
|
||||
// The new memory operation must have the same position as the old load in
|
||||
// terms of memory dependency. Create a TokenFactor for the old load and new
|
||||
// memory operation and update uses of the old load's output chain to use that
|
||||
// TokenFactor.
|
||||
SDValue OldChain = SDValue(OldLoad, 1);
|
||||
SDValue NewChain = SDValue(NewMemOp.getNode(), 1);
|
||||
SDValue TokenFactor =
|
||||
getNode(ISD::TokenFactor, SDLoc(OldLoad), MVT::Other, OldChain, NewChain);
|
||||
ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
|
||||
UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewChain);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// SDNode Class
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -6819,6 +6819,7 @@ bool PPCTargetLowering::canReuseLoadAddress(SDValue Op, EVT MemVT,
|
||||
// Given the head of the old chain, ResChain, insert a token factor containing
|
||||
// it and NewResChain, and make users of ResChain now be users of that token
|
||||
// factor.
|
||||
// TODO: Remove and use DAG::makeEquivalentMemoryOrdering() instead.
|
||||
void PPCTargetLowering::spliceIntoChain(SDValue ResChain,
|
||||
SDValue NewResChain,
|
||||
SelectionDAG &DAG) const {
|
||||
|
@ -6491,16 +6491,7 @@ static SDValue EltsFromConsecutiveLoads(EVT VT, ArrayRef<SDValue> Elts,
|
||||
SDValue NewLd =
|
||||
DAG.getLoad(VT, DL, LDBase->getChain(), LDBase->getBasePtr(),
|
||||
LDBase->getPointerInfo(), LDBase->getAlignment(), MMOFlags);
|
||||
|
||||
if (LDBase->hasAnyUseOfValue(1)) {
|
||||
SDValue NewChain =
|
||||
DAG.getNode(ISD::TokenFactor, DL, MVT::Other, SDValue(LDBase, 1),
|
||||
SDValue(NewLd.getNode(), 1));
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(LDBase, 1), NewChain);
|
||||
DAG.UpdateNodeOperands(NewChain.getNode(), SDValue(LDBase, 1),
|
||||
SDValue(NewLd.getNode(), 1));
|
||||
}
|
||||
|
||||
DAG.makeEquivalentMemoryOrdering(LDBase, NewLd);
|
||||
return NewLd;
|
||||
};
|
||||
|
||||
@ -6565,19 +6556,7 @@ static SDValue EltsFromConsecutiveLoads(EVT VT, ArrayRef<SDValue> Elts,
|
||||
LDBase->getAlignment(),
|
||||
false/*isVolatile*/, true/*ReadMem*/,
|
||||
false/*WriteMem*/);
|
||||
|
||||
// Make sure the newly-created LOAD is in the same position as LDBase in
|
||||
// terms of dependency. We create a TokenFactor for LDBase and ResNode,
|
||||
// and update uses of LDBase's output chain to use the TokenFactor.
|
||||
if (LDBase->hasAnyUseOfValue(1)) {
|
||||
SDValue NewChain =
|
||||
DAG.getNode(ISD::TokenFactor, DL, MVT::Other, SDValue(LDBase, 1),
|
||||
SDValue(ResNode.getNode(), 1));
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(LDBase, 1), NewChain);
|
||||
DAG.UpdateNodeOperands(NewChain.getNode(), SDValue(LDBase, 1),
|
||||
SDValue(ResNode.getNode(), 1));
|
||||
}
|
||||
|
||||
DAG.makeEquivalentMemoryOrdering(LDBase, ResNode);
|
||||
return DAG.getBitcast(VT, ResNode);
|
||||
}
|
||||
}
|
||||
@ -9930,17 +9909,7 @@ static SDValue lowerVectorShuffleAsBroadcast(const SDLoc &DL, MVT VT,
|
||||
V = DAG.getLoad(SVT, DL, Ld->getChain(), NewAddr,
|
||||
DAG.getMachineFunction().getMachineMemOperand(
|
||||
Ld->getMemOperand(), Offset, SVT.getStoreSize()));
|
||||
|
||||
// Make sure the newly-created LOAD is in the same position as Ld in
|
||||
// terms of dependency. We create a TokenFactor for Ld and V,
|
||||
// and update uses of Ld's output chain to use the TokenFactor.
|
||||
if (Ld->hasAnyUseOfValue(1)) {
|
||||
SDValue NewChain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other,
|
||||
SDValue(Ld, 1), SDValue(V.getNode(), 1));
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(Ld, 1), NewChain);
|
||||
DAG.UpdateNodeOperands(NewChain.getNode(), SDValue(Ld, 1),
|
||||
SDValue(V.getNode(), 1));
|
||||
}
|
||||
DAG.makeEquivalentMemoryOrdering(Ld, V);
|
||||
} else if (!BroadcastFromReg) {
|
||||
// We can't broadcast from a vector register.
|
||||
return SDValue();
|
||||
|
Loading…
x
Reference in New Issue
Block a user