diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp
index c25243d..76241c5 100644
--- a/utils/TableGen/DAGISelMatcherEmitter.cpp
+++ b/utils/TableGen/DAGISelMatcherEmitter.cpp
@@ -445,64 +445,73 @@
   // here into the case stmts.
   
   // Emit pattern predicates.
-  OS << "bool CheckPatternPredicate(unsigned PredNo) const {\n";
-  OS << "  switch (PredNo) {\n";
-  OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
-  for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i)
-    OS << "  case " << i << ": return "  << PatternPredicates[i] << ";\n";
-  OS << "  }\n";
-  OS << "}\n\n";
+  if (!PatternPredicates.empty()) {
+    OS << "bool CheckPatternPredicate(unsigned PredNo) const {\n";
+    OS << "  switch (PredNo) {\n";
+    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
+    for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i)
+      OS << "  case " << i << ": return "  << PatternPredicates[i] << ";\n";
+    OS << "  }\n";
+    OS << "}\n\n";
+  }
+    
 
   // Emit Node predicates.
-  OS << "bool CheckNodePredicate(SDNode *N, unsigned PredNo) const {\n";
-  OS << "  switch (PredNo) {\n";
-  OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
-  for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i)
-    OS << "  case " << i << ": return "  << NodePredicates[i] << "(N);\n";
-  OS << "  }\n";
-  OS << "}\n\n";
+  if (!NodePredicates.empty()) {
+    OS << "bool CheckNodePredicate(SDNode *N, unsigned PredNo) const {\n";
+    OS << "  switch (PredNo) {\n";
+    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
+    for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i)
+      OS << "  case " << i << ": return "  << NodePredicates[i] << "(N);\n";
+    OS << "  }\n";
+    OS << "}\n\n";
+  }
   
   // Emit CompletePattern matchers.
   // FIXME: This should be const.
-  OS << "bool CheckComplexPattern(SDNode *Root, SDValue N,\n";
-  OS << "      unsigned PatternNo, SmallVectorImpl<SDValue> &Result) {\n";
-  OS << "  switch (PatternNo) {\n";
-  OS << "  default: assert(0 && \"Invalid pattern # in table?\");\n";
-  for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) {
-    const ComplexPattern &P = *ComplexPatterns[i];
-    unsigned NumOps = P.getNumOperands();
+  if (!ComplexPatterns.empty()) {
+    OS << "bool CheckComplexPattern(SDNode *Root, SDValue N,\n";
+    OS << "      unsigned PatternNo, SmallVectorImpl<SDValue> &Result) {\n";
+    OS << "  switch (PatternNo) {\n";
+    OS << "  default: assert(0 && \"Invalid pattern # in table?\");\n";
+    for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) {
+      const ComplexPattern &P = *ComplexPatterns[i];
+      unsigned NumOps = P.getNumOperands();
 
-    if (P.hasProperty(SDNPHasChain))
-      ++NumOps;  // Get the chained node too.
-    
-    OS << "  case " << i << ":\n";
-    OS << "    Result.resize(Result.size()+" << NumOps << ");\n";
-    OS << "    return "  << P.getSelectFunc();
+      if (P.hasProperty(SDNPHasChain))
+        ++NumOps;  // Get the chained node too.
+      
+      OS << "  case " << i << ":\n";
+      OS << "    Result.resize(Result.size()+" << NumOps << ");\n";
+      OS << "    return "  << P.getSelectFunc();
 
-    // FIXME: Temporary hack until old isel dies.
-    if (P.hasProperty(SDNPHasChain))
-      OS << "XXX";
-    
-    OS << "(Root, N";
-    for (unsigned i = 0; i != NumOps; ++i)
-      OS << ", Result[Result.size()-" << (NumOps-i) << ']';
-    OS << ");\n";
+      // FIXME: Temporary hack until old isel dies.
+      if (P.hasProperty(SDNPHasChain))
+        OS << "XXX";
+      
+      OS << "(Root, N";
+      for (unsigned i = 0; i != NumOps; ++i)
+        OS << ", Result[Result.size()-" << (NumOps-i) << ']';
+      OS << ");\n";
+    }
+    OS << "  }\n";
+    OS << "}\n\n";
   }
-  OS << "  }\n";
-  OS << "}\n\n";
   
   // Emit SDNodeXForm handlers.
   // FIXME: This should be const.
-  OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
-  OS << "  switch (XFormNo) {\n";
-  OS << "  default: assert(0 && \"Invalid xform # in table?\");\n";
-  
-  // FIXME: The node xform could take SDValue's instead of SDNode*'s.
-  for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i)
-    OS << "  case " << i << ": return Transform_" << NodeXForms[i]->getName()
-       << "(V.getNode());\n";
-  OS << "  }\n";
-  OS << "}\n\n";
+  if (!NodeXForms.empty()) {
+    OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
+    OS << "  switch (XFormNo) {\n";
+    OS << "  default: assert(0 && \"Invalid xform # in table?\");\n";
+    
+    // FIXME: The node xform could take SDValue's instead of SDNode*'s.
+    for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i)
+      OS << "  case " << i << ": return Transform_" << NodeXForms[i]->getName()
+         << "(V.getNode());\n";
+    OS << "  }\n";
+    OS << "}\n\n";
+  }
 }
 
 void MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) {
