diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 0a61251..4aa888b 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -1972,7 +1972,7 @@
     if (Matcher == 0)
       Matcher = N;
     else
-      Matcher = new PushMatcherNode(N, Matcher);
+      Matcher = new ScopeMatcherNode(N, Matcher);
   }
 
   Matcher = OptimizeMatcher(Matcher);
diff --git a/utils/TableGen/DAGISelMatcher.cpp b/utils/TableGen/DAGISelMatcher.cpp
index 0b0a1be..6588bc0 100644
--- a/utils/TableGen/DAGISelMatcher.cpp
+++ b/utils/TableGen/DAGISelMatcher.cpp
@@ -24,10 +24,10 @@
 }
 
 
-void PushMatcherNode::print(raw_ostream &OS, unsigned indent) const {
-  OS.indent(indent) << "Push\n";
-  printNext(OS, indent+2);
-  Failure->print(OS, indent);
+void ScopeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
+  OS.indent(indent) << "Scope\n";
+  Check->print(OS, indent+2);
+  printNext(OS, indent);
 }
 
 void RecordMatcherNode::print(raw_ostream &OS, unsigned indent) const {
diff --git a/utils/TableGen/DAGISelMatcher.h b/utils/TableGen/DAGISelMatcher.h
index 3505bb8..757bf60 100644
--- a/utils/TableGen/DAGISelMatcher.h
+++ b/utils/TableGen/DAGISelMatcher.h
@@ -39,7 +39,7 @@
 public:
   enum KindTy {
     // Matcher state manipulation.
-    Push,                 // Push a checking scope.
+    Scope,                // 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.
@@ -100,24 +100,24 @@
   void printNext(raw_ostream &OS, unsigned indent) 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'.
-class PushMatcherNode : public MatcherNode {
-  OwningPtr<MatcherNode> Failure;
+/// ScopeMatcherNode - This pushes a failure scope on the stack and evaluates
+/// 'Check'.  If 'Check' fails to match, it pops its scope and continues on to
+/// 'Next'.
+class ScopeMatcherNode : public MatcherNode {
+  OwningPtr<MatcherNode> Check;
 public:
-  PushMatcherNode(MatcherNode *next = 0, MatcherNode *failure = 0)
-    : MatcherNode(Push), Failure(failure) {
+  ScopeMatcherNode(MatcherNode *check = 0, MatcherNode *next = 0)
+    : MatcherNode(Scope), Check(check) {
     setNext(next);
   }
   
-  MatcherNode *getFailure() { return Failure.get(); }
-  const MatcherNode *getFailure() const { return Failure.get(); }
-  void setFailure(MatcherNode *N) { Failure.reset(N); }
-  OwningPtr<MatcherNode> &getFailurePtr() { return Failure; }
+  MatcherNode *getCheck() { return Check.get(); }
+  const MatcherNode *getCheck() const { return Check.get(); }
+  void setCheck(MatcherNode *N) { Check.reset(N); }
+  OwningPtr<MatcherNode> &getCheckPtr() { return Check; }
 
   static inline bool classof(const MatcherNode *N) {
-    return N->getKind() == Push;
+    return N->getKind() == Scope;
   }
   
   virtual void print(raw_ostream &OS, unsigned indent = 0) const;
diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp
index 4c5686f..290c8d4 100644
--- a/utils/TableGen/DAGISelMatcherEmitter.cpp
+++ b/utils/TableGen/DAGISelMatcherEmitter.cpp
@@ -155,7 +155,7 @@
   OS.PadToColumn(Indent*2);
   
   switch (N->getKind()) {
-  case MatcherNode::Push: assert(0 && "Should be handled by caller");
+  case MatcherNode::Scope: assert(0 && "Should be handled by caller");
   case MatcherNode::RecordNode:
     OS << "OPC_RecordNode,";
     OS.PadToColumn(CommentIndent) << "// "
@@ -388,8 +388,8 @@
       Histogram.resize(N->getKind()+1);
     Histogram[N->getKind()]++;
     
-    // Push is a special case since it is binary.
-    if (const PushMatcherNode *PMN = dyn_cast<PushMatcherNode>(N)) {
+    // Scope is a special case since it is binary.
+    if (const ScopeMatcherNode *SMN = dyn_cast<ScopeMatcherNode>(N)) {
       // We need to encode the child and the offset of the failure code before
       // emitting either of them.  Handle this by buffering the output into a
       // string while we get the size.
@@ -398,7 +398,7 @@
       {
         raw_svector_ostream OS(TmpBuf);
         formatted_raw_ostream FOS(OS);
-        NextSize = EmitMatcherList(cast<PushMatcherNode>(N)->getNext(),
+        NextSize = EmitMatcherList(cast<ScopeMatcherNode>(N)->getCheck(),
                                    Indent+1, CurrentIdx+2, FOS);
       }
 
@@ -408,7 +408,7 @@
         TmpBuf.clear();
         raw_svector_ostream OS(TmpBuf);
         formatted_raw_ostream FOS(OS);
-        NextSize = EmitMatcherList(cast<PushMatcherNode>(N)->getNext(),
+        NextSize = EmitMatcherList(cast<ScopeMatcherNode>(N)->getCheck(),
                                    Indent+1, CurrentIdx+3, FOS);
         if (NextSize > 65535) {
           errs() <<
@@ -421,14 +421,14 @@
       OS.PadToColumn(Indent*2);
       
       if (NextSize < 256)
-        OS << "OPC_Push, " << NextSize << ",\n";
+        OS << "OPC_Scope, " << NextSize << ",\n";
       else
-        OS << "OPC_Push2, " << (NextSize&255) << ", " << (NextSize>>8) << ",\n";
+        OS << "OPC_Scope2, " << (NextSize&255) << ", " << (NextSize>>8) <<",\n";
       OS << TmpBuf.str();
       
       Size += 2+NextSize;
       CurrentIdx += 2+NextSize;
-      N = PMN->getFailure();
+      N = SMN->getNext();
       continue;
     }
   
@@ -514,7 +514,7 @@
   for (unsigned i = 0, e = Histogram.size(); i != e; ++i) {
     OS << "  // #";
     switch ((MatcherNode::KindTy)i) {
-    case MatcherNode::Push: OS << "OPC_Push"; break; 
+    case MatcherNode::Scope: OS << "OPC_Scope"; break; 
     case MatcherNode::RecordNode: OS << "OPC_RecordNode"; break; 
     case MatcherNode::RecordChild: OS << "OPC_RecordChild"; break;
     case MatcherNode::RecordMemRef: OS << "OPC_RecordMemRef"; break;
diff --git a/utils/TableGen/DAGISelMatcherOpt.cpp b/utils/TableGen/DAGISelMatcherOpt.cpp
index 796b815..623d870 100644
--- a/utils/TableGen/DAGISelMatcherOpt.cpp
+++ b/utils/TableGen/DAGISelMatcherOpt.cpp
@@ -14,14 +14,14 @@
 #include "DAGISelMatcher.h"
 using namespace llvm;
 
-static void ContractNodes(OwningPtr<MatcherNode> &Matcher) {
+static void ContractNodes(OwningPtr<MatcherNode> &MatcherPtr) {
   // If we reached the end of the chain, we're done.
-  MatcherNode *N = Matcher.get();
+  MatcherNode *N = MatcherPtr.get();
   if (N == 0) return;
   
-  // If we have a push node, walk down both edges.
-  if (PushMatcherNode *Push = dyn_cast<PushMatcherNode>(N))
-    ContractNodes(Push->getFailurePtr());
+  // If we have a scope node, walk down both edges.
+  if (ScopeMatcherNode *Push = dyn_cast<ScopeMatcherNode>(N))
+    ContractNodes(Push->getCheckPtr());
   
   // If we found a movechild node with a node that comes in a 'foochild' form,
   // transform it.
@@ -35,25 +35,24 @@
     
     if (New) {
       // Insert the new node.
-      New->setNext(Matcher.take());
-      Matcher.reset(New);
+      New->setNext(MatcherPtr.take());
+      MatcherPtr.reset(New);
       // Remove the old one.
       MC->setNext(MC->getNext()->takeNext());
-      return ContractNodes(Matcher);
+      return ContractNodes(MatcherPtr);
     }
   }
   
   if (MoveChildMatcherNode *MC = dyn_cast<MoveChildMatcherNode>(N))
     if (MoveParentMatcherNode *MP = 
           dyn_cast<MoveParentMatcherNode>(MC->getNext())) {
-      Matcher.reset(MP->takeNext());
-      return ContractNodes(Matcher);
+      MatcherPtr.reset(MP->takeNext());
+      return ContractNodes(MatcherPtr);
     }
   
   ContractNodes(N->getNextPtr());
 }
 
-
 MatcherNode *llvm::OptimizeMatcher(MatcherNode *Matcher) {
   OwningPtr<MatcherNode> MatcherPtr(Matcher);
   ContractNodes(MatcherPtr);
