Skip to content

Commit f3dcec9

Browse files
committed
Use callbacks in _passes_db
1 parent 7b2b271 commit f3dcec9

File tree

1 file changed

+61
-148
lines changed

1 file changed

+61
-148
lines changed

src/libasr/pass/pass_manager.h

Lines changed: 61 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -43,175 +43,88 @@
4343

4444
namespace LCompilers {
4545

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-
};
46+
typedef void (*pass_function)(Allocator&, LFortran::ASR::TranslationUnit_t&,
47+
const LCompilers::PassOptions&);
5448

5549
class PassManager {
5650
private:
5751

58-
std::vector<ASRPass> _passes;
59-
std::vector<ASRPass> _with_optimization_passes;
60-
std::vector<ASRPass> _user_defined_passes;
61-
std::map<std::string, ASRPass> _passes_db = {
62-
{"do_loops", ASRPass::do_loops},
63-
{"global_stmts", ASRPass::global_stmts},
64-
{"implied_do_loops", ASRPass::implied_do_loops},
65-
{"array_op", ASRPass::array_op},
66-
{"arr_slice", ASRPass::arr_slice},
67-
{"print_arr", ASRPass::print_arr},
68-
{"class_constructor", ASRPass::class_constructor},
69-
{"unused_functions", ASRPass::unused_functions},
70-
{"flip_sign", ASRPass::flip_sign},
71-
{"div_to_mul", ASRPass::div_to_mul},
72-
{"fma", ASRPass::fma},
73-
{"sign_from_value", ASRPass::sign_from_value},
74-
{"inline_function_calls", ASRPass::inline_function_calls},
75-
{"loop_unroll", ASRPass::loop_unroll},
76-
{"dead_code_removal", ASRPass::dead_code_removal},
77-
{"forall", ASRPass::forall},
78-
{"select_case", ASRPass::select_case},
79-
{"loop_vectorise", ASRPass::loop_vectorise},
80-
{"array_dim_intrinsics_update", ASRPass::array_dim_intrinsics_update},
81-
{"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}
8276
};
8377

8478
bool is_fast;
8579
bool apply_default_passes;
8680

8781
void _apply_passes(Allocator& al, LFortran::ASR::TranslationUnit_t* asr,
88-
std::vector<ASRPass>& passes, PassOptions pass_options) {
82+
std::vector<std::string>& passes, PassOptions pass_options) {
8983
pass_options.runtime_library_dir = LFortran::get_runtime_library_dir();
9084
for (size_t i = 0; i < passes.size(); i++) {
91-
switch (passes[i]) {
92-
case (ASRPass::do_loops) : {
93-
LFortran::pass_replace_do_loops(al, *asr, pass_options);
94-
break;
95-
}
96-
case (ASRPass::global_stmts) : {
97-
LFortran::pass_wrap_global_stmts_into_function(al, *asr, pass_options);
98-
break;
99-
}
100-
case (ASRPass::implied_do_loops) : {
101-
LFortran::pass_replace_implied_do_loops(al, *asr, pass_options);
102-
break;
103-
}
104-
case (ASRPass::array_op) : {
105-
LFortran::pass_replace_array_op(al, *asr, pass_options);
106-
break;
107-
}
108-
case (ASRPass::flip_sign) : {
109-
LFortran::pass_replace_flip_sign(al, *asr, pass_options);
110-
break;
111-
}
112-
case (ASRPass::fma) : {
113-
LFortran::pass_replace_fma(al, *asr, pass_options);
114-
break;
115-
}
116-
case (ASRPass::loop_unroll) : {
117-
LFortran::pass_loop_unroll(al, *asr, pass_options);
118-
break;
119-
}
120-
case (ASRPass::inline_function_calls) : {
121-
LFortran::pass_inline_function_calls(al, *asr, pass_options);
122-
break;
123-
}
124-
case (ASRPass::dead_code_removal) : {
125-
LFortran::pass_dead_code_removal(al, *asr, pass_options);
126-
break;
127-
}
128-
case (ASRPass::sign_from_value) : {
129-
LFortran::pass_replace_sign_from_value(al, *asr, pass_options);
130-
break;
131-
}
132-
case (ASRPass::div_to_mul) : {
133-
LFortran::pass_replace_div_to_mul(al, *asr, pass_options);
134-
break;
135-
}
136-
case (ASRPass::class_constructor) : {
137-
LFortran::pass_replace_class_constructor(al, *asr, pass_options);
138-
break;
139-
}
140-
case (ASRPass::arr_slice) : {
141-
LFortran::pass_replace_arr_slice(al, *asr, pass_options);
142-
break;
143-
}
144-
case (ASRPass::print_arr) : {
145-
LFortran::pass_replace_print_arr(al, *asr, pass_options);
146-
break;
147-
}
148-
case (ASRPass::unused_functions) : {
149-
LFortran::pass_unused_functions(al, *asr, pass_options);
150-
break;
151-
}
152-
case (ASRPass::forall) : {
153-
LFortran::pass_replace_forall(al, *asr, pass_options);
154-
break ;
155-
}
156-
case (ASRPass::select_case) : {
157-
LFortran::pass_replace_select_case(al, *asr, pass_options);
158-
break;
159-
}
160-
case (ASRPass::loop_vectorise) : {
161-
LFortran::pass_loop_vectorise(al, *asr, pass_options);
162-
break;
163-
}
164-
case (ASRPass::array_dim_intrinsics_update): {
165-
LFortran::pass_update_array_dim_intrinsic_calls(al, *asr, pass_options);
166-
break ;
167-
}
168-
case (ASRPass::pass_array_by_data): {
169-
LFortran::pass_array_by_data(al, *asr, pass_options);
170-
break ;
171-
}
172-
}
85+
_passes_db[passes[i]](al, *asr, pass_options);
17386
}
17487
}
17588

17689
public:
17790

17891
PassManager(): is_fast{false}, apply_default_passes{false} {
17992
_passes = {
180-
ASRPass::global_stmts,
181-
ASRPass::class_constructor,
182-
ASRPass::implied_do_loops,
183-
ASRPass::pass_array_by_data,
184-
ASRPass::arr_slice,
185-
ASRPass::array_op,
186-
ASRPass::print_arr,
187-
ASRPass::array_dim_intrinsics_update,
188-
ASRPass::do_loops,
189-
ASRPass::forall,
190-
ASRPass::select_case,
191-
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"
192105
};
193106

194107
_with_optimization_passes = {
195-
ASRPass::global_stmts,
196-
ASRPass::class_constructor,
197-
ASRPass::implied_do_loops,
198-
ASRPass::pass_array_by_data,
199-
ASRPass::arr_slice,
200-
ASRPass::array_op,
201-
ASRPass::print_arr,
202-
ASRPass::loop_vectorise,
203-
ASRPass::loop_unroll,
204-
ASRPass::array_dim_intrinsics_update,
205-
ASRPass::do_loops,
206-
ASRPass::forall,
207-
ASRPass::dead_code_removal,
208-
ASRPass::select_case,
209-
ASRPass::unused_functions,
210-
ASRPass::flip_sign,
211-
ASRPass::sign_from_value,
212-
ASRPass::div_to_mul,
213-
ASRPass::fma,
214-
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"
215128
};
216129

217130
_user_defined_passes.clear();
@@ -239,7 +152,7 @@ namespace LCompilers {
239152
}
240153
exit(1);
241154
}
242-
_user_defined_passes.push_back(_passes_db[current_pass]);
155+
_user_defined_passes.push_back(current_pass);
243156
current_pass.clear();
244157
}
245158
}

0 commit comments

Comments
 (0)