diff --git a/support/tools/TableGen/InstrSelectorEmitter.cpp b/support/tools/TableGen/InstrSelectorEmitter.cpp
index 98bd994..522cd11 100644
--- a/support/tools/TableGen/InstrSelectorEmitter.cpp
+++ b/support/tools/TableGen/InstrSelectorEmitter.cpp
@@ -24,7 +24,6 @@
 ///
 void InstrSelectorEmitter::ProcessNodeTypes() {
   std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode");
-
   for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
     Record *Node = Nodes[i];
     
@@ -36,21 +35,48 @@
     ListInit *Args = Node->getValueAsListInit("ArgTypes");
     std::vector<NodeType::ArgResultTypes> ArgTypes;
 
-    for (unsigned a = 0, e = Args->getSize(); a != e; ++a)
+    for (unsigned a = 0, e = Args->getSize(); a != e; ++a) {
       if (DefInit *DI = dynamic_cast<DefInit*>(Args->getElement(a)))
         ArgTypes.push_back(NodeType::Translate(DI->getDef()));
       else
         throw "In node " + Node->getName() + ", argument is not a Def!";
 
+      if (a == 0 && ArgTypes.back() == NodeType::Arg0)
+        throw "In node " + Node->getName() + ", arg 0 cannot have type 'arg0'!";
+      if (ArgTypes.back() == NodeType::Void)
+        throw "In node " + Node->getName() + ", args cannot be void type!";
+    }
+    if (RetTy == NodeType::Arg0 && Args->getSize() == 0)
+      throw "In node " + Node->getName() +
+            ", invalid return type for nullary node!";
+
     // Add the node type mapping now...
     NodeTypes[Node] = NodeType(RetTy, ArgTypes);
   }  
 }
 
+/// ProcessInstructionPatterns - Read in all subclasses of Instruction, and
+/// process those with a useful Pattern field.
+///
+void InstrSelectorEmitter::ProcessInstructionPatterns() {
+  std::vector<Record*> Insts = Records.getAllDerivedDefinitions("Instruction");
+  for (unsigned i = 0, e = Insts.size(); i != e; ++i) {
+    Record *Inst = Insts[i];
+    if (DagInit *PatternInit =
+          dynamic_cast<DagInit*>(Inst->getValueInit("Pattern"))) {
+
+    }
+  }
+}
+
+
 void InstrSelectorEmitter::run(std::ostream &OS) {
   // Type-check all of the node types to ensure we "understand" them.
   ProcessNodeTypes();
   
-  
+  // Read all of the instruction patterns in...
+  ProcessInstructionPatterns();
+
+  // Read all of the Expander patterns in...
   
 }
diff --git a/support/tools/TableGen/InstrSelectorEmitter.h b/support/tools/TableGen/InstrSelectorEmitter.h
index 5033a41..941763e 100644
--- a/support/tools/TableGen/InstrSelectorEmitter.h
+++ b/support/tools/TableGen/InstrSelectorEmitter.h
@@ -17,12 +17,10 @@
     // Both argument and return types...
     Val,            // A non-void type
     Arg0,           // Value matches the type of Arg0
+    Ptr,            // Tree node is the type of the target pointer
 
     // Return types
     Void,           // Tree node always returns void
-
-    // Argument types
-    Ptr,            // Tree node is the target argument type
   };
 
   ArgResultTypes ResultType;
@@ -36,7 +34,6 @@
   NodeType(const NodeType &N) : ResultType(N.ResultType), ArgTypes(N.ArgTypes){}
 
   static ArgResultTypes Translate(Record *R);
-
 };
 
 class InstrSelectorEmitter : public TableGenBackend {
@@ -54,6 +51,10 @@
   // RecordKeeper, turning them into the more accessible NodeTypes data
   // structure.
   void ProcessNodeTypes();
+
+  // ProcessInstructionPatterns - Read in all subclasses of Instruction, and
+  // process those with a useful Pattern field.
+  void ProcessInstructionPatterns();
 };
 
 #endif
