aboutsummaryrefslogtreecommitdiffstats
path: root/utils/TableGen
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2005-12-09 06:06:08 +0000
committerEvan Cheng <evan.cheng@apple.com>2005-12-09 06:06:08 +0000
commitcbc09c8eaa1813eb4ad424c9215809322c6b5dd7 (patch)
treeb1f6a54354fdb656152190955c8f3186533f4a82 /utils/TableGen
parentc45146ace5368066e70ada7a35cc4ab851c955e7 (diff)
downloadexternal_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/TableGen')
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp11
-rw-r--r--utils/TableGen/DAGISelEmitter.h2
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>