annotate libinterp/corefcn/pt-jit.h @ 20654:b65888ec820e draft default tip gccjit

dmalcom gcc jit import
author Stefan Mahr <dac922@gmx.de>
date Fri, 27 Feb 2015 16:59:36 +0100
parents 4197fc428c7d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
1 /*
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
2
19731
4197fc428c7d maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents: 18840
diff changeset
3 Copyright (C) 2012-2015 Max Brister
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
4
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
5 This file is part of Octave.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
6
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
10 option) any later version.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
11
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but WITHOUT
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
15 for more details.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
16
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
20
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
21 */
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
22
16768
e2de3c8882be copyright notice fixes
John W. Eaton <jwe@octave.org>
parents: 15592
diff changeset
23 // Author: Max Brister <max@2bass.com>
e2de3c8882be copyright notice fixes
John W. Eaton <jwe@octave.org>
parents: 15592
diff changeset
24
17822
ebb3ef964372 maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents: 17787
diff changeset
25 #if !defined (octave_pt_jit_h)
ebb3ef964372 maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents: 17787
diff changeset
26 #define octave_pt_jit_h 1
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
27
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
28 #ifdef HAVE_JIT
14932
1f914446157d Locate and link with LLVM properly
Max Brister <max@2bass.com>
parents: 14928
diff changeset
29
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents: 15014
diff changeset
30 #include "jit-ir.h"
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
31 #include "pt-walk.h"
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
32 #include "symtab.h"
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
33
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
34
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
35 class octave_value_list;
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
36
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
37 // Convert from the parse tree (AST) to the low level Octave IR.
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
38 class
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
39 jit_convert : public tree_walker
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
40 {
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
41 public:
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
42 typedef std::pair<jit_type *, std::string> type_bound;
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
43 typedef std::vector<type_bound> type_bound_vector;
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
44 typedef std::map<std::string, jit_variable *> variable_map;
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
45
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
46 jit_convert (tree &tee, jit_type *for_bounds = 0);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
47
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
48 jit_convert (octave_user_function& fcn, const std::vector<jit_type *>& args);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
49
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
50 #define DECL_ARG(n) const ARG ## n& arg ## n
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
51 #define JIT_CREATE_CHECKED(N) \
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
52 template <OCT_MAKE_DECL_LIST (typename, ARG, N)> \
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
53 jit_call *create_checked (OCT_MAKE_LIST (DECL_ARG, N)) \
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
54 { \
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
55 jit_call *ret = factory.create<jit_call> (OCT_MAKE_ARG_LIST (arg, N)); \
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
56 return create_checked_impl (ret); \
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
57 }
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
58
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
59 JIT_CREATE_CHECKED (1)
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
60 JIT_CREATE_CHECKED (2)
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
61 JIT_CREATE_CHECKED (3)
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
62 JIT_CREATE_CHECKED (4)
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
63
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
64 #undef JIT_CREATE_CHECKED
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
65 #undef DECL_ARG
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
66
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
67 jit_block_list& get_blocks (void) { return blocks; }
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
68
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
69 const type_bound_vector& get_bounds (void) const { return bounds; }
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
70
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
71 jit_factory& get_factory (void) { return factory; }
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
72
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
73 #ifdef HAVE_LLVM
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
74 llvm::Function *get_function (void) const { return function; }
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
75 #endif
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
76
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
77 const variable_map &get_variable_map (void) const { return vmap; }
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
78
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
79 void visit_anon_fcn_handle (tree_anon_fcn_handle&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
80
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
81 void visit_argument_list (tree_argument_list&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
82
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
83 void visit_binary_expression (tree_binary_expression&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
84
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
85 void visit_break_command (tree_break_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
86
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
87 void visit_colon_expression (tree_colon_expression&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
88
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
89 void visit_continue_command (tree_continue_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
90
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
91 void visit_global_command (tree_global_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
92
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
93 void visit_persistent_command (tree_persistent_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
94
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
95 void visit_decl_elt (tree_decl_elt&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
96
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
97 void visit_decl_init_list (tree_decl_init_list&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
98
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
99 void visit_simple_for_command (tree_simple_for_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
100
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
101 void visit_complex_for_command (tree_complex_for_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
102
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
103 void visit_octave_user_script (octave_user_script&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
104
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
105 void visit_octave_user_function (octave_user_function&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
106
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
107 void visit_octave_user_function_header (octave_user_function&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
108
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
109 void visit_octave_user_function_trailer (octave_user_function&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
110
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
111 void visit_function_def (tree_function_def&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
112
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
113 void visit_identifier (tree_identifier&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
114
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
115 void visit_if_clause (tree_if_clause&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
116
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
117 void visit_if_command (tree_if_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
118
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
119 void visit_if_command_list (tree_if_command_list&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
120
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
121 void visit_index_expression (tree_index_expression&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
122
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
123 void visit_matrix (tree_matrix&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
124
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
125 void visit_cell (tree_cell&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
126
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
127 void visit_multi_assignment (tree_multi_assignment&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
128
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
129 void visit_no_op_command (tree_no_op_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
130
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
131 void visit_constant (tree_constant&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
132
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
133 void visit_fcn_handle (tree_fcn_handle&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
134
15842
896cf5769537 Add visit_funcall method to JIT tree walker.
Michael Goffioul <michael.goffioul@gmail.com>
parents: 15592
diff changeset
135 void visit_funcall (tree_funcall&);
896cf5769537 Add visit_funcall method to JIT tree walker.
Michael Goffioul <michael.goffioul@gmail.com>
parents: 15592
diff changeset
136
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
137 void visit_parameter_list (tree_parameter_list&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
138
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
139 void visit_postfix_expression (tree_postfix_expression&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
140
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
141 void visit_prefix_expression (tree_prefix_expression&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
142
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
143 void visit_return_command (tree_return_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
144
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
145 void visit_return_list (tree_return_list&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
146
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
147 void visit_simple_assignment (tree_simple_assignment&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
148
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
149 void visit_statement (tree_statement&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
150
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
151 void visit_statement_list (tree_statement_list&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
152
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
153 void visit_switch_case (tree_switch_case&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
154
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
155 void visit_switch_case_list (tree_switch_case_list&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
156
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
157 void visit_switch_command (tree_switch_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
158
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
159 void visit_try_catch_command (tree_try_catch_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
160
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
161 void visit_unwind_protect_command (tree_unwind_protect_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
162
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
163 void visit_while_command (tree_while_command&);
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
164
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
165 void visit_do_until_command (tree_do_until_command&);
14963
709f50069722 Change algorithm for placing releases and simplify PHIs in low level Octave IR
Max Brister <max@2bass.com>
parents: 14962
diff changeset
166 private:
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
167 std::vector<std::pair<std::string, bool> > arguments;
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
168 type_bound_vector bounds;
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
169
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
170 bool converting_function;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
171
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
172 // the scope of the function we are converting, or the current scope
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
173 symbol_table::scope_id scope;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
174
15182
a7a56b436de2 Factor out jit_block_list and jit_factory from jit_convert
Max Brister <max@2bass.com>
parents: 15181
diff changeset
175 jit_factory factory;
a7a56b436de2 Factor out jit_block_list and jit_factory from jit_convert
Max Brister <max@2bass.com>
parents: 15181
diff changeset
176
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
177 // used instead of return values from visit_* functions
14944
c0a5ab3b9278 jit_const no longer inherits from jit_instruction
Max Brister <max@2bass.com>
parents: 14943
diff changeset
178 jit_value *result;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
179
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
180 jit_block *entry_block;
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
181
14938
bab44e3ee291 Adding basic error support to JIT
Max Brister <max@2bass.com>
parents: 14937
diff changeset
182 jit_block *final_block;
bab44e3ee291 Adding basic error support to JIT
Max Brister <max@2bass.com>
parents: 14937
diff changeset
183
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
184 jit_block *block;
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
185
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
186 #ifdef HAVE_LLVM
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
187 llvm::Function *function;
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
188 #endif
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
189
15182
a7a56b436de2 Factor out jit_block_list and jit_factory from jit_convert
Max Brister <max@2bass.com>
parents: 15181
diff changeset
190 jit_block_list blocks;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
191
15067
df4538e3b50b ND scalar indexing in JIT.
Max Brister <max@2bass.com>
parents: 15056
diff changeset
192 std::vector<jit_magic_end::context> end_context;
15056
bc32288f4a42 Support the end keyword for one dimentional indexing in JIT.
Max Brister <max@2bass.com>
parents: 15027
diff changeset
193
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
194 size_t iterator_count;
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
195 size_t for_bounds_count;
14978
f649b66ef1af Add short circult operators to JIT
Max Brister <max@2bass.com>
parents: 14976
diff changeset
196 size_t short_count;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
197
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
198 variable_map vmap;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
199
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
200 void initialize (symbol_table::scope_id s);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
201
15182
a7a56b436de2 Factor out jit_block_list and jit_factory from jit_convert
Max Brister <max@2bass.com>
parents: 15181
diff changeset
202 jit_call *create_checked_impl (jit_call *ret);
14961
903a5ee2cdde Simplify the creation of error checks in jit
Max Brister <max@2bass.com>
parents: 14960
diff changeset
203
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
204 // get an existing vairable. If the variable does not exist, it will not be
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
205 // created
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
206 jit_variable *find_variable (const std::string& vname) const;
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
207
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
208 // get a variable, create it if it does not exist. The type will default to
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
209 // the variable's current type in the symbol table.
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
210 jit_variable *get_variable (const std::string& vname);
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
211
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
212 // create a variable of the given name and given type. Will also insert an
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
213 // extract statement
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
214 jit_variable *create_variable (const std::string& vname, jit_type *type,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
215 bool isarg = true);
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
216
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
217 // The name of the next for loop iterator. If inc is false, then the iterator
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
218 // counter will not be incremented.
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
219 std::string next_iterator (bool inc = true)
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
220 { return next_name ("#iter", iterator_count, inc); }
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
221
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
222 std::string next_for_bounds (bool inc = true)
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
223 { return next_name ("#for_bounds", for_bounds_count, inc); }
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
224
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
225 std::string next_shortcircut_result (bool inc = true)
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
226 { return next_name ("#shortcircut_result", short_count, inc); }
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
227
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
228 std::string next_name (const char *prefix, size_t& count, bool inc);
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
229
15334
8125773322d4 Error on undefined an unused variables in JIT
Max Brister <max@2bass.com>
parents: 15310
diff changeset
230 jit_instruction *resolve (tree_index_expression& exp,
8125773322d4 Error on undefined an unused variables in JIT
Max Brister <max@2bass.com>
parents: 15310
diff changeset
231 jit_value *extra_arg = 0, bool lhs = false);
14969
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
232
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
233 jit_value *do_assign (tree_expression *exp, jit_value *rhs,
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
234 bool artificial = false);
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
235
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
236 jit_value *do_assign (const std::string& lhs, jit_value *rhs, bool print,
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
237 bool artificial = false);
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
238
14944
c0a5ab3b9278 jit_const no longer inherits from jit_instruction
Max Brister <max@2bass.com>
parents: 14943
diff changeset
239 jit_value *visit (tree *tee) { return visit (*tee); }
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
240
14944
c0a5ab3b9278 jit_const no longer inherits from jit_instruction
Max Brister <max@2bass.com>
parents: 14943
diff changeset
241 jit_value *visit (tree& tee);
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
242
15182
a7a56b436de2 Factor out jit_block_list and jit_factory from jit_convert
Max Brister <max@2bass.com>
parents: 15181
diff changeset
243 typedef std::list<jit_block *> block_list;
14935
5801e031a3b5 Place releases after last use and generalize dom visiting
Max Brister <max@2bass.com>
parents: 14932
diff changeset
244 block_list breaks;
5801e031a3b5 Place releases after last use and generalize dom visiting
Max Brister <max@2bass.com>
parents: 14932
diff changeset
245 block_list continues;
5801e031a3b5 Place releases after last use and generalize dom visiting
Max Brister <max@2bass.com>
parents: 14932
diff changeset
246
5801e031a3b5 Place releases after last use and generalize dom visiting
Max Brister <max@2bass.com>
parents: 14932
diff changeset
247 void finish_breaks (jit_block *dest, const block_list& lst);
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
248 };
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
249
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
250 // Convert from the low level Octave IR to libgccjit
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
251 #ifdef HAVE_GCCJIT
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
252 class
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
253 jit_convert_gcc : public jit_ir_walker
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
254 {
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
255 public:
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
256 jit_convert_gcc ();
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
257 ~jit_convert_gcc ();
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
258
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
259 gcc_jit_result *convert_loop (const jit_block_list& blocks,
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
260 const std::list<jit_value *>& constants);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
261
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
262 #define JIT_METH(clname) \
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
263 virtual void visit (jit_ ## clname&);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
264
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
265 JIT_VISIT_IR_CLASSES;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
266
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
267 private:
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
268 void visit (jit_value *jvalue)
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
269 {
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
270 return visit (*jvalue);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
271 }
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
272
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
273 void visit (jit_value &jvalue)
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
274 {
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
275 jvalue.accept (*this);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
276 }
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
277
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
278 #if 0
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
279 gccjit::lvalue as_lvalue (jit_value *);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
280 #endif
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
281 gccjit::rvalue as_rvalue (jit_value *);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
282
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
283 void add_assignment_for_insn (jit_instruction &insn,
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
284 gccjit::rvalue val);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
285
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
286 gccjit::block get_block_for_edge (jit_block *src, jit_block *dest);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
287
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
288 gccjit::block get_current_block ();
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
289 void push_block (gccjit::block block);
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
290 void pop_block ();
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
291
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
292 bool converting_function;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
293
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
294 // Inputs (used internally by callback):
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
295 const jit_block_list *m_blocks;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
296 const std::list<jit_value *> *m_constants;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
297
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
298 // Internal state:
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
299 gccjit::context m_ctxt;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
300 gccjit::function m_func;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
301
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
302 /* We have a single param, confusingly named "params" (an array). */
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
303 gccjit::param params;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
304
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
305 // name -> argument index (used for compiling functions)
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
306 std::map<std::string, int> m_argument_index;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
307 std::vector<std::pair<std::string, bool> > m_argument_vec;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
308
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
309 std::vector<gccjit::lvalue> m_extracted_params;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
310 std::map<jit_block *, gccjit::block> m_block_map;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
311 std::map<std::pair<jit_block *, jit_block *>, gccjit::block> m_blocks_for_edges;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
312 std::map<jit_instruction *, gccjit::lvalue> m_locals_for_insns;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
313
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
314 std::map<jit_value *, gccjit::rvalue> m_rvalues;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
315
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
316 std::stack<gccjit::block> m_block_stack;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
317
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
318 bool m_with_comments;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
319 bool m_log_visits;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
320 };
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
321 #endif // #ifdef HAVE_GCCJIT
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
322
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
323 // Convert from the low level Octave IR to LLVM
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
324 #if HAVE_LLVM
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
325 class
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
326 jit_convert_llvm : public jit_ir_walker
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
327 {
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
328 public:
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
329 llvm::Function *convert_loop (llvm::Module *module,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
330 const jit_block_list& blocks,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
331 const std::list<jit_value *>& constants);
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
332
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
333 jit_function convert_function (llvm::Module *module,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
334 const jit_block_list& blocks,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
335 const std::list<jit_value *>& constants,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
336 octave_user_function& fcn,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
337 const std::vector<jit_type *>& args);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
338
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
339 // arguments to the llvm::Function for loops
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
340 const std::vector<std::pair<std::string, bool> >& get_arguments(void) const
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
341 { return argument_vec; }
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
342
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
343 #define JIT_METH(clname) \
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
344 virtual void visit (jit_ ## clname&);
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
345
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
346 JIT_VISIT_IR_CLASSES;
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
347
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
348 #undef JIT_METH
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
349 private:
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
350 // name -> argument index (used for compiling functions)
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
351 std::map<std::string, int> argument_index;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
352
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
353 std::vector<std::pair<std::string, bool> > argument_vec;
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
354
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
355 // name -> llvm argument (used for compiling loops)
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
356 std::map<std::string, llvm::Value *> arguments;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
357
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
358 bool converting_function;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
359
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
360 // only used if we are converting a function
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
361 jit_function creating;
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
362
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
363 llvm::Function *function;
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
364 llvm::BasicBlock *prelude;
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
365
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
366 void convert (const jit_block_list& blocks,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
367 const std::list<jit_value *>& constants);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
368
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
369 void finish_phi (jit_phi *phi);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
370
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
371 void visit (jit_value *jvalue)
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
372 {
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
373 return visit (*jvalue);
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
374 }
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
375
15181
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
376 void visit (jit_value &jvalue)
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
377 {
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
378 jvalue.accept (*this);
ed2b911a2fb3 Rename jit_convert::convert_llvm to jit_convert_llvm
Max Brister <max@2bass.com>
parents: 15180
diff changeset
379 }
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
380 };
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
381 #endif /* HAVE_LLVM */
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
382
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
383 // type inference and SSA construction on the low level Octave IR
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
384 class
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
385 jit_infer
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
386 {
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
387 public:
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
388 typedef jit_convert::variable_map variable_map;
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
389
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
390 jit_infer (jit_factory& afactory, jit_block_list& ablocks,
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
391 const variable_map& avmap);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
392
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
393 jit_block_list& get_blocks (void) const { return blocks; }
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
394
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
395 jit_factory& get_factory (void) const { return factory; }
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
396
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
397 void infer (void);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
398 private:
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
399 jit_block_list& blocks;
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
400 jit_factory& factory;
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
401 const variable_map& vmap;
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
402 std::list<jit_instruction *> worklist;
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
403
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
404 void append_users (jit_value *v);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
405
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
406 void append_users_term (jit_terminator *term);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
407
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
408 void construct_ssa (void);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
409
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
410 void do_construct_ssa (jit_block& block, size_t avisit_count);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
411
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
412 jit_block& entry_block (void) { return *blocks.front (); }
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
413
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
414 jit_block& final_block (void) { return *blocks.back (); }
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
415
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
416 void place_releases (void);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
417
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
418 void push_worklist (jit_instruction *instr);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
419
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
420 void remove_dead ();
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
421
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
422 void release_dead_phi (jit_block& ablock);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
423
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
424 void release_temp (jit_block& ablock, std::set<jit_value *>& temp);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
425
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
426 void simplify_phi (void);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
427
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
428 void simplify_phi (jit_phi& phi);
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
429 };
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
430
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
431 class
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
432 tree_jit
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
433 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
434 public:
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
435 ~tree_jit (void);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
436
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
437 static bool execute (tree_simple_for_command& cmd,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
438 const octave_value& bounds);
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
439
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
440 static bool execute (tree_while_command& cmd);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
441
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
442 static bool execute (octave_user_function& fcn, const octave_value_list& args,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
443 octave_value_list& retval);
15023
75d1bc2fd6d2 Compile top level while loops in JIT.
Max Brister <max@2bass.com>
parents: 15016
diff changeset
444
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
445 #ifdef HAVE_LLVM
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
446 llvm::ExecutionEngine *get_engine (void) const { return engine; }
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
447
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
448 llvm::Module *get_module (void) const { return module; }
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
449
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
450 void optimize (llvm::Function *fn);
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
451 #endif
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
452 private:
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
453 tree_jit (void);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
454
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
455 static tree_jit& instance (void);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
456
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
457 bool initialize (void);
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
458
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
459 bool do_execute (tree_simple_for_command& cmd, const octave_value& bounds);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
460
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
461 bool do_execute (tree_while_command& cmd);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
462
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
463 bool do_execute (octave_user_function& fcn, const octave_value_list& args,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
464 octave_value_list& retval);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
465
15582
52df2e7baabe Disable JIT when breakpoints are present
Max Brister <max@2bass.com>
parents: 15479
diff changeset
466 bool enabled (void);
52df2e7baabe Disable JIT when breakpoints are present
Max Brister <max@2bass.com>
parents: 15479
diff changeset
467
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
468 size_t trip_count (const octave_value& bounds) const;
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
469
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
470 #ifdef HAVE_LLVM
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
471 llvm::Module *module;
18840
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
472 #ifdef LEGACY_PASSMANAGER
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
473 llvm::legacy::PassManager *module_pass_manager;
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
474 llvm::legacy::FunctionPassManager *pass_manager;
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
475 #else
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
476 llvm::PassManager *module_pass_manager;
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
477 llvm::FunctionPassManager *pass_manager;
18840
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
478 #endif
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
479 llvm::ExecutionEngine *engine;
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
480 #endif
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
481 };
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
482
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
483 class
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
484 jit_function_info
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
485 {
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
486 public:
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
487 jit_function_info (tree_jit& tjit, octave_user_function& fcn,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
488 const octave_value_list& ov_args);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
489
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
490 bool execute (const octave_value_list& ov_args,
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
491 octave_value_list& retval) const;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
492
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
493 bool match (const octave_value_list& ov_args) const;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
494 private:
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
495 typedef octave_base_value *(*jited_function)(octave_base_value**);
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
496
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
497 std::vector<jit_type *> argument_types;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
498 jited_function function;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
499 };
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
500
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
501 class
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
502 jit_info
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
503 {
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
504 public:
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
505 // we use a pointer here so we don't have to include ov.h
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
506 typedef std::map<std::string, const octave_value *> vmap;
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
507
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
508 jit_info (tree_jit& tjit, tree& tee);
14913
c7071907a641 Use symbol_record_ref instead of names in JIT
Max Brister <max@2bass.com>
parents: 14911
diff changeset
509
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
510 jit_info (tree_jit& tjit, tree& tee, const octave_value& for_bounds);
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
511
14955
609dcc297db5 src/pt-jit.cc (jit_info::~jit_info): New function
Max Brister <max@2bass.com>
parents: 14951
diff changeset
512 ~jit_info (void);
609dcc297db5 src/pt-jit.cc (jit_info::~jit_info): New function
Max Brister <max@2bass.com>
parents: 14951
diff changeset
513
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
514 bool execute (const vmap& extra_vars = vmap ()) const;
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
515
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
516 bool match (const vmap& extra_vars = vmap ()) const;
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
517 private:
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
518 typedef jit_convert::type_bound type_bound;
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
519 typedef jit_convert::type_bound_vector type_bound_vector;
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
520 typedef void (*jited_function)(octave_base_value**);
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
521
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
522 void compile (tree_jit& tjit, tree& tee, jit_type *for_bounds = 0);
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
523
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
524 octave_value find (const vmap& extra_vars, const std::string& vname) const;
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
525
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
526 #ifdef HAVE_LLVM
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
527 llvm::ExecutionEngine *engine;
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
528 #endif
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
529 jited_function function;
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
530 #ifdef HAVE_LLVM
14955
609dcc297db5 src/pt-jit.cc (jit_info::~jit_info): New function
Max Brister <max@2bass.com>
parents: 14951
diff changeset
531 llvm::Function *llvm_function;
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
532 #endif
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
533 #ifdef HAVE_GCCJIT
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
534 gcc_jit_result *gccjit_result;
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
535 #endif
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
536 std::vector<std::pair<std::string, bool> > arguments;
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
537 type_bound_vector bounds;
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
538 };
14937
78e1457c5bf5 Remove some macros from pt-jit.h and pt-jit.cc
Max Brister <max@2bass.com>
parents: 14936
diff changeset
539
20654
b65888ec820e dmalcom gcc jit import
Stefan Mahr <dac922@gmx.de>
parents: 19731
diff changeset
540 #endif /* ifdef HAVE_JIT */
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
541 #endif