| 83 | } |
| 84 | |
| 85 | SeqModifierForDTR::SeqModifyAction SeqModifierForDTR::ModifyActionPlanner::perform_dtr( |
| 86 | CompNode comp_node, const OprNodeArray& opr_seq, Config* config) { |
| 87 | prepare(opr_seq); |
| 88 | SeqModifyAction action; |
| 89 | |
| 90 | if (comp_node.locator().stream < 0) { |
| 91 | // do not modify system stream oprs |
| 92 | return action; |
| 93 | } |
| 94 | |
| 95 | ThinHashSet<Var*> alive_vars; |
| 96 | size_t cur_usage = 0; |
| 97 | size_t cur_op_cnt = 0; |
| 98 | |
| 99 | //! map from original var to latest var |
| 100 | ThinHashMap<VarNode*, Var*> latest_var; |
| 101 | ThinHashMap<VarNode*, size_t> pin; |
| 102 | |
| 103 | auto need_regen = [&](Var* var) { |
| 104 | return alive_vars.find(var) == alive_vars.end(); |
| 105 | }; |
| 106 | |
| 107 | auto add_alive = [&](Var* var) { |
| 108 | auto&& ins = alive_vars.insert(var); |
| 109 | mgb_assert(ins.second); |
| 110 | cur_usage += var->size; |
| 111 | }; |
| 112 | |
| 113 | auto remove_alive = [&](Var* var) { |
| 114 | if (alive_vars.erase(var)) { |
| 115 | auto size = var->size; |
| 116 | mgb_assert(size <= cur_usage); |
| 117 | cur_usage -= size; |
| 118 | return true; |
| 119 | } |
| 120 | return false; |
| 121 | }; |
| 122 | |
| 123 | auto get_latest = [&](Var* var) { |
| 124 | auto iter = latest_var.find(var->orig_var); |
| 125 | if (iter == latest_var.end()) { |
| 126 | return var; |
| 127 | } else { |
| 128 | return iter->second; |
| 129 | } |
| 130 | }; |
| 131 | |
| 132 | ThinHashMap<Var*, double> dfs_back; |
| 133 | ThinHashMap<Var*, double> dfs_ops; |
| 134 | ThinHashMap<Var*, double> dfs_front; |
| 135 | ThinHashMap<Var*, double> dfs_mem; |
| 136 | auto regen_time = [&](Var* var) { |
| 137 | thin_function<double(Var*)> dfs_b; |
| 138 | thin_function<double(Var*)> dfs_f; |
| 139 | dfs_b = [&](Var* var) { |
| 140 | if (dfs_back.find(var) != dfs_back.end()) { |
| 141 | return dfs_back[var]; |
| 142 | } |
no test coverage detected