The generated runloop shouldn't require Select to update 'Result'. In fact
authorChris Lattner <sabre@nondot.org>
Tue, 15 Aug 2006 23:42:26 +0000 (23:42 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 15 Aug 2006 23:42:26 +0000 (23:42 +0000)
we'd like to remove result entirely.

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

utils/TableGen/DAGISelEmitter.cpp

index 3b58817cf42aff617064b392c3a92c1be9c570d8..191672f6bb8912a9eb141ba6613650464d4d0751 100644 (file)
@@ -3646,8 +3646,11 @@ OS << "  unsigned NumKilled = ISelKilled.size();\n";
   OS << "  memset(ISelQueued,   0, NumBytes);\n";
   OS << "  memset(ISelSelected, 0, NumBytes);\n";
   OS << "\n";
-  OS << "  SDOperand ResNode;\n";
-  OS << "  Select(ResNode, Root);\n";
+  OS << "  // Create a dummy node (which is not added to allnodes), that adds\n"
+     << "  // a reference to the root node, preventing it from being deleted,\n"
+     << "  // and tracking any changes of the root.\n"
+     << "  HandleSDNode Dummy(CurDAG->getRoot());\n"
+     << "  ISelQueue.push_back(CurDAG->getRoot().Val);\n";
   OS << "  while (!ISelQueue.empty()) {\n";
   OS << "    SDOperand Tmp;\n";
   OS << "    SDNode *Node = ISelQueue.front();\n";
@@ -3663,7 +3666,7 @@ OS << "  unsigned NumKilled = ISelKilled.size();\n";
   OS << "  ISelQueued = NULL;\n";
   OS << "  delete[] ISelSelected;\n";
   OS << "  ISelSelected = NULL;\n";
-  OS << "  return ResNode;\n";
+  OS << "  return Dummy.getValue();\n";
   OS << "}\n";
   
   Intrinsics = LoadIntrinsics(Records);