Mercurial > hg > octave-lyh
comparison 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 |
comparison
equal
deleted
inserted
replaced
15369:715220d2b511 | 15370:8355fddce815 |
---|---|
1073 | 1073 |
1074 jit_block *final_block = blocks.back (); | 1074 jit_block *final_block = blocks.back (); |
1075 jit_return *ret = dynamic_cast<jit_return *> (final_block->back ()); | 1075 jit_return *ret = dynamic_cast<jit_return *> (final_block->back ()); |
1076 assert (ret); | 1076 assert (ret); |
1077 | 1077 |
1078 jit_function creating = jit_function (module, jit_convention::internal, | 1078 creating = jit_function (module, jit_convention::internal, |
1079 "foobar", ret->result_type (), args); | 1079 "foobar", ret->result_type (), args); |
1080 function = creating.to_llvm (); | 1080 function = creating.to_llvm (); |
1081 | 1081 |
1082 try | 1082 try |
1083 { | 1083 { |
1084 prelude = creating.new_block ("prelude"); | 1084 prelude = creating.new_block ("prelude"); |
1278 | 1278 |
1279 void | 1279 void |
1280 jit_convert_llvm::visit (jit_return& ret) | 1280 jit_convert_llvm::visit (jit_return& ret) |
1281 { | 1281 { |
1282 jit_value *res = ret.result (); | 1282 jit_value *res = ret.result (); |
1283 if (res) | 1283 |
1284 builder.CreateRet (res->to_llvm ()); | 1284 if (converting_function) |
1285 creating.do_return (builder, res->to_llvm (), false); | |
1285 else | 1286 else |
1286 builder.CreateRetVoid (); | 1287 { |
1288 if (res) | |
1289 builder.CreateRet (res->to_llvm ()); | |
1290 else | |
1291 builder.CreateRetVoid (); | |
1292 } | |
1287 } | 1293 } |
1288 | 1294 |
1289 void | 1295 void |
1290 jit_convert_llvm::visit (jit_phi& phi) | 1296 jit_convert_llvm::visit (jit_phi& phi) |
1291 { | 1297 { |