diff src/interp-core/pt-jit.cc @ 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 6242904370bd
children ed2b911a2fb3
line wrap: on
line diff
--- 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 ()
+
 */