summaryrefslogtreecommitdiff
path: root/utils/TableGen/DAGISelEmitter.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-05-25 00:21:44 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-05-25 00:21:44 +0000
commitb0793f9741f7219c764e23cb99d4bda018e4f56c (patch)
tree8a6d230d6f4533c5972c46ef36561f04a0784d5a /utils/TableGen/DAGISelEmitter.cpp
parentd63b964850f7051a7a96edd5aa31d9d67edbec68 (diff)
downloadllvm-b0793f9741f7219c764e23cb99d4bda018e4f56c.tar.gz
llvm-b0793f9741f7219c764e23cb99d4bda018e4f56c.tar.bz2
llvm-b0793f9741f7219c764e23cb99d4bda018e4f56c.tar.xz
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
Diffstat (limited to 'utils/TableGen/DAGISelEmitter.cpp')
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp30
1 files changed, 21 insertions, 9 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 5156d9e931..8f2744f012 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;