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