36 DLOG(
"rewriting for axm: `{}`", for_ax);
37 auto [old_body, old_exit, args] = for_ax->uncurry_args<3>();
38 auto [new_begin, new_end, new_step, new_init] = args->projs<4>([
this](
const Def* def) {
return rewrite(def); });
40 auto old_body_lam = old_body->isa_mut<
Lam>();
46 auto new_head_lam =
new_world().
mut_con(merge_s(new_begin->type(), new_init->type(), new_mem))->
set(
"head");
47 auto new_phis = new_head_lam->
vars();
48 auto new_iter = new_phis.front();
59 new_head_lam->branch(
false, new_cmp, new_body, new_exit, new_mem);
60 new_yield->app(
false, new_head_lam, merge_t(new_inc, new_yield->var(), new_mem));
63 map(old_body_lam->var(), {new_iter, new_acc, new_yield});
64 new_body->set({
rewrite(old_body_lam->filter()),
rewrite(old_body_lam->body())});
68 map(old_exit_lam->
var(), new_acc);
72 return new_world().
app(new_head_lam, merge_t(new_begin, new_init, new_mem));
75 return Rewriter::rewrite_imm_App(app);