mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
simplify IsChainCompatible codegen, add comments. no
functionality change. llvm-svn: 96453
This commit is contained in:
parent
b477072a21
commit
abb5e906a7
@ -26,9 +26,8 @@
|
|||||||
/// node list.
|
/// node list.
|
||||||
SelectionDAG::allnodes_iterator ISelPosition;
|
SelectionDAG::allnodes_iterator ISelPosition;
|
||||||
|
|
||||||
/// IsChainCompatible - Returns true if Chain is Op or Chain does
|
/// ChainNotReachable - Returns true if Chain does not reach Op.
|
||||||
/// not reach Op.
|
static bool ChainNotReachable(SDNode *Chain, SDNode *Op) {
|
||||||
static bool IsChainCompatible(SDNode *Chain, SDNode *Op) {
|
|
||||||
if (Chain->getOpcode() == ISD::EntryToken)
|
if (Chain->getOpcode() == ISD::EntryToken)
|
||||||
return true;
|
return true;
|
||||||
if (Chain->getOpcode() == ISD::TokenFactor)
|
if (Chain->getOpcode() == ISD::TokenFactor)
|
||||||
@ -36,11 +35,20 @@ static bool IsChainCompatible(SDNode *Chain, SDNode *Op) {
|
|||||||
if (Chain->getNumOperands() > 0) {
|
if (Chain->getNumOperands() > 0) {
|
||||||
SDValue C0 = Chain->getOperand(0);
|
SDValue C0 = Chain->getOperand(0);
|
||||||
if (C0.getValueType() == MVT::Other)
|
if (C0.getValueType() == MVT::Other)
|
||||||
return C0.getNode() != Op && IsChainCompatible(C0.getNode(), Op);
|
return C0.getNode() != Op && ChainNotReachable(C0.getNode(), Op);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// IsChainCompatible - Returns true if Chain is Op or Chain does not reach Op.
|
||||||
|
/// This is used to ensure that there are no nodes trapped between Chain, which
|
||||||
|
/// is the first chain node discovered in a pattern and Op, a later node, that
|
||||||
|
/// will not be selected into the pattern.
|
||||||
|
static bool IsChainCompatible(SDNode *Chain, SDNode *Op) {
|
||||||
|
return Chain == Op || ChainNotReachable(Chain, Op);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// ISelUpdater - helper class to handle updates of the
|
/// ISelUpdater - helper class to handle updates of the
|
||||||
/// instruciton selection graph.
|
/// instruciton selection graph.
|
||||||
class VISIBILITY_HIDDEN ISelUpdater : public SelectionDAG::DAGUpdateListener {
|
class VISIBILITY_HIDDEN ISelUpdater : public SelectionDAG::DAGUpdateListener {
|
||||||
|
@ -606,10 +606,8 @@ void PatternCodeEmitter::EmitMatchCode(TreePatternNode *N, TreePatternNode *P,
|
|||||||
|
|
||||||
if (NodeHasChain) {
|
if (NodeHasChain) {
|
||||||
if (FoundChain) {
|
if (FoundChain) {
|
||||||
emitCheck("(" + ChainName + ".getNode() == " +
|
emitCheck("IsChainCompatible(" + ChainName + ".getNode(), " +
|
||||||
getNodeName(RootName) + " || "
|
getNodeName(RootName) + ")");
|
||||||
"IsChainCompatible(" + ChainName + ".getNode(), " +
|
|
||||||
getNodeName(RootName) + "))");
|
|
||||||
OrigChains.push_back(std::make_pair(ChainName,
|
OrigChains.push_back(std::make_pair(ChainName,
|
||||||
getValueName(RootName)));
|
getValueName(RootName)));
|
||||||
} else
|
} else
|
||||||
|
Loading…
Reference in New Issue
Block a user