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

Evan Cheng evan.cheng at apple.com
Thu Jan 26 11:13:57 PST 2006



Changes in directory llvm/utils/TableGen:

DAGISelEmitter.cpp updated: 1.143 -> 1.144
---
Log message:

Another folding problem: if a node r/w chain or flag, don't fold it if it
has already been selected. The number of use check is not strong enough since
a node can be replaced with newly created target node. e.g. If the original
node has two uses, when it is selected for one of the uses it is replaced with
another. Each node now has a single use but isel still should not fold it.


---
Diffs of the changes:  (+20 -5)

 DAGISelEmitter.cpp |   25 ++++++++++++++++++++-----
 1 files changed, 20 insertions(+), 5 deletions(-)


Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.143 llvm/utils/TableGen/DAGISelEmitter.cpp:1.144
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.143	Wed Jan 25 20:13:31 2006
+++ llvm/utils/TableGen/DAGISelEmitter.cpp	Thu Jan 26 13:13:45 2006
@@ -1909,7 +1909,8 @@
     unsigned OpNo = 0;
     bool NodeHasChain = NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
     bool HasChain = PatternHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
-    bool EmittedCheck = false;
+    bool EmittedUseCheck = false;
+    bool EmittedSlctedCheck = false;
     if (HasChain) {
       if (NodeHasChain)
         OpNo = 1;
@@ -1917,7 +1918,14 @@
         const SDNodeInfo &CInfo = ISE.getSDNodeInfo(N->getOperator());
         OS << "      if (!" << RootName << ".hasOneUse()) goto P"
            << PatternNo << "Fail;   // Multiple uses of actual result?\n";
-        EmittedCheck = true;
+        EmittedUseCheck = true;
+        // hasOneUse() check is not strong enough. If the original node has
+        // already been selected, it may have been replaced with another.
+        for (unsigned j = 0; j < CInfo.getNumResults(); j++)
+          OS << "      if (CodeGenMap.count(" << RootName
+             << ".getValue(" << j << "))) goto P"
+             << PatternNo << "Fail;   // Already selected?\n";
+        EmittedSlctedCheck = true;
         if (NodeHasChain)
           OS << "      if (CodeGenMap.count(" << RootName
              << ".getValue(" << CInfo.getNumResults() << "))) goto P"
@@ -1933,15 +1941,22 @@
     // FIXME: we really need to separate the concepts of flag and "glue". Those
     // real flag results, e.g. X86CMP output, can have multiple uses.
     // FIXME: If the incoming flag is optional. Then it is ok to fold it.
-    if (!EmittedCheck &&
+    if (!isRoot &&
         (PatternHasProperty(N, SDNodeInfo::SDNPInFlag, ISE) ||
          PatternHasProperty(N, SDNodeInfo::SDNPOptInFlag, ISE) ||
          PatternHasProperty(N, SDNodeInfo::SDNPOutFlag, ISE))) {
-      if (!isRoot) {
-        const SDNodeInfo &CInfo = ISE.getSDNodeInfo(N->getOperator());
+      const SDNodeInfo &CInfo = ISE.getSDNodeInfo(N->getOperator());
+      if (!EmittedUseCheck) {
         OS << "      if (!" << RootName << ".hasOneUse()) goto P"
            << PatternNo << "Fail;   // Multiple uses of actual result?\n";
       }
+      if (!EmittedSlctedCheck)
+        // hasOneUse() check is not strong enough. If the original node has
+        // already been selected, it may have been replaced with another.
+        for (unsigned j = 0; j < CInfo.getNumResults(); j++)
+          OS << "      if (CodeGenMap.count(" << RootName
+             << ".getValue(" << j << "))) goto P"
+             << PatternNo << "Fail;   // Already selected?\n";
     }
 
     for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) {






More information about the llvm-commits mailing list