diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-01-19 01:55:45 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-01-19 01:55:45 +0000 |
commit | b4ad33c4aedc124f956ff6866fc73db14be534ee (patch) | |
tree | 25eb05527df589b792d0b47d0e9e986606a6e4f5 | |
parent | d9c45e9af96c3ec5d8228b05908d1465cb3fdbea (diff) |
Prevent unnecessary CopyToReg when the same HW register appears in two spots
in the pattern.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25437 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index daf63a8ddd..cd0527729a 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -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); |