| 362 | } |
| 363 | |
| 364 | const OprNodeArray* TopoSorter::get_comp_seq( |
| 365 | CompSeqExtraInfo& extra_info, const VarNodeArray& dest) { |
| 366 | // move to temporary var to be exception-safe |
| 367 | PriorityRemapper priority_remapper; |
| 368 | if (m_priority_remapper) { |
| 369 | m_priority_remapper.swap(priority_remapper); |
| 370 | } |
| 371 | |
| 372 | m_cur_extra_info = &extra_info; |
| 373 | m_seq.clear(); |
| 374 | auto state = std::make_unique<State>(); |
| 375 | m_state = state.get(); |
| 376 | mgb_assert(m_modified_dep_map_log.empty(), "restore_opr_prop() not called"); |
| 377 | |
| 378 | { |
| 379 | // run the dfs |
| 380 | DFSDepDiscover dfs{this}; |
| 381 | for (auto i : dest) |
| 382 | dfs.add_opr(i->owner_opr()); |
| 383 | } |
| 384 | |
| 385 | #if MGB_ENABLE_COND_EXEC |
| 386 | // add dependency due to ExecutionMask (conditional oprs must wait for |
| 387 | // ExecutionMask owner var to be computed first) |
| 388 | if (ExecutionMask::have_alive_instance()) { |
| 389 | for (auto&& i : state->opr_trait) { |
| 390 | if (auto mask = ExecutionMask::get_from_opr(i.first)) { |
| 391 | if (auto var = mask->owner()) { |
| 392 | state->opr_trait.at(var->owner_opr()).receivers.push_back(i.first); |
| 393 | ++i.second.unresolved_dep_cnt; |
| 394 | add_extra_comp_order_dep(i.first, var); |
| 395 | } |
| 396 | } |
| 397 | } |
| 398 | } |
| 399 | #endif |
| 400 | |
| 401 | // add force update control deps |
| 402 | for (auto&& i : state->var_force_update_dest) { |
| 403 | auto dest_opr = i.second->owner_opr(); |
| 404 | auto&& dest_trait = state->opr_trait.at(dest_opr); |
| 405 | for (auto reader : m_owner_graph->var_receiver(i.first)) { |
| 406 | if (reader == dest_opr) |
| 407 | continue; |
| 408 | auto iter = state->opr_trait.find(reader); |
| 409 | if (iter == state->opr_trait.end()) |
| 410 | continue; |
| 411 | |
| 412 | // reader must finish before dest_opr |
| 413 | for (auto i : reader->output()) |
| 414 | add_extra_comp_order_dep(dest_opr, i); |
| 415 | iter->second.receivers.push_back(dest_opr); |
| 416 | ++dest_trait.unresolved_dep_cnt; |
| 417 | } |
| 418 | } |
| 419 | |
| 420 | // remap priority |
| 421 | if (priority_remapper) { |
no test coverage detected