[llvm-commits] [llvm] r97031 - in /llvm/trunk: include/llvm/CodeGen/DAGISelHeader.h utils/TableGen/DAGISelEmitter.cpp utils/TableGen/DAGISelMatcher.cpp utils/TableGen/DAGISelMatcher.h utils/TableGen/DAGISelMatcherEmitter.cpp utils/TableGen/DAGISelMatcherOpt.cpp

Chris Lattner sabre at nondot.org
Tue Feb 23 23:31:46 PST 2010


Author: lattner
Date: Wed Feb 24 01:31:45 2010
New Revision: 97031

URL: http://llvm.org/viewvc/llvm-project?rev=97031&view=rev
Log:
implement a simple proof-of-concept optimization for
the new isel: fold movechild+record+moveparent into a
single recordchild N node.  This shrinks the X86 table
from 125443 to 117502 bytes.

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

Modified: llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h?rev=97031&r1=97030&r2=97031&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h (original)
+++ llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h Wed Feb 24 01:31:45 2010
@@ -221,6 +221,8 @@
 enum BuiltinOpcodes {
   OPC_Push, OPC_Push2,
   OPC_RecordNode,
+  OPC_RecordChild0, OPC_RecordChild1, OPC_RecordChild2, OPC_RecordChild3, 
+  OPC_RecordChild4, OPC_RecordChild5, OPC_RecordChild6, OPC_RecordChild7,
   OPC_RecordMemRef,
   OPC_CaptureFlagInput,
   OPC_MoveChild,
@@ -365,7 +367,8 @@
   unsigned MatcherIndex = 0;
   while (1) {
     assert(MatcherIndex < TableSize && "Invalid index");
-    switch ((BuiltinOpcodes)MatcherTable[MatcherIndex++]) {
+    BuiltinOpcodes Opcode = (BuiltinOpcodes)MatcherTable[MatcherIndex++];
+    switch (Opcode) {
     case OPC_Push: {
       unsigned NumToSkip = MatcherTable[MatcherIndex++];
       MatchScope NewEntry;
@@ -398,6 +401,18 @@
       // Remember this node, it may end up being an operand in the pattern.
       RecordedNodes.push_back(N);
       continue;
+        
+    case OPC_RecordChild0: case OPC_RecordChild1:
+    case OPC_RecordChild2: case OPC_RecordChild3:
+    case OPC_RecordChild4: case OPC_RecordChild5:
+    case OPC_RecordChild6: case OPC_RecordChild7: {
+      unsigned ChildNo = Opcode-OPC_RecordChild0;
+      if (ChildNo >= N.getNumOperands())
+        break;  // Match fails if out of range child #.
+
+      RecordedNodes.push_back(N->getOperand(ChildNo));
+      continue;
+    }
     case OPC_RecordMemRef:
       MatchedMemRefs.push_back(cast<MemSDNode>(N)->getMemOperand());
       continue;
@@ -410,10 +425,10 @@
       continue;
         
     case OPC_MoveChild: {
-      unsigned Child = MatcherTable[MatcherIndex++];
-      if (Child >= N.getNumOperands())
+      unsigned ChildNo = MatcherTable[MatcherIndex++];
+      if (ChildNo >= N.getNumOperands())
         break;  // Match fails if out of range child #.
-      N = N.getOperand(Child);
+      N = N.getOperand(ChildNo);
       NodeStack.push_back(N);
       continue;
     }

Modified: llvm/trunk/utils/TableGen/DAGISelEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelEmitter.cpp?rev=97031&r1=97030&r2=97031&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelEmitter.cpp Wed Feb 24 01:31:45 2010
@@ -1983,7 +1983,7 @@
       Matcher = new PushMatcherNode(N, Matcher);
   }
 
-  OptimizeMatcher(Matcher);
+  Matcher = OptimizeMatcher(Matcher);
   //Matcher->dump();
   EmitMatcherTable(Matcher, OS);
   delete Matcher;

Modified: llvm/trunk/utils/TableGen/DAGISelMatcher.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcher.cpp?rev=97031&r1=97030&r2=97031&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcher.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcher.cpp Wed Feb 24 01:31:45 2010
@@ -35,6 +35,11 @@
   printNext(OS, indent);
 }
 
+void RecordChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
+  OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
+  printNext(OS, indent);
+}
+
 void RecordMemRefMatcherNode::print(raw_ostream &OS, unsigned indent) const {
   OS.indent(indent) << "RecordMemRef\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=97031&r1=97030&r2=97031&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcher.h (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcher.h Wed Feb 24 01:31:45 2010
@@ -26,7 +26,7 @@
 
 MatcherNode *ConvertPatternToMatcher(const PatternToMatch &Pattern,
                                      const CodeGenDAGPatterns &CGP);
-void OptimizeMatcher(const MatcherNode *Matcher);
+MatcherNode *OptimizeMatcher(MatcherNode *Matcher);
 void EmitMatcherTable(const MatcherNode *Matcher, raw_ostream &OS);
 
   
@@ -41,6 +41,7 @@
     // Matcher state manipulation.
     Push,                 // Push a checking scope.
     RecordNode,           // Record the current node.
+    RecordChild,          // Record a child of the current node.
     RecordMemRef,         // Record the memref in the current node.
     CaptureFlagInput,     // If the current node has an input flag, save it.
     MoveChild,            // Move current node to specified child.
@@ -86,6 +87,9 @@
   MatcherNode *getNext() { return Next.get(); }
   const MatcherNode *getNext() const { return Next.get(); }
   void setNext(MatcherNode *C) { Next.reset(C); }
+  MatcherNode *takeNext() { return Next.take(); }
+
+  OwningPtr<MatcherNode> &getNextPtr() { return Next; }
   
   static inline bool classof(const MatcherNode *) { return true; }
   
@@ -109,6 +113,7 @@
   MatcherNode *getFailure() { return Failure.get(); }
   const MatcherNode *getFailure() const { return Failure.get(); }
   void setFailure(MatcherNode *N) { Failure.reset(N); }
+  OwningPtr<MatcherNode> &getFailurePtr() { return Failure; }
 
   static inline bool classof(const MatcherNode *N) {
     return N->getKind() == Push;
@@ -135,6 +140,29 @@
   virtual void print(raw_ostream &OS, unsigned indent = 0) const;
 };
   
+/// RecordChildMatcherNode - Save a numbered child of the current node, or fail
+/// the match if it doesn't exist.  This is logically equivalent to:
+///    MoveChild N + RecordNode + MoveParent.
+class RecordChildMatcherNode : public MatcherNode {
+  unsigned ChildNo;
+  
+  /// WhatFor - This is a string indicating why we're recording this.  This
+  /// should only be used for comment generation not anything semantic.
+  std::string WhatFor;
+public:
+  RecordChildMatcherNode(unsigned childno, const std::string &whatfor)
+  : MatcherNode(RecordChild), ChildNo(childno), WhatFor(whatfor) {}
+  
+  unsigned getChildNo() const { return ChildNo; }
+  const std::string &getWhatFor() const { return WhatFor; }
+  
+  static inline bool classof(const MatcherNode *N) {
+    return N->getKind() == RecordChild;
+  }
+  
+  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
+};
+  
 /// RecordMemRefMatcherNode - Save the current node's memref.
 class RecordMemRefMatcherNode : public MatcherNode {
 public:

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp?rev=97031&r1=97030&r2=97031&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp Wed Feb 24 01:31:45 2010
@@ -159,6 +159,13 @@
     OS.PadToColumn(CommentIndent) << "// "
        << cast<RecordMatcherNode>(N)->getWhatFor() << '\n';
     return 1;
+
+  case MatcherNode::RecordChild:
+    OS << "OPC_RecordChild" << cast<RecordChildMatcherNode>(N)->getChildNo()
+       << ',';
+    OS.PadToColumn(CommentIndent) << "// "
+      << cast<RecordChildMatcherNode>(N)->getWhatFor() << '\n';
+    return 1;
       
   case MatcherNode::RecordMemRef:
     OS << "OPC_RecordMemRef,\n";

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherOpt.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherOpt.cpp?rev=97031&r1=97030&r2=97031&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherOpt.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherOpt.cpp Wed Feb 24 01:31:45 2010
@@ -14,6 +14,35 @@
 #include "DAGISelMatcher.h"
 using namespace llvm;
 
-void llvm::OptimizeMatcher(const MatcherNode *Matcher) {
-  // Nothing yet.
+
+static void FormRecordChildNodes(OwningPtr<MatcherNode> &Matcher) {
+  // If we reached the end of the chain, we're done.
+  MatcherNode *N = Matcher.get();
+  if (N == 0) return;
+  
+  // If we have a push node, walk down both edges.
+  if (PushMatcherNode *Push = dyn_cast<PushMatcherNode>(N))
+    FormRecordChildNodes(Push->getFailurePtr());
+  
+  // If we found a movechild node, check to see if our pattern matches.
+  if (MoveChildMatcherNode *MC = dyn_cast<MoveChildMatcherNode>(N)) {
+    if (RecordMatcherNode *RM = dyn_cast<RecordMatcherNode>(MC->getNext()))
+      if (MoveParentMatcherNode *MP = 
+                 dyn_cast<MoveParentMatcherNode>(RM->getNext())) {
+        MatcherNode *New
+          = new RecordChildMatcherNode(MC->getChildNo(), RM->getWhatFor());
+        New->setNext(MP->takeNext());
+        Matcher.reset(New);
+        return FormRecordChildNodes(Matcher);
+      }
+  }
+
+  FormRecordChildNodes(N->getNextPtr());
+}
+
+
+MatcherNode *llvm::OptimizeMatcher(MatcherNode *Matcher) {
+  OwningPtr<MatcherNode> MatcherPtr(Matcher);
+  FormRecordChildNodes(MatcherPtr);
+  return MatcherPtr.take();
 }





More information about the llvm-commits mailing list