diff --git a/utils/TableGen/InstrSelectorEmitter.cpp b/utils/TableGen/InstrSelectorEmitter.cpp
index 98bd994..522cd11 100644
--- a/utils/TableGen/InstrSelectorEmitter.cpp
+++ b/utils/TableGen/InstrSelectorEmitter.cpp
@@ -24,7 +24,6 @@
 ///
 void InstrSelectorEmitter::ProcessNodeTypes() {
   std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode");
-
   for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
     Record *Node = Nodes[i];
     
@@ -36,21 +35,48 @@
     ListInit *Args = Node->getValueAsListInit("ArgTypes");
     std::vector<NodeType::ArgResultTypes> ArgTypes;
 
-    for (unsigned a = 0, e = Args->getSize(); a != e; ++a)
+    for (unsigned a = 0, e = Args->getSize(); a != e; ++a) {
       if (DefInit *DI = dynamic_cast<DefInit*>(Args->getElement(a)))
         ArgTypes.push_back(NodeType::Translate(DI->getDef()));
       else
         throw "In node " + Node->getName() + ", argument is not a Def!";
 
+      if (a == 0 && ArgTypes.back() == NodeType::Arg0)
+        throw "In node " + Node->getName() + ", arg 0 cannot have type 'arg0'!";
+      if (ArgTypes.back() == NodeType::Void)
+        throw "In node " + Node->getName() + ", args cannot be void type!";
+    }
+    if (RetTy == NodeType::Arg0 && Args->getSize() == 0)
+      throw "In node " + Node->getName() +
+            ", invalid return type for nullary node!";
+
     // Add the node type mapping now...
     NodeTypes[Node] = NodeType(RetTy, ArgTypes);
   }  
 }
 
+/// ProcessInstructionPatterns - Read in all subclasses of Instruction, and
+/// process those with a useful Pattern field.
+///
+void InstrSelectorEmitter::ProcessInstructionPatterns() {
+  std::vector<Record*> Insts = Records.getAllDerivedDefinitions("Instruction");
+  for (unsigned i = 0, e = Insts.size(); i != e; ++i) {
+    Record *Inst = Insts[i];
+    if (DagInit *PatternInit =
+          dynamic_cast<DagInit*>(Inst->getValueInit("Pattern"))) {
+
+    }
+  }
+}
+
+
 void InstrSelectorEmitter::run(std::ostream &OS) {
   // Type-check all of the node types to ensure we "understand" them.
   ProcessNodeTypes();
   
-  
+  // Read all of the instruction patterns in...
+  ProcessInstructionPatterns();
+
+  // Read all of the Expander patterns in...
   
 }
diff --git a/utils/TableGen/InstrSelectorEmitter.h b/utils/TableGen/InstrSelectorEmitter.h
index 5033a41..941763e 100644
--- a/utils/TableGen/InstrSelectorEmitter.h
+++ b/utils/TableGen/InstrSelectorEmitter.h
@@ -17,12 +17,10 @@
     // Both argument and return types...
     Val,            // A non-void type
     Arg0,           // Value matches the type of Arg0
+    Ptr,            // Tree node is the type of the target pointer
 
     // Return types
     Void,           // Tree node always returns void
-
-    // Argument types
-    Ptr,            // Tree node is the target argument type
   };
 
   ArgResultTypes ResultType;
@@ -36,7 +34,6 @@
   NodeType(const NodeType &N) : ResultType(N.ResultType), ArgTypes(N.ArgTypes){}
 
   static ArgResultTypes Translate(Record *R);
-
 };
 
 class InstrSelectorEmitter : public TableGenBackend {
@@ -54,6 +51,10 @@
   // RecordKeeper, turning them into the more accessible NodeTypes data
   // structure.
   void ProcessNodeTypes();
+
+  // ProcessInstructionPatterns - Read in all subclasses of Instruction, and
+  // process those with a useful Pattern field.
+  void ProcessInstructionPatterns();
 };
 
 #endif
