# HG changeset patch # User Max Brister # Date 1344907454 18000 # Node ID 7a19e8275d41f634c6bc3504eb20c8ade78b434b # Parent a44ff4f0a20b06a051fac985b5d4d09490c78874 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. diff --git a/src/interp-core/jit-ir.cc b/src/interp-core/jit-ir.cc --- a/src/interp-core/jit-ir.cc +++ b/src/interp-core/jit-ir.cc @@ -404,11 +404,8 @@ size_t idx = term->successor_index (asuccessor); jit_block *split = convert.create ("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 (asuccessor)); diff --git a/src/interp-core/pt-jit.cc b/src/interp-core/pt-jit.cc --- a/src/interp-core/pt-jit.cc +++ b/src/interp-core/pt-jit.cc @@ -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 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 () + */ diff --git a/src/interp-core/pt-jit.h b/src/interp-core/pt-jit.h --- a/src/interp-core/pt-jit.h +++ b/src/interp-core/pt-jit.h @@ -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);