|
43 | 43 |
|
44 | 44 | namespace LCompilers {
|
45 | 45 |
|
46 |
| - enum ASRPass { |
47 |
| - do_loops, global_stmts, implied_do_loops, array_op, |
48 |
| - arr_slice, print_arr, class_constructor, unused_functions, |
49 |
| - flip_sign, div_to_mul, fma, sign_from_value, |
50 |
| - inline_function_calls, loop_unroll, dead_code_removal, |
51 |
| - forall, select_case, loop_vectorise, |
52 |
| - array_dim_intrinsics_update, pass_array_by_data |
53 |
| - }; |
54 |
| - |
55 |
| - static inline void set_runtime_library_dir(PassOptions& pass_options) { |
56 |
| - pass_options.runtime_library_dir = LFortran::get_runtime_library_dir(); |
57 |
| - } |
| 46 | + typedef void (*pass_function)(Allocator&, LFortran::ASR::TranslationUnit_t&, |
| 47 | + const LCompilers::PassOptions&); |
58 | 48 |
|
59 | 49 | class PassManager {
|
60 | 50 | private:
|
61 | 51 |
|
62 |
| - std::vector<ASRPass> _passes; |
63 |
| - std::vector<ASRPass> _with_optimization_passes; |
64 |
| - std::vector<ASRPass> _user_defined_passes; |
65 |
| - std::map<std::string, ASRPass> _passes_db = { |
66 |
| - {"do_loops", ASRPass::do_loops}, |
67 |
| - {"global_stmts", ASRPass::global_stmts}, |
68 |
| - {"implied_do_loops", ASRPass::implied_do_loops}, |
69 |
| - {"array_op", ASRPass::array_op}, |
70 |
| - {"arr_slice", ASRPass::arr_slice}, |
71 |
| - {"print_arr", ASRPass::print_arr}, |
72 |
| - {"class_constructor", ASRPass::class_constructor}, |
73 |
| - {"unused_functions", ASRPass::unused_functions}, |
74 |
| - {"flip_sign", ASRPass::flip_sign}, |
75 |
| - {"div_to_mul", ASRPass::div_to_mul}, |
76 |
| - {"fma", ASRPass::fma}, |
77 |
| - {"sign_from_value", ASRPass::sign_from_value}, |
78 |
| - {"inline_function_calls", ASRPass::inline_function_calls}, |
79 |
| - {"loop_unroll", ASRPass::loop_unroll}, |
80 |
| - {"dead_code_removal", ASRPass::dead_code_removal}, |
81 |
| - {"forall", ASRPass::forall}, |
82 |
| - {"select_case", ASRPass::select_case}, |
83 |
| - {"loop_vectorise", ASRPass::loop_vectorise}, |
84 |
| - {"array_dim_intrinsics_update", ASRPass::array_dim_intrinsics_update}, |
85 |
| - {"pass_array_by_data", ASRPass::pass_array_by_data} |
| 52 | + std::vector<std::string> _passes; |
| 53 | + std::vector<std::string> _with_optimization_passes; |
| 54 | + std::vector<std::string> _user_defined_passes; |
| 55 | + std::map<std::string, pass_function> _passes_db = { |
| 56 | + {"do_loops", &LFortran::pass_replace_do_loops}, |
| 57 | + {"global_stmts", &LFortran::pass_wrap_global_stmts_into_function}, |
| 58 | + {"implied_do_loops", &LFortran::pass_replace_implied_do_loops}, |
| 59 | + {"array_op", &LFortran::pass_replace_array_op}, |
| 60 | + {"arr_slice", &LFortran::pass_replace_arr_slice}, |
| 61 | + {"print_arr", &LFortran::pass_replace_print_arr}, |
| 62 | + {"class_constructor", &LFortran::pass_replace_class_constructor}, |
| 63 | + {"unused_functions", &LFortran::pass_unused_functions}, |
| 64 | + {"flip_sign", &LFortran::pass_replace_flip_sign}, |
| 65 | + {"div_to_mul", &LFortran::pass_replace_div_to_mul}, |
| 66 | + {"fma", &LFortran::pass_replace_fma}, |
| 67 | + {"sign_from_value", &LFortran::pass_replace_sign_from_value}, |
| 68 | + {"inline_function_calls", &LFortran::pass_inline_function_calls}, |
| 69 | + {"loop_unroll", &LFortran::pass_loop_unroll}, |
| 70 | + {"dead_code_removal", &LFortran::pass_dead_code_removal}, |
| 71 | + {"forall", &LFortran::pass_replace_forall}, |
| 72 | + {"select_case", &LFortran::pass_replace_select_case}, |
| 73 | + {"loop_vectorise", &LFortran::pass_loop_vectorise}, |
| 74 | + {"array_dim_intrinsics_update", &LFortran::pass_update_array_dim_intrinsic_calls}, |
| 75 | + {"pass_array_by_data", &LFortran::pass_array_by_data} |
86 | 76 | };
|
87 | 77 |
|
88 | 78 | bool is_fast;
|
89 | 79 | bool apply_default_passes;
|
90 | 80 |
|
91 | 81 | void _apply_passes(Allocator& al, LFortran::ASR::TranslationUnit_t* asr,
|
92 |
| - std::vector<ASRPass>& passes, PassOptions pass_options) { |
93 |
| - set_runtime_library_dir(pass_options); |
| 82 | + std::vector<std::string>& passes, PassOptions pass_options) { |
| 83 | + pass_options.runtime_library_dir = LFortran::get_runtime_library_dir(); |
94 | 84 | for (size_t i = 0; i < passes.size(); i++) {
|
95 |
| - switch (passes[i]) { |
96 |
| - case (ASRPass::do_loops) : { |
97 |
| - LFortran::pass_replace_do_loops(al, *asr, pass_options); |
98 |
| - break; |
99 |
| - } |
100 |
| - case (ASRPass::global_stmts) : { |
101 |
| - LFortran::pass_wrap_global_stmts_into_function(al, *asr, pass_options); |
102 |
| - break; |
103 |
| - } |
104 |
| - case (ASRPass::implied_do_loops) : { |
105 |
| - LFortran::pass_replace_implied_do_loops(al, *asr, pass_options); |
106 |
| - break; |
107 |
| - } |
108 |
| - case (ASRPass::array_op) : { |
109 |
| - LFortran::pass_replace_array_op(al, *asr, pass_options); |
110 |
| - break; |
111 |
| - } |
112 |
| - case (ASRPass::flip_sign) : { |
113 |
| - LFortran::pass_replace_flip_sign(al, *asr, pass_options); |
114 |
| - break; |
115 |
| - } |
116 |
| - case (ASRPass::fma) : { |
117 |
| - LFortran::pass_replace_fma(al, *asr, pass_options); |
118 |
| - break; |
119 |
| - } |
120 |
| - case (ASRPass::loop_unroll) : { |
121 |
| - LFortran::pass_loop_unroll(al, *asr, pass_options); |
122 |
| - break; |
123 |
| - } |
124 |
| - case (ASRPass::inline_function_calls) : { |
125 |
| - LFortran::pass_inline_function_calls(al, *asr, pass_options); |
126 |
| - break; |
127 |
| - } |
128 |
| - case (ASRPass::dead_code_removal) : { |
129 |
| - LFortran::pass_dead_code_removal(al, *asr, pass_options); |
130 |
| - break; |
131 |
| - } |
132 |
| - case (ASRPass::sign_from_value) : { |
133 |
| - LFortran::pass_replace_sign_from_value(al, *asr, pass_options); |
134 |
| - break; |
135 |
| - } |
136 |
| - case (ASRPass::div_to_mul) : { |
137 |
| - LFortran::pass_replace_div_to_mul(al, *asr, pass_options); |
138 |
| - break; |
139 |
| - } |
140 |
| - case (ASRPass::class_constructor) : { |
141 |
| - LFortran::pass_replace_class_constructor(al, *asr, pass_options); |
142 |
| - break; |
143 |
| - } |
144 |
| - case (ASRPass::arr_slice) : { |
145 |
| - LFortran::pass_replace_arr_slice(al, *asr, pass_options); |
146 |
| - break; |
147 |
| - } |
148 |
| - case (ASRPass::print_arr) : { |
149 |
| - LFortran::pass_replace_print_arr(al, *asr, pass_options); |
150 |
| - break; |
151 |
| - } |
152 |
| - case (ASRPass::unused_functions) : { |
153 |
| - LFortran::pass_unused_functions(al, *asr, pass_options); |
154 |
| - break; |
155 |
| - } |
156 |
| - case (ASRPass::forall) : { |
157 |
| - LFortran::pass_replace_forall(al, *asr, pass_options); |
158 |
| - break ; |
159 |
| - } |
160 |
| - case (ASRPass::select_case) : { |
161 |
| - LFortran::pass_replace_select_case(al, *asr, pass_options); |
162 |
| - break; |
163 |
| - } |
164 |
| - case (ASRPass::loop_vectorise) : { |
165 |
| - LFortran::pass_loop_vectorise(al, *asr, pass_options); |
166 |
| - break; |
167 |
| - } |
168 |
| - case (ASRPass::array_dim_intrinsics_update): { |
169 |
| - LFortran::pass_update_array_dim_intrinsic_calls(al, *asr, pass_options); |
170 |
| - break ; |
171 |
| - } |
172 |
| - case (ASRPass::pass_array_by_data): { |
173 |
| - LFortran::pass_array_by_data(al, *asr, pass_options); |
174 |
| - break ; |
175 |
| - } |
176 |
| - } |
| 85 | + _passes_db[passes[i]](al, *asr, pass_options); |
177 | 86 | }
|
178 | 87 | }
|
179 | 88 |
|
180 | 89 | public:
|
181 | 90 |
|
182 | 91 | PassManager(): is_fast{false}, apply_default_passes{false} {
|
183 | 92 | _passes = {
|
184 |
| - ASRPass::global_stmts, |
185 |
| - ASRPass::class_constructor, |
186 |
| - ASRPass::implied_do_loops, |
187 |
| - ASRPass::pass_array_by_data, |
188 |
| - ASRPass::arr_slice, |
189 |
| - ASRPass::array_op, |
190 |
| - ASRPass::print_arr, |
191 |
| - ASRPass::array_dim_intrinsics_update, |
192 |
| - ASRPass::do_loops, |
193 |
| - ASRPass::forall, |
194 |
| - ASRPass::select_case, |
195 |
| - ASRPass::unused_functions |
| 93 | + "global_stmts", |
| 94 | + "class_constructor", |
| 95 | + "implied_do_loops", |
| 96 | + "pass_array_by_data", |
| 97 | + "arr_slice", |
| 98 | + "array_op", |
| 99 | + "print_arr", |
| 100 | + "array_dim_intrinsics_update", |
| 101 | + "do_loops", |
| 102 | + "forall", |
| 103 | + "select_case", |
| 104 | + "unused_functions" |
196 | 105 | };
|
197 | 106 |
|
198 | 107 | _with_optimization_passes = {
|
199 |
| - ASRPass::global_stmts, |
200 |
| - ASRPass::class_constructor, |
201 |
| - ASRPass::implied_do_loops, |
202 |
| - ASRPass::pass_array_by_data, |
203 |
| - ASRPass::arr_slice, |
204 |
| - ASRPass::array_op, |
205 |
| - ASRPass::print_arr, |
206 |
| - ASRPass::loop_vectorise, |
207 |
| - ASRPass::loop_unroll, |
208 |
| - ASRPass::array_dim_intrinsics_update, |
209 |
| - ASRPass::do_loops, |
210 |
| - ASRPass::forall, |
211 |
| - ASRPass::dead_code_removal, |
212 |
| - ASRPass::select_case, |
213 |
| - ASRPass::unused_functions, |
214 |
| - ASRPass::flip_sign, |
215 |
| - ASRPass::sign_from_value, |
216 |
| - ASRPass::div_to_mul, |
217 |
| - ASRPass::fma, |
218 |
| - ASRPass::inline_function_calls |
| 108 | + "global_stmts", |
| 109 | + "class_constructor", |
| 110 | + "implied_do_loops", |
| 111 | + "pass_array_by_data", |
| 112 | + "arr_slice", |
| 113 | + "array_op", |
| 114 | + "print_arr", |
| 115 | + "loop_vectorise", |
| 116 | + "loop_unroll", |
| 117 | + "array_dim_intrinsics_update", |
| 118 | + "do_loops", |
| 119 | + "forall", |
| 120 | + "dead_code_removal", |
| 121 | + "select_case", |
| 122 | + "unused_functions", |
| 123 | + "flip_sign", |
| 124 | + "sign_from_value", |
| 125 | + "div_to_mul", |
| 126 | + "fma", |
| 127 | + "inline_function_calls" |
219 | 128 | };
|
220 | 129 |
|
221 | 130 | _user_defined_passes.clear();
|
@@ -243,7 +152,7 @@ namespace LCompilers {
|
243 | 152 | }
|
244 | 153 | exit(1);
|
245 | 154 | }
|
246 |
| - _user_defined_passes.push_back(_passes_db[current_pass]); |
| 155 | + _user_defined_passes.push_back(current_pass); |
247 | 156 | current_pass.clear();
|
248 | 157 | }
|
249 | 158 | }
|
|
0 commit comments