Skip to content

Commit c770591

Browse files
committed
Use callbacks in _passes_db
1 parent f893950 commit c770591

File tree

1 file changed

+62
-153
lines changed

1 file changed

+62
-153
lines changed

src/libasr/pass/pass_manager.h

Lines changed: 62 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -43,179 +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-
};
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&);
5848

5949
class PassManager {
6050
private:
6151

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}
8676
};
8777

8878
bool is_fast;
8979
bool apply_default_passes;
9080

9181
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();
9484
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);
17786
}
17887
}
17988

18089
public:
18190

18291
PassManager(): is_fast{false}, apply_default_passes{false} {
18392
_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"
196105
};
197106

198107
_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"
219128
};
220129

221130
_user_defined_passes.clear();
@@ -243,7 +152,7 @@ namespace LCompilers {
243152
}
244153
exit(1);
245154
}
246-
_user_defined_passes.push_back(_passes_db[current_pass]);
155+
_user_defined_passes.push_back(current_pass);
247156
current_pass.clear();
248157
}
249158
}

0 commit comments

Comments
 (0)