| 428 | } |
| 429 | |
| 430 | void Loop::optimize_fwd_graph(int level, FwdDesc& desc) { |
| 431 | // setup endpoints |
| 432 | VarNodeArray endpoints; |
| 433 | endpoints.reserve(desc.all_inputs().size() + desc.output_record_spec().size()); |
| 434 | for (auto i : desc.all_inputs()) { |
| 435 | if (i->param().has_assign) { |
| 436 | endpoints.push_back(i->assignor()); |
| 437 | } |
| 438 | } |
| 439 | for (auto&& i : desc.output_record_spec()) { |
| 440 | endpoints.push_back(i.var_sub()); |
| 441 | } |
| 442 | auto cond = desc.loop_cond_manager().var(); |
| 443 | mgb_throw_if(!cond.node(), GraphError, "loop condition not set"); |
| 444 | endpoints.push_back(cond.node()); |
| 445 | |
| 446 | // optimize also extra_vardeps |
| 447 | size_t nr_extra_deps = 0; |
| 448 | auto&& extra_deps = desc.sub_graph()->options().extra_vardeps; |
| 449 | { |
| 450 | auto on_opr = [&](OperatorNodeBase* opr) { |
| 451 | for (auto i : opr->output()) { |
| 452 | auto&& iter = extra_deps.find(i); |
| 453 | if (iter != extra_deps.end()) { |
| 454 | nr_extra_deps += iter->second.size(); |
| 455 | endpoints.insert( |
| 456 | endpoints.end(), iter->second.begin(), iter->second.end()); |
| 457 | extra_deps.erase(iter); |
| 458 | } |
| 459 | } |
| 460 | }; |
| 461 | cg::DepOprIter opr_iter{on_opr}; |
| 462 | for (size_t i = 0; i < endpoints.size(); ++i) { |
| 463 | opr_iter.add(endpoints[i]->owner_opr()); |
| 464 | } |
| 465 | } |
| 466 | |
| 467 | // apply opt and reset vars |
| 468 | gopt::GraphOptimizer() |
| 469 | .add_preset_passes() |
| 470 | .verbosity(0) |
| 471 | .enable_check_result(level < 0) |
| 472 | .apply_inplace(endpoints); |
| 473 | |
| 474 | auto ep_iter = endpoints.begin(); |
| 475 | for (auto i : desc.all_inputs()) { |
| 476 | if (i->param().has_assign) { |
| 477 | i->set_assignor(*(ep_iter++)); |
| 478 | } |
| 479 | } |
| 480 | for (auto&& i : desc.output_record_spec()) { |
| 481 | const_cast<OutputRecordSpecItem&>(i).var_sub(*(ep_iter++)); |
| 482 | } |
| 483 | desc.loop_cond_manager().setup(*(ep_iter++)); |
| 484 | |
| 485 | auto&& cond_deps = extra_deps[desc.loop_cond_manager().var().node()]; |
| 486 | for (size_t i = 0; i < nr_extra_deps; ++i) { |
| 487 | cond_deps.push_back(*(ep_iter++)); |
nothing calls this directly
no test coverage detected