bugfix: remember that ResNode was declared.
[oota-llvm.git] / utils / TableGen / DAGISelEmitter.cpp
index 0b176088a0e20a87c5a4411adcc481dacad8af4b..e10558ef726fadf995774a9c605a0a334ac6010a 100644 (file)
@@ -16,6 +16,7 @@
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/MathExtras.h"
+#include "llvm/Support/Streams.h"
 #include <algorithm>
 #include <set>
 using namespace llvm;
@@ -109,7 +110,7 @@ SDTypeConstraint::SDTypeConstraint(Record *R) {
     x.SDTCisIntVectorOfSameSize_Info.OtherOperandNum =
       R->getValueAsInt("OtherOpNum");
   } else {
-    std::cerr << "Unrecognized SDTypeConstraint '" << R->getName() << "'!\n";
+    cerr << "Unrecognized SDTypeConstraint '" << R->getName() << "'!\n";
     exit(1);
   }
 }
@@ -123,9 +124,9 @@ TreePatternNode *SDTypeConstraint::getOperandNum(unsigned OpNo,
          "We only work with nodes with zero or one result so far!");
   
   if (OpNo >= (NumResults + N->getNumChildren())) {
-    std::cerr << "Invalid operand number " << OpNo << " ";
+    cerr << "Invalid operand number " << OpNo << " ";
     N->dump();
-    std::cerr << '\n';
+    cerr << '\n';
     exit(1);
   }
 
@@ -316,8 +317,8 @@ SDNodeInfo::SDNodeInfo(Record *R) : Def(R) {
     } else if (PropList[i]->getName() == "SDNPOptInFlag") {
       Properties |= 1 << SDNPOptInFlag;
     } else {
-      std::cerr << "Unknown SD Node property '" << PropList[i]->getName()
-                << "' on node '" << R->getName() << "'!\n";
+      cerr << "Unknown SD Node property '" << PropList[i]->getName()
+           << "' on node '" << R->getName() << "'!\n";
       exit(1);
     }
   }
