[llvm-commits] [llvm] r96814 - 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
Mon Feb 22 14:30:38 PST 2010


Author: lattner
Date: Mon Feb 22 16:30:37 2010
New Revision: 96814

URL: http://llvm.org/viewvc/llvm-project?rev=96814&view=rev
Log:
add a new CheckMultiOpcode opcode for checking that a node
has one of the list of acceptable opcodes for a complex 
pattern.  This fixes 4 regtest failures.

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=96814&r1=96813&r2=96814&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h (original)
+++ llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h Mon Feb 22 16:30:37 2010
@@ -211,6 +211,7 @@
   OPC_CheckPatternPredicate,
   OPC_CheckPredicate,
   OPC_CheckOpcode,
+  OPC_CheckMultiOpcode,
   OPC_CheckType,
   OPC_CheckInteger1, OPC_CheckInteger2, OPC_CheckInteger4, OPC_CheckInteger8,
   OPC_CheckCondCode,
@@ -410,6 +411,16 @@
     case OPC_CheckOpcode:
       if (N->getOpcode() != MatcherTable[MatcherIndex++]) break;
       continue;
+        
+    case OPC_CheckMultiOpcode: {
+      unsigned NumOps = MatcherTable[MatcherIndex++];
+      bool OpcodeEquals = false;
+      for (unsigned i = 0; i != NumOps; ++i)
+        OpcodeEquals |= N->getOpcode() == MatcherTable[MatcherIndex++];
+      if (!OpcodeEquals) break;
+      continue;
+    }
+        
     case OPC_CheckType: {
       MVT::SimpleValueType VT =
         (MVT::SimpleValueType)MatcherTable[MatcherIndex++];

Modified: llvm/trunk/utils/TableGen/DAGISelMatcher.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcher.cpp?rev=96814&r1=96813&r2=96814&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcher.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcher.cpp Mon Feb 22 16:30:37 2010
@@ -76,6 +76,11 @@
   printNext(OS, indent);
 }
 
+void CheckMultiOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
+  OS.indent(indent) << "CheckMultiOpcode <todo args>\n";
+  printNext(OS, indent);
+}
+
 void CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
   OS.indent(indent) << "CheckType " << getEnumName(Type) << '\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=96814&r1=96813&r2=96814&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcher.h (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcher.h Mon Feb 22 16:30:37 2010
@@ -51,6 +51,7 @@
     CheckPatternPredicate,
     CheckPredicate,       // Fail if node predicate fails.
     CheckOpcode,          // Fail if not opcode.
+    CheckMultiOpcode,     // Fail if not in opcode list.
     CheckType,            // Fail if not correct type.
     CheckInteger,         // Fail if wrong val.
     CheckCondCode,        // Fail if not condcode.
@@ -262,6 +263,26 @@
   virtual void print(raw_ostream &OS, unsigned indent = 0) const;
 };
   
+/// CheckMultiOpcodeMatcherNode - This checks to see if the current node has one
+/// of the specified opcode, if not it fails to match.
+class CheckMultiOpcodeMatcherNode : public MatcherNode {
+  SmallVector<StringRef, 4> OpcodeNames;
+public:
+  CheckMultiOpcodeMatcherNode(const StringRef *opcodes, unsigned numops)
+  : MatcherNode(CheckMultiOpcode), OpcodeNames(opcodes, opcodes+numops) {}
+  
+  unsigned getNumOpcodeNames() const { return OpcodeNames.size(); }
+  StringRef getOpcodeName(unsigned i) const { return OpcodeNames[i]; }
+  
+  static inline bool classof(const MatcherNode *N) {
+    return N->getKind() == CheckMultiOpcode;
+  }
+  
+  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
+};
+  
+  
+  
 /// CheckTypeMatcherNode - This checks to see if the current node has the
 /// specified type, if not it fails to match.
 class CheckTypeMatcherNode : public MatcherNode {

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp?rev=96814&r1=96813&r2=96814&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp Mon Feb 22 16:30:37 2010
@@ -181,6 +181,15 @@
        << cast<CheckOpcodeMatcherNode>(N)->getOpcodeName() << ",\n";
     return 2;
       
+  case MatcherNode::CheckMultiOpcode: {
+    const CheckMultiOpcodeMatcherNode *CMO=cast<CheckMultiOpcodeMatcherNode>(N);
+    OS << "OPC_CheckMultiOpcode, " << CMO->getNumOpcodeNames() << ", ";
+    for (unsigned i = 0, e = CMO->getNumOpcodeNames(); i != e; ++i)
+      OS << CMO->getOpcodeName(i) << ", ";
+    OS << '\n';
+    return 2 + CMO->getNumOpcodeNames();
+  }
+      
   case MatcherNode::CheckType:
     OS << "OPC_CheckType, "
        << getEnumName(cast<CheckTypeMatcherNode>(N)->getType()) << ",\n";

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp?rev=96814&r1=96813&r2=96814&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp Mon Feb 22 16:30:37 2010
@@ -251,9 +251,11 @@
         StringRef OpName = CGP.getSDNodeInfo(OpNodes[0]).getEnumName();
         AddMatcherNode(new CheckOpcodeMatcherNode(OpName));
       } else if (!OpNodes.empty()) {
-        for (unsigned j = 0, e = OpNodes.size(); j != e; j++) {
-          // .getOpcodeName(OpNodes[j], CGP)
-        }
+        SmallVector<StringRef, 4> OpNames;
+        for (unsigned i = 0, e = OpNodes.size(); i != e; i++)
+          OpNames.push_back(CGP.getSDNodeInfo(OpNodes[i]).getEnumName());
+        AddMatcherNode(new CheckMultiOpcodeMatcherNode(OpNames.data(),
+                                                       OpNames.size()));
       }
     }
     





More information about the llvm-commits mailing list