diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-05-25 00:21:44 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-05-25 00:21:44 +0000 |
commit | b0793f9741f7219c764e23cb99d4bda018e4f56c (patch) | |
tree | 8a6d230d6f4533c5972c46ef36561f04a0784d5a | |
parent | d63b964850f7051a7a96edd5aa31d9d67edbec68 (diff) | |
download | external_llvm-b0793f9741f7219c764e23cb99d4bda018e4f56c.zip external_llvm-b0793f9741f7219c764e23cb99d4bda018e4f56c.tar.gz external_llvm-b0793f9741f7219c764e23cb99d4bda018e4f56c.tar.bz2 |
Fixed a really ugly bug. The TableGen'd isel is not freeing the "inflight set"
correctly. That is causing non-deterministic behavior (and possibly preventing
some load folding from happening).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28458 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 5156d9e..8f2744f 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -2407,20 +2407,32 @@ public: std::string Fn = CP->getSelectFunc(); NumRes = CP->getNumOperands(); for (unsigned i = 0; i < NumRes; ++i) - emitDecl("Tmp" + utostr(i+ResNo)); + emitDecl("CPTmp" + utostr(i+ResNo)); - std::string Code = Fn + "(" + Val; + std::string Code = "bool Match = " + Fn + "(" + Val; for (unsigned i = 0; i < NumRes; i++) - Code += ", Tmp" + utostr(i + ResNo); - emitCheck(Code + ")"); + Code += ", CPTmp" + utostr(i + ResNo); + emitCode(Code + ");"); + if (InflightNodes.size()) { + // Remove the in-flight nodes if the ComplexPattern does not match! + emitCode("if (!Match) {"); + for (std::vector<std::string>::iterator AI = InflightNodes.begin(), + AE = InflightNodes.end(); AI != AE; ++AI) + emitCode(" InFlightSet.erase(" + *AI + ".Val);"); + emitCode("}"); + } + + emitCheck("Match"); for (unsigned i = 0; i < NumRes; ++i) { - emitCode("InFlightSet.insert(Tmp" + utostr(i+ResNo) + ".Val);"); - InflightNodes.push_back("Tmp" + utostr(i+ResNo)); + emitCode("InFlightSet.insert(CPTmp" + utostr(i+ResNo) + ".Val);"); + InflightNodes.push_back("CPTmp" + utostr(i+ResNo)); } - for (unsigned i = 0; i < NumRes; ++i) - emitCode("Select(Tmp" + utostr(i+ResNo) + ", Tmp" + + for (unsigned i = 0; i < NumRes; ++i) { + emitDecl("Tmp" + utostr(i+ResNo)); + emitCode("Select(Tmp" + utostr(i+ResNo) + ", CPTmp" + utostr(i+ResNo) + ");"); + } TmpNo = ResNo + NumRes; } else { @@ -2524,7 +2536,6 @@ public: // Make sure these operands which would be selected won't be folded while // the isel traverses the DAG upward. - std::vector<std::pair<unsigned, unsigned> > NumTemps(EmitOrder.size()); for (unsigned i = 0, e = EmitOrder.size(); i != e; ++i) { TreePatternNode *Child = EmitOrder[i].second; if (!Child->getName().empty()) { @@ -2539,6 +2550,7 @@ public: } // Emit all of the operands. + std::vector<std::pair<unsigned, unsigned> > NumTemps(EmitOrder.size()); for (unsigned i = 0, e = EmitOrder.size(); i != e; ++i) { unsigned OpOrder = EmitOrder[i].first; TreePatternNode *Child = EmitOrder[i].second; |