@@ -412,7 +413,7 @@ bool TreePatternNode::UpdateNodeType(const std::vector<unsigned char> &ExtVTs,
 
   if (isLeaf()) {
     dump();
-    std::cerr << " ";
+    cerr << " ";
     TP.error("Type inference contradiction found in node!");
   } else {
     TP.error("Type inference contradiction found in node " + 
@@ -468,7 +469,7 @@ void TreePatternNode::print(std::ostream &OS) const {
 
 }
 void TreePatternNode::dump() const {
-  print(std::cerr);
+  print(*cerr.stream());
 }
 
 /// isIsomorphicTo - Return true if this node is recursively isomorphic to
@@ -1009,9 +1010,9 @@ TreePatternNode *TreePattern::ParseTreePattern(DagInit *Dag) {
         error("Constant int argument should not have a name!");
       Children.push_back(Node);
     } else {
-      std::cerr << '"';
+      cerr << '"';
       Arg->dump();
-      std::cerr << "\": ";
+      cerr << "\": ";
       error("Unknown leaf value for tree pattern!");
     }
   }
@@ -1081,7 +1082,7 @@ void TreePattern::print(std::ostream &OS) const {
     OS << "]\n";
 }
 
-void TreePattern::dump() const { print(std::cerr); }
+void TreePattern::dump() const { print(*cerr.stream()); }
 
 
 
@@ -1622,7 +1623,7 @@ void DAGISelEmitter::ParseInstructions() {
     if (I == 0) continue;  // No pattern.
 
     if (I->getNumTrees() != 1) {
-      std::cerr << "CANNOT HANDLE: " << I->getRecord()->getName() << " yet!";
+      cerr << "CANNOT HANDLE: " << I->getRecord()->getName() << " yet!";
       continue;
     }
     TreePatternNode *Pattern = I->getTree(0);
@@ -1949,7 +1950,7 @@ static void GenerateVariantsOf(TreePatternNode *N,
 // match multiple ways.  Add them to PatternsToMatch as well.
 void DAGISelEmitter::GenerateVariants() {
   
-  DEBUG(std::cerr << "Generating instruction variants.\n");
+  DOUT << "Generating instruction variants.\n";
   
   // Loop over all of the patterns we've collected, checking to see if we can
   // generate variants of the instruction, through the exploitation of
@@ -1970,23 +1971,23 @@ void DAGISelEmitter::GenerateVariants() {
     if (Variants.empty())  // No variants for this pattern.
       continue;
 
-    DEBUG(std::cerr << "FOUND VARIANTS OF: ";
-          PatternsToMatch[i].getSrcPattern()->dump();
-          std::cerr << "\n");
+    DOUT << "FOUND VARIANTS OF: ";
+    DEBUG(PatternsToMatch[i].getSrcPattern()->dump());
+    DOUT << "\n";
 
     for (unsigned v = 0, e = Variants.size(); v != e; ++v) {
       TreePatternNode *Variant = Variants[v];
 
-      DEBUG(std::cerr << "  VAR#" << v <<  ": ";
-            Variant->dump();
-            std::cerr << "\n");
+      DOUT << "  VAR#" << v <<  ": ";
+      DEBUG(Variant->dump());
+      DOUT << "\n";
       
       // Scan to see if an instruction or explicit pattern already matches this.
       bool AlreadyExists = false;
       for (unsigned p = 0, e = PatternsToMatch.size(); p != e; ++p) {
         // Check to see if this variant already exists.
         if (Variant->isIsomorphicTo(PatternsToMatch[p].getSrcPattern())) {
-          DEBUG(std::cerr << "  *** ALREADY EXISTS, ignoring variant.\n");
+          DOUT << "  *** ALREADY EXISTS, ignoring variant.\n";
           AlreadyExists = true;
           break;
         }
@@ -2001,7 +2002,7 @@ void DAGISelEmitter::GenerateVariants() {
                                  PatternsToMatch[i].getAddedComplexity()));
     }
 
-    DEBUG(std::cerr << "\n");
+    DOUT << "\n";
   }
 }
 
@@ -2160,7 +2161,7 @@ static void RemoveAllTypes(TreePatternNode *N) {
 Record *DAGISelEmitter::getSDNodeNamed(const std::string &Name) const {
   Record *N = Records.getDef(Name);
   if (!N || !N->isSubClassOf("SDNode")) {
-    std::cerr << "Error getting SDNode '" << Name << "'!\n";
+    cerr << "Error getting SDNode '" << Name << "'!\n";
     exit(1);
   }
   return N;
@@ -2569,7 +2570,7 @@ public:
         } else {
 #ifndef NDEBUG
           Child->dump();
-          std::cerr << " ";
+          cerr << " ";
 #endif
           assert(0 && "Unknown leaf type!");
         }
@@ -2620,7 +2621,10 @@ public:
         assert(N->getExtTypes().size() == 1 && "Multiple types not handled!");
         std::string CastType;
         switch (N->getTypeNum(0)) {
-        default: assert(0 && "Unknown type for constant node!");
+        default:
+          cerr << "Cannot handle " << getEnumName(N->getTypeNum(0))
+               << " type as an immediate constant. Aborting\n";
+          abort();
         case MVT::i1:  CastType = "bool"; break;
         case MVT::i8:  CastType = "unsigned char"; break;
         case MVT::i16: CastType = "unsigned short"; break;
@@ -2650,10 +2654,12 @@ public:
         } else {
           NodeOps.push_back(Val);
         }
-      } else if (!N->isLeaf() && N->getOperator()->getName() == "tglobaladdr") {
+      } else if (!N->isLeaf() && (N->getOperator()->getName() == "tglobaladdr"
+                 || N->getOperator()->getName() == "tglobaltlsaddr")) {
         Record *Op = OperatorMap[N->getName()];
         // Transform GlobalAddress to TargetGlobalAddress
-        if (Op && Op->getName() == "globaladdr") {
+        if (Op && (Op->getName() == "globaladdr" ||
+                   Op->getName() == "globaltlsaddr")) {
           emitCode("SDOperand Tmp" + utostr(ResNo) + " = CurDAG->getTarget"
                    "GlobalAddress(cast<GlobalAddressSDNode>(" + Val +
                    ")->getGlobal(), " + getEnumName(N->getTypeNum(0)) +
@@ -2845,9 +2851,10 @@ public:
           Code2 = "SDOperand " + NodeName + " = SDOperand(";
         } else {
           NodeName = "ResNode";
-          if (!ResNodeDecled)
+          if (!ResNodeDecled) {
             Code2 = "SDNode *" + NodeName + " = ";
-          else
+            ResNodeDecled = true;
+          } else
             Code2 = NodeName + " = ";
         }
 
@@ -3068,7 +3075,7 @@ public:
       return NodeOps;
     } else {
       N->dump();
-      std::cerr << "\n";
+      cerr << "\n";
       throw std::string("Unknown node in result pattern!");
     }
   }
@@ -3443,12 +3450,11 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
                     &PatternsToMatch[i]);
         }
       } else {
-        std::cerr << "Unrecognized opcode '";
+        cerr << "Unrecognized opcode '";
         Node->dump();
-        std::cerr << "' on tree pattern '";
-        std::cerr << 
-           PatternsToMatch[i].getDstPattern()->getOperator()->getName();
-        std::cerr << "'!\n";
+        cerr << "' on tree pattern '";
+        cerr << PatternsToMatch[i].getDstPattern()->getOperator()->getName();
+        cerr << "'!\n";
         exit(1);
       }
     }
@@ -3534,9 +3540,9 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
         // If this pattern definitely matches, and if it isn't the last one, the
         // patterns after it CANNOT ever match.  Error out.
         if (mightNotMatch == false && i != CodeForPatterns.size()-1) {
-          std::cerr << "Pattern '";
-          CodeForPatterns[i].first->getSrcPattern()->print(std::cerr);
-          std::cerr << "' is impossible to select!\n";
+          cerr << "Pattern '";
+          CodeForPatterns[i].first->getSrcPattern()->print(*cerr.stream());
+          cerr << "' is impossible to select!\n";
           exit(1);
         }
       }
