[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