From d9c1a344a0526dd6b82a8bfc1885fcaeb289be29 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 17 Feb 2010 05:35:28 +0000 Subject: [PATCH] simplify IsChainCompatible codegen, add comments. no functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96453 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/DAGISelHeader.h | 16 ++++++++++++---- utils/TableGen/DAGISelEmitter.cpp | 6 ++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/llvm/CodeGen/DAGISelHeader.h b/include/llvm/CodeGen/DAGISelHeader.h index f3eccf0a5ea..8cd11f6d267 100644 --- a/include/llvm/CodeGen/DAGISelHeader.h +++ b/include/llvm/CodeGen/DAGISelHeader.h @@ -26,9 +26,8 @@ /// node list. SelectionDAG::allnodes_iterator ISelPosition; -/// IsChainCompatible - Returns true if Chain is Op or Chain does -/// not reach Op. -static bool IsChainCompatible(SDNode *Chain, SDNode *Op) { +/// ChainNotReachable - Returns true if Chain does not reach Op. +static bool ChainNotReachable(SDNode *Chain, SDNode *Op) { if (Chain->getOpcode() == ISD::EntryToken) return true; if (Chain->getOpcode() == ISD::TokenFactor) @@ -36,11 +35,20 @@ static bool IsChainCompatible(SDNode *Chain, SDNode *Op) { if (Chain->getNumOperands() > 0) { SDValue C0 = Chain->getOperand(0); if (C0.getValueType() == MVT::Other) - return C0.getNode() != Op && IsChainCompatible(C0.getNode(), Op); + return C0.getNode() != Op && ChainNotReachable(C0.getNode(), Op); } 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 /// instruciton selection graph. class VISIBILITY_HIDDEN ISelUpdater : public SelectionDAG::DAGUpdateListener { diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index cba2fc6f263..1ac2d944311 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -606,10 +606,8 @@ void PatternCodeEmitter::EmitMatchCode(TreePatternNode *N, TreePatternNode *P, if (NodeHasChain) { if (FoundChain) { - emitCheck("(" + ChainName + ".getNode() == " + - getNodeName(RootName) + " || " - "IsChainCompatible(" + ChainName + ".getNode(), " + - getNodeName(RootName) + "))"); + emitCheck("IsChainCompatible(" + ChainName + ".getNode(), " + + getNodeName(RootName) + ")"); OrigChains.push_back(std::make_pair(ChainName, getValueName(RootName))); } else -- 2.34.1