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

Chris Lattner lattner at cs.uiuc.edu
Sun Aug 10 18:58:03 PDT 2003


Changes in directory llvm/utils/TableGen:

InstrSelectorEmitter.cpp updated: 1.19 -> 1.20
Record.h updated: 1.35 -> 1.36

---
Log message:

Implement autopromotion of leaf trees from arguments to nodes of their own,
making it easier to write patterns without lots of extraneous parens


---
Diffs of the changes:

Index: llvm/utils/TableGen/InstrSelectorEmitter.cpp
diff -u llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.19 llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.20
--- llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.19	Sun Aug 10 17:14:13 2003
+++ llvm/utils/TableGen/InstrSelectorEmitter.cpp	Sun Aug 10 17:38:36 2003
@@ -167,19 +167,20 @@
     return MVT::Other;
   }
 
-  throw "Error: Unknown value used: " + R->getName();
+  error("Unknown value used: " + R->getName());
+  return MVT::Other;
 }
 
-TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
-  Record *Operator = DI->getNodeType();
+TreePatternNode *Pattern::ParseTreePattern(DagInit *Dag) {
+  Record *Operator = Dag->getNodeType();
 
   if (Operator->isSubClassOf("ValueType")) {
     // If the operator is a ValueType, then this must be "type cast" of a leaf
     // node.
-    if (DI->getNumArgs() != 1)
+    if (Dag->getNumArgs() != 1)
       error("Type cast only valid for a leaf node!");
     
-    Init *Arg = DI->getArg(0);
+    Init *Arg = Dag->getArg(0);
     TreePatternNode *New;
     if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
       New = new TreePatternNode(DI);
@@ -200,14 +201,22 @@
 
   std::vector<TreePatternNode*> Children;
   
-  for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) {
-    Init *Arg = DI->getArg(i);
+  for (unsigned i = 0, e = Dag->getNumArgs(); i != e; ++i) {
+    Init *Arg = Dag->getArg(i);
     if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {
       Children.push_back(ParseTreePattern(DI));
-    } else if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
-      Children.push_back(new TreePatternNode(DI));
-      // If it's a regclass or something else known, set the type.
-      Children.back()->setType(getIntrinsicType(DI->getDef()));
+    } else if (DefInit *DefI = dynamic_cast<DefInit*>(Arg)) {
+      Record *R = DefI->getDef();
+      // Direct reference to a leaf DagNode?  Turn it into a DagNode if its own.
+      if (R->isSubClassOf("DagNode")) {
+        Dag->setArg(i, new DagInit(R,
+                                std::vector<std::pair<Init*, std::string> >()));
+        --i;  // Revisit this node...
+      } else {
+        Children.push_back(new TreePatternNode(DefI));
+        // If it's a regclass or something else known, set the type.
+        Children.back()->setType(getIntrinsicType(R));
+      }
     } else {
       Arg->dump();
       error("Unknown leaf value for tree pattern!");
@@ -524,8 +533,15 @@
   // Loop over all of the patterns, adding them to the ComputableValues map
   for (std::map<Record*, Pattern*>::iterator I = Patterns.begin(),
          E = Patterns.end(); I != E; ++I)
-    if (I->second->isResolved())
-      ComputableValues.addPattern(I->second);
+    if (I->second->isResolved()) {
+      // We don't want to add patterns like R32 = R32.  This is a hack working
+      // around a special case of a general problem, but for now we explicitly
+      // forbid these patterns.  They can never match anyway.
+      Pattern *P = I->second;
+      if (!P->getResult() || !P->getTree()->isLeaf() ||
+          P->getResult() != P->getTree()->getValueRecord())
+        ComputableValues.addPattern(P);
+    }
 }
 
 #if 0


Index: llvm/utils/TableGen/Record.h
diff -u llvm/utils/TableGen/Record.h:1.35 llvm/utils/TableGen/Record.h:1.36
--- llvm/utils/TableGen/Record.h:1.35	Sun Aug 10 17:14:13 2003
+++ llvm/utils/TableGen/Record.h	Sun Aug 10 17:38:36 2003
@@ -619,6 +619,11 @@
     return ArgNames[Num];
   }
 
+  void setArg(unsigned Num, Init *I) {
+    assert(Num < Args.size() && "Arg number out of range!");
+    Args[Num] = I;
+  }
+
   virtual void print(std::ostream &OS) const;
 };
 





More information about the llvm-commits mailing list