| 133 | } |
| 134 | |
| 135 | OperatorNodeBase* GraphOptimizer::replace_const_var(VarNode* var) { |
| 136 | if (!is_const_var_value(var)) |
| 137 | return nullptr; |
| 138 | |
| 139 | { |
| 140 | auto type = var->owner_opr()->dyn_typeinfo(); |
| 141 | if (type == opr::ImmutableTensor::typeinfo()) |
| 142 | return nullptr; |
| 143 | } |
| 144 | |
| 145 | auto&& mgr = var->owner_graph()->static_infer_manager(); |
| 146 | auto&& shp = mgr.infer_shape(var); |
| 147 | if (shp.total_nr_elems() >= MAX_CONST_FOLDING_SIZE) |
| 148 | return nullptr; |
| 149 | |
| 150 | auto&& infer_val = mgr.infer_value(var); |
| 151 | if (!infer_val.layout().is_contiguous()) { |
| 152 | return nullptr; |
| 153 | } |
| 154 | |
| 155 | HostTensorND val; |
| 156 | val.copy_from(infer_val); |
| 157 | auto imm = opr::ImmutableTensor::make( |
| 158 | *var->owner_graph(), val, |
| 159 | OperatorNodeConfig{}.comp_node(var->comp_node())) |
| 160 | .node() |
| 161 | ->owner_opr(); |
| 162 | m_const_map[var] = imm; |
| 163 | mgb_assert(imm->output(0)->dtype() == var->dtype()); |
| 164 | return imm; |
| 165 | } |
| 166 | |
| 167 | // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} |
nothing calls this directly
no test coverage detected