check in anton's patch to make inlining happen in a determinstic order
authorChris Lattner <sabre@nondot.org>
Mon, 30 Jun 2008 03:02:03 +0000 (03:02 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 30 Jun 2008 03:02:03 +0000 (03:02 +0000)
and fix the bug that it uncovers: inlining a pattern fragment could bring
in other pattern fragments if the inlinee hadn't already been inlined.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52888 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/CodeGenDAGPatterns.cpp

index 2a7fd0bbfa2c26f3bae96f5519cdb618b39cc3e9..1948c904adc2500c608580c41b0dfe474f43249c 100644 (file)
@@ -679,7 +679,10 @@ TreePatternNode *TreePatternNode::InlinePatternFragments(TreePattern &TP) {
   
   // Get a new copy of this fragment to stitch into here.
   //delete this;    // FIXME: implement refcounting!
-  return FragTree;
+  
+  // The fragment we inlined could have recursive inlining that is needed.  See
+  // if there are any pattern fragments in it and inline them as needed.
+  return FragTree->InlinePatternFragments(TP);
 }
 
 /// getImplicitType - Check to see if the specified record has an implicit
@@ -1383,9 +1386,8 @@ void CodeGenDAGPatterns::ParsePatternFragments() {
   
   // Now that we've parsed all of the tree fragments, do a closure on them so
   // that there are not references to PatFrags left inside of them.
-  for (std::map<Record*, TreePattern*>::iterator I = PatternFragments.begin(),
-       E = PatternFragments.end(); I != E; ++I) {
-    TreePattern *ThePat = I->second;
+  for (unsigned i = 0, e = Fragments.size(); i != e; ++i) {
+    TreePattern *ThePat = PatternFragments[Fragments[i]];
     ThePat->InlinePatternFragments();
         
     // Infer as many types as possible.  Don't worry about it if we don't infer