changeset 15171:7a19e8275d41

Do not simplify the CFG during type inference * jit-ir.cc (jit_block::maybe_split): Keep define before use in block list. * pt-jit.cc (jit_convert::merge_blocks): Removed function. (jit_convert::jit_convert, jit_convert::construct_ssa): Do not call merge_blocks. (tree_jit::initialize): Simplify CFG before optimization passes. * pt-jit.h (jit_convert::merge_blocks): Remove declaration.
author Max Brister <max@2bass.com>
date Mon, 13 Aug 2012 20:24:14 -0500
parents a44ff4f0a20b
children c7d466a02065
files src/interp-core/jit-ir.cc src/interp-core/pt-jit.cc src/interp-core/pt-jit.h
diffstat 3 files changed, 17 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/interp-core/jit-ir.cc	Mon Aug 13 15:43:49 2012 -0700
+++ b/src/interp-core/jit-ir.cc	Mon Aug 13 20:24:14 2012 -0500
@@ -404,11 +404,8 @@
       size_t idx = term->successor_index (asuccessor);
       jit_block *split = convert.create<jit_block> ("phi_split", mvisit_count);
 
-      // try to place splits where they make sense
-      if (id () < asuccessor->id ())
-        convert.insert_before (asuccessor, split);
-      else
-        convert.insert_after (this, split);
+      // place after this to ensure define before use in the blocks list
+      convert.insert_after (this, split);
 
       term->stash_argument (idx, split);
       jit_branch *br = split->append (convert.create<jit_branch> (asuccessor));
--- a/src/interp-core/pt-jit.cc	Mon Aug 13 15:43:49 2012 -0700
+++ b/src/interp-core/pt-jit.cc	Mon Aug 13 20:24:14 2012 -0500
@@ -120,7 +120,6 @@
     }
 
   remove_dead ();
-  merge_blocks ();
   final_block->label ();
   place_releases ();
   simplify_phi ();
@@ -950,35 +949,8 @@
 }
 
 void
-jit_convert::merge_blocks (void)
-{
-  std::vector<jit_block *> dead;
-  for (block_list::iterator iter = blocks.begin (); iter != blocks.end ();
-       ++iter)
-    {
-      jit_block *b = *iter;
-      jit_block *merged = b->maybe_merge ();
-
-      if (merged)
-        {
-          if (merged == final_block)
-            final_block = b;
-
-          if (merged == entry_block)
-            entry_block = b;
-
-          dead.push_back (merged);
-        }
-    }
-
-  for (size_t i = 0; i < dead.size (); ++i)
-    blocks.erase (dead[i]->location ());
-}
-
-void
 jit_convert::construct_ssa (void)
 {
-  merge_blocks ();
   final_block->label ();
   final_block->compute_idom (entry_block);
   entry_block->compute_df ();
@@ -1608,6 +1580,7 @@
 
   pass_manager = new llvm::FunctionPassManager (module);
   pass_manager->add (new llvm::TargetData(*engine->getTargetData ()));
+  pass_manager->add (llvm::createCFGSimplificationPass ());
   pass_manager->add (llvm::createBasicAliasAnalysisPass ());
   pass_manager->add (llvm::createPromoteMemoryToRegisterPass ());
   pass_manager->add (llvm::createInstructionCombiningPass ());
@@ -2009,4 +1982,18 @@
 %! endwhile
 %! assert (a, ones (1, num));
 
+%!function test_compute_idom ()
+%! while (li <= length (l1) && si <= length (s1))
+%!   if (l1 (li) < s1 (si))
+%!     if (li == si)
+%!       break;
+%!     endif;
+%!     li++;
+%!   else
+%!     si++;
+%!   endif;
+%! endwhile
+
+%!error test_compute_idom ()
+
 */
--- a/src/interp-core/pt-jit.h	Mon Aug 13 15:43:49 2012 -0700
+++ b/src/interp-core/pt-jit.h	Mon Aug 13 20:24:14 2012 -0500
@@ -334,8 +334,6 @@
     all_values.push_back (value);
   }
 
-  void merge_blocks (void);
-
   void construct_ssa (void);
 
   void do_construct_ssa (jit_block& block, size_t avisit_count);