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(Ref arg) const
Rewrites Def::ops by substituting this mutable's Var with arg.
Ref type() const noexcept
Yields the raw type of this Def, i.e. maybe nullptr.
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)
std::pair< Ref, DefVec > collect_args(Ref def)
Helper function to cope with the fact that normalizers take all arguments and not only its axiom argu...
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...