changeset 15148:98a65d9e426f

Remove uneeded release overloads * jit-typeinfo.cc (jit_typeinfo::jit_typeinfo): Remove overloads for scalar, complex, and index release. * pt-jit.cc (jit_convert::release_temp, jit_convert::release_dead_phi, jit_convert::convert_llvm::visit): Only release when required.
author Max Brister <max@2bass.com>
date Fri, 10 Aug 2012 16:19:27 -0500
parents 709e8928e68c
children 1b2fbc30e4e7
files src/interp-core/jit-typeinfo.cc src/interp-core/pt-jit.cc
diffstat 2 files changed, 15 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/src/interp-core/jit-typeinfo.cc
+++ b/src/interp-core/jit-typeinfo.cc
@@ -1159,18 +1159,6 @@
   fn.add_mapping (engine, &octave_jit_release_matrix);
   release_fn.add_overload (fn);
 
-  // release scalar
-  fn = create_identity (scalar);
-  release_fn.add_overload (fn);
-
-  // release complex
-  fn = create_identity (complex);
-  release_fn.add_overload (fn);
-
-  // release index
-  fn = create_identity (index);
-  release_fn.add_overload (fn);
-
   // now for binary scalar operations
   add_binary_op (scalar, octave_value::op_add, llvm::Instruction::FAdd);
   add_binary_op (scalar, octave_value::op_sub, llvm::Instruction::FSub);
--- a/src/interp-core/pt-jit.cc
+++ b/src/interp-core/pt-jit.cc
@@ -1145,7 +1145,7 @@
       if (instr->needs_release ())
         {
           jit_block *fu_block = instr->first_use_block ();
-          if (fu_block && fu_block != &ablock)
+          if (fu_block && fu_block != &ablock && instr->needs_release ())
             temp.insert (instr);
         }
 
@@ -1155,15 +1155,15 @@
           for (size_t i = 0; i < instr->argument_count (); ++i)
             {
               jit_value *arg = instr->argument (i);
-              if (arg->needs_release ())
-                {
-                  jit_call *release = create<jit_call> (&jit_typeinfo::release,
-                                                        arg);
-                  release->infer ();
-                  ablock.insert_after (iter, release);
-                  ++iter;
-                  temp.erase (arg);
-                }
+              if (! arg->needs_release ())
+                continue;
+
+              jit_call *release = create<jit_call> (&jit_typeinfo::release,
+                                                    arg);
+              release->infer ();
+              ablock.insert_after (iter, release);
+              ++iter;
+              temp.erase (arg);
             }
         }
     }
@@ -1202,6 +1202,9 @@
           for (size_t i = 0; i < phi->argument_count (); ++i)
             {
               jit_value *arg = phi->argument (i);
+              if (! arg->needs_release ())
+                continue;
+
               jit_block *inc = phi->incomming (i);
               jit_block *split = inc->maybe_split (*this, ablock);
               jit_terminator *term = split->terminator ();
@@ -1511,7 +1514,8 @@
   if (isa<jit_assign_base> (overwrite))
     {
       const jit_function& ol = jit_typeinfo::get_release (overwrite->type ());
-      ol.call (builder, overwrite);
+      if (ol.valid ())
+        ol.call (builder, overwrite);
     }
 }