10 if (
auto app = part->isa<
App>()) {
11 if (
auto lam = app->callee()->isa<
Lam>()) {
12 part = lam->
reduce(app->arg())[1];
13 world.DLOG(
"reduce pass/phase lambda {} to {} : {}", lam, part, part->
type());
18 world.DLOG(
"pass/phase: {}", phase_def);
19 if (
auto phase_ax = phase_def->isa<
Axiom>()) {
20 auto flag = phase_ax->flags();
21 if (passes.contains(flag)) {
22 auto phase_fun = passes[flag];
23 phase_fun(world, builder, part);
25 world.WLOG(
"pass/phase '{}' not found", phase_ax->sym());
26 assert(passes.contains(flag) &&
"pass/phase not found");
28 }
else if (phase_def->isa<
Lam>()) {
29 assert(0 &&
"curried lambas are not supported");
31 world.WLOG(
"pass/phase '{}' is not an axiom", phase_def);
32 assert(phase_def->isa<
Axiom>() &&
"pass/phase is not an axiom");
DefVec reduce(const Def *arg) const
Rewrites Def::ops by substituting this mutable's Var with arg.
The World represents the whole program and manages creation of MimIR nodes (Defs).
void handle_optimization_part(const Def *part, World &world, Passes &passes, PipelineBuilder &builder)
absl::flat_hash_map< flags_t, std::function< void(World &, PipelineBuilder &, const Def *)> > Passes
axiom ↦ (pipeline part) × (axiom application) → () The function should inspect Application to const...
std::pair< const Def *, std::vector< const Def * > > collect_args(const Def *def)
Helper function to cope with the fact that normalizers take all arguments and not only its axiom argu...