@@ -3650,7 +3656,7 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
       // If the last pattern has predicates (which could fail) emit code to
       // catch the case where nothing handles a pattern.
       if (mightNotMatch) {
-        OS << "  std::cerr << \"Cannot yet select: \";\n";
+        OS << "  cerr << \"Cannot yet select: \";\n";
         if (OpName != "ISD::INTRINSIC_W_CHAIN" &&
             OpName != "ISD::INTRINSIC_WO_CHAIN" &&
             OpName != "ISD::INTRINSIC_VOID") {
@@ -3658,10 +3664,10 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
         } else {
           OS << "  unsigned iid = cast<ConstantSDNode>(N.getOperand("
             "N.getOperand(0).getValueType() == MVT::Other))->getValue();\n"
-             << "  std::cerr << \"intrinsic %\"<< "
+             << "  cerr << \"intrinsic %\"<< "
             "Intrinsic::getName((Intrinsic::ID)iid);\n";
         }
-        OS << "  std::cerr << '\\n';\n"
+        OS << "  cerr << '\\n';\n"
            << "  abort();\n"
            << "  return NULL;\n";
       }
@@ -3685,6 +3691,16 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
      << "  return New.Val;\n"
      << "}\n\n";
   
+  OS << "SDNode *Select_LABEL(const SDOperand &N) {\n"
+     << "  SDOperand Chain = N.getOperand(0);\n"
+     << "  SDOperand N1 = N.getOperand(1);\n"
+     << "  unsigned C = cast<ConstantSDNode>(N1)->getValue();\n"
+     << "  SDOperand Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n"
+     << "  AddToISelQueue(Chain);\n"
+     << "  return CurDAG->getTargetNode(TargetInstrInfo::LABEL,\n"
+     << "                               MVT::Other, Tmp, Chain);\n"
+     << "}\n\n";
+
   OS << "// The main instruction selector code.\n"
      << "SDNode *SelectCode(SDOperand N) {\n"
      << "  if (N.getOpcode() >= ISD::BUILTIN_OP_END &&\n"
