Avoid creating a token factor node in trivially redundant cases. This
authorChris Lattner <sabre@nondot.org>
Wed, 9 Nov 2005 05:03:03 +0000 (05:03 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 9 Nov 2005 05:03:03 +0000 (05:03 +0000)
eliminates almost one node per block in common cases.

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

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index ab176c1f61122724acde232cf9d8a9e1ee07adc1..ac4a63049cb16105ce3dc30941e81d84c893ff84 100644 (file)
@@ -1234,7 +1234,18 @@ void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
 
   // Turn all of the unordered chains into one factored node.
   if (!UnorderedChains.empty()) {
-    UnorderedChains.push_back(SDL.getRoot());
+    SDOperand Root = SDL.getRoot();
+    if (Root.getOpcode() != ISD::EntryToken) {
+      unsigned i = 0, e = UnorderedChains.size();
+      for (; i != e; ++i) {
+        assert(UnorderedChains[i].Val->getNumOperands() > 1);
+        if (UnorderedChains[i].Val->getOperand(0) == Root)
+          break;  // Don't add the root if we already indirectly depend on it.
+      }
+        
+      if (i == e)
+        UnorderedChains.push_back(Root);
+    }
     DAG.setRoot(DAG.getNode(ISD::TokenFactor, MVT::Other, UnorderedChains));
   }