16 for (
auto def :
old_world().externals()) {
17 if (
auto lam = def->isa<
Lam>()) join(lam, Lattice::Known);
25 if (
auto [_, ins] = analyzed_.emplace(def); !ins)
return;
27 if (
auto var = def->isa<
Var>())
return analyze(var->type());
29 if (
auto app = def->isa<
App>()) {
31 if (
auto lam = app-> type()->isa_mut<Lam>()) join(lam, Lattice::Unknown);
32 if (
auto lam = app->callee()->isa_mut<
Lam>()) join(lam, Lattice:: Known);
33 if (
auto lam = app-> arg()->isa_mut<Lam>()) join(lam, Lattice::Unknown);
39 for (
auto d : def->
deps()) {
40 if (
auto lam = d->isa_mut<
Lam>()) {
41 if (def->isa<
App>()) join(lam, Lattice::Unknown);
50const Def* EtaExpPhase::rewrite(
const Def* old_def) {
51 if (
auto lam = old_def->isa<
Lam>(); lam && lattice(lam) == Both) {
52 auto [i, ins] = lam2eta_.emplace(lam,
nullptr);
63 auto callee = rewrite_no_eta(app->
callee());
const Def * callee() const
Defs deps() const noexcept
void transfer_external(Def *to)
const Def * type() const noexcept
Yields the "raw" type of this Def (maybe nullptr).
const Def * rewrite_imm_Var(const Var *) final
const Def * rewrite_imm_App(const App *) final
void rewrite_external(Def *) final
FPPhase(World &world, std::string name)
static const Def * eta_expand(Filter, const Def *f)
World & new_world()
Create new Defs into this.
World & world()=delete
Hides both and forbids direct access.
World & old_world()
Get old Defs from here.
virtual const Def * rewrite(const Def *)
The World represents the whole program and manages creation of MimIR nodes (Defs).
const Def * app(const Def *callee, const Def *arg)
const Def * var(const Def *type, Def *mut)