@@ -3703,6 +3719,7 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
      << "  case ISD::TargetConstantPool:\n"
      << "  case ISD::TargetFrameIndex:\n"
      << "  case ISD::TargetJumpTable:\n"
+     << "  case ISD::TargetGlobalTLSAddress:\n"
      << "  case ISD::TargetGlobalAddress: {\n"
      << "    return NULL;\n"
      << "  }\n"
@@ -3719,7 +3736,8 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
      << "      AddToISelQueue(N.getOperand(i));\n"
      << "    return NULL;\n"
      << "  }\n"
-     << "  case ISD::INLINEASM:  return Select_INLINEASM(N);\n";
+     << "  case ISD::INLINEASM: return Select_INLINEASM(N);\n"
+     << "  case ISD::LABEL: return Select_LABEL(N);\n";
 
     
   // Loop over all of the case statements, emiting a call to each method we
@@ -3780,7 +3798,7 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
   }
 
   OS << "  } // end of big switch.\n\n"
-     << "  std::cerr << \"Cannot yet select: \";\n"
+     << "  cerr << \"Cannot yet select: \";\n"
      << "  if (N.getOpcode() != ISD::INTRINSIC_W_CHAIN &&\n"
      << "      N.getOpcode() != ISD::INTRINSIC_WO_CHAIN &&\n"
      << "      N.getOpcode() != ISD::INTRINSIC_VOID) {\n"
@@ -3788,10 +3806,10 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
      << "  } else {\n"
      << "    unsigned iid = cast<ConstantSDNode>(N.getOperand("
                "N.getOperand(0).getValueType() == MVT::Other))->getValue();\n"
-     << "    std::cerr << \"intrinsic %\"<< "
-                        "Intrinsic::getName((Intrinsic::ID)iid);\n"
+     << "    cerr << \"intrinsic %\"<< "
+               "Intrinsic::getName((Intrinsic::ID)iid);\n"
      << "  }\n"
-     << "  std::cerr << '\\n';\n"
+     << "  cerr << '\\n';\n"
      << "  abort();\n"
      << "  return NULL;\n"
      << "}\n";
@@ -3937,13 +3955,12 @@ OS << "  unsigned NumKilled = ISelKilled.size();\n";
   // multiple ways.  Add them to PatternsToMatch as well.
   GenerateVariants();
 
-  
-  DEBUG(std::cerr << "\n\nALL PATTERNS TO MATCH:\n\n";
-        for (unsigned i = 0, e = PatternsToMatch.size(); i != e; ++i) {
-          std::cerr << "PATTERN: ";  PatternsToMatch[i].getSrcPattern()->dump();
-          std::cerr << "\nRESULT:  ";PatternsToMatch[i].getDstPattern()->dump();
-          std::cerr << "\n";
-        });
+  DOUT << "\n\nALL PATTERNS TO MATCH:\n\n";
+  for (unsigned i = 0, e = PatternsToMatch.size(); i != e; ++i) {
+    DOUT << "PATTERN: ";   DEBUG(PatternsToMatch[i].getSrcPattern()->dump());
+    DOUT << "\nRESULT:  "; DEBUG(PatternsToMatch[i].getDstPattern()->dump());
+    DOUT << "\n";
+  }
   
   // At this point, we have full information about the 'Patterns' we need to
   // parse, both implicitly from instructions as well as from explicit pattern