Mercurial > octave-nkf
diff src/pt-jit.cc @ 14965:f2117a963c54
Place grab/release for assignments
* src/pt-jit.cc (jit_instruction::do_construct_ssa):
Only do replacement if variable is defined.
(jit_convert::jit_convert_llvm::visit): Place grab/release.
* src/pt-jit.h (jit_typeinfo::get_grab): New function.
(jit_assign_base::jit_assign_base): Added another argument to overload.
(jit_assign::jit_assign): Keep track of previous variable value.
author | Max Brister <max@2bass.com> |
---|---|
date | Thu, 21 Jun 2012 17:37:36 -0500 |
parents | 434ffa574c78 |
children | b7b647bc4b90 |
line wrap: on
line diff
--- a/src/pt-jit.cc Thu Jun 21 16:21:47 2012 -0500 +++ b/src/pt-jit.cc Thu Jun 21 17:37:36 2012 -0500 @@ -1052,7 +1052,7 @@ { jit_value *arg = argument (i); jit_variable *var = dynamic_cast<jit_variable *> (arg); - if (var) + if (var && var->has_top ()) stash_argument (i, var->top ()); } } @@ -2726,6 +2726,24 @@ jit_convert::convert_llvm::visit (jit_assign& assign) { assign.stash_llvm (assign.src ()->to_llvm ()); + + jit_value *new_value = assign.src (); + if (isa<jit_assign_base> (new_value)) // only grab non-temporaries + { + const jit_function::overload& ol + = jit_typeinfo::get_grab (new_value->type ()); + if (ol.function) + create_call (ol, new_value); + } + + jit_value *overwrite = assign.overwrite (); + if (isa<jit_assign_base> (overwrite)) + { + const jit_function::overload& ol + = jit_typeinfo::get_release (overwrite->type ()); + if (ol.function) + create_call (ol, overwrite); + } } void