Unverified Commit a54547b3 authored by kahmed10's avatar kahmed10 Committed by GitHub
Browse files

cse literal fix (#524)



* add new test

* formatting

* remove comments

* fix comment and use contains

* formatting
Co-authored-by: default avatarmvermeulen <5479696+mvermeulen@users.noreply.github.com>
parent 4563b8cd
...@@ -14,19 +14,24 @@ template <class Range> ...@@ -14,19 +14,24 @@ template <class Range>
void cse_range(program& p, Range&& r) void cse_range(program& p, Range&& r)
{ {
std::unordered_multimap<std::string, instruction_ref> instructions; std::unordered_multimap<std::string, instruction_ref> instructions;
std::unordered_set<instruction_ref> processed_ins;
for(auto ins : r) for(auto ins : r)
{ {
// Skip dead instructions // Skip dead instructions
if(ins->outputs().empty()) if(ins->outputs().empty())
continue; continue;
// Find instruction with the same name // Find instruction with the same name
auto found_instructions = range(instructions.equal_range(ins->name())); auto found_instructions = range(instructions.equal_range(ins->name()));
for(const auto& pp : found_instructions) for(const auto& pp : found_instructions)
{ {
auto eq = pp.second; auto eq = pp.second;
if(contains(processed_ins, eq))
continue;
if(*eq != *ins) if(*eq != *ins)
continue; continue;
p.replace_instruction(ins, eq); p.replace_instruction(ins, eq);
processed_ins.emplace(ins);
auto outputs = eq->outputs(); auto outputs = eq->outputs();
std::sort(outputs.begin(), outputs.end(), [&](auto x, auto y) { std::sort(outputs.begin(), outputs.end(), [&](auto x, auto y) {
return std::distance(eq, x) < std::distance(eq, y); return std::distance(eq, x) < std::distance(eq, y);
......
...@@ -109,4 +109,36 @@ TEST_CASE(cse_test4) ...@@ -109,4 +109,36 @@ TEST_CASE(cse_test4)
EXPECT(p1 == p2); EXPECT(p1 == p2);
} }
TEST_CASE(cse_test_literal)
{
migraphx::program p1;
{
auto six1 = p1.add_literal(6);
auto zero1 = p1.add_literal(0);
auto six2 = p1.add_literal(6);
auto zero2 = p1.add_literal(0);
auto six3 = p1.add_literal(6);
auto zero3 = p1.add_literal(0);
auto sum1 = p1.add_instruction(migraphx::op::add{}, six1, zero1);
auto sum2 = p1.add_instruction(migraphx::op::add{}, six2, zero2);
auto sum3 = p1.add_instruction(migraphx::op::add{}, six3, zero3);
auto sum4 = p1.add_instruction(migraphx::op::add{}, sum1, sum2);
auto sum5 = p1.add_instruction(migraphx::op::add{}, sum3, sum4);
p1.add_instruction(pass_op{}, sum5);
}
run_pass(p1);
migraphx::program p2;
{
auto six = p2.add_literal(6);
auto zero = p2.add_literal(0);
auto sum1 = p2.add_instruction(migraphx::op::add{}, six, zero);
auto sum2 = p2.add_instruction(migraphx::op::add{}, sum1, sum1);
auto sum3 = p2.add_instruction(migraphx::op::add{}, sum1, sum2);
p2.add_instruction(pass_op{}, sum3);
}
EXPECT(p1 == p2);
}
int main(int argc, const char* argv[]) { test::run(argc, argv); } int main(int argc, const char* argv[]) { test::run(argc, argv); }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment