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));
66 auto acc_for = [&](
Lam* bb) ->
const Def* {
67 if (!new_mem)
return new_acc;
70 for (
auto phi : new_phis.view().subspan(1))
76 map(old_body_lam->var(), {new_iter, acc_for(new_body), new_yield});
77 auto new_body_filter =
rewrite(old_body_lam->filter());
78 auto new_body_value =
rewrite(old_body_lam->body());
79 new_body->set({new_body_filter, new_body_value});
83 map(old_exit_lam->
var(), acc_for(new_exit));
85 auto new_exit_value =
rewrite(old_exit_lam->
body());
86 new_exit->set({new_exit_filter, new_exit_value});
89 return new_world().
app(new_head_lam, merge_t(new_begin, new_init, new_mem));
92 return RWPhase::rewrite_imm_App(app);