MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
normalizers.cpp
Go to the documentation of this file.
3
4namespace mim::plug::compile {
5
6// `pass_phase (pass_list pass1 ... passn)` -> `passes_to_phase n (pass1, ..., passn)`
7const Def* normalize_pass_phase(const Def* type, const Def*, const Def* arg) {
8 auto& world = type->world();
9
10 auto [ax, _] = collect_args(arg);
11 if (ax->flags() != flags_t(Annex::Base<pass_list>)) {
12 // TODO: remove when normalizers are fixed
13 if (ax->flags() == flags_t(Annex::Base<combine_pass_list>)) {
14 auto arg_cpl = arg->as<App>();
15 arg = normalize_combine_pass_list(arg_cpl->type(), arg_cpl->callee(), arg_cpl->arg());
16 } else {
17 world.ELOG("pass_phase expects a pass_list as argument but got {}", arg);
18 }
19 }
20
21 auto [f_ax, pass_list_defs] = collect_args(arg);
22 assert(f_ax->flags() == flags_t(Annex::Base<pass_list>));
23 auto n = pass_list_defs.size();
24
25 return world.call<passes_to_phase>(n, pass_list_defs);
26}
27
28/// `combined_phase (phase_list phase1 ... phasen)` -> `phases_to_phase n (phase1, ..., phasen)`
29const Def* normalize_combined_phase(const Def* type, const Def*, const Def* arg) {
30 auto& world = type->world();
31
32 auto [ax, phase_list_defs] = collect_args(arg);
33 assert(ax->flags() == flags_t(Annex::Base<phase_list>));
34 auto n = phase_list_defs.size();
35
36 return world.call<phases_to_phase>(n, phase_list_defs);
37}
38
39/// `single_pass_phase pass` -> `passes_to_phase 1 pass`
40const Def* normalize_single_pass_phase(const Def* type, const Def*, const Def* arg) {
41 return type->world().call<passes_to_phase>(1, arg);
42}
43
44/// `combine_pass_list K (pass_list pass11 ... pass1N) ... (pass_list passK1 ... passKM) = pass_list pass11 ... p1N ...
45/// passK1 ... passKM`
46const Def* normalize_combine_pass_list(const Def* type, const Def*, const Def* arg) {
47 auto& world = type->world();
48 auto pass_lists = arg->projs();
49 DefVec passes;
50
51 for (auto pass_list_def : pass_lists) {
52 auto [ax, pass_list_defs] = collect_args(pass_list_def);
53 assert(ax->flags() == flags_t(Annex::Base<pass_list>));
54 passes.insert(passes.end(), pass_list_defs.begin(), pass_list_defs.end());
55 }
56 const Def* app_list = world.annex<pass_list>();
57 for (auto pass : passes) app_list = world.app(app_list, pass);
58 return app_list;
59}
60
62
63} // namespace mim::plug::compile
Base class for all Defs.
Definition def.h:198
World & world() const noexcept
Definition def.cpp:413
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (other...
Definition def.h:345
const Def * call(Id id, Args &&... args)
Complete curried call of annexes obeying implicits.
Definition world.h:506
#define MIM_compile_NORMALIZER_IMPL
Definition autogen.h:270
The compile Plugin
Definition compile.h:8
const Def * normalize_single_pass_phase(const Def *type, const Def *, const Def *arg)
single_pass_phase pass -> passes_to_phase 1 pass
const Def * normalize_combined_phase(const Def *type, const Def *, const Def *arg)
combined_phase (phase_list phase1 ... phasen) -> phases_to_phase n (phase1, ..., phasen)
const Def * normalize_combine_pass_list(const Def *type, const Def *, const Def *arg)
combine_pass_list K (pass_list pass11 ... pass1N) ... (pass_list passK1 ... passKM) = pass_list pass1...
const Def * normalize_pass_phase(const Def *type, const Def *, const Def *arg)
Vector< const Def * > DefVec
Definition def.h:50
std::pair< const Def *, DefVec > collect_args(const Def *def)
Helper function to cope with the fact that normalizers take all arguments and not only its axiom argu...
Definition lam.cpp:86
u64 flags_t
Definition types.h:45
static constexpr flags_t Base
Definition plugin.h:118