[llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp

Evan Cheng evan.cheng at apple.com
Sun Sep 10 19:24:57 PDT 2006



Changes in directory llvm/utils/TableGen:

DAGISelEmitter.cpp updated: 1.254 -> 1.255
---
Log message:

1) With X86 lowering change, the following can no longer happen since 
   the branch's chain is also produced by cmp.
          [ch, r : ld]
             ^ ^
             | |
      [XX]--/   \- [flag : cmp]
       ^             ^
       |             |
       \---[br flag]-

Remove an isel check which prevents loads from being folded into cmp / test
instructions.

2) Whenever possible, delete a selected node to allow more load folding
opportunities. Note not all nodes can be deleted after it has been
selected. Some may have simply morphed; some have not changed at all (e.g.
EntryToken).


---
Diffs of the changes:  (+16 -19)

 DAGISelEmitter.cpp |   35 ++++++++++++++++-------------------
 1 files changed, 16 insertions(+), 19 deletions(-)


Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.254 llvm/utils/TableGen/DAGISelEmitter.cpp:1.255
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.254	Fri Sep  8 02:26:39 2006
+++ llvm/utils/TableGen/DAGISelEmitter.cpp	Sun Sep 10 21:24:43 2006
@@ -2246,24 +2246,6 @@
         emitCheck(RootName + ".hasOneUse()");
         EmittedUseCheck = true;
         if (NodeHasChain) {
-          // FIXME: Don't fold if 1) the parent node writes a flag, 2) the node
-          // has a chain use.
-          // This a workaround for this problem:
-          //
-          //          [ch, r : ld]
-          //             ^ ^
-          //             | |
-          //      [XX]--/   \- [flag : cmp]
-          //       ^             ^
-          //       |             |
-          //       \---[br flag]-
-          //
-          // cmp + br should be considered as a single node as they are flagged
-          // together. So, if the ld is folded into the cmp, the XX node in the
-          // graph is now both an operand and a use of the ld/cmp/br node.
-          if (NodeHasProperty(P, SDNodeInfo::SDNPOutFlag, ISE))
-            emitCheck(ParentName + ".Val->isOnlyUse(" +  RootName + ".Val)");
-
           // If the immediate use can somehow reach this node through another
           // path, then can't fold it either or it will create a cycle.
           // e.g. In the following diagram, XX can reach ld through YY. If
@@ -3629,6 +3611,16 @@
   OS << "  RemoveKilled();\n";
   OS << "}\n\n";
 
+  OS << "void DeleteNode(SDNode *N) {\n";
+  OS << "  CurDAG->DeleteNode(N);\n";
+  OS << "  for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); "
+     << "I != E; ++I) {\n";
+  OS << "    SDNode *Operand = I->Val;\n";
+  OS << "    if (Operand->use_empty())\n";
+  OS << "      DeleteNode(Operand);\n";
+  OS << "  }\n";
+  OS << "}\n";
+
   OS << "// SelectRoot - Top level entry to DAG isel.\n";
   OS << "SDOperand SelectRoot(SDOperand Root) {\n";
   OS << "  SelectRootInit();\n";
@@ -3649,7 +3641,12 @@
   OS << "    ISelQueue.pop_back();\n";
   OS << "    if (!isSelected(Node->getNodeId())) {\n";
   OS << "      SDNode *ResNode = Select(SDOperand(Node, 0));\n";
-  OS << "      if (ResNode && ResNode != Node) ReplaceUses(Node, ResNode);\n";
+  OS << "      if (ResNode != Node) {\n";
+  OS << "        if (ResNode)\n";
+  OS << "          ReplaceUses(Node, ResNode);\n";
+  OS << "        if (Node->use_empty()) // Don't delete EntryToken, etc.\n";
+  OS << "          DeleteNode(Node);\n";
+  OS << "      }\n";
   OS << "    }\n";
   OS << "  }\n";
   OS << "\n";






More information about the llvm-commits mailing list