Mercurial > hg > octave-lojdl
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 +++ b/src/interp-core/jit-ir.cc @@ -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 +++ 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<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 () + */