Prevent folding of instructions which produce chains that have more than 1 real use
authorEvan Cheng <evan.cheng@apple.com>
Fri, 9 Dec 2005 06:06:08 +0000 (06:06 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 9 Dec 2005 06:06:08 +0000 (06:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24643 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp
utils/TableGen/DAGISelEmitter.h

index 4d7ee292c6c98e76523200ec5817738bd65233b8..44733cd103b35e116c03e15967e73ffadf25d95b 100644 (file)
@@ -1691,11 +1691,12 @@ struct PatternSortingPredicate {
 /// matches, and the SDNode for the result has the RootName specified name.
 void DAGISelEmitter::EmitMatchForPattern(TreePatternNode *N,
                                          const std::string &RootName,
-                                         std::map<std::string,std::string> &VarMap,
+                                      std::map<std::string,std::string> &VarMap,
                                          unsigned PatternNo, 
                                          std::ostream &OS,
                                          std::string &ChainName,
-                                         bool &HasChain, bool &InFlag) {
+                                         bool &HasChain, bool &InFlag,
+                                         bool isRoot) {
   if (N->isLeaf()) {
     if (IntInit *II = dynamic_cast<IntInit*>(N->getLeafValue())) {
       OS << "      if (cast<ConstantSDNode>(" << RootName
@@ -1731,6 +1732,10 @@ void DAGISelEmitter::EmitMatchForPattern(TreePatternNode *N,
 
   if (NodeHasChain(N, *this)) {
     OpNo = 1;
+    if (!isRoot) {
+      OS << "      if (" << RootName << ".hasOneUse()) goto P"
+         << PatternNo << "Fail;\n";
+    }
     if (!HasChain) {
       HasChain = true;
       OS << "      SDOperand " << RootName << "0 = " << RootName
@@ -2143,7 +2148,7 @@ void DAGISelEmitter::EmitCodeForPattern(PatternToMatch &Pattern,
   std::map<std::string,std::string> VariableMap;
   std::string ChainName;
   EmitMatchForPattern(Pattern.first, "N", VariableMap, PatternNo, OS,
-                      ChainName, HasChain, InFlag);
+                      ChainName, HasChain, InFlag, true /*the root*/);
   
   // TP - Get *SOME* tree pattern, we don't care which.
   TreePattern &TP = *PatternFragments.begin()->second;
index 0a2ab891d94b7514c616189cce8ddfb7d65c3404..84985b45ae5ffb7c100463ed3541669acce82d91 100644 (file)
@@ -425,7 +425,7 @@ private:
                            std::map<std::string,std::string> &VarMap,
                            unsigned PatternNo, std::ostream &OS,
                            std::string &ChainName,
-                           bool &HasChain, bool &InFlag);
+                           bool &HasChain, bool &InFlag, bool isRoot = false);
   void EmitCopyToRegsForPattern(TreePatternNode *N, const std::string &RootName,
                                 std::ostream &OS, bool HasChain);
   std::pair<unsigned, unsigned>