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

Chris Lattner lattner at cs.uiuc.edu
Tue Oct 18 18:27:34 PDT 2005



Changes in directory llvm/utils/TableGen:

DAGISelEmitter.cpp updated: 1.59 -> 1.60
---
Log message:

Nate wants to define 'Pat's which turn into instructions that don't have
patterns.  Certainly a logical request.


---
Diffs of the changes:  (+30 -4)

 DAGISelEmitter.cpp |   34 ++++++++++++++++++++++++++++++----
 1 files changed, 30 insertions(+), 4 deletions(-)


Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.59 llvm/utils/TableGen/DAGISelEmitter.cpp:1.60
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.59	Mon Oct 17 23:41:01 2005
+++ llvm/utils/TableGen/DAGISelEmitter.cpp	Tue Oct 18 20:27:22 2005
@@ -975,11 +975,36 @@
   std::vector<Record*> Instrs = Records.getAllDerivedDefinitions("Instruction");
   
   for (unsigned i = 0, e = Instrs.size(); i != e; ++i) {
-    if (!dynamic_cast<ListInit*>(Instrs[i]->getValueInit("Pattern")))
-      continue; // no pattern yet, ignore it.
+    ListInit *LI = 0;
     
-    ListInit *LI = Instrs[i]->getValueAsListInit("Pattern");
-    if (LI->getSize() == 0) continue;  // no pattern.
+    if (dynamic_cast<ListInit*>(Instrs[i]->getValueInit("Pattern")))
+      LI = Instrs[i]->getValueAsListInit("Pattern");
+    
+    // If there is no pattern, only collect minimal information about the
+    // instruction for its operand list.  We have to assume that there is one
+    // result, as we have no detailed info.
+    if (!LI || LI->getSize() == 0) {
+      std::vector<MVT::ValueType> ResultTypes;
+      std::vector<MVT::ValueType> OperandTypes;
+      
+      CodeGenInstruction &InstInfo =Target.getInstruction(Instrs[i]->getName());
+      
+      // Doesn't even define a result?
+      if (InstInfo.OperandList.size() == 0)
+        continue;
+      
+      // Assume the first operand is the result.
+      ResultTypes.push_back(InstInfo.OperandList[0].Ty);
+      
+      // The rest are inputs.
+      for (unsigned j = 1, e = InstInfo.OperandList.size(); j != e; ++j)
+        OperandTypes.push_back(InstInfo.OperandList[j].Ty);
+      
+      // Create and insert the instruction.
+      Instructions.insert(std::make_pair(Instrs[i], 
+                            DAGInstruction(0, ResultTypes, OperandTypes)));
+      continue;  // no pattern.
+    }
     
     // Parse the instruction.
     TreePattern *I = new TreePattern(Instrs[i], LI, *this);
@@ -1112,6 +1137,7 @@
   for (std::map<Record*, DAGInstruction>::iterator II = Instructions.begin(),
        E = Instructions.end(); II != E; ++II) {
     TreePattern *I = II->second.getPattern();
+    if (I == 0) continue;  // No pattern.
     
     if (I->getNumTrees() != 1) {
       std::cerr << "CANNOT HANDLE: " << I->getRecord()->getName() << " yet!";






More information about the llvm-commits mailing list