Mercurial > octave-nkf
comparison libinterp/interp-core/jit-typeinfo.h @ 15337:3f43e9d6d86e
JIT compile anonymous functions
* jit-ir.h (jit_block::front, jit_block::back): New function.
(jit_call::jit_call): New overloads.
(jit_return): New class.
* jit-typeinfo.cc (octave_jit_create_undef): New function.
(jit_operation::to_idx): Correctly handle empty type vector.
(jit_typeinfo::jit_typeinfo): Add destroy_fn and initialize create_undef.
* jit-typeinfo.h (jit_typeinfo::get_any_ptr, jit_typeinfo::destroy,
jit_typeinfo::create_undef): New function.
* pt-jit.cc (jit_convert::jit_convert): Add overload and refactor.
(jit_convert::initialize, jit_convert_llvm::convert_loop,
jit_convert_llvm::convert_function, tree_jit::do_execute,
jit_function_info::jit_function_info, jit_function_info::execute,
jit_function_info::match): New function.
(jit_convert::get_variable): Support function variable lookup.
(jit_convert_llvm::convert): Handle loop/function agnostic stuff.
(jit_convert_llvm::visit): Handle function creation as well.
(tree_jit::execute): Move implementation to tree_jit::do_execute.
(jit_info::compile): Call convert_loop instead of convert.
* pt-jit.h (jit_convert::jit_convert): New overload.
(jit_convert::initialize, jit_convert_llvm::convert_loop,
jit_convert_llvm::convert_function, tree_jit::do_execute): New function.
(jit_convert::create_variable, jit_convert_llvm::initialize): Update signature.
(tree_jit::execute): Made static.
(tree_jit::tree_jit): Made private.
(jit_function_info): New class.
* ov-usr-fcn.cc (octave_user_function::~octave_user_function): Delete jit_info.
(octave_user_function::octave_user_function): Maybe JIT and use is_special_expr
and special_expr.
(octave_user_function::special_expr): New function.
* ov-usr-fcn.h (octave_user_function::is_special_expr,
octave_user_function::special_expr, octave_user_function::get_info,
octave_user_function::stash_info): New function.
* pt-decl.h (tree_decl_elt::name): New function.
* pt-eval.cc (tree_evaluator::visit_simple_for_command,
tree_evaluator::visit_while_command): Use static tree_jit methods.
author | Max Brister <max@2bass.com> |
---|---|
date | Sun, 09 Sep 2012 00:29:00 -0600 |
parents | 8125773322d4 |
children | 8355fddce815 |
comparison
equal
deleted
inserted
replaced
15336:5fff79162342 | 15337:3f43e9d6d86e |
---|---|
450 static llvm::Type *get_scalar_llvm (void) | 450 static llvm::Type *get_scalar_llvm (void) |
451 { return instance->scalar->to_llvm (); } | 451 { return instance->scalar->to_llvm (); } |
452 | 452 |
453 static jit_type *get_scalar_ptr (void) { return instance->scalar_ptr; } | 453 static jit_type *get_scalar_ptr (void) { return instance->scalar_ptr; } |
454 | 454 |
455 static jit_type *get_any_ptr (void) { return instance->any_ptr; } | |
456 | |
455 static jit_type *get_range (void) { return instance->range; } | 457 static jit_type *get_range (void) { return instance->range; } |
456 | 458 |
457 static jit_type *get_string (void) { return instance->string; } | 459 static jit_type *get_string (void) { return instance->string; } |
458 | 460 |
459 static jit_type *get_bool (void) { return instance->boolean; } | 461 static jit_type *get_bool (void) { return instance->boolean; } |
496 static const jit_function& get_release (jit_type *type) | 498 static const jit_function& get_release (jit_type *type) |
497 { | 499 { |
498 return instance->release_fn.overload (type); | 500 return instance->release_fn.overload (type); |
499 } | 501 } |
500 | 502 |
503 static const jit_operation& destroy (void) | |
504 { | |
505 return instance->destroy_fn; | |
506 } | |
507 | |
501 static const jit_operation& print_value (void) | 508 static const jit_operation& print_value (void) |
502 { | 509 { |
503 return instance->print_fn; | 510 return instance->print_fn; |
504 } | 511 } |
505 | 512 |
560 | 567 |
561 static const jit_function& end (jit_value *value, jit_value *index, | 568 static const jit_function& end (jit_value *value, jit_value *index, |
562 jit_value *count) | 569 jit_value *count) |
563 { | 570 { |
564 return instance->do_end (value, index, count); | 571 return instance->do_end (value, index, count); |
572 } | |
573 | |
574 static const jit_operation& create_undef (void) | |
575 { | |
576 return instance->create_undef_fn; | |
565 } | 577 } |
566 private: | 578 private: |
567 jit_typeinfo (llvm::Module *m, llvm::ExecutionEngine *e); | 579 jit_typeinfo (llvm::Module *m, llvm::ExecutionEngine *e); |
568 | 580 |
569 // FIXME: Do these methods really need to be in jit_typeinfo? | 581 // FIXME: Do these methods really need to be in jit_typeinfo? |
749 | 761 |
750 std::vector<jit_operation> binary_ops; | 762 std::vector<jit_operation> binary_ops; |
751 std::vector<jit_operation> unary_ops; | 763 std::vector<jit_operation> unary_ops; |
752 jit_operation grab_fn; | 764 jit_operation grab_fn; |
753 jit_operation release_fn; | 765 jit_operation release_fn; |
766 jit_operation destroy_fn; | |
754 jit_operation print_fn; | 767 jit_operation print_fn; |
755 jit_operation for_init_fn; | 768 jit_operation for_init_fn; |
756 jit_operation for_check_fn; | 769 jit_operation for_check_fn; |
757 jit_operation for_index_fn; | 770 jit_operation for_index_fn; |
758 jit_operation logically_true_fn; | 771 jit_operation logically_true_fn; |
759 jit_operation make_range_fn; | 772 jit_operation make_range_fn; |
760 jit_paren_subsref paren_subsref_fn; | 773 jit_paren_subsref paren_subsref_fn; |
761 jit_paren_subsasgn paren_subsasgn_fn; | 774 jit_paren_subsasgn paren_subsasgn_fn; |
762 jit_operation end1_fn; | 775 jit_operation end1_fn; |
763 jit_operation end_fn; | 776 jit_operation end_fn; |
777 jit_operation create_undef_fn; | |
764 | 778 |
765 jit_function any_call; | 779 jit_function any_call; |
766 | 780 |
767 // type id -> cast function TO that type | 781 // type id -> cast function TO that type |
768 std::vector<jit_operation> casts; | 782 std::vector<jit_operation> casts; |