# HG changeset patch # User Max Brister # Date 1340318256 18000 # Node ID f2117a963c545859cb1b6a8dc71baf32d6fc0786 # Parent 434ffa574c783846c696d68e9ef8ce92553a5267 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. diff -r 434ffa574c78 -r f2117a963c54 src/pt-jit.cc --- 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 (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 (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 (overwrite)) + { + const jit_function::overload& ol + = jit_typeinfo::get_release (overwrite->type ()); + if (ol.function) + create_call (ol, overwrite); + } } void diff -r 434ffa574c78 -r f2117a963c54 src/pt-jit.h --- a/src/pt-jit.h Thu Jun 21 16:21:47 2012 -0500 +++ b/src/pt-jit.h Thu Jun 21 17:37:36 2012 -0500 @@ -453,6 +453,11 @@ static const jit_function& grab (void) { return instance->grab_fn; } + static const jit_function::overload& get_grab (jit_type *type) + { + return instance->grab_fn.get_overload (type); + } + static const jit_function& release (void) { return instance->release_fn; @@ -1519,8 +1524,8 @@ jit_assign_base (jit_variable *adest, size_t npred) : jit_instruction (npred), mdest (adest) {} - jit_assign_base (jit_variable *adest, jit_value *arg0) - : jit_instruction (arg0), mdest (adest) {} + jit_assign_base (jit_variable *adest, jit_value *arg0, jit_value *arg1) + : jit_instruction (arg0, arg1), mdest (adest) {} jit_variable *dest (void) const { return mdest; } @@ -1551,11 +1556,16 @@ { public: jit_assign (jit_variable *adest, jit_value *asrc) - : jit_assign_base (adest, asrc) {} + : jit_assign_base (adest, adest, asrc) {} + + jit_value *overwrite (void) const + { + return argument (0); + } jit_value *src (void) const { - return argument (0); + return argument (1); } virtual bool infer (void)