diff libinterp/interp-core/pt-jit.cc @ 15370:8355fddce815

Use sret and do not use save/restore stack (bug #37308) * jit-typeinfo.cc (octave_jit_grab_matrix, octave_jit_cast_matrix_any, octave_jit_paren_subsasgn_impl, octave_jit_paren_scalar_subsasgn, octave_jit_paren_subsasgn_matrix_range): Return matrix directly. (octave_jit_cast_range_any): Return range directly. (jit_function::jit_function): Maybe mark llvm function return as sret. (jit_function::call): Maybe mark llvm call sret and place allocas at function entry. (jit_function::do_return): Handle new parameter, verify. (jit_typeinfo::jit_typeinfo): Match C++ std::complex type better, pass jit_convetion::external explicitly, and disable right complex division. (jit_typeinfo::create_identity): Improve name. (jit_typeinfo::pack_complex, jit_typeinfo::unpack_complex): Handle changed complex format. * jit-typeinfo.h (jit_array::jit_array): New overload. (jit_type::mark_sret, jit_type::mark_pointer_arg): Remove default convention. (jit_function::do_return): Add verify parameter. * pt-jit.cc (jit_convert_llvm::convert_function): Store the jit_function. (jit_convert::visit): Call do_return if converting a function. * pt-jit.h (jit_convert_llvm::creating): New member variable.
author Max Brister <max@2bass.com>
date Wed, 12 Sep 2012 19:18:51 -0600
parents 6bdf379592d9
children 8ccb187b24e9
line wrap: on
line diff
--- a/libinterp/interp-core/pt-jit.cc
+++ b/libinterp/interp-core/pt-jit.cc
@@ -1075,8 +1075,8 @@
   jit_return *ret = dynamic_cast<jit_return *> (final_block->back ());
   assert (ret);
 
-  jit_function creating = jit_function (module, jit_convention::internal,
-                                        "foobar", ret->result_type (), args);
+  creating = jit_function (module, jit_convention::internal,
+                           "foobar", ret->result_type (), args);
   function = creating.to_llvm ();
 
   try
@@ -1280,10 +1280,16 @@
 jit_convert_llvm::visit (jit_return& ret)
 {
   jit_value *res = ret.result ();
-  if (res)
-    builder.CreateRet (res->to_llvm ());
+
+  if (converting_function)
+    creating.do_return (builder, res->to_llvm (), false);
   else
-    builder.CreateRetVoid ();
+    {
+      if (res)
+        builder.CreateRet (res->to_llvm ());
+      else
+        builder.CreateRetVoid ();
+    }
 }
 
 void