Mercurial > hg > octave-lyh
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