Fixed a really ugly bug. The TableGen'd isel is not freeing the "inflight set"
authorEvan Cheng <evan.cheng@apple.com>
Thu, 25 May 2006 00:21:44 +0000 (00:21 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 25 May 2006 00:21:44 +0000 (00:21 +0000)
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

utils/TableGen/DAGISelEmitter.cpp

index 5156d9e9318739985da79650c24c5cde9582170b..8f2744f012bcfbea057d60dc15ea5212accc887d 100644 (file)
@@ -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;