40 log().d(
"lower for: {}", for_ax);
41 auto [old_body, old_exit,
args] = for_ax->uncurry_args<3>();
42 auto [new_begin, new_end, new_step, new_init] =
args->projs<4>([
this](
const Def* def) {
return rewrite(def); });
44 const Def* vec_axm =
nullptr;
46 old_body = ll_vec->arg();
56 auto new_head_lam =
new_world().
mut_con(merge_s(new_begin->type(), new_init->type(), new_mem))->
set(
"head");
57 auto new_phis = new_head_lam->
vars();
58 auto new_iter = new_phis.front();
71 new_head_lam->branch(
false, new_cmp, new_body, new_exit, new_mem);
72 new_yield->app(
false, new_head_lam, merge_t(new_inc, new_yield->var(), new_mem));
76 auto acc_for = [&](
Lam* bb) ->
const Def* {
77 if (!new_mem)
return new_acc;
80 for (
auto phi : new_phis.view().subspan(1))
86 map(old_body_lam->var(), {new_iter, acc_for(new_body), new_yield});
87 auto new_body_filter =
rewrite(old_body_lam->filter());
88 auto new_body_value =
rewrite(old_body_lam->body());
89 new_body->set({new_body_filter, new_body_value});
93 map(old_exit_lam->
var(), acc_for(new_exit));
95 auto new_exit_value =
rewrite(old_exit_lam->
body());
96 new_exit->set({new_exit_filter, new_exit_value});
99 return new_world().
app(new_head_lam, merge_t(new_begin, new_init, new_mem));
102 return RWPhase::rewrite_imm_App(app);