[llvm-commits] CVS: llvm/utils/TableGen/InstrSelectorEmitter.cpp InstrSelectorEmitter.h

Chris Lattner lattner at cs.uiuc.edu
Mon Aug 11 23:57:01 PDT 2003


Changes in directory llvm/utils/TableGen:

InstrSelectorEmitter.cpp updated: 1.29 -> 1.30
InstrSelectorEmitter.h updated: 1.19 -> 1.20

---
Log message:

Add support for the Any type.  Minor fixes and enhancements for BasicBlock operands


---
Diffs of the changes:

Index: llvm/utils/TableGen/InstrSelectorEmitter.cpp
diff -u llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.29 llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.30
--- llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.29	Mon Aug 11 23:28:03 2003
+++ llvm/utils/TableGen/InstrSelectorEmitter.cpp	Mon Aug 11 23:56:42 2003
@@ -14,6 +14,7 @@
 
 NodeType::ArgResultTypes NodeType::Translate(Record *R) {
   const std::string &Name = R->getName();
+  if (Name == "DNVT_any")  return Any;
   if (Name == "DNVT_void") return Void;
   if (Name == "DNVT_val" ) return Val;
   if (Name == "DNVT_arg0") return Arg0;
@@ -204,6 +205,8 @@
       New = new TreePatternNode(DI);
       // If it's a regclass or something else known, set the type.
       New->setType(getIntrinsicType(DI->getDef()));
+    } else if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {
+      New = ParseTreePattern(DI);
     } else {
       Arg->dump();
       error("Unknown leaf value for tree pattern!");
@@ -276,6 +279,7 @@
     AnyUnset |= InferTypes(Child, MadeChange);
 
     switch (NT.ArgTypes[i]) {
+    case NodeType::Any: break;
     case NodeType::I8:
       MadeChange |= Child->updateNodeType(MVT::i1, TheRecord->getName());
       break;
@@ -301,6 +305,7 @@
 
   // See if we can infer anything about the return type now...
   switch (NT.ResultType) {
+  case NodeType::Any: break;
   case NodeType::Void:
     MadeChange |= N->updateNodeType(MVT::isVoid, TheRecord->getName());
     break;
@@ -867,9 +872,10 @@
                                                 std::ostream &OS) {
   if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
     Record *Arg = DI->getDef();
-    if (!ArgDeclNode->isLeaf())
+    if (!ArgDeclNode->isLeaf() && ArgDeclNode->getNumChildren() != 0)
       P->error("Expected leaf node as argument!");
-    Record *ArgDecl = ArgDeclNode->getValueRecord();
+    Record *ArgDecl = ArgDeclNode->isLeaf() ? ArgDeclNode->getValueRecord() :
+                      ArgDeclNode->getOperator();
     if (Arg->isSubClassOf("Register")) {
       // This is a physical register reference... make sure that the instruction
       // requested a register!
@@ -896,6 +902,10 @@
       if (!PrintArg) P->error("Cannot define a new frameidx value!");
       OS << ".addFrameIndex(" << NameVar << ")";
       return;
+    } else if (Arg->getName() == "basicblock") {
+      if (!PrintArg) P->error("Cannot define a new basicblock value!");
+      OS << ".addMBB(" << NameVar << ")";
+      return;
     }
     P->error("Unknown operand type '" + Arg->getName() + "' to expander!");
   } else if (IntInit *II = dynamic_cast<IntInit*>(Arg)) {
@@ -910,7 +920,7 @@
     } else {
       if (ArgDeclNode->isLeaf() || ArgDeclNode->getOperator()->getName()!="imm")
         P->error("Illegal immediate int value '" + itostr(II->getValue()) +
-               "' operand!");
+                 "' operand!");
       OS << ".addZImm(" << II->getValue() << ")";
     }
     return;
@@ -1213,7 +1223,8 @@
           for (unsigned IN = 0, e = Insts->getSize(); IN != e; ++IN) {
             DagInit *DIInst = dynamic_cast<DagInit*>(Insts->getElement(IN));
             if (!DIInst) P->error("Result list must contain instructions!");
-            Pattern *InstPat = getPattern(DIInst->getNodeType());
+            Record *InstRec  = DIInst->getNodeType();
+            Pattern *InstPat = getPattern(InstRec);
             if (!InstPat || InstPat->getPatternType() != Pattern::Instruction)
               P->error("Instruction list must contain Instruction patterns!");
             
@@ -1225,10 +1236,10 @@
 
             // Start emission of the instruction...
             OS << "    BuildMI(MBB, " << Target.getName() << "::"
-               << InstPat->getRecord()->getName() << ", "
+               << InstRec->getName() << ", "
                << DIInst->getNumArgs()-hasResult;
             // Emit register result if necessary..
-            if (Record *R = InstPat->getResult()) {
+            if (hasResult) {
               std::string ArgNameVal =
                 getArgName(P, DIInst->getArgName(0), Operands);
               PrintExpanderOperand(DIInst->getArg(0), ArgNameVal,


Index: llvm/utils/TableGen/InstrSelectorEmitter.h
diff -u llvm/utils/TableGen/InstrSelectorEmitter.h:1.19 llvm/utils/TableGen/InstrSelectorEmitter.h:1.20
--- llvm/utils/TableGen/InstrSelectorEmitter.h:1.19	Mon Aug 11 23:28:03 2003
+++ llvm/utils/TableGen/InstrSelectorEmitter.h	Mon Aug 11 23:56:42 2003
@@ -20,7 +20,7 @@
 ///
 struct NodeType {
   enum ArgResultTypes {
-    // Both argument and return types...
+    Any,            // No constraint on type
     Val,            // A non-void type
     Arg0,           // Value matches the type of Arg0
     Arg1,           // Value matches the type of Arg1





More information about the llvm-commits mailing list