#include #include #include #include #include #include #include namespace migraph { inline namespace version_1 { template void cse_range(program& p, Range&& r) { std::unordered_multimap instructions; for(auto ins : r) { // Skip dead instructions if(ins->outputs().empty()) continue; // Find instruction with the same name auto found_instructions = range(instructions.equal_range(ins->name())); for(const auto& pp : found_instructions) { auto eq = pp.second; if(*eq != *ins) continue; p.replace_instruction(ins, eq); cse_range(p, eq->outputs()); } instructions.emplace(ins->name(), ins); } } void common_subexpression_elimination::apply(program& p) const { cse_range(p, iterator_for(p)); } } // namespace version_1 } // namespace migraph