change the scope node to include a list of children to be checked
[oota-llvm.git] / utils / TableGen / DAGISelEmitter.cpp
index 0a612516211fcbc55360f001609f1c934427645d..5e2b07d0d4c398506409b9e931ae559d73ae70a5 100644 (file)
@@ -1945,8 +1945,6 @@ void DAGISelEmitter::run(raw_ostream &OS) {
   }
   
 #ifdef ENABLE_NEW_ISEL
-  MatcherNode *Matcher = 0;
-
   // Add all the patterns to a temporary list so we can sort them.
   std::vector<const PatternToMatch*> Patterns;
   for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(), E = CGP.ptm_end();
@@ -1960,25 +1958,18 @@ void DAGISelEmitter::run(raw_ostream &OS) {
                    PatternSortingPredicate2(CGP));
   
   
-  // Walk the patterns backwards (since we append to the front of the generated
-  // code), building a matcher for each and adding it to the matcher for the
-  // whole target.
-  while (!Patterns.empty()) {
-    const PatternToMatch &Pattern = *Patterns.back();
-    Patterns.pop_back();
-    
-    MatcherNode *N = ConvertPatternToMatcher(Pattern, CGP);
-    
-    if (Matcher == 0)
-      Matcher = N;
-    else
-      Matcher = new PushMatcherNode(N, Matcher);
-  }
+  // Convert each pattern into Matcher's.
+  std::vector<Matcher*> PatternMatchers;
+  for (unsigned i = 0, e = Patterns.size(); i != e; ++i)
+    PatternMatchers.push_back(ConvertPatternToMatcher(*Patterns[i], CGP));
+  
+  Matcher *TheMatcher = new ScopeMatcher(&PatternMatchers[0],
+                                         PatternMatchers.size());
 
-  Matcher = OptimizeMatcher(Matcher);
+  TheMatcher = OptimizeMatcher(TheMatcher);
   //Matcher->dump();
-  EmitMatcherTable(Matcher, OS);
-  delete Matcher;
+  EmitMatcherTable(TheMatcher, OS);
+  delete TheMatcher;
   
 #else
   // At this point, we have full information about the 'Patterns' we need to