simplify IsChainCompatible codegen, add comments. no
authorChris Lattner <sabre@nondot.org>
Wed, 17 Feb 2010 05:35:28 +0000 (05:35 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 17 Feb 2010 05:35:28 +0000 (05:35 +0000)
functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96453 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/DAGISelHeader.h
utils/TableGen/DAGISelEmitter.cpp

index f3eccf0a5eacbc224411f0d4e3a5f7c7511d2dcf..8cd11f6d26790e436a62615872e2fcb8738b80c6 100644 (file)
@@ -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 {
index cba2fc6f2630ba3739d45ab7f1cf7e8f25427b5c..1ac2d94431130883bfeec21d0c498f93d6164a9e 100644 (file)
@@ -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