Prevent unnecessary CopyToReg when the same HW register appears in two spots
authorEvan Cheng <evan.cheng@apple.com>
Thu, 19 Jan 2006 01:55:45 +0000 (01:55 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 19 Jan 2006 01:55:45 +0000 (01:55 +0000)
in the pattern.

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

utils/TableGen/DAGISelEmitter.cpp

index daf63a8dddc1ad6ad59cc2c141f8fa3af98e633b..cd0527729aff8f1dc526a6bfc442b16578d0c4bd 100644 (file)
@@ -1835,6 +1835,7 @@ private:
   std::map<std::string, Record*> OperatorMap;
   // Names of all the folded nodes which produce chains.
   std::vector<std::pair<std::string, unsigned> > FoldedChains;
+  std::set<std::string> Duplicates;
   unsigned TmpNo;
 
 public:
@@ -1952,6 +1953,7 @@ public:
             // previously named thing.
             OS << "      if (" << VarMapEntry << " != " << RootName << OpNo
                << ") goto P" << PatternNo << "Fail;\n";
+            Duplicates.insert(RootName + utostr(OpNo));
             continue;
           }
         }
@@ -2351,6 +2353,13 @@ private:
         EmitCopyToRegs(Child, RootName + utostr(OpNo), ChainEmitted);
       } else {
         if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) {
+          if (!Child->getName().empty()) {
+            std::string Name = RootName + utostr(OpNo);
+            if (Duplicates.find(Name) != Duplicates.end())
+              // A duplicate! Do not emit a copy for this node.
+              continue;
+          }
+
           Record *RR = DI->getDef();
           if (RR->isSubClassOf("Register")) {
             MVT::ValueType RVT = getRegisterValueType(RR, T);