Switch to a slightly more structured representation for instructions
authorChris Lattner <sabre@nondot.org>
Wed, 14 Sep 2005 04:03:16 +0000 (04:03 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 14 Sep 2005 04:03:16 +0000 (04:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23345 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp
utils/TableGen/DAGISelEmitter.h

index 95a7ca070b1d52d1a665f0c0625e121b50d28a43..7418435bab2681c0e490a4f76297845180718500 100644 (file)
@@ -700,18 +700,19 @@ void DAGISelEmitter::ParseAndResolveInstructions() {
     // Now that we have operands that are sets, inspect the operands list for
     // the instruction.  This determines the order that operands are added to
     // the machine instruction the node corresponds to.
-    assert(SetDestinations.size() == 1 &&
+    unsigned NumResults = SetDestinations.size();
+    assert(NumResults == 1 &&
            "This code only handles a single set right now!");
 
-
+    unsigned NumOperands = 0;
               
     DEBUG(I->dump());
-    Instructions.push_back(I);
+    Instructions.push_back(DAGInstruction(I, NumResults, NumOperands));
   }
    
   // If we can, convert the instructions to be a patterns that are matched!
   for (unsigned i = 0, e = Instructions.size(); i != e; ++i) {
-    TreePattern *I = Instructions[i];
+    TreePattern *I = Instructions[i].getPattern();
     
     if (I->getNumTrees() != 1) {
       std::cerr << "CANNOT HANDLE: " << I->getRecord()->getName() << " yet!";
@@ -780,7 +781,5 @@ void DAGISelEmitter::run(std::ostream &OS) {
     delete I->second;
   PatternFragments.clear();
 
-  for (unsigned i = 0, e = Instructions.size(); i != e; ++i)
-    delete Instructions[i];
   Instructions.clear();
 }
index a2409bb8550c92c4c258769fc9a5260a3f0d3395..3c61224bb829b97460c4c41c689d1b201e692cd2 100644 (file)
@@ -272,7 +272,24 @@ namespace llvm {
     MVT::ValueType getIntrinsicType(Record *R) const;
     TreePatternNode *ParseTreePattern(DagInit *DI);
   };
-  
+
+
+  class DAGInstruction {
+    TreePattern *Pattern;
+    unsigned NumResults;
+    unsigned NumOperands;
+  public:
+    DAGInstruction(TreePattern *TP, unsigned results, unsigned ops)
+      : Pattern(TP), NumResults(results), NumOperands(ops) {}
+
+    ~DAGInstruction() {
+      delete Pattern;
+    }
+
+    TreePattern *getPattern() const { return Pattern; }
+    unsigned getNumResults() const { return NumResults; }
+    unsigned getNumOperands() const { return NumOperands; }
+  };
   
   
 /// InstrSelectorEmitter - The top-level class which coordinates construction
@@ -285,7 +302,7 @@ class DAGISelEmitter : public TableGenBackend {
   std::map<Record*, SDNodeInfo> SDNodes;
   std::map<Record*, std::pair<Record*, std::string> > SDNodeXForms;
   std::map<Record*, TreePattern*> PatternFragments;
-  std::vector<TreePattern*> Instructions;
+  std::vector<DAGInstruction> Instructions;
   
   /// PatternsToMatch - All of the things we are matching on the DAG.  The first
   /// value is the pattern to match, the second pattern is the result to