28 if (
auto ret_var = old->ret_var(); ret_var && app->args().back() == ret_var) {
29 if (
auto [i, ins] = old2rec_loop_.emplace(old, std::pair<Lam*, Lam*>(
nullptr,
nullptr)); ins) {
30 auto& [rec, loop] = i->second;
31 rec = old->stub(old->type());
32 auto doms = rec->doms();
33 auto loop_dom = doms.view().rsubspan(1);
34 loop = rec->stub(
world().cn(loop_dom));
35 world().DLOG(
"old {} -> (rec: {}, loop: {})", old, rec, loop);
37 auto n = rec->num_doms();
40 for (
size_t i = 0; i != n - 1; ++i) {
41 loop_args[i] = rec->var(i);
42 loop_vars[i] = loop->var(i);
44 loop_vars.back() = rec->vars().back();
46 loop->set(old->reduce(
world().tuple(loop_vars)));
47 rec->app(
false, loop, loop_args);
48 if (eta_red_) eta_red_->mark_irreducible(loop);