1
0
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:
Chris Lattner 2010-02-17 05:35:28 +00:00
parent b477072a21
commit abb5e906a7
2 changed files with 14 additions and 8 deletions

View File

@ -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 {

View File

@ -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