| 218 | } |
| 219 | |
| 220 | void SeqModifierForSublinearMemory::ModifyActionPlanner::apply_discard_plan() { |
| 221 | ThinHashSet<Var*> alive_vars; |
| 222 | |
| 223 | // map from original var to duplicated var |
| 224 | ThinHashMap<Var*, Var*> var_map; |
| 225 | |
| 226 | auto add_alive = [&](Var* var) { |
| 227 | auto&& ins = alive_vars.insert(var); |
| 228 | mgb_assert(ins.second); |
| 229 | }; |
| 230 | |
| 231 | auto remove_alive = [&](Var* var) { |
| 232 | auto nr = alive_vars.erase(var); |
| 233 | mgb_assert(nr); |
| 234 | }; |
| 235 | |
| 236 | auto check_and_remove = [&](size_t timestamp, Var* var) { |
| 237 | auto acc = var->visit_discard_tailing_access(); |
| 238 | if (!acc || (acc && acc->opr->time >= timestamp)) { |
| 239 | mgb_assert(var->owner_opr()->output.size() > 1); |
| 240 | for (size_t i = 0; i < var->access_rec.size(); ++i) { |
| 241 | if (var->access_rec[i].time >= timestamp) { |
| 242 | mgb_assert(i > 0); |
| 243 | auto acc_rec_begin = var->access_rec.data(); |
| 244 | var->access_rec.resize(i); |
| 245 | var->discard_tailing_access = i - 1; |
| 246 | mgb_assert(var->access_rec.data() == acc_rec_begin); |
| 247 | break; |
| 248 | } |
| 249 | } |
| 250 | } |
| 251 | }; |
| 252 | |
| 253 | auto try_discard = [&](Opr* opr, Var* var) { |
| 254 | auto acc = var->visit_discard_tailing_access(); |
| 255 | if (acc && acc->opr == opr) { |
| 256 | remove_alive(var); |
| 257 | acc[1].opr->inputs_to_recompute.push_back(var); |
| 258 | auto acc_rec_begin = var->access_rec.data(); |
| 259 | |
| 260 | // make this opr as the last reader for original var |
| 261 | var->access_rec.resize(acc - acc_rec_begin + 1); |
| 262 | mgb_assert(var->access_rec.data() == acc_rec_begin); |
| 263 | } |
| 264 | }; |
| 265 | |
| 266 | // recompute a var by inserting new oprs |
| 267 | auto recompute = [&](Opr* reader, Var* var) { |
| 268 | mgb_assert(!alive_vars.count(var)); |
| 269 | |
| 270 | auto block_begin = var->owner_opr()->block_begin_time, |
| 271 | block_end = var->owner_opr()->block_end_time; |
| 272 | |
| 273 | thin_function<Var*(Var*)> add_dep; |
| 274 | add_dep = [&](Var* var) { |
| 275 | if (alive_vars.count(var)) |
| 276 | return var; |
| 277 | { |
nothing calls this directly
no test coverage detected