The dag combiner is missing revisiting nodes that it really should, and thus leaving
authorChris Lattner <sabre@nondot.org>
Thu, 24 Jan 2008 07:18:21 +0000 (07:18 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 24 Jan 2008 07:18:21 +0000 (07:18 +0000)
dead stuff around.  This gets fed into the isel pass and causes certain foldings from
happening because nodes have extraneous uses floating around.  For example, if we turned
foo(bar(x)) -> baz(x), we sometimes left bar(x) around.

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

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index 5ebda953fbd3a18453345b6fd71518a21c088fec..788c8c04a8211827cb4b6060ee209c2d331c6129 100644 (file)
@@ -606,6 +606,11 @@ void DAGCombiner::Run(bool RunningAfterLegalize) {
         // Push the new node and any users onto the worklist
         AddToWorkList(RV.Val);
         AddUsersToWorkList(RV.Val);
+        
+        // Add any uses of the old node to the worklist if they have a single
+        // use.  They may be dead after this node is deleted.
+        for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
+          AddToWorkList(N->getOperand(i).Val);
           
         // Nodes can be reintroduced into the worklist.  Make sure we do not
         // process a node that has been replaced.