diff options
author | Evan Cheng <evan.cheng@apple.com> | 2005-12-09 06:06:08 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2005-12-09 06:06:08 +0000 |
commit | cbc09c8eaa1813eb4ad424c9215809322c6b5dd7 (patch) | |
tree | b1f6a54354fdb656152190955c8f3186533f4a82 /utils | |
parent | c45146ace5368066e70ada7a35cc4ab851c955e7 (diff) | |
download | external_llvm-cbc09c8eaa1813eb4ad424c9215809322c6b5dd7.zip external_llvm-cbc09c8eaa1813eb4ad424c9215809322c6b5dd7.tar.gz external_llvm-cbc09c8eaa1813eb4ad424c9215809322c6b5dd7.tar.bz2 |
Prevent folding of instructions which produce chains that have more than 1 real use
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24643 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 11 | ||||
-rw-r--r-- | utils/TableGen/DAGISelEmitter.h | 2 |
2 files changed, 9 insertions, 4 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 4d7ee29..44733cd 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -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; diff --git a/utils/TableGen/DAGISelEmitter.h b/utils/TableGen/DAGISelEmitter.h index 0a2ab89..84985b4 100644 --- a/utils/TableGen/DAGISelEmitter.h +++ b/utils/TableGen/DAGISelEmitter.h @@ -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> |