38 DLOG(
"rewriting for axm: `{}`", for_ax);
39 auto [old_body, old_exit, args] = for_ax->uncurry_args<3>();
40 auto [new_begin, new_end, new_step, new_init] = args->projs<4>([
this](
const Def* def) {
return rewrite(def); });
42 auto old_body_lam = old_body->isa_mut<
Lam>();
48 auto new_head_lam =
new_world().
mut_con(merge_s(new_begin->type(), new_init->type(), new_mem))->
set(
"head");
49 auto new_phis = new_head_lam->
vars();
50 auto new_iter = new_phis.front();
61 new_head_lam->branch(
false, new_cmp, new_body, new_exit, new_mem);
62 new_yield->app(
false, new_head_lam, merge_t(new_inc, new_yield->var(), new_mem));
65 map(old_body_lam->var(), {new_iter, new_acc, new_yield});
66 new_body->set({
rewrite(old_body_lam->filter()),
rewrite(old_body_lam->body())});
70 map(old_exit_lam->
var(), new_acc);
74 return new_world().
app(new_head_lam, merge_t(new_begin, new_init, new_mem));
77 return Rewriter::rewrite_imm_App(app);