[llvm-commits] [llvm] r96617 - in /llvm/trunk: include/llvm/CodeGen/DAGISelHeader.h utils/TableGen/DAGISelMatcher.cpp utils/TableGen/DAGISelMatcher.h utils/TableGen/DAGISelMatcherEmitter.cpp utils/TableGen/DAGISelMatcherGen.cpp

Chris Lattner sabre at nondot.org
Thu Feb 18 14:03:03 PST 2010


Author: lattner
Date: Thu Feb 18 16:03:03 2010
New Revision: 96617

URL: http://llvm.org/viewvc/llvm-project?rev=96617&view=rev
Log:
add support for referencing registers and immediates,
building the tree to represent them but not emitting 
table entries for them yet.


Modified:
    llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h
    llvm/trunk/utils/TableGen/DAGISelMatcher.cpp
    llvm/trunk/utils/TableGen/DAGISelMatcher.h
    llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp
    llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp

Modified: llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h?rev=96617&r1=96616&r2=96617&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h (original)
+++ llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h Thu Feb 18 16:03:03 2010
@@ -203,7 +203,7 @@
 enum BuiltinOpcodes {
   OPC_Emit,
   OPC_Push,
-  OPC_Record,
+  OPC_RecordNode,
   OPC_MoveChild,
   OPC_MoveParent,
   OPC_CheckSame,
@@ -294,7 +294,7 @@
       MatchScopes.push_back(NewEntry);
       continue;
     }
-    case OPC_Record:
+    case OPC_RecordNode:
       // Remember this node, it may end up being an operand in the pattern.
       RecordedNodes.push_back(N);
       continue;

Modified: llvm/trunk/utils/TableGen/DAGISelMatcher.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcher.cpp?rev=96617&r1=96616&r2=96617&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcher.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcher.cpp Thu Feb 18 16:03:03 2010
@@ -10,6 +10,7 @@
 #include "DAGISelMatcher.h"
 #include "CodeGenDAGPatterns.h"
 #include "CodeGenTarget.h"
+#include "Record.h"
 #include "llvm/Support/raw_ostream.h"
 using namespace llvm;
 
@@ -117,3 +118,19 @@
   OS.indent(indent) << "CheckChainCompatibleMatcherNode " << PreviousOp << "\n";
   printNext(OS, indent);
 }
+
+void EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
+  OS.indent(indent) << "EmitIntegerMatcherNode " << Val << " VT=" << VT << '\n';
+  printNext(OS, indent);
+}
+
+void EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
+  OS.indent(indent) << "EmitRegisterMatcherNode ";
+  if (Reg)
+    OS << Reg->getName();
+  else
+    OS << "zero_reg";
+  OS << " VT=" << VT << '\n';
+  printNext(OS, indent);
+}
+

Modified: llvm/trunk/utils/TableGen/DAGISelMatcher.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcher.h?rev=96617&r1=96616&r2=96617&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcher.h (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcher.h Thu Feb 18 16:03:03 2010
@@ -21,6 +21,7 @@
   class PatternToMatch;
   class raw_ostream;
   class ComplexPattern;
+  class Record;
 
 MatcherNode *ConvertPatternToMatcher(const PatternToMatch &Pattern,
                                      const CodeGenDAGPatterns &CGP);
@@ -36,25 +37,31 @@
   OwningPtr<MatcherNode> Next;
 public:
   enum KindTy {
-    EmitNode,
-    Push,           // [Push, Dest0, Dest1, Dest2, Dest3]
-    Record,         // [Record]
-    MoveChild,      // [MoveChild, Child#]
-    MoveParent,     // [MoveParent]
+    // Stack manipulation.
+    Push,           // Push a checking scope.
+    RecordNode,     // Record the current node.
+    MoveChild,      // Move current node to specified child.
+    MoveParent,     // Move current node to parent.
     
-    CheckSame,      // [CheckSame, N]         Fail if not same as prev match.
+    // Predicate checking.
+    CheckSame,      // Fail if not same as prev match.
     CheckPatternPredicate,
-    CheckPredicate, // [CheckPredicate, P]    Fail if predicate fails.
-    CheckOpcode,    // [CheckOpcode, Opcode]  Fail if not opcode.
-    CheckType,      // [CheckType, MVT]       Fail if not correct type.
-    CheckInteger,   // [CheckInteger, int0,int1,int2,...int7] Fail if wrong val.
-    CheckCondCode,  // [CheckCondCode, CondCode] Fail if not condcode.
+    CheckPredicate, // Fail if node predicate fails.
+    CheckOpcode,    // Fail if not opcode.
+    CheckType,      // Fail if not correct type.
+    CheckInteger,   // Fail if wrong val.
+    CheckCondCode,  // Fail if not condcode.
     CheckValueType,
     CheckComplexPat,
     CheckAndImm,
     CheckOrImm,
     CheckFoldableChainNode,
-    CheckChainCompatible
+    CheckChainCompatible,
+    
+    // Node creation/emisssion.
+    EmitInteger,   // Create a TargetConstant
+    EmitRegister,  // Create a register.
+    EmitNode
   };
   const KindTy Kind;
 
@@ -77,23 +84,6 @@
   void printNext(raw_ostream &OS, unsigned indent) const;
 };
   
-/// EmitNodeMatcherNode - This signals a successful match and generates a node.
-class EmitNodeMatcherNode : public MatcherNode {
-  const PatternToMatch &Pattern;
-public:
-  EmitNodeMatcherNode(const PatternToMatch &pattern)
-    : MatcherNode(EmitNode), Pattern(pattern) {}
-
-  const PatternToMatch &getPattern() const { return Pattern; }
-
-  static inline bool classof(const MatcherNode *N) {
-    return N->getKind() == EmitNode;
-  }
-
-  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
-};
-
-
 /// PushMatcherNode - This pushes a failure scope on the stack and evaluates
 /// 'Next'.  If 'Next' fails to match, it pops its scope and attempts to
 /// match 'Failure'.
@@ -123,12 +113,12 @@
   std::string WhatFor;
 public:
   RecordMatcherNode(const std::string &whatfor)
-    : MatcherNode(Record), WhatFor(whatfor) {}
+    : MatcherNode(RecordNode), WhatFor(whatfor) {}
   
   const std::string &getWhatFor() const { return WhatFor; }
   
   static inline bool classof(const MatcherNode *N) {
-    return N->getKind() == Record;
+    return N->getKind() == RecordNode;
   }
   
   virtual void print(raw_ostream &OS, unsigned indent = 0) const;
@@ -388,8 +378,60 @@
   virtual void print(raw_ostream &OS, unsigned indent = 0) const;
 };
   
+/// EmitIntegerMatcherNode - This creates a new TargetConstant.
+class EmitIntegerMatcherNode : public MatcherNode {
+  int64_t Val;
+  MVT::SimpleValueType VT;
+public:
+  EmitIntegerMatcherNode(int64_t val, MVT::SimpleValueType vt)
+  : MatcherNode(EmitInteger), Val(val), VT(vt) {}
+  
+  int64_t getVal() const { return Val; }
+  MVT::SimpleValueType getVT() const { return VT; }
+  
+  static inline bool classof(const MatcherNode *N) {
+    return N->getKind() == EmitInteger;
+  }
+  
+  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
+};
+  
+/// EmitRegisterMatcherNode - This creates a new TargetConstant.
+class EmitRegisterMatcherNode : public MatcherNode {
+  /// Reg - The def for the register that we're emitting.  If this is null, then
+  /// this is a reference to zero_reg.
+  Record *Reg;
+  MVT::SimpleValueType VT;
+public:
+  EmitRegisterMatcherNode(Record *reg, MVT::SimpleValueType vt)
+    : MatcherNode(EmitRegister), Reg(reg), VT(vt) {}
+  
+  Record *getReg() const { return Reg; }
+  MVT::SimpleValueType getVT() const { return VT; }
+  
+  static inline bool classof(const MatcherNode *N) {
+    return N->getKind() == EmitRegister;
+  }
+  
+  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
+};
+  
+/// EmitNodeMatcherNode - This signals a successful match and generates a node.
+class EmitNodeMatcherNode : public MatcherNode {
+  const PatternToMatch &Pattern;
+public:
+  EmitNodeMatcherNode(const PatternToMatch &pattern)
+  : MatcherNode(EmitNode), Pattern(pattern) {}
+  
+  const PatternToMatch &getPattern() const { return Pattern; }
+  
+  static inline bool classof(const MatcherNode *N) {
+    return N->getKind() == EmitNode;
+  }
+  
+  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
+};
   
-
 } // end namespace llvm
 
 #endif

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp?rev=96617&r1=96616&r2=96617&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp Thu Feb 18 16:03:03 2010
@@ -125,8 +125,8 @@
        << *cast<EmitNodeMatcherNode>(N)->getPattern().getDstPattern() << "\n";
     OS.PadToColumn(Indent*2) << "OPC_Emit, /*XXX*/\n\n";
     return 1;
-  case MatcherNode::Record:
-    OS << "OPC_Record,";
+  case MatcherNode::RecordNode:
+    OS << "OPC_RecordNode,";
     OS.PadToColumn(CommentIndent) << "// "
        << cast<RecordMatcherNode>(N)->getWhatFor() << '\n';
     return 1;
@@ -212,6 +212,11 @@
     OS << "OPC_CheckChainCompatible, "
        << cast<CheckChainCompatibleMatcherNode>(N)->getPreviousOp() << ",\n";
     return 2;
+      
+  case MatcherNode::EmitInteger:
+  case MatcherNode::EmitRegister:
+      // FIXME: Implement.
+    return 0;
   }
   assert(0 && "Unreachable");
   return 0;

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp?rev=96617&r1=96616&r2=96617&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp Thu Feb 18 16:03:03 2010
@@ -397,6 +397,38 @@
 
 void MatcherGen::EmitResultLeafAsOperand(const TreePatternNode *N,
                                          SmallVectorImpl<unsigned> &ResultOps) {
+  assert(N->isLeaf() && "Must be a leaf");
+  
+  if (IntInit *II = dynamic_cast<IntInit*>(N->getLeafValue())) {
+    AddMatcherNode(new EmitIntegerMatcherNode(II->getValue(),N->getTypeNum(0)));
+    //ResultOps.push_back(TmpNode(TmpNo++));
+    return;
+  }
+  
+  // If this is an explicit register reference, handle it.
+  if (DefInit *DI = dynamic_cast<DefInit*>(N->getLeafValue())) {
+    if (DI->getDef()->isSubClassOf("Register")) {
+      AddMatcherNode(new EmitRegisterMatcherNode(DI->getDef(),
+                                                 N->getTypeNum(0)));
+      //ResultOps.push_back(TmpNode(TmpNo++));
+      return;
+    }
+    
+    if (DI->getDef()->getName() == "zero_reg") {
+      AddMatcherNode(new EmitRegisterMatcherNode(0, N->getTypeNum(0)));
+      //ResultOps.push_back(TmpNode(TmpNo++));
+      return;
+    }
+    
+#if 0
+    if (DI->getDef()->isSubClassOf("RegisterClass")) {
+      // Handle a reference to a register class. This is used
+      // in COPY_TO_SUBREG instructions.
+      // FIXME: Implement.
+    }
+#endif
+  }
+  
   errs() << "unhandled leaf node: \n";
   N->dump();
 }





More information about the llvm-commits